From 3c4dbf03110ae6495e03e2ef1fbd14def85e2c77 Mon Sep 17 00:00:00 2001 From: aike <17730485278@139.com> Date: Sat, 21 Jun 2025 13:23:18 +0800 Subject: [PATCH] =?UTF-8?q?demand:=20TMS-=E7=BC=85=E7=94=B8=E8=99=9A?= =?UTF-8?q?=E6=8B=9F=E5=8D=95=E8=B0=83=E6=95=B4=20committer:=20heyu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/emis/EmisTmsSiteBatchController.java | 1 + .../emis/mapper/EmisTransPlanRuleMapper.java | 31 +++++- .../erp/emis/service/EmisBaseService.java | 11 +- .../impl/EmisTmsSiteBatchMissServiceImpl.java | 105 ++++++++++++------ .../EmisWaybillAjustApplyServiceImpl.java | 3 + .../service/impl/EmisWaybillServiceImpl.java | 7 +- .../mapper/EmisTmsSiteBatchDtlMapper.xml | 1 + .../mapper/EmisTmsSiteBatchMissMapper.xml | 2 +- .../mapper/EmisTransPlanRuleMapper.xml | 81 +++++++++++++- .../resources/mapper/EmisWaybillMapper.xml | 1 + 10 files changed, 203 insertions(+), 40 deletions(-) diff --git a/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisTmsSiteBatchController.java b/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisTmsSiteBatchController.java index 4a366f643..b49685b38 100644 --- a/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisTmsSiteBatchController.java +++ b/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisTmsSiteBatchController.java @@ -15,6 +15,7 @@ import java.util.Arrays; import java.util.List; import javax.servlet.http.HttpServletResponse; +import com.xdadan.erp.emis.domain.exception.EmisBizError; import com.xdadan.erp.emis.utils.WaybillHelper; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisTransPlanRuleMapper.java b/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisTransPlanRuleMapper.java index 5adeb04bb..004cd7f9c 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisTransPlanRuleMapper.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisTransPlanRuleMapper.java @@ -104,10 +104,11 @@ public interface EmisTransPlanRuleMapper { * 根据产品类型名称查询产品类型信息 * * @param productTypeNames 产品类型名称列表 - * @param code 线路编码 + * @param code 线路编码 * @return 产品类型信息列表 */ - public List> selectProductTypeInfoByNamesAndLineCode(@Param("productTypeNames") List productTypeNames, @Param("lineCode") String code); + public List> selectProductTypeInfoByNamesAndLineCode( + @Param("productTypeNames") List productTypeNames, @Param("lineCode") String code); /** * 根据网点名称查询网点信息 @@ -139,4 +140,30 @@ public interface EmisTransPlanRuleMapper { * @return */ List selectEmisTransPlanRuleByLineCodes(@Param("lineCodes") List lineCodes); + + /** + * + * @param emisTransPlanRule + * @return + */ + List selectRulesForAllScan(EmisTransPlanRule emisTransPlanRule); + + /** + * 分页查询供应商线路规划(多线程用) + * + * @param emisTransPlanRule 查询条件 + * @param offset 偏移量 + * @param limit 每页数量 + * @return 供应商线路规划集合 + */ + List selectRulesForAllScanPaged(@Param("emisTransPlanRule") EmisTransPlanRule emisTransPlanRule, + @Param("offset") int offset, @Param("limit") int limit); + + /** + * 查询总数(多线程分页用) + * + * @param emisTransPlanRule 查询条件 + * @return 总数 + */ + int countForAllScan(EmisTransPlanRule emisTransPlanRule); } \ No newline at end of file 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 f3f92452d..c556ecbb0 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 @@ -4788,6 +4788,10 @@ public class EmisBaseService { } updateMasterWaybill(emisWaybillSave); // 做问题件录入 + scanProblemInfo(emisWaybillSave); + } + + public void scanProblemInfo(EmisWaybill emisWaybillSave) { String dispatchOrSendManCode = ""; if ("1".equals(emisWaybillSave.getPickupMethod())) { dispatchOrSendManCode = emisWaybillSave.getOperateEmployeeCode(); @@ -4816,7 +4820,7 @@ public class EmisBaseService { emisTmsScanRecordService.scan(scanInfoProm, dispatchOrSendManCode, emisWaybillSave.getSendSiteCode()); } - private void updateMasterWaybill(EmisWaybill emisWaybillSave) throws EmisBizError { + public void updateMasterWaybill(EmisWaybill emisWaybillSave) throws EmisBizError { EmisWaybill masterWaybill = checkVirtualParam(emisWaybillSave); String virtualRemark = masterWaybill.getVirtualRemark(); String virtualBillCode = emisWaybillSave.getBillCode(); @@ -4849,9 +4853,12 @@ public class EmisBaseService { throw new EmisBizError(EmisBizErrorType.FAIL, "主单号不存在"); } if (!emisWaybillSave.getReceiveCountry().equals(masterWaybill.getReceiveCountry()) - || !emisWaybillSave.getTransLineType().equals(masterWaybill.getTransLineType())) { + || !emisWaybillSave.getTransLineType().equals(masterWaybill.getTransLineType()) || !emisWaybillSave.getProductType().equals(masterWaybill.getProductType())) { throw new EmisBizError(EmisBizErrorType.FAIL, "主单和虚拟单线路不一致"); } + if ("1".equals(masterWaybill.getBlVirtual())) { + throw new EmisBizError(EmisBizErrorType.FAIL, "虚拟单不能作为主单"); + } List batchList = emisTmsSiteBatchMapper.selectEmisTmsSiteBatchListByBillCodes( Lists.newArrayList(Collections.singleton(emisWaybillSave.getMasterBillCode()))); 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 71b8cfc2c..39b2de422 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 @@ -48,9 +48,6 @@ public class EmisTmsSiteBatchMissServiceImpl extends EmisBaseService implements @Autowired private EmisTmsSiteBatchMissRecordMapper emisTmsSiteBatchMissRecordMapper; - private int totalBatchStatusRecords = 0; - private int totalMissRecords = 0; - /** * 查询TMS漏组批次信息 * @@ -142,6 +139,8 @@ public class EmisTmsSiteBatchMissServiceImpl extends EmisBaseService implements int totalProcessed = 0; int successCount = 0; int failCount = 0; + int totalBatchStatusRecords = 0; + int totalMissRecords = 0; List failedBillCodes = new ArrayList<>(); // 获取所有线路规划 @@ -162,7 +161,8 @@ public class EmisTmsSiteBatchMissServiceImpl extends EmisBaseService implements // 先查询所有数据 while (true) { - List waybills = emisWaybillMapper.selectWaybillListBySiteBatchStatus(offset, pageSize,lineCode); + List waybills = emisWaybillMapper.selectWaybillListBySiteBatchStatus(offset, pageSize, + lineCode); if (waybills.isEmpty()) { break; } @@ -192,6 +192,10 @@ public class EmisTmsSiteBatchMissServiceImpl extends EmisBaseService implements batches.add(allWaybills.subList(i, end)); } + if (CollectionUtil.isEmpty(batches)) { + return; + } + // 创建新的线程池处理数据 executorService = Executors.newFixedThreadPool(processors); List> processFutures = new ArrayList<>(); @@ -201,44 +205,52 @@ public class EmisTmsSiteBatchMissServiceImpl extends EmisBaseService implements } // 收集处理结果 + List allBatchStatus = new ArrayList<>(); + List allMissRecords = new ArrayList<>(); for (Future future : processFutures) { try { ProcessResult result = future.get(); successCount += result.getSuccessCount(); failCount += result.getFailCount(); failedBillCodes.addAll(result.getFailedBillCodes()); - - // 批量插入运单组批次状态记录 - if (!result.getBatchStatusList().isEmpty()) { - emisWaybillBatchStatusMapper.batchInsertEmisWaybillBatchStatus(result.getBatchStatusList()); - totalBatchStatusRecords += result.getBatchStatusList().size(); - } - - // 批量保存漏组记录 - if (!result.getMissRecords().isEmpty()) { - List filteredRecords = result.getMissRecords().stream() - .collect(Collectors.collectingAndThen( - Collectors.toMap( - record -> record.getBillCode() + "_" + record.getMissReason(), - record -> record, - (existing, replacement) -> existing), - map -> new ArrayList<>(map.values()))); - emisTmsSiteBatchMissMapper.batchInsertEmisTmsSiteBatchMiss(filteredRecords); - totalMissRecords += filteredRecords.size(); - } + allBatchStatus.addAll(result.getBatchStatusList()); + allMissRecords.addAll(result.getMissRecords()); } catch (Exception e) { log.error("Error processing batch", e); } } - // 关闭线程池 - executorService.shutdown(); + // 全局去重 + Map batchStatusMap = allBatchStatus.stream() + .collect(Collectors.toMap( + EmisWaybillBatchStatus::getBillCode, + v -> v, + (existing, replacement) -> existing)); + List uniqueBatchStatus = new ArrayList<>(batchStatusMap.values()); + + Map missMap = allMissRecords.stream() + .collect(Collectors.toMap( + r -> r.getBillCode() + "_" + r.getMissReason(), + v -> v, + (existing, replacement) -> existing)); + List uniqueMissRecords = new ArrayList<>(missMap.values()); + + // 批量插入 + if (!uniqueBatchStatus.isEmpty()) { + emisWaybillBatchStatusMapper.batchInsertEmisWaybillBatchStatus(uniqueBatchStatus); + totalBatchStatusRecords += uniqueBatchStatus.size(); + } + if (!uniqueMissRecords.isEmpty()) { + emisTmsSiteBatchMissMapper.batchInsertEmisTmsSiteBatchMiss(uniqueMissRecords); + totalMissRecords += uniqueMissRecords.size(); + } long endTime = System.currentTimeMillis(); long processTime = endTime - startTime; // 保存扫描记录 - saveRecord(totalProcessed, successCount, failCount, processTime, failedBillCodes); + 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: {}", @@ -253,7 +265,7 @@ public class EmisTmsSiteBatchMissServiceImpl extends EmisBaseService implements } private void saveRecord(int totalProcessed, int successCount, int failCount, long processTime, - List failedBillCodes) { + List failedBillCodes, int totalBatchStatusRecords, int totalMissRecords) { EmisTmsSiteBatchMissRecord record = new EmisTmsSiteBatchMissRecord(); record.setTotalProcessed(totalProcessed); record.setSuccessCount(successCount); @@ -385,6 +397,10 @@ public class EmisTmsSiteBatchMissServiceImpl extends EmisBaseService implements // 合并相同起始网点和下一网点的批次 Map mergedBatches = new HashMap<>(); for (EmisTmsSiteBatch batch : waybillBatches) { + if (StringUtils.isAnyBlank(batch.getStartSiteCode(), batch.getNextSiteCode(), + batch.getSupplierCode())) { + continue; + } String key = batch.getStartSiteCode() + "_" + batch.getNextSiteCode(); if (mergedBatches.containsKey(key)) { EmisTmsSiteBatch existingBatch = mergedBatches.get(key); @@ -426,11 +442,33 @@ public class EmisTmsSiteBatchMissServiceImpl extends EmisBaseService implements } public List selectEmisTransPlanRuleTree(String lineCode) { - log.info("Start querying supplier route plan tree"); + log.info("Start querying supplier route plan tree (multi-threaded)"); EmisTransPlanRule emisTransPlanRule = new EmisTransPlanRule(); emisTransPlanRule.setLineCode(lineCode); - List list = emisTransPlanRuleMapper.selectEmisTransPlanRuleList(emisTransPlanRule); - List tree = buildTree(list); + int pageSize = 100; + int total = emisTransPlanRuleMapper.countForAllScan(emisTransPlanRule); + int pageCount = (total + pageSize - 1) / pageSize; + int processors = Runtime.getRuntime().availableProcessors(); + ExecutorService executor = Executors.newFixedThreadPool(processors); + List>> futures = new ArrayList<>(); + for (int i = 0; i < pageCount; i++) { + int offset = i * pageSize; + futures.add(executor.submit( + () -> emisTransPlanRuleMapper.selectRulesForAllScanPaged(emisTransPlanRule, offset, pageSize))); + } + List allRules = new ArrayList<>(); + for (Future> future : futures) { + try { + List rules = future.get(); + if (rules != null) { + allRules.addAll(rules); + } + } catch (Exception e) { + log.error("Error getting trans plan rule results", e); + } + } + executor.shutdown(); + List tree = buildTree(allRules); log.info("Queried supplier route plan tree, node count={}", tree != null ? tree.size() : 0); return tree; } @@ -518,7 +556,7 @@ public class EmisTmsSiteBatchMissServiceImpl extends EmisBaseService implements } private boolean checkRule(EmisTransPlanRule rule, List waybillBatches, - List list) { + List list) { // 检查当前节点是否匹配 boolean currentMatch = false; for (EmisTmsSiteBatch batch : waybillBatches) { @@ -617,7 +655,7 @@ public class EmisTmsSiteBatchMissServiceImpl extends EmisBaseService implements * 递归检查下一级节点 */ private boolean checkNextLevel(Set currentLevelRules, - List waybillBatches, List list) { + List waybillBatches, List list) { // 如果当前级为空,说明已经到底了,返回true if (currentLevelRules.isEmpty()) { return true; @@ -708,7 +746,8 @@ public class EmisTmsSiteBatchMissServiceImpl extends EmisBaseService implements .anyMatch( filterRule -> filterRule.getStartSiteCode().equals(childRule.getStartSiteCode()) && filterRule.getNextSiteCode().equals(childRule.getNextSiteCode()) && - compareSupplierCodes(filterRule.getSupplierCode(), childRule.getSupplierCode()))); + compareSupplierCodes(filterRule.getSupplierCode(), + childRule.getSupplierCode()))); if (!hasMatchedChild) { // 如果所有子节点都不匹配,为每个子节点创建漏组记录 diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisWaybillAjustApplyServiceImpl.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisWaybillAjustApplyServiceImpl.java index 9089c8cfe..262c6ae57 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisWaybillAjustApplyServiceImpl.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisWaybillAjustApplyServiceImpl.java @@ -140,6 +140,9 @@ public class EmisWaybillAjustApplyServiceImpl extends EmisBaseService implements checkUseQuotaCredit(emisWaybillOld, getEmisWaybillNewFromJson(emisWaybillAjustApply)); } + // 校验虚拟单逻辑 + checkVirtualParam(getEmisWaybillNewFromJson(emisWaybillAjustApply)); + // 插入数据 emisWaybillAjustApplyMapper.insertEmisWaybillAjustApply(emisWaybillAjustApply); diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisWaybillServiceImpl.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisWaybillServiceImpl.java index 21ab3699e..e73691faa 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisWaybillServiceImpl.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisWaybillServiceImpl.java @@ -3116,6 +3116,11 @@ public class EmisWaybillServiceImpl extends EmisBaseService implements IEmisWayb // 检查信用额度 checkUseQuotaCredit(null,emisWaybillSave); + // 虚拟件逻辑 + if ("1".equals(emisWaybillSave.getBlVirtual())) { + updateMasterWaybill(emisWaybillSave); + } + //插入新单 emisWaybillMapper.insertEmisWaybill(emisWaybillSave); @@ -3220,7 +3225,7 @@ public class EmisWaybillServiceImpl extends EmisBaseService implements IEmisWayb } // 处理虚拟件逻辑 - handleVirtual(emisWaybillSave); + scanProblemInfo(emisWaybillSave); // 运单立即重新出账 try { diff --git a/emis-biz/src/main/resources/mapper/EmisTmsSiteBatchDtlMapper.xml b/emis-biz/src/main/resources/mapper/EmisTmsSiteBatchDtlMapper.xml index c0cc5735f..9db188fac 100644 --- a/emis-biz/src/main/resources/mapper/EmisTmsSiteBatchDtlMapper.xml +++ b/emis-biz/src/main/resources/mapper/EmisTmsSiteBatchDtlMapper.xml @@ -191,5 +191,6 @@ left join emis_tms_site_batch_dtl b on a.bill_code = b.bill_code and b.del_flag = '0' where b.batch_no = #{batchNo} and a.del_flag = '0' + and a.send_date ]]> '2025-01-01 00:00:00' \ No newline at end of file diff --git a/emis-biz/src/main/resources/mapper/EmisTmsSiteBatchMissMapper.xml b/emis-biz/src/main/resources/mapper/EmisTmsSiteBatchMissMapper.xml index 0658a1fa4..4005615bf 100644 --- a/emis-biz/src/main/resources/mapper/EmisTmsSiteBatchMissMapper.xml +++ b/emis-biz/src/main/resources/mapper/EmisTmsSiteBatchMissMapper.xml @@ -154,7 +154,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - AND m.bill_code = #{billCode} + AND m.bill_code REGEXP REPLACE(#{billCode}, '\n', '|') AND m.miss_reason like concat('%', #{missReason}, '%') diff --git a/emis-biz/src/main/resources/mapper/EmisTransPlanRuleMapper.xml b/emis-biz/src/main/resources/mapper/EmisTransPlanRuleMapper.xml index 8535ab645..334bf7eaa 100644 --- a/emis-biz/src/main/resources/mapper/EmisTransPlanRuleMapper.xml +++ b/emis-biz/src/main/resources/mapper/EmisTransPlanRuleMapper.xml @@ -61,8 +61,46 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" order by id desc + + + + + + \ No newline at end of file diff --git a/emis-biz/src/main/resources/mapper/EmisWaybillMapper.xml b/emis-biz/src/main/resources/mapper/EmisWaybillMapper.xml index d6f9894ad..d71892e5f 100644 --- a/emis-biz/src/main/resources/mapper/EmisWaybillMapper.xml +++ b/emis-biz/src/main/resources/mapper/EmisWaybillMapper.xml @@ -3763,6 +3763,7 @@ and a.trans_line_type = #{lineCode} + and a.send_date ]]> '2025-01-01 00:00:00' and (a.virtual_remark is null or virtual_remark = '') order by a.create_time desc limit #{offset}, #{pageSize}