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

TaskService.cs 重构实施计划

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: 将 1500+ 行的 TaskService.cs 拆分为 4 个 partial class 文件,保持业务逻辑不变,控制器调用方式不变。

Architecture: 使用 C# partial class 特性,将 TaskService 按功能模块拆分为 WCS、AGV、分容柜三个独立文件,主文件保留字段和构造函数。编译后合并为单一类型,对控制器完全透明。

Tech Stack: C# / ASP.NET Core 6.0 / partial class


文件结构

WIDESEA_TaskInfoService/
├── TaskService.cs                    # 精简后 ~100行:字段、构造函数
├── TaskService_WCS.cs               # ~550行:WCS逻辑处理
├── TaskService_AGV.cs               # ~280行:极卷库AGV任务
└── TaskService_GradingMachine.cs     # ~140行:分容柜接口

Task 1: 创建 TaskService_WCS.cs

Files:
- Create: WIDESEA_TaskInfoService/TaskService_WCS.cs
- Modify: WIDESEA_TaskInfoService/TaskService.cs(删除已迁移方法)

  • [ ] Step 1: 创建 TaskService_WCS.cs partial class 文件
using Mapster;
using MapsterMapper;
using Microsoft.Extensions.Configuration;
using SqlSugar;
using System.DirectoryServices.Protocols;
using System.Text.Json;
using WIDESEA_Common.LocationEnum;
using WIDESEA_Common.StockEnum;
using WIDESEA_Common.TaskEnum;
using WIDESEA_Common.WareHouseEnum;
using WIDESEA_Core;
using WIDESEA_Core.BaseRepository;
using WIDESEA_Core.BaseServices;
using WIDESEA_Core.Core;
using WIDESEA_Core.Enums;
using WIDESEA_Core.Helper;
using WIDESEA_DTO.GradingMachine;
using WIDESEA_DTO.MES;
using WIDESEA_DTO.Stock;
using WIDESEA_DTO.Task;
using WIDESEA_IBasicService;
using WIDESEA_IStockService;
using WIDESEA_ITaskInfoService;
using WIDESEA_Model.Models;

namespace WIDESEA_TaskInfoService
{
    public partial class TaskService
    {
        #region WCS逻辑处理

        /// <summary>
        /// 创建任务(组盘入库任务、空托盘回库任务)
        /// </summary>
        public async Task<WebResponseContent> CreateTaskInboundAsync(CreateTaskDto taskDto)
        {
            // ... 保持原有实现不变
        }

        /// <summary>
        /// 根据指定的任务详情异步创建新的出库任务
        /// </summary>
        public async Task<WebResponseContent> CreateTaskOutboundAsync(CreateTaskDto taskDto)
        {
            // ... 保持原有实现不变
        }

        // ... 其他 WCS 相关方法(见原文件 82-939 行)
        // GetTasksLocationAsync
        // InboundFinishTaskAsync
        // OutboundFinishTaskAsync
        // RelocationFinishTaskAsync
        // CreateTaskInboundTrayAsync
        // InboundFinishTaskTrayAsync
        // GetOutBoundTrayTaskAsync
        // OutboundFinishTaskTrayAsync
        // UpdateTaskByStatusAsync
        // CreateAutoOutboundTasksAsync
        // CreateRobotGroupPalletTaskAsync
        // CreateRobotChangePalletTaskAsync
        // CreateRobotSplitPalletTaskAsync
        // CreateRobotPalletTaskAsync
        // GetTaskByPalletCodeAsync (private, 复制到此文件)
        // CompleteTaskAsync (private, 复制到此文件)
        // DetermineTargetAddress (private, 复制到此文件)

        #endregion WCS逻辑处理
    }
}
  • [ ] Step 2: 验证编译

Run: dotnet build WIDESEA_WMSServer.sln
Expected: 无编译错误(WCS 方法暂时重复定义,下一步删除原文件中的实现)


Task 2: 创建 TaskService_AGV.cs

Files:
- Create: WIDESEA_TaskInfoService/TaskService_AGV.cs

  • [ ] Step 1: 创建 TaskService_AGV.cs partial class 文件
using Mapster;
using MapsterMapper;
using Microsoft.Extensions.Configuration;
using SqlSugar;
using System.DirectoryServices.Protocols;
using System.Text.Json;
using WIDESEA_Common.LocationEnum;
using WIDESEA_Common.StockEnum;
using WIDESEA_Common.TaskEnum;
using WIDESEA_Common.WareHouseEnum;
using WIDESEA_Core;
// ... 其他 using 与原文件一致

namespace WIDESEA_TaskInfoService
{
    public partial class TaskService
    {
        #region 极卷库任务模块

        /// <summary>
        /// 出入库申请
        /// </summary>
        public async Task<AGVResponse> ApplyInOutAsync(ApplyInOutDto applyInOutDto)
        {
            // ... 保持原有实现不变(见原文件 1132-1245 行)
        }

        /// <summary>
        /// 手动出库完成反馈给AGV
        /// </summary>
        public async Task<WebResponseContent> OutTaskComplete(OutTaskCompleteDto outTaskCompleteDto)
        {
            // ... 保持原有实现不变(见原文件 1252-1306 行)
        }

        /// <summary>
        /// 输送线申请进入
        /// </summary>
        public async Task<AGVResponse> ApplyEnterAsync(ApplyEnterDto applyEnterDto)
        {
            // ... 保持原有实现不变(见原文件 1339-1383 行)
        }

        /// <summary>
        /// 取放货完成
        /// </summary>
        public async Task<AGVResponse> TaskCompleteAsync(TaskCompleteDto taskCompleteDto)
        {
            // ... 保持原有实现不变(见原文件 1390-1463 行)
        }

        /// <summary>
        /// 任务取消
        /// </summary>
        public async Task<AGVResponse> TaskCancelAsync(TaskCancelDto taskCancelDto)
        {
            // ... 保持原有实现不变(见原文件 1470-1519 行)
        }

        #endregion 极卷库任务模块
    }
}
  • [ ] Step 2: 验证编译

Run: dotnet build WIDESEA_WMSServer.sln
Expected: 无编译错误


Task 3: 创建 TaskService_GradingMachine.cs

Files:
- Create: WIDESEA_TaskInfoService/TaskService_GradingMachine.cs

  • [ ] Step 1: 创建 TaskService_GradingMachine.cs partial class 文件
using Mapster;
using MapsterMapper;
using Microsoft.Extensions.Configuration;
using SqlSugar;
using System.DirectoryServices.Protocols;
using System.Text.Json;
using WIDESEA_Common.LocationEnum;
// ... 其他 using 与原文件一致

namespace WIDESEA_TaskInfoService
{
    public partial class TaskService
    {
        #region 分容柜接口

        /// <summary>
        /// 堆垛机取放货完成后物流通知化成分容柜完成信号
        /// </summary>
        public async Task<WebResponseContent> InOrOutCompletedAsync(GradingMachineInputDto input)
        {
            // ... 保持原有实现不变(见原文件 948-986 行)
        }

        /// <summary>
        /// 化成分容柜定时向物流更新分容柜状态信息
        /// </summary>
        public async Task<WebResponseContent> SendLocationStatusAsync(GradingMachineInputDto input)
        {
            // ... 保持原有实现不变(见原文件 993-1023 行)
        }

        /// <summary>
        /// 分容柜工作完成后调用此接口通知物流出库
        /// </summary>
        public async Task<WebResponseContent> RequestOutboundAsync(GradingMachineInputDto input)
        {
            // ... 保持原有实现不变(见原文件 1030-1082 行)
        }

        /// <summary>
        /// 入库完成分容调用获取托盘上每个通道电芯
        /// </summary>
        public async Task<WebResponseContent> GetPalletCodeCellAsync(GradingMachineInputDto input)
        {
            // ... 保持原有实现不变(见原文件 1089-1118 行)
        }

        #endregion 分容柜接口
    }
}
  • [ ] Step 2: 验证编译

Run: dotnet build WIDESEA_WMSServer.sln
Expected: 无编译错误


Task 4: 精简 TaskService.cs

Files:
- Modify: WIDESEA_TaskInfoService/TaskService.cs

  • [ ] Step 1: 删除已迁移到 partial 文件的方法实现

保留内容:
- 所有 using 语句
- namespace 声明
- partial class 声明
- 字段定义(_mapper, _stockInfoService 等)
- 构造函数
- Repository 属性
- TaskTypes / TaskOutboundTypes 属性
- AGV_OutTaskComplete / WCS_ReceiveTask 配置字段

删除内容:
- 所有 #region WCS逻辑处理 的方法实现
- 所有 #region 分容柜接口 的方法实现
- 所有 #region 极卷库任务模块 的方法实现
- CompleteTaskAsync、GetTaskByPalletCodeAsync、DetermineTargetAddress 私有方法

删除后文件结构:
```csharp
using Mapster;
using MapsterMapper;
// ... 所有 using

namespace WIDESEA_TaskInfoService
{
public partial class TaskService : ServiceBase<Dt_Task, IRepository>, ITaskService
{
// 字段 (~10行)
// 构造函数 (~15行)
// Repository 属性 (1行)
// TaskTypes 属性 (2行)
// AGV 配置字段 (2行)

    // 注意:原有的 #region WCS逻辑处理、分容柜接口、极卷库任务模块 region 块全部删除
    // 对应的方法实现已迁移到 partial class 文件
}

}
```

  • [ ] Step 2: 验证编译

Run: dotnet build WIDESEA_WMSServer.sln
Expected: 无编译错误,所有控制器端点正常


Task 5: 最终验证

  • [ ] Step 1: 完整编译

Run: dotnet build WIDESEA_WMSServer.sln
Expected: SUCCESS,无警告

  • [ ] Step 2: 检查文件行数

Run: wc -l WIDESEA_TaskInfoService/TaskService*.cs
Expected:
- TaskService.cs: ~100行
- TaskService_WCS.cs: ~550行
- TaskService_AGV.cs: ~280行
- TaskService_GradingMachine.cs: ~140行

  • [ ] Step 3: 提交代码
git add WIDESEA_TaskInfoService/TaskService*.cs
git commit -m "refactor(TaskService): 拆分为partial class模块化

- TaskService_WCS.cs: WCS逻辑处理(入库/出库/移库/机械手/自动出库)
- TaskService_AGV.cs: 极卷库AGV任务模块
- TaskService_GradingMachine.cs: 分容柜接口
- TaskService.cs: 保留字段/构造函数/接口声明

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>"