From b7fccc8ba06b6108dd4b910c17736d599dc77b93 Mon Sep 17 00:00:00 2001 From: Joshi <3040996759@qq.com> Date: Thu, 14 Aug 2025 16:55:34 +0800 Subject: [PATCH] =?UTF-8?q?fix(wms):=20=E4=BC=98=E5=8C=96=E6=89=B9?= =?UTF-8?q?=E6=AC=A1=E5=88=86=E9=85=8D=E7=AD=96=E7=95=A5=EF=BC=8C=E7=A1=AE?= =?UTF-8?q?=E4=BF=9D=E7=9B=B8=E5=90=8C=E8=BF=9B=E7=A8=8B=E7=9A=84=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E5=90=88=E5=B9=B6=E6=89=A7=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加任务执行顺序数组的成员变量 - 在检查死锁和生成无死锁批次时保存任务执行顺序数组 - 修改任务排序字段从 "sequence" 改为 "sequare" - 在拓扑排序时按进程 ID 对任务进行分组,确保相同进程的任务合并到同一个批次 --- .../klp/service/impl/WmsBatchServiceImpl.java | 49 ++++++++++++++----- 1 file changed, 38 insertions(+), 11 deletions(-) diff --git a/klp-wms/src/main/java/com/klp/service/impl/WmsBatchServiceImpl.java b/klp-wms/src/main/java/com/klp/service/impl/WmsBatchServiceImpl.java index 4a54f971..928644a9 100644 --- a/klp-wms/src/main/java/com/klp/service/impl/WmsBatchServiceImpl.java +++ b/klp-wms/src/main/java/com/klp/service/impl/WmsBatchServiceImpl.java @@ -29,6 +29,8 @@ import java.util.stream.Collectors; public class WmsBatchServiceImpl implements IWmsBatchService { private final WmsBatchMapper baseMapper; + // 存储任务执行顺序数组的成员变量 + private List>> rows; /** * 查询批次(合并相同工艺的任务) @@ -120,6 +122,9 @@ public class WmsBatchServiceImpl implements IWmsBatchService { */ @Override public boolean checkDeadlock(List>> rows) { + // 保存任务执行顺序数组 + this.rows = rows; + // 构建进程依赖图 Map> graph = buildDependencyGraph(rows); @@ -135,6 +140,9 @@ public class WmsBatchServiceImpl implements IWmsBatchService { */ @Override public List generateNonDeadlockBatches(List>> rows) { + // 保存任务执行顺序数组 + this.rows = rows; + // 获取所有任务 Set allTasks = new HashSet<>(); for (List> row : rows) { @@ -168,8 +176,8 @@ public class WmsBatchServiceImpl implements IWmsBatchService { // 遍历每一行,记录每个进程在每一行的执行顺序 for (List> row : rows) { - // 按sequence排序 - row.sort(Comparator.comparingInt(task -> Integer.parseInt(task.get("sequence").toString()))); + // 按sequare排序 + row.sort(Comparator.comparingInt(task -> Integer.parseInt(task.get("sequare").toString()))); // 记录每个进程的执行顺序 for (int i = 0; i < row.size(); i++) { @@ -204,7 +212,7 @@ public class WmsBatchServiceImpl implements IWmsBatchService { // 遍历每一行,记录进程间的依赖关系 for (List> row : rows) { // 按sequare排序 - row.sort(Comparator.comparingInt(task -> Integer.parseInt(task.get("sequence").toString()))); + row.sort(Comparator.comparingInt(task -> Integer.parseInt(task.get("sequare").toString()))); // 构建依赖关系 for (int i = 0; i < row.size() - 1; i++) { @@ -228,8 +236,8 @@ public class WmsBatchServiceImpl implements IWmsBatchService { // 遍历每一行,记录任务间的依赖关系 for (List> row : rows) { - // 按sequence排序 - row.sort(Comparator.comparingInt(task -> Integer.parseInt(task.get("sequence").toString()))); + // 按sequare排序 + row.sort(Comparator.comparingInt(task -> Integer.parseInt(task.get("sequare").toString()))); // 构建依赖关系 for (int i = 0; i < row.size() - 1; i++) { @@ -300,8 +308,19 @@ public class WmsBatchServiceImpl implements IWmsBatchService { /** * 使用拓扑排序生成批次分配方案 + * 确保相同processId的任务才能合并到同一个批次 */ private List> topologicalSort(Map> processGraph, Map> taskGraph, Set allTasks) { + // 获取任务与进程的映射关系 + Map taskToProcess = new HashMap<>(); + for (List> row : rows) { + for (Map task : row) { + String taskId = task.get("taskId").toString(); + String processId = task.get("processId").toString(); + taskToProcess.put(taskId, processId); + } + } + // 计算每个任务的入度 Map inDegree = new HashMap<>(); for (String task : allTasks) { @@ -327,14 +346,18 @@ public class WmsBatchServiceImpl implements IWmsBatchService { // 进行拓扑排序 while (!queue.isEmpty()) { - // 当前批次的任务 - Set currentBatch = new HashSet<>(); + // 按进程ID分组的当前批次任务 + Map> processBatches = new HashMap<>(); // 处理当前队列中的所有任务(这些任务可以并行执行) int size = queue.size(); for (int i = 0; i < size; i++) { String task = queue.poll(); - currentBatch.add(task); + String processId = taskToProcess.get(task); + + // 按进程ID分组 + processBatches.putIfAbsent(processId, new HashSet<>()); + processBatches.get(processId).add(task); // 更新依赖于当前任务的任务的入度 for (Map.Entry> entry : taskGraph.entrySet()) { @@ -352,12 +375,16 @@ public class WmsBatchServiceImpl implements IWmsBatchService { } } - // 添加当前批次 - if (!currentBatch.isEmpty()) { - batches.add(currentBatch); + // 将每个进程的任务作为一个批次添加 + for (Set batch : processBatches.values()) { + if (!batch.isEmpty()) { + batches.add(batch); + } } } return batches; } + + }