package com.gkhy.safePlatform.equipment.service.impl; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 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.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.MaterialReceiveRecordsBaseReq; import com.gkhy.safePlatform.equipment.model.dto.req.MaterialReceiveRecordsQuery; import com.gkhy.safePlatform.equipment.model.dto.req.MaterialReceiveRecordsReq; import com.gkhy.safePlatform.equipment.model.dto.resp.MaterialReceiveRecordsBaseDto; import com.gkhy.safePlatform.equipment.model.dto.resp.MaterialReceiveRecordsDto; import com.gkhy.safePlatform.equipment.service.MaterialReceiveRecordsService; import com.gkhy.safePlatform.equipment.service.baseService.MaterialReceiveRecordsBaseInfoService; import com.gkhy.safePlatform.equipment.service.baseService.MaterialReceiveRecordsInfoService; import com.gkhy.safePlatform.equipment.service.baseService.SafeMaterialDetailInfoService; import com.gkhy.safePlatform.equipment.service.baseService.SafeMaterialInfoService; import io.micrometer.core.instrument.util.StringUtils; 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 org.springframework.util.ObjectUtils; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @Service public class MaterialReceiveRecordsServiceImpl implements MaterialReceiveRecordsService { @Autowired private MaterialReceiveRecordsBaseInfoService recordsBaseInfoService; @Autowired private MaterialReceiveRecordsInfoService receiveRecordsInfoService; @Autowired private SafeMaterialDetailInfoService safeMaterialDetailInfoService; @Autowired private SafeMaterialInfoService safeMaterialInfoService; @Autowired private RedissonClient redissonClient; @Override public SearchResultVO> listByPage(ContextCacheUser currentUser, PageQuery pageQuery) { MaterialReceiveRecordsQuery query = pageQuery.getSearchParams(); query.setDepId(currentUser.getDepId()); Page page = new Page<>(pageQuery.getPageIndex(), pageQuery.getPageSize()); List list = recordsBaseInfoService.listByPage(page,query); List receiveRecordsInfoList = new ArrayList<>(); if(!CollectionUtils.isEmpty(list)) { List idList = list.stream().map(MaterialReceiveRecordsBaseDO::getId).collect(Collectors.toList()); receiveRecordsInfoList = receiveRecordsInfoService.listByReceiveBaseIds(idList); } List receiveRecordsBaseDtoList = new ArrayList<>(); for(MaterialReceiveRecordsBaseDO receiveRecordsBaseDO:list){ MaterialReceiveRecordsBaseDto receiveRecordsBaseDto = new MaterialReceiveRecordsBaseDto(); BeanUtils.copyProperties(receiveRecordsBaseDO,receiveRecordsBaseDto); receiveRecordsBaseDto.setStatusName(MaterialReceiveRecordsStatusEnum.getByCode(receiveRecordsBaseDO.getStatus()).getValue()); //获取该记录关联的物资 List selectList = receiveRecordsInfoList.stream().filter(item -> item.getReceiveBaseId().equals(receiveRecordsBaseDO.getId())).collect(Collectors.toList()); List receiveRecordsDtoList = new ArrayList<>(); for(MaterialReceiveRecordsInfo receiveRecordsInfo:selectList){ MaterialReceiveRecordsDto receiveRecordsDto = new MaterialReceiveRecordsDto(); BeanUtils.copyProperties(receiveRecordsInfo,receiveRecordsDto); receiveRecordsDto.setMaterialStatusName(MaterialStatusEnum.getByCode(receiveRecordsInfo.getMaterialStatus()).getValue()); receiveRecordsDto.setRevertStatusName(MaterialRevertStatusEnum.getByCode(receiveRecordsInfo.getRevertStatus()).getValue()); receiveRecordsDtoList.add(receiveRecordsDto); } receiveRecordsBaseDto.setMaterialList(receiveRecordsDtoList); receiveRecordsBaseDtoList.add(receiveRecordsBaseDto); } return new SearchResultVO<>(true, page.getCurrent(), page.getSize(), page.getPages(), page.getTotal(), receiveRecordsBaseDtoList, ResultCodes.OK); } @Override @Transactional public void revertMaterial(ContextCacheUser currentUser, MaterialReceiveRecordsBaseReq req) { //检查 List materialList = req.getMaterialList(); for(MaterialReceiveRecordsReq receiveRecordsReq:materialList){ if(null == receiveRecordsReq.getReceiveId()){ throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL,"领取清单主键不可为空!"); } if(null != receiveRecordsReq.getMaterialStatus()){ if(null == MaterialStatusEnum.getByCode(receiveRecordsReq.getMaterialStatus())){ throw new EquipmentException(EquipmentResultCodes.DATA_ILLEGAL,"物资状态不合法!"); }else{ if(MaterialStatusEnum.OTHER.getCode().equals(receiveRecordsReq.getMaterialStatus()) && StringUtils.isBlank(receiveRecordsReq.getRemark())){ throw new EquipmentException(EquipmentResultCodes.DATA_ILLEGAL,"损耗备注不可为空!"); } } } } //加分布式锁,防止重复创建规则 RLock lock = redissonClient.getLock("LOCK_REVERT_MATERIAL"); try { lock.lock(10, TimeUnit.SECONDS); //获取该次领取记录 MaterialReceiveRecordsBaseInfo receiveRecordsBaseInfo = recordsBaseInfoService.queryById(req.getReceiveBaseId()); if(null == receiveRecordsBaseInfo){ throw new EquipmentException(EquipmentResultCodes.DATA_NOT_EXIST,"该条记录不存在!"); } if(receiveRecordsBaseInfo.getStatus().equals(MaterialReceiveRecordsStatusEnum.CONSUMABLE_RETURN_NO.getCode())){ throw new EquipmentException(EquipmentResultCodes.MATERIAL_CONSUMABLE); } List idList = materialList.stream().map(MaterialReceiveRecordsReq::getReceiveId).collect(Collectors.toList()); //检查该次要归还的物资是否有归还或处理过 List revertList = receiveRecordsInfoService.getNoReturnRecordByIds(idList); if(materialList.size() > revertList.size()){ throw new EquipmentException(EquipmentResultCodes.MATERIAL_IN_THE_LIBRARY,"已归还或已处理物资不可重复归还处理!"); } List updateRecordsList = new ArrayList<>(); List updateDetailList = new ArrayList<>(); int revertCount = 0; int consumeCount = 0; int validCount = 0; for(MaterialReceiveRecordsReq receiveRecordsReq:materialList){ //过滤出该条领取物资 List selectList = revertList.stream().filter(item -> item.getId().equals(receiveRecordsReq.getReceiveId())).collect(Collectors.toList()); MaterialReceiveRecordsDO receiveRecord = selectList.get(0); //物资清单 SafeMaterialDetailInfo safeMaterialDetailInfo = new SafeMaterialDetailInfo(); safeMaterialDetailInfo.setId(receiveRecord.getSmdId()); safeMaterialDetailInfo.setWareHousingTime(LocalDateTime.now()); //领取清单 MaterialReceiveRecordsInfo materialReceiveRecordsInfo = new MaterialReceiveRecordsInfo(); materialReceiveRecordsInfo.setId(receiveRecordsReq.getReceiveId()); materialReceiveRecordsInfo.setMaterialStatus(receiveRecordsReq.getMaterialStatus()); materialReceiveRecordsInfo.setRemark(MaterialStatusEnum.getByCode(receiveRecordsReq.getMaterialStatus()).getValue()); if(MaterialStatusEnum.INTACT.getCode().equals(receiveRecordsReq.getMaterialStatus()) || null == receiveRecordsReq.getMaterialStatus()){ materialReceiveRecordsInfo.setRevertStatus(MaterialRevertStatusEnum.REVERT_YES.getCode()); safeMaterialDetailInfo.setIrStatus(IssueReceiptEnum.IN_THE_LIBRARY.getCode()); revertCount++; if(receiveRecord.getValidStatus().equals(ValidStatusEnum.NO.getCode())){ //无效情况 validCount++; } }else{ //损耗 materialReceiveRecordsInfo.setRevertStatus(MaterialRevertStatusEnum.DEPLETION.getCode()); if (StringUtils.isNotBlank(receiveRecordsReq.getRemark())) { materialReceiveRecordsInfo.setRemark(receiveRecordsReq.getRemark()); } safeMaterialDetailInfo.setIrStatus(IssueReceiptEnum.OUT_OF_LIBRARY.getCode()); consumeCount++; } updateRecordsList.add(materialReceiveRecordsInfo); safeMaterialDetailInfo.setStatus(materialReceiveRecordsInfo.getMaterialStatus()); safeMaterialDetailInfo.setRemark(materialReceiveRecordsInfo.getRemark()); updateDetailList.add(safeMaterialDetailInfo); } //物资管理 SafeMaterialBO safeMaterialBO = new SafeMaterialBO(); safeMaterialBO.setId(receiveRecordsBaseInfo.getSmId()); safeMaterialBO.setStockCount(revertCount-validCount); //领取总记录 MaterialReceiveRecordsBaseInfo materialReceiveRecordsBaseInfo = new MaterialReceiveRecordsBaseInfo(); materialReceiveRecordsBaseInfo.setId(req.getReceiveBaseId()); if(receiveRecordsBaseInfo.getReceiveCount() == receiveRecordsBaseInfo.getConsumeCount()+materialList.size()){ materialReceiveRecordsBaseInfo.setStatus(MaterialReceiveRecordsStatusEnum.RETURN_COMPLETE.getCode()); }else{ materialReceiveRecordsBaseInfo.setStatus(MaterialReceiveRecordsStatusEnum.RETURN_PART.getCode()); } materialReceiveRecordsBaseInfo.setRevertCount(receiveRecordsBaseInfo.getRevertCount()+revertCount); materialReceiveRecordsBaseInfo.setConsumeCount(receiveRecordsBaseInfo.getConsumeCount()+consumeCount); //修改物资管理库存 safeMaterialInfoService.updateCountById(safeMaterialBO); //修改物资清单状态 safeMaterialDetailInfoService.updateBatchById(updateDetailList); //修改总记录 recordsBaseInfoService.updateById(materialReceiveRecordsBaseInfo); //修改领取清单 receiveRecordsInfoService.updateBatchById(updateRecordsList); //创建成功,释放锁 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(); } } } @Override public List getReceiveRecordsByReceiveUids(MaterialReceiveRecordsBO bo){ if (CollectionUtils.isEmpty(bo.getReceiveUids())) { throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL,"领取人不可为空!"); } if(CollectionUtils.isEmpty(bo.getSmallClassifyIds())){ throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL,"物资类型(小类)不可为空!"); } List list = receiveRecordsInfoService.getReceiveRecordsByReceiveUids(bo); return list; } @Override public MaterialReceiveRecordsBaseDto queryById(ContextCacheUser currentUser, Long id) { if(ObjectUtils.isEmpty(id)){ throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL,"领取总记录主键不可为空!"); } MaterialReceiveRecordsBaseInfo receiveRecordsBaseInfo = recordsBaseInfoService.queryById(id); List receiveRecordsInfoList = receiveRecordsInfoService.listByReceiveBaseId(id); MaterialReceiveRecordsBaseDto materialReceiveRecordsBaseDto = new MaterialReceiveRecordsBaseDto(); if(!ObjectUtils.isEmpty(receiveRecordsBaseInfo)){ BeanUtils.copyProperties(receiveRecordsBaseInfo,materialReceiveRecordsBaseDto); List receiveRecordsDtoList = new ArrayList<>(); for(MaterialReceiveRecordsInfo receiveRecordsInfo:receiveRecordsInfoList){ MaterialReceiveRecordsDto receiveRecordsDto = new MaterialReceiveRecordsDto(); BeanUtils.copyProperties(receiveRecordsInfo,receiveRecordsDto); receiveRecordsDto.setMaterialStatusName(MaterialStatusEnum.getByCode(receiveRecordsInfo.getMaterialStatus()).getValue()); receiveRecordsDto.setRevertStatusName(MaterialRevertStatusEnum.getByCode(receiveRecordsInfo.getRevertStatus()).getValue()); receiveRecordsDtoList.add(receiveRecordsDto); } materialReceiveRecordsBaseDto.setMaterialList(receiveRecordsDtoList); return materialReceiveRecordsBaseDto; } return null; } }