From d6c65a4e3d1ca7d9a7bd6806c99fee035d0a44eb Mon Sep 17 00:00:00 2001 From: 李宇 <986321569@qq.com> Date: 星期三, 27 一月 2021 16:54:34 +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