gdg
2021-02-23 acd2fbfdd949d314ba6f0b85e28b67689d0a62ef
src/main/java/com/nanometer/smartlab/service/OpeReagentStatusServiceImpl.java
@@ -1,5 +1,7 @@
package com.nanometer.smartlab.service;
import java.math.BigInteger;
import java.sql.Timestamp;
import java.util.*;
import javax.annotation.Resource;
@@ -7,6 +9,7 @@
import com.google.common.collect.ImmutableMap;
import com.nanometer.smartlab.dao.*;
import com.nanometer.smartlab.entity.*;
import com.nanometer.smartlab.entity.dto.PersonUseDetail;
import com.nanometer.smartlab.entity.enumtype.ValidFlag;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
@@ -470,27 +473,28 @@
      }
   }
   @Override
   @Transactional(propagation = Propagation.REQUIRED)
   public boolean updateReagentStatus(OpeReagentStatus opeReagentStatus) {
   public boolean updateReagentStatus3(OpeReagentStatus opeReagentStatus) {
      try {
         //1.判断->试剂状态是否为在仓库
         if (isAllowWarehouseUse(opeReagentStatus)) {
            // 减少库存
            OpeWarehouseReserve opeWarehouseReserve = this.opeWarehouseReserveService.getOpeWarehouseReserve(
                  opeReagentStatus.getReagent().getId(), opeReagentStatus.getArticleNumber());
            opeWarehouseReserve.setReserve(opeWarehouseReserve.getReserve() - 1);
            this.opeWarehouseReserveService.updateOpeWarehouseReserve(opeWarehouseReserve);
            //1.1获得 试剂的库存选择批次
            List<OpeWarehouseReserve> owrList = this.opeWarehouseReserveService
                  .getOpeWarehouseReserveList(opeReagentStatus.getReagent().getId(), opeReagentStatus.getArticleNumber(),opeReagentStatus.getHouseId());
            //在同一个仓库有相同批次的试剂,根据时间早的,个数少的先扣除库存
            owrList.get(0).setReserve(owrList.get(0).getReserve() - 1);
            this.opeWarehouseReserveService.updateOpeWarehouseReserve(owrList.get(0));
         }
         //设置 试剂状态->领用待入库
         opeReagentStatus.setStatus(ArrivalStatus.NOREGISTER);
//         opeReagentStatus.setHouseId(null);
//         opeReagentStatus.setContainerId(null);
         int row = this.opeReagentStatusDao.updateOpeReagentStatusDao(opeReagentStatus);
         if (row == 0) {
            return false;
         }
         OpeUseFlow opeUseFlow = new OpeUseFlow();
         opeUseFlow.setReagentCode(opeReagentStatus.getReagentCode());
@@ -509,6 +513,52 @@
         this.opeUseFlowService.insertOpeUseFlow(opeUseFlow);
         return true;
      } catch (DuplicateKeyException ex) {
         logger.warn(ex.getMessage(), ex);
         throw new AlarmException(AlarmCode.DATA_DUPLICATE,
               MessageUtil.getMessage(AlarmCode.DATA_DUPLICATE.getCode()));
      } catch (DataIntegrityViolationException ex) {
         logger.warn(ex.getMessage(), ex);
         throw new AlarmException(AlarmCode.DATA_CONFICT, MessageUtil.getMessage(AlarmCode.DATA_CONFICT.getCode()));
      } catch (DataAccessException ex) {
         logger.error(ex.getMessage(), ex);
         throw new BusinessException(ExceptionEnumCode.DB_ERR,
               MessageUtil.getMessageByCode(ExceptionEnumCode.DB_ERR.getCode()), ex);
      }
   }
   @Transactional(propagation = Propagation.REQUIRED)
   public boolean updateReagentStatus(OpeReagentStatus opeReagentStatus) {
      try {
         if (isAllowWarehouseUse(opeReagentStatus)) {
            // 减少库存
            OpeWarehouseReserve opeWarehouseReserve = this.opeWarehouseReserveService.getOpeWarehouseReserve(
                  opeReagentStatus.getReagent().getId(), opeReagentStatus.getArticleNumber());
            opeWarehouseReserve.setReserve(opeWarehouseReserve.getReserve() - 1);
            this.opeWarehouseReserveService.updateOpeWarehouseReserve(opeWarehouseReserve);
         }
         opeReagentStatus.setStatus(ArrivalStatus.NOREGISTER);
         int row = this.opeReagentStatusDao.updateOpeReagentStatusDao(opeReagentStatus);
         if (row == 0) {
            return false;
         }
         OpeUseFlow opeUseFlow = new OpeUseFlow();
         opeUseFlow.setReagentCode(opeReagentStatus.getReagentCode());
         opeUseFlow.setStatus(opeReagentStatus.getStatus());
         opeUseFlow.setHouseId(opeReagentStatus.getHouseId());
         opeUseFlow.setContainerId(opeReagentStatus.getContainerId());
         opeUseFlow.setUserId(opeReagentStatus.getUserId());
         opeUseFlow.setPlace(opeReagentStatus.getPlace());
         opeUseFlow.setRemainder(opeReagentStatus.getRemainder());
         Map<String, String> metaMap = new HashMap<>();
         metaMap.put("groupId", "operate_status");
         metaMap.put("metaKey", String.valueOf(OperateStatus.WAREHOUSEOUT.getKey()));
         List<BaseMeta> baseMetaList = baseMetaDao.getBaseMetaList(metaMap);
         opeUseFlow.setOperateState(baseMetaList.get(0).getId());
         this.opeUseFlowService.insertOpeUseFlow(opeUseFlow);
         return true;
      } catch (DuplicateKeyException ex) {
         logger.warn(ex.getMessage(), ex);
@@ -755,15 +805,15 @@
   */
   @Override
   @Transactional
   public void batchUpdateStatusByCode(List<OpeReagentStatus> list) throws Exception {
      if(list == null || list.size() <1){
         throw new Exception("没有选择试剂");
      }
   public void batchUpdateStatusByCode(List<PersonUseDetail> applyList) throws Exception {
      for (OpeReagentStatus opeReagentStatus : list) {
      for (PersonUseDetail pu : applyList) {
         //变更试剂状态为入库
         Map<String, Object> params1 = new HashMap<>();
         String reagentCode = opeReagentStatus.getReagentCode();
         String reagentCode = pu.getReagentCode();
         params1.put("code", reagentCode);
         params1.put("status",ArrivalStatus.WAREHOUSE);
         opeReagentStatusDao.updateStatusByCode(params1);
@@ -777,8 +827,8 @@
         //增加数据库存
         Map<String, Object> params3 = new HashMap<>();
         String reagentId = opeReagentStatus.getReagentId();
         String articleNumber = opeReagentStatus.getArticleNumber();
         String reagentId = pu.getReagentId();
         String articleNumber = pu.getArticleNumber();
         params3.put("reagentId", reagentId);
         params3.put("articleNumber", articleNumber);
         opeWarehouseReserveDao.updateCount(params3);
@@ -806,5 +856,202 @@
      return opeReagentStatusDao.selectReagentCodesByReId(reagentId);
   }
   @Override
   /**
   * @Description: 订单入库时 的更新试剂状态和更新试剂流向
   */
   @Transactional
   public void orderInputWarehouseReagentStatusAndUseFlow
         (OpeApplyReserve opeApplyReserve,String userId,List<String> reagentCodeList,OpeOrder opeOrder) {
      for (String reagentCode : reagentCodeList) {
         //1.新增试剂状态:在仓库有
         OpeReagentStatus ors = new OpeReagentStatus();
         ors.setId(IDUtils.uuid());
         //状态和用户
         ors.setStatus(ArrivalStatus.WAREHOUSE);
         ors.setUserId(userId);
         //入库场所
         ors.setHouseId(opeApplyReserve.getHouseId());
         ors.setContainerId(opeApplyReserve.getContainerId());
         //试剂编码 id和批号
         ors.setReagentCode(reagentCode);
         ors.setReagentId(opeApplyReserve.getReagent().getId());
         ors.setArticleNumber(opeApplyReserve.getArticleNumber());
         //订单和申购单
         ors.setApplyCode(opeApplyReserve.getApplyCode());
         ors.setOrderCode(opeOrder.getOrderCode());
         opeReagentStatusDao.insertOpeReagentStatus2(ors);
         //2.更新试剂流向
         OpeUseFlow ouf = new OpeUseFlow();
         ouf.setId(IDUtils.uuid());
         //持有者
         ouf.setUserId(userId);
         //在仓库状态
         ouf.setStatus(ArrivalStatus.WAREHOUSE);
         //操作状态->仓库入库
         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);
         ouf.setOperateState(baseMetaList.get(0).getId());
         //地点
         ouf.setHouseId(opeApplyReserve.getHouseId());
         ouf.setContainerId(opeApplyReserve.getContainerId());
         //试剂条码
         ouf.setReagentCode(reagentCode);
         //创建时间
         ouf.setCreateTime(new Timestamp(new Date().getTime()));
         opeUseFlowDao.insertOpeUseFlow(ouf);
      }
   }
   /**
   * @Description: 校验条码在试剂状态中是否存在
   */
   @Override
   public List<String> checkReagentCode(String startReagentCode2, String endReagentCode2,Integer arrivalNum) throws BusinessException {
      if (startReagentCode2 == null || startReagentCode2.length() < 1) {
         return null;
      }
      if (endReagentCode2 == null || endReagentCode2.length() < 1) {
         return null;
      }
      List<String> codeList= new ArrayList<>();
      //1.做24位的字母判断否则就是纯数字
      if (startReagentCode2.matches(".*\\D+.*")) {
         //长度为24并且后5位随机码得是数字
         if (startReagentCode2.length() == 24 &&
               endReagentCode2.length() == 24 &&
               startReagentCode2.matches(".*([A-F]|\\d)+.*") &&
               startReagentCode2.substring(startReagentCode2.length()-5).matches("\\d{5}")) {
            //24位指定编码生成
            Integer randomStart = Integer.valueOf(startReagentCode2.substring(startReagentCode2.length() - 5));
            Integer randomEnd = Integer.valueOf(endReagentCode2.substring(endReagentCode2.length() - 5));
            String regentPrefix = startReagentCode2.substring(0, startReagentCode2.length() - 5);
            String regentPrefix2 = endReagentCode2.substring(0, endReagentCode2.length() - 5);
            //如果距离不是 到货数量或者非后5位得前缀有问题,则说明输入有问题
            if (randomEnd - randomStart + 1 != arrivalNum||!regentPrefix2.equals(regentPrefix)) {
               throw new BusinessException(ExceptionEnumCode.PARAM_EXIST,"试剂的开始结束条码有问题");
            }
            for (int random = randomStart; random <= randomEnd; random++) {
               String random5 = String.format("%0" + 5 + "d", random);
               String reagentCode = regentPrefix + random5;
               OpeReagentStatus opeReagentStatus = this.getOpeReagentStatusByReagentCode(reagentCode);
               if (opeReagentStatus != null) {
                  throw new BusinessException(ExceptionEnumCode.PARAM_EXIST,
                        MessageUtil.getMessageByCode(ExceptionEnumCode.PARAM_EXIST.getCode(), "试剂条码", reagentCode));
               }else{
                  codeList.add(reagentCode);
               }
            }
            return codeList;
         }else{
            throw new BusinessException(ExceptionEnumCode.REAGENT_CODE_INVALID,"输入的试剂条码不合法");
         }
      }
      //2.纯数字编码列表生成
      BigInteger reagentCode= new BigInteger(startReagentCode2);
      BigInteger endReagentCode = new BigInteger(endReagentCode2);
      //条码得距离 如果和到货数量不等 则输入有问题
      if (!endReagentCode.subtract(reagentCode).add(BigInteger.ONE).equals(new BigInteger(String.valueOf(arrivalNum)))) {
         throw new BusinessException(ExceptionEnumCode.REAGENT_CODE_INVALID,"试剂的开始结束条码有问题");
      }
      while (reagentCode.compareTo(endReagentCode) <= 0) {
         String reagentCodeStr =  String.format("%0" + startReagentCode2.length() + "d", reagentCode);
         OpeReagentStatus opeReagentStatus = this.getOpeReagentStatusByReagentCode(reagentCodeStr);
         if (opeReagentStatus != null) {
            throw new BusinessException(ExceptionEnumCode.PARAM_EXIST,
                  MessageUtil.getMessageByCode(ExceptionEnumCode.PARAM_EXIST.getCode(), "试剂条码", reagentCodeStr));
         }else{
            codeList.add(reagentCodeStr);
         }
         reagentCode = reagentCode.add(BigInteger.ONE);
      }
      return codeList;
   }
   @Override
   public List<String> generateReagentCode(String startReagentCode2, String endReagentCode2) {
      if (startReagentCode2 == null || startReagentCode2.length() < 1) {
         throw new BusinessException(ExceptionEnumCode.REAGENT_CODE_INVALID,"试剂条码不合法");
      }
      if (endReagentCode2 == null || endReagentCode2.length() < 1) {
         throw new BusinessException(ExceptionEnumCode.REAGENT_CODE_INVALID,"试剂条码不合法");
      }
      List<String> codeList= new ArrayList<>();
      //1.做24位的字母判断否则就是纯数字
      if (startReagentCode2.matches(".*\\D+.*")) {
         //长度为24并且后5位随机码得是数字
         if (startReagentCode2.length() == 24 &&
               endReagentCode2.length() == 24 &&
               startReagentCode2.matches(".*([A-F]|\\d)+.*") &&
               startReagentCode2.substring(startReagentCode2.length()-5).matches("\\d{5}")) {
            //24位指定编码生成
            Integer randomStart = Integer.valueOf(startReagentCode2.substring(startReagentCode2.length() - 5));
            Integer randomEnd = Integer.valueOf(endReagentCode2.substring(endReagentCode2.length() - 5));
            String regentPrefix = startReagentCode2.substring(0, startReagentCode2.length() - 5);
            for (int random = randomStart; random <= randomEnd; random++) {
               String random5 = String.format("%0" + 5 + "d", random);
               String reagentCode = regentPrefix + random5;
               codeList.add(reagentCode);
            }
            return codeList;
         }else{
            throw new BusinessException(ExceptionEnumCode.REAGENT_CODE_INVALID,"试剂条码不合法");
         }
      }
      //2.纯数字编码列表生成
      BigInteger reagentCode= new BigInteger(startReagentCode2);
      BigInteger endReagentCode = new BigInteger(endReagentCode2);
      while (reagentCode.compareTo(endReagentCode) <= 0) {
         String reagentCodeStr =  String.format("%0" + startReagentCode2.length() + "d", reagentCode);
         codeList.add(reagentCodeStr);
         reagentCode = reagentCode.add(BigInteger.ONE);
      }
      return codeList;
   }
   @Override
   public void updateOpeReagentStatus(OpeReagentStatus opeReagentStatus) {
      opeReagentStatusDao.updateOpeReagentStatusDao(opeReagentStatus);
   }
   @Override
   public int getReagentNumInWarehouse(String id, String articleNumber, String warehouseId) {
      Map<String, Object> params = new HashMap<>();
      params.put("reagentId", id);
      params.put("articleNumber", articleNumber);
      params.put("warehouseId", warehouseId);
      return opeReagentStatusDao.countReagentByArticleAndWarehouse(params);
   }
}