kongzy
2023-11-28 59d9ea33f503e363f2e2941c7c00cc9dd9d9d1c7
src/main/java/com/nanometer/smartlab/service/OpeWarehouseReserveServiceImpl.java
@@ -7,13 +7,16 @@
import javax.annotation.Resource;
import com.nanometer.smartlab.dao.OpeApplyDao;
import com.nanometer.smartlab.dao.OpeReagentStatusDao;
import com.nanometer.smartlab.entity.*;
import com.nanometer.smartlab.entity.enumtype.ValidFlag;
import com.nanometer.smartlab.exception.AlarmCode;
import com.nanometer.smartlab.exception.AlarmException;
import com.nanometer.smartlab.util.IDUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.context.annotation.Lazy;
import org.springframework.dao.DataAccessException;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.dao.DuplicateKeyException;
@@ -44,16 +47,19 @@
   @Resource
   private OpeReagentStatusService opeReagentStatusService;
   @Lazy
    @Resource
    private OpeUseFlowService opeUseFlowService;
    @Resource
    private OpeWarehouseReserveService opeWarehouseReserveService;
    @Resource(name="baseMetaDao")
    private BaseMetaDao baseMetaDao;
    @Resource(name="opeApplyDao")
   private OpeApplyDao opeApplyDao;
   @Resource
   private OpeReagentStatusDao opeReagentStatusDao;
   @Resource
   private OpeLaboratoryReserveService opeLaboratoryReserveService;
   @Transactional(propagation = Propagation.REQUIRED)
   public List<OpeWarehouseReserve> getOpeWarehouseReserveList(String reagentId, String supplierId, Integer first,
@@ -88,7 +94,7 @@
   @Transactional(propagation = Propagation.REQUIRED)
   public List<OpeWarehouseReserve> getOpeWarehouseReserveListByName(String reagentId, String supplierId, Integer first,
         Integer pageSize,String productSn) {
         Integer pageSize,String productSn,String warehouseName) {
      try {
         Map<String, Object> params = new HashMap<String, Object>();
         params.put("reagentName", reagentId);
@@ -96,6 +102,7 @@
         params.put("first", first);
         params.put("pageSize", pageSize);
         params.put("productSn", productSn);
         params.put("warehouseName", warehouseName);
         return this.opeWarehouseReserveDao.getOpeWarehouseReserveList(params);
      } catch (DataAccessException e) {
         logger.error(e.getMessage(), e);
@@ -105,12 +112,13 @@
   }
   @Transactional(propagation = Propagation.REQUIRED)
   public int getOpeWarehouseReserveTotalCountByName(String reagentId, String supplierId,String productSn) {
   public int getOpeWarehouseReserveTotalCountByName(String reagentId, String supplierId,String productSn,String warehouseName) {
      try {
         Map<String, Object> params = new HashMap<String, Object>();
         params.put("reagentName", reagentId);
         params.put("supplierId", supplierId);
         params.put("productSn", productSn);
         params.put("warehouseName", warehouseName);
         return this.opeWarehouseReserveDao.getOpeWarehouseReserveTotalCount(params);
      } catch (DataAccessException e) {
         logger.error(e.getMessage(), e);
@@ -164,6 +172,17 @@
               MessageUtil.getMessageByCode(ExceptionEnumCode.DB_ERR.getCode()), e);
      }
   }
   @Override
   public List<OpeWarehouseReserve> getOpeWarehouseReserveList(String reagentId, String articleNumber,String warehouseId) {
      Map<String, String> params = new HashMap<>();
      params.put("reagentId", reagentId);
      params.put("warehouseId", warehouseId);
      params.put("articleNumber", articleNumber);
      return this.opeWarehouseReserveDao.getOpeWarehouseReserveList2(params);
   }
   @Transactional(propagation = Propagation.REQUIRED)
   public OpeWarehouseReserve insertOpeWarehouseReserve(OpeWarehouseReserve opeWarehouseReserve) {
      try {
@@ -186,7 +205,7 @@
      }
   }
   @Transactional(propagation = Propagation.REQUIRED)
   @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRED)
   public boolean updateOpeWarehouseReserve(OpeWarehouseReserve opeWarehouseReserve) {
      try {
         int row = this.opeWarehouseReserveDao.updateOpeWarehouseReserve(opeWarehouseReserve);
@@ -206,21 +225,23 @@
      }
   }
   @Transactional(propagation = Propagation.REQUIRED)
   public void claimForPerson(List<OpeApplyReserve> selectedListForPerson,String userId,String projectNum){
   @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRED)
   public void claimForPerson(List<OpeApplyReserve> selectedListForPerson,String userId,String projectNum,String laboratoryId,String laboratoryContainerId,String receiptNumber){
      try{
         for(OpeApplyReserve app:selectedListForPerson){
            List<String> reagentCodes = app.getReagentCode();
            if (reagentCodes != null && reagentCodes.size() > 0) {
               List<OpeReagentStatus> ss=new ArrayList<>();
               for (String opeReagentStatusId : reagentCodes) {
                  OpeReagentStatus opeReagentStatus = this.opeReagentStatusService.getOpeReagentStatus(opeReagentStatusId);
                  opeReagentStatus.setUserId(userId);
                  opeReagentStatus.setProjectNum(projectNum);
                  //boolean flag = this.opeReagentStatusService.updateReagentStatus(opeReagentStatus);
                  this.opeReagentStatusService.updateReagentStatus(opeReagentStatus);
                  ss.add(opeReagentStatus);
               }
               this.opeReagentStatusService.updateReagentStatus3(reagentCodes,userId,projectNum,laboratoryId,laboratoryContainerId,receiptNumber);
               //更新是现实库存
               OpeLaboratoryReserve lr=new OpeLaboratoryReserve();
               lr.setReagentId(app.getReagent().getId());
               lr.setHouseId(laboratoryId);
               lr.setContainerId(laboratoryContainerId);
               lr.setReserve(app.getSelectNum());
               lr.setUserId(userId);
               lr.setValidFlag(ValidFlag.VALID);
               this.opeLaboratoryReserveService.insert(lr);
               /*HashSet<String> set=new HashSet<>();//存放批号
               for(int i=0;i<ss.size();i++){
                  set.add(ss.get(i).getArticleNumber());
@@ -262,12 +283,15 @@
         logger.error(ex.getMessage(), ex);
         throw new BusinessException(ExceptionEnumCode.DB_ERR,
               MessageUtil.getMessageByCode(ExceptionEnumCode.DB_ERR.getCode()), ex);
      }catch(Exception e){
         e.printStackTrace();
         throw new RuntimeException(e);
      }
   }
   // 仓库领用
   @Transactional(propagation = Propagation.REQUIRED)
   public void claim(List<OpeWarehouseReserve> selectedList, String userId,String projectNum) {
   public void claim(List<OpeWarehouseReserve> selectedList, String userId,String projectNum,String receiptNumber) {
      try {
         for (OpeWarehouseReserve opeWarehouseReserve : selectedList) {
            List<String> reagentCodes = opeWarehouseReserve.getReagentCodes();
@@ -278,7 +302,7 @@
                  opeReagentStatus.setUserId(userId);
                  opeReagentStatus.setProjectNum(projectNum);
                  //boolean flag = this.opeReagentStatusService.updateReagentStatus(opeReagentStatus);
                  this.opeReagentStatusService.updateReagentStatus(opeReagentStatus);
                  this.opeReagentStatusService.updateReagentStatus(opeReagentStatus,receiptNumber);
                  //if (flag) {
                     //opeWarehouseReserve.setReserve(opeWarehouseReserve.getReserve() - 1);
                     //opeWarehouseReserve.setSelectNum(0);
@@ -419,6 +443,136 @@
      }
   }
   public void reagentDStore4(List<OpeApply> reagentDStoreList, String loginUserId,String receiptNumber){
      if (reagentDStoreList == null) {
         return;
      }
      OpeReagentStatus opeReagentStatus = null;
      for (OpeApply opeApply : reagentDStoreList) {
         List<String> codeList = opeApply.getReagentCodeList();
         for (String reagentCode:codeList) {
            if (this.opeReagentStatusService.isOpeReagentStatusExist(reagentCode)) {//条码存在
               //throw new BusinessException(ExceptionEnumCode.REAGENT_CODE_EXIST, "入库试剂:" + opeApply.getReagent().getName() + "的试剂条形码[" + reagentCode + "]已存在。");
               // 试剂最新状态update
               opeReagentStatus=this.opeReagentStatusService.getOpeReagentStatusByReagentCode(reagentCode);
               //opeReagentStatus = new OpeReagentStatus();
               //opeReagentStatus.setId(id);
               //opeReagentStatus.setReagentId(opeApply.getReagent().getId());
               opeReagentStatus.setArticleNumber(opeApply.getArticleNumber());
               opeReagentStatus.setReagentCode(reagentCode);
               opeReagentStatus.setStatus(ArrivalStatus.NOREGISTER);
               opeReagentStatus.setHouseId(opeApply.getHouseId());
               opeReagentStatus.setContainerId(opeApply.getContainerId());
               opeReagentStatus.setUserId(loginUserId);
               //opeReagentStatus.setPlace(opeApply.getPlaceId());
               //opeReagentStatus.setRemainder(opeApply.getReagent().getMainMetering()!=null?(new BigDecimal(opeApply.getReagent().getMainMetering())):new BigDecimal(0));
               //opeReagentStatus.setStoreType(StoreType.DIRECTSTORE);
               this.opeReagentStatusService.updateReagentStatus2(opeReagentStatus);
               // 试剂使用情况领用insert
               /*OpeUseFlow ouf=new OpeUseFlow();
               ouf.setReagentCode(opeReagentStatus.getReagentCode());
               ouf.setStatus(opeReagentStatus.getStatus());
               ouf.setHouseId(opeReagentStatus.getHouseId());
               ouf.setContainerId(opeReagentStatus.getContainerId());
               ouf.setUserId(opeReagentStatus.getUserId());
               ouf.setPlace(opeReagentStatus.getPlace());
               ouf.setRemainder(opeApply.getReagent().getMainMetering()!=null?(new BigDecimal(opeApply.getReagent().getMainMetering())):new BigDecimal(0));
               ouf.setStoreType(StoreType.DIRECTSTORE);
               Map<String, String> metaMap2 = new HashMap<>();
               metaMap2.put("groupId", "operate_status");
               metaMap2.put("metaKey", String.valueOf(OperateStatus.WAREHOUSEOUT.getKey()));
               List<BaseMeta> baseMetaList2 = baseMetaDao.getBaseMetaList(metaMap2);
               ouf.setOperateState(baseMetaList2.get(0).getId());
               this.opeUseFlowService.insertOpeUseFlow(ouf);*/
            }else{//条码不存在
               // 试剂最新状态insert
               opeReagentStatus = new OpeReagentStatus();
               opeReagentStatus.setReagentId(opeApply.getReagent().getId());
               opeReagentStatus.setArticleNumber(opeApply.getArticleNumber());
               opeReagentStatus.setReagentCode(reagentCode);
               opeReagentStatus.setStatus(ArrivalStatus.NOREGISTER);
               opeReagentStatus.setHouseId(opeApply.getHouseId());
               opeReagentStatus.setContainerId(opeApply.getContainerId());
               opeReagentStatus.setUserId(loginUserId);
               //opeReagentStatus.setPlace(opeApply.getPlaceId());
               //opeReagentStatus.setRemainder(opeApply.getReagent().getMainMetering()!=null?(new BigDecimal(opeApply.getReagent().getMainMetering())):new BigDecimal(0));
               opeReagentStatus.setStoreType(StoreType.DIRECTSTORE);
               this.opeReagentStatusService.insertOpeReagentStatus(opeReagentStatus);
               // 试剂使用情况领用insert
               OpeUseFlow ouf=new OpeUseFlow();
               ouf.setReagentCode(opeReagentStatus.getReagentCode());
               ouf.setStatus(opeReagentStatus.getStatus());
               ouf.setHouseId(opeReagentStatus.getHouseId());
               ouf.setContainerId(opeReagentStatus.getContainerId());
               ouf.setUserId(opeReagentStatus.getUserId());
               ouf.setPlace(opeReagentStatus.getPlace());
               ouf.setRemainder(opeApply.getReagent().getMainMetering()!=null?opeApply.getReagent().getMainMetering():new BigDecimal(0));
               ouf.setStoreType(StoreType.DIRECTSTORE);
               Map<String, String> metaMap2 = new HashMap<>();
               metaMap2.put("groupId", "operate_status");
               metaMap2.put("metaKey", String.valueOf(OperateStatus.WAREHOUSEOUT.getKey()));
               List<BaseMeta> baseMetaList2 = baseMetaDao.getBaseMetaList(metaMap2);
               ouf.setOperateState(baseMetaList2.get(0).getId());
               ouf.setReceiptNumber(receiptNumber);
               this.opeUseFlowService.insertOpeUseFlow(ouf);
            }
         }
      }
   }
   public void reagentDStore3(List<OpeApply> reagentDStoreList, String loginUserId){
      if (reagentDStoreList == null) {
         return;
      }
      for (OpeApply opeApply : reagentDStoreList) {
         for (String reagentCode:opeApply.getReagentCodeList()) {
            if (this.opeReagentStatusService.isOpeReagentStatusExist(reagentCode)) {
               //条码存在
               throw new BusinessException(ExceptionEnumCode.REAGENT_CODE_EXIST, "入库试剂:" + opeApply.getReagent().getName() + "的试剂条形码[" + reagentCode + "]已存在。");
            }else{
               //条码不存在
               // 试剂状态insert
               OpeReagentStatus opeReagentStatus = new OpeReagentStatus();
               opeReagentStatus.setReagentId(opeApply.getReagent().getId());
               opeReagentStatus.setArticleNumber(opeApply.getArticleNumber());
               opeReagentStatus.setReagentCode(reagentCode);
               opeReagentStatus.setStatus(ArrivalStatus.NOREGISTER);
               opeReagentStatus.setHouseId(opeApply.getHouseId());
               opeReagentStatus.setContainerId(opeApply.getContainerId());
               opeReagentStatus.setUserId(loginUserId);
               opeReagentStatus.setStoreType(StoreType.DIRECTSTORE);
               this.opeReagentStatusService.insertOpeReagentStatus(opeReagentStatus);
               // 试剂使用情况领用insert
               OpeUseFlow ouf=new OpeUseFlow();
               ouf.setReagentCode(opeReagentStatus.getReagentCode());
               ouf.setStatus(opeReagentStatus.getStatus());
               ouf.setHouseId(opeReagentStatus.getHouseId());
               ouf.setContainerId(opeReagentStatus.getContainerId());
               ouf.setUserId(opeReagentStatus.getUserId());
               ouf.setPlace(opeReagentStatus.getPlace());
               ouf.setRemainder(opeApply.getReagent().getMainMetering()!=null?opeApply.getReagent().getMainMetering():new BigDecimal(0));
               ouf.setStoreType(StoreType.DIRECTSTORE);
               Map<String, String> metaMap2 = new HashMap<>();
               metaMap2.put("groupId", "operate_status");
               metaMap2.put("metaKey", String.valueOf(OperateStatus.WAREHOUSEOUT.getKey()));
               List<BaseMeta> baseMetaList2 = baseMetaDao.getBaseMetaList(metaMap2);
               ouf.setOperateState(baseMetaList2.get(0).getId());
               this.opeUseFlowService.insertOpeUseFlow(ouf);
            }
         }
      }
   }
   @Override
   public List<OpeWarehouseReserve> selectByReId(String id) {
      return this.opeWarehouseReserveDao.selectByReId(id);
@@ -430,6 +584,177 @@
      params.put("newReId",newReId);
      params.put("oldReId",oldReId);
      this.opeWarehouseReserveDao.updateByReId(params);
   }
    @Override
   @Transactional
    public void insertOpeWarehouseReserve2(OpeApplyReserve opeApplyReserve, OpeOrder oo,String consigneeId) {
      OpeWarehouseReserve ope = this.getOpeWarehouseReserve2(opeApplyReserve.getReagent().getId(), opeApplyReserve.getArticleNumber(),opeApplyReserve.getHouseId());
      if (ope == null) {
         ope = new OpeWarehouseReserve();
         //库存为到货数量
         ope.setReserve(opeApplyReserve.getArrivalNum());
         //仓库
         ope.setWarehouseId(opeApplyReserve.getHouseId());
         //仓库的货柜号
         ope.setContainerId(opeApplyReserve.getContainerId());
         //试剂
         ope.setReagentId(opeApplyReserve.getReagent().getId());
         //订单编号
         ope.setOrderCode(oo.getOrderCode());
         // 申购编号
         ope.setApplyCode(opeApplyReserve.getApplyCode());
         //批号
         ope.setArticleNumber(opeApplyReserve.getArticleNumber());
         ope.setId(IDUtils.uuid());
         //新增收货人 保存在仓库库存表
         ope.setUserId(consigneeId);
         opeWarehouseReserveDao.insertOpeWarehouseReserve2(ope);
      }else {
         ope.setReserve(ope.getReserve() + opeApplyReserve.getArrivalNum());
         this.updateOpeWarehouseReserve(ope);
      }
    }
   @Override
   public List<OpeWarehouseReserve> selectWarehouseByReagentIdAndArticleNumber(String id,String articleNumber,boolean flag) {
      Map<String, String> params = new HashMap<>();
      params.put("reagentId", id);
      params.put("articleNumber", articleNumber);
      List<OpeWarehouseReserve> reserveList = opeWarehouseReserveDao.selectWarehouseByReagentIdAndArticleNumber(params);
      //减去 每个仓库中的试剂有条码的个数
      //count(reagent_id,warehouseId,1)
      if (reserveList.size() > 0) {
         for (OpeWarehouseReserve owr : reserveList) {
            //根据批次号 仓库名和试剂 得到在仓库有条码的试剂总数
            if (flag) {
               int numOfReagentHasCode = opeReagentStatusService.getReagentNumInWarehouse(id, articleNumber, owr.getWarehouseId());
               //仓库显示 可以补贴条码的试剂总数
               owr.setReserve(owr.getReserve()-numOfReagentHasCode);
            }
         }
      }
      return reserveList;
   }
   /**
   * 补贴扣库存去除有条码的数据
   */
   public List<OpeWarehouseReserve> selectWarehouseByRidAndArticleNumberAndWarehouse(String id,String articleNumber,String warehouseId) {
      Map<String, String> params = new HashMap<>();
      params.put("reagentId", id);
      params.put("articleNumber", articleNumber);
      params.put("warehouseId", warehouseId);
      List<OpeWarehouseReserve> reserveList = opeWarehouseReserveDao.selectWarehouseByRidAndArtiNumberAndWid(params);
      //减去 每个仓库中的试剂有条码的个数
      //count(reagent_id,warehouseId,1)
      if (reserveList.size() > 0) {
         for (OpeWarehouseReserve owr : reserveList) {
            //根据批次号 仓库名和试剂 得到在仓库有条码的试剂总数
            int numOfReagentHasCode = opeReagentStatusService.getReagentNumInWarehouse(id, owr.getArticleNumber(), owr.getWarehouseId());
            //仓库显示 可以补贴条码的试剂总数
            owr.setReserve(owr.getReserve()-numOfReagentHasCode);
         }
      }
      return reserveList;
   }
   @Override
   public void updateBtReserve(String id, Integer useNum) {
      opeWarehouseReserveDao.updateBtReserve(id, useNum);
   }
    @Override
    public int countByReagentId(String id) {
      int num = 0;
      if (opeWarehouseReserveDao.countByReagentId(id) != null) {
         num = opeWarehouseReserveDao.countByReagentId(id);
      }
      return num;
    }
    @Override
    public OpeWarehouseReserve getRowData(String rowKey) {
        return opeWarehouseReserveDao.getRowData(rowKey);
    }
    @Override
   public void btWarehouseReserveReduce(List<OpeApplyReserve> opeList) {
      if (opeList.size() < 1) {
         return;
      }
      for (OpeApplyReserve oar : opeList) {
         String reagentId = oar.getReagent().getId();
         List<String> reagentCodes = new ArrayList<>(oar.getReagentCode());
         //开始库存扣除
         List<OpeWarehouseReserve> cacheUpdateList = oar.getCacheUpdateList();
         for (OpeWarehouseReserve owr : cacheUpdateList) {
            //1.根据仓库id和试剂id搜索不同批号的试剂库存
            List<OpeWarehouseReserve> reserveList = this
                  .selectWarehouseByRidAndArticleNumberAndWarehouse(reagentId, owr.getArticleNumber(), owr.getWarehouseId());
            Integer numLeave = owr.getUseNum();
            for (OpeWarehouseReserve warehouseReserve:reserveList){
               //库存大于剩余领用-》直接扣完
               int usedNum = 0;
               if (warehouseReserve.getReserve() > numLeave) {
               //   warehouseReserve.setReserve(warehouseReserve.getReserve() - numLeave);
                  usedNum = numLeave;
                  numLeave = 0;
               } else {
                  numLeave = numLeave - warehouseReserve.getReserve();
               //   warehouseReserve.setReserve(0);
                  usedNum =  warehouseReserve.getReserve();
               }
               //更新流向,加入一条
               if (usedNum > 0) {
                  for (int i = 0; i < usedNum; i++) {
                     // 试剂使用情况入库insert TODO 流向需要当时的时间和地点
                     OpeUseFlow opeUseFlow = new OpeUseFlow();
                     opeUseFlow.setReagentCode(reagentCodes.get(0));
                     opeUseFlow.setStatus(ArrivalStatus.WAREHOUSE);
                     opeUseFlow.setUserId(warehouseReserve.getUserId());
                     //仓库地点
                     opeUseFlow.setHouseId(warehouseReserve.getWarehouseId());
                     opeUseFlow.setContainerId(warehouseReserve.getContainerId());
                     opeUseFlow.setRemainder(oar.getReagent().getMainMetering()!=null?oar.getReagent().getMainMetering():new BigDecimal(0));
                     //入库时间
                     opeUseFlow.setCreateTime(warehouseReserve.getUpdateTime());
                     opeUseFlow.setStoreType(StoreType.DIRECTSTORE);
                     Map<String, String> metaMap = new HashMap<>();
                     metaMap.put("groupId", "operate_status");
                     metaMap.put("metaKey", String.valueOf(OperateStatus.WAREHOUSEIN.getKey()));
                     List<BaseMeta> baseMetaList = baseMetaDao.getBaseMetaList(metaMap);
                     opeUseFlow.setOperateState(baseMetaList.get(0).getId());
                     this.opeUseFlowService.insertOpeUseFlow(opeUseFlow);
                     //更新试剂状态表 :批号
                     opeReagentStatusDao.updateArticleNumberByRCode(reagentCodes.get(0),warehouseReserve.getArticleNumber());
                     reagentCodes.remove(0);
                  }
               }
               //更新库存
               this.updateBtReserve(warehouseReserve.getId(),usedNum);
               if (numLeave < 1) {
                  break;
               }
         }
      }
      }
   }
   @Transactional(propagation = Propagation.REQUIRED)
@@ -507,19 +832,21 @@
            // 仓库库存update
            opeWarehouseReserve = this.opeWarehouseReserveService.getOpeWarehouseReserve2(opeApply.getReagent().getId(), opeApply.getArticleNumber(),opeApply.getHouseId());
            opeWarehouseReserve = this.getOpeWarehouseReserve2(opeApply.getReagent().getId(), opeApply.getArticleNumber(),opeApply.getHouseId());
            if (opeWarehouseReserve == null) {
                opeWarehouseReserve = new OpeWarehouseReserve();
                opeWarehouseReserve.setReagentId(opeApply.getReagent().getId());
                opeWarehouseReserve.setArticleNumber(opeApply.getArticleNumber());
                opeWarehouseReserve.setReserve(0);
                opeWarehouseReserve.setWarehouseId(opeApply.getHouseId());
                opeWarehouseReserve.setContainerId(opeApply.getContainerId());
                opeWarehouseReserve.setUserId(loginUserId);
            }
            opeWarehouseReserve.setReserve(opeWarehouseReserve.getReserve() + opeApply.getArrivalNum());
            if (StringUtils.isBlank(opeWarehouseReserve.getId())) {
                this.opeWarehouseReserveService.insertOpeWarehouseReserve(opeWarehouseReserve);
                this.insertOpeWarehouseReserve(opeWarehouseReserve);
            } else {
                this.opeWarehouseReserveService.updateOpeWarehouseReserve(opeWarehouseReserve);
                this.updateOpeWarehouseReserve(opeWarehouseReserve);
            }
        }
   }