From c96b149557eb570ec3ae28e0d0c03adef734766a Mon Sep 17 00:00:00 2001
From: wanshenmean <cathay_xy@163.com>
Date: 星期二, 21 四月 2026 15:20:35 +0800
Subject: [PATCH] feat: 添加机械手选择功能并优化MES请求处理

---
 Code/WMS/WIDESEA_WMSClient/src/extension/stock/extend/RobotSelect.vue                       |  125 +++++++++++++++++++++++++
 Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WCS/TaskService_Outbound.cs              |    3 
 Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Stock/StockInfoDetailController.cs |   16 ++-
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/QuartzLogHelper.cs                              |   14 ++
 Code/WMS/WIDESEA_WMSServer/WIDESEA_StockService/MesUploadHelper.cs                          |   20 +++
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneTaskSelector.cs     |   19 +--
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server.csproj                       |    2 
 Code/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockSerivce.cs                             |    6 
 Code/WMS/WIDESEA_WMSServer/WIDESEA_IBasicService/IMesUploadHelper.cs                        |    2 
 Code/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/MesService.cs                               |    2 
 Code/WMS/WIDESEA_WMSServer/WIDESEA_IBasicService/IMesService.cs                             |    7 +
 Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WCS/TaskService_Inbound.cs               |    3 
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/Filter/ApiAuthorizeFilter.cs                     |    3 
 Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Stock/StockInfoController.cs       |    7 +
 Code/WMS/WIDESEA_WMSClient/src/extension/stock/stockInfo.jsx                                |   53 +---------
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/LogHelper/QuartzLogger.cs                        |    2 
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/CommonStackerCraneJob.cs        |    2 
 Code/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MES/UnbindContainerRequestDto.cs                     |    5 +
 Code/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MES/BindContainerRequestDto.cs                       |    5 +
 Code/.omc/state/subagent-tracking.json                                                      |    2 
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/Middlewares/HttpRequestMiddleware.cs             |    2 
 21 files changed, 221 insertions(+), 79 deletions(-)

diff --git a/Code/.omc/state/subagent-tracking.json b/Code/.omc/state/subagent-tracking.json
index ccae26c..585696f 100644
--- a/Code/.omc/state/subagent-tracking.json
+++ b/Code/.omc/state/subagent-tracking.json
@@ -1459,5 +1459,5 @@
   "total_spawned": 135,
   "total_completed": 157,
   "total_failed": 0,
-  "last_updated": "2026-04-20T17:02:18.739Z"
+  "last_updated": "2026-04-21T06:46:41.255Z"
 }
\ No newline at end of file
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/Filter/ApiAuthorizeFilter.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/Filter/ApiAuthorizeFilter.cs
index 36e0e7a..2591142 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/Filter/ApiAuthorizeFilter.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/Filter/ApiAuthorizeFilter.cs
@@ -7,6 +7,7 @@
 using System.Text;
 using System.Threading.Tasks;
 using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Mvc.Filters;
 using Microsoft.Extensions.Hosting;
 using WIDESEAWCS_Core.Authorization;
@@ -112,7 +113,7 @@
                 int ExpMinutes = AppSettings.Get("ExpMinutes").ObjToInt();
                 if ((expDate.GetValueOrDefault() - DateTime.Now).TotalMinutes < ExpMinutes / 3 && context.HttpContext.Request.Path != replaceTokenPath)
                 {
-                    context.HttpContext.Response.Headers.Add("wideseawcs_exp", "1");
+                    context.HttpContext.Response.Headers.Append("wideseawcs_exp", "1");
                 }
             }
         }
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/LogHelper/QuartzLogger.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/LogHelper/QuartzLogger.cs
index 8789c83..a9baa03 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/LogHelper/QuartzLogger.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/LogHelper/QuartzLogger.cs
@@ -166,7 +166,7 @@
                     string fileName = GetLogFileName(entry.Source);
                     string filePath = Path.Combine(_logFolder, fileName);
                     string content = entry.ToFormattedString() + Environment.NewLine;
-                    ConsoleHelper.WriteInfoLine(content);
+                    //ConsoleHelper.WriteInfoLine(content);
                     File.AppendAllText(filePath, content);
                 }
             }
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/Middlewares/HttpRequestMiddleware.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/Middlewares/HttpRequestMiddleware.cs
index 9e651d3..2060a13 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/Middlewares/HttpRequestMiddleware.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/Middlewares/HttpRequestMiddleware.cs
@@ -25,7 +25,7 @@
         public async Task InvokeAsync(HttpContext context)
         {
             
-            context.Response.Headers.Add("Access-Control-Expose-Headers", "wideseawcs_exp");
+            context.Response.Headers.Append("Access-Control-Expose-Headers", "wideseawcs_exp");
             await _next(context);
         }
     }
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server.csproj b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server.csproj
index 3d0d2f9..c9b8993 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server.csproj
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server.csproj
@@ -65,7 +65,7 @@
 	</ItemGroup>
 
 	<ItemGroup>
-		<PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" />
+		<PackageReference Include="Swashbuckle.AspNetCore" Version="8.0.0" />
 	</ItemGroup>
 
 	<ItemGroup>
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/QuartzLogHelper.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/QuartzLogHelper.cs
index f09f4b6..cc0c9a5 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/QuartzLogHelper.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/QuartzLogHelper.cs
@@ -95,4 +95,18 @@
         logger.Debug(loggerMessage, args);
         QuartzLogger.Debug(quartzMessage, deviceCode);
     }
+
+    /// <summary>
+    /// 璁板綍璋冭瘯鏃ュ織
+    /// </summary>
+    /// <param name="logger">ILogger 瀹炰緥</param>
+    /// <param name="loggerMessage">ILogger 鐨勭粨鏋勫寲鏃ュ織妯℃澘锛堟敮鎸佸崰浣嶇锛�</param>
+    /// <param name="quartzMessage">QuartzLogger 鐨勬棩蹇楁秷鎭�</param>
+    /// <param name="deviceCode">璁惧缂栫爜</param>
+    /// <param name="args">ILogger 缁撴瀯鍖栨棩蹇楃殑鍙傛暟</param>
+    public static void LogDebug(ILogger logger, string loggerMessage, string deviceCode)
+    {
+        logger.Debug(loggerMessage);
+        QuartzLogger.Debug(loggerMessage, deviceCode);
+    }
 }
\ No newline at end of file
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/CommonStackerCraneJob.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/CommonStackerCraneJob.cs
index 648454e..cba170a 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/CommonStackerCraneJob.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/CommonStackerCraneJob.cs
@@ -210,6 +210,8 @@
                     return Task.CompletedTask;
                 }
 
+
+
                 // ========== 鏋勫缓鍛戒护 ==========
                 // 鍛戒护鏋勫缓涓嬫矇鍒颁笓鐢ㄦ瀯寤哄櫒
                 object? stackerCraneTaskCommand = _commandBuilder.ConvertToStackerCraneTaskCommand(task);
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneTaskSelector.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneTaskSelector.cs
index 5d14c3f..80771a1 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneTaskSelector.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneTaskSelector.cs
@@ -100,15 +100,14 @@
             Dt_Task? candidateTask;
             var deviceCode = commonStackerCrane.DeviceCode;
 
-            //_logger.LogInformation("SelectTask锛氬紑濮嬮�夋嫨浠诲姟锛岃澶�: {DeviceCode}锛屼笂涓�浠诲姟绫诲瀷: {LastTaskType}", deviceCode, commonStackerCrane.LastTaskType);
-            //QuartzLogger.Info($"寮�濮嬮�夋嫨浠诲姟锛岃澶�: {deviceCode}锛屼笂涓�浠诲姟绫诲瀷: {commonStackerCrane.LastTaskType}", deviceCode);
+            QuartzLogHelper.LogDebug(_logger, $"寮�濮嬮�夋嫨浠诲姟锛岃澶�: {deviceCode}锛屼笂涓�浠诲姟绫诲瀷: {commonStackerCrane.LastTaskType}",commonStackerCrane.DeviceName);
 
             // 鏍规嵁涓婁竴浠诲姟绫诲瀷鍐冲畾鏌ヨ绛栫暐
             if (commonStackerCrane.LastTaskType == null || commonStackerCrane.LastTaskType == TaskRelocationTypeEnum.Relocation.GetHashCode())
             {
                 // 娌℃湁涓婁竴浠诲姟绫诲瀷锛屾煡璇㈡櫘閫氫换鍔�
                 candidateTask = _taskService.QueryStackerCraneTask(deviceCode);
-                //QuartzLogHelper.LogDebug(_logger, "SelectTask锛氭煡璇㈡櫘閫氫换鍔★紝璁惧: {DeviceCode}锛岀粨鏋�: {TaskNum}", $"鏌ヨ鏅�氫换鍔★紝璁惧: {deviceCode}锛岀粨鏋�: {candidateTask?.TaskNum}", deviceCode, deviceCode, candidateTask?.TaskNum);
+                QuartzLogHelper.LogDebug(_logger, $"鏌ヨ鏅�氫换鍔★紝璁惧: {deviceCode}锛岀粨鏋�: {candidateTask?.TaskNum}", commonStackerCrane.DeviceName);
             }
             else if (commonStackerCrane.LastTaskType.GetValueOrDefault().GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
             {
@@ -116,26 +115,26 @@
                 candidateTask = _taskService.QueryStackerCraneInTask(deviceCode);
                 // 濡傛灉娌℃湁鍏ュ簱浠诲姟锛屽啀鏌ヤ竴涓嬪嚭搴撲换鍔�
                 candidateTask ??= _taskService.QueryStackerCraneOutTask(deviceCode);
-                //QuartzLogHelper.LogDebug(_logger, "SelectTask锛氬嚭搴撳悗浼樺厛鏌ュ叆搴擄紝璁惧: {DeviceCode}锛岀粨鏋�: {TaskNum}", $"鍑哄簱鍚庝紭鍏堟煡鍏ュ簱锛岃澶�: {deviceCode}锛岀粨鏋�: {candidateTask?.TaskNum}", deviceCode, deviceCode, candidateTask?.TaskNum);
+                QuartzLogHelper.LogDebug(_logger, $"鍑哄簱鍚庝紭鍏堟煡鍏ュ簱锛岃澶�: {deviceCode}锛岀粨鏋�: {candidateTask?.TaskNum}", commonStackerCrane.DeviceName);
             }
             else
             {
                 // 涓婁竴浠诲姟鏄叆搴擄紙闈炲嚭搴擄級锛屼紭鍏堟煡鍑哄簱浠诲姟
                 candidateTask = _taskService.QueryStackerCraneOutTask(deviceCode);
-                //QuartzLogHelper.LogDebug(_logger, "SelectTask锛氬叆搴撳悗浼樺厛鏌ュ嚭搴擄紝璁惧: {DeviceCode}锛岀粨鏋�: {TaskNum}", $"鍏ュ簱鍚庝紭鍏堟煡鍑哄簱锛岃澶�: {deviceCode}锛岀粨鏋�: {candidateTask?.TaskNum}", deviceCode, deviceCode, candidateTask?.TaskNum);
+                QuartzLogHelper.LogDebug(_logger, $"鍏ュ簱鍚庝紭鍏堟煡鍑哄簱锛岃澶�: {deviceCode}锛岀粨鏋�: {candidateTask?.TaskNum}", commonStackerCrane.DeviceName);
             }
 
             // 濡傛灉娌℃湁鍊欓�変换鍔★紝杩斿洖 null
             if (candidateTask == null)
             {
-                //QuartzLogHelper.LogDebug(_logger, "SelectTask锛氭病鏈夊�欓�変换鍔★紝璁惧: {DeviceCode}", $"娌℃湁鍊欓�変换鍔★紝璁惧: {deviceCode}", deviceCode, deviceCode);
+                QuartzLogHelper.LogDebug(_logger, $"娌℃湁鍊欓�変换鍔★紝璁惧: {deviceCode}", commonStackerCrane.DeviceName);
                 return null;
             }
 
             // 濡傛灉涓嶆槸鍑哄簱浠诲姟锛岀洿鎺ヨ繑鍥�
             if (candidateTask.TaskType.GetTaskTypeGroup() != TaskTypeGroup.OutbondGroup)
             {
-                QuartzLogHelper.LogInfo(_logger, "SelectTask锛氶�変腑闈炲嚭搴撲换鍔★紝璁惧: {DeviceCode}锛屼换鍔″彿: {TaskNum}锛屼换鍔$被鍨�: {TaskType}", $"閫変腑闈炲嚭搴撲换鍔★紝浠诲姟鍙�: {candidateTask.TaskNum}锛屼换鍔$被鍨�: {candidateTask.TaskType}", deviceCode, deviceCode, candidateTask.TaskNum, candidateTask.TaskType);
+                QuartzLogHelper.LogDebug(_logger, $"閫変腑闈炲嚭搴撲换鍔★紝浠诲姟鍙�: {candidateTask.TaskNum}锛屼换鍔$被鍨�: {candidateTask.TaskType}", commonStackerCrane.DeviceName);
                 return candidateTask;
             }
 
@@ -143,7 +142,7 @@
             Dt_Task? selectedTask = TrySelectOutboundTask(candidateTask);
             if (selectedTask != null)
             {
-                QuartzLogHelper.LogInfo(_logger, "SelectTask锛氶�変腑鍑哄簱浠诲姟锛岃澶�: {DeviceCode}锛屼换鍔″彿: {TaskNum}", $"閫変腑鍑哄簱浠诲姟锛屼换鍔″彿: {selectedTask.TaskNum}", deviceCode, deviceCode, selectedTask.TaskNum);
+                QuartzLogHelper.LogDebug(_logger, $"閫変腑鍑哄簱浠诲姟锛屼换鍔″彿: {selectedTask.TaskNum}", commonStackerCrane.DeviceName);
                 return selectedTask;
             }
 
@@ -160,14 +159,14 @@
                 selectedTask = TrySelectOutboundTask(alternativeTask);
                 if (selectedTask != null)
                 {
-                    QuartzLogHelper.LogInfo(_logger, "SelectTask锛氶�変腑澶囬�夊嚭搴撲换鍔★紝璁惧: {DeviceCode}锛屼换鍔″彿: {TaskNum}", $"閫変腑澶囬�夊嚭搴撲换鍔★紝浠诲姟鍙�: {selectedTask.TaskNum}", deviceCode, deviceCode, selectedTask.TaskNum);
+                    QuartzLogHelper.LogDebug(_logger, $"閫変腑澶囬�夊嚭搴撲换鍔★紝浠诲姟鍙�: {selectedTask.TaskNum}", commonStackerCrane.DeviceName);
                     return selectedTask;
                 }
             }
 
             // 娌℃湁鍙敤鍑哄簱浠诲姟锛屽皾璇曡繑鍥炲叆搴撲换鍔�
             var inboundTask = _taskService.QueryStackerCraneInTask(deviceCode);
-            QuartzLogHelper.LogInfo(_logger, "SelectTask锛氳繑鍥炲叆搴撲换鍔★紝璁惧: {DeviceCode}锛屼换鍔″彿: {TaskNum}", $"杩斿洖鍏ュ簱浠诲姟锛屼换鍔″彿: {inboundTask?.TaskNum}", deviceCode, deviceCode, inboundTask?.TaskNum);
+            QuartzLogHelper.LogDebug(_logger, $"杩斿洖鍏ュ簱浠诲姟锛屼换鍔″彿: {inboundTask?.TaskNum}", commonStackerCrane.DeviceName);
             return inboundTask;
         }
 
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/stock/extend/RobotSelect.vue b/Code/WMS/WIDESEA_WMSClient/src/extension/stock/extend/RobotSelect.vue
new file mode 100644
index 0000000..80bd972
--- /dev/null
+++ b/Code/WMS/WIDESEA_WMSClient/src/extension/stock/extend/RobotSelect.vue
@@ -0,0 +1,125 @@
+<template>
+  <div>
+    <vol-box
+      v-model="showDetialBox"
+      :lazy="true"
+      width="400px"
+      :padding="15"
+      title="閫夋嫨鏈烘鎵�"
+    >
+      <div>
+        <el-form>
+          <el-form-item required label="鏈烘鎵嬶細">
+            <el-select v-model="selectedRobot" placeholder="璇烽�夋嫨鏈烘鎵�" style="width: 100%">
+              <el-option
+                v-for="item in robotList"
+                :key="item.robotCode"
+                :label="item.robotName"
+                :value="item.robotCode"
+              >
+              </el-option>
+            </el-select>
+          </el-form-item>
+        </el-form>
+      </div>
+      <template #footer>
+        <el-button type="primary" size="small" @click="submit">纭</el-button>
+        <el-button type="danger" size="small" @click="close">鍏抽棴</el-button>
+      </template>
+    </vol-box>
+  </div>
+</template>
+
+<script>
+import VolBox from "@/components/basic/VolBox.vue";
+export default {
+  components: { VolBox },
+  data() {
+    return {
+      showDetialBox: false,
+      robotList: [
+        { robotCode: '娉ㄦ恫缁勭洏鏈烘鎵�', robotName: '娉ㄦ恫缁勭洏鏈烘鎵�' },
+        { robotCode: '楂樻俯鎹㈢洏鏈烘鎵�', robotName: '楂樻俯鎹㈢洏鏈烘鎵�' },
+        { robotCode: '鍖栨垚鎹㈢洏鏈烘鎵�', robotName: '鍖栨垚鎹㈢洏鏈烘鎵�' },
+        { robotCode: '鎷嗙洏鏈烘鎵�', robotName: '鎷嗙洏鏈烘鎵�' },
+        { robotCode: '鎴愬搧缁勭洏鏈烘鎵�', robotName: '鎴愬搧缁勭洏鏈烘鎵�' }
+      ],
+      selectedRobot: '',
+      currentRow: null,
+      actionType: null // 'bind' or 'unbind'
+    };
+  },
+  methods: {
+    open(action, row) {
+      this.actionType = action;
+      this.currentRow = row;
+      this.selectedRobot = '';
+      this.showDetialBox = true;
+    },
+    close() {
+      this.showDetialBox = false;
+    },
+    async submit() {
+      if (!this.selectedRobot) {
+        return this.$message.error("璇烽�夋嫨鏈烘鎵�");
+      }
+
+      this.showDetialBox = false;
+
+      try {
+        if (this.actionType === 'bind') {
+          // 缁勭洏纭
+          await this.$confirm(
+            `纭鎵ц鎵樼洏缁勭洏鎿嶄綔锛焅n鎵樼洏缂栧彿锛�${this.currentRow.palletCode}\n鏈烘鎵嬶細${this.selectedRobot}`,
+            "缁勭洏纭",
+            {
+              confirmButtonText: "纭",
+              cancelButtonText: "鍙栨秷",
+              type: "warning"
+            }
+          );
+
+          const result = await this.http.post("/api/StockInfoDetail/BindContainer", {
+            palletCode: this.currentRow.palletCode,
+            robotCode: this.selectedRobot
+          }, "姝e湪璋冪敤MES鎺ュ彛...");
+
+          if (result.status) {
+            this.$Message.success(result.message || "鎵樼洏缁勭洏鎴愬姛");
+            this.$parent.$refs.table.load();
+          } else {
+            this.$error(result.message || "鎵樼洏缁勭洏澶辫触");
+          }
+        } else if (this.actionType === 'unbind') {
+          // 鎷嗙洏纭
+          await this.$confirm(
+            `纭鎵ц鎵樼洏鎷嗙洏鎿嶄綔锛焅n鎵樼洏缂栧彿锛�${this.currentRow.palletCode}\n鏈烘鎵嬶細${this.selectedRobot}`,
+            "鎷嗙洏纭",
+            {
+              confirmButtonText: "纭",
+              cancelButtonText: "鍙栨秷",
+              type: "warning"
+            }
+          );
+
+          const result = await this.http.post("/api/StockInfoDetail/UnbindContainer", {
+            palletCode: this.currentRow.palletCode,
+            robotCode: this.selectedRobot
+          }, "姝e湪璋冪敤MES鎺ュ彛...");
+
+          if (result.status) {
+            this.$Message.success(result.message || "鎵樼洏鎷嗙洏鎴愬姛");
+            this.$parent.$refs.table.load();
+          } else {
+            this.$error(result.message || "鎵樼洏鎷嗙洏澶辫触");
+          }
+        }
+      } catch (error) {
+        if (error !== "cancel") {
+          this.$error(error.message || "缃戠粶閿欒锛岃绋嶅悗閲嶈瘯");
+        }
+      }
+    }
+  }
+};
+</script>
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/stock/stockInfo.jsx b/Code/WMS/WIDESEA_WMSClient/src/extension/stock/stockInfo.jsx
index 0885fc8..6d53e9c 100644
--- a/Code/WMS/WIDESEA_WMSClient/src/extension/stock/stockInfo.jsx
+++ b/Code/WMS/WIDESEA_WMSClient/src/extension/stock/stockInfo.jsx
@@ -1,10 +1,11 @@
 //姝s鏂囦欢鏄敤鏉ヨ嚜瀹氫箟鎵╁睍涓氬姟浠g爜锛屽彲浠ユ墿灞曚竴浜涜嚜瀹氫箟椤甸潰鎴栬�呴噸鏂伴厤缃敓鎴愮殑浠g爜
+import RobotSelect from './extend/RobotSelect.vue';
 
 let extension = {
   components: {
     //鏌ヨ鐣岄潰鎵╁睍缁勪欢
     gridHeader: '',
-    gridBody: '',
+    gridBody: RobotSelect,
     gridFooter: '',
     //鏂板缓銆佺紪杈戝脊鍑烘鎵╁睍缁勪欢
     modelHeader: '',
@@ -54,29 +55,8 @@
     },
 
     // 鎵樼洏缁勭洏鎿嶄綔
-    async handleBind(row) {
-      try {
-        await this.$confirm(`纭鎵ц鎵樼洏缁勭洏鎿嶄綔锛焅n鎵樼洏缂栧彿锛�${row.palletCode}`, "缁勭洏纭", {
-          confirmButtonText: "纭",
-          cancelButtonText: "鍙栨秷",
-          type: "warning"
-        });
-
-        const result = await this.http.post("/api/StockInfoDetail/BindContainer", {
-          palletCode: row.palletCode
-        }, "姝e湪璋冪敤MES鎺ュ彛...");
-
-        if (result.status) {
-          this.$Message.success(result.message || "鎵樼洏缁勭洏鎴愬姛");
-          this.$refs.table.load();
-        } else {
-          this.$error(result.message || "鎵樼洏缁勭洏澶辫触");
-        }
-      } catch (error) {
-        if (error !== "cancel") {
-          this.$error(error.message || "缃戠粶閿欒锛岃绋嶅悗閲嶈瘯");
-        }
-      }
+    handleBind(row) {
+      this.$refs.gridBody.open('bind', row);
     },
 
     // 鎵樼洏杩涚珯鎿嶄綔
@@ -134,29 +114,8 @@
     },
 
     // 鎵樼洏鎷嗙洏鎿嶄綔
-    async handleUnbind(row) {
-      try {
-        await this.$confirm(`纭鎵ц鎵樼洏鎷嗙洏鎿嶄綔锛焅n鎵樼洏缂栧彿锛�${row.palletCode}`, "鎷嗙洏纭", {
-          confirmButtonText: "纭",
-          cancelButtonText: "鍙栨秷",
-          type: "warning"
-        });
-
-        const result = await this.http.post("/api/StockInfoDetail/UnbindContainer", {
-          palletCode: row.palletCode,
-        }, "姝e湪璋冪敤MES鎺ュ彛...");
-
-        if (result.status) {
-          this.$Message.success(result.message || "鎵樼洏鎷嗙洏鎴愬姛");
-          this.$refs.table.load();
-        } else {
-          this.$error(result.message || "鎵樼洏鎷嗙洏澶辫触");
-        }
-      } catch (error) {
-        if (error !== "cancel") {
-          this.$error(error.message || "缃戠粶閿欒锛岃绋嶅悗閲嶈瘯");
-        }
-      }
+    handleUnbind(row) {
+      this.$refs.gridBody.open('unbind', row);
     },
 
     onInited() {
diff --git a/Code/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/MesService.cs b/Code/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/MesService.cs
index 8f1d43f..6092fa3 100644
--- a/Code/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/MesService.cs
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_BasicService/MesService.cs
@@ -43,7 +43,7 @@
             };
         }
 
-        private HttpRequestConfig BuildConfig(string token)
+        public HttpRequestConfig BuildConfig(string token)
         {
             return new HttpRequestConfig
             {
diff --git a/Code/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MES/BindContainerRequestDto.cs b/Code/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MES/BindContainerRequestDto.cs
index 2e9d728..8d70be1 100644
--- a/Code/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MES/BindContainerRequestDto.cs
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MES/BindContainerRequestDto.cs
@@ -18,6 +18,11 @@
         public List<string> SfcList { get; set; }
 
         /// <summary>
+        /// 璁惧鍚嶇О
+        /// </summary>
+        public string DeviceName { get; set; }
+
+        /// <summary>
         /// 浣嶇疆淇℃伅
         /// </summary>
         public string Location { get; set; }
diff --git a/Code/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MES/UnbindContainerRequestDto.cs b/Code/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MES/UnbindContainerRequestDto.cs
index f994036..9812d84 100644
--- a/Code/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MES/UnbindContainerRequestDto.cs
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MES/UnbindContainerRequestDto.cs
@@ -13,6 +13,11 @@
         public string PalletCode { get; set; }
 
         /// <summary>
+        /// 璁惧鍚嶇О
+        /// </summary>
+        public string DeviceName { get; set; }
+
+        /// <summary>
         /// 鐢佃姱鐮佸垪琛�
         /// </summary>
         public List<string> SfcList { get; set; }
diff --git a/Code/WMS/WIDESEA_WMSServer/WIDESEA_IBasicService/IMesService.cs b/Code/WMS/WIDESEA_WMSServer/WIDESEA_IBasicService/IMesService.cs
index 3118962..a7a40b0 100644
--- a/Code/WMS/WIDESEA_WMSServer/WIDESEA_IBasicService/IMesService.cs
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_IBasicService/IMesService.cs
@@ -53,5 +53,12 @@
         /// 鎵樼洏鍑虹珯锛堟敮鎸佸姩鎬乀oken锛�
         /// </summary>
         HttpResponseResult<MesResponse> OutboundInContainer(OutboundInContainerRequest request, string token);
+
+        /// <summary>
+        ///  璇锋眰澶撮厤缃�
+        /// </summary>
+        /// <param name="token"> 璇锋眰Token</param>
+        /// <returns></returns>
+        HttpRequestConfig BuildConfig(string token);
     }
 }
\ No newline at end of file
diff --git a/Code/WMS/WIDESEA_WMSServer/WIDESEA_IBasicService/IMesUploadHelper.cs b/Code/WMS/WIDESEA_WMSServer/WIDESEA_IBasicService/IMesUploadHelper.cs
index 705c340..1f9aac5 100644
--- a/Code/WMS/WIDESEA_WMSServer/WIDESEA_IBasicService/IMesUploadHelper.cs
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_IBasicService/IMesUploadHelper.cs
@@ -22,7 +22,7 @@
             MesUploadStatusEnum successStatus,
             string apiType,
             string requestJson,
-            Func<(bool isSuccess, string responseJson, string errorMessage)> mesCall,
+            Func<(bool isSuccess, string responseJson, string errorMessage, string httpRequest)> mesCall,
             string creator = "System");
     }
 }
diff --git a/Code/WMS/WIDESEA_WMSServer/WIDESEA_StockService/MesUploadHelper.cs b/Code/WMS/WIDESEA_WMSServer/WIDESEA_StockService/MesUploadHelper.cs
index 52672b6..6ef6023 100644
--- a/Code/WMS/WIDESEA_WMSServer/WIDESEA_StockService/MesUploadHelper.cs
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_StockService/MesUploadHelper.cs
@@ -1,9 +1,10 @@
+using Newtonsoft.Json.Linq;
 using System.Diagnostics;
 using WIDESEA_Common.StockEnum;
 using WIDESEA_Core;
 using WIDESEA_DTO.MES;
-using WIDESEA_IStockService;
 using WIDESEA_IBasicService;
+using WIDESEA_IStockService;
 
 namespace WIDESEA_StockService
 {
@@ -34,7 +35,7 @@
             MesUploadStatusEnum successStatus,
             string apiType,
             string requestJson,
-            Func<(bool isSuccess, string responseJson, string errorMessage)> mesCall,
+            Func<(bool isSuccess, string responseJson, string errorMessage, string httpRequest)> mesCall,
             string creator = "System")
         {
             _ = Task.Run(async () =>
@@ -42,12 +43,14 @@
                 var stopwatch = Stopwatch.StartNew();
                 try
                 {
-                    var (isSuccess, responseJson, errorMessage) = mesCall();
+                    var (isSuccess, responseJson, errorMessage, httpRequest) = mesCall();
                     stopwatch.Stop();
 
                     // 濂囨暟=鎴愬姛锛屽伓鏁�=澶辫触
                     int status = isSuccess ? (int)successStatus : (int)successStatus + 1;
                     await _stockInfoService.UpdateMesUploadStatusAsync(palletCode, status);
+
+                    requestJson = MergeJsonObjects(requestJson, httpRequest);
 
                     await LogAsync(palletCode, apiType, requestJson, responseJson,
                         stopwatch.ElapsedMilliseconds, isSuccess, errorMessage, creator);
@@ -89,5 +92,16 @@
                 // 鏃ュ織璁板綍澶辫触涓嶅奖鍝嶄富娴佺▼
             }
         }
+
+        public static string MergeJsonObjects(string json1, string json2)
+        {
+            var obj1 = JObject.Parse(json1);
+            var obj2 = JObject.Parse(json2);
+            obj1.Merge(obj2, new JsonMergeSettings
+            {
+                MergeArrayHandling = MergeArrayHandling.Union   // 鏁扮粍鍚堝苟鏂瑰紡锛屽彲鎸夐渶淇敼
+            });
+            return obj1.ToString();
+        }
     }
 }
diff --git a/Code/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockSerivce.cs b/Code/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockSerivce.cs
index 1e37368..4e7212c 100644
--- a/Code/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockSerivce.cs
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockSerivce.cs
@@ -463,7 +463,8 @@
                         return (
                             result?.Data?.IsSuccess ?? false,
                             System.Text.Json.JsonSerializer.Serialize(result),
-                            result?.Data?.Msg ?? result?.ErrorMessage ?? "鏈煡閿欒"
+                            result?.Data?.Msg ?? result?.ErrorMessage ?? "鏈煡閿欒",
+                            _mesService.BuildConfig(token ?? string.Empty).ToJson()
                         );
                     });
 
@@ -548,7 +549,8 @@
                         return (
                             result?.Data?.IsSuccess ?? false,
                             System.Text.Json.JsonSerializer.Serialize(result),
-                            result?.Data?.Msg ?? result?.ErrorMessage ?? "鏈煡閿欒"
+                            result?.Data?.Msg ?? result?.ErrorMessage ?? "鏈煡閿欒",
+                            _mesService.BuildConfig(token ?? string.Empty).ToJson()
                         );
                     });
 
diff --git a/Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WCS/TaskService_Inbound.cs b/Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WCS/TaskService_Inbound.cs
index 1a731c9..4cbd519 100644
--- a/Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WCS/TaskService_Inbound.cs
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WCS/TaskService_Inbound.cs
@@ -206,7 +206,8 @@
                                 return (
                                     result?.Data?.IsSuccess ?? false,
                                     JsonConvert.SerializeObject(result),
-                                    result?.Data?.Msg ?? result?.ErrorMessage ?? "鏈煡閿欒"
+                                    result?.Data?.Msg ?? result?.ErrorMessage ?? "鏈煡閿欒",
+                                    _mesService.BuildConfig(token ?? string.Empty).ToJson()
                                 );
                             });
 
diff --git a/Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WCS/TaskService_Outbound.cs b/Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WCS/TaskService_Outbound.cs
index 3f0f31d..ead9c74 100644
--- a/Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WCS/TaskService_Outbound.cs
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WCS/TaskService_Outbound.cs
@@ -153,7 +153,8 @@
                             return (
                                 result?.Data?.IsSuccess ?? false,
                                 Newtonsoft.Json.JsonConvert.SerializeObject(result),
-                                result?.Data?.Msg ?? result?.ErrorMessage ?? "鏈煡閿欒"
+                                result?.Data?.Msg ?? result?.ErrorMessage ?? "鏈煡閿欒",
+                                _mesService.BuildConfig(token ?? string.Empty).ToJson()
                             );
                         });
 
diff --git a/Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Stock/StockInfoController.cs b/Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Stock/StockInfoController.cs
index ec09348..3c66a24 100644
--- a/Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Stock/StockInfoController.cs
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Stock/StockInfoController.cs
@@ -11,6 +11,7 @@
 using WIDESEA_Model.Models;
 using WIDESEA_Common.Constants;
 using WIDESEA_Common.StockEnum;
+using WIDESEA_Core.Helper;
 
 namespace WIDESEA_WMSServer.Controllers.Stock
 {
@@ -115,7 +116,8 @@
                         return (
                             result.Data?.IsSuccess ?? false,
                             System.Text.Json.JsonSerializer.Serialize(result),
-                            result?.Data?.Msg ?? result?.ErrorMessage ?? "鏈煡閿欒"
+                            result?.Data?.Msg ?? result?.ErrorMessage ?? "鏈煡閿欒",
+                            _mesService.BuildConfig(token ?? string.Empty).ToJson()
                         );
                     },
                     App.User.UserName);
@@ -205,7 +207,8 @@
                         return (
                             result?.Data?.IsSuccess ?? false,
                             System.Text.Json.JsonSerializer.Serialize(result),
-                            result?.Data?.Msg ?? result?.ErrorMessage ?? "鏈煡閿欒"
+                            result?.Data?.Msg ?? result?.ErrorMessage ?? "鏈煡閿欒",
+                            _mesService.BuildConfig(token ?? string.Empty).ToJson()
                         );
                     },
                     App.User.UserName);
diff --git a/Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Stock/StockInfoDetailController.cs b/Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Stock/StockInfoDetailController.cs
index de85b5f..a3cf0df 100644
--- a/Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Stock/StockInfoDetailController.cs
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Stock/StockInfoDetailController.cs
@@ -3,6 +3,7 @@
 using WIDESEA_Common.StockEnum;
 using WIDESEA_Core;
 using WIDESEA_Core.BaseController;
+using WIDESEA_Core.Helper;
 using WIDESEA_DTO.MES;
 using WIDESEA_IBasicService;
 using WIDESEA_IStockService;
@@ -66,7 +67,7 @@
                 var stockInfo = await _stockInfoService.Repository.QueryDataNavFirstAsync(x => x.PalletCode == dto.PalletCode);
 
                 // 3. 鍔ㄦ�佽幏鍙朚ES鍑瘉
-                var mesConfig = _mesDeviceConfigService.GetByDeviceName("缁勭洏鏈烘鎵�");
+                var mesConfig = _mesDeviceConfigService.GetByDeviceName(dto.DeviceName);
                 string equipmentCode = mesConfig?.EquipmentCode ?? StockConstants.MES_EQUIPMENT_CODE;
                 string resourceCode = mesConfig?.ResourceCode ?? StockConstants.MES_RESOURCE_CODE;
                 string token = mesConfig?.Token;
@@ -102,7 +103,8 @@
                         return (
                             result?.Data?.IsSuccess ?? false,
                             System.Text.Json.JsonSerializer.Serialize(result),
-                            result?.Data?.Msg ?? result?.ErrorMessage ?? "鏈煡閿欒"
+                            result?.Data?.Msg ?? result?.ErrorMessage ?? "鏈煡閿欒",
+                            _mesService.BuildConfig(token ?? string.Empty).ToJson()
                         );
                     },
                     App.User.UserName);
@@ -143,7 +145,7 @@
                 var stockInfo = await _stockInfoService.Repository.QueryDataNavFirstAsync(x => dto.PalletCode == x.PalletCode);
 
                 // 3. 鍔ㄦ�佽幏鍙朚ES鍑瘉
-                var mesConfig = _mesDeviceConfigService.GetByDeviceName("缁勭洏鏈烘鎵�");
+                var mesConfig = _mesDeviceConfigService.GetByDeviceName(dto.DeviceName);
                 string equipmentCode = mesConfig?.EquipmentCode ?? StockConstants.MES_EQUIPMENT_CODE;
                 string resourceCode = mesConfig?.ResourceCode ?? StockConstants.MES_RESOURCE_CODE;
                 string token = mesConfig?.Token;
@@ -174,7 +176,8 @@
                         return (
                             result?.Data?.IsSuccess ?? false,
                             System.Text.Json.JsonSerializer.Serialize(result),
-                            result?.Data?.Msg ?? result?.ErrorMessage ?? "鏈煡閿欒"
+                            result?.Data?.Msg ?? result?.ErrorMessage ?? "鏈煡閿欒",
+                            _mesService.BuildConfig(token ?? string.Empty).ToJson()
                         );
                     },
                     App.User.UserName);
@@ -253,9 +256,10 @@
                     {
                         var result = _mesService.ContainerNgReport(mesRequest);
                         return (
-                            result?.IsSuccess ?? false,
+                            result?.Data?.IsSuccess ?? false,
                             System.Text.Json.JsonSerializer.Serialize(result),
-                            result?.ErrorMessage ?? "鏈煡閿欒"
+                            result?.Data?.Msg ?? result?.ErrorMessage ?? "鏈煡閿欒",
+                            _mesService.BuildConfig(mesConfig?.Token ?? string.Empty).ToJson()
                         );
                     },
                     App.User.UserName);

--
Gitblit v1.9.3