From 36eb5ad13465773677a4445087576919225f4956 Mon Sep 17 00:00:00 2001 From: yewj Date: Wed, 25 Dec 2024 14:09:13 +0800 Subject: [PATCH] =?UTF-8?q?=E5=99=A8=E6=A2=B0=E6=8B=86=E9=9B=B6=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/entity/inout/IoSplitCodeEntity.java | 8 +- .../entity/inout/IoSplitFifoCodeEntity.java | 6 +- .../service/basic/UdiRelevanceService.java | 40 +- .../collect/IoCollectOrderCodeManService.java | 2 +- .../collect/IoCollectOrderService.java | 21 +- .../collect/down/ThrOrderDownload.java | 5 +- .../api/service/inout/IoSplitCodeService.java | 28 +- .../service/inout/IoSplitFifoCodeService.java | 49 ++ .../service/inout/IoSplitFifoInvService.java | 14 +- .../api/service/inout/IoSplitQxService.java | 483 ++++++++++++++++++ src/main/resources/schemas/schema_v2.4.sql | 119 +++-- 11 files changed, 682 insertions(+), 93 deletions(-) create mode 100644 src/main/java/com/glxp/api/service/inout/IoSplitQxService.java diff --git a/src/main/java/com/glxp/api/entity/inout/IoSplitCodeEntity.java b/src/main/java/com/glxp/api/entity/inout/IoSplitCodeEntity.java index 21325a04d..13ffeb825 100644 --- a/src/main/java/com/glxp/api/entity/inout/IoSplitCodeEntity.java +++ b/src/main/java/com/glxp/api/entity/inout/IoSplitCodeEntity.java @@ -233,7 +233,6 @@ public class IoSplitCodeEntity implements Serializable { @ApiModelProperty(value = "上货方式:1:拆零;2:整取") private Integer fifoSplit; - @TableField(exist = false) private String productName; @TableField(exist = false) @@ -246,8 +245,11 @@ public class IoSplitCodeEntity implements Serializable { private String measname; @TableField(exist = false) private String manufactory; - @TableField(exist = false) - private String ybbm; +// /** +// * 医保编码,组套编码 +// */ +// @TableField(value = "ybbm") +// private String ybbm; private static final long serialVersionUID = 1L; diff --git a/src/main/java/com/glxp/api/entity/inout/IoSplitFifoCodeEntity.java b/src/main/java/com/glxp/api/entity/inout/IoSplitFifoCodeEntity.java index 4ca7e4af5..15815fceb 100644 --- a/src/main/java/com/glxp/api/entity/inout/IoSplitFifoCodeEntity.java +++ b/src/main/java/com/glxp/api/entity/inout/IoSplitFifoCodeEntity.java @@ -219,7 +219,11 @@ public class IoSplitFifoCodeEntity implements Serializable { */ @TableField(value = "workPlaceQueueCode") private String workPlaceQueueCode; - +// /** +// * 医保编码,组套编码 +// */ +// @TableField(value = "ybbm") +// private String ybbm; private static final long serialVersionUID = 1L; diff --git a/src/main/java/com/glxp/api/service/basic/UdiRelevanceService.java b/src/main/java/com/glxp/api/service/basic/UdiRelevanceService.java index b134c713a..52c63f879 100644 --- a/src/main/java/com/glxp/api/service/basic/UdiRelevanceService.java +++ b/src/main/java/com/glxp/api/service/basic/UdiRelevanceService.java @@ -3,9 +3,11 @@ package com.glxp.api.service.basic; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.github.pagehelper.PageHelper; +import com.glxp.api.dao.basic.BasicProductsDao; import com.glxp.api.dao.basic.UdiRelevanceDao; import com.glxp.api.entity.basic.BasicProductsEntity; import com.glxp.api.entity.basic.UdiEntity; @@ -25,10 +27,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; @Service @@ -115,6 +114,16 @@ public class UdiRelevanceService extends ServiceImpl selectAllByNameCode(String nameCode, String unitFk) { List udiRelevanceResponses; @@ -512,5 +521,28 @@ public class UdiRelevanceService extends ServiceImpl selectByCheckCode(String checkCode) { + LambdaQueryWrapper exactMatchWrapper = new LambdaQueryWrapper<>(); + exactMatchWrapper.eq(BasicProductsEntity::getYbbm, checkCode); + List exactMatches = basicProductsDao.selectList(exactMatchWrapper); + if (exactMatches.isEmpty()) { + // 2. 如果没有完全匹配,则查询前20位匹配的情况 + LambdaQueryWrapper prefixMatchWrapper = new LambdaQueryWrapper<>(); + prefixMatchWrapper.apply("LEFT(ybbm, 20) = LEFT({0}, 20)", checkCode); + exactMatches = basicProductsDao.selectList(prefixMatchWrapper); + } + if (CollUtil.isNotEmpty(exactMatches)) { + List relIds = udiRelevanceDao.selectList(new LambdaQueryWrapper() + .in(UdiRelevanceEntity::getUuid, exactMatches.stream().map(BasicProductsEntity::getUuid).collect(Collectors.toList())) + ).stream().map(UdiRelevanceEntity::getId).collect(Collectors.toList()); + return relIds; + } else { + return new ArrayList<>(); + } + } + } diff --git a/src/main/java/com/glxp/api/service/collect/IoCollectOrderCodeManService.java b/src/main/java/com/glxp/api/service/collect/IoCollectOrderCodeManService.java index 751530b0d..07711a468 100644 --- a/src/main/java/com/glxp/api/service/collect/IoCollectOrderCodeManService.java +++ b/src/main/java/com/glxp/api/service/collect/IoCollectOrderCodeManService.java @@ -664,7 +664,7 @@ public class IoCollectOrderCodeManService extends ServiceImpl().eq(UdiRelevanceEntity::getUuid, exactMatches.get(0).getUuid()).last("limit 1")); +// if (udiRelevanceEntity != null) { +// collectOrderBiz.setRelId(udiRelevanceEntity.getId()); +// } } else { BasicProductsEntity basicProductsEntity = basicProductsDao.selectOne(new LambdaQueryWrapper().eq(BasicProductsEntity::getYbbm, entity.getYbbm()).last("limit 1")); if (basicProductsEntity == null || StrUtil.isEmpty(basicProductsEntity.getNameCode())) { diff --git a/src/main/java/com/glxp/api/service/inout/IoSplitCodeService.java b/src/main/java/com/glxp/api/service/inout/IoSplitCodeService.java index 729da4c4a..2984e7b76 100644 --- a/src/main/java/com/glxp/api/service/inout/IoSplitCodeService.java +++ b/src/main/java/com/glxp/api/service/inout/IoSplitCodeService.java @@ -55,6 +55,21 @@ public class IoSplitCodeService extends ServiceImpl filterList(IoSplitCodeRequest splitCodeRequest) { if (splitCodeRequest == null) { return Collections.emptyList(); @@ -203,14 +218,6 @@ public class IoSplitCodeService extends ServiceImpl findByCheckCode(Long workPlaceCode, String ybbm, String batchNo, String queueCode) { + + LambdaQueryWrapper exactMatchWrapper = new LambdaQueryWrapper<>(); + exactMatchWrapper.eq(BasicProductsEntity::getYbbm, ybbm); + List exactMatches = basicProductsDao.selectList(exactMatchWrapper); + if (exactMatches.isEmpty()) { + // 2. 如果没有完全匹配,则查询前20位匹配的情况 + LambdaQueryWrapper prefixMatchWrapper = new LambdaQueryWrapper<>(); + prefixMatchWrapper.apply("LEFT(ybbm, 20) = LEFT({0}, 20)", ybbm); + exactMatches = basicProductsDao.selectList(prefixMatchWrapper); + } + List splitFifoCodeEntities = new ArrayList<>(); + if (CollUtil.isNotEmpty(exactMatches)) { + List relIds = udiRelevanceDao.selectList(new LambdaQueryWrapper() + .in(UdiRelevanceEntity::getUuid, exactMatches.stream().map(BasicProductsEntity::getUuid).collect(Collectors.toList())) + ).stream().map(UdiRelevanceEntity::getId).collect(Collectors.toList()); + if(CollUtil.isNotEmpty(relIds)){ + for (Long relId : relIds) { + List temps = + list(new LambdaQueryWrapper() + .eq(IoSplitFifoCodeEntity::getWorkPlaceCode, workPlaceCode) + .eq(IoSplitFifoCodeEntity::getRelId, relId) + .eq(StrUtil.isNotEmpty(batchNo), IoSplitFifoCodeEntity::getBatchNo, batchNo) + .eq(StrUtil.isNotEmpty(queueCode), IoSplitFifoCodeEntity::getWorkPlaceQueueCode, queueCode) + .orderByAsc(IoSplitFifoCodeEntity::getInBactchNo) + ); + splitFifoCodeEntities.addAll(temps); + + } + } + + } +// 暂时不穿todo +// .eq(StrUtil.isNotEmpty(busType), IoSplitFifoCodeEntity::getBusType, busType) + return splitFifoCodeEntities; + } + + + + + public List filterGroupList(IoSplitFifoCodeRequest splitFifoCodeRequest) { if (splitFifoCodeRequest == null) { return Collections.emptyList(); diff --git a/src/main/java/com/glxp/api/service/inout/IoSplitFifoInvService.java b/src/main/java/com/glxp/api/service/inout/IoSplitFifoInvService.java index d374a504e..5d6ac2587 100644 --- a/src/main/java/com/glxp/api/service/inout/IoSplitFifoInvService.java +++ b/src/main/java/com/glxp/api/service/inout/IoSplitFifoInvService.java @@ -7,10 +7,8 @@ import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.github.pagehelper.PageHelper; -import com.glxp.api.entity.basic.SysWorkplaceDocumentEntity; -import com.glxp.api.entity.basic.SysWorkplaceLayer; -import com.glxp.api.entity.basic.SysWorkplacePutRel; -import com.glxp.api.entity.basic.SysWorkplaceQueue; +import com.glxp.api.dao.basic.UdiRelevanceDao; +import com.glxp.api.entity.basic.*; import com.glxp.api.entity.collect.IoSplitFifoInvRel; import com.glxp.api.entity.inout.IoCodeEntity; import com.glxp.api.entity.inout.IoOrderEntity; @@ -18,10 +16,12 @@ import com.glxp.api.entity.inout.IoSplitFifoCodeEntity; import com.glxp.api.exception.JsonException; import com.glxp.api.req.basic.SysWorkplaceLayerRequest; import com.glxp.api.req.inout.IoSplitFifoInvRequest; +import com.glxp.api.res.basic.UdiRelevanceResponse; import com.glxp.api.res.inout.IoSplitInvResponse; import com.glxp.api.service.basic.SysWorkplaceDocumentService; import com.glxp.api.service.basic.SysWorkplaceLayerService; import com.glxp.api.service.basic.SysWorkplaceQueueService; +import com.glxp.api.service.basic.UdiRelevanceService; import com.glxp.api.service.collect.IoSplitFifoInvRelService; import com.glxp.api.service.thrsys.SysWorkplacePutRelService; import com.glxp.api.util.IntUtil; @@ -48,6 +48,8 @@ public class IoSplitFifoInvService extends ServiceImpl collectOrderBizs = collectOrderBizService.listByBillNo(collectOrder.getBillNo()); + + //如果手动扫码判断该码是否在队列里,如果已在队列,则队列里剔除 + List collectOrderCodeMEN = collectOrderCodeManService.listByBillNo(collectOrder.getBillNo()); + if (CollUtil.isNotEmpty(collectOrderCodeMEN)) { + for (IoCollectOrderCodeMan collectOrderCodeMan : collectOrderCodeMEN) { + IoSplitFifoCodeEntity splitFifoCodeEntity = splitFifoCodeService.findByCode(collectOrderCodeMan.getUdiCode(), putWorkPlaceCode); + if (splitFifoCodeEntity != null) { + collectOrderCodeMan.setRemoveFlag(true); + if (IntUtil.value(splitFifoCodeEntity.getScanCount()) - IntUtil.value(collectOrderCodeMan.getScanCount()) <= 0) { + splitFifoCodeService.removeById(splitFifoCodeEntity.getId()); + IoSplitFifoInv splitFifoInv = splitFifoInvService.findByFifoCode(splitFifoCodeEntity); + if (splitFifoInv != null) { + splitFifoInv.setOutCount(IntUtil.value(splitFifoInv.getOutCount()) + IntUtil.value(splitFifoCodeEntity.getTotalCount())); + int lockCount = IntUtil.value(splitFifoInv.getLockCount()) - IntUtil.value(splitFifoCodeEntity.getTotalCount()); + splitFifoInv.setLockCount(lockCount > 0 ? lockCount : 0); + splitFifoInv.setReCount(IntUtil.value(splitFifoInv.getInCount()) - IntUtil.value(splitFifoInv.getOutCount())); + splitFifoInv.setAvailableCount(IntUtil.value(splitFifoInv.getInCount()) - IntUtil.value(splitFifoInv.getLockCount()) - IntUtil.value(splitFifoInv.getOutCount())); + splitFifoInvService.updateById(splitFifoInv); + } + } else { + //队列码数量大于扫码数量更新数量(一般指无序列号) +// UdiRelevanceEntity udiRelevanceEntity = udiRelevanceService.selectById(collectOrderCodeMan.getRelId()); + FilterUdiRelRequest filterUdiRelRequest = new FilterUdiRelRequest(); + filterUdiRelRequest.setId(collectOrderCodeMan.getRelId()); + filterUdiRelRequest.setPackLevel("1"); + UdiRelevanceResponse udiRelevanceResponse = udiRelevanceService.selectOneUdi(filterUdiRelRequest); + int removeCount = IntUtil.value(collectOrderCodeMan.getScanCount()) * udiRelevanceResponse.getBhxjsl(); + splitFifoCodeService.updateById(IoSplitFifoCodeEntity.builder() + .id(splitFifoCodeEntity.getId()) + .scanCount(IntUtil.value(splitFifoCodeEntity.getScanCount()) - IntUtil.value(collectOrderCodeMan.getScanCount())) + .totalCount(IntUtil.value(splitFifoCodeEntity.getTotalCount()) - removeCount) + .build()); + + IoSplitFifoInv splitFifoInv = splitFifoInvService.findByFifoCode(splitFifoCodeEntity); + if (splitFifoInv != null) { + splitFifoInv.setOutCount(IntUtil.value(splitFifoInv.getOutCount()) + removeCount); + int lockCount = IntUtil.value(splitFifoInv.getLockCount()) - removeCount; + splitFifoInv.setLockCount(lockCount > 0 ? lockCount : 0); + splitFifoInv.setReCount(IntUtil.value(splitFifoInv.getInCount()) - IntUtil.value(splitFifoInv.getOutCount())); + splitFifoInv.setAvailableCount(IntUtil.value(splitFifoInv.getInCount()) - IntUtil.value(splitFifoInv.getLockCount()) - IntUtil.value(splitFifoInv.getOutCount())); + splitFifoInvService.updateById(splitFifoInv); + } + } + } + //判断拆零表里是否存在,如果存在则剔除 + IoSplitCodeEntity splitCodeEntity = splitCodeService.findByCode(collectOrderCodeMan.getUdiCode(), putWorkPlaceCode); + if (splitCodeEntity != null && IntUtil.value(splitCodeEntity.getRemainCount()) > 0) { + if (IntUtil.value(splitCodeEntity.getRemainCount()) > IntUtil.value(collectOrderCodeMan.getScanActCount())) { + splitCodeEntity.setRemainCount(IntUtil.value(splitCodeEntity.getRemainCount()) - IntUtil.value(collectOrderCodeMan.getScanActCount())); + } else { + splitCodeEntity.setRemainCount(0); + } + collectOrderCodeMan.setSplitFlag(true); + splitCodeService.updateById(splitCodeEntity); + } + } + } + for (IoCollectOrderBiz collectOrderBiz : collectOrderBizs) { + UdiRelevanceResponse udiRelevanceResponse = null; + if (StrUtil.isNotEmpty(collectOrderBiz.getCheckCode())) { + List relIds = udiRelevanceService.selectByCheckCode(collectOrderBiz.getCheckCode()); + if (CollUtil.isNotEmpty(relIds)) { + udiRelevanceResponse = udiRelevanceService.selectByLevelRelId(relIds.get(0) + ""); + } + } else { + udiRelevanceResponse = udiRelevanceService.selectByLevelRelId(collectOrderBiz.getRelId() + ""); + } + //去除掉已经手动扫码的数据,找出需要自动扫码的明细,执行上述的拆零或整取 + int unTagCount = collectOrderBiz.getCount() - IntUtil.value(collectOrderBiz.getScanActCount()); + if (unTagCount > 0) { + collectOrderBiz.setUnTagCount(unTagCount); + } else { + collectOrderBiz.setTagStatus(3); + //手动扫码时涉及到拆零时,把拆零剩余数量插入至拆零表里 + if (unTagCount < 0) { + List newList = filterCode(collectOrderCodeMEN, collectOrderBiz, udiRelevanceResponse); + if (CollUtil.isNotEmpty(newList)) { + for (IoCollectOrderCodeMan item : newList) { + if (IntUtil.value(item.getSplitFlag())) { + IoSplitCodeEntity splitCodeEntity = splitCodeService.findByCode(item.getUdiCode(), putWorkPlaceCode); + splitCodeEntity.setRemainCount(-unTagCount); + splitCodeService.updateById(splitCodeEntity); + } else { + IoSplitCodeEntity ioSplitCodeEntity = IoSplitCodeEntity.builder().code(item.getUdiCode()) + .errUdiCode(item.getUdiCode()) + .orderId(item.getOrderIdFk()) + .action(collectOrder.getBusType()) + .relId(item.getRelId()) + .nameCode(item.getNameCode()) + .batchNo(item.getBatchNo()) + .produceDate(item.getProductDate()) + .expireDate(item.getExpireDate()) + .serialNo(item.getSerialNo()) + .scanCount(item.getScanCount()) + .totalCount(item.getScanCount()) + .workPlaceCode(putWorkPlaceCode) + .status(2) + .fifoSplit(1) + .createTime(new Date()).updateTime(new Date()) + .remainCount(item.getRemainCount()).build(); + this.decorateUnpackExpireTime(ioSplitCodeEntity); + splitCodeService.save(ioSplitCodeEntity); + } + } + } + } + continue; + } +// + splitRemove(collectOrderBiz, collectOrder, putWorkPlaceCode, isAuto); + } + ArrayList ioCollectOrderBizBackups = new ArrayList<>(); + for (IoCollectOrderBiz ioCollectOrderBiz : collectOrderBizs) { + IoCollectOrderBizBackup ioCollectOrderBizBackup = new IoCollectOrderBizBackup(); + BeanUtils.copyProperties(ioCollectOrderBiz, ioCollectOrderBizBackup); + ioCollectOrderBizBackups.add(ioCollectOrderBizBackup); + } + ioCollectOrderBizBackupService.saveBatch(ioCollectOrderBizBackups); + } + + public void splitRemove(IoCollectOrderBiz collectOrderBiz, IoCollectOrder collectOrder, Long + putWorkPlaceCode, Boolean isAuto) { + + List ioSplitCodeEntities = null; + List relIds = new ArrayList<>(); + //1.按照先进先出原则,查询拆零表,获取拆零表ID + if (StrUtil.isNotEmpty(collectOrderBiz.getCheckCode())) { + relIds = udiRelevanceService.selectByCheckCode(collectOrderBiz.getCheckCode()); + if (CollUtil.isNotEmpty(relIds)) { + ioSplitCodeEntities = findSplitCodes(relIds, collectOrderBiz.getBatchNo(), putWorkPlaceCode); + } + } else { + + ioSplitCodeEntities = findSplitCodes(collectOrderBiz.getRelId(), collectOrderBiz.getBatchNo(), putWorkPlaceCode); + relIds.add(collectOrderBiz.getRelId()); + } + + + //2.如果拆零表为空,则自动从预出库队列中获拉取数据 + if (CollUtil.isEmpty(ioSplitCodeEntities)) { + addFifoCode(relIds, collectOrderBiz.getBatchNo(), IntUtil.value(collectOrderBiz.getUnTagCount()), putWorkPlaceCode); + if (StrUtil.isNotEmpty(collectOrderBiz.getCheckCode())) { + relIds = udiRelevanceService.selectByCheckCode(collectOrderBiz.getCheckCode()); + if (CollUtil.isNotEmpty(relIds)) { + ioSplitCodeEntities = findSplitCodes(relIds, collectOrderBiz.getBatchNo(), putWorkPlaceCode); + } + } else { + ioSplitCodeEntities = findSplitCodes(relIds, collectOrderBiz.getBatchNo(), putWorkPlaceCode); + } + } + //3.如果拆零表不为空,则开始扣除数量 + int count = 0; + int unCount = 0; //剩余未扣减数量 + unCount = IntUtil.value(collectOrderBiz.getUnTagCount()); + for (IoSplitCodeEntity ioSplitCodeEntity : ioSplitCodeEntities) { + count = IntUtil.value(ioSplitCodeEntity.getRemainCount()) - unCount; + collectOrderCodeAutoService.save(IoCollectOrderCodeAuto.builder() + .codeIdFk(ioSplitCodeEntity.getId()) + .udiCode(ioSplitCodeEntity.getCode()) + .orderIdFk(collectOrder.getBillNo()) + .batchNo(ioSplitCodeEntity.getBatchNo()) + .productDate(ioSplitCodeEntity.getProduceDate()) + .expireDate(ioSplitCodeEntity.getExpireDate()) + .serialNo(ioSplitCodeEntity.getSerialNo()) + .relId(ioSplitCodeEntity.getRelId()) + .bizIdFk(collectOrderBiz.getId()) + .fifoSplit(ioSplitCodeEntity.getFifoSplit()) + .createTime(new Date()) + .updateTime(new Date()) + .build()); + if (count > 0) { + ioSplitCodeEntity.setRemainCount(count); + unCount = 0; + splitCodeMapper.updateById(ioSplitCodeEntity); + break; + } else if (count == 0) { + ioSplitCodeEntity.setRemainCount(0); + unCount = 0; + } else { + ioSplitCodeEntity.setRemainCount(0); + unCount = -count; + } + splitCodeMapper.updateById(ioSplitCodeEntity); + } + + if (unCount > 0) { + //4.拆零表数量不足,则从预出库队列中获取数据 + Integer fifoCount = addFifoCode(relIds, collectOrderBiz.getBatchNo(), unCount, putWorkPlaceCode); + if (fifoCount == 0) { + //预出库队列数量不足 + collectOrderBiz.setTagStatus(2); + collectOrderBiz.setTagMsg("预出库队列码数量不足,赋码失败!"); + if (isAuto) + throw new JsonException(500, "提交失败,工位库存数量不足!"); + else return; + + } else { + //再次执行赋码 + ioSplitCodeEntities = findSplitCodes(relIds, collectOrderBiz.getBatchNo(), putWorkPlaceCode); + for (IoSplitCodeEntity ioSplitCodeEntity : ioSplitCodeEntities) { + if (IntUtil.value(ioSplitCodeEntity.getRemainCount()) > 0) { + count = IntUtil.value(ioSplitCodeEntity.getRemainCount()) - unCount; + collectOrderCodeAutoService.save(IoCollectOrderCodeAuto.builder() + .codeIdFk(ioSplitCodeEntity.getId()) + .udiCode(ioSplitCodeEntity.getCode()) + .orderIdFk(collectOrder.getBillNo()) + .batchNo(ioSplitCodeEntity.getBatchNo()) + .productDate(ioSplitCodeEntity.getProduceDate()) + .expireDate(ioSplitCodeEntity.getExpireDate()) + .serialNo(ioSplitCodeEntity.getSerialNo()) + .relId(ioSplitCodeEntity.getRelId()) + .bizIdFk(collectOrderBiz.getId()) + .fifoSplit(ioSplitCodeEntity.getFifoSplit()) + .createTime(new Date()) + .updateTime(new Date()) + .build()); + if (count > 0) { + ioSplitCodeEntity.setRemainCount(count); + splitCodeMapper.updateById(ioSplitCodeEntity); + break; + } else if (count == 0) { + ioSplitCodeEntity.setRemainCount(0); + splitCodeMapper.updateById(ioSplitCodeEntity); + } else { + ioSplitCodeEntity.setRemainCount(0); + splitCodeMapper.updateById(ioSplitCodeEntity); + unCount = -count; + } + } + } + if (unCount > 0) { + collectOrderBiz.setTagStatus(2); + collectOrderBiz.setTagMsg("预出库队列码数量不足,赋码失败!"); + if (isAuto) + throw new JsonException(500, "提交失败,工位库存数量不足!"); + else return; + } else { + collectOrderBiz.setTagStatus(3); + collectOrderBiz.setTagMsg("赋码完成!"); + } + } + } else { + collectOrderBiz.setTagStatus(3); + collectOrderBiz.setTagMsg("赋码完成!"); + } + collectOrderBiz.setUnTagCount(unCount); + collectOrderBizService.updateById(collectOrderBiz); + } + + /** + * 从预出库队列里面取出数据,添加至拆零表 + */ + public Integer addFifoCode(List relIds, String batchNo, Integer requiredCount, Long workplaceCode) { + // Query FIFO codes based on criteria + List fifoCodeList = splitFifoCodeService + .list(new LambdaQueryWrapper() + .in(IoSplitFifoCodeEntity::getRelId, relIds) + .eq(StrUtil.isNotEmpty(batchNo), IoSplitFifoCodeEntity::getBatchNo, batchNo) + .eq(workplaceCode != null, IoSplitFifoCodeEntity::getWorkPlaceCode, workplaceCode) + .orderByAsc(IoSplitFifoCodeEntity::getInBactchNo) + ); + + int totalProcessedCount = 0; + List splitCodesToAdd = new ArrayList<>(); + List idsToRemove = new ArrayList<>(); + + for (IoSplitFifoCodeEntity fifoCode : fifoCodeList) { + boolean isTargetReached = false; + int processedScans = 0; + + for (int i = 0; i < fifoCode.getScanCount(); i++) { + // Create new FIFO code entity + IoSplitFifoCodeEntity newFifoCode = new IoSplitFifoCodeEntity(); + BeanUtils.copyProperties(fifoCode, newFifoCode); + newFifoCode.setScanCount(1); + + int codesPerScan = fifoCode.getTotalCount() / fifoCode.getScanCount(); + newFifoCode.setTotalCount(codesPerScan); + + // Create and populate split code entity + IoSplitCodeEntity splitCode = new IoSplitCodeEntity(); + BeanUtils.copyProperties(newFifoCode, splitCode); + + totalProcessedCount += IntUtil.value(newFifoCode.getTotalCount()); + splitCode.setRemainCount(splitCode.getTotalCount()); + splitCode.setStatus(1); + splitCode.setFifoSplit(newFifoCode.getFifoSplit()); + splitCode.setId(null); + + this.decorateUnpackExpireTime(splitCode); + splitCodesToAdd.add(splitCode); + + // Update inventory + IoSplitFifoInv inventory = splitFifoInvService.findByFifoCode(newFifoCode); + if (inventory != null) { + updateInventory(inventory, newFifoCode.getTotalCount()); + splitFifoInvService.updateById(inventory); + } + + // Update original FIFO code + splitFifoCodeService.updateById(IoSplitFifoCodeEntity.builder() + .id(fifoCode.getId()) + .scanCount(IntUtil.value(fifoCode.getScanCount()) - 1) + .totalCount(IntUtil.value(fifoCode.getTotalCount()) - codesPerScan) + .build()); + + processedScans++; + if (totalProcessedCount >= requiredCount) { + isTargetReached = true; + break; + } + } + + if (isTargetReached) { + if (processedScans == fifoCode.getScanCount()) { + idsToRemove.add(fifoCode.getId()); + } + break; + } + } + + // Batch operations + if (!idsToRemove.isEmpty()) { + splitFifoCodeService.removeByIds(idsToRemove); + } + if (!splitCodesToAdd.isEmpty()) { + splitCodeMapper.insertBatch(splitCodesToAdd); + } + + return totalProcessedCount; + } + + private void updateInventory(IoSplitFifoInv inventory, Integer processedCount) { + inventory.setOutCount(IntUtil.value(inventory.getOutCount()) + IntUtil.value(processedCount)); + int lockCount = IntUtil.value(inventory.getLockCount()) - IntUtil.value(processedCount); + inventory.setLockCount(lockCount > 0 ? lockCount : 0); + inventory.setReCount(IntUtil.value(inventory.getInCount()) - IntUtil.value(inventory.getOutCount())); + inventory.setAvailableCount(IntUtil.value(inventory.getInCount()) - IntUtil.value(inventory.getLockCount()) - IntUtil.value(inventory.getOutCount())); + } + + //包装拆包失效时间 + void decorateUnpackExpireTime(IoSplitCodeEntity ioSplitCodeEntity) { + Long relId = ioSplitCodeEntity.getRelId(); + UdiRelevanceEntity relevanceEntity = udiRelevanceService.getById(relId); + int n = IntUtil.value(relevanceEntity.getUnpackUseTime()); + // 获取当前时间 + Calendar calendar = Calendar.getInstance(); + Date unpackTime = calendar.getTime(); + // 加上n小时 + calendar.add(Calendar.HOUR_OF_DAY, n); + // 转换为Date对象 + Date unpackExpireTime = calendar.getTime(); + ioSplitCodeEntity.setUnpackTime(unpackTime); + ioSplitCodeEntity.setUnpackExpireTime(unpackExpireTime); + } + + public List findSplitCodes(Long relId, String batchNo, Long workPlaceCode) { + List ioSplitCodeEntities = splitCodeMapper.selectList(new LambdaQueryWrapper() + .eq(IoSplitCodeEntity::getRelId, relId) + .eq(StrUtil.isNotEmpty(batchNo), IoSplitCodeEntity::getBatchNo, batchNo) + .eq(workPlaceCode != null, IoSplitCodeEntity::getWorkPlaceCode, workPlaceCode) + .gt(IoSplitCodeEntity::getRemainCount, 0) + .in(IoSplitCodeEntity::getStatus, 1, 2).orderByAsc(IoSplitCodeEntity::getInBactchNo)); + return ioSplitCodeEntities; + } + + public List findSplitCodes(List relIds, String batchNo, Long workPlaceCode) { + List ioSplitCodeEntities = splitCodeMapper.selectList(new LambdaQueryWrapper() + .in(IoSplitCodeEntity::getRelId, relIds) + .eq(StrUtil.isNotEmpty(batchNo), IoSplitCodeEntity::getBatchNo, batchNo) + .eq(workPlaceCode != null, IoSplitCodeEntity::getWorkPlaceCode, workPlaceCode) + .gt(IoSplitCodeEntity::getRemainCount, 0) + .in(IoSplitCodeEntity::getStatus, 1, 2).orderByAsc(IoSplitCodeEntity::getInBactchNo)); + return ioSplitCodeEntities; + } + + public List filterCode + (List collectOrderCodes, IoCollectOrderBiz collectOrderBiz, UdiRelevanceResponse + udiRelevanceResponse) { + int unTagCount = IntUtil.value(collectOrderBiz.getScanActCount()) - collectOrderBiz.getCount(); + List newList = new ArrayList(); + int count = 0; + boolean first = true; + for (IoCollectOrderCodeMan collectOrderCode : collectOrderCodes) { + if (collectOrderCode.getBizIdFk().equals(collectOrderBiz.getId())) { + if (IntUtil.value(collectOrderCode.getIsSplitCode())) { + if (first) { + int remainder = unTagCount % IntUtil.value(udiRelevanceResponse.getBhsycjsl()); + collectOrderCode.setRemainCount(remainder); + first = false; + } else { + collectOrderCode.setRemainCount(collectOrderCode.getScanActCount()); + } + newList.add(collectOrderCode); + } else { + count = count + collectOrderCode.getScanActCount(); + if (!IntUtil.value(collectOrderCode.getRemoveFlag())) { + if (count > collectOrderBiz.getCount()) { + if (first) { + int remainder = unTagCount % IntUtil.value(udiRelevanceResponse.getBhsycjsl()); + collectOrderCode.setRemainCount(remainder); + first = false; + } else { + collectOrderCode.setRemainCount(collectOrderCode.getScanActCount()); + } + newList.add(collectOrderCode); + } + } + } + } + } + return newList; + + } + +} diff --git a/src/main/resources/schemas/schema_v2.4.sql b/src/main/resources/schemas/schema_v2.4.sql index be008d7fb..4ad6a874f 100644 --- a/src/main/resources/schemas/schema_v2.4.sql +++ b/src/main/resources/schemas/schema_v2.4.sql @@ -4799,33 +4799,32 @@ CALL Pro_Temp_ColumnWork('rel_code_batch', 'threeLevelCount', CALL Pro_Temp_ColumnWork('basic_products', 'detailSort', ' tinyint DEFAULT NULL COMMENT ''明细分类''', 1); -CREATE TABLE IF NOT EXISTS`third_ali_drug` +CREATE TABLE IF NOT EXISTS `third_ali_drug` ( - `id` int NOT NULL AUTO_INCREMENT, - `type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '药品类型', - `manufacturer`varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '生产企业', - `cpmctymc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '产品名称通用名称', - `form` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '剂型', - `formSpec` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '剂型规格', - `bzgg` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '包装规格', - `spmc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '商品名称', - `nameCode` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '层级标识', - `packRatio` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '包装比例', - `packLevel` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '包装级别', - `createTime` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', - `updateTime` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', - `erpId` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, - `approvalNum` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '批准文号', + `id` int NOT NULL AUTO_INCREMENT, + `type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '药品类型', + `manufacturer` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '生产企业', + `cpmctymc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '产品名称通用名称', + `form` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '剂型', + `formSpec` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '剂型规格', + `bzgg` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '包装规格', + `spmc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '商品名称', + `nameCode` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '层级标识', + `packRatio` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '包装比例', + `packLevel` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '包装级别', + `createTime` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `updateTime` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `erpId` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL, + `approvalNum` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '批准文号', PRIMARY KEY (`id`) USING BTREE, - UNIQUE INDEX`nameCode`(`nameCode`) USING BTREE, - INDEX`approvalNum`(`approvalNum`) USING BTREE, - INDEX`cpmctymc`(`cpmctymc`) USING BTREE - ) ENGINE = InnoDB - AUTO_INCREMENT = 8052 - CHARACTER SET = utf8mb4 - COLLATE = utf8mb4_0900_ai_ci - ROW_FORMAT = Dynamic; - + UNIQUE INDEX `nameCode` (`nameCode`) USING BTREE, + INDEX `approvalNum` (`approvalNum`) USING BTREE, + INDEX `cpmctymc` (`cpmctymc`) USING BTREE +) ENGINE = InnoDB + AUTO_INCREMENT = 8052 + CHARACTER SET = utf8mb4 + COLLATE = utf8mb4_0900_ai_ci + ROW_FORMAT = Dynamic; @@ -4841,9 +4840,12 @@ CALL Pro_Temp_ColumnWork('auth_company', 'refEntId', ' varchar(255) DEFAULT NULL COMMENT ''接口调用企业的唯一标识''', 1); -ALTER TABLE io_collect_order_origin MODIFY errorMsg text; -ALTER TABLE io_collect_order MODIFY errorMsg text; -ALTER TABLE io_collect_order_backup MODIFY errorMsg text; +ALTER TABLE io_collect_order_origin + MODIFY errorMsg text; +ALTER TABLE io_collect_order + MODIFY errorMsg text; +ALTER TABLE io_collect_order_backup + MODIFY errorMsg text; @@ -4883,21 +4885,25 @@ CALL Pro_Temp_ColumnWork('third_ali_drug', 'packUnitName', 1); -CREATE TABLE IF NOT EXISTS `auth_ali_user` ( - `id` bigint NOT NULL, - `erpId` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '第三方ID', - `appKey` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '阿里KEY', - `appSecret` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '阿里密钥', - `refEntId` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '厂家标识', - `type` varchar(255) DEFAULT NULL COMMENT '1 为生成企业 2为零售药店', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +CREATE TABLE IF NOT EXISTS `auth_ali_user` +( + `id` bigint NOT NULL, + `erpId` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '第三方ID', + `appKey` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '阿里KEY', + `appSecret` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '阿里密钥', + `refEntId` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '厂家标识', + `type` varchar(255) DEFAULT NULL COMMENT '1 为生成企业 2为零售药店', + PRIMARY KEY (`id`) +) ENGINE = InnoDB + DEFAULT CHARSET = utf8mb4 + COLLATE = utf8mb4_0900_ai_ci; INSERT IGNORE INTO auth_menu(`menu_id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query_param`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) - VALUES (6001, '医保上传统计', 5210, 999, 'inout/split/tag/stats', 'collect/CollectOrderStatsNew', NULL, 1, 0, 'C', '0', '0', NULL, '', '超级用户', '2024-11-18 17:46:08', NULL, NULL, NULL); +VALUES (6001, '医保上传统计', 5210, 999, 'inout/split/tag/stats', 'collect/CollectOrderStatsNew', NULL, 1, 0, 'C', '0', '0', + NULL, '', '超级用户', '2024-11-18 17:46:08', NULL, NULL, NULL); @@ -4910,23 +4916,23 @@ CALL Pro_Temp_ColumnWork('sys_workplace_document', 'uploadYb', CREATE TABLE IF NOT EXISTS `io_collect_order_check_code` ( - `id` int NOT NULL AUTO_INCREMENT, - `code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '追溯码(UDI.药品)', - `fromType` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '单据来源', - `busType` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '单据类型', - `billNo` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '单据号', - `fromCorp` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '往来单位', - `operTime` datetime NULL DEFAULT NULL COMMENT '操作时间', - `operUser` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '操作人', - `collectCode` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '采集点', - `collectUser` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '采集点负责人', + `id` int NOT NULL AUTO_INCREMENT, + `code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '追溯码(UDI.药品)', + `fromType` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '单据来源', + `busType` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '单据类型', + `billNo` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '单据号', + `fromCorp` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '往来单位', + `operTime` datetime NULL DEFAULT NULL COMMENT '操作时间', + `operUser` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '操作人', + `collectCode` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '采集点', + `collectUser` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '采集点负责人', `workPlaceCode` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '工位', `workPlaceUser` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '工位负责人', - `fifoSplit` tinyint NULL DEFAULT NULL COMMENT '赋码方式 1:自动拆零赋码;2:自动整取赋码;3.手动赋码', - `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注', - `inoutType` tinyint NULL DEFAULT NULL COMMENT '出入库类型', - `scanCount` int NULL DEFAULT NULL COMMENT '扫码数量', - `relId` bigint NULL DEFAULT NULL COMMENT '耗材字典ID外键', + `fifoSplit` tinyint NULL DEFAULT NULL COMMENT '赋码方式 1:自动拆零赋码;2:自动整取赋码;3.手动赋码', + `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注', + `inoutType` tinyint NULL DEFAULT NULL COMMENT '出入库类型', + `scanCount` int NULL DEFAULT NULL COMMENT '扫码数量', + `relId` bigint NULL DEFAULT NULL COMMENT '耗材字典ID外键', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 @@ -4977,4 +4983,11 @@ CALL Pro_Temp_ColumnWork('io_collect_order_biz_origin', 'checkCode', 'varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT ''套编码/医保编码/术士套包编码''', 1); +# CALL Pro_Temp_ColumnWork('io_split_code', 'ybbm', +# 'varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT ''套编码/医保编码/术士套包编码''', +# 1); +# CALL Pro_Temp_ColumnWork('io_split_fifo_code', 'ybbm', +# 'varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT ''套编码/医保编码/术士套包编码''', +# 1); +