From b698a2085fd090e90abedb1e91266ec496574b29 Mon Sep 17 00:00:00 2001
From: wanshenmean <cathay_xy@163.com>
Date: 星期四, 16 四月 2026 23:31:35 +0800
Subject: [PATCH] 1

---
 Code/docs/superpowers/plans/2026-04-16-BatchMesBinding-Plan.md |  485 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 485 insertions(+), 0 deletions(-)

diff --git a/Code/docs/superpowers/plans/2026-04-16-BatchMesBinding-Plan.md b/Code/docs/superpowers/plans/2026-04-16-BatchMesBinding-Plan.md
new file mode 100644
index 0000000..5fc786c
--- /dev/null
+++ b/Code/docs/superpowers/plans/2026-04-16-BatchMesBinding-Plan.md
@@ -0,0 +1,485 @@
+# 鎵归噺 MES 缁戝畾涓庤В缁戞帴鍙e疄鏂借鍒�
+
+> **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:** 鏂板涓や釜 WMS 鎺ュ彛锛圫plitPalletConfirm銆丟roupPalletConfirm锛夛紝渚� WCS 鍦ㄤ换鍔¢樁娈靛畬鎴愭椂涓�娆℃�т笂浼犳墭鐩樼骇鍒殑 MES 缁戝畾/瑙g粦鏁版嵁锛屽噺灏� MES 璋冪敤娆℃暟銆�
+
+**Architecture:**
+- `Dt_SplitTemp` 涓存椂琛細鎷嗙洏寮�濮嬫椂骞傜瓑鍐欏叆鎵樼洏鐢佃姱鍒楄〃锛孋onfirm 鏃惰鍙栧苟鍒犻櫎
+- `SplitPalletAsync` 鏀归�狅細姣忔璋冪敤鏃舵鏌ヤ复鏃惰〃锛屾棤璁板綍鍒欏啓鍏ワ紝鏈夎褰曞垯璺宠繃
+- `SplitPalletConfirm`锛氫粠涓存椂琛ㄨ鍙栫數鑺� 鈫� 璋冪敤 MES UnBindContainer 鈫� 鍒犻櫎涓存椂琛ㄨ褰�
+- `GroupPalletConfirm`锛氭寜鎵樼洏鍙锋煡 Dt_StockInfoDetail 鈫� 璋冪敤 MES BindContainer
+
+**Tech Stack:** .NET 6/8, C#, SqlSugar ORM, ASP.NET Core WebAPI
+
+---
+
+## 鏂囦欢鍙樻洿姒傝
+
+| 鎿嶄綔 | 鏂囦欢 |
+|------|------|
+| 鏂板 | `WIDESEA_Model/Models/Stock/Dt_SplitTemp.cs` |
+| 鏂板 | `WIDESEA_DTO/Stock/SplitPalletConfirmRequestDto.cs` |
+| 鏂板 | `WIDESEA_DTO/Stock/GroupPalletConfirmRequestDto.cs` |
+| 淇敼 | `WIDESEA_IStockService/IStockService.cs` |
+| 淇敼 | `WIDESEA_StockService/StockService.cs` |
+| 淇敼 | `WIDESEA_WMSServer/Controllers/Stock/StockController.cs` |
+| 淇敼 | 鏁版嵁搴擄細鏂板 `Dt_SplitTemp` 琛� |
+
+---
+
+## Task 1: 鏂板缓涓存椂琛ㄥ疄浣� Dt_SplitTemp
+
+**Files:**
+- Create: `WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Stock/Dt_SplitTemp.cs`
+
+- [ ] **Step 1: 鍒涘缓 Dt_SplitTemp 瀹炰綋**
+
+```csharp
+using SqlSugar;
+using WIDESEA_Core.DB.Models;
+
+namespace WIDESEA_Model.Models
+{
+    /// <summary>
+    /// 鎷嗙洏涓存椂琛� - 鐢ㄤ簬鏆傚瓨鎷嗙洏浠诲姟鐢佃姱鍒楄〃锛屼緵鎵归噺纭鏃朵娇鐢�
+    /// </summary>
+    [SugarTable(nameof(Dt_SplitTemp), "鎷嗙洏涓存椂琛�")]
+    public class Dt_SplitTemp
+    {
+        /// <summary>
+        /// 涓婚敭
+        /// </summary>
+        [SugarColumn(IsPrimaryKey = true, IsIdentity = true, ColumnDescription = "涓婚敭")]
+        public int Id { get; set; }
+
+        /// <summary>
+        /// 鎵樼洏鍙�
+        /// </summary>
+        [SugarColumn(IsNullable = false, Length = 50, ColumnDescription = "鎵樼洏鍙�")]
+        public string PalletCode { get; set; }
+
+        /// <summary>
+        /// 鐢佃姱鏉$爜鍒楄〃锛圝SON鏍煎紡锛�
+        /// </summary>
+        [SugarColumn(IsNullable = false, Length = -1, ColumnDescription = "鐢佃姱鏉$爜鍒楄〃JSON")]
+        public string SfcList { get; set; }
+
+        /// <summary>
+        /// 鍒涘缓鏃堕棿
+        /// </summary>
+        [SugarColumn(IsNullable = false, ColumnDescription = "鍒涘缓鏃堕棿")]
+        public DateTime CreateTime { get; set; } = DateTime.Now;
+    }
+}
+```
+
+- [ ] **Step 2: Commit**
+
+```bash
+git add WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Stock/Dt_SplitTemp.cs
+git commit -m "feat(Stock): 鏂板Dt_SplitTemp鎷嗙洏涓存椂琛ㄥ疄浣�
+
+Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>"
+```
+
+---
+
+## Task 2: 鏂板缓璇锋眰 DTO
+
+**Files:**
+- Create: `WMS/WIDESEA_WMSServer/WIDESEA_DTO/Stock/SplitPalletConfirmRequestDto.cs`
+- Create: `WMS/WIDESEA_WMSServer/WIDESEA_DTO/Stock/GroupPalletConfirmRequestDto.cs`
+
+- [ ] **Step 1: 鍒涘缓 SplitPalletConfirmRequestDto**
+
+```csharp
+namespace WIDESEA_DTO.Stock
+{
+    /// <summary>
+    /// 鎵归噺鎷嗙洏纭璇锋眰DTO
+    /// </summary>
+    public class SplitPalletConfirmRequestDto
+    {
+        /// <summary>
+        /// 婧愭墭鐩樺彿
+        /// </summary>
+        public string PalletCode { get; set; }
+    }
+}
+```
+
+- [ ] **Step 2: 鍒涘缓 GroupPalletConfirmRequestDto**
+
+```csharp
+namespace WIDESEA_DTO.Stock
+{
+    /// <summary>
+    /// 鎵归噺缁勭洏纭璇锋眰DTO
+    /// </summary>
+    public class GroupPalletConfirmRequestDto
+    {
+        /// <summary>
+        /// 鐩爣鎵樼洏鍙�
+        /// </summary>
+        public string PalletCode { get; set; }
+    }
+}
+```
+
+- [ ] **Step 3: Commit**
+
+```bash
+git add WMS/WIDESEA_WMSServer/WIDESEA_DTO/Stock/SplitPalletConfirmRequestDto.cs WMS/WIDESEA_WMSServer/WIDESEA_DTO/Stock/GroupPalletConfirmRequestDto.cs
+git commit -m "feat(DTO): 鏂板鎵归噺缁勭洏鎷嗙洏纭璇锋眰DTO
+
+Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>"
+```
+
+---
+
+## Task 3: 淇敼 IStockService 鎺ュ彛
+
+**Files:**
+- Modify: `WMS/WIDESEA_WMSServer/WIDESEA_IStockService/IStockService.cs`锛堝湪鎺ュ彛鏈熬娣诲姞涓や釜鏂版柟娉曪級
+
+- [ ] **Step 1: 鍦� IStockService 鎺ュ彛娣诲姞涓や釜鏂版柟娉曞0鏄�**
+
+鍦� `UpdateStockInfoAsync` 鏂规硶澹版槑涔嬪悗銆佹帴鍙g粨鏉� `}` 涔嬪墠娣诲姞锛�
+
+```csharp
+/// <summary>
+/// 鎵归噺鎷嗙洏纭 - 涓�娆℃�ц皟鐢∕ES瑙g粦鏁翠釜鎵樼洏
+/// </summary>
+/// <param name="palletCode">婧愭墭鐩樺彿</param>
+/// <returns>鎿嶄綔缁撴灉</returns>
+Task<WebResponseContent> SplitPalletConfirmAsync(string palletCode);
+
+/// <summary>
+/// 鎵归噺缁勭洏纭 - 涓�娆℃�ц皟鐢∕ES缁戝畾鏁翠釜鎵樼洏
+/// </summary>
+/// <param name="palletCode">鐩爣鎵樼洏鍙�</param>
+/// <returns>鎿嶄綔缁撴灉</returns>
+Task<WebResponseContent> GroupPalletConfirmAsync(string palletCode);
+```
+
+- [ ] **Step 2: Commit**
+
+```bash
+git add WMS/WIDESEA_WMSServer/WIDESEA_IStockService/IStockService.cs
+git commit -m "feat(IStockService): 鏂板SplitPalletConfirmAsync鍜孏roupPalletConfirmAsync鎺ュ彛
+
+Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>"
+```
+
+---
+
+## Task 4: 淇敼 StockService 瀹炵幇 - SplitPalletConfirmAsync 鍜� GroupPalletConfirmAsync
+
+**Files:**
+- Modify: `WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockService.cs`
+
+- [ ] **Step 1: 娣诲姞 ISqlSugarClient 娉ㄥ叆鍜� Dt_SplitTemp 瀹炰綋**
+
+鍦� `StockService` 绫讳腑娣诲姞锛�
+
+```csharp
+using SqlSugar;
+using WIDESEA_Model.Models;
+using Newtonsoft.Json;
+```
+
+鍦ㄧ被涓坊鍔犲睘鎬э細
+
+```csharp
+/// <summary>
+/// SqlSugar瀹㈡埛绔紙鐢ㄤ簬涓存椂琛ㄦ搷浣滐級
+/// </summary>
+public ISqlSugarClient SqlSugarClient { get; }
+```
+
+鏋勯�犲嚱鏁颁腑娉ㄥ叆锛�
+
+```csharp
+public StockService(
+    ...,
+    ISqlSugarClient sqlSugarClient)  // 娣诲姞鍒板弬鏁版湯灏�
+{
+    ...
+    SqlSugarClient = sqlSugarClient;
+}
+```
+
+- [ ] **Step 2: 瀹炵幇 SplitPalletConfirmAsync 鏂规硶**
+
+鍦ㄧ被鏈熬锛坄UpdateStockInfoAsync` 鏂规硶涔嬪悗銆乣CreateDetailHistory` 涔嬪墠锛夋坊鍔狅細
+
+```csharp
+/// <summary>
+/// 鎵归噺鎷嗙洏纭 - 涓�娆℃�ц皟鐢∕ES瑙g粦鏁翠釜鎵樼洏
+/// </summary>
+/// <param name="palletCode">婧愭墭鐩樺彿</param>
+/// <returns>鎿嶄綔缁撴灉</returns>
+public async Task<WebResponseContent> SplitPalletConfirmAsync(string palletCode)
+{
+    WebResponseContent content = new WebResponseContent();
+    try
+    {
+        if (string.IsNullOrWhiteSpace(palletCode))
+            return content.Error("鎵樼洏鍙蜂笉鑳戒负绌�");
+
+        // 1. 浠庝复鏃惰〃璇诲彇鐢佃姱鍒楄〃
+        var tempRecord = SqlSugarClient.Queryable<Dt_SplitTemp>()
+            .Where(t => t.PalletCode == palletCode)
+            .First();
+        if (tempRecord == null)
+            return content.Error("鏈壘鍒版媶鐩樹复鏃惰褰曪紝璇峰厛鎵ц鎷嗙洏鎿嶄綔");
+
+        var sfcList = JsonConvert.DeserializeObject<List<string>>(tempRecord.SfcList);
+        if (sfcList == null || !sfcList.Any())
+            return content.Error("涓存椂琛ㄤ腑鐢佃姱鍒楄〃涓虹┖");
+
+        // 2. 璋冪敤MES瑙g粦
+        var unbindRequest = new UnBindContainerRequest
+        {
+            EquipmentCode = StockConstants.MES_EQUIPMENT_CODE,
+            ResourceCode = StockConstants.MES_RESOURCE_CODE,
+            LocalTime = DateTime.Now,
+            ContainCode = palletCode,
+            SfcList = sfcList
+        };
+        var unbindResult = _mesService.UnBindContainer(unbindRequest);
+        if (unbindResult == null || unbindResult.Data == null || !unbindResult.Data.IsSuccess)
+        {
+            return content.Error($"MES瑙g粦澶辫触: {unbindResult?.Data?.Msg ?? unbindResult?.ErrorMessage ?? "鏈煡閿欒"}");
+        }
+
+        // 3. 鍒犻櫎涓存椂琛ㄨ褰�
+        SqlSugarClient.Deleteable<Dt_SplitTemp>().Where(t => t.PalletCode == palletCode).ExecuteCommand();
+
+        return content.OK("鎵归噺鎷嗙洏纭鎴愬姛");
+    }
+    catch (Exception ex)
+    {
+        return content.Error($"鎵归噺鎷嗙洏纭澶辫触: {ex.Message}");
+    }
+}
+
+/// <summary>
+/// 鎵归噺缁勭洏纭 - 涓�娆℃�ц皟鐢∕ES缁戝畾鏁翠釜鎵樼洏
+/// </summary>
+/// <param name="palletCode">鐩爣鎵樼洏鍙�</param>
+/// <returns>鎿嶄綔缁撴灉</returns>
+public async Task<WebResponseContent> GroupPalletConfirmAsync(string palletCode)
+{
+    WebResponseContent content = new WebResponseContent();
+    try
+    {
+        if (string.IsNullOrWhiteSpace(palletCode))
+            return content.Error("鎵樼洏鍙蜂笉鑳戒负绌�");
+
+        // 1. 鏌ヨ璇ユ墭鐩樹笅鐨勬墍鏈夌數鑺槑缁�
+        var stockInfo = StockInfoService.Repository.QueryFirst(s => s.PalletCode == palletCode);
+        if (stockInfo == null)
+            return content.Error("鎵樼洏涓嶅瓨鍦�");
+
+        var details = StockInfoDetailService.Repository.QueryData(d => d.StockId == stockInfo.Id);
+        if (!details.Any())
+            return content.Error("鎵樼洏涓嬫棤鐢佃姱鏁版嵁");
+
+        // 2. 璋冪敤MES缁戝畾
+        var bindRequest = new BindContainerRequest
+        {
+            ContainerCode = palletCode,
+            EquipmentCode = StockConstants.MES_EQUIPMENT_CODE,
+            ResourceCode = StockConstants.MES_RESOURCE_CODE,
+            LocalTime = DateTime.Now,
+            OperationType = StockConstants.MES_BIND_OPERATION_TYPE,
+            ContainerSfcList = details.Select(d => new ContainerSfcItem
+            {
+                Sfc = d.SerialNumber,
+                Location = d.InboundOrderRowNo.ToString()
+            }).ToList()
+        };
+        var bindResult = _mesService.BindContainer(bindRequest);
+        if (bindResult == null || bindResult.Data == null || !bindResult.Data.IsSuccess)
+        {
+            return content.Error($"MES缁戝畾澶辫触: {bindResult?.Data?.Msg ?? bindResult?.ErrorMessage ?? "鏈煡閿欒"}");
+        }
+
+        return content.OK("鎵归噺缁勭洏纭鎴愬姛");
+    }
+    catch (Exception ex)
+    {
+        return content.Error($"鎵归噺缁勭洏纭澶辫触: {ex.Message}");
+    }
+}
+```
+
+- [ ] **Step 3: Commit**
+
+```bash
+git add WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockService.cs
+git commit -m "feat(StockService): 瀹炵幇SplitPalletConfirmAsync鍜孏roupPalletConfirmAsync
+
+Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>"
+```
+
+---
+
+## Task 5: 淇敼 SplitPalletAsync - 娣诲姞涓存椂琛ㄥ箓绛夊啓鍏ラ�昏緫
+
+**Files:**
+- Modify: `WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockService.cs`
+
+- [ ] **Step 1: 鍦� SplitPalletAsync 鏂规硶寮�澶存坊鍔犱复鏃惰〃鍐欏叆閫昏緫**
+
+鍦� `SplitPalletAsync` 鏂规硶鐨� `try` 鍧楀紑澶达紙`if (stock == null ...` 涔嬪悗锛夈�佸湪浜嬪姟 `ExecuteWithinTransactionAsync` 璋冪敤涔嬪墠锛屾坊鍔狅細
+
+```csharp
+// 骞傜瓑鍐欏叆锛氭鏌ヤ复鏃惰〃鏄惁宸叉湁璇ユ墭鐩樿褰曪紝鏃犲垯鍐欏叆
+var existingTemp = SqlSugarClient.Queryable<Dt_SplitTemp>()
+    .Where(t => t.PalletCode == stock.SourcePalletNo)
+    .First();
+if (existingTemp == null)
+{
+    // 鏌ヨ璇ユ墭鐩樺綋鍓嶆墍鏈夌數鑺紝瀛樺叆涓存椂琛�
+    var sourceStockForTemp = StockInfoService.Repository.QueryFirst(s => s.PalletCode == stock.SourcePalletNo);
+    if (sourceStockForTemp != null)
+    {
+        var allDetails = StockInfoDetailService.Repository.QueryData(d => d.StockId == sourceStockForTemp.Id);
+        if (allDetails.Any())
+        {
+            var sfcListJson = JsonConvert.SerializeObject(allDetails.Select(d => d.SerialNumber).ToList());
+            SqlSugarClient.Insertable(new Dt_SplitTemp
+            {
+                PalletCode = stock.SourcePalletNo,
+                SfcList = sfcListJson,
+                CreateTime = DateTime.Now
+            }).ExecuteCommand();
+        }
+    }
+}
+```
+
+娉ㄦ剰锛氳繖娈典唬鐮佸湪 `return await ExecuteWithinTransactionAsync(...)` 涔嬪墠鎵ц锛屼笉鍦ㄤ簨鍔″唴銆�
+
+- [ ] **Step 2: Commit**
+
+```bash
+git add WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockService.cs
+git commit -m "feat(SplitPalletAsync): 娣诲姞涓存椂琛ㄥ箓绛夊啓鍏ラ�昏緫
+
+Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>"
+```
+
+---
+
+## Task 6: 淇敼 StockController - 娣诲姞鏂拌矾鐢�
+
+**Files:**
+- Modify: `WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Stock/StockController.cs`
+
+- [ ] **Step 1: 鍦� StockController 娣诲姞涓や釜鏂拌矾鐢�**
+
+鍦� `UpdateStockInfoAsync` 鏂规硶涔嬪悗銆佺被缁撴潫 `}` 涔嬪墠娣诲姞锛�
+
+```csharp
+/// <summary>
+/// 鎵归噺鎷嗙洏纭 - WCS鎷嗙洏浠诲姟鍏ㄩ儴鍙栧畬鏃惰皟鐢�
+/// </summary>
+/// <param name="dto">鎷嗙洏纭璇锋眰</param>
+/// <returns>鎿嶄綔缁撴灉</returns>
+[HttpPost("SplitPalletConfirm"), AllowAnonymous]
+public async Task<WebResponseContent> SplitPalletConfirm([FromBody] SplitPalletConfirmRequestDto dto)
+{
+    return await Service.SplitPalletConfirmAsync(dto.PalletCode);
+}
+
+/// <summary>
+/// 鎵归噺缁勭洏纭 - WCS缁勭洏浠诲姟鍏ㄩ儴鏀惧畬鏃惰皟鐢�
+/// </summary>
+/// <param name="dto">缁勭洏纭璇锋眰</param>
+/// <returns>鎿嶄綔缁撴灉</returns>
+[HttpPost("GroupPalletConfirm"), AllowAnonymous]
+public async Task<WebResponseContent> GroupPalletConfirm([FromBody] GroupPalletConfirmRequestDto dto)
+{
+    return await Service.GroupPalletConfirmAsync(dto.PalletCode);
+}
+```
+
+鍚屾椂鍦ㄦ枃浠堕《閮ㄦ坊鍔� using锛�
+
+```csharp
+using WIDESEA_DTO.Stock;
+```
+
+- [ ] **Step 2: Commit**
+
+```bash
+git add WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Stock/StockController.cs
+git commit -m "feat(StockController): 鏂板SplitPalletConfirm鍜孏roupPalletConfirm鎺ュ彛璺敱
+
+Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>"
+```
+
+---
+
+## Task 7: 鏁版嵁搴撳彉鏇磋剼鏈�
+
+**Files:**
+- Create: `WMS/WIDESEA_WMSServer/Database/Scripts/20260416_Dt_SplitTemp.sql`
+
+- [ ] **Step 1: 鍒涘缓涓存椂琛� DDL 鑴氭湰**
+
+```sql
+-- 鎷嗙洏涓存椂琛細鐢ㄤ簬鏆傚瓨鎷嗙洏浠诲姟鐢佃姱鍒楄〃锛屼緵鎵归噺纭鏃朵娇鐢�
+IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Dt_SplitTemp]') AND type in (N'U'))
+BEGIN
+    CREATE TABLE [dbo].[Dt_SplitTemp](
+        [Id] [int] IDENTITY(1,1) NOT NULL,
+        [PalletCode] [nvarchar](50) NOT NULL,
+        [SfcList] [nvarchar](max) NOT NULL,
+        [CreateTime] [datetime] NOT NULL DEFAULT GETDATE(),
+        CONSTRAINT [PK_Dt_SplitTemp] PRIMARY KEY CLUSTERED ([Id] ASC)
+    );
+
+    -- 鍙�夛細娣诲姞鍞竴绱㈠紩闃叉鍚屼竴鎵樼洏閲嶅鍐欏叆
+    CREATE UNIQUE NONCLUSTERED INDEX [IX_Dt_SplitTemp_PalletCode] ON [dbo].[Dt_SplitTemp]([PalletCode] ASC);
+END
+GO
+```
+
+- [ ] **Step 2: Commit**
+
+```bash
+git add WMS/WIDESEA_WMSServer/Database/Scripts/20260416_Dt_SplitTemp.sql
+git commit -m "feat(db): 鏂板Dt_SplitTemp鎷嗙洏涓存椂琛�
+
+Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>"
+```
+
+---
+
+## Task 8: 鏋勫缓楠岃瘉
+
+- [ ] **Step 1: 杩愯 dotnet build 楠岃瘉缂栬瘧閫氳繃**
+
+```bash
+cd D:\Git\ShanMeiXinNengYuan\Code\WMS\WIDESEA_WMSServer
+dotnet build WIDESEA_WMSServer.sln
+```
+
+Expected: Build succeeded with no errors.
+
+---
+
+## 鑷娓呭崟
+
+- [ ] 鎵�鏈� public 鏂规硶鍧囨湁 XML 鏂囨。娉ㄩ噴
+- [ ] `Dt_SplitTemp.SfcList` 浣跨敤 `nvarchar(max)` 瀛樺偍 JSON
+- [ ] `SplitPalletConfirmAsync` 璇诲彇涓存椂琛ㄥ悗鍒犻櫎璁板綍
+- [ ] `SplitPalletAsync` 涓殑涓存椂琛ㄥ啓鍏ュ湪浜嬪姟澶栨墽琛�
+- [ ] `GroupPalletConfirmAsync` 浠� `Dt_StockInfoDetail` 鏌ョ數鑺紝涓嶆煡涓存椂琛�
+- [ ] 涓や釜鏂� Controller 鏂规硶鍧囨爣璁� `[AllowAnonymous]`
+- [ ] 鏁版嵁搴撹剼鏈惈 IF NOT EXISTS 闃叉閲嶅鍒涘缓

--
Gitblit v1.9.3