wanshenmean
2026-03-31 f6488c33d3855647314b7799ae0b2f54227ee62f
docs: 添加 TaskService 重构实施计划

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
已添加1个文件
338 ■■■■■ 文件已修改
Code/WMS/docs/superpowers/plans/2026-03-31-taskService-refactor-plan.md 338 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Code/WMS/docs/superpowers/plans/2026-03-31-taskService-refactor-plan.md
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,338 @@
# 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 æ–‡ä»¶**
```csharp
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 æ–‡ä»¶**
```csharp
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 æ–‡ä»¶**
```csharp
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<Dt_Task>>, 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: æäº¤ä»£ç **
```bash
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>"
```