# 手动创建任务功能设计 ## 1. 需求概述 在 WMS 界面上添加手动创建任务功能。用户输入起点、终点、条码、仓库ID,系统自动生成任务号等字段,发送给 WCS。WCS 根据起点是否为线体点位(11068/11010/11001)判断是否需要写入输送线任务。 ## 2. 整体流程 ``` 用户(WMS界面) ↓ 输入:任务类型/起点/终点/条码/仓库ID WMS后端 ↓ 调用 BaseDal.GetTaskNo() 生成 TaskNum ↓ 根据任务类型设置状态 ↓ 调用 WCS ReceiveTask WCS后端 ↓ 判断起点是否为线体点位(11068/11010/11001) ↓ 是 → 查 Storage.Devices 获取输送线实例 ↓ 写入输送线任务(起点/终点/任务号等) ↓ 返回成功 ``` ## 3. WMS 前端改动 ### 3.1 任务页面 (`task.vue`) 在现有任务管理页面添加**手动创建任务**按钮,弹出对话框。 ### 3.2 对话框字段 | 字段 | 类型 | 说明 | |------|------|------| | 任务类型 | 下拉框 | 入库 / 出库 / 移库 | | 起点地址 | 输入框 | 用户输入,如 11068 | | 终点地址 | 输入框 | 用户输入 | | 条码 | 输入框 | 用户输入 | | 仓库ID | 输入框 | 用户输入 | | 优先级 | 只读 | 默认值 1 | ## 4. WMS 后端改动 ### 4.1 新增接口 **Controller:** `TaskController.cs` ``` POST /api/Task/CreateManualTask ``` ### 4.2 Service 方法 **TaskService.cs** 新增 `CreateManualTaskAsync` 方法: ```csharp public async Task CreateManualTaskAsync(CreateManualTaskDto dto) { // 1. 调用 BaseDal.GetTaskNo() 生成 TaskNum // 2. 根据任务类型设置状态 // - 入库 → InNew (200) // - 出库 → OutNew (100) // - 移库 → RelocationNew (300) // 3. 构建 Dt_Task 实体 // 4. 调用 WCS ReceiveTask (POST /api/Task/ReceiveTask) // 5. 返回结果 } ``` ### 4.3 DTO 定义 ```csharp public class CreateManualTaskDto { public int TaskType { get; set; } // 1=入库, 2=出库, 3=移库 public string SourceAddress { get; set; } public string TargetAddress { get; set; } public string Barcode { get; set; } public int WarehouseId { get; set; } public int Grade { get; set; } = 1; // 默认优先级1 } ``` ## 5. WCS 后端改动 ### 5.1 已有逻辑复用 `ReceiveWMSTask` 方法已支持接收 WMS 任务并分发到对应 FlowService: - 入库任务 → `InboundTaskFlowService.InitializeOnReceive()` - 出库任务 → `OutboundTaskFlowService.InitializeOnReceive()` - 移库任务 → `RelocationTaskFlowService.InitializeOnReceive()` ### 5.2 线体点位判断 在 `InboundTaskFlowService.InitializeOnReceive()` 中,判断 `SourceAddress` 是否为线体点位(11068/11010/11001)。这三个点位均为**入库线体点位**。 ### 5.3 获取输送线实例 ```csharp var conveyorLine = Storage.Devices .FirstOrDefault(x => x.DeviceProDTOs.Any(d => d.DeviceChildCode == sourceAddress)); ``` ### 5.4 新增:写入输送线任务 **此逻辑为新增**,目前 FlowService 中不存在写入输送线的逻辑,需要在判断为线体点位后新增: 1. 获取输送线实例成功后,读取源线体号 2. 构造 `ConveyorLineTaskCommandNew` 对象 3. 调用 `conveyorLine.WriteCustomer(sourceLineNo, command)` 写入 PLC 写入字段: - `TaskNo` = WCS 分配的任务号 - `Source` = 起点地址 - `Target` = 终点地址 - `Barcode` = 条码 - `WCS_STB` = 1 (标记WCS已发送) ### 5.5 重复任务处理 `ReceiveWMSTask` 中已有重复任务检查逻辑(根据 TaskNum 或 PalletCode),手动创建时如遇重复返回错误。 ## 6. 任务状态枚举 | 类型 | 新建状态 | 状态值 | |------|----------|--------| | 入库 | InNew | 200 | | 出库 | OutNew | 100 | | 移库 | RelocationNew | 300 | ## 7. 错误处理 - 任务号获取失败 → 返回错误 - WCS 查找输送线实例失败 → 返回错误给 WMS - 写入 PLC 失败 → 返回错误,WMS 任务状态保持新建 - WCS 返回重复任务 → 返回错误给 WMS ## 8. 涉及的源文件 ### WMS 前端 - `WMS/WIDESEA_WMSClient/src/views/taskinfo/task.vue` - `WMS/WIDESEA_WMSClient/src/extension/taskinfo/task.js` ### WMS 后端 - `WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs` - `WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/TaskInfo/TaskController.cs` ### WCS 后端 - `WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs` - `WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Flows/InboundTaskFlowService.cs` - `WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Flows/OutboundTaskFlowService.cs` - `WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Flows/RelocationTaskFlowService.cs` - `WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/ConveyorLineDispatchHandler.cs` (参考写入模式) - `WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/ConveyorLine/ConveyorLineTaskCommandNew.cs` (任务命令结构)