feat(wms): 优化批次分配策略以解决死锁和进程冲突问题

- 新增 checkDeadlock 方法检测任务执行是否会产生死锁
- 改进 generateNonDeadlockBatches 方法,增加对死锁和进程冲突的处理
- 实现增强版 DFS 检测环,并收集环中的节点- 添加进程依赖图构建和冲突进程对查找功能
- 优化批次分组算法,确保所有任务都被合理分配
This commit is contained in:
2025-08-15 11:25:48 +08:00
parent f3b2ac1f29
commit 59bd751cd7
3 changed files with 363 additions and 117 deletions

View File

@@ -5,6 +5,7 @@ import java.util.List;
import java.util.Arrays;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
import com.klp.domain.vo.BatchGroupVo;
import lombok.RequiredArgsConstructor;
@@ -107,39 +108,49 @@ public class WmsBatchController extends BaseController {
* 生成不会产生死锁的批次分配方案
* 相同processId的任务会合并到一个批次组中
* 不同processId的任务会放在不同的批次组中
* 对于存在死锁的情况,会避免将冲突的进程合并到一起
*
* @param rows 任务执行顺序数组
* @return 批次分配方案
*/
@PostMapping("/generate")
public R<List<BatchGroupVo>> generateNonDeadlockBatches(@RequestBody List<List<Map<String, Object>>> rows) {
// 先获取原始的批次分配方案
List<BatchGroupVo> originalBatches = iWmsBatchService.generateNonDeadlockBatches(rows);
// 检查是否存在死锁
boolean hasDeadlock = iWmsBatchService.checkDeadlock(rows);
// 获取批次分配方案
List<BatchGroupVo> batches = iWmsBatchService.generateNonDeadlockBatches(rows);
// 如果不存在死锁,才进行进一步合并
if (!hasDeadlock) {
// 使用Java 8 Stream API按processId分组并合并任务
Map<String, List<BatchGroupVo>> groupedByProcessId = batches.stream()
.collect(Collectors.groupingBy(BatchGroupVo::getProcessId));
// 使用Java 8 Stream API按processId分组并合并任务
Map<String, List<BatchGroupVo>> groupedByProcessId = originalBatches.stream()
.collect(java.util.stream.Collectors.groupingBy(BatchGroupVo::getProcessId));
// 合并相同processId的批次组
List<BatchGroupVo> mergedBatches = new ArrayList<>();
AtomicInteger groupCounter = new AtomicInteger(1);
// 合并相同processId的批次组
List<BatchGroupVo> mergedBatches = new ArrayList<>();
AtomicInteger groupCounter = new AtomicInteger(1);
groupedByProcessId.forEach((processId, groups) -> {
// 创建一个新的合并后的批次组
BatchGroupVo mergedGroup = new BatchGroupVo();
mergedGroup.setGroupId("Merged-Group-" + groupCounter.getAndIncrement());
mergedGroup.setProcessId(processId);
groupedByProcessId.forEach((processId, groups) -> {
// 创建一个新的合并后的批次组
BatchGroupVo mergedGroup = new BatchGroupVo();
mergedGroup.setGroupId("Merged-Group-" + groupCounter.getAndIncrement());
mergedGroup.setProcessId(processId);
// 合并所有taskIds
List<String> allTaskIds = groups.stream()
.flatMap(group -> group.getTaskIds().stream())
.collect(Collectors.toList());
mergedGroup.setTaskIds(allTaskIds);
// 合并所有taskIds
List<String> allTaskIds = groups.stream()
.flatMap(group -> group.getTaskIds().stream())
.collect(java.util.stream.Collectors.toList());
mergedGroup.setTaskIds(allTaskIds);
mergedBatches.add(mergedGroup);
});
return R.ok(mergedBatches);
mergedBatches.add(mergedGroup);
});
return R.ok(mergedBatches);
} else {
// 如果存在死锁直接返回Service层的结果不进行额外合并
return R.ok(batches);
}
}