feat(wms): 优化批次分配策略以解决死锁和进程冲突问题
- 新增 checkDeadlock 方法检测任务执行是否会产生死锁 - 改进 generateNonDeadlockBatches 方法,增加对死锁和进程冲突的处理 - 实现增强版 DFS 检测环,并收集环中的节点- 添加进程依赖图构建和冲突进程对查找功能 - 优化批次分组算法,确保所有任务都被合理分配
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user