From 49142d518357045c4bbaf4410eb50fe1d7deabcc Mon Sep 17 00:00:00 2001 From: yewj Date: Fri, 28 Mar 2025 11:39:25 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E9=87=8D=E5=A4=8D=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/glxp/api/controller/inout/IoCodeTempController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/glxp/api/controller/inout/IoCodeTempController.java b/src/main/java/com/glxp/api/controller/inout/IoCodeTempController.java index 6dfc3eaa1..5f6e28106 100644 --- a/src/main/java/com/glxp/api/controller/inout/IoCodeTempController.java +++ b/src/main/java/com/glxp/api/controller/inout/IoCodeTempController.java @@ -419,7 +419,7 @@ public class IoCodeTempController extends BaseController { @RepeatSubmit() @AuthRuleAnnotation("") @PostMapping("warehouse/inout/batchAddCode") -// @CusRedissonAnnotation(cacheName = RedissonCacheKey.WEB_ADD_CODE, key = {"#addOrderCodeRequest.corpOrderId", "#addOrderCodeRequest.codeList"}, timeOutMsg = "系统正在处理,请勿重复提交") + @CusRedissonAnnotation(cacheName = RedissonCacheKey.WEB_ADD_CODE, key = {"#addOrderCodeRequest.corpOrderId", "#addOrderCodeRequest.codeList","#addOrderCodeRequest.code"}, timeOutMsg = "系统正在处理,请勿重复提交") @Log(title = "单据管理", businessType = BusinessType.INSERT) public BaseResponse batchAddCode(@RequestBody AddOrderCodeRequest addOrderCodeRequest, BindingResult bindingResult) { From 48920c1d9f886611fad85a829e42ca4a21b2be1f Mon Sep 17 00:00:00 2001 From: qiuyt Date: Fri, 28 Mar 2025 11:40:06 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E8=A1=A5=E9=BD=90=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../collect/IoCollectOrderBackupService.java | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/glxp/api/service/collect/IoCollectOrderBackupService.java b/src/main/java/com/glxp/api/service/collect/IoCollectOrderBackupService.java index 6396be032..0e1d2841c 100644 --- a/src/main/java/com/glxp/api/service/collect/IoCollectOrderBackupService.java +++ b/src/main/java/com/glxp/api/service/collect/IoCollectOrderBackupService.java @@ -16,6 +16,8 @@ import com.glxp.api.constant.Constant; import com.glxp.api.constant.ConstantStatus; import com.glxp.api.dao.auth.InvWarehouseDao; import com.glxp.api.dao.basic.SysWorkplaceBusMapper; +import com.glxp.api.dao.collect.IoCollectCodeBackMapper; +import com.glxp.api.dao.collect.IoCollectCodeMapper; import com.glxp.api.dao.collect.IoCollectOrderBackupMapper; import com.glxp.api.dao.inout.IoCodeTempDao; import com.glxp.api.entity.auth.AuthAdmin; @@ -49,6 +51,7 @@ import com.glxp.api.service.inout.IoOrderService; import com.glxp.api.service.system.SystemParamConfigService; import com.glxp.api.util.*; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; @@ -136,7 +139,8 @@ public class IoCollectOrderBackupService extends ServiceImpl().eq("billNo", collectOrder.getBillNo())); } - + @Resource + private IoCollectCodeBackMapper ioCollectCodeBackMapper; public List combieOrderDetail(CollectOrderBizRequest collectOrderBizRequest) { List list = ioCollectOrderBizBackupService.filterList(collectOrderBizRequest); @@ -167,6 +171,18 @@ public class IoCollectOrderBackupService extends ServiceImpl ioCollectCodeBackupList = ioCollectCodeBackMapper.selectList(new QueryWrapper() + .eq("billNo",collectOrderBizRequest.getOrderIdFk()) + ); + if(CollUtil.isNotEmpty(ioCollectCodeBackupList)){ + for (IoCollectCodeBackup ioCollectCodeBackup : ioCollectCodeBackupList) { + collectOrderBizResponse.setFinishUdiCode(StrUtil.trimToEmpty(collectOrderBizResponse.getSplitUdiCode()) + "," + ioCollectCodeBackup.getCode()); + } + + } + } collectOrderBizResponses.add(collectOrderBizResponse); } From 69d9b1fe14308d65e68e813b465d9b4a38fdbfc5 Mon Sep 17 00:00:00 2001 From: qiuyt Date: Fri, 28 Mar 2025 14:04:05 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E8=A1=A5=E9=BD=90=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../collect/IoCollectOrderBackupService.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/glxp/api/service/collect/IoCollectOrderBackupService.java b/src/main/java/com/glxp/api/service/collect/IoCollectOrderBackupService.java index 0e1d2841c..aa06f72f9 100644 --- a/src/main/java/com/glxp/api/service/collect/IoCollectOrderBackupService.java +++ b/src/main/java/com/glxp/api/service/collect/IoCollectOrderBackupService.java @@ -164,13 +164,13 @@ public class IoCollectOrderBackupService extends ServiceImpl ioCollectCodeBackupList = ioCollectCodeBackMapper.selectList(new QueryWrapper() @@ -178,7 +178,7 @@ public class IoCollectOrderBackupService extends ServiceImpl Date: Fri, 28 Mar 2025 14:04:39 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E5=BB=BA=E9=98=B3-=E5=BA=93=E5=AD=98?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/mybatis/mapper/inv/invProductDao.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/mybatis/mapper/inv/invProductDao.xml b/src/main/resources/mybatis/mapper/inv/invProductDao.xml index 768fda0cf..e3fdbf539 100644 --- a/src/main/resources/mybatis/mapper/inv/invProductDao.xml +++ b/src/main/resources/mybatis/mapper/inv/invProductDao.xml @@ -53,7 +53,7 @@ bp.packUnit, ip.price from inv_product ip - INNER JOIN basic_products bp ON ip.relIdFk = (SELECT id FROM basic_udirel WHERE uuid = bp.uuid) + INNER JOIN basic_products bp ON ip.relIdFk = (SELECT id FROM basic_udirel WHERE uuid = bp.uuid limit 1) LEFT JOIN basic_corp ON ip.supId = basic_corp.erpId LEFT JOIN auth_dept ON auth_dept.CODE = ip.deptCode LEFT JOIN auth_warehouse ON auth_warehouse.CODE = ip.invCode From 16bade660a14536a2597d252e7ad112344bcd8f1 Mon Sep 17 00:00:00 2001 From: yewj Date: Fri, 28 Mar 2025 14:22:40 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E6=89=AB=E7=A0=81=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../inout/IoCodeTempController.java | 12 +- .../api/req/inout/AddOrderCodeRequest.java | 2 + .../api/service/inout/AddCoodeService.java | 105 ++++++++++-------- 3 files changed, 66 insertions(+), 53 deletions(-) diff --git a/src/main/java/com/glxp/api/controller/inout/IoCodeTempController.java b/src/main/java/com/glxp/api/controller/inout/IoCodeTempController.java index 5f6e28106..ef50d873c 100644 --- a/src/main/java/com/glxp/api/controller/inout/IoCodeTempController.java +++ b/src/main/java/com/glxp/api/controller/inout/IoCodeTempController.java @@ -419,7 +419,7 @@ public class IoCodeTempController extends BaseController { @RepeatSubmit() @AuthRuleAnnotation("") @PostMapping("warehouse/inout/batchAddCode") - @CusRedissonAnnotation(cacheName = RedissonCacheKey.WEB_ADD_CODE, key = {"#addOrderCodeRequest.corpOrderId", "#addOrderCodeRequest.codeList","#addOrderCodeRequest.code"}, timeOutMsg = "系统正在处理,请勿重复提交") + @CusRedissonAnnotation(cacheName = RedissonCacheKey.WEB_ADD_CODE, key = {"#addOrderCodeRequest.corpOrderId", "#addOrderCodeRequest.codeList", "#addOrderCodeRequest.code"}, timeOutMsg = "重复扫码") @Log(title = "单据管理", businessType = BusinessType.INSERT) public BaseResponse batchAddCode(@RequestBody AddOrderCodeRequest addOrderCodeRequest, BindingResult bindingResult) { @@ -437,17 +437,15 @@ public class IoCodeTempController extends BaseController { codeList.add(addOrderCodeRequest.getCode()); addOrderCodeRequest.setCodeList(codeList); } + // 获取第一个码判断类型,如果是药品类型则使用批量处理方法 - if (!codeList.isEmpty()) { + if (!codeList.isEmpty() && IntUtil.value(addOrderCodeRequest.getProductType()) == 2) { String firstCode = codeList.get(0); if (firstCode.endsWith("\u001D")) { firstCode = firstCode.replace("\u001D", ""); } - UdiEntity firstUdiEntity = FilterUdiUtils.getUdi(firstCode); - if (firstUdiEntity != null && IntUtil.value(firstUdiEntity.getProductType()) == 2) { - // 药品类型,使用批量处理方法 - return addCoodeService.batchProcessDrugCodes(addOrderCodeRequest, authAdmin); - } + // 药品类型,使用批量处理方法 + return addCoodeService.batchProcessDrugCodes(addOrderCodeRequest, authAdmin); } // 原有处理逻辑,处理非药品或空列表情况 diff --git a/src/main/java/com/glxp/api/req/inout/AddOrderCodeRequest.java b/src/main/java/com/glxp/api/req/inout/AddOrderCodeRequest.java index d6e5b4201..acc20bf5a 100644 --- a/src/main/java/com/glxp/api/req/inout/AddOrderCodeRequest.java +++ b/src/main/java/com/glxp/api/req/inout/AddOrderCodeRequest.java @@ -66,4 +66,6 @@ public class AddOrderCodeRequest { private Integer fromType; + private Integer productType; + } diff --git a/src/main/java/com/glxp/api/service/inout/AddCoodeService.java b/src/main/java/com/glxp/api/service/inout/AddCoodeService.java index e28c705e0..a1db3d57a 100644 --- a/src/main/java/com/glxp/api/service/inout/AddCoodeService.java +++ b/src/main/java/com/glxp/api/service/inout/AddCoodeService.java @@ -175,7 +175,7 @@ public class AddCoodeService { for (String code : processedCodes) { UdiEntity udiEntity = FilterUdiUtils.getUdi(code); - if (udiEntity != null) { + if (udiEntity != null && StrUtil.isNotEmpty(udiEntity.getUdi())) { udiEntityMap.put(code, udiEntity); nameCodes.put(udiEntity.getUdi(), code); } else { @@ -189,6 +189,7 @@ public class AddCoodeService { if (udiEntityMap.isEmpty()) { addCodeResult.setVailCodeResultResponses(vailCodeResultResponses); + addCodeResult.setOrderId(addOrderCodeRequest.getBillNo()); return ResultVOUtils.success(addCodeResult); } @@ -819,60 +820,72 @@ public class AddCoodeService { return Collections.emptyList(); } - // 获取当前订单的所有明细码 - List ioOrderDetailCodeEntities = orderDetailCodeDao.selectList(new QueryWrapper().select("id", "count", "reCount", "bindRlFk", "batchNo", "price").eq("orderIdFk", orderEntity.getBillNo())); - // 按照关联ID和批次号分组码实体 - Map> groupedTempEntities = codeTempEntities.stream().collect(Collectors.groupingBy(entity -> entity.getRelId() + ":" + StrUtil.trimToEmpty(entity.getBatchNo()))); + Map> groupedTempEntities = codeTempEntities.stream() + .collect(Collectors.groupingBy(entity -> entity.getRelId() + ":" + StrUtil.trimToEmpty(entity.getBatchNo()))); + + // 使用synchronized块来保护关键部分 + synchronized (orderEntity.getBillNo().intern()) { + // 获取当前订单的所有明细码 + // 处理每个分组 + for (Map.Entry> entry : groupedTempEntities.entrySet()) { + List group = entry.getValue(); + if (CollUtil.isEmpty(group)) { + continue; + } - // 处理每个分组 - for (Map.Entry> entry : groupedTempEntities.entrySet()) { - List group = entry.getValue(); - if (CollUtil.isEmpty(group)) { - continue; - } - IoCodeTempEntity representative = group.get(0); - UdiRelevanceResponse udiRelevanceResponse = udiRelevanceService.selectSupGroupById(representative.getRelId(), representative.getSupId()); - - // 计算该组的总数量 - int totalCount = group.stream().mapToInt(IoCodeTempEntity::getMyCount).sum(); - int totalReCount = group.stream().mapToInt(IoCodeTempEntity::getMyReCount).sum(); - // 如果没有现有明细码或未找到匹配的明细码,则创建新的 - boolean isUpdate = false; - IoOrderDetailCodeEntity resultDetailEntity = null; - if (CollUtil.isNotEmpty(ioOrderDetailCodeEntities)) { - for (IoOrderDetailCodeEntity orderDetailCodeEntity : ioOrderDetailCodeEntities) { - if (orderDetailCodeEntity.getBindRlFk().longValue() == representative.getRelId().longValue() && StrUtil.trimToEmpty(orderDetailCodeEntity.getBatchNo()).equals(StrUtil.trimToEmpty(representative.getBatchNo()))) { - // 更新现有明细码的数量 - orderDetailCodeEntity.setCount(orderDetailCodeEntity.getCount() + totalCount); - orderDetailCodeEntity.setReCount(orderDetailCodeEntity.getReCount() + totalReCount); - orderDetailCodeEntity.setUpdateTime(new Date()); - orderDetailCodeDao.updateCount(orderDetailCodeEntity); - isUpdate = true; - resultDetailEntity = orderDetailCodeEntity; - break; + IoCodeTempEntity representative = group.get(0); + UdiRelevanceResponse udiRelevanceResponse = udiRelevanceService.selectSupGroupById( + representative.getRelId(), + representative.getSupId()); + + // 计算该组的总数量 + int totalCount = group.stream().mapToInt(IoCodeTempEntity::getMyCount).sum(); + int totalReCount = group.stream().mapToInt(IoCodeTempEntity::getMyReCount).sum(); + + // 在数据库层面使用悲观锁或乐观锁查询现有记录 + IoOrderDetailCodeEntity existingEntity = orderDetailCodeDao.selectOne( + new QueryWrapper() + .eq("orderIdFk", orderEntity.getBillNo()) + .eq("bindRlFk", representative.getRelId()) + .eq(StrUtil.isNotEmpty(representative.getBatchNo()), "batchNo", representative.getBatchNo()) + .last("limit 1 FOR UPDATE")); // 添加行级锁 + + IoOrderDetailCodeEntity resultDetailEntity; + if (existingEntity != null) { + // 更新现有明细码的数量 + existingEntity.setCount(existingEntity.getCount() + totalCount); + existingEntity.setReCount(existingEntity.getReCount() + totalReCount); + existingEntity.setUpdateTime(new Date()); + orderDetailCodeDao.updateCount(existingEntity); + resultDetailEntity = existingEntity; + } else { + // 创建新记录 + resultDetailEntity = buildEntity(orderEntity, representative, udiRelevanceResponse, totalCount, totalReCount); + orderDetailCodeDao.insert(resultDetailEntity); + } + // 批量更新价格信息 + List updateBatch = new ArrayList<>(); + for (IoCodeTempEntity entity : group) { + if (entity.getPrice() == null && udiRelevanceResponse != null && udiRelevanceResponse.getPrice() != null) { + entity.setPrice(udiRelevanceResponse.getPrice()); } + entity.setBizId(resultDetailEntity.getId()); + updateBatch.add(entity); } - } - // 如果没有更新现有记录,则创建新记录 - if (!isUpdate) { - resultDetailEntity = buildEntity(orderEntity, representative, udiRelevanceResponse, totalCount, totalReCount); - orderDetailCodeDao.insert(resultDetailEntity); - } - // 更新价格信息 - for (IoCodeTempEntity entity : group) { - if (entity.getPrice() == null && udiRelevanceResponse != null && udiRelevanceResponse.getPrice() != null) { - entity.setPrice(udiRelevanceResponse.getPrice()); + // 批量更新以提高性能 + if (!updateBatch.isEmpty()) { + codeTempService.batchUpdate(updateBatch); } - entity.setBizId(resultDetailEntity.getId()); - codeTempService.updateById(entity); } + // 返回最新的明细码列表 + return orderDetailCodeDao.selectList( + new QueryWrapper() + .select("id", "count", "reCount", "bindRlFk", "batchNo", "price") + .eq("orderIdFk", orderEntity.getBillNo())); } - - // 返回最新的明细码列表 - return orderDetailCodeDao.selectList(new QueryWrapper().select("id", "count", "reCount", "bindRlFk", "batchNo", "price").eq("orderIdFk", orderEntity.getBillNo())); } public Integer getMaxGroupNumber() {