# 堆垛机 TargetAddress 不可用时继续搜索 实施计划 > **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. **Goal:** 在 `SelectTask` 方法中,当 `TrySelectOutboundTask` 因 `TargetAddress` 不可用返回 null 时,增加同 NextAddress 其他任务的搜索逻辑。 **Architecture:** 在 `SelectTask` 的 `TrySelectOutboundTask(candidateTask)` 返回 null 之后、现有备选任务循环之前,插入同 NextAddress 任务搜索。 **Tech Stack:** C# / .NET 6+,SqlSugar ORM,Serilog --- ## 涉及文件 - 修改: `WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneTaskSelector.cs` --- ## Task 1: 修改 SelectTask 方法 - 添加同 NextAddress 任务搜索 **Files:** - Modify: `WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneTaskSelector.cs` - [ ] **Step 1: 找到 SelectTask 方法中的目标位置** 打开 `StackerCraneTaskSelector.cs`,找到 `SelectTask` 方法中的以下代码(约 lines 143-166): ```csharp // 尝试选择出库任务(可能需要移库检查和站台可用性判断) Dt_Task? selectedTask = TrySelectOutboundTask(candidateTask); if (selectedTask != null) { QuartzLogHelper.LogDebug(_logger, $"选中出库任务,任务号: {selectedTask.TaskNum}", commonStackerCrane.DeviceName); return selectedTask; } // 查找其他可用的出库站台 var otherOutStationCodes = _routerService .QueryNextRoutes(deviceCode, candidateTask.NextAddress, candidateTask.TaskType) .Select(x => x.ChildPosi) .ToList(); // 查询其他站台的出库任务 var tasks = _taskService.QueryStackerCraneOutTasks(deviceCode, otherOutStationCodes); foreach (var alternativeTask in tasks) { selectedTask = TrySelectOutboundTask(alternativeTask); if (selectedTask != null) { QuartzLogHelper.LogDebug(_logger, $"选中备选出库任务,任务号: {selectedTask.TaskNum}", commonStackerCrane.DeviceName); return selectedTask; } } ``` **Step 2: 在 `// 查找其他可用的出库站台` 之前插入同 NextAddress 搜索逻辑** 将: ```csharp // 查找其他可用的出库站台 var otherOutStationCodes = _routerService ... ``` 替换为: ```csharp // ===== TargetAddress 不可用时,先尝试同 NextAddress 的其他任务 ===== var sameStationTasks = _taskService .QueryStackerCraneOutTasks(deviceCode, new List { candidateTask.NextAddress }) .Where(x => x.TaskId != candidateTask.TaskId) .ToList(); foreach (var sameStationTask in sameStationTasks) { selectedTask = TrySelectOutboundTask(sameStationTask); if (selectedTask != null) { QuartzLogHelper.LogDebug(_logger, $"选中同站台备选出库任务,任务号: {selectedTask.TaskNum}", commonStackerCrane.DeviceName); return selectedTask; } } // ===== 同 NextAddress 无可用任务,尝试不同 NextAddress 的任务 ===== // 查找其他可用的出库站台 var otherOutStationCodes = _routerService .QueryNextRoutes(deviceCode, candidateTask.NextAddress, candidateTask.TaskType) .Select(x => x.ChildPosi) .ToList(); // 查询其他站台的出库任务 var tasks = _taskService.QueryStackerCraneOutTasks(deviceCode, otherOutStationCodes); foreach (var alternativeTask in tasks) { selectedTask = TrySelectOutboundTask(alternativeTask); if (selectedTask != null) { QuartzLogHelper.LogDebug(_logger, $"选中备选出库任务,任务号: {selectedTask.TaskNum}", commonStackerCrane.DeviceName); return selectedTask; } } ``` - [ ] **Step 3: Commit** ```bash git add WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneTaskSelector.cs git commit -m "feat(StackerCraneTaskSelector): TargetAddress不可用时搜索同NextAddress的其他任务 当 TrySelectOutboundTask 因 TargetAddress 输送线站台不空闲返回 null 时, 先尝试同 NextAddress 的其他出库任务,再尝试不同 NextAddress 的任务 Co-Authored-By: Claude Opus 4.7 " ``` --- ## Task 2: 验证构建 - [ ] **Step 1: 执行构建验证** ```bash cd D:/Git/ShanMeiXinNengYuan/Code dotnet build WCS/WIDESEAWCS_Server/WIDESEAWCS_Server.sln ``` 预期:无编译错误(测试项目的预存在错误可忽略) - [ ] **Step 2: 如有错误,分析并修复** 常见错误: - 类型不匹配 → 确认 `QueryStackerCraneOutTasks` 返回 `List` - 缺少 using → 添加 `using System.Linq;` --- ## 验证清单 - [ ] 同 NextAddress 任务搜索逻辑已添加在 `TrySelectOutboundTask` 返回 null 之后 - [ ] 使用 `TaskId` 过滤排除当前任务 - [ ] 同 NextAddress 无可用任务后继续尝试不同 NextAddress 的任务 - [ ] 日志记录"同站台备选出库任务" - [ ] 构建通过,无编译错误 - [ ] 已提交 commit