From 5bd5f3bcd6d2cb375feb0756505691b551339716 Mon Sep 17 00:00:00 2001 From: zhangfeng <1603559716@qq.com> Date: 星期五, 23 十二月 2022 08:55:23 +0800 Subject: [PATCH] Merge branch 'master' of https://sinanoaq.cn:8888/r/safePlatform-out into zf --- equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/impl/MaterialReceiveRecordsServiceImpl.java | 219 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 219 insertions(+), 0 deletions(-) diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/impl/MaterialReceiveRecordsServiceImpl.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/impl/MaterialReceiveRecordsServiceImpl.java new file mode 100644 index 0000000..b7d8a20 --- /dev/null +++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/impl/MaterialReceiveRecordsServiceImpl.java @@ -0,0 +1,219 @@ +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 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<List<MaterialReceiveRecordsBaseDto>> listByPage(ContextCacheUser currentUser, PageQuery<MaterialReceiveRecordsQuery> pageQuery) { + MaterialReceiveRecordsQuery query = pageQuery.getSearchParams(); + query.setDepId(currentUser.getDepId()); + Page page = new Page<>(pageQuery.getPageIndex(), pageQuery.getPageSize()); + List<MaterialReceiveRecordsBaseDO> list = recordsBaseInfoService.listByPage(page,query); + List<MaterialReceiveRecordsInfo> receiveRecordsInfoList = new ArrayList<>(); + if(!CollectionUtils.isEmpty(list)) { + List<Long> idList = list.stream().map(MaterialReceiveRecordsBaseDO::getId).collect(Collectors.toList()); + receiveRecordsInfoList = receiveRecordsInfoService.listByReceiveBaseIds(idList); + } + List<MaterialReceiveRecordsBaseDto> receiveRecordsBaseDtoList = new ArrayList<>(); + for(MaterialReceiveRecordsBaseDO receiveRecordsBaseDO:list){ + MaterialReceiveRecordsBaseDto receiveRecordsBaseDto = new MaterialReceiveRecordsBaseDto(); + BeanUtils.copyProperties(receiveRecordsBaseDO,receiveRecordsBaseDto); + receiveRecordsBaseDto.setStatusName(MaterialReceiveRecordsStatusEnum.getByCode(receiveRecordsBaseDO.getStatus()).getValue()); + //获取该记录关联的物资 + List<MaterialReceiveRecordsInfo> selectList = receiveRecordsInfoList.stream().filter(item -> item.getReceiveBaseId().equals(receiveRecordsBaseDO.getId())).collect(Collectors.toList()); + List<MaterialReceiveRecordsDto> 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<MaterialReceiveRecordsReq> 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<Long> idList = materialList.stream().map(MaterialReceiveRecordsReq::getReceiveId).collect(Collectors.toList()); + //检查该次要归还的物资是否有归还或处理过 + List<MaterialReceiveRecordsDO> revertList = receiveRecordsInfoService.getNoReturnRecordByIds(idList); + if(materialList.size() > revertList.size()){ + throw new EquipmentException(EquipmentResultCodes.MATERIAL_IN_THE_LIBRARY,"已归还或已处理物资不可重复归还处理!"); + } + List<MaterialReceiveRecordsInfo> updateRecordsList = new ArrayList<>(); + List<SafeMaterialDetailInfo> updateDetailList = new ArrayList<>(); + int revertCount = 0; + int consumeCount = 0; + int validCount = 0; + for(MaterialReceiveRecordsReq receiveRecordsReq:materialList){ + //过滤出该条领取物资 + List<MaterialReceiveRecordsDO> 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<MaterialReceiveRecordsDO> 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<MaterialReceiveRecordsDO> list = receiveRecordsInfoService.getReceiveRecordsByReceiveUids(bo); + return list; + } + +} -- Gitblit v1.9.2