package com.gkhy.safePlatform.equipment.service.impl; import cn.hutool.core.util.IdUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.gkhy.safePlatform.account.rpc.apimodel.AccountDepartmentService; import com.gkhy.safePlatform.account.rpc.apimodel.model.resp.DepInfoRPCRespDTO; import com.gkhy.safePlatform.account.rpc.apimodel.model.resp.DepRPCRespDTO; import com.gkhy.safePlatform.commons.co.ContextCacheUser; import com.gkhy.safePlatform.commons.enums.ResultCodes; import com.gkhy.safePlatform.commons.exception.BusinessException; import com.gkhy.safePlatform.commons.query.PageQuery; import com.gkhy.safePlatform.commons.vo.ResultVO; import com.gkhy.safePlatform.commons.vo.SearchResultVO; import com.gkhy.safePlatform.equipment.entity.*; import com.gkhy.safePlatform.equipment.enums.ConsumableEnum; import com.gkhy.safePlatform.equipment.enums.EquipmentResultCodes; import com.gkhy.safePlatform.equipment.excepiton.EquipmentException; import com.gkhy.safePlatform.equipment.model.dto.req.ParamForm; import com.gkhy.safePlatform.equipment.model.dto.req.SafeMaterialAddReq; import com.gkhy.safePlatform.equipment.model.dto.req.SafeMaterialModReq; import com.gkhy.safePlatform.equipment.model.dto.req.SafeMaterialQuery; import com.gkhy.safePlatform.equipment.model.dto.resp.BaseMaterialDto; import com.gkhy.safePlatform.equipment.model.dto.resp.MaterialClassificationDto; import com.gkhy.safePlatform.equipment.model.dto.resp.MaterialDepartmentDto; import com.gkhy.safePlatform.equipment.model.dto.resp.SafeMaterialDto; import com.gkhy.safePlatform.equipment.service.SafeMaterialService; import com.gkhy.safePlatform.equipment.service.baseService.SafeMaterialClassifyInfoService; import com.gkhy.safePlatform.equipment.service.baseService.SafeMaterialDetailInfoService; import com.gkhy.safePlatform.equipment.service.baseService.SafeMaterialInfoService; import org.apache.dubbo.config.annotation.DubboReference; import org.apache.ibatis.annotations.Param; import org.redisson.api.RLock; import org.redisson.api.RedissonClient; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @Service("SafeMaterialService") public class SafeMaterialServiceImpl implements SafeMaterialService { @Autowired private SafeMaterialInfoService safeMaterialInfoService; @DubboReference(check = false) private AccountDepartmentService accountDepartmentService; @Autowired private SafeMaterialClassifyInfoService safeMaterialClassifyInfoService; @Autowired private SafeMaterialDetailInfoService safeMaterialDetailInfoService; @Autowired private RedissonClient redissonClient; @Override public ResultVO save(ContextCacheUser currentUser,SafeMaterialAddReq req) { //加分布式锁,防止重复创建规则 RLock lock = redissonClient.getLock("LOCK_SM_INSERT"); try { lock.lock(10, TimeUnit.SECONDS); //获取物资类型 SafeMaterialClassifyInfo classifyInfo = safeMaterialClassifyInfoService.queryById(req.getSmallClassifyId()); if(null == classifyInfo){ throw new EquipmentException(EquipmentResultCodes.DATA_NOT_EXIST,"物资类型不存在!"); } //判断该部门是否已经创建物资 boolean flag = safeMaterialInfoService.checkMaterial(req.getSmallClassifyId(), currentUser.getDepId(), null); if(flag){ throw new EquipmentException(EquipmentResultCodes.DATA_EXIST,"该种物资已存在不可重复创建"); } //获取数量 int safeMaterialTotalCount = safeMaterialInfoService.getTotalCount(); SafeMaterialInfo safeMaterialInfo = new SafeMaterialInfo(); safeMaterialInfo.setId(IdUtil.getSnowflake(0,0).nextId()); safeMaterialInfo.setConsumable(classifyInfo.getConsumable()); safeMaterialInfo.setDepId(currentUser.getDepId()); safeMaterialInfo.setSmallClassifyId(req.getSmallClassifyId()); safeMaterialInfo.setMaterialName(classifyInfo.getMaterialClassifyName()); safeMaterialInfo.setDepName(currentUser.getDepName()); safeMaterialInfo.setSerialNum(this.generateSerialNum(safeMaterialTotalCount)); safeMaterialInfo.setBigClassifyId(req.getBigClassifyId()); safeMaterialInfo.setTotalCount(0); safeMaterialInfo.setStockCount(0); //插入 safeMaterialInfoService.save(safeMaterialInfo); //创建成功,释放锁 lock.unlock(); }catch (EquipmentException e) { e.printStackTrace(); throw new EquipmentException(e.getCode(), e.getMessage()); }catch (Exception e) { e.printStackTrace(); throw new BusinessException(ResultCodes.SERVER_ERROR); }finally { if(lock.isLocked()){ lock.unlock(); } } return new ResultVO(ResultCodes.OK); } @Override public ResultVO update(ContextCacheUser currentUser,SafeMaterialModReq req) { //加分布式锁,防止重复创建规则 RLock lock = redissonClient.getLock("LOCK_SM_UPDATE"); try { lock.lock(10, TimeUnit.SECONDS); //获取物资类型 SafeMaterialClassifyInfo classifyInfo = safeMaterialClassifyInfoService.queryById(req.getSmallClassifyId()); if(null == classifyInfo){ throw new EquipmentException(EquipmentResultCodes.DATA_NOT_EXIST,"物资类型不存在!"); } boolean flag = safeMaterialInfoService.checkMaterial(req.getSmallClassifyId(), currentUser.getDepId(), req.getId()); if(flag){ throw new EquipmentException(EquipmentResultCodes.DATA_EXIST,"该种物资已存在不可重复创建"); } SafeMaterialInfo safeMaterialInfo = new SafeMaterialInfo(); safeMaterialInfo.setConsumable(classifyInfo.getConsumable()); safeMaterialInfo.setSmallClassifyId(req.getSmallClassifyId()); safeMaterialInfo.setMaterialName(classifyInfo.getMaterialClassifyName()); safeMaterialInfo.setDepName(currentUser.getDepName()); safeMaterialInfo.setBigClassifyId(req.getBigClassifyId()); safeMaterialInfo.setId(req.getId()); //跟新 safeMaterialInfoService.updateById(safeMaterialInfo); //创建成功,释放锁 lock.unlock(); }catch (EquipmentException e) { e.printStackTrace(); throw new EquipmentException(e.getCode(), e.getMessage()); }catch (Exception e) { e.printStackTrace(); throw new BusinessException(ResultCodes.SERVER_ERROR); }finally { if(lock.isLocked()){ lock.unlock(); } } return new ResultVO(ResultCodes.OK); } @Override public ResultVO queryById(ContextCacheUser currentUser,Long id) { if(null == id){ throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL); } SafeMaterialDO safeMaterialDO = safeMaterialInfoService.queryById(id); SafeMaterialDto safeMaterialDto = new SafeMaterialDto(); if(null != safeMaterialDO){ BeanUtils.copyProperties(safeMaterialDO,safeMaterialDto); if(null != ConsumableEnum.getByCode(safeMaterialDO.getConsumable())){ safeMaterialDto.setConsumableName(ConsumableEnum.getByCode(safeMaterialDO.getConsumable()).getValue()); } } return new ResultVO(ResultCodes.OK,safeMaterialDto); } public ResultVO delete(ContextCacheUser currentUser,Long id) { ResultVO resultVO = null; //加分布式锁,防止重复创建规则 RLock lock = redissonClient.getLock("LOCK_SM_DELETE"); try { lock.lock(10, TimeUnit.SECONDS); //删除之前检查详表中是否还有该物物资数据 int count = safeMaterialDetailInfoService.getCountBySmId(id); if(count > 0){ throw new EquipmentException(EquipmentResultCodes.DATA_HAS_BEEN_BOND,"该种物资已被绑定物资详情数据,不可删除!"); } SafeMaterialInfo materialInfo = new SafeMaterialInfo(); materialInfo.setId(id); materialInfo.setDelFlag(1); boolean flag = safeMaterialInfoService.updateById(materialInfo); if(flag){ resultVO = new ResultVO(ResultCodes.OK); }else{ resultVO = new ResultVO(ResultCodes.SERVER_DEL_ERROR); } //创建成功,释放锁 lock.unlock(); }catch (EquipmentException e) { e.printStackTrace(); throw new EquipmentException(e.getCode(), e.getMessage()); }catch (Exception e) { e.printStackTrace(); throw new BusinessException(ResultCodes.SERVER_ERROR); }finally { if(lock.isLocked()){ lock.unlock(); } } return resultVO; } @Override public ResultVO deleteBatch(ContextCacheUser currentUser, ParamForm paramForm) { //加分布式锁,防止重复创建规则 RLock lock = redissonClient.getLock("LOCK_SM_DELETEBATCH"); try { lock.lock(10, TimeUnit.SECONDS); int count = safeMaterialDetailInfoService.getCountBySmIds(paramForm.getIds()); //判断是否绑定具体安全物资数据 if(count > 0){ throw new EquipmentException(EquipmentResultCodes.DATA_HAS_BEEN_BOND,"物资已被绑定物资详情数据,不可删除!"); } safeMaterialInfoService.deleteBatch(paramForm.getIds()); //创建成功,释放锁 lock.unlock(); }catch (EquipmentException e) { e.printStackTrace(); throw new EquipmentException(e.getCode(), e.getMessage()); }catch (Exception e) { e.printStackTrace(); throw new BusinessException(ResultCodes.SERVER_ERROR); }finally { if(lock.isLocked()){ lock.unlock(); } } return new ResultVO(ResultCodes.OK); } /** * 获取列表 * @return */ @Override public List listByDepId(ContextCacheUser currentUser) { //获取所有数据 List materialInfoList = safeMaterialInfoService.listByDepId(currentUser.getDepId()); //获取所有物资类型 List classifyInfoList = safeMaterialClassifyInfoService.getParentList(); List classificationDtoList = new ArrayList<>(); for (SafeMaterialClassifyInfo classifyInfo:classifyInfoList) { MaterialClassificationDto classificationDto = new MaterialClassificationDto(); classificationDto.setMaterialClassifyName(classifyInfo.getMaterialClassifyName()); classificationDto.setMaterialClassifyId(classifyInfo.getId()); //过滤出物资数据 List selectMaterialList = materialInfoList .stream() .filter(item -> classifyInfo.getId().equals(item.getBigClassifyId())) .collect(Collectors.toList()); List baseMaterialDtoList = new ArrayList<>(); if(selectMaterialList.size()>0){ //循环物资 for (SafeMaterialInfo materialInfo:selectMaterialList){ //填充基础物资数据 BaseMaterialDto baseMaterialDto = new BaseMaterialDto(); baseMaterialDto.setMaterialName(materialInfo.getMaterialName()); baseMaterialDto.setSmId(materialInfo.getId()); baseMaterialDto.setMaterialName(materialInfo.getMaterialName()); baseMaterialDto.setConsumable(materialInfo.getConsumable()); baseMaterialDto.setConsumableName(ConsumableEnum.getByCode(materialInfo.getConsumable()).getValue()); baseMaterialDtoList.add(baseMaterialDto); } classificationDto.setBaseMaterialList(baseMaterialDtoList); classificationDtoList.add(classificationDto); } } return classificationDtoList; } @Override public List list(ContextCacheUser currentUser) { //获取所有数据 List materialInfoList = safeMaterialInfoService.list(); //获取所有部门 List depInfoList = getDepInfoList(); //获取所有物资类型 List classifyInfoList = safeMaterialClassifyInfoService.getParentList(); //循环部门 List departmentDtoList = new ArrayList<>(); recursiveDep(depInfoList,departmentDtoList,materialInfoList,classifyInfoList); return departmentDtoList; } private void recursiveDep(List depInfoList,List departmentDtoList,List materialInfoList,List classifyInfoList){ for (DepRPCRespDTO dep:depInfoList){ MaterialDepartmentDto materialDepartmentDto = new MaterialDepartmentDto(); materialDepartmentDto.setDepId(dep.getDepId()); materialDepartmentDto.setDepName(dep.getDepName()); List classificationDtoList = new ArrayList<>(); for (SafeMaterialClassifyInfo classifyInfo:classifyInfoList) { MaterialClassificationDto classificationDto = new MaterialClassificationDto(); classificationDto.setMaterialClassifyName(classifyInfo.getMaterialClassifyName()); classificationDto.setMaterialClassifyId(classifyInfo.getId()); //过滤出物资数据 List selectMaterialList = materialInfoList .stream() .filter(item -> classifyInfo.getId().equals(item.getBigClassifyId()) && dep.getDepId().equals(item.getDepId())) .collect(Collectors.toList()); List baseMaterialDtoList = new ArrayList<>(); if(selectMaterialList.size()>0){ //循环物资 for (SafeMaterialInfo materialInfo:selectMaterialList){ //填充基础物资数据 BaseMaterialDto baseMaterialDto = new BaseMaterialDto(); baseMaterialDto.setMaterialName(materialInfo.getMaterialName()); baseMaterialDto.setSmId(materialInfo.getId()); baseMaterialDtoList.add(baseMaterialDto); } classificationDto.setBaseMaterialList(baseMaterialDtoList); classificationDtoList.add(classificationDto); } } if(classificationDtoList.size()>0){ materialDepartmentDto.setClassificationList(classificationDtoList); departmentDtoList.add(materialDepartmentDto); } //子集部门 if(!CollectionUtils.isEmpty(dep.getChildren())){ this.recursiveDep(dep.getChildren(),departmentDtoList,materialInfoList,classifyInfoList); } } } @Override public SearchResultVO> listByPage(ContextCacheUser currentUser,PageQuery pageQuery) { Page page= new Page(pageQuery.getPageIndex(),pageQuery.getPageSize()); SafeMaterialQuery query = pageQuery.getSearchParams(); query.setDepId(currentUser.getDepId()); List materialInfoList = safeMaterialInfoService.listByPage(page, query); List materialDtoList = new ArrayList<>(); for (SafeMaterialDO materialDO:materialInfoList){ SafeMaterialDto materialDto = new SafeMaterialDto(); BeanUtils.copyProperties(materialDO,materialDto); if(null != ConsumableEnum.getByCode(materialDO.getConsumable())){ materialDto.setConsumableName(ConsumableEnum.getByCode(materialDO.getConsumable()).getValue()); } materialDtoList.add(materialDto); } return new SearchResultVO<>( true, page.getCurrent(), page.getSize(), page.getPages(), page.getTotal(), materialDtoList,ResultCodes.OK); } private DepInfoRPCRespDTO getDepInfoByDepId(Long deptId) { DepInfoRPCRespDTO dep = new DepInfoRPCRespDTO(); ResultVO rpcResult = accountDepartmentService.getDepInfoByDepId(deptId); if (rpcResult != null && rpcResult.getCode().equals(ResultCodes.OK.getCode())) { if (rpcResult.getData() != null) { dep = (DepInfoRPCRespDTO) rpcResult.getData(); }else { throw new EquipmentException(ResultCodes.CLIENT_DEP_NOT_EXIST); } } else { throw new EquipmentException(ResultCodes.RPC_RESULT_NULL); } return dep; } private List getDepInfoList() { List depInfoList = new ArrayList<>(); ResultVO> rpcResult = accountDepartmentService.depList(); if (rpcResult != null && rpcResult.getCode().equals(ResultCodes.OK.getCode())) { if (rpcResult.getData() != null) { depInfoList = (List) rpcResult.getData(); }else{ throw new EquipmentException(ResultCodes.CLIENT_DEP_NOT_EXIST); } } else { throw new EquipmentException(ResultCodes.CLIENT_DEP_NOT_EXIST); } return depInfoList; } private String generateSerialNum(int count){ if(count < 0){ return null; } String code = null; String prefix = "ID-"; String serialCode = null; if(count >= 10000){ serialCode = "" + (count+1); }else if(count >=0){ String countStr = String.valueOf(count+1); serialCode = "00000".substring(0,(5 - countStr.length()))+countStr; } if(serialCode != null && !serialCode.isEmpty()){ code = prefix+serialCode; } return code; } }