编辑 | blame | 历史 | 原始文档

堆垛机 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 方法中,当 TrySelectOutboundTaskTargetAddress 不可用返回 null 时,增加同 NextAddress 其他任务的搜索逻辑。

Architecture:SelectTaskTrySelectOutboundTask(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):

// 尝试选择出库任务(可能需要移库检查和站台可用性判断)
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
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>"

Task 2: 验证构建

  • [ ] Step 1: 执行构建验证
cd D:/Git/ShanMeiXinNengYuan/Code
dotnet build WCS/WIDESEAWCS_Server/WIDESEAWCS_Server.sln

预期:无编译错误(测试项目的预存在错误可忽略)

  • [ ] Step 2: 如有错误,分析并修复

常见错误:
- 类型不匹配 → 确认 QueryStackerCraneOutTasks 返回 List<Dt_Task>
- 缺少 using → 添加 using System.Linq;


验证清单

  • [ ] 同 NextAddress 任务搜索逻辑已添加在 TrySelectOutboundTask 返回 null 之后
  • [ ] 使用 TaskId 过滤排除当前任务
  • [ ] 同 NextAddress 无可用任务后继续尝试不同 NextAddress 的任务
  • [ ] 日志记录"同站台备选出库任务"
  • [ ] 构建通过,无编译错误
  • [ ] 已提交 commit