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.csFiles:
- Modify: WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneTaskSelector.cs
打开 StackerCraneTaskSelector.cs,找到 SelectTask 方法中的以下代码(约 lines 143-166):
// 尝试选择出库任务(可能需要移库检查和站台可用性判断)
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;
}
}
```
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 <noreply@anthropic.com>"
cd D:/Git/ShanMeiXinNengYuan/Code
dotnet build WCS/WIDESEAWCS_Server/WIDESEAWCS_Server.sln
预期:无编译错误(测试项目的预存在错误可忽略)
常见错误:
- 类型不匹配 → 确认 QueryStackerCraneOutTasks 返回 List<Dt_Task>
- 缺少 using → 添加 using System.Linq;
TrySelectOutboundTask 返回 null 之后TaskId 过滤排除当前任务