From 406a7dd7ed6d1215b739a80453e2bbde0f8af643 Mon Sep 17 00:00:00 2001
From: wanshenmean <cathay_xy@163.com>
Date: 星期二, 21 四月 2026 00:05:14 +0800
Subject: [PATCH] docs: add MES upload status tracking design spec

---
 Code/docs/superpowers/specs/2026-04-20-MES上传状态与异步上传设计.md |  288 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 288 insertions(+), 0 deletions(-)

diff --git "a/Code/docs/superpowers/specs/2026-04-20-MES\344\270\212\344\274\240\347\212\266\346\200\201\344\270\216\345\274\202\346\255\245\344\270\212\344\274\240\350\256\276\350\256\241.md" "b/Code/docs/superpowers/specs/2026-04-20-MES\344\270\212\344\274\240\347\212\266\346\200\201\344\270\216\345\274\202\346\255\245\344\270\212\344\274\240\350\256\276\350\256\241.md"
new file mode 100644
index 0000000..d0b8734
--- /dev/null
+++ "b/Code/docs/superpowers/specs/2026-04-20-MES\344\270\212\344\274\240\347\212\266\346\200\201\344\270\216\345\274\202\346\255\245\344\270\212\344\274\240\350\256\276\350\256\241.md"
@@ -0,0 +1,288 @@
+# MES 涓婁紶鐘舵�佽窡韪笌寮傛涓婁紶璁捐
+
+> **Date:** 2026-04-20
+> **Author:** Claude
+
+## 1. 鐩爣
+
+鍦ㄥ簱瀛樿〃娣诲姞 MES 涓婁紶鐘舵�佸瓧娈碉紝閫氳繃寮傛鏂瑰紡涓婁紶 MES 鏁版嵁锛屼笉骞叉壈涓讳笟鍔¢�昏緫锛屾墍鏈� MES 璋冪敤鍧囪褰曡缁嗘棩蹇椼��
+
+## 2. 鏁版嵁搴撳彉鏇�
+
+### 2.1 Dt_StockInfo 琛ㄦ柊澧炲瓧娈�
+
+```sql
+ALTER TABLE [dbo].[Dt_StockInfo] ADD [MesUploadStatus] TINYINT NOT NULL DEFAULT 0;
+GO
+```
+
+### 2.2 鏋氫妇瀹氫箟
+
+| 鍊� | 鍚箟 |
+|----|------|
+| 0 | 鏈笂浼狅紙浠庢湭璋冪敤杩嘙ES锛� |
+| 1 | 缁勭洏涓婁紶鎴愬姛 |
+| 2 | 缁勭洏涓婁紶澶辫触 |
+| 3 | 鎷嗙洏涓婁紶鎴愬姛 |
+| 4 | 鎷嗙洏涓婁紶澶辫触 |
+| 5 | 杩涚珯涓婁紶鎴愬姛 |
+| 6 | 杩涚珯涓婁紶澶辫触 |
+| 7 | 鍑虹珯涓婁紶鎴愬姛 |
+| 8 | 鍑虹珯涓婁紶澶辫触 |
+| 9 | NG涓婃姤鎴愬姛 |
+| 10 | NG涓婃姤澶辫触 |
+
+鍦� `WIDESEA_Common` 椤圭洰鏂板鏋氫妇绫� `MesUploadStatusEnum`銆�
+
+## 3. 鍚庣璁捐
+
+### 3.1 鏍稿績寮傛鏂规硶
+
+鍦� `WIDESEA_TaskInfoService/TaskService.cs` 涓柊澧� `MesUploadAsync` 绉佹湁寮傛鏂规硶锛�
+
+```csharp
+/// <summary>
+/// 寮傛鎵цMES涓婁紶 - 涓嶉樆濉炰富涓氬姟閫昏緫
+/// </summary>
+/// <param name="palletCode">鎵樼洏鍙�</param>
+/// <param name="mesType">MES鎿嶄綔绫诲瀷鏋氫妇</param>
+/// <param name="uploadFunc">鍏蜂綋鐨凪ES璋冪敤鍑芥暟</param>
+private async Task MesUploadAsync(string palletCode, MesUploadStatusEnum mesType, Func<Task<HttpResponseResult<MesResponse>>> uploadFunc)
+{
+    var stopwatch = Stopwatch.StartNew();
+    string requestJson = "";
+    string responseJson = "";
+    bool isSuccess = false;
+    string errorMessage = "";
+
+    try
+    {
+        // 璁板綍璇锋眰鏃ュ織
+        var mesLog = new MesApiLogDto
+        {
+            PalletCode = palletCode,
+            ApiType = mesType.ToString(),
+            RequestTime = DateTime.Now
+        };
+
+        // 璋冪敤MES
+        var result = await uploadFunc();
+
+        stopwatch.Stop();
+        isSuccess = result?.Data?.IsSuccess ?? false;
+        errorMessage = result?.Data?.Msg ?? result?.ErrorMessage ?? "鏈煡閿欒";
+        responseJson = JsonConvert.SerializeObject(result);
+
+        // 鏇存柊搴撳瓨琛ㄧ姸鎬�
+        var uploadStatus = isSuccess ? (int)mesType : (int)mesType + 1; // 濂囨暟=鎴愬姛锛屽伓鏁�=澶辫触
+        await _stockInfoService.UpdateMesUploadStatusAsync(palletCode, uploadStatus);
+
+        // 璁板綍鏃ュ織
+        mesLog.ResponseTime = DateTime.Now;
+        mesLog.Duration = stopwatch.ElapsedMilliseconds;
+        mesLog.RequestParams = requestJson;
+        mesLog.ResponseResult = responseJson;
+        mesLog.Status = isSuccess ? "鎴愬姛" : "澶辫触";
+        mesLog.ErrorMessage = errorMessage;
+        mesLog.CreateTime = DateTime.Now;
+
+        _ = _mesLogService.LogAsync(mesLog); // 涓嶇瓑寰�
+    }
+    catch (Exception ex)
+    {
+        stopwatch.Stop();
+        errorMessage = ex.Message;
+
+        // 鏇存柊鐘舵�佷负澶辫触
+        var uploadStatus = (int)mesType + 1;
+        _stockInfoService.UpdateMesUploadStatusAsync(palletCode, uploadStatus).ConfigureAwait(false);
+
+        // 璁板綍寮傚父鏃ュ織
+        var mesLog = new MesApiLogDto
+        {
+            PalletCode = palletCode,
+            ApiType = mesType.ToString(),
+            RequestTime = DateTime.Now,
+            ResponseTime = DateTime.Now,
+            Duration = stopwatch.ElapsedMilliseconds,
+            RequestParams = requestJson,
+            ResponseResult = responseJson,
+            Status = "澶辫触",
+            ErrorMessage = errorMessage,
+            CreateTime = DateTime.Now
+        };
+        _ = _mesLogService.LogAsync(mesLog); // 涓嶇瓑寰�
+    }
+}
+```
+
+### 3.2 璋冪敤鏂瑰紡
+
+鍦ㄥ悇涓� MES 鎿嶄綔澶勭粺涓�浣跨敤 `Task.Run` + `MesUploadAsync`锛�
+
+```csharp
+// 缁勭洏纭
+public async Task<WebResponseContent> GroupPalletConfirmAsync(string palletCode, string deviceName)
+{
+    // ... 涓氬姟閫昏緫 ...
+    
+    // 寮傛MES涓婁紶锛屼笉闃诲涓婚�昏緫
+    _ = Task.Run(() => MesUploadAsync(palletCode, MesUploadStatusEnum.GroupPalletSuccess, async () =>
+    {
+        return await _mesService.BindContainerAsync(bindRequest, token);
+    }));
+
+    return content.OK("缁勭洏鎴愬姛");
+}
+
+// 鎷嗙洏纭
+public async Task<WebResponseContent> SplitPalletConfirmAsync(string palletCode, string deviceName)
+{
+    // ... 涓氬姟閫昏緫 ...
+
+    _ = Task.Run(() => MesUploadAsync(palletCode, MesUploadStatusEnum.SplitPalletSuccess, async () =>
+    {
+        return await _mesService.UnBindContainerAsync(unbindRequest, token);
+    }));
+
+    return content.OK("鎷嗙洏鎴愬姛");
+}
+```
+
+### 3.3 IStockInfoService 鏂板鏂规硶
+
+鍦� `IStockInfoService` 鎺ュ彛鏂板锛�
+
+```csharp
+/// <summary>
+/// 鏇存柊MES涓婁紶鐘舵��
+/// </summary>
+/// <param name="palletCode">鎵樼洏鍙�</param>
+/// <param name="status">鐘舵�佸��</param>
+Task<bool> UpdateMesUploadStatusAsync(string palletCode, int status);
+```
+
+鍦� `StockInfoService` 涓疄鐜拌鏂规硶銆�
+
+### 3.4 鏃ュ織璁板綍瑙勮寖
+
+鎵�鏈� MES 璋冪敤缁熶竴璁板綍浠ヤ笅瀛楁锛�
+
+| 瀛楁 | 璇存槑 |
+|------|------|
+| PalletCode | 鎵樼洏鍙� |
+| ApiType | 鎺ュ彛绫诲瀷锛堢粍鐩�/鎷嗙洏/杩涚珯/鍑虹珯/NG涓婃姤锛� |
+| RequestTime | 璇锋眰鏃堕棿 |
+| ResponseTime | 鍝嶅簲鏃堕棿 |
+| Duration | 鑰楁椂(ms) |
+| RequestParams | 璇锋眰JSON |
+| ResponseResult | 鍝嶅簲JSON |
+| Status | 鎴愬姛/澶辫触 |
+| ErrorMessage | 澶辫触鍘熷洜 |
+
+## 4. 鍓嶇鍙樻洿
+
+### 4.1 搴撳瓨椤甸潰鎿嶄綔鍒楁柊澧炴寜閽�
+
+鍦� `WMS/WIDESEA_WMSClient/src/extension/stock/stock.jsx` 涓墿灞曟搷浣滃垪锛�
+
+```jsx
+let extension = {
+  components: {
+    gridHeader: "",
+    gridBody: "",
+    gridFooter: "",
+    modelHeader: "",
+    modelBody: "",
+    modelFooter: "",
+  },
+  tableAction: "stock",
+  buttons: {
+    view: ["Export"],
+    box: []
+  },
+  methods: {
+    onInit() {
+      return true;
+    },
+    onInited() {
+      // 娉ㄥ叆缁勭洏/鎷嗙洏鎸夐挳
+      this.editTableButtons = [
+        { name: "缁勭洏", onClick: this.onGroupPallet },
+        { name: "鎷嗙洏", onClick: this.onSplitPallet }
+      ];
+      return true;
+    },
+    async onGroupPallet({ row }) {
+      // 璋冪敤缁勭洏鎺ュ彛
+      let result = await this.$api.post("/Stock/GroupPalletConfirm", { palletCode: row.palletCode });
+      if (result.status) {
+        this.$Message.success("缁勭洏鎴愬姛");
+        this.$refs.grid.search();
+      } else {
+        this.$Message.error(result.message || "缁勭洏澶辫触");
+      }
+    },
+    async onSplitPallet({ row }) {
+      // 璋冪敤鎷嗙洏鎺ュ彛
+      let result = await this.$api.post("/Stock/SplitPalletConfirm", { palletCode: row.palletCode });
+      if (result.status) {
+        this.$Message.success("鎷嗙洏鎴愬姛");
+        this.$refs.grid.search();
+      } else {
+        this.$Message.error(result.message || "鎷嗙洏澶辫触");
+      }
+    }
+  },
+};
+
+export default extension;
+```
+
+### 4.2 搴撳瓨鍒楄〃鏂板鐘舵�佸垪
+
+鍦� `WMS/WIDESEA_WMSClient/src/views/stock/stock.vue` 鐨� `columns` 涓柊澧烇細
+
+```vue
+{ field: "mesUploadStatus", title: "MES鐘舵��", type: "int", width: 120, bind: { key: "mesUploadStatusEnum", data: [] } }
+```
+
+### 4.3 瀛楀吀閰嶇疆
+
+鍦� `mesUploadStatusEnum` 瀛楀吀涓坊鍔狅細
+
+| value | label |
+|-------|-------|
+| 0 | 鏈笂浼� |
+| 1 | 缁勭洏鎴愬姛 |
+| 2 | 缁勭洏澶辫触 |
+| 3 | 鎷嗙洏鎴愬姛 |
+| 4 | 鎷嗙洏澶辫触 |
+| 5 | 杩涚珯鎴愬姛 |
+| 6 | 杩涚珯澶辫触 |
+| 7 | 鍑虹珯鎴愬姛 |
+| 8 | 鍑虹珯澶辫触 |
+| 9 | NG涓婃姤鎴愬姛 |
+| 10 | NG涓婃姤澶辫触 |
+
+## 5. 鏂囦欢鍙樻洿娓呭崟
+
+| 鎿嶄綔 | 鏂囦欢 |
+|------|------|
+| 鏂板 | `WMS/WIDESEA_WMSServer/WIDESEA_Common/StockEnum/MesUploadStatusEnum.cs` |
+| 淇敼 | `WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Stock/Dt_StockInfo.cs` - 鏂板 MesUploadStatus 瀛楁 |
+| 淇敼 | `WMS/WIDESEA_WMSServer/WIDESEA_IStockService/IStockInfoService.cs` - 鏂板 UpdateMesUploadStatusAsync |
+| 淇敼 | `WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs` - 瀹炵幇 UpdateMesUploadStatusAsync |
+| 淇敼 | `WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs` - 鏂板 MesUploadAsync + 鍚勫璋冪敤 |
+| 淇敼 | `WMS/WIDESEA_WMSClient/src/extension/stock/stock.jsx` - 鏂板缁勭洏/鎷嗙洏鎸夐挳 |
+| 淇敼 | `WMS/WIDESEA_WMSClient/src/views/stock/stock.vue` - 鏂板MES鐘舵�佸垪 |
+| 鏂板 | 鏁版嵁搴撳彉鏇磋剼鏈� |
+
+## 6. 鑷娓呭崟
+
+- [ ] `MesUploadStatusEnum` 鏋氫妇鍊煎鏁颁负鎴愬姛锛屽伓鏁颁负澶辫触锛�+1杩愮畻姝g‘
+- [ ] `MesUploadAsync` 鏂规硶鍐呮墍鏈� MES 璋冪敤璁板綍璇︾粏鏃ュ織锛堣姹侸SON銆佸搷搴擩SON銆佽�楁椂銆侀敊璇師鍥狅級
+- [ ] 缁勭洏/鎷嗙洏/杩涚珯/鍑虹珯/NG涓婃姤鍧囬�氳繃 `Task.Run` 寮傛鎵ц锛屼笉闃诲涓婚�昏緫
+- [ ] 鍓嶇缁勭洏/鎷嗙洏鎸夐挳璋冪敤 `GroupPalletConfirmAsync` / `SplitPalletConfirmAsync`
+- [ ] 搴撳瓨鍒楄〃姝g‘鏄剧ず `mesUploadStatus` 瀛楁
+- [ ] 鎵�鏈� public 鏂规硶鍧囨湁 XML 鏂囨。娉ㄩ噴
\ No newline at end of file

--
Gitblit v1.9.3