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