From f600f38c6c23a282b61ed4db1b2da094d695276f Mon Sep 17 00:00:00 2001
From: zhangfeng <1603559716@qq.com>
Date: 星期五, 25 十一月 2022 16:43:52 +0800
Subject: [PATCH] 安全物资和设备管理调整

---
 equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/impl/SafeMaterialDetailServiceImpl.java |  455 ++++++++++++++++++++++++++++++++++++++++++++------------
 1 files changed, 354 insertions(+), 101 deletions(-)

diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/impl/SafeMaterialDetailServiceImpl.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/impl/SafeMaterialDetailServiceImpl.java
index 72cc374..09a01fe 100644
--- a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/impl/SafeMaterialDetailServiceImpl.java
+++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/impl/SafeMaterialDetailServiceImpl.java
@@ -5,6 +5,7 @@
 import com.gkhy.safePlatform.account.rpc.apimodel.AccountUserService;
 import com.gkhy.safePlatform.account.rpc.apimodel.model.resp.UserInfoRPCRespDTO;
 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;
@@ -14,7 +15,9 @@
 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.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.mq.msg.SafeMaterialMsg;
 import com.gkhy.safePlatform.equipment.service.SafeMaterialDetailService;
 import com.gkhy.safePlatform.equipment.service.baseService.SafeMaterialClassifyInfoService;
@@ -22,19 +25,20 @@
 import com.gkhy.safePlatform.equipment.service.baseService.SafeMaterialInfoService;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.apache.rocketmq.spring.core.RocketMQTemplate;
+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.beans.factory.annotation.Value;
 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.ArrayList;
-import java.util.Collections;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 @Service("SafeMaterialDetailService")
@@ -56,6 +60,8 @@
     @Autowired
     private RocketMQTemplateHelper rocketMQTemplateHelper;
 
+    @Autowired
+    private RedissonClient redissonClient;
     @Override
     public ResultVO save(SafeMaterialDetailAddReq req) {
         //判断物资是否存在
@@ -93,8 +99,9 @@
                 String rfid = "0000000".substring(0,(8 - countStr.length()))+countStr;
                 SafeMaterialDetailInfo materialDetailInfo = new SafeMaterialDetailInfo();
                 materialDetailInfo.setId(IdUtil.getSnowflake(0,0).nextId());
-                materialDetailInfo.setMaterialClassifyId(materialInfo.getMaterialClassifyId());
-                materialDetailInfo.setName(materialInfo.getMaterialName()+"(ID"+materialInfo.getId()+")");
+                materialDetailInfo.setBigClassifyId(materialInfo.getBigClassifyId());
+                materialDetailInfo.setSmallClassifyId(materialInfo.getSmallClassifyId());
+                materialDetailInfo.setName(materialInfo.getMaterialName());
                 materialDetailInfo.setSmId(req.getSmId());
                 materialDetailInfo.setConsumable(materialInfo.getConsumable());
                 materialDetailInfo.setValidType(req.getValidType());
@@ -113,8 +120,9 @@
             for(int i = 0;i < req.getWareHousingCount();i++){
                 SafeMaterialDetailInfo materialDetailInfo = new SafeMaterialDetailInfo();
                 materialDetailInfo.setId(IdUtil.getSnowflake(0,0).nextId());
-                materialDetailInfo.setMaterialClassifyId(materialInfo.getMaterialClassifyId());
-                materialDetailInfo.setName(materialInfo.getMaterialName()+"(ID"+materialInfo.getId()+")");
+                materialDetailInfo.setBigClassifyId(materialInfo.getBigClassifyId());
+                materialDetailInfo.setSmallClassifyId(materialInfo.getSmallClassifyId());
+                materialDetailInfo.setName(materialInfo.getMaterialName());
                 materialDetailInfo.setSmId(req.getSmId());
                 materialDetailInfo.setConsumable(materialInfo.getConsumable());
                 materialDetailInfo.setValidType(req.getValidType());
@@ -129,18 +137,36 @@
             }
         }
 
-        //批量入库
-        safeMaterialDetailInfoService.saveBatch(list);
+        //加分布式锁,防止重复创建规则
+        RLock lock = redissonClient.getLock("LOCK_SMD_SAVE");
+        try {
+            lock.lock(10, TimeUnit.SECONDS);
+            //批量入库
+            safeMaterialDetailInfoService.saveBatch(list);
 
-        //发送消息
-        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);
+            //发送消息
+            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);
     }
 
@@ -169,8 +195,9 @@
         for(int i = 0;i < req.getWareHousingCount();i++){
             SafeMaterialDetailInfo materialDetailInfo = new SafeMaterialDetailInfo();
             materialDetailInfo.setId(IdUtil.getSnowflake(0,0).nextId());
-            materialDetailInfo.setMaterialClassifyId(materialInfo.getMaterialClassifyId());
-            materialDetailInfo.setName(materialInfo.getMaterialName()+"(ID"+materialInfo.getId()+")");
+            materialDetailInfo.setBigClassifyId(materialInfo.getBigClassifyId());
+            materialDetailInfo.setSmallClassifyId(materialInfo.getSmallClassifyId());
+            materialDetailInfo.setName(materialInfo.getMaterialName());
             materialDetailInfo.setSmId(req.getSmId());
             materialDetailInfo.setConsumable(materialInfo.getConsumable());
             materialDetailInfo.setValidType(req.getValidType());
@@ -184,16 +211,31 @@
             materialDetailInfo.setMaterialNo(generateMaterialNo(totalCount+i));
             list.add(materialDetailInfo);
         }
-        //批量入库
-        safeMaterialDetailInfoService.saveBatch(list);
-        //发送消息
-        if(req.getValidType().equals(ValidTypeEnum.SHORT_TERM.getCode()) && null != req.getValidTime()){
-            for(SafeMaterialDetailInfo materialDetailInfo:list){
-                //发送消息
-                SafeMaterialMsg safeMaterialMsg = new SafeMaterialMsg();
-                safeMaterialMsg.setId(materialInfo.getId());
-                safeMaterialMsg.setValidTime(conversionTimeType(materialDetailInfo.getValidTime()));
-                rocketMQTemplateHelper.syncSend(safeMaterialTopic,safeMaterialMsg);
+        //加分布式锁,防止重复创建规则
+        RLock lock = redissonClient.getLock("LOCK_SMD_SAVEBATCH");
+        try {
+            lock.lock(10, TimeUnit.SECONDS);
+            //批量入库
+            safeMaterialDetailInfoService.saveBatch(list);
+            //发送消息
+            if(req.getValidType().equals(ValidTypeEnum.SHORT_TERM.getCode()) && null != req.getValidTime()){
+                for(SafeMaterialDetailInfo materialDetailInfo:list){
+                    //发送消息
+                    SafeMaterialMsg safeMaterialMsg = new SafeMaterialMsg();
+                    safeMaterialMsg.setId(materialInfo.getId());
+                    safeMaterialMsg.setValidTime(conversionTimeType(materialDetailInfo.getValidTime()));
+                    rocketMQTemplateHelper.syncSend(safeMaterialTopic,safeMaterialMsg);
+                }
+            }
+        }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);
@@ -229,15 +271,30 @@
         safeMaterialDetailInfo.setSmId(req.getSmId());
         safeMaterialDetailInfo.setValidType(req.getValidType());
         safeMaterialDetailInfo.setValidTime(req.getValidTime());
-        //修改
-        safeMaterialDetailInfoService.updateById(safeMaterialDetailInfo);
-        //如果是非常期
-        if(req.getValidType().equals(ValidTypeEnum.SHORT_TERM.getCode()) && null != req.getValidTime()){
-            //发送消息
-            SafeMaterialMsg safeMaterialMsg = new SafeMaterialMsg();
-            safeMaterialMsg.setId(req.getId());
-            safeMaterialMsg.setValidTime(conversionTimeType(req.getValidTime()));
-            rocketMQTemplateHelper.syncSend(safeMaterialTopic,safeMaterialMsg);
+        //加分布式锁,防止重复创建规则
+        RLock lock = redissonClient.getLock("LOCK_SMD_UPDATE");
+        try {
+            lock.lock(10, TimeUnit.SECONDS);
+            //修改
+            safeMaterialDetailInfoService.updateById(safeMaterialDetailInfo);
+            //如果是非常期
+            if(req.getValidType().equals(ValidTypeEnum.SHORT_TERM.getCode()) && null != req.getValidTime()){
+                //发送消息
+                SafeMaterialMsg safeMaterialMsg = new SafeMaterialMsg();
+                safeMaterialMsg.setId(req.getId());
+                safeMaterialMsg.setValidTime(conversionTimeType(req.getValidTime()));
+                rocketMQTemplateHelper.syncSend(safeMaterialTopic,safeMaterialMsg);
+            }
+        }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);
     }
@@ -248,23 +305,33 @@
      * @return
      */
     @Override
-    public ResultVO receiptBatch(Long[] ids) {
-        if (ids.length == 0) {
-            throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL);
+    public ResultVO receiptBatch(ParamForm paramForm) {
+        //加分布式锁,防止重复创建规则
+        RLock lock = redissonClient.getLock("LOCK_SMD_RECEIPTBATCH");
+        try {
+            lock.lock(10, TimeUnit.SECONDS);
+            //验证
+            List<SafeMaterialDetailInfo> list = safeMaterialDetailInfoService.getListByIds(paramForm.getIds());
+            List<SafeMaterialDetailInfo> selectList = list
+                    .stream()
+                    .filter(item -> item.getIrStatus().equals(IssueReceiptEnum.OUT_OF_LIBRARY.getCode()) && item.getConsumable().equals(ConsumableEnum.YES.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());
+        }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();
+            }
         }
-        List<Long> idList = new ArrayList<>();
-        Collections.addAll(idList,ids);
-        //验证
-        List<SafeMaterialDetailInfo> list = safeMaterialDetailInfoService.getListByIds(idList);
-        List<SafeMaterialDetailInfo> selectList = list
-                .stream()
-                .filter(item -> item.getIrStatus().equals(IssueReceiptEnum.OUT_OF_LIBRARY.getCode()))
-                .collect(Collectors.toList());
-        if(selectList.size() != ids.length){
-            throw new EquipmentException(ResultCodes.CLIENT_PARAM_ILLEGAL,"已入库物资不可重复入库!");
-        }
-        //修改为入库状态
-        safeMaterialDetailInfoService.updateReceiptStatusByIds(idList,IssueReceiptEnum.IN_THE_LIBRARY.getCode());
         return new ResultVO(ResultCodes.OK);
     }
 
@@ -274,11 +341,8 @@
      * @return
      */
     @Override
-    public ResultVO deleteBatch(Long[] ids) {
-        if (ids.length == 0) {
-            throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL);
-        }
-        safeMaterialDetailInfoService.deleteBatch(ids);
+    public ResultVO deleteBatch(ParamForm paramForm) {
+        safeMaterialDetailInfoService.deleteBatch(paramForm.getIds());
         return new ResultVO(ResultCodes.OK);
     }
 
@@ -311,18 +375,156 @@
     @Override
     public ResultVO deliveryBatchRandom(MterialRandomDeliveryReq req) {
         UserInfoRPCRespDTO userInfo = getUserInfo(req.getClaimantId());
-        //获取有效数量
-        Integer validStockCount = safeMaterialDetailInfoService.getValidStockCount(req.getSmId());
-        if(req.getCount() > validStockCount){
-            throw new EquipmentException(ResultCodes.CLIENT_PARAM_ILLEGAL,"出库数量不可大于有效库存数量!");
+        List<Long> idList = new ArrayList<>();
+        //加分布式锁,防止重复创建规则
+        RLock lock = redissonClient.getLock("LOCK_SMD_DELIVERYBATCHRANDOM");
+        try {
+            lock.lock(10, TimeUnit.SECONDS);
+            if(StringUtils.isNotBlank(req.getRfid())){
+                idList = safeMaterialDetailInfoService.getIdListByRfid(req.getCount(),req.getSmId(),req.getRfid());
+
+            }else{
+                idList = safeMaterialDetailInfoService.getRfidNullList(req.getCount(), req.getSmId());
+
+            }
+            if(idList.size()< req.getCount()){
+                throw new EquipmentException(ResultCodes.CLIENT_PARAM_ILLEGAL,"有效库存数量不足!");
+            }
+            //获取有效数量
+            Integer validStockCount = safeMaterialDetailInfoService.getValidStockCount(req.getSmId());
+            if(req.getCount() > validStockCount){
+                throw new EquipmentException(ResultCodes.CLIENT_PARAM_ILLEGAL,"出库数量不可大于有效库存数量!");
+            }
+            SafeMaterialDetailBO detailBO = new SafeMaterialDetailBO();
+            detailBO.setClaimantName(userInfo.getUsername());
+            detailBO.setClaimantId(req.getClaimantId());
+            detailBO.setIds(idList);
+            safeMaterialDetailInfoService.updateDeliveryStatusByIds(detailBO);
+        }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
+    public void deliveryBatchSpw(MaterialSpwReq req) {
+        //验证
+        if(null == req.getClaimantId()){
+            throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL,"认领人不可为空!");
+        }
+        List<MaterialSpwDeliveryReq> deliveryReqList = req.getDeliveryReqList();
+        if(CollectionUtils.isEmpty(deliveryReqList)){
+            throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL,"出库物资不可为空!");
+        }
+        //获取小类物资
+        List<Long> smallClassifyIds = deliveryReqList
+                .stream()
+                .map(MaterialSpwDeliveryReq::getSmallClassifyId)
+                .collect(Collectors.toList());
+        List<Long> depIds = deliveryReqList
+                .stream()
+                .map(MaterialSpwDeliveryReq::getDepId)
+                .collect(Collectors.toList());
+        if(smallClassifyIds.size() == 0 || depIds.size() == 0){
+            throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL,"部门/仓库或者物资类型(小类)不可为空!");
         }
 
+        List<SafeMaterialClassifyStockDO> classifyStockList= safeMaterialDetailInfoService.getSmallClassifyStockByIds(smallClassifyIds);
+        //根据物资种类获取有效在库物资
+        List<SafeMaterialDetailDO> 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<SafeMaterialClassifyStockDO> 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<Long> ids = new ArrayList<>();
+        //循环数据
+        for(MaterialSpwDeliveryReq deliveryReq:deliveryReqList){
+            //过滤出rfid存在的数据
+            List<SafeMaterialDetailDO> selectRfidNotNull = listBySmallClassifyIds
+                    .stream()
+                    .filter(item -> null != item.getRfid() && item.getSmallClassifyId().equals(deliveryReq.getSmallClassifyId()) && item.getDepId().equals(deliveryReq.getDepId()))
+                    .collect(Collectors.toList());
+            List<Long> 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<SafeMaterialDetailDO> selectRfidIsNull = listBySmallClassifyIds
+                        .stream()
+                        .filter(item -> null == item.getRfid() && item.getSmallClassifyId().equals(deliveryReq.getSmallClassifyId()) && item.getDepId().equals(deliveryReq.getDepId()))
+                        .collect(Collectors.toList());
+
+                List<Long> collect = selectRfidIsNull.subList(0,deliveryReq.getCount()-selectRfidNotNull.size()).stream().map(SafeMaterialDetailDO::getId)
+                        .collect(Collectors.toList());
+                ids.addAll(collect);
+            }
+        }
         SafeMaterialDetailBO detailBO = new SafeMaterialDetailBO();
-        detailBO.setCount(req.getCount());
         detailBO.setClaimantName(userInfo.getUsername());
         detailBO.setClaimantId(req.getClaimantId());
-        safeMaterialDetailInfoService.deliveryBatchRandom(detailBO);
-        return new ResultVO(ResultCodes.OK);
+        detailBO.setIds(ids);
+        safeMaterialDetailInfoService.updateDeliveryStatusByIds(detailBO);
+
+    }
+
+
+    /**
+     * 根据rfid获取数据信息
+     * @param rfids
+     * @return
+     */
+    @Override
+    public List<SafeRfidMaterialDetailDto> getListByRfids(List<String> rfids) {
+        if(CollectionUtils.isEmpty(rfids)){
+            throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL);
+        }
+        List<SafeMaterialDetailInfoDO> listByRfid = safeMaterialDetailInfoService.getListByRfids(rfids);
+        List<SafeRfidMaterialDetailDto> 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
@@ -337,7 +539,6 @@
             materialDetailDto.setValidStatusName(ValidStatusEnum.getByCode(materialDetailInfoDO.getValidStatus()).getValue());
             materialDetailDto.setValidTypeName(ValidTypeEnum.getByCode(materialDetailInfoDO.getValidType()).getValue());
             materialDetailDto.setIrStatusName(IssueReceiptEnum.getByCode(materialDetailInfoDO.getIrStatus()).getValue());
-
             detailDtoList.add(materialDetailDto);
         }
         return new SearchResultVO<>(true, page.getCurrent(),page.getSize(), page.getPages(),page.getTotal(),detailDtoList,ResultCodes.OK);
@@ -352,7 +553,7 @@
         SafeMaterialDetailDto detailDto = new SafeMaterialDetailDto();
         if(materialDetailInfo != null){
             SafeMaterialInfo materialInfo = safeMaterialInfoService.queryById(materialDetailInfo.getSmId());
-            SafeMaterialClassifyInfo classifyInfo = safeMaterialClassifyInfoService.queryById(materialDetailInfo.getMaterialClassifyId());
+            SafeMaterialClassifyInfo classifyInfo = safeMaterialClassifyInfoService.queryById(materialDetailInfo.getBigClassifyId());
             BeanUtils.copyProperties(materialDetailInfo,detailDto);
             detailDto.setConsumableName(ConsumableEnum.getByCode(materialDetailInfo.getConsumable()).getValue());
             detailDto.setValidStatusName(ValidStatusEnum.getByCode(materialDetailInfo.getValidStatus()).getValue());
@@ -376,27 +577,42 @@
      */
     @Override
     public ResultVO singleDelivery(SafeMaterialDetailReq req) {
-        //获取该条数据
-        SafeMaterialDetailInfo vo = safeMaterialDetailInfoService.queryById(req.getId());
-        if(null == vo){
-            throw new EquipmentException(EquipmentResultCodes.DATA_NOT_EXIST);
+        //加分布式锁,防止重复创建规则
+        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.getClaimantId());
+            SafeMaterialDetailInfo materialDetailInfo = new SafeMaterialDetailInfo();
+            materialDetailInfo.setId(req.getId());
+            materialDetailInfo.setIrStatus(IssueReceiptEnum.OUT_OF_LIBRARY.getCode());
+            materialDetailInfo.setClaimantId(req.getClaimantId());
+            materialDetailInfo.setClaimantName(userInfo.getUsername());
+            materialDetailInfo.setDeliveryTime(LocalDateTime.now());
+            //修改出入库状态为出库
+            safeMaterialDetailInfoService.updateById(materialDetailInfo);
+        }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();
+            }
         }
-        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.getClaimantId());
-        SafeMaterialDetailInfo materialDetailInfo = new SafeMaterialDetailInfo();
-        materialDetailInfo.setId(req.getId());
-        materialDetailInfo.setIrStatus(IssueReceiptEnum.OUT_OF_LIBRARY.getCode());
-        materialDetailInfo.setClaimantId(req.getClaimantId());
-        materialDetailInfo.setClaimantName(userInfo.getUsername());
-        materialDetailInfo.setDeliveryTime(LocalDateTime.now());
-        //修改出入库状态为出库
-        safeMaterialDetailInfoService.updateById(materialDetailInfo);
         return new ResultVO<>(ResultCodes.OK);
     }
 
@@ -411,16 +627,35 @@
         if(null == id){
             throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL);
         }
-        //获取该条数据
-        SafeMaterialDetailInfo vo = safeMaterialDetailInfoService.queryById(id);
-        if(null == vo){
-            throw new EquipmentException(EquipmentResultCodes.DATA_NOT_EXIST);
+        //加分布式锁,防止重复创建规则
+        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);
+            }
+            //修改出入库状态为入库
+            safeMaterialDetailInfoService.updateReceiptStatus(id,IssueReceiptEnum.IN_THE_LIBRARY.getCode());
+        }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();
+            }
         }
-        if(vo.getIrStatus().equals(IssueReceiptEnum.IN_THE_LIBRARY.getCode())){
-            throw new EquipmentException(EquipmentResultCodes.MATERIAL_IN_THE_LIBRARY);
-        }
-        //修改出入库状态为入库
-        safeMaterialDetailInfoService.updateReceiptStatus(id,IssueReceiptEnum.IN_THE_LIBRARY.getCode());
         return new ResultVO<>(ResultCodes.OK);
     }
 
@@ -440,6 +675,10 @@
         }
 
         if(IssueReceiptEnum.IN_THE_LIBRARY.getCode().equals(req.getIrStatus())){
+            //如果是耗材不可重新入库
+            if(vo.getConsumable().equals(ConsumableEnum.YES.getCode())){
+                throw new EquipmentException(EquipmentResultCodes.MATERIAL_CONSUMABLE);
+            }
             //重新入库
             if(vo.getIrStatus().equals(req.getIrStatus())){
                 throw new EquipmentException(EquipmentResultCodes.MATERIAL_IN_THE_LIBRARY);
@@ -498,9 +737,24 @@
         return new ResultVO<>(ResultCodes.OK);
     }
 
-
-
-
+    /**
+     * 根据小类id(物资种类)获取库存数量
+     * @param smallClassifyIds
+     * @return
+     */
+    public List<SafeMaterialClassifyStockDto> getSmallClassifyStockByIds(List<Long> smallClassifyIds) {
+        if(CollectionUtils.isEmpty(smallClassifyIds)){
+            throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL);
+        }
+        List<SafeMaterialClassifyStockDO> classifyStockList= safeMaterialDetailInfoService.getSmallClassifyStockByIds(smallClassifyIds);
+        List<SafeMaterialClassifyStockDto> 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) {
@@ -537,5 +791,4 @@
         Date date = Date.from(zdt.toInstant());
         return date;
     }
-
 }

--
Gitblit v1.9.2