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.AccountUserService; import com.gkhy.safePlatform.account.rpc.apimodel.model.resp.UserInfoRPCRespDTO; 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.utils.StringUtils; 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.*; import com.gkhy.safePlatform.equipment.excepiton.EquipmentException; import com.gkhy.safePlatform.equipment.model.dto.req.*; import com.gkhy.safePlatform.equipment.model.dto.req.db.SafeMaterialDetailDBQuery; import com.gkhy.safePlatform.equipment.model.dto.resp.SafeMaterialClassifyStockDto; import com.gkhy.safePlatform.equipment.model.dto.resp.SafeMaterialDetailDto; import com.gkhy.safePlatform.equipment.model.dto.resp.SafeRfidMaterialDetailDto; import com.gkhy.safePlatform.equipment.service.SafeMaterialDetailService; import com.gkhy.safePlatform.equipment.service.baseService.*; import org.apache.dubbo.config.annotation.DubboReference; 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.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.ZonedDateTime; import java.util.*; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @Service("SafeMaterialDetailService") public class SafeMaterialDetailServiceImpl implements SafeMaterialDetailService { @Autowired private SafeMaterialInfoService safeMaterialInfoService; @Autowired private SafeMaterialDetailInfoService safeMaterialDetailInfoService; @Autowired private SafeMaterialClassifyInfoService safeMaterialClassifyInfoService; @DubboReference(check = false) private AccountUserService accountUserService; @Autowired private RedissonClient redissonClient; @Autowired private MaterialReceiveRecordsBaseInfoService materialReceiveRecordsBaseInfoService; @Autowired private MaterialReceiveRecordsInfoService materialReceiveRecordsInfoService; @Override @Transactional public ResultVO save(SafeMaterialDetailAddReq req) { //判断物资是否存在 SafeMaterialDO safeMaterialDO = safeMaterialInfoService.queryById(req.getSmId()); if(null == safeMaterialDO){ throw new EquipmentException(EquipmentResultCodes.DATA_NOT_EXIST,"该种物资不存在!"); } if(null == ValidTypeEnum.getByCode(req.getValidType())){ throw new EquipmentException(ResultCodes.CLIENT_PARAM_ILLEGAL,"有效期类型不合法!"); } if(req.getValidType().equals(ValidTypeEnum.SHORT_TERM.getCode()) && null == req.getValidTime()){ throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL,"有效期时间不可为空!"); } //获取数据量 Integer totalCount = safeMaterialDetailInfoService.getTotalCount(); List list = new ArrayList<>(); //RFID起始不为空计算一下 if(StringUtils.isNotBlank(req.getStartRfid()) && StringUtils.isNotBlank(req.getEndRfid())){ int start = 0; int end = 0; String prefix = ""; try{ prefix = req.getStartRfid().substring(0,req.getStartRfid().length()-8); start = Integer.parseInt(req.getStartRfid().substring(req.getStartRfid().length()-8)); end = Integer.parseInt(req.getEndRfid().substring(req.getEndRfid().length()-8)); }catch (Exception e){ throw new EquipmentException(ResultCodes.CLIENT_PARAM_ILLEGAL,"起始RFID不合法!"); } if((end-start+1) != req.getWareHousingCount()){ throw new EquipmentException(ResultCodes.CLIENT_PARAM_ILLEGAL,"RFID起始和入库数量不能对应!"); } for(int i = 0;i < req.getWareHousingCount();i++){ String countStr = String.valueOf(start+i); String rfid = "0000000".substring(0,(8 - countStr.length()))+countStr; SafeMaterialDetailInfo materialDetailInfo = new SafeMaterialDetailInfo(); materialDetailInfo.setId(IdUtil.getSnowflake(0,0).nextId()); materialDetailInfo.setBigClassifyId(safeMaterialDO.getBigClassifyId()); materialDetailInfo.setSmallClassifyId(safeMaterialDO.getSmallClassifyId()); materialDetailInfo.setName(safeMaterialDO.getMaterialName()); materialDetailInfo.setSmId(req.getSmId()); materialDetailInfo.setConsumable(safeMaterialDO.getConsumable()); materialDetailInfo.setStatus(MaterialStatusEnum.INTACT.getCode()); materialDetailInfo.setRemark(MaterialStatusEnum.INTACT.getValue()); materialDetailInfo.setValidType(req.getValidType()); if(req.getValidType().equals(ValidTypeEnum.SHORT_TERM.getCode())){ materialDetailInfo.setValidTime(req.getValidTime()); } materialDetailInfo.setValidStatus(ValidStatusEnum.YES.getCode()); materialDetailInfo.setIrStatus(IssueReceiptEnum.IN_THE_LIBRARY.getCode()); materialDetailInfo.setWareHousingTime(LocalDateTime.now()); materialDetailInfo.setRfid(prefix+rfid); materialDetailInfo.setMaterialNo(generateMaterialNo(totalCount+i)); list.add(materialDetailInfo); } }else{ //不分配FRID for(int i = 0;i < req.getWareHousingCount();i++){ SafeMaterialDetailInfo materialDetailInfo = new SafeMaterialDetailInfo(); materialDetailInfo.setId(IdUtil.getSnowflake(0,0).nextId()); materialDetailInfo.setBigClassifyId(safeMaterialDO.getBigClassifyId()); materialDetailInfo.setSmallClassifyId(safeMaterialDO.getSmallClassifyId()); materialDetailInfo.setName(safeMaterialDO.getMaterialName()); materialDetailInfo.setSmId(req.getSmId()); materialDetailInfo.setConsumable(safeMaterialDO.getConsumable()); materialDetailInfo.setStatus(MaterialStatusEnum.INTACT.getCode()); materialDetailInfo.setRemark(MaterialStatusEnum.INTACT.getValue()); materialDetailInfo.setValidType(req.getValidType()); if(req.getValidType().equals(ValidTypeEnum.SHORT_TERM.getCode())){ materialDetailInfo.setValidTime(req.getValidTime()); } materialDetailInfo.setValidStatus(ValidStatusEnum.YES.getCode()); materialDetailInfo.setIrStatus(IssueReceiptEnum.IN_THE_LIBRARY.getCode()); materialDetailInfo.setWareHousingTime(LocalDateTime.now()); materialDetailInfo.setMaterialNo(generateMaterialNo(totalCount+i)); list.add(materialDetailInfo); } } //填充物资管理数据 SafeMaterialBO safeMaterialBO = new SafeMaterialBO(); safeMaterialBO.setId(req.getSmId()); safeMaterialBO.setStockCount(req.getWareHousingCount()); safeMaterialBO.setTotalCount(req.getWareHousingCount()); //加分布式锁,防止重复创建规则 RLock lock = redissonClient.getLock("LOCK_SMD_SAVE"); try { lock.lock(10, TimeUnit.SECONDS); //批量入库 safeMaterialDetailInfoService.saveBatch(list); //修改数量 safeMaterialInfoService.updateCountById(safeMaterialBO); //发送消息 /*if(req.getValidType().equals(ValidTypeEnum.SHORT_TERM.getCode()) && null != req.getValidTime()){ for(SafeMaterialDetailInfo materialDetailInfo:list){ SafeMaterialMsg safeMaterialMsg = new SafeMaterialMsg(); safeMaterialMsg.setId(materialDetailInfo.getId()); safeMaterialMsg.setValidTime(conversionTimeType(materialDetailInfo.getValidTime())); rocketMQTemplateHelper.syncSend(safeMaterialTopic,safeMaterialMsg); } }*/ //创建成功,释放锁 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); } /** * 批量入库 * @param req * @return */ @Override @Transactional public ResultVO saveBatch(SafeMaterialDetailAddReq req) { //判断物资是否存在 SafeMaterialDO safeMaterialDO = safeMaterialInfoService.queryById(req.getSmId()); if(null == safeMaterialDO){ throw new EquipmentException(EquipmentResultCodes.DATA_NOT_EXIST,"该种物资不存在!"); } if(null == ValidTypeEnum.getByCode(req.getValidType())){ throw new EquipmentException(ResultCodes.CLIENT_PARAM_ILLEGAL,"有效期类型不合法!"); } if(req.getValidType().equals(ValidTypeEnum.SHORT_TERM.getCode()) && null == req.getValidTime()){ throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL,"有效期时间不可为空!"); } //获取数据量 Integer totalCount = safeMaterialDetailInfoService.getTotalCount(); List list = new ArrayList<>(); for(int i = 0;i < req.getWareHousingCount();i++){ SafeMaterialDetailInfo materialDetailInfo = new SafeMaterialDetailInfo(); materialDetailInfo.setId(IdUtil.getSnowflake(0,0).nextId()); materialDetailInfo.setBigClassifyId(safeMaterialDO.getBigClassifyId()); materialDetailInfo.setSmallClassifyId(safeMaterialDO.getSmallClassifyId()); materialDetailInfo.setName(safeMaterialDO.getMaterialName()); materialDetailInfo.setSmId(req.getSmId()); materialDetailInfo.setConsumable(safeMaterialDO.getConsumable()); materialDetailInfo.setStatus(MaterialStatusEnum.INTACT.getCode()); materialDetailInfo.setRemark(MaterialStatusEnum.INTACT.getValue()); materialDetailInfo.setValidType(req.getValidType()); if(req.getValidType().equals(ValidTypeEnum.SHORT_TERM.getCode())){ materialDetailInfo.setValidTime(req.getValidTime()); } materialDetailInfo.setValidStatus(ValidStatusEnum.YES.getCode()); materialDetailInfo.setIrStatus(IssueReceiptEnum.IN_THE_LIBRARY.getCode()); materialDetailInfo.setWareHousingTime(LocalDateTime.now()); materialDetailInfo.setRfid(req.getRfid()); materialDetailInfo.setMaterialNo(generateMaterialNo(totalCount+i)); list.add(materialDetailInfo); } //填充物资管理数据 SafeMaterialBO safeMaterialBO = new SafeMaterialBO(); safeMaterialBO.setId(req.getSmId()); safeMaterialBO.setStockCount(req.getWareHousingCount()); safeMaterialBO.setTotalCount(req.getWareHousingCount()); //加分布式锁,防止重复创建规则 RLock lock = redissonClient.getLock("LOCK_SMD_SAVEBATCH"); try { lock.lock(10, TimeUnit.SECONDS); //批量入库 safeMaterialDetailInfoService.saveBatch(list); //修改数量 safeMaterialInfoService.updateCountById(safeMaterialBO); //创建成功,释放锁 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); } /** * 编辑 * @param req * @return */ @Transactional @Override public ResultVO update(SafeMaterialDetailReq req) { //获取该条数据 SafeMaterialDetailInfo vo = safeMaterialDetailInfoService.queryById(req.getId()); if(null == vo){ throw new EquipmentException(EquipmentResultCodes.DATA_NOT_EXIST); } //有效类型不为空 if(null != req.getValidType()){ if(null == ValidTypeEnum.getByCode(req.getValidType())){ throw new EquipmentException(ResultCodes.CLIENT_PARAM_ILLEGAL,"有效期类型不合法!"); }else{ if(req.getValidType().equals(ValidTypeEnum.SHORT_TERM.getCode()) && null == req.getValidTime()){ throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL,"有效期时间不可为空!"); }else{ if(req.getValidTime().before(new Date())){ throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL,"有效期时间小于当前时间!"); } } } } //填充物资管理数据 SafeMaterialBO safeMaterialBO = new SafeMaterialBO(); safeMaterialBO.setId(vo.getSmId()); safeMaterialBO.setStockCount(0); //填充数据 SafeMaterialDetailInfo safeMaterialDetailInfo = new SafeMaterialDetailInfo(); safeMaterialDetailInfo.setId(req.getId()); safeMaterialDetailInfo.setRfid(req.getRfid()); safeMaterialDetailInfo.setSmId(req.getSmId()); safeMaterialDetailInfo.setValidType(req.getValidType()); safeMaterialDetailInfo.setValidTime(req.getValidTime()); if(ValidStatusEnum.NO.getCode().equals(vo.getValidStatus())){ //无效情况 if(vo.getStatus().equals(MaterialStatusEnum.OVERDUE.getCode())){ //过期 safeMaterialDetailInfo.setValidStatus(ValidStatusEnum.YES.getCode()); safeMaterialDetailInfo.setStatus(MaterialStatusEnum.INTACT.getCode()); safeMaterialDetailInfo.setRemark(MaterialStatusEnum.INTACT.getValue()); safeMaterialBO.setStockCount(1); } } //加分布式锁,防止重复创建规则 RLock lock = redissonClient.getLock("LOCK_SMD_UPDATE"); try { lock.lock(10, TimeUnit.SECONDS); //修改 safeMaterialDetailInfoService.updateById(safeMaterialDetailInfo); if(null != safeMaterialBO){ safeMaterialInfoService.updateCountById(safeMaterialBO); } //创建成功,释放锁 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); } /** * 批量-重新入库 * @param * @return */ @Override public ResultVO receiptBatch(ParamForm paramForm) { //加分布式锁,防止重复创建规则 RLock lock = redissonClient.getLock("LOCK_SMD_RECEIPTBATCH"); try { lock.lock(10, TimeUnit.SECONDS); //验证 List list = safeMaterialDetailInfoService.getListByIds(paramForm.getIds()); List selectList = list .stream() .filter(item -> item.getIrStatus().equals(IssueReceiptEnum.OUT_OF_LIBRARY.getCode()) && item.getConsumable().equals(ConsumableEnum.NO.getCode())) .collect(Collectors.toList()); if(selectList.size() != paramForm.getIds().size()){ throw new EquipmentException(ResultCodes.CLIENT_PARAM_ILLEGAL,"已入库或耗材物资不可重复入库!"); } //修改为入库状态 safeMaterialDetailInfoService.updateReceiptStatusByIds(paramForm.getIds(),IssueReceiptEnum.IN_THE_LIBRARY.getCode()); //创建成功,释放锁 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); } /** * 逻辑删除 -批量删除 * @param * @return */ @Transactional @Override public ResultVO deleteBatch(ContextCacheUser currentUser,ParamForm paramForm) { //加分布式锁,防止重复创建规则 RLock lock = redissonClient.getLock("LOCK_SMD_DELETEBATCH"); try { lock.lock(10, TimeUnit.SECONDS); //获取所有物资管理 List safeMaterialInfoList = safeMaterialInfoService.listByDepId(currentUser.getDepId()); List idList = paramForm.getIds(); List list = safeMaterialDetailInfoService.getListByIds(idList); List collect = list.stream().filter(item -> item.getIrStatus().equals(IssueReceiptEnum.OUT_OF_LIBRARY.getCode())).collect(Collectors.toList()); if(collect.size()>0){ throw new EquipmentException(ResultCodes.SERVER_DEL_ERROR,"出库物资不可删除!"); } List safeMaterialBOList = new ArrayList<>(); for(SafeMaterialInfo materialInfo:safeMaterialInfoList){ List selectList = list.stream().filter(item -> item.getSmId().equals(materialInfo.getId())).collect(Collectors.toList()); if(selectList.size()>0){ //物资管理 SafeMaterialBO safeMaterialBO = new SafeMaterialBO(); safeMaterialBO.setId(materialInfo.getId()); safeMaterialBO.setStockCount(-selectList.size()); safeMaterialBO.setTotalCount(-selectList.size()); safeMaterialBOList.add(safeMaterialBO); } } //删除 safeMaterialDetailInfoService.deleteBatch(paramForm.getIds()); //修改库存 safeMaterialInfoService.updateStockCount(safeMaterialBOList); //创建成功,释放锁 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); } /** * 批量出库 - 根据ids * @param req * @return */ @Transactional @Override public void deliveryBatchByIds(MterialDeliveryReq req,ContextCacheUser currentUser) { //获取认领人信息 UserInfoRPCRespDTO userInfo = getUserInfo(req.getReceiveUid()); //加分布式锁,防止重复创建规则 RLock lock = redissonClient.getLock("LOCK_SMD_DELIVERYBATCHBYIDS"); try { lock.lock(10, TimeUnit.SECONDS); //验证 List list = safeMaterialDetailInfoService.getListByIds(req.getIds()); List selectList = list .stream() .filter(item -> item.getIrStatus().equals(IssueReceiptEnum.IN_THE_LIBRARY.getCode()) && item.getValidStatus().equals(ValidStatusEnum.YES.getCode())) .collect(Collectors.toList()); if(selectList.size() != req.getIds().size()){ throw new EquipmentException(ResultCodes.CLIENT_PARAM_ILLEGAL,"已出库物资或无效物资,不可出库!"); } //获取该部门的所管理物资 List safeMaterialInfoList = safeMaterialInfoService.listByDepId(currentUser.getDepId()); List receiveRecordsBaseInfoList = new ArrayList<>(); List receiveRecordsInfoList = new ArrayList<>(); List safeMaterialBOList = new ArrayList<>(); List safeMaterialDetailInfoList = new ArrayList<>(); //循环 for(SafeMaterialInfo safeMaterialInfo:safeMaterialInfoList){ List collectList = list.stream().filter(item -> safeMaterialInfo.getId().equals(item.getSmId())).collect(Collectors.toList()); if(collectList.size()>0){ //物资管理 SafeMaterialBO safeMaterialBO = new SafeMaterialBO(); safeMaterialBO.setId(safeMaterialInfo.getId()); safeMaterialBO.setStockCount(-collectList.size()); safeMaterialBOList.add(safeMaterialBO); //总记录 MaterialReceiveRecordsBaseInfo receiveRecordsBaseInfo = new MaterialReceiveRecordsBaseInfo(); receiveRecordsBaseInfo.setId(IdUtil.getSnowflake(0,0).nextId()); receiveRecordsBaseInfo.setMaterialName(safeMaterialInfo.getMaterialName()); receiveRecordsBaseInfo.setReceiveUid(userInfo.getUid()); receiveRecordsBaseInfo.setReceiveUname(userInfo.getUsername()); receiveRecordsBaseInfo.setReceiveCount(collectList.size()); receiveRecordsBaseInfo.setRevertCount(0); receiveRecordsBaseInfo.setConsumeCount(0); if(ConsumableEnum.YES.getCode().equals(safeMaterialInfo.getConsumable())){ receiveRecordsBaseInfo.setStatus(MaterialReceiveRecordsStatusEnum.CONSUMABLE_RETURN_NO.getCode()); receiveRecordsBaseInfo.setConsumeCount(0); }else{ receiveRecordsBaseInfo.setStatus(MaterialReceiveRecordsStatusEnum.RETURN_NO.getCode()); receiveRecordsBaseInfo.setConsumeCount(collectList.size()); } receiveRecordsBaseInfo.setSmId(safeMaterialInfo.getId()); receiveRecordsBaseInfoList.add(receiveRecordsBaseInfo); //循环详细物资 for(SafeMaterialDetailInfo safeMaterialDetailInfo:collectList){ //领取物资清单记录 MaterialReceiveRecordsInfo materialReceiveRecordsInfo = new MaterialReceiveRecordsInfo(); materialReceiveRecordsInfo.setId(IdUtil.getSnowflake(0,0).nextId()); materialReceiveRecordsInfo.setMaterialName(safeMaterialDetailInfo.getName()); materialReceiveRecordsInfo.setMaterialNo(safeMaterialDetailInfo.getMaterialNo()); materialReceiveRecordsInfo.setReceiveBaseId(receiveRecordsBaseInfo.getId()); if(ConsumableEnum.YES.getCode().equals(safeMaterialDetailInfo.getConsumable())){ materialReceiveRecordsInfo.setRevertStatus(MaterialRevertStatusEnum.DEPLETION.getCode()); materialReceiveRecordsInfo.setMaterialStatus(MaterialStatusEnum.OTHER.getCode()); materialReceiveRecordsInfo.setRemark("耗材"); }else{ materialReceiveRecordsInfo.setRevertStatus(MaterialRevertStatusEnum.REVERT_NO.getCode()); materialReceiveRecordsInfo.setMaterialStatus(MaterialStatusEnum.INTACT.getCode()); materialReceiveRecordsInfo.setRemark(MaterialStatusEnum.INTACT.getValue()); } materialReceiveRecordsInfo.setReceiveTime(LocalDateTime.now()); materialReceiveRecordsInfo.setReceiveUid(userInfo.getUid()); materialReceiveRecordsInfo.setReceiveUname(userInfo.getUsername()); materialReceiveRecordsInfo.setSmdId(safeMaterialDetailInfo.getId()); materialReceiveRecordsInfo.setRfid(safeMaterialDetailInfo.getRfid()); receiveRecordsInfoList.add(materialReceiveRecordsInfo); //物资清单 SafeMaterialDetailInfo materialDetailInfo = new SafeMaterialDetailInfo(); materialDetailInfo.setId(safeMaterialDetailInfo.getId()); materialDetailInfo.setReceiveUid(userInfo.getUid()); materialDetailInfo.setReceiveUname(userInfo.getRealName()); materialDetailInfo.setIrStatus(IssueReceiptEnum.OUT_OF_LIBRARY.getCode()); materialDetailInfo.setDeliveryTime(LocalDateTime.now()); if(ConsumableEnum.YES.getCode().equals(safeMaterialDetailInfo.getConsumable())){ materialDetailInfo.setValidStatus(ValidStatusEnum.NO.getCode()); materialDetailInfo.setStatus(MaterialStatusEnum.OTHER.getCode()); materialDetailInfo.setRemark("耗材"); } safeMaterialDetailInfoList.add(materialDetailInfo); } } } //修改物资管理数量 safeMaterialInfoService.updateStockCount(safeMaterialBOList); //修改物资清单的状态 safeMaterialDetailInfoService.updateBatchById(safeMaterialDetailInfoList); //插入领取总记录 materialReceiveRecordsBaseInfoService.saveBatch(receiveRecordsBaseInfoList); //插入领取清单 materialReceiveRecordsInfoService.saveBatch(receiveRecordsInfoList); //创建成功,释放锁 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(); } } } @Transactional @Override public void deliveryBatchBySmId(MterialRandomDeliveryReq req,ContextCacheUser currentUser) { SafeMaterialDO safeMaterialDO = safeMaterialInfoService.queryById(req.getSmId()); if(null == safeMaterialDO){ throw new EquipmentException(EquipmentResultCodes.DATA_NOT_EXIST,"物资不存在,无法出库!"); } SafeMaterialDetailDBQuery query = new SafeMaterialDetailDBQuery(); query.setSmId(safeMaterialDO.getId()); query.setCount(req.getCount()); query.setRfid(req.getRfid()); query.setIrStatus(IssueReceiptEnum.IN_THE_LIBRARY.getCode()); query.setValidStatus(ValidStatusEnum.YES.getCode()); UserInfoRPCRespDTO userInfo = getUserInfo(req.getReceiveUid()); List safeMaterialDetailInfoList = new ArrayList<>(); //加分布式锁,防止重复创建规则 RLock lock = redissonClient.getLock("LOCK_SMD_DELIVERYBATCHRANDOM"); try { lock.lock(10, TimeUnit.SECONDS); //获取有效数量 Integer validStockCount = safeMaterialDetailInfoService.getValidStockCount(req.getSmId()); if(req.getCount() > validStockCount){ throw new EquipmentException(ResultCodes.CLIENT_PARAM_ILLEGAL,"出库数量不可大于有效库存数量!"); } if(StringUtils.isNotBlank(req.getRfid())){ safeMaterialDetailInfoList = safeMaterialDetailInfoService.getListBySmIdAndRfid(query); }else{ safeMaterialDetailInfoList = safeMaterialDetailInfoService.getListBySmId(query); } if(safeMaterialDetailInfoList.size()< req.getCount()){ throw new EquipmentException(ResultCodes.CLIENT_PARAM_ILLEGAL,"库存数量不足!"); } //物资管理 SafeMaterialBO safeMaterialBO = new SafeMaterialBO(); safeMaterialBO.setId(req.getSmId()); safeMaterialBO.setStockCount(-req.getCount()); //领取记录 MaterialReceiveRecordsBaseInfo receiveRecordsBaseInfo = new MaterialReceiveRecordsBaseInfo(); receiveRecordsBaseInfo.setId(IdUtil.getSnowflake(0,0).nextId()); receiveRecordsBaseInfo.setMaterialName(safeMaterialDO.getMaterialName()); receiveRecordsBaseInfo.setReceiveUid(userInfo.getUid()); receiveRecordsBaseInfo.setReceiveUname(userInfo.getUsername()); receiveRecordsBaseInfo.setReceiveCount(req.getCount()); receiveRecordsBaseInfo.setRevertCount(0); receiveRecordsBaseInfo.setConsumeCount(0); if(ConsumableEnum.YES.getCode().equals(safeMaterialDO.getConsumable())){ receiveRecordsBaseInfo.setStatus(MaterialReceiveRecordsStatusEnum.CONSUMABLE_RETURN_NO.getCode()); receiveRecordsBaseInfo.setConsumeCount(req.getCount()); }else{ receiveRecordsBaseInfo.setStatus(MaterialReceiveRecordsStatusEnum.RETURN_NO.getCode()); receiveRecordsBaseInfo.setConsumeCount(0); } receiveRecordsBaseInfo.setSmId(safeMaterialDO.getId()); //物资领取清单 List receiveRecordsInfoList = new ArrayList<>(); //物资清单 List updateDetailList = new ArrayList<>(); for(SafeMaterialDetailInfo safeMaterialDetailInfo:safeMaterialDetailInfoList){ //领取物资清单记录 MaterialReceiveRecordsInfo materialReceiveRecordsInfo = new MaterialReceiveRecordsInfo(); materialReceiveRecordsInfo.setId(IdUtil.getSnowflake(0,0).nextId()); materialReceiveRecordsInfo.setMaterialName(safeMaterialDetailInfo.getName()); materialReceiveRecordsInfo.setMaterialNo(safeMaterialDetailInfo.getMaterialNo()); materialReceiveRecordsInfo.setReceiveBaseId(receiveRecordsBaseInfo.getId()); if(ConsumableEnum.YES.getCode().equals(safeMaterialDetailInfo.getConsumable())){ materialReceiveRecordsInfo.setRevertStatus(MaterialRevertStatusEnum.DEPLETION.getCode()); materialReceiveRecordsInfo.setMaterialStatus(MaterialStatusEnum.OTHER.getCode()); materialReceiveRecordsInfo.setRemark("耗材"); }else{ materialReceiveRecordsInfo.setRevertStatus(MaterialRevertStatusEnum.REVERT_NO.getCode()); materialReceiveRecordsInfo.setMaterialStatus(MaterialStatusEnum.INTACT.getCode()); materialReceiveRecordsInfo.setRemark(MaterialStatusEnum.INTACT.getValue()); } materialReceiveRecordsInfo.setReceiveTime(LocalDateTime.now()); materialReceiveRecordsInfo.setReceiveUid(userInfo.getUid()); materialReceiveRecordsInfo.setReceiveUname(userInfo.getUsername()); materialReceiveRecordsInfo.setSmdId(safeMaterialDetailInfo.getId()); materialReceiveRecordsInfo.setRfid(safeMaterialDetailInfo.getRfid()); receiveRecordsInfoList.add(materialReceiveRecordsInfo); //物资清单 SafeMaterialDetailInfo materialDetailInfo = new SafeMaterialDetailInfo(); materialDetailInfo.setId(safeMaterialDetailInfo.getId()); materialDetailInfo.setReceiveUid(userInfo.getUid()); materialDetailInfo.setReceiveUname(userInfo.getRealName()); materialDetailInfo.setIrStatus(IssueReceiptEnum.OUT_OF_LIBRARY.getCode()); materialDetailInfo.setDeliveryTime(LocalDateTime.now()); if(ConsumableEnum.YES.getCode().equals(safeMaterialDetailInfo.getConsumable())){ materialDetailInfo.setValidStatus(ValidStatusEnum.NO.getCode()); materialDetailInfo.setStatus(MaterialStatusEnum.OTHER.getCode()); materialDetailInfo.setRemark("耗材"); } updateDetailList.add(materialDetailInfo); } //修改物资清单状态 safeMaterialDetailInfoService.updateBatchById(updateDetailList); //修改物资管理库存 safeMaterialInfoService.updateCountById(safeMaterialBO); //插入领取总记录 materialReceiveRecordsBaseInfoService.save(receiveRecordsBaseInfo); //插入领取清单 materialReceiveRecordsInfoService.saveBatch(receiveRecordsInfoList); //创建成功,释放锁 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(); } } } /** * 特殊作业物资出库 * @param req * @return */ @Override public void deliveryBatchSpw(MaterialSpwReq req) { //验证 if(null == req.getClaimantId()){ throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL,"认领人不可为空!"); } List deliveryReqList = req.getDeliveryReqList(); if(CollectionUtils.isEmpty(deliveryReqList)){ throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL,"出库物资不可为空!"); } //获取小类物资 List smallClassifyIds = deliveryReqList .stream() .map(MaterialSpwDeliveryReq::getSmallClassifyId) .collect(Collectors.toList()); List depIds = deliveryReqList .stream() .map(MaterialSpwDeliveryReq::getDepId) .collect(Collectors.toList()); if(smallClassifyIds.size() == 0 || depIds.size() == 0){ throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL,"部门/仓库或者物资类型(小类)不可为空!"); } List classifyStockList= safeMaterialDetailInfoService.getSmallClassifyStockByIds(smallClassifyIds); //根据物资种类获取有效在库物资 List listBySmallClassifyIds = safeMaterialDetailInfoService.getListBySmallClassifyIds(smallClassifyIds,depIds); for(MaterialSpwDeliveryReq deliveryReq:deliveryReqList){ if(null == deliveryReq.getDepId()){ throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL,"部门或仓库不可为空!"); } if(null == deliveryReq.getCount()){ throw new EquipmentException(ResultCodes.CLIENT_PARAM_ILLEGAL,"出库数量不可为空!"); } if(null == deliveryReq.getSmallClassifyId()){ throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL,"物资类型(小类)不可为空!"); } List collect = classifyStockList .stream() .filter(cs -> cs.getSmallClassifyId().equals(deliveryReq.getSmallClassifyId()) && cs.getDepId().equals(deliveryReq.getDepId()) && cs.getStockCount() >= deliveryReq.getCount()) .collect(Collectors.toList()); if(collect.size() == 0){ throw new EquipmentException(ResultCodes.CLIENT_PARAM_ILLEGAL,"库存不足!"); } } UserInfoRPCRespDTO userInfo = getUserInfo(req.getClaimantId()); List ids = new ArrayList<>(); //循环数据 for(MaterialSpwDeliveryReq deliveryReq:deliveryReqList){ //过滤出rfid存在的数据 List selectRfidNotNull = listBySmallClassifyIds .stream() .filter(item -> null != item.getRfid() && item.getSmallClassifyId().equals(deliveryReq.getSmallClassifyId()) && item.getDepId().equals(deliveryReq.getDepId())) .collect(Collectors.toList()); List selectIds = new ArrayList<>(); if(selectRfidNotNull.size()>0){ selectIds = selectRfidNotNull .stream() .map(SafeMaterialDetailDO::getId) .collect(Collectors.toList()); } if(selectRfidNotNull.size() >= deliveryReq.getCount()){ ids.addAll(selectIds.subList(0,deliveryReq.getCount())); }else{ ids.addAll(selectIds); List selectRfidIsNull = listBySmallClassifyIds .stream() .filter(item -> null == item.getRfid() && item.getSmallClassifyId().equals(deliveryReq.getSmallClassifyId()) && item.getDepId().equals(deliveryReq.getDepId())) .collect(Collectors.toList()); List collect = selectRfidIsNull.subList(0,deliveryReq.getCount()-selectRfidNotNull.size()).stream().map(SafeMaterialDetailDO::getId) .collect(Collectors.toList()); ids.addAll(collect); } } SafeMaterialBatchDeliveryBO detailBO = new SafeMaterialBatchDeliveryBO(); detailBO.setReceiveUname(userInfo.getUsername()); detailBO.setReceiveUid(req.getClaimantId()); detailBO.setIds(ids); safeMaterialDetailInfoService.updateDeliveryStatusByIds(detailBO); } /** * 根据rfid获取数据信息 * @param rfids * @return */ @Override public List getListByRfids(List rfids) { if(CollectionUtils.isEmpty(rfids)){ throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL); } List listByRfid = safeMaterialDetailInfoService.getListByRfids(rfids); List rfidMaterialDetailDtoList = new ArrayList<>(); for (SafeMaterialDetailInfoDO detailInfoDO:listByRfid){ SafeRfidMaterialDetailDto detailDto = new SafeRfidMaterialDetailDto(); detailDto.setId(detailInfoDO.getId()); detailDto.setName(detailInfoDO.getName()); detailDto.setBigClassifyId(detailInfoDO.getBigClassifyId()); detailDto.setSmallClassifyId(detailInfoDO.getSmallClassifyId()); detailDto.setDepId(detailInfoDO.getDepId()); rfidMaterialDetailDtoList.add(detailDto); } return rfidMaterialDetailDtoList; } @Override @Transactional public SearchResultVO> listByPage(ContextCacheUser currentUser,PageQuery pageQuery) { SafeMaterialDetailDBQuery dbQuery = new SafeMaterialDetailDBQuery(); if(null != pageQuery.getSearchParams()){ BeanUtils.copyProperties(pageQuery.getSearchParams(),dbQuery); dbQuery.setDepId(currentUser.getDepId()); } dbQuery.setDepId(currentUser.getDepId()); //加分布式锁,防止重复创建规则 RLock lock = redissonClient.getLock("LOCK_SMD_MATERIALEXPIRED"); try { lock.lock(10, TimeUnit.SECONDS); //执行无效物资过期 this.materialExpired(); //创建成功,释放锁 lock.unlock(); }catch (Exception e) { e.printStackTrace(); throw new BusinessException(ResultCodes.SERVER_ERROR); }finally { if(lock.isLocked()){ lock.unlock(); } } Page page = new Page(pageQuery.getPageIndex(),pageQuery.getPageSize()); List safeMaterialDetailInfoDOS = safeMaterialDetailInfoService.listByPage(page, dbQuery); List detailDtoList = new ArrayList<>(); for(SafeMaterialDetailInfoDO materialDetailInfoDO : safeMaterialDetailInfoDOS){ SafeMaterialDetailDto materialDetailDto = new SafeMaterialDetailDto(); BeanUtils.copyProperties(materialDetailInfoDO,materialDetailDto); materialDetailDto.setConsumableName(ConsumableEnum.getByCode(materialDetailInfoDO.getConsumable()).getValue()); materialDetailDto.setValidStatusName(ValidStatusEnum.getByCode(materialDetailInfoDO.getValidStatus()).getValue()); materialDetailDto.setValidTypeName(ValidTypeEnum.getByCode(materialDetailInfoDO.getValidType()).getValue()); materialDetailDto.setIrStatusName(IssueReceiptEnum.getByCode(materialDetailInfoDO.getIrStatus()).getValue()); materialDetailDto.setStatusName(MaterialStatusEnum.getByCode(materialDetailInfoDO.getStatus()).getValue()); detailDtoList.add(materialDetailDto); } return new SearchResultVO<>(true, page.getCurrent(),page.getSize(), page.getPages(),page.getTotal(),detailDtoList,ResultCodes.OK); } private void materialExpired(){ //获取所有物资管理 List list = safeMaterialInfoService.list(); //获取在库有效物资 List unValidList = safeMaterialDetailInfoService.getUnValidList(); if(unValidList.size()>0){ List safeMaterialBOList = new ArrayList<>(); List updateValidStatusList = new ArrayList<>(); for(SafeMaterialInfo safeMaterialInfo:list){ //过滤出该管理下过期物资 List expiredList = unValidList.stream().filter(item -> item.getSmId().equals(safeMaterialInfo.getId())).collect(Collectors.toList()); if(expiredList.size()>0){ //过滤非出库无效物资 List expiredAndInLibraryList = expiredList.stream().filter(item -> item.getIrStatus().equals(IssueReceiptEnum.IN_THE_LIBRARY.getCode())).collect(Collectors.toList()); if(expiredAndInLibraryList.size()>0){ //物资管理 SafeMaterialBO safeMaterialBO = new SafeMaterialBO(); safeMaterialBO.setId(safeMaterialInfo.getId()); safeMaterialBO.setStockCount(-expiredAndInLibraryList.size()); safeMaterialBOList.add(safeMaterialBO); } //物资清单 for(SafeMaterialDetailInfo detailInfo:expiredList){ SafeMaterialDetailInfo safeMaterialDetailInfo = new SafeMaterialDetailInfo(); safeMaterialDetailInfo.setId(detailInfo.getId()); safeMaterialDetailInfo.setValidStatus(ValidStatusEnum.NO.getCode()); if(detailInfo.getStatus().equals(MaterialStatusEnum.INTACT.getCode())){ safeMaterialDetailInfo.setStatus(MaterialStatusEnum.OVERDUE.getCode()); safeMaterialDetailInfo.setRemark(MaterialStatusEnum.OVERDUE.getValue()); } updateValidStatusList.add(safeMaterialDetailInfo); } } } if(safeMaterialBOList.size()>0){ safeMaterialInfoService.updateStockCount(safeMaterialBOList); } if(updateValidStatusList.size()>0){ safeMaterialDetailInfoService.updateBatchById(updateValidStatusList); } } } @Override public ResultVO queryById(Long id) { if(null == id){ throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL); } SafeMaterialDetailInfo materialDetailInfo = safeMaterialDetailInfoService.queryById(id); SafeMaterialDetailDto detailDto = new SafeMaterialDetailDto(); if(materialDetailInfo != null){ SafeMaterialDO safeMaterialDO = safeMaterialInfoService.queryById(materialDetailInfo.getSmId()); SafeMaterialClassifyInfo classifyInfo = safeMaterialClassifyInfoService.queryById(materialDetailInfo.getBigClassifyId()); BeanUtils.copyProperties(materialDetailInfo,detailDto); detailDto.setConsumableName(ConsumableEnum.getByCode(materialDetailInfo.getConsumable()).getValue()); detailDto.setValidStatusName(ValidStatusEnum.getByCode(materialDetailInfo.getValidStatus()).getValue()); detailDto.setValidTypeName(ValidTypeEnum.getByCode(materialDetailInfo.getValidType()).getValue()); detailDto.setIrStatusName(IssueReceiptEnum.getByCode(materialDetailInfo.getIrStatus()).getValue()); detailDto.setStatusName(MaterialStatusEnum.getByCode(materialDetailInfo.getStatus()).getValue()); if(safeMaterialDO != null){ detailDto.setDepName(safeMaterialDO.getDepName()); } if(classifyInfo != null){ detailDto.setBigClassifyName(classifyInfo.getMaterialClassifyName()); } } return new ResultVO(ResultCodes.OK,detailDto); } /** * 单条-出库 * @param req * @return */ @Override @Transactional public void singleDelivery(ContextCacheUser currentUser,SafeMaterialDetailReq req) { if(null == req.getReceiveUid()){ throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL,"领取人不可为空!"); } //加分布式锁,防止重复创建规则 RLock lock = redissonClient.getLock("LOCK_SMD_SINGLEDELIVERY"); try { lock.lock(10, TimeUnit.SECONDS); //获取该条数据 SafeMaterialDetailInfo vo = safeMaterialDetailInfoService.queryById(req.getId()); if(null == vo){ throw new EquipmentException(EquipmentResultCodes.DATA_NOT_EXIST); } if(vo.getValidStatus().equals(ValidStatusEnum.NO.getCode())){ throw new EquipmentException(EquipmentResultCodes.MATERIAL_INVALID,"无效物资不可出库"); } if(vo.getIrStatus().equals(IssueReceiptEnum.OUT_OF_LIBRARY.getCode())){ throw new EquipmentException(EquipmentResultCodes.MATERIAL_OUT_OF_LIBRARY); } //检查认领人 UserInfoRPCRespDTO userInfo = getUserInfo(req.getReceiveUid()); //详细物资 SafeMaterialDetailInfo materialDetailInfo = new SafeMaterialDetailInfo(); materialDetailInfo.setId(req.getId()); materialDetailInfo.setIrStatus(IssueReceiptEnum.OUT_OF_LIBRARY.getCode()); materialDetailInfo.setReceiveUid(req.getReceiveUid()); materialDetailInfo.setReceiveUname(userInfo.getUsername()); materialDetailInfo.setDeliveryTime(LocalDateTime.now()); //物资管理库存数量 SafeMaterialBO safeMaterialBO = new SafeMaterialBO(); safeMaterialBO.setId(vo.getSmId()); safeMaterialBO.setStockCount(-1); //出库记录 MaterialReceiveRecordsBaseInfo receiveRecordsBaseInfo = new MaterialReceiveRecordsBaseInfo(); receiveRecordsBaseInfo.setId(IdUtil.getSnowflake(0,0).nextId()); receiveRecordsBaseInfo.setMaterialName(vo.getName()); receiveRecordsBaseInfo.setReceiveCount(1); receiveRecordsBaseInfo.setRevertCount(0); receiveRecordsBaseInfo.setConsumeCount(0); receiveRecordsBaseInfo.setReceiveUid(userInfo.getUid()); receiveRecordsBaseInfo.setReceiveUname(userInfo.getUsername()); receiveRecordsBaseInfo.setSmId(vo.getSmId()); //出库物资记录 MaterialReceiveRecordsInfo receiveRecordsInfo = new MaterialReceiveRecordsInfo(); receiveRecordsInfo.setId(IdUtil.getSnowflake(0,0).nextId()); receiveRecordsInfo.setMaterialName(vo.getName()); receiveRecordsInfo.setMaterialNo(vo.getMaterialNo()); receiveRecordsInfo.setRfid(vo.getRfid()); receiveRecordsInfo.setReceiveTime(LocalDateTime.now()); receiveRecordsInfo.setReceiveUid(userInfo.getUid()); receiveRecordsInfo.setReceiveUname(userInfo.getUsername()); receiveRecordsInfo.setReceiveBaseId(receiveRecordsBaseInfo.getId()); receiveRecordsInfo.setSmdId(vo.getId()); if(vo.getConsumable().equals(ConsumableEnum.YES.getCode())){ //耗材 materialDetailInfo.setValidStatus(ValidStatusEnum.NO.getCode()); materialDetailInfo.setStatus(MaterialStatusEnum.OTHER.getCode()); materialDetailInfo.setRemark("耗材"); receiveRecordsBaseInfo.setStatus(MaterialReceiveRecordsStatusEnum.CONSUMABLE_RETURN_NO.getCode()); receiveRecordsInfo.setRevertStatus(MaterialRevertStatusEnum.DEPLETION.getCode()); receiveRecordsInfo.setMaterialStatus(MaterialStatusEnum.OTHER.getCode()); receiveRecordsInfo.setRemark("耗材"); }else{ //默认未归还 receiveRecordsBaseInfo.setStatus(MaterialReceiveRecordsStatusEnum.RETURN_NO.getCode()); receiveRecordsInfo.setRevertStatus(MaterialRevertStatusEnum.REVERT_NO.getCode()); receiveRecordsInfo.setMaterialStatus(MaterialStatusEnum.INTACT.getCode()); receiveRecordsInfo.setRemark(MaterialStatusEnum.INTACT.getValue()); } //修改出入库状态为出库 safeMaterialDetailInfoService.updateById(materialDetailInfo); //修改物资管理库存 safeMaterialInfoService.updateCountById(safeMaterialBO); //物资领取总记录 materialReceiveRecordsBaseInfoService.save(receiveRecordsBaseInfo); //物资详细清单 materialReceiveRecordsInfoService.save(receiveRecordsInfo); //创建成功,释放锁 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(); } } } /** * 单条-重新入库 * @param id * @return */ @Override @Transactional public void singleReceipt(Long id,ContextCacheUser currentUser) { if(null == id){ throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL); } //加分布式锁,防止重复创建规则 RLock lock = redissonClient.getLock("LOCK_SMD_SINGLERECEIPT"); try { lock.lock(10, TimeUnit.SECONDS); //获取该条数据 SafeMaterialDetailInfo vo = safeMaterialDetailInfoService.queryById(id); if(null == vo){ throw new EquipmentException(EquipmentResultCodes.DATA_NOT_EXIST,"未查询到该物资出库记录"); } //如果是耗材不可重新入库 if(vo.getConsumable().equals(ConsumableEnum.YES.getCode())){ throw new EquipmentException(EquipmentResultCodes.MATERIAL_CONSUMABLE); } if(vo.getIrStatus().equals(IssueReceiptEnum.IN_THE_LIBRARY.getCode())){ throw new EquipmentException(EquipmentResultCodes.MATERIAL_IN_THE_LIBRARY); } //物资管理库存数量 SafeMaterialBO safeMaterialBO = new SafeMaterialBO(); safeMaterialBO.setId(vo.getSmId()); safeMaterialBO.setStockCount(1); //获取物资总记录数据 MaterialDeliveryRecordDO deliveryRecordDO = materialReceiveRecordsInfoService.getRecordBySmdId(id); SafeMaterialDetailInfo safeMaterialDetailInfo = new SafeMaterialDetailInfo(); safeMaterialDetailInfo.setId(vo.getId()); safeMaterialDetailInfo.setIrStatus(IssueReceiptEnum.IN_THE_LIBRARY.getCode()); safeMaterialDetailInfo.setWareHousingTime(LocalDateTime.now()); if(null == deliveryRecordDO){ //无领取记录 if (vo.getValidStatus().equals(ValidStatusEnum.NO.getCode())) {//无效 if(vo.getStatus().equals(MaterialStatusEnum.OVERDUE.getCode())){//过期 safeMaterialBO.setStockCount(0); }else{ //其他情况,重新入库则改成有效 safeMaterialDetailInfo.setValidStatus(ValidStatusEnum.YES.getCode()); safeMaterialDetailInfo.setStatus(MaterialStatusEnum.INTACT.getCode()); safeMaterialDetailInfo.setRemark(MaterialStatusEnum.INTACT.getValue()); } } }else{ //有领取记录,则归还 //获取未归还物资详细记录 List recordsInfos = materialReceiveRecordsInfoService.getNoReturnRecordByReceiveBaseId(deliveryRecordDO.getReceiveBaseId()); //领取总记录填充 MaterialReceiveRecordsBaseInfo receiveRecordsBaseInfo = new MaterialReceiveRecordsBaseInfo(); receiveRecordsBaseInfo.setId(deliveryRecordDO.getReceiveBaseId()); if(recordsInfos.size() > 1) { receiveRecordsBaseInfo.setStatus(MaterialReceiveRecordsStatusEnum.RETURN_PART.getCode()); }else { receiveRecordsBaseInfo.setStatus(MaterialReceiveRecordsStatusEnum.RETURN_COMPLETE.getCode()); } receiveRecordsBaseInfo.setRevertCount(deliveryRecordDO.getRevertCount()+1); materialReceiveRecordsBaseInfoService.updateById(receiveRecordsBaseInfo); //详细物资领取记录 MaterialReceiveRecordsInfo receiveRecordsInfo = new MaterialReceiveRecordsInfo(); receiveRecordsInfo.setId(deliveryRecordDO.getReceiveId()); receiveRecordsInfo.setRevertStatus(MaterialRevertStatusEnum.REVERT_YES.getCode()); receiveRecordsInfo.setRevertTime(LocalDateTime.now()); receiveRecordsInfo.setMaterialStatus(MaterialStatusEnum.INTACT.getCode()); receiveRecordsInfo.setRemark(MaterialStatusEnum.INTACT.getValue()); materialReceiveRecordsInfoService.updateById(receiveRecordsInfo); } //修改出入库状态为入库 safeMaterialDetailInfoService.updateById(safeMaterialDetailInfo); //修改物资管理库存 safeMaterialInfoService.updateCountById(safeMaterialBO); //创建成功,释放锁 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(); } } } /** * 逻辑删除 -单条 * @param * @return */ @Transactional @Override public ResultVO delete(Long id){ if(null == id){ throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL); } //加分布式锁,防止重复创建规则 RLock lock = redissonClient.getLock("LOCK_SMD_DELETE"); try { //获取该条数据 SafeMaterialDetailInfo vo = safeMaterialDetailInfoService.queryById(id); if(null == vo){ throw new EquipmentException(EquipmentResultCodes.DATA_NOT_EXIST); } if(vo.getIrStatus().equals(IssueReceiptEnum.OUT_OF_LIBRARY.getCode())){ throw new EquipmentException(ResultCodes.SERVER_DEL_ERROR,"出库物资不可删除!"); } SafeMaterialDetailInfo materialDetailInfo = new SafeMaterialDetailInfo(); materialDetailInfo.setId(id); materialDetailInfo.setDelFlag(1); //物资管理库存数量 SafeMaterialBO safeMaterialBO = new SafeMaterialBO(); safeMaterialBO.setId(vo.getSmId()); if(vo.getValidStatus().equals(ValidStatusEnum.YES.getCode())){ //有效 safeMaterialBO.setStockCount(-1); safeMaterialBO.setTotalCount(-1); }else{ //无效 safeMaterialBO.setTotalCount(-1); } //删除一条数据 safeMaterialDetailInfoService.updateById(materialDetailInfo); //减少库存 safeMaterialInfoService.updateCountById(safeMaterialBO); //创建成功,释放锁 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); } /** * 根据小类id(物资种类)获取库存数量 * @param smallClassifyIds * @return */ public List getSmallClassifyStockByIds(List smallClassifyIds) { if(CollectionUtils.isEmpty(smallClassifyIds)){ throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL); } List classifyStockList= safeMaterialDetailInfoService.getSmallClassifyStockByIds(smallClassifyIds); List classifyStockDtoList = new ArrayList<>(); for (SafeMaterialClassifyStockDO classifyStockDO:classifyStockList){ SafeMaterialClassifyStockDto classifyStockDto = new SafeMaterialClassifyStockDto(); BeanUtils.copyProperties(classifyStockDO,classifyStockDto); classifyStockDtoList.add(classifyStockDto); } return classifyStockDtoList; } private UserInfoRPCRespDTO getUserInfo(Long uid) { UserInfoRPCRespDTO userInfo = new UserInfoRPCRespDTO(); ResultVO rpcResult = accountUserService.getUserInfoByUid(uid); if (rpcResult != null && rpcResult.getCode().equals(ResultCodes.OK.getCode())) { if (rpcResult.getData() != null) { userInfo = (UserInfoRPCRespDTO) rpcResult.getData(); }else { throw new EquipmentException(EquipmentResultCodes.DATA_NOT_EXIST,"领取人员不存在!"); } } else { throw new EquipmentException(ResultCodes.RPC_RESULT_NULL); } return userInfo; } private String generateMaterialNo(int count){ if(count < 0){ return null; } String serialCode = null; String prefix = "NO-"; if(count >= 10000){ serialCode = "" + (count+1); }else if(count >=0){ String countStr = String.valueOf(count+1); serialCode = "10000".substring(0,(5 - countStr.length()))+countStr; } serialCode = prefix + serialCode; return serialCode; } private Date conversionTimeType(LocalDateTime localDateTime){ ZoneId zoneId = ZoneId.systemDefault(); ZonedDateTime zdt = localDateTime.atZone(zoneId); Date date = Date.from(zdt.toInstant()); return date; } }