From cff279ab12d8d3d77bae12cfb0438ecbafada6b1 Mon Sep 17 00:00:00 2001
From: wanshenmean <cathay_xy@163.com>
Date: 星期一, 30 三月 2026 10:50:20 +0800
Subject: [PATCH] docs: 添加 MES 托盘进站出站集成实现计划

---
 Code/WMS/docs/superpowers/plans/2026-03-30-MES托盘进站出站集成实现计划.md |  297 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 297 insertions(+), 0 deletions(-)

diff --git "a/Code/WMS/docs/superpowers/plans/2026-03-30-MES\346\211\230\347\233\230\350\277\233\347\253\231\345\207\272\347\253\231\351\233\206\346\210\220\345\256\236\347\216\260\350\256\241\345\210\222.md" "b/Code/WMS/docs/superpowers/plans/2026-03-30-MES\346\211\230\347\233\230\350\277\233\347\253\231\345\207\272\347\253\231\351\233\206\346\210\220\345\256\236\347\216\260\350\256\241\345\210\222.md"
new file mode 100644
index 0000000..5875b44
--- /dev/null
+++ "b/Code/WMS/docs/superpowers/plans/2026-03-30-MES\346\211\230\347\233\230\350\277\233\347\253\231\345\207\272\347\253\231\351\233\206\346\210\220\345\256\236\347\216\260\350\256\241\345\210\222.md"
@@ -0,0 +1,297 @@
+# MES 鎵樼洏杩涚珯鍑虹珯闆嗘垚瀹炵幇璁″垝
+
+> **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:** 鍦� TaskService 鐨勫叆搴撳畬鎴�/鍑哄簱瀹屾垚鏂规硶涓泦鎴� MES 杩涚珯/鍑虹珯璋冪敤锛屾柊澧炵┖鎵樼洏鍏ュ簱/鍑哄簱瀹屾垚鏂规硶銆�
+
+**Architecture:** 鍦� `ExecuteWithinTransactionAsync` 浜嬪姟鍐呮坊鍔� MES 璋冪敤锛孧ES 澶辫触鍒欎簨鍔″洖婊氥��
+
+**Tech Stack:** ASP.NET Core 6.0, IMesService, ExecuteWithinTransactionAsync
+
+---
+
+## 浠诲姟鎬昏
+
+| 浠诲姟 | 鏂规硶 | 鎿嶄綔 |
+|------|------|------|
+| Task 1 | `InboundFinishTaskAsync` | 娣诲姞 `InboundInContainer` 璋冪敤 |
+| Task 2 | `OutboundFinishTaskAsync` | 娣诲姞 `OutboundInContainer` 璋冪敤 |
+| Task 3 | `InboundFinishTaskTrayAsync`锛堟柊澧烇級 | 绌烘墭鐩樺叆搴撳畬鎴愶紝鏃犻渶 MES |
+| Task 4 | `OutboundFinishTaskTrayAsync`锛堟柊澧烇級 | 绌烘墭鐩樺嚭搴撳畬鎴愶紝鏃犻渶 MES |
+
+---
+
+## 浠诲姟鍓嶇疆鏉′欢
+
+`TaskService` 闇�娉ㄥ叆 `IMesService`銆傛鏌ョ幇鏈夋瀯閫犲嚱鏁版槸鍚﹀凡鏈夛細
+```csharp
+private readonly IMesService _mesService;
+```
+
+濡傛灉涓嶅瓨鍦紝闇�娣诲姞銆�
+
+---
+
+## Task 1: 淇敼 InboundFinishTaskAsync 娣诲姞 MES 杩涚珯璋冪敤
+
+**Files:**
+- Modify: `WIDESEA_TaskInfoService/TaskService.cs`锛坄InboundFinishTaskAsync` 鏂规硶锛岀害绗� 215 琛岋級
+
+- [ ] **Step 1: 鏌ョ湅褰撳墠浠g爜纭涓婁笅鏂�**
+
+璇诲彇 `TaskService.cs` 绗� 199-240 琛岋紝纭 `CompleteTaskAsync` 璋冪敤鐨勪綅缃��
+
+- [ ] **Step 2: 鍦� CompleteTaskAsync 涔嬪墠娣诲姞 MES InboundInContainer 璋冪敤**
+
+鍦� `return await CompleteTaskAsync(task);` 涔嬪墠娣诲姞锛�
+
+```csharp
+// 璋冪敤MES鎵樼洏杩涚珯
+var inboundRequest = new InboundInContainerRequest
+{
+    EquipmentCode = "STK-GROUP-001",
+    ResourceCode = "STK-GROUP-001",
+    LocalTime = DateTime.Now,
+    ContainerCode = taskDto.PalletCode
+};
+var inboundResult = _mesService.InboundInContainer(inboundRequest);
+if (inboundResult == null || inboundResult.Data == null || !inboundResult.Data.IsSuccess)
+{
+    return content.Error($"浠诲姟瀹屾垚澶辫触锛歁ES杩涚珯澶辫触: {inboundResult?.Data?.Msg ?? inboundResult?.ErrorMessage ?? "鏈煡閿欒"}");
+}
+```
+
+- [ ] **Step 3: 娣诲姞 using 寮曠敤锛堝鏋滈渶瑕侊級**
+
+纭鏂囦欢椤堕儴宸叉湁 `using WIDESEA_IBasicService;` 鍜� `using WIDESEA_DTO.MES;`銆傚鏋滄病鏈夛紝娣诲姞銆�
+
+- [ ] **Step 4: 鏋勫缓楠岃瘉**
+
+```bash
+cd WIDESEA_WMSServer && dotnet build WIDESEA_TaskInfoService/WIDESEA_TaskInfoService.csproj
+```
+
+纭鏃犵紪璇戦敊璇��
+
+- [ ] **Step 5: 鎻愪氦**
+
+```bash
+git add WIDESEA_TaskInfoService/TaskService.cs
+git commit -m "feat(TaskService): InboundFinishTaskAsync娣诲姞MES杩涚珯璋冪敤"
+```
+
+---
+
+## Task 2: 淇敼 OutboundFinishTaskAsync 娣诲姞 MES 鍑虹珯璋冪敤
+
+**Files:**
+- Modify: `WIDESEA_TaskInfoService/TaskService.cs`锛坄OutboundFinishTaskAsync` 鏂规硶锛岀害绗� 258 琛岋級
+
+- [ ] **Step 1: 鏌ョ湅褰撳墠浠g爜纭涓婁笅鏂�**
+
+璇诲彇 `TaskService.cs` 绗� 258-280 琛岋紝纭 `CompleteTaskAsync` 璋冪敤鐨勪綅缃��
+
+- [ ] **Step 2: 鍦� CompleteTaskAsync 涔嬪墠娣诲姞 MES OutboundInContainer 璋冪敤**
+
+鍦� `return await CompleteTaskAsync(task);` 涔嬪墠娣诲姞锛�
+
+```csharp
+// 璋冪敤MES鎵樼洏鍑虹珯
+var outboundRequest = new OutboundInContainerRequest
+{
+    EquipmentCode = "STK-GROUP-001",
+    ResourceCode = "STK-GROUP-001",
+    LocalTime = DateTime.Now,
+    ContainerCode = taskDto.PalletCode,
+    ParamList = new List<ParamItem>()
+};
+var outboundResult = _mesService.OutboundInContainer(outboundRequest);
+if (outboundResult == null || outboundResult.Data == null || !outboundResult.Data.IsSuccess)
+{
+    return content.Error($"浠诲姟瀹屾垚澶辫触锛歁ES鍑虹珯澶辫触: {outboundResult?.Data?.Msg ?? outboundResult?.ErrorMessage ?? "鏈煡閿欒"}");
+}
+```
+
+- [ ] **Step 3: 鏋勫缓楠岃瘉**
+
+```bash
+cd WIDESEA_WMSServer && dotnet build WIDESEA_TaskInfoService/WIDESEA_TaskInfoService.csproj
+```
+
+纭鏃犵紪璇戦敊璇��
+
+- [ ] **Step 4: 鎻愪氦**
+
+```bash
+git add WIDESEA_TaskInfoService/TaskService.cs
+git commit -m "feat(TaskService): OutboundFinishTaskAsync娣诲姞MES鍑虹珯璋冪敤"
+```
+
+---
+
+## Task 3: 鏂板 InboundFinishTaskTrayAsync 绌烘墭鐩樺叆搴撳畬鎴愭柟娉�
+
+**Files:**
+- Modify: `WIDESEA_TaskInfoService/TaskService.cs`锛堝湪 `InboundFinishTaskTrayAsync` 鏂规硶涔嬪悗娣诲姞鏂版柟娉曪級
+
+- [ ] **Step 1: 鏌ョ湅鐜版湁 InboundFinishTaskTrayAsync 鏂规硶浣嶇疆**
+
+璇诲彇 `TaskService.cs` 绗� 330-350 琛岋紝纭 `CreateTaskInboundTrayAsync` 涔嬪悗鐨勪綅缃��
+
+- [ ] **Step 2: 娣诲姞鏂版柟娉� InboundFinishTaskTrayAsync**
+
+鍦� `CreateTaskInboundTrayAsync` 鏂规硶涔嬪悗娣诲姞锛�
+
+```csharp
+/// <summary>
+/// 绌烘墭鐩樺叆搴撳畬鎴�
+/// </summary>
+public async Task<WebResponseContent> InboundFinishTaskTrayAsync(CreateTaskDto taskDto)
+{
+    try
+    {
+        var task = await BaseDal.QueryFirstAsync(s => s.PalletCode == taskDto.PalletCode);
+        if (task == null) return WebResponseContent.Instance.Error("鏈壘鍒板搴旂殑浠诲姟");
+
+        var location = await _locationInfoService.GetLocationInfo(task.Roadway, task.TargetAddress);
+        if (location == null) return WebResponseContent.Instance.Error("鏈壘鍒板搴旂殑璐т綅");
+
+        var stockInfo = await _stockInfoService.GetStockInfoAsync(taskDto.PalletCode);
+        if (stockInfo == null) return WebResponseContent.Instance.Error("鏈壘鍒板搴斿簱瀛樹俊鎭�");
+
+        return await ExecuteWithinTransactionAsync(async () =>
+        {
+            stockInfo.LocationCode = location.LocationCode;
+            stockInfo.LocationId = location.Id;
+            stockInfo.StockStatus = StockStatusEmun.绌烘墭鐩樺簱瀛�.GetHashCode();
+
+            location.LocationStatus = LocationStatusEnum.InStock.GetHashCode();
+
+            var updateLocationResult = await _locationInfoService.UpdateLocationInfoAsync(location);
+            var updateStockResult = await _stockInfoService.UpdateStockAsync(stockInfo);
+            if (!updateLocationResult || !updateStockResult)
+                return WebResponseContent.Instance.Error("浠诲姟瀹屾垚澶辫触");
+
+            var deleteResult = await BaseDal.DeleteDataAsync(task);
+            if (!deleteResult) return WebResponseContent.Instance.Error("浠诲姟瀹屾垚澶辫触");
+
+            return WebResponseContent.Instance.OK("浠诲姟瀹屾垚");
+        });
+    }
+    catch (Exception ex)
+    {
+        return WebResponseContent.Instance.Error($"瀹屾垚浠诲姟澶辫触: {ex.Message}");
+    }
+}
+```
+
+- [ ] **Step 3: 鏋勫缓楠岃瘉**
+
+```bash
+cd WIDESEA_WMSServer && dotnet build WIDESEA_TaskInfoService/WIDESEA_TaskInfoService.csproj
+```
+
+纭鏃犵紪璇戦敊璇��
+
+- [ ] **Step 4: 鎻愪氦**
+
+```bash
+git add WIDESEA_TaskInfoService/TaskService.cs
+git commit -m "feat(TaskService): 鏂板InboundFinishTaskTrayAsync绌烘墭鐩樺叆搴撳畬鎴愭柟娉�"
+```
+
+---
+
+## Task 4: 鏂板 OutboundFinishTaskTrayAsync 绌烘墭鐩樺嚭搴撳畬鎴愭柟娉�
+
+**Files:**
+- Modify: `WIDESEA_TaskInfoService/TaskService.cs`锛堝湪 `OutboundFinishTaskTrayAsync` 鏂规硶涔嬪悗娣诲姞鏂版柟娉曪級
+
+- [ ] **Step 1: 鏌ョ湅鐜版湁 GetOutBoundTrayTaskAsync 鏂规硶浣嶇疆**
+
+璇诲彇 `TaskService.cs` 绗� 357-393 琛岋紝纭 `GetOutBoundTrayTaskAsync` 涔嬪悗鐨勪綅缃��
+
+- [ ] **Step 2: 娣诲姞鏂版柟娉� OutboundFinishTaskTrayAsync**
+
+鍦� `GetOutBoundTrayTaskAsync` 鏂规硶涔嬪悗娣诲姞锛�
+
+```csharp
+/// <summary>
+/// 绌烘墭鐩樺嚭搴撳畬鎴�
+/// </summary>
+public async Task<WebResponseContent> OutboundFinishTaskTrayAsync(CreateTaskDto taskDto)
+{
+    try
+    {
+        var task = await BaseDal.QueryFirstAsync(s => s.PalletCode == taskDto.PalletCode);
+        if (task == null) return WebResponseContent.Instance.Error("鏈壘鍒板搴旂殑浠诲姟");
+
+        var location = await _locationInfoService.GetLocationInfo(task.Roadway, task.SourceAddress);
+        if (location == null) return WebResponseContent.Instance.Error("鏈壘鍒板搴旂殑璐т綅");
+
+        var stockInfo = await _stockInfoService.GetStockInfoAsync(taskDto.PalletCode);
+        if (stockInfo == null) return WebResponseContent.Instance.Error("鏈壘鍒板搴斿簱瀛樹俊鎭�");
+
+        return await ExecuteWithinTransactionAsync(async () =>
+        {
+            stockInfo.LocationId = 0;
+            stockInfo.LocationCode = null;
+            stockInfo.StockStatus = StockStatusEmun.鍑哄簱瀹屾垚.GetHashCode();
+
+            location.LocationStatus = LocationStatusEnum.Free.GetHashCode();
+
+            var updateLocationResult = await _locationInfoService.UpdateLocationInfoAsync(location);
+            var updateStockResult = await _stockInfoService.UpdateStockAsync(stockInfo);
+            if (!updateLocationResult || !updateStockResult)
+                return WebResponseContent.Instance.Error("浠诲姟瀹屾垚澶辫触");
+
+            var deleteResult = await BaseDal.DeleteDataAsync(task);
+            if (!deleteResult) return WebResponseContent.Instance.Error("浠诲姟瀹屾垚澶辫触");
+
+            return WebResponseContent.Instance.OK("浠诲姟瀹屾垚");
+        });
+    }
+    catch (Exception ex)
+    {
+        return WebResponseContent.Instance.Error($"瀹屾垚浠诲姟澶辫触: {ex.Message}");
+    }
+}
+```
+
+- [ ] **Step 3: 鏋勫缓楠岃瘉**
+
+```bash
+cd WIDESEA_WMSServer && dotnet build WIDESEA_TaskInfoService/WIDESEA_TaskInfoService.csproj
+```
+
+纭鏃犵紪璇戦敊璇��
+
+- [ ] **Step 4: 鎻愪氦**
+
+```bash
+git add WIDESEA_TaskInfoService/TaskService.cs
+git commit -m "feat(TaskService): 鏂板OutboundFinishTaskTrayAsync绌烘墭鐩樺嚭搴撳畬鎴愭柟娉�"
+```
+
+---
+
+## Task 5: 鏁翠綋鏋勫缓楠岃瘉
+
+- [ ] **Step 1: 鏋勫缓鏁翠釜瑙e喅鏂规**
+
+```bash
+cd WIDESEA_WMSServer && dotnet build WIDESEA_WMSServer.sln
+```
+
+纭鏃犵紪璇戦敊璇�佹棤璀﹀憡銆�
+
+---
+
+## 楠岃瘉妫�鏌ユ竻鍗�
+
+- [ ] `InboundFinishTaskAsync` 涓� `InboundInContainer` 鍦� `CompleteTaskAsync` 涔嬪墠
+- [ ] `OutboundFinishTaskAsync` 涓� `OutboundInContainer` 鍦� `CompleteTaskAsync` 涔嬪墠
+- [ ] 鎵�鏈� MES 璋冪敤妫�鏌� `mesResult.Data?.IsSuccess`
+- [ ] 閿欒淇℃伅鏍煎紡锛歚"浠诲姟瀹屾垚澶辫触锛歁ES{鎿嶄綔}澶辫触: {閿欒淇℃伅}"`
+- [ ] `InboundFinishTaskTrayAsync` 鍜� `OutboundFinishTaskTrayAsync` 鏂板鏂规硶绛惧悕姝g‘
+- [ ] 瑙e喅鏂规鏋勫缓鏃犻敊璇�

--
Gitblit v1.9.3