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

OutboundTaskFlowService.MoveToNextStatus TODO 实现计划

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 获取源线体编号,通过设备通信读取线体托盘号,根据结果决定调用 CreateLocalRobotTaskGetWMSOutboundTrayTask

Tech Stack: C# / .NET 6, ASP.NET Core, SqlSugar ORM


涉及文件

文件 改动
WIDESEAWCS_TaskInfoService/RobotTaskService.cs 新增 CheckSourceLineAndCreateRobotTask 方法
WIDESEAWCS_TaskInfoService/Flows/OutboundTaskFlowService.cs 替换 TODO 代码段为委托调用

Task 1: 在 RobotTaskService 新增 CheckSourceLineAndCreateRobotTask 方法

Files:
- Modify: WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/RobotTaskService.cs:241(在 CreateLocalRobotTask 方法之后)

  • [ ] Step 1: 在 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;
    }
}
  • [ ] Step 2: 验证编译

Run: dotnet build WIDESEAWCS_Server/WIDESEAWCS_Server.sln --no-restore
Expected: BUILD SUCCEEDED(无编译错误)

  • [ ] Step 3: 提交
git add WIDESEAWCS_TaskInfoService/RobotTaskService.cs
git commit -m "feat(机械手任务): 新增CheckSourceLineAndCreateRobotTask方法支持检查线体托盘号决策

- 新增CheckSourceLineAndCreateRobotTask方法,根据源线体托盘号决定创建机械手任务方式
- 新增ReadLineBarcode私有方法,读取指定线体的托盘号
- 有托盘号时调用CreateLocalRobotTask,无托盘号时调用GetWMSOutboundTrayTask
- 异常时降级为从WMS获取任务"

Task 2: 修改 OutboundTaskFlowService.MoveToNextStatus 调用新方法

Files:
- Modify: WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Flows/OutboundTaskFlowService.cs:107-114

  • [ ] Step 1: 替换 TODO 代码段

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);
}
  • [ ] Step 2: 验证编译

Run: dotnet build WIDESEAWCS_Server/WIDESEAWCS_Server.sln --no-restore
Expected: BUILD SUCCEEDED(无编译错误)

  • [ ] Step 3: 提交
git add WIDESEAWCS_TaskInfoService/Flows/OutboundTaskFlowService.cs
git commit -m "feat(出库任务): MoveToNextStatus调用CheckSourceLineAndCreateRobotTask决策机械手任务创建方式

- 替换TODO代码段为_robotTaskService.CheckSourceLineAndCreateRobotTask调用
- 有托盘号时本地创建机械手任务,无托盘号时从WMS获取"

验证要点

  1. 当输送线有料时(对向线体 Barcode 有值),机械手任务直接本地创建,不调用 WMS 接口
  2. 当输送线无料时(对向线体 Barcode 为空),降级调用 WMS 获取空托盘任务
  3. 异常场景不阻塞主流程,降级到 WMS 获取

注意事项

  • ReadLineBarcode 方法复用了 BuildRobotTaskStock 中读取 Barcode 的设备查询逻辑(见 RobotTaskService.cs:365-374
  • 异常处理返回 null,触发降级逻辑调用 GetWMSOutboundTrayTask
  • 设计文档位置:docs/superpowers/specs/2026-04-29-outbound-task-flow-todo-design.md