From badb24bad173d03941aef128d3ec74188a4e4467 Mon Sep 17 00:00:00 2001
From: gdg <764716047@qq.com>
Date: Tue, 02 Feb 2021 14:37:47 +0800
Subject: [PATCH] 实验室导出
---
src/main/java/com/nanometer/smartlab/service/OpeReagentStatusServiceImpl.java | 268 +++++++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 257 insertions(+), 11 deletions(-)
diff --git a/src/main/java/com/nanometer/smartlab/service/OpeReagentStatusServiceImpl.java b/src/main/java/com/nanometer/smartlab/service/OpeReagentStatusServiceImpl.java
index 66f3b49..30b76c3 100644
--- a/src/main/java/com/nanometer/smartlab/service/OpeReagentStatusServiceImpl.java
+++ b/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;
@@ -470,27 +472,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 +512,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);
@@ -806,5 +855,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);
+ }
+
}
--
Gitblit v1.9.2