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: 补全 OutboundTaskFlowService.MoveToNextStatus 方法中的 TODO,实现在出库任务到达 Line_OutFinish 状态时检查对向线体托盘号,有托盘号则本地创建机械手任务,无托盘号则从 WMS 获取任务。
Architecture: 在 RobotTaskService 中新增 CheckSourceLineAndCreateRobotTask 方法,复用已有的 BuildRobotTaskStock 获取源线体编号,通过设备通信读取线体托盘号,根据结果决定调用 CreateLocalRobotTask 或 GetWMSOutboundTrayTask。
Tech Stack: C# / .NET 6, ASP.NET Core, SqlSugar ORM
| 文件 | 改动 |
|---|---|
WIDESEAWCS_TaskInfoService/RobotTaskService.cs |
新增 CheckSourceLineAndCreateRobotTask 方法 |
WIDESEAWCS_TaskInfoService/Flows/OutboundTaskFlowService.cs |
替换 TODO 代码段为委托调用 |
Files:
- Modify: WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/RobotTaskService.cs:241(在 CreateLocalRobotTask 方法之后)
CreateLocalRobotTask 方法后添加新方法在 RobotTaskService.cs 第 240 行(CreateLocalRobotTask 方法结束后的位置)添加以下方法:
/// <summary>
/// 检查源线体是否有托盘号,并根据结果创建机械手任务。
/// </summary>
/// <param name="task">出库任务实体</param>
/// <returns>
/// 有托盘号时返回 CreateLocalRobotTask 结果;
/// 无托盘号时返回 GetWMSOutboundTrayTask 结果。
/// </returns>
public WebResponseContent CheckSourceLineAndCreateRobotTask(Dt_Task task)
{
// 1. 获取源线体编号(复用已有逻辑)
string configKey = ResolveRobotTaskConfigKey(task.TargetAddress);
StockDTO stock = BuildRobotTaskStock(task, configKey);
string sourceLineNo = stock.SourceLineNo;
if (string.IsNullOrWhiteSpace(sourceLineNo))
{
return GetWMSOutboundTrayTask(task);
}
// 2. 通过设备通信读取线体托盘号
string? palletCode = ReadLineBarcode(sourceLineNo);
if (!string.IsNullOrWhiteSpace(palletCode))
{
// 有托盘号,本地创建机械手任务
return CreateLocalRobotTask(task);
}
// 无托盘号,从 WMS 获取任务
return GetWMSOutboundTrayTask(task);
}
/// <summary>
/// 读取指定线体的托盘号。
/// </summary>
/// <param name="sourceLineNo">源线体编号</param>
/// <returns>托盘号,如有异常返回 null</returns>
private string? ReadLineBarcode(string sourceLineNo)
{
try
{
IDevice? device = Storage.Devices.FirstOrDefault(x =>
x.DeviceProDTOs.Any(d => d.DeviceChildCode == sourceLineNo));
if (device == null)
return null;
CommonConveyorLine conveyorLine = (CommonConveyorLine)device;
return conveyorLine.GetValue<ConveyorLineDBNameNew, string>(
ConveyorLineDBNameNew.Barcode, sourceLineNo);
}
catch (Exception ex)
{
_logger.Error(ex, $"读取线体[{sourceLineNo}]托盘号异常");
return null;
}
}
Run: dotnet build WIDESEAWCS_Server/WIDESEAWCS_Server.sln --no-restore
Expected: BUILD SUCCEEDED(无编译错误)
git add WIDESEAWCS_TaskInfoService/RobotTaskService.cs
git commit -m "feat(机械手任务): 新增CheckSourceLineAndCreateRobotTask方法支持检查线体托盘号决策
- 新增CheckSourceLineAndCreateRobotTask方法,根据源线体托盘号决定创建机械手任务方式
- 新增ReadLineBarcode私有方法,读取指定线体的托盘号
- 有托盘号时调用CreateLocalRobotTask,无托盘号时调用GetWMSOutboundTrayTask
- 异常时降级为从WMS获取任务"
Files:
- Modify: WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Flows/OutboundTaskFlowService.cs:107-114
将 OutboundTaskFlowService.cs 第 107-114 行:
if (task.TaskStatus == (int)TaskOutStatusEnum.Line_OutFinish && task.TaskType == (int)TaskOutboundTypeEnum.Outbound)
{
return WebResponseContent.Instance.OK();
// Todo:获取对向线体是否有托盘号,如果有托盘号直接生成机械手任务
return GetWMSOutboundTrayTask(task);
}
替换为:
if (task.TaskStatus == (int)TaskOutStatusEnum.Line_OutFinish && task.TaskType == (int)TaskOutboundTypeEnum.Outbound)
{
// 获取对向线体是否有托盘号,如果有托盘号直接生成机械手任务
return _robotTaskService.CheckSourceLineAndCreateRobotTask(task);
}
Run: dotnet build WIDESEAWCS_Server/WIDESEAWCS_Server.sln --no-restore
Expected: BUILD SUCCEEDED(无编译错误)
git add WIDESEAWCS_TaskInfoService/Flows/OutboundTaskFlowService.cs
git commit -m "feat(出库任务): MoveToNextStatus调用CheckSourceLineAndCreateRobotTask决策机械手任务创建方式
- 替换TODO代码段为_robotTaskService.CheckSourceLineAndCreateRobotTask调用
- 有托盘号时本地创建机械手任务,无托盘号时从WMS获取"
ReadLineBarcode 方法复用了 BuildRobotTaskStock 中读取 Barcode 的设备查询逻辑(见 RobotTaskService.cs:365-374)GetWMSOutboundTrayTaskdocs/superpowers/specs/2026-04-29-outbound-task-flow-todo-design.md