From 1dd0c4d6d8c3e5e6e5d5262ab105f4f54dbdd1da Mon Sep 17 00:00:00 2001 From: aike <17730485278@139.com> Date: Tue, 5 Aug 2025 16:22:51 +0800 Subject: [PATCH] =?UTF-8?q?demand:=20=20=20=20=E6=89=AB=E6=8F=8F=E8=BF=90?= =?UTF-8?q?=E5=8D=95=E7=BB=84=E6=89=B9=E6=AC=A1=E6=9F=AF=E6=A1=A5=E5=B8=82?= =?UTF-8?q?=E5=9C=BA=E9=83=A8-=E6=9F=AF=E6=A1=A5=E5=88=86=E6=8B=A8?= =?UTF-8?q?=E4=B8=AD=E5=BF=83-=E6=9D=AD=E5=B7=9E=E4=B8=8D=E5=86=8D?= =?UTF-8?q?=E4=BA=92=E6=8D=A2=20=20=E6=A0=B9=E6=8D=AE=E6=89=B9=E6=AC=A1/?= =?UTF-8?q?=E6=89=B9=E9=87=8F=E6=89=AB=E6=8F=8F=E7=BB=84=E6=89=B9=E6=AC=A1?= =?UTF-8?q?=E9=92=88=E5=AF=B9=E5=88=86=E6=89=B9=E8=BF=90=E5=8D=95=E5=81=9A?= =?UTF-8?q?=E9=80=82=E5=BA=94=20=20=E6=9F=A5=E8=AF=A2=E6=BC=8F=E7=BB=84?= =?UTF-8?q?=E6=89=B9=E6=AC=A1=E5=A2=9E=E5=8A=A0=E6=9F=A5=E8=AF=A2=E5=88=86?= =?UTF-8?q?=E6=89=B9=E5=90=8E=E6=9C=AA=E7=BB=84=E5=AE=8C=E7=9A=84=E8=BF=90?= =?UTF-8?q?=E5=8D=95=20committer:=20heyu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../erp/emis/domain/EmisTmsSiteBatchMiss.java | 2 +- .../erp/emis/service/EmisBaseService.java | 70 +++++++++++++--- .../impl/EmisTmsSiteBatchMissServiceImpl.java | 4 + .../impl/EmisTmsSiteBatchServiceImpl.java | 79 +++++++++++-------- .../mapper/EmisTmsSiteBatchDtlMapper.xml | 6 ++ .../mapper/EmisTmsSiteBatchMissMapper.xml | 3 + 6 files changed, 118 insertions(+), 46 deletions(-) diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisTmsSiteBatchMiss.java b/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisTmsSiteBatchMiss.java index a1ce660a3..c964994d8 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisTmsSiteBatchMiss.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisTmsSiteBatchMiss.java @@ -120,7 +120,7 @@ public class EmisTmsSiteBatchMiss extends BaseEntity { private Integer missCount; /** - * 漏组属性.0:其他,1:没有创建线路,2:没有组批次,3:组批次全错,默认为0 + * 漏组属性.0:其他,1:没有创建线路,2:没有组批次,3:组批次全错,4:运单分批后未组完,默认为0 */ private String missType; diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/EmisBaseService.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/EmisBaseService.java index 2aca71776..516848f26 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/service/EmisBaseService.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/EmisBaseService.java @@ -4386,7 +4386,8 @@ public class EmisBaseService { if (CollectionUtil.isEmpty(billCodes)) { return; } - List lineCodes = emisWaybills.stream().map(EmisWaybill::getTransLineType).distinct().collect(Collectors.toList()); + List lineCodes = emisWaybills.stream().map(EmisWaybill::getTransLineType).distinct() + .collect(Collectors.toList()); if (CollectionUtil.isEmpty(lineCodes)) { return; } @@ -4417,14 +4418,21 @@ public class EmisBaseService { failedBillCodes.addAll(result.getFailedBillCodes()); // 批量插入运单组批次状态记录 - if (!result.getBatchStatusList().isEmpty()) { + List batchStatusList = result.getBatchStatusList(); + List missRecords = result.getMissRecords(); + if (!batchStatusList.isEmpty()) { + filterBatchStatusList(batchStatusList, missRecords); + } + + // 批量插入运单组批次状态记录 + if (!batchStatusList.isEmpty()) { emisWaybillBatchStatusMapper.batchInsertEmisWaybillBatchStatus(result.getBatchStatusList()); totalBatchStatusRecords += result.getBatchStatusList().size(); } // 批量保存漏组记录 - if (!result.getMissRecords().isEmpty()) { - List filteredRecords = result.getMissRecords().stream() + if (!missRecords.isEmpty()) { + List filteredRecords = missRecords.stream() .collect(Collectors.collectingAndThen( Collectors.toMap( record -> record.getBillCode() + "_" + record.getMissReason(), @@ -4439,7 +4447,8 @@ public class EmisBaseService { long processTime = endTime - startTime; // 保存扫描记录 - saveRecord(totalProcessed, successCount, failCount, processTime, failedBillCodes,totalBatchStatusRecords,totalMissRecords); + saveRecord(totalProcessed, successCount, failCount, processTime, failedBillCodes, totalBatchStatusRecords, + totalMissRecords); log.info( "Auto scan completed. Total processed: {}, Success: {}, Failed: {}, Time taken: {}ms, Batch status records: {}, Miss records: {}", @@ -4453,6 +4462,52 @@ public class EmisBaseService { } } + public void filterBatchStatusList(List batchStatusList, List missRecords) { + // 获取所有运单号 + List batchStatusBillCodes = batchStatusList.stream() + .map(EmisWaybillBatchStatus::getBillCode) + .collect(Collectors.toList()); + + // 查询emis_tms_site_batch_dtl中waybill_batch_status=1的运单 + EmisTmsSiteBatchDtl queryCondition = new EmisTmsSiteBatchDtl(); + queryCondition.getParams().put("billCodes", batchStatusBillCodes); + queryCondition.setWaybillBatchStatus("1"); + List filteredBatchDtls = emisTmsSiteBatchDtlMapper + .selectEmisTmsSiteBatchDtlList(queryCondition); + + // 获取已分批的运单号集合 + Set filteredBillCodes = filteredBatchDtls.stream() + .map(EmisTmsSiteBatchDtl::getBillCode) + .collect(Collectors.toSet()); + + if (CollectionUtil.isEmpty(filteredBillCodes)) { + return; + } + // 将waybill_batch_status=1的运单进行去重处理添加到漏组记录 + Set processedBillCodes = new HashSet<>(); + if (CollectionUtil.isNotEmpty(missRecords)) { + for (EmisWaybillBatchStatus batchStatus : batchStatusList) { + if (filteredBillCodes.contains(batchStatus.getBillCode()) + && processedBillCodes.add(batchStatus.getBillCode())) { + // 创建漏组记录 + EmisTmsSiteBatchMiss missRecord = new EmisTmsSiteBatchMiss(); + missRecord.setBillCode(batchStatus.getBillCode()); + missRecord.setMissReason("运单分批后未组完"); + missRecord.setMissType("4"); + missRecord.setCreateBy("system"); + missRecord.setCreateTime(new Date()); + missRecord.setCreateSite("88888"); + + // 添加到漏组记录列表 + missRecords.add(missRecord); + } + } + } + + // 从batchStatusList中剔除waybill_batch_status=1的运单 + batchStatusList.removeIf(batchStatus -> filteredBillCodes.contains(batchStatus.getBillCode())); + } + public void saveRecord(int totalProcessed, int successCount, int failCount, long processTime, List failedBillCodes, int totalBatchStatusRecords, int totalMissRecords) { EmisTmsSiteBatchMissRecord record = new EmisTmsSiteBatchMissRecord(); @@ -4684,11 +4739,6 @@ public class EmisBaseService { .filter(rule -> "51000".equals(rule.getStartSiteCode()) || "51200".equals(rule.getStartSiteCode())) .collect(Collectors.toList()); // 无锡,张家港 - } else if ("57502".equals(sendSiteCode) || "57501".equals(sendSiteCode) || "57100".equals(sendSiteCode)) { - filteredRuleList = ruleList.stream() - .filter(rule -> "57502".equals(rule.getStartSiteCode()) - || "57501".equals(rule.getStartSiteCode()) || "57100".equals(rule.getStartSiteCode())) - .collect(Collectors.toList()); // 柯桥市场部、柯桥分拨中心、杭州 } else if ("25001".equals(sendSiteCode) || "25000".equals(sendSiteCode)) { filteredRuleList = ruleList.stream() .filter(rule -> "25001".equals(rule.getStartSiteCode()) diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisTmsSiteBatchMissServiceImpl.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisTmsSiteBatchMissServiceImpl.java index fcfe0389f..6e09c3ff4 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisTmsSiteBatchMissServiceImpl.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisTmsSiteBatchMissServiceImpl.java @@ -320,6 +320,10 @@ public class EmisTmsSiteBatchMissServiceImpl extends EmisBaseService implements (existing, replacement) -> existing)); List uniqueMissRecords = new ArrayList<>(missMap.values()); + if (!uniqueBatchStatus.isEmpty()) { + filterBatchStatusList(uniqueBatchStatus, uniqueMissRecords); + } + // 批量插入 - 每次插入5000条 if (!uniqueBatchStatus.isEmpty()) { int batchSize = 5000; diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisTmsSiteBatchServiceImpl.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisTmsSiteBatchServiceImpl.java index dd12d4f06..5ddba0c9e 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisTmsSiteBatchServiceImpl.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisTmsSiteBatchServiceImpl.java @@ -174,6 +174,7 @@ public class EmisTmsSiteBatchServiceImpl extends EmisBaseService implements IEmi if (isParcelQtyEqual && isWeightEqual && isVolumeEqual) { checkUnique(oldSiteBatch, itemDtl.getBillCode()); + compareWaybillAndBatch(oldSiteBatch, itemDtl, emisWaybill, rule, false); return; } @@ -190,12 +191,53 @@ public class EmisTmsSiteBatchServiceImpl extends EmisBaseService implements IEmi throw new EmisBizError(EmisBizErrorType.FAIL, itemDtl.getBillCode() + "的批次体积必须大于0"); } + compareWaybillAndBatch(oldSiteBatch, itemDtl, emisWaybill, rule,true); + } + + private void compareWaybillAndBatch(EmisTmsSiteBatch oldSiteBatch, EmisTmsSiteBatchDtl itemDtl, EmisWaybill emisWaybill, EmisTransPlanRule rule, boolean isBatch) throws EmisBizError { // 根据起始网点、下一网点和运单号查询TMS组批次 List existingBatches = selectTmsSiteBatchBySiteAndBillCode( oldSiteBatch.getStartSiteCode(), oldSiteBatch.getNextSiteCode(), itemDtl.getBillCode(), itemDtl.getId()); + // 检查rule.supplierCode是否包含多个供应商编码(用逗号隔开) + if (StringUtils.isNotBlank(rule.getSupplierCode()) && rule.getSupplierCode().contains(",")) { + // 将supplierCode按逗号分割成数组 + String[] supplierCodes = rule.getSupplierCode().split(","); + List supplierCodeList = Arrays.asList(supplierCodes); + + // 检查现有批次中是否有supplierCode在rule.supplierCode内 + boolean hasMatchingSupplier = existingBatches.stream() + .anyMatch(batch -> supplierCodeList.contains(batch.getSupplierCode())); + + if (hasMatchingSupplier) { + // 找到匹配的批次,检查重量、体积、件数是否一致 + EmisTmsSiteBatch matchingBatch = existingBatches.stream() + .filter(batch -> supplierCodeList.contains(batch.getSupplierCode())) + .findFirst() + .orElse(null); + + if (matchingBatch != null) { + // 检查批次重量、体积、件数是否一致 + boolean isBatchWeightEqual = matchingBatch.getTotalWeight() != null + && itemDtl.getBatchWeight() != null + && matchingBatch.getTotalWeight().compareTo(itemDtl.getBatchWeight()) == 0; + boolean isBatchVolumeEqual = matchingBatch.getTotalVolume() != null + && itemDtl.getBatchVolume() != null + && matchingBatch.getTotalVolume().compareTo(itemDtl.getBatchVolume()) == 0; + boolean isBatchParcelQtyEqual = Objects.equals(matchingBatch.getTotalParcelQty(), + itemDtl.getBatchParcelQty()); + + if (!isBatchWeightEqual || !isBatchVolumeEqual || !isBatchParcelQtyEqual) { + throw new EmisBizError(EmisBizErrorType.FAIL, + itemDtl.getBillCode() + "的批次重量、体积、件数与批次" + matchingBatch.getBatchNo() + "不一致,请检查后重新录入"); + } + } + + } + } + // 创建包含当前批次的临时批次列表用于分组去重 List allBatches = new ArrayList<>(existingBatches); @@ -279,41 +321,8 @@ public class EmisTmsSiteBatchServiceImpl extends EmisBaseService implements IEmi itemDtl.getBillCode() + "的批次总体积(" + totalVolume + ")超过运单体积(" + emisWaybill.getTotalVolume() + ")"); } - // 检查rule.supplierCode是否包含多个供应商编码(用逗号隔开) - if (StringUtils.isNotBlank(rule.getSupplierCode()) && rule.getSupplierCode().contains(",")) { - // 将supplierCode按逗号分割成数组 - String[] supplierCodes = rule.getSupplierCode().split(","); - List supplierCodeList = Arrays.asList(supplierCodes); - - // 检查现有批次中是否有supplierCode在rule.supplierCode内 - boolean hasMatchingSupplier = existingBatches.stream() - .anyMatch(batch -> supplierCodeList.contains(batch.getSupplierCode())); - - if (hasMatchingSupplier) { - // 找到匹配的批次,检查重量、体积、件数是否一致 - EmisTmsSiteBatch matchingBatch = existingBatches.stream() - .filter(batch -> supplierCodeList.contains(batch.getSupplierCode())) - .findFirst() - .orElse(null); - - if (matchingBatch != null) { - // 检查批次重量、体积、件数是否一致 - boolean isBatchWeightEqual = matchingBatch.getTotalWeight() != null - && itemDtl.getBatchWeight() != null - && matchingBatch.getTotalWeight().compareTo(itemDtl.getBatchWeight()) == 0; - boolean isBatchVolumeEqual = matchingBatch.getTotalVolume() != null - && itemDtl.getBatchVolume() != null - && matchingBatch.getTotalVolume().compareTo(itemDtl.getBatchVolume()) == 0; - boolean isBatchParcelQtyEqual = Objects.equals(matchingBatch.getTotalParcelQty(), - itemDtl.getBatchParcelQty()); - - if (!isBatchWeightEqual || !isBatchVolumeEqual || !isBatchParcelQtyEqual) { - throw new EmisBizError(EmisBizErrorType.FAIL, - itemDtl.getBillCode() + "的批次重量、体积、件数与批次" + matchingBatch.getBatchNo() + "不一致,请检查后重新录入"); - } - } - - } + if (!isBatch) { + return; } // 安全比较:检查批次数据是否与运单数据完全一致 diff --git a/emis-biz/src/main/resources/mapper/EmisTmsSiteBatchDtlMapper.xml b/emis-biz/src/main/resources/mapper/EmisTmsSiteBatchDtlMapper.xml index 2b7407f58..ee0aa1474 100644 --- a/emis-biz/src/main/resources/mapper/EmisTmsSiteBatchDtlMapper.xml +++ b/emis-biz/src/main/resources/mapper/EmisTmsSiteBatchDtlMapper.xml @@ -50,6 +50,12 @@ and batch_weight = #{batchWeight} and waybill_batch_status = #{waybillBatchStatus} + and bill_code in + + #{billCode} + + + and remark like concat('%', #{remark}, '%') and tenant_id like concat('%', #{tenantId}, '%') and del_flag like concat('%', #{delFlag}, '%') diff --git a/emis-biz/src/main/resources/mapper/EmisTmsSiteBatchMissMapper.xml b/emis-biz/src/main/resources/mapper/EmisTmsSiteBatchMissMapper.xml index 50de10d83..b8564e501 100644 --- a/emis-biz/src/main/resources/mapper/EmisTmsSiteBatchMissMapper.xml +++ b/emis-biz/src/main/resources/mapper/EmisTmsSiteBatchMissMapper.xml @@ -224,6 +224,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" AND m.miss_type = 1 + + AND m.miss_type = 4 + AND m.bill_code IN ( SELECT bill_code