From ce1292c9cf37195b6abd2699dfc5d6cb3e143c9b Mon Sep 17 00:00:00 2001
From: wanshenmean <cathay_xy@163.com>
Date: 星期日, 12 四月 2026 23:38:19 +0800
Subject: [PATCH] feat(MES): 添加MES接口相关实体和DTO JS扩展文件至JSX格式并更新配置

---
 Code/WMS/WIDESEA_WMSClient/src/extension/check/checkOrder.jsx                               |    0 
 Code/WMS/WIDESEA_WMSClient/src/extension/inbound/inboundOrder_Hty.jsx                       |    0 
 Code/WCS/WIDESEAWCS_Client/src/views/system/Sys_Dictionary.vue                              |    2 
 Code/WMS/WIDESEA_WMSClient/src/extension/outbound/outboundOrderDetail_Hty.jsx               |    0 
 Code/WMS/WIDESEA_WMSClient/src/extension/basic/materielCodeInfo.jsx                         |    0 
 Code/WMS/WIDESEA_WMSClient/src/extension/system/Sys_DictionaryList.jsx                      |    0 
 Code/WMS/WIDESEA_WMSClient/src/views/outbound/outboundOrder_Hty.vue                         |    2 
 Code/WMS/WIDESEA_WMSClient/src/views/stock/stockInfo_Hty.vue                                |    2 
 Code/WMS/WIDESEA_WMSClient/src/views/basic/materielInfo.vue                                 |    2 
 Code/WMS/WIDESEA_WMSClient/src/extension/basic/materielInfo.jsx                             |    0 
 Code/WMS/WIDESEA_WMSClient/src/views/basic/customerInfo.vue                                 |    2 
 Code/WCS/WIDESEAWCS_Client/src/views/system/Sys_Role1.vue                                   |    2 
 Code/WMS/WIDESEA_WMSClient/src/views/basic/supplierInfo.vue                                 |    2 
 Code/WMS/WIDESEA_WMSClient/src/extension/stock/stockInfo.jsx                                |  123 +
 Code/WMS/WIDESEA_WMSClient/src/extension/system/system/Sys_Department.jsx                   |    0 
 Code/WMS/WIDESEA_WMSClient/src/views/system/Sys_DictionaryList.vue                          |    2 
 Code/WMS/WIDESEA_WMSClient/src/views/system/Sys_Tenant.vue                                  |    2 
 Code/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MES/InboundInContainerRequestDto.cs                  |   18 
 Code/.omc/state/agent-replay-9007b9ea-1eb6-4d24-8fe7-2c3a949eac88.jsonl                     |   58 
 Code/WMS/WIDESEA_WMSClient/src/views/outbound/outboundOrderDetail.vue                       |    2 
 Code/WCS/WIDESEAWCS_Client/src/extension/taskinfo/task.jsx                                  |    0 
 Code/WMS/WIDESEA_WMSClient/src/views/inbound/purchaseOrder.vue                              |    2 
 Code/WMS/WIDESEA_WMSClient/src/views/system/Sys_User.vue                                    |    2 
 Code/WMS/WIDESEA_WMSClient/src/views/inbound/inboundOrder_Hty.vue                           |    2 
 Code/WCS/WIDESEAWCS_Client/src/extension/quartzJob/dispatchInfo.jsx                         |    0 
 Code/WMS/WIDESEA_WMSClient/src/extension/outbound/mesOutboundOrder.jsx                      |    0 
 Code/WMS/WIDESEA_WMSClient/src/extension/stock/stockInfoDetail.jsx                          |  170 +
 Code/docs/superpowers/plans/2026-04-12-mes-integration-plan.md                              | 1933 +++++++++++++++++
 Code/.superpowers/brainstorm/2159-1775998341/.server-stopped                                |    1 
 Code/WMS/WIDESEA_WMSClient/src/extension/inbound/purchaseOrder.jsx                          |    0 
 Code/WMS/WIDESEA_WMSClient/src/extension/basic/roadwayInfo.jsx                              |    0 
 Code/WMS/WIDESEA_WMSClient/src/extension/stock/stockView.jsx                                |    0 
 Code/WCS/WIDESEAWCS_Client/src/extension/system/Sys_Dictionary.jsx                          |    0 
 Code/WMS/WIDESEA_WMSServer/WIDESEA_MesService/WIDESEA_MesService.csproj                     |   16 
 Code/WMS/WIDESEA_WMSClient/src/extension/basic/supplierInfo.jsx                             |    0 
 Code/WCS/WIDESEAWCS_Client/src/views/system/Sys_Tenant.vue                                  |    2 
 Code/WMS/WIDESEA_WMSClient/src/extension/basic/warehouse.jsx                                |    0 
 Code/WMS/WIDESEA_WMSClient/src/views/inbound/inboundOrderDetail.vue                         |    2 
 Code/.superpowers/brainstorm/2159-1775998341/operations-column.html                         |  203 +
 Code/WCS/WIDESEAWCS_Client/src/extension/basicinfo/router.jsx                               |    0 
 Code/WMS/WIDESEA_WMSServer/WIDESEA_IMesService/IMesLogService.cs                            |   28 
 Code/WCS/WIDESEAWCS_Client/src/extension/system/system/Sys_Department.jsx                   |    0 
 Code/WMS/WIDESEA_WMSServer/WIDESEA_IMesService/WIDESEA_IMesService.csproj                   |   14 
 Code/.superpowers/brainstorm/2159-1775998341/waiting.html                                   |    3 
 Code/WCS/WIDESEAWCS_Client/src/extension/system/Sys_Role1.jsx                               |    0 
 Code/WMS/WIDESEA_WMSClient/src/views/system/system/Sys_Department.vue                       |    2 
 Code/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MES/MesApiLogDto.cs                                  |   43 
 Code/WCS/WIDESEAWCS_Client/.omc/state/idle-notif-cooldown.json                              |    3 
 Code/WMS/WIDESEA_WMSClient/src/views/stock/stockView.vue                                    |    2 
 Code/WMS/WIDESEA_WMSClient/src/views/basic/locationInfo.vue                                 |    2 
 Code/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Role.jsx                                |    0 
 Code/WMS/WIDESEA_WMSClient/src/extension/basic/userInfo.jsx                                 |    0 
 Code/WMS/WIDESEA_WMSClient/src/views/outbound/outboundOrderDetail_Hty.vue                   |    2 
 Code/WMS/WIDESEA_WMSClient/package.json                                                     |    1 
 Code/.omc/state/subagent-tracking.json                                                      |  251 ++
 Code/WMS/WIDESEA_WMSClient/src/views/stock/stock.vue                                        |    2 
 Code/WMS/WIDESEA_WMSClient/src/extension/outbound/outboundOrder.jsx                         |    0 
 Code/WCS/WIDESEAWCS_Client/src/views/system/system/Sys_Department.vue                       |    2 
 Code/WMS/WIDESEA_WMSClient/src/views/system/Sys_Role.vue                                    |    2 
 Code/.omc/state/checkpoints/checkpoint-2026-04-12T13-52-50-252Z.json                        |   16 
 Code/WMS/WIDESEA_WMSClient/src/extension/system/Sys_User.jsx                                |    0 
 Code/WMS/WIDESEA_WMSClient/src/extension/basic/palletCodeInfo.jsx                           |    0 
 Code/WMS/WIDESEA_WMSClient/src/views/stock/stockInfo.vue                                    |    2 
 Code/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Tenant.jsx                              |    0 
 Code/WCS/WIDESEAWCS_Client/src/views/taskinfo/task.vue                                      |    2 
 Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/WIDESEA_WMSServer.csproj                       |    1 
 Code/docs/superpowers/specs/2026-04-12-mes-integration-design.md                            |  700 ++++++
 Code/WMS/WIDESEA_WMSClient/src/extension/basic/customerInfo.jsx                             |    0 
 Code/WCS/WIDESEAWCS_Client/src/views/taskinfo/robotTask.vue                                 |    2 
 Code/WMS/WIDESEA_WMSClient/src/views/check/checkOrder.vue                                   |    2 
 Code/WMS/WIDESEA_WMSClient/src/extension/record/stockQuantityChangeRecord.jsx               |    0 
 Code/WMS/WIDESEA_WMSClient/src/views/system/Sys_Role1.vue                                   |    2 
 Code/WMS/WIDESEA_WMSClient/src/extension/taskinfo/task.jsx                                  |    0 
 Code/WMS/WIDESEA_WMSClient/src/views/outbound/outboundOrder.vue                             |    2 
 Code/WMS/WIDESEA_WMSClient/src/extension/check/checkOrderResult.jsx                         |    0 
 Code/WCS/WIDESEAWCS_Client/src/extension/system/Sys_Role.jsx                                |    0 
 Code/WCS/WIDESEAWCS_Client/src/views/quartzJob/deviceProtocolDetail.vue                     |    2 
 Code/WCS/WIDESEAWCS_Client/src/views/system/Sys_Role.vue                                    |    2 
 Code/WMS/WIDESEA_WMSClient/src/extension/stock/stockInfoDetail_Hty.jsx                      |    0 
 Code/WMS/WIDESEA_WMSClient/src/extension/outbound/outStockLockInfo.jsx                      |    0 
 Code/WMS/WIDESEA_WMSClient/src/extension/record/locationStatusChangeRecord.jsx              |    0 
 Code/WMS/WIDESEA_WMSClient/src/views/stock/stockInfoDetail_Hty.vue                          |    2 
 Code/WMS/WIDESEA_WMSClient/src/views/basic/userInfo.vue                                     |    2 
 Code/WMS/WIDESEA_WMSClient/src/extension/basic/locationInfo.jsx                             |    0 
 Code/WMS/WIDESEA_WMSClient/src/extension/inbound/inboundOrderDetail.jsx                     |    0 
 Code/WMS/WIDESEA_WMSClient/src/views/basic/materielCodeInfo.vue                             |    2 
 Code/WCS/WIDESEAWCS_Client/src/views/taskinfo/taskHty.vue                                   |    2 
 Code/WMS/WIDESEA_WMSClient/src/extension/outbound/outboundOrder_Hty.jsx                     |    0 
 Code/WCS/WIDESEAWCS_Client/package.json                                                     |    1 
 Code/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Mes/Dt_MesApiLog.cs                         |   77 
 Code/WMS/WIDESEA_WMSServer/Database/Scripts/20260412_MesApiLog.sql                          |   92 
 Code/WMS/WIDESEA_WMSClient/src/views/basic/warehouse.vue                                    |    2 
 Code/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MES/OutboundInContainerRequestDto.cs                 |   46 
 Code/.omc/state/mission-state.json                                                          |  329 ++
 Code/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Log.jsx                                 |    0 
 Code/WCS/WIDESEAWCS_Client/src/views/basicinfo/router.vue                                   |    2 
 Code/WMS/WIDESEA_WMSClient/src/extension/outbound/outboundOrderDetail.jsx                   |    0 
 Code/WMS/WIDESEA_WMSClient/src/views/system/Sys_Log.vue                                     |    2 
 Code/WMS/WIDESEA_WMSClient/src/extension/inbound/inboundOrderDetail_Hty.jsx                 |    0 
 Code/.superpowers/brainstorm/2159-1775998341/button-visibility.html                         |  230 ++
 Code/WMS/WIDESEA_WMSClient/src/views/record/stockQuantityChangeRecord.vue                   |    2 
 Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Stock/StockInfoController.cs       |  264 ++
 Code/WMS/WIDESEA_WMSClient/src/extension/stock/stockChat.jsx                                |    0 
 Code/WMS/WIDESEA_WMSClient/src/views/inbound/inboundOrder.vue                               |    2 
 Code/WMS/WIDESEA_WMSClient/src/extension/inbound/receiveOrderDetail.jsx                     |    0 
 Code/WCS/WIDESEAWCS_Client/src/extension/taskinfo/robotTask.jsx                             |    0 
 Code/.omc/state/last-tool-error.json                                                        |    7 
 Code/WCS/WIDESEAWCS_Client/src/extension/system/Sys_User.jsx                                |    0 
 Code/WMS/WIDESEA_WMSClient/pnpm-lock.yaml                                                   |  183 +
 Code/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MES/UnbindContainerRequestDto.cs                     |   20 
 Code/WMS/WIDESEA_WMSClient/src/extension/stock/stockInfo_Hty.jsx                            |    0 
 Code/WMS/WIDESEA_WMSClient/src/views/system/Sys_Dictionary.vue                              |    2 
 Code/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MES/BindContainerRequestDto.cs                       |   30 
 Code/WMS/WIDESEA_WMSClient/src/extension/stock/stock.jsx                                    |    0 
 Code/WMS/WIDESEA_WMSClient/src/views/basic/palletCodeInfo.vue                               |    2 
 Code/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Role1.jsx                               |    0 
 Code/WMS/WIDESEA_WMSClient/src/views/inbound/purchaseOrderDetail.vue                        |    2 
 Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Stock/StockInfoDetailController.cs |  355 +++
 Code/WMS/WIDESEA_WMSClient/src/components/MesConfirmDialog.vue                              |  273 ++
 Code/WCS/WIDESEAWCS_Client/src/extension/taskinfo/taskHty.jsx                               |    0 
 Code/WMS/WIDESEA_WMSClient/src/extension/inbound/receiveOrder.jsx                           |    0 
 Code/.superpowers/brainstorm/2159-1775998341/operations-layout-v2.html                      |  347 +++
 Code/WMS/WIDESEA_WMSClient/src/views/record/locationStatusChangeRecord.vue                  |    2 
 Code/WCS/WIDESEAWCS_Client/src/views/quartzJob/deviceProtocol.vue                           |    2 
 Code/WCS/WIDESEAWCS_Client/src/extension/system/Sys_Tenant.jsx                              |    0 
 Code/WMS/WIDESEA_WMSClient/src/extension/inbound/purchaseOrderDetail.jsx                    |    0 
 Code/WCS/WIDESEAWCS_Client/src/extension/quartzJob/deviceProtocol.jsx                       |    0 
 Code/WCS/WIDESEAWCS_Client/src/views/system/Sys_Log.vue                                     |    2 
 Code/WCS/WIDESEAWCS_Client/vite.config.mjs                                                  |    5 
 Code/.superpowers/brainstorm/2159-1775998341/status-mapping.html                            |  213 +
 Code/WCS/WIDESEAWCS_Client/src/views/quartzJob/deviceInfo.vue                               |    2 
 Code/WMS/WIDESEA_WMSClient/src/extension/taskinfo/task_hty.jsx                              |    0 
 Code/WMS/WIDESEA_WMSClient/src/extension/inbound/inboundOrder.jsx                           |    0 
 Code/WMS/WIDESEA_WMSClient/src/views/taskinfo/task_hty.vue                                  |    2 
 Code/WCS/WIDESEAWCS_Client/src/views/system/Sys_DictionaryList.vue                          |    2 
 Code/.superpowers/brainstorm/2159-1775998341/error-handling.html                            |  223 ++
 Code/WCS/WIDESEAWCS_Client/src/extension/system/Sys_Log.jsx                                 |    0 
 Code/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MES/ContainerNgReportRequestDto.cs                   |   46 
 Code/WCS/WIDESEAWCS_Client/src/extension/quartzJob/deviceProtocolDetail.jsx                 |    0 
 Code/WMS/WIDESEA_WMSClient/src/views/inbound/receiveOrder.vue                               |    2 
 Code/WMS/WIDESEA_WMSClient/src/views/check/checkOrderResult.vue                             |    2 
 Code/WCS/WIDESEAWCS_Client/src/extension/quartzJob/deviceInfo.jsx                           |    0 
 Code/WMS/WIDESEA_WMSClient/src/views/stock/stockInfoDetail.vue                              |    2 
 Code/WCS/WIDESEAWCS_Client/src/views/system/Sys_User.vue                                    |    2 
 Code/WMS/WIDESEA_WMSClient/src/api/mes.js                                                   |   73 
 /dev/null                                                                                   |   20 
 Code/WMS/WIDESEA_WMSClient/src/views/outbound/outStockLockInfo.vue                          |    2 
 Code/WCS/WIDESEAWCS_Client/src/extension/system/Sys_DictionaryList.jsx                      |    0 
 Code/WMS/WIDESEA_WMSServer/WIDESEA_MesService/MesLogService.cs                              |   95 
 Code/WMS/WIDESEA_WMSClient/src/views/inbound/receiveOrderDetail.vue                         |    2 
 Code/WMS/WIDESEA_WMSClient/src/views/outbound/mesOutboundOrder.vue                          |    2 
 Code/WMS/WIDESEA_WMSClient/vite.config.mjs                                                  |   23 
 Code/WCS/WIDESEAWCS_Client/src/views/quartzJob/dispatchInfo.vue                             |    2 
 Code/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Dictionary.jsx                          |    0 
 Code/WMS/WIDESEA_WMSClient/src/views/taskinfo/task.vue                                      |    2 
 Code/WMS/WIDESEA_WMSClient/src/views/inbound/inboundOrderDetail_Hty.vue                     |    2 
 156 files changed, 6,568 insertions(+), 82 deletions(-)

diff --git a/Code/.omc/state/agent-replay-9007b9ea-1eb6-4d24-8fe7-2c3a949eac88.jsonl b/Code/.omc/state/agent-replay-9007b9ea-1eb6-4d24-8fe7-2c3a949eac88.jsonl
new file mode 100644
index 0000000..3bdf0bc
--- /dev/null
+++ b/Code/.omc/state/agent-replay-9007b9ea-1eb6-4d24-8fe7-2c3a949eac88.jsonl
@@ -0,0 +1,58 @@
+{"t":0,"agent":"system","event":"skill_invoked","skill_name":"superpowers:brainstorming"}
+{"t":0,"agent":"a9501da","agent_type":"general-purpose","event":"agent_start","parent_mode":"none"}
+{"t":0,"agent":"a9501da","agent_type":"general-purpose","event":"agent_stop","success":true,"duration_ms":8663}
+{"t":0,"agent":"system","event":"skill_invoked","skill_name":"superpowers:writing-plans"}
+{"t":0,"agent":"abb2829","agent_type":"general-purpose","event":"agent_start","parent_mode":"none"}
+{"t":0,"agent":"abb2829","agent_type":"general-purpose","event":"agent_stop","success":true,"duration_ms":12576}
+{"t":0,"agent":"system","event":"skill_invoked","skill_name":"superpowers:subagent-driven-development"}
+{"t":0,"agent":"ab6a2d9","agent_type":"general-purpose","event":"agent_start","parent_mode":"none"}
+{"t":0,"agent":"ab6a2d9","agent_type":"general-purpose","event":"agent_stop","success":true,"duration_ms":55725}
+{"t":0,"agent":"a3a7fd0","agent_type":"general-purpose","event":"agent_start","parent_mode":"none"}
+{"t":0,"agent":"a3a7fd0","agent_type":"general-purpose","event":"agent_stop","success":true,"duration_ms":11968}
+{"t":0,"agent":"a0ed568","agent_type":"superpowers:code-reviewer","event":"agent_start","parent_mode":"none"}
+{"t":0,"agent":"a0ed568","agent_type":"superpowers:code-reviewer","event":"agent_stop","success":true,"duration_ms":84239}
+{"t":0,"agent":"a32ad6a","agent_type":"general-purpose","event":"agent_start","parent_mode":"none"}
+{"t":0,"agent":"a32ad6a","agent_type":"general-purpose","event":"agent_stop","success":true,"duration_ms":155707}
+{"t":0,"agent":"a4dd492","agent_type":"general-purpose","event":"agent_start","parent_mode":"none"}
+{"t":0,"agent":"a4dd492","agent_type":"general-purpose","event":"agent_stop","success":true,"duration_ms":17301}
+{"t":0,"agent":"aefc20e","agent_type":"superpowers:code-reviewer","event":"agent_start","parent_mode":"none"}
+{"t":0,"agent":"aefc20e","agent_type":"superpowers:code-reviewer","event":"agent_stop","success":true,"duration_ms":180634}
+{"t":0,"agent":"a18fadb","agent_type":"general-purpose","event":"agent_start","parent_mode":"none"}
+{"t":0,"agent":"a18fadb","agent_type":"general-purpose","event":"agent_stop","success":true,"duration_ms":92939}
+{"t":0,"agent":"a379d3a","agent_type":"superpowers:code-reviewer","event":"agent_start","parent_mode":"none"}
+{"t":0,"agent":"a379d3a","agent_type":"superpowers:code-reviewer","event":"agent_stop","success":true,"duration_ms":19656}
+{"t":0,"agent":"a7985a3","agent_type":"general-purpose","event":"agent_start","parent_mode":"none"}
+{"t":0,"agent":"a7985a3","agent_type":"general-purpose","event":"agent_stop","success":true,"duration_ms":79712}
+{"t":0,"agent":"ab97ed1","agent_type":"general-purpose","event":"agent_start","parent_mode":"none"}
+{"t":0,"agent":"ab97ed1","agent_type":"general-purpose","event":"agent_stop","success":true,"duration_ms":57941}
+{"t":0,"agent":"ad231d3","agent_type":"general-purpose","event":"agent_start","parent_mode":"none"}
+{"t":0,"agent":"ad231d3","agent_type":"general-purpose","event":"agent_stop","success":true,"duration_ms":119172}
+{"t":0,"agent":"a7e494a","agent_type":"general-purpose","event":"agent_start","parent_mode":"none"}
+{"t":0,"agent":"a7e494a","agent_type":"general-purpose","event":"agent_stop","success":true,"duration_ms":53504}
+{"t":0,"agent":"aba5116","agent_type":"superpowers:code-reviewer","event":"agent_start","parent_mode":"none"}
+{"t":0,"agent":"aba5116","agent_type":"superpowers:code-reviewer","event":"agent_stop","success":true,"duration_ms":94295}
+{"t":0,"agent":"a8e5fbf","agent_type":"general-purpose","event":"agent_start","parent_mode":"none"}
+{"t":0,"agent":"a8e5fbf","agent_type":"general-purpose","event":"agent_stop","success":true,"duration_ms":192007}
+{"t":0,"agent":"a9a1cc3","agent_type":"general-purpose","event":"agent_start","parent_mode":"none"}
+{"t":0,"agent":"a9a1cc3","agent_type":"general-purpose","event":"agent_stop","success":true,"duration_ms":29527}
+{"t":0,"agent":"a581cc0","agent_type":"superpowers:code-reviewer","event":"agent_start","parent_mode":"none"}
+{"t":0,"agent":"a581cc0","agent_type":"superpowers:code-reviewer","event":"agent_stop","success":true,"duration_ms":35311}
+{"t":0,"agent":"a6536cf","agent_type":"general-purpose","event":"agent_start","parent_mode":"none"}
+{"t":0,"agent":"a6536cf","agent_type":"general-purpose","event":"agent_stop","success":true,"duration_ms":154828}
+{"t":0,"agent":"ab287b4","agent_type":"superpowers:code-reviewer","event":"agent_start","parent_mode":"none"}
+{"t":0,"agent":"ab287b4","agent_type":"superpowers:code-reviewer","event":"agent_stop","success":true,"duration_ms":22379}
+{"t":0,"agent":"a3bba61","agent_type":"general-purpose","event":"agent_start","parent_mode":"none"}
+{"t":0,"agent":"a3bba61","agent_type":"general-purpose","event":"agent_stop","success":true,"duration_ms":106152}
+{"t":0,"agent":"a0a843a","agent_type":"general-purpose","event":"agent_start","parent_mode":"none"}
+{"t":0,"agent":"a0a843a","agent_type":"general-purpose","event":"agent_stop","success":true,"duration_ms":30220}
+{"t":0,"agent":"afd8eac","agent_type":"general-purpose","event":"agent_start","parent_mode":"none"}
+{"t":0,"agent":"afd8eac","agent_type":"general-purpose","event":"agent_stop","success":true,"duration_ms":167934}
+{"t":0,"agent":"aa4ea81","agent_type":"general-purpose","event":"agent_start","parent_mode":"none"}
+{"t":0,"agent":"aa4ea81","agent_type":"general-purpose","event":"agent_stop","success":true,"duration_ms":28896}
+{"t":0,"agent":"a522225","agent_type":"superpowers:code-reviewer","event":"agent_start","parent_mode":"none"}
+{"t":0,"agent":"a522225","agent_type":"superpowers:code-reviewer","event":"agent_stop","success":true,"duration_ms":35164}
+{"t":0,"agent":"ac7c987","agent_type":"unknown","event":"agent_stop","success":true}
+{"t":0,"agent":"a405c70","agent_type":"general-purpose","event":"agent_start","parent_mode":"none"}
+{"t":0,"agent":"a405c70","agent_type":"general-purpose","event":"agent_stop","success":true,"duration_ms":59509}
+{"t":0,"agent":"a0ff377","agent_type":"general-purpose","event":"agent_start","parent_mode":"none"}
+{"t":0,"agent":"a0ff377","agent_type":"general-purpose","event":"agent_stop","success":true,"duration_ms":7226}
diff --git a/Code/.omc/state/checkpoints/checkpoint-2026-04-12T13-52-50-252Z.json b/Code/.omc/state/checkpoints/checkpoint-2026-04-12T13-52-50-252Z.json
new file mode 100644
index 0000000..8b632bc
--- /dev/null
+++ b/Code/.omc/state/checkpoints/checkpoint-2026-04-12T13-52-50-252Z.json
@@ -0,0 +1,16 @@
+{
+  "created_at": "2026-04-12T13:52:50.251Z",
+  "trigger": "auto",
+  "active_modes": {},
+  "todo_summary": {
+    "pending": 0,
+    "in_progress": 0,
+    "completed": 0
+  },
+  "wisdom_exported": false,
+  "background_jobs": {
+    "active": [],
+    "recent": [],
+    "stats": null
+  }
+}
\ No newline at end of file
diff --git a/Code/.omc/state/last-tool-error.json b/Code/.omc/state/last-tool-error.json
new file mode 100644
index 0000000..8644504
--- /dev/null
+++ b/Code/.omc/state/last-tool-error.json
@@ -0,0 +1,7 @@
+{
+  "tool_name": "Read",
+  "tool_input_preview": "{\"file_path\":\"D:\\\\Git\\\\ShanMeiXinNengYuan\\\\Code\\\\WMS\\\\WIDESEA_WMSServer\\\\WIDESEA_WMSServer\\\\Controllers\\\\BatteryCellController.cs\"}",
+  "error": "File does not exist. Note: your current working directory is D:\\Git\\ShanMeiXinNengYuan\\Code.",
+  "timestamp": "2026-04-12T13:48:48.578Z",
+  "retry_count": 1
+}
\ No newline at end of file
diff --git a/Code/.omc/state/mission-state.json b/Code/.omc/state/mission-state.json
new file mode 100644
index 0000000..b8b2958
--- /dev/null
+++ b/Code/.omc/state/mission-state.json
@@ -0,0 +1,329 @@
+{
+  "updatedAt": "2026-04-12T13:54:45.455Z",
+  "missions": [
+    {
+      "id": "session:9007b9ea-1eb6-4d24-8fe7-2c3a949eac88:none",
+      "source": "session",
+      "name": "none",
+      "objective": "Session mission",
+      "createdAt": "2026-04-12T13:05:45.505Z",
+      "updatedAt": "2026-04-12T13:54:45.455Z",
+      "status": "done",
+      "workerCount": 27,
+      "taskCounts": {
+        "total": 27,
+        "pending": 0,
+        "blocked": 0,
+        "inProgress": 0,
+        "completed": 27,
+        "failed": 0
+      },
+      "agents": [
+        {
+          "name": "general-purpose:a9501da",
+          "role": "general-purpose",
+          "ownership": "a9501da36be20eb24",
+          "status": "done",
+          "currentStep": null,
+          "latestUpdate": "completed",
+          "completedSummary": null,
+          "updatedAt": "2026-04-12T13:53:13.149Z"
+        },
+        {
+          "name": "general-purpose:abb2829",
+          "role": "general-purpose",
+          "ownership": "abb28297f69440cf9",
+          "status": "done",
+          "currentStep": null,
+          "latestUpdate": "completed",
+          "completedSummary": null,
+          "updatedAt": "2026-04-12T13:10:58.257Z"
+        },
+        {
+          "name": "general-purpose:ab6a2d9",
+          "role": "general-purpose",
+          "ownership": "ab6a2d9ed6f459274",
+          "status": "done",
+          "currentStep": null,
+          "latestUpdate": "completed",
+          "completedSummary": null,
+          "updatedAt": "2026-04-12T13:13:25.065Z"
+        },
+        {
+          "name": "general-purpose:a3a7fd0",
+          "role": "general-purpose",
+          "ownership": "a3a7fd0c0829e5f0c",
+          "status": "done",
+          "currentStep": null,
+          "latestUpdate": "completed",
+          "completedSummary": null,
+          "updatedAt": "2026-04-12T13:13:48.330Z"
+        },
+        {
+          "name": "superpowers:code-reviewer:a0ed568",
+          "role": "superpowers:code-reviewer",
+          "ownership": "a0ed568f9e32bd5b0",
+          "status": "done",
+          "currentStep": null,
+          "latestUpdate": "completed",
+          "completedSummary": null,
+          "updatedAt": "2026-04-12T13:17:47.626Z"
+        },
+        {
+          "name": "general-purpose:a32ad6a",
+          "role": "general-purpose",
+          "ownership": "a32ad6a96659ec279",
+          "status": "done",
+          "currentStep": null,
+          "latestUpdate": "completed",
+          "completedSummary": null,
+          "updatedAt": "2026-04-12T13:24:23.170Z"
+        },
+        {
+          "name": "general-purpose:a4dd492",
+          "role": "general-purpose",
+          "ownership": "a4dd4923f28eeaea9",
+          "status": "done",
+          "currentStep": null,
+          "latestUpdate": "completed",
+          "completedSummary": null,
+          "updatedAt": "2026-04-12T13:24:47.505Z"
+        },
+        {
+          "name": "superpowers:code-reviewer:aefc20e",
+          "role": "superpowers:code-reviewer",
+          "ownership": "aefc20e8f3f9438f3",
+          "status": "done",
+          "currentStep": null,
+          "latestUpdate": "completed",
+          "completedSummary": null,
+          "updatedAt": "2026-04-12T13:27:54.713Z"
+        },
+        {
+          "name": "general-purpose:a18fadb",
+          "role": "general-purpose",
+          "ownership": "a18fadb164b0dfdb8",
+          "status": "done",
+          "currentStep": null,
+          "latestUpdate": "completed",
+          "completedSummary": null,
+          "updatedAt": "2026-04-12T13:29:34.186Z"
+        },
+        {
+          "name": "superpowers:code-reviewer:a379d3a",
+          "role": "superpowers:code-reviewer",
+          "ownership": "a379d3a8646888a66",
+          "status": "done",
+          "currentStep": null,
+          "latestUpdate": "completed",
+          "completedSummary": null,
+          "updatedAt": "2026-04-12T13:29:58.098Z"
+        },
+        {
+          "name": "general-purpose:a7985a3",
+          "role": "general-purpose",
+          "ownership": "a7985a337688f4971",
+          "status": "done",
+          "currentStep": null,
+          "latestUpdate": "completed",
+          "completedSummary": null,
+          "updatedAt": "2026-04-12T13:31:36.395Z"
+        },
+        {
+          "name": "general-purpose:ab97ed1",
+          "role": "general-purpose",
+          "ownership": "ab97ed1012975ec79",
+          "status": "done",
+          "currentStep": null,
+          "latestUpdate": "completed",
+          "completedSummary": null,
+          "updatedAt": "2026-04-12T13:32:42.067Z"
+        },
+        {
+          "name": "general-purpose:ad231d3",
+          "role": "general-purpose",
+          "ownership": "ad231d3220b6ba05e",
+          "status": "done",
+          "currentStep": null,
+          "latestUpdate": "completed",
+          "completedSummary": null,
+          "updatedAt": "2026-04-12T13:34:46.714Z"
+        },
+        {
+          "name": "general-purpose:a7e494a",
+          "role": "general-purpose",
+          "ownership": "a7e494aa6cfed7748",
+          "status": "done",
+          "currentStep": null,
+          "latestUpdate": "completed",
+          "completedSummary": null,
+          "updatedAt": "2026-04-12T13:35:43.945Z"
+        },
+        {
+          "name": "superpowers:code-reviewer:aba5116",
+          "role": "superpowers:code-reviewer",
+          "ownership": "aba5116eaa0ef6b17",
+          "status": "done",
+          "currentStep": null,
+          "latestUpdate": "completed",
+          "completedSummary": null,
+          "updatedAt": "2026-04-12T13:37:25.682Z"
+        },
+        {
+          "name": "general-purpose:a8e5fbf",
+          "role": "general-purpose",
+          "ownership": "a8e5fbfad6a90c9c9",
+          "status": "done",
+          "currentStep": null,
+          "latestUpdate": "completed",
+          "completedSummary": null,
+          "updatedAt": "2026-04-12T13:41:43.878Z"
+        },
+        {
+          "name": "general-purpose:a9a1cc3",
+          "role": "general-purpose",
+          "ownership": "a9a1cc30ce01dd110",
+          "status": "done",
+          "currentStep": null,
+          "latestUpdate": "completed",
+          "completedSummary": null,
+          "updatedAt": "2026-04-12T13:42:18.517Z"
+        },
+        {
+          "name": "superpowers:code-reviewer:a581cc0",
+          "role": "superpowers:code-reviewer",
+          "ownership": "a581cc05f79eed2ab",
+          "status": "done",
+          "currentStep": null,
+          "latestUpdate": "completed",
+          "completedSummary": null,
+          "updatedAt": "2026-04-12T13:42:59.753Z"
+        },
+        {
+          "name": "general-purpose:a6536cf",
+          "role": "general-purpose",
+          "ownership": "a6536cf10ec91573d",
+          "status": "done",
+          "currentStep": null,
+          "latestUpdate": "completed",
+          "completedSummary": null,
+          "updatedAt": "2026-04-12T13:45:40.542Z"
+        },
+        {
+          "name": "superpowers:code-reviewer:ab287b4",
+          "role": "superpowers:code-reviewer",
+          "ownership": "ab287b483b80dd1ab",
+          "status": "done",
+          "currentStep": null,
+          "latestUpdate": "completed",
+          "completedSummary": null,
+          "updatedAt": "2026-04-12T13:46:06.732Z"
+        },
+        {
+          "name": "general-purpose:a3bba61",
+          "role": "general-purpose",
+          "ownership": "a3bba6185e3ada31c",
+          "status": "done",
+          "currentStep": null,
+          "latestUpdate": "completed",
+          "completedSummary": null,
+          "updatedAt": "2026-04-12T13:48:07.136Z"
+        },
+        {
+          "name": "general-purpose:a0a843a",
+          "role": "general-purpose",
+          "ownership": "a0a843ae77e400e58",
+          "status": "done",
+          "currentStep": null,
+          "latestUpdate": "completed",
+          "completedSummary": null,
+          "updatedAt": "2026-04-12T13:48:41.191Z"
+        },
+        {
+          "name": "general-purpose:afd8eac",
+          "role": "general-purpose",
+          "ownership": "afd8eacdfadd73310",
+          "status": "done",
+          "currentStep": null,
+          "latestUpdate": "completed",
+          "completedSummary": null,
+          "updatedAt": "2026-04-12T13:51:34.998Z"
+        },
+        {
+          "name": "general-purpose:aa4ea81",
+          "role": "general-purpose",
+          "ownership": "aa4ea817d9e391ac6",
+          "status": "done",
+          "currentStep": null,
+          "latestUpdate": "completed",
+          "completedSummary": null,
+          "updatedAt": "2026-04-12T13:52:08.592Z"
+        },
+        {
+          "name": "superpowers:code-reviewer:a522225",
+          "role": "superpowers:code-reviewer",
+          "ownership": "a5222258aed5f5f3d",
+          "status": "done",
+          "currentStep": null,
+          "latestUpdate": "completed",
+          "completedSummary": null,
+          "updatedAt": "2026-04-12T13:52:49.666Z"
+        },
+        {
+          "name": "general-purpose:a405c70",
+          "role": "general-purpose",
+          "ownership": "a405c7090be2886ee",
+          "status": "done",
+          "currentStep": null,
+          "latestUpdate": "completed",
+          "completedSummary": null,
+          "updatedAt": "2026-04-12T13:54:30.286Z"
+        },
+        {
+          "name": "general-purpose:a0ff377",
+          "role": "general-purpose",
+          "ownership": "a0ff37729a29ea04f",
+          "status": "done",
+          "currentStep": null,
+          "latestUpdate": "completed",
+          "completedSummary": null,
+          "updatedAt": "2026-04-12T13:54:45.455Z"
+        }
+      ],
+      "timeline": [
+        {
+          "id": "session-start:a405c7090be2886ee:2026-04-12T13:53:30.777Z",
+          "at": "2026-04-12T13:53:30.777Z",
+          "kind": "update",
+          "agent": "general-purpose:a405c70",
+          "detail": "started general-purpose:a405c70",
+          "sourceKey": "session-start:a405c7090be2886ee"
+        },
+        {
+          "id": "session-stop:a405c7090be2886ee:2026-04-12T13:54:30.286Z",
+          "at": "2026-04-12T13:54:30.286Z",
+          "kind": "completion",
+          "agent": "general-purpose:a405c70",
+          "detail": "completed",
+          "sourceKey": "session-stop:a405c7090be2886ee"
+        },
+        {
+          "id": "session-start:a0ff37729a29ea04f:2026-04-12T13:54:38.229Z",
+          "at": "2026-04-12T13:54:38.229Z",
+          "kind": "update",
+          "agent": "general-purpose:a0ff377",
+          "detail": "started general-purpose:a0ff377",
+          "sourceKey": "session-start:a0ff37729a29ea04f"
+        },
+        {
+          "id": "session-stop:a0ff37729a29ea04f:2026-04-12T13:54:45.455Z",
+          "at": "2026-04-12T13:54:45.455Z",
+          "kind": "completion",
+          "agent": "general-purpose:a0ff377",
+          "detail": "completed",
+          "sourceKey": "session-stop:a0ff37729a29ea04f"
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/Code/.omc/state/subagent-tracking.json b/Code/.omc/state/subagent-tracking.json
new file mode 100644
index 0000000..d5dd869
--- /dev/null
+++ b/Code/.omc/state/subagent-tracking.json
@@ -0,0 +1,251 @@
+{
+  "agents": [
+    {
+      "agent_id": "a9501da36be20eb24",
+      "agent_type": "general-purpose",
+      "started_at": "2026-04-12T13:05:45.505Z",
+      "parent_mode": "none",
+      "status": "completed",
+      "completed_at": "2026-04-12T13:05:54.168Z",
+      "duration_ms": 8663
+    },
+    {
+      "agent_id": "abb28297f69440cf9",
+      "agent_type": "general-purpose",
+      "started_at": "2026-04-12T13:10:45.681Z",
+      "parent_mode": "none",
+      "status": "completed",
+      "completed_at": "2026-04-12T13:10:58.257Z",
+      "duration_ms": 12576
+    },
+    {
+      "agent_id": "ab6a2d9ed6f459274",
+      "agent_type": "general-purpose",
+      "started_at": "2026-04-12T13:12:29.340Z",
+      "parent_mode": "none",
+      "status": "completed",
+      "completed_at": "2026-04-12T13:13:25.065Z",
+      "duration_ms": 55725
+    },
+    {
+      "agent_id": "a3a7fd0c0829e5f0c",
+      "agent_type": "general-purpose",
+      "started_at": "2026-04-12T13:13:36.362Z",
+      "parent_mode": "none",
+      "status": "completed",
+      "completed_at": "2026-04-12T13:13:48.330Z",
+      "duration_ms": 11968
+    },
+    {
+      "agent_id": "a0ed568f9e32bd5b0",
+      "agent_type": "superpowers:code-reviewer",
+      "started_at": "2026-04-12T13:16:23.387Z",
+      "parent_mode": "none",
+      "status": "completed",
+      "completed_at": "2026-04-12T13:17:47.626Z",
+      "duration_ms": 84239
+    },
+    {
+      "agent_id": "a32ad6a96659ec279",
+      "agent_type": "general-purpose",
+      "started_at": "2026-04-12T13:21:47.463Z",
+      "parent_mode": "none",
+      "status": "completed",
+      "completed_at": "2026-04-12T13:24:23.170Z",
+      "duration_ms": 155707
+    },
+    {
+      "agent_id": "a4dd4923f28eeaea9",
+      "agent_type": "general-purpose",
+      "started_at": "2026-04-12T13:24:30.204Z",
+      "parent_mode": "none",
+      "status": "completed",
+      "completed_at": "2026-04-12T13:24:47.505Z",
+      "duration_ms": 17301
+    },
+    {
+      "agent_id": "aefc20e8f3f9438f3",
+      "agent_type": "superpowers:code-reviewer",
+      "started_at": "2026-04-12T13:24:54.079Z",
+      "parent_mode": "none",
+      "status": "completed",
+      "completed_at": "2026-04-12T13:27:54.713Z",
+      "duration_ms": 180634
+    },
+    {
+      "agent_id": "a18fadb164b0dfdb8",
+      "agent_type": "general-purpose",
+      "started_at": "2026-04-12T13:28:01.247Z",
+      "parent_mode": "none",
+      "status": "completed",
+      "completed_at": "2026-04-12T13:29:34.186Z",
+      "duration_ms": 92939
+    },
+    {
+      "agent_id": "a379d3a8646888a66",
+      "agent_type": "superpowers:code-reviewer",
+      "started_at": "2026-04-12T13:29:38.442Z",
+      "parent_mode": "none",
+      "status": "completed",
+      "completed_at": "2026-04-12T13:29:58.098Z",
+      "duration_ms": 19656
+    },
+    {
+      "agent_id": "a7985a337688f4971",
+      "agent_type": "general-purpose",
+      "started_at": "2026-04-12T13:30:16.683Z",
+      "parent_mode": "none",
+      "status": "completed",
+      "completed_at": "2026-04-12T13:31:36.395Z",
+      "duration_ms": 79712
+    },
+    {
+      "agent_id": "ab97ed1012975ec79",
+      "agent_type": "general-purpose",
+      "started_at": "2026-04-12T13:31:44.126Z",
+      "parent_mode": "none",
+      "status": "completed",
+      "completed_at": "2026-04-12T13:32:42.067Z",
+      "duration_ms": 57941
+    },
+    {
+      "agent_id": "ad231d3220b6ba05e",
+      "agent_type": "general-purpose",
+      "started_at": "2026-04-12T13:32:47.542Z",
+      "parent_mode": "none",
+      "status": "completed",
+      "completed_at": "2026-04-12T13:34:46.714Z",
+      "duration_ms": 119172
+    },
+    {
+      "agent_id": "a7e494aa6cfed7748",
+      "agent_type": "general-purpose",
+      "started_at": "2026-04-12T13:34:50.441Z",
+      "parent_mode": "none",
+      "status": "completed",
+      "completed_at": "2026-04-12T13:35:43.945Z",
+      "duration_ms": 53504
+    },
+    {
+      "agent_id": "aba5116eaa0ef6b17",
+      "agent_type": "superpowers:code-reviewer",
+      "started_at": "2026-04-12T13:35:51.387Z",
+      "parent_mode": "none",
+      "status": "completed",
+      "completed_at": "2026-04-12T13:37:25.682Z",
+      "duration_ms": 94295
+    },
+    {
+      "agent_id": "a8e5fbfad6a90c9c9",
+      "agent_type": "general-purpose",
+      "started_at": "2026-04-12T13:38:31.871Z",
+      "parent_mode": "none",
+      "status": "completed",
+      "completed_at": "2026-04-12T13:41:43.878Z",
+      "duration_ms": 192007
+    },
+    {
+      "agent_id": "a9a1cc30ce01dd110",
+      "agent_type": "general-purpose",
+      "started_at": "2026-04-12T13:41:48.990Z",
+      "parent_mode": "none",
+      "status": "completed",
+      "completed_at": "2026-04-12T13:42:18.517Z",
+      "duration_ms": 29527
+    },
+    {
+      "agent_id": "a581cc05f79eed2ab",
+      "agent_type": "superpowers:code-reviewer",
+      "started_at": "2026-04-12T13:42:24.442Z",
+      "parent_mode": "none",
+      "status": "completed",
+      "completed_at": "2026-04-12T13:42:59.753Z",
+      "duration_ms": 35311
+    },
+    {
+      "agent_id": "a6536cf10ec91573d",
+      "agent_type": "general-purpose",
+      "started_at": "2026-04-12T13:43:05.714Z",
+      "parent_mode": "none",
+      "status": "completed",
+      "completed_at": "2026-04-12T13:45:40.542Z",
+      "duration_ms": 154828
+    },
+    {
+      "agent_id": "ab287b483b80dd1ab",
+      "agent_type": "superpowers:code-reviewer",
+      "started_at": "2026-04-12T13:45:44.353Z",
+      "parent_mode": "none",
+      "status": "completed",
+      "completed_at": "2026-04-12T13:46:06.732Z",
+      "duration_ms": 22379
+    },
+    {
+      "agent_id": "a3bba6185e3ada31c",
+      "agent_type": "general-purpose",
+      "started_at": "2026-04-12T13:46:20.984Z",
+      "parent_mode": "none",
+      "status": "completed",
+      "completed_at": "2026-04-12T13:48:07.136Z",
+      "duration_ms": 106152
+    },
+    {
+      "agent_id": "a0a843ae77e400e58",
+      "agent_type": "general-purpose",
+      "started_at": "2026-04-12T13:48:10.971Z",
+      "parent_mode": "none",
+      "status": "completed",
+      "completed_at": "2026-04-12T13:48:41.191Z",
+      "duration_ms": 30220
+    },
+    {
+      "agent_id": "afd8eacdfadd73310",
+      "agent_type": "general-purpose",
+      "started_at": "2026-04-12T13:48:47.064Z",
+      "parent_mode": "none",
+      "status": "completed",
+      "completed_at": "2026-04-12T13:51:34.998Z",
+      "duration_ms": 167934
+    },
+    {
+      "agent_id": "aa4ea817d9e391ac6",
+      "agent_type": "general-purpose",
+      "started_at": "2026-04-12T13:51:39.696Z",
+      "parent_mode": "none",
+      "status": "completed",
+      "completed_at": "2026-04-12T13:52:08.592Z",
+      "duration_ms": 28896
+    },
+    {
+      "agent_id": "a5222258aed5f5f3d",
+      "agent_type": "superpowers:code-reviewer",
+      "started_at": "2026-04-12T13:52:14.502Z",
+      "parent_mode": "none",
+      "status": "completed",
+      "completed_at": "2026-04-12T13:52:49.666Z",
+      "duration_ms": 35164
+    },
+    {
+      "agent_id": "a405c7090be2886ee",
+      "agent_type": "general-purpose",
+      "started_at": "2026-04-12T13:53:30.777Z",
+      "parent_mode": "none",
+      "status": "completed",
+      "completed_at": "2026-04-12T13:54:30.286Z",
+      "duration_ms": 59509
+    },
+    {
+      "agent_id": "a0ff37729a29ea04f",
+      "agent_type": "general-purpose",
+      "started_at": "2026-04-12T13:54:38.229Z",
+      "parent_mode": "none",
+      "status": "completed",
+      "completed_at": "2026-04-12T13:54:45.455Z",
+      "duration_ms": 7226
+    }
+  ],
+  "total_spawned": 27,
+  "total_completed": 27,
+  "total_failed": 0,
+  "last_updated": "2026-04-12T13:54:45.571Z"
+}
\ No newline at end of file
diff --git a/Code/.superpowers/brainstorm/2159-1775998341/.server-stopped b/Code/.superpowers/brainstorm/2159-1775998341/.server-stopped
new file mode 100644
index 0000000..9b2de67
--- /dev/null
+++ b/Code/.superpowers/brainstorm/2159-1775998341/.server-stopped
@@ -0,0 +1 @@
+{"reason":"idle timeout","timestamp":1776000741677}
diff --git a/Code/.superpowers/brainstorm/2159-1775998341/button-visibility.html b/Code/.superpowers/brainstorm/2159-1775998341/button-visibility.html
new file mode 100644
index 0000000..bd5c1aa
--- /dev/null
+++ b/Code/.superpowers/brainstorm/2159-1775998341/button-visibility.html
@@ -0,0 +1,230 @@
+<h2>鎸夐挳鏄剧ず涓庣姸鎬佹帶鍒�</h2>
+<p class="subtitle">鏍规嵁搴撳瓨鐘舵�佹帶鍒舵搷浣滄寜閽殑鏄剧ず</p>
+
+<div class="section">
+  <h3>鍦烘櫙鍒嗘瀽</h3>
+  <p class="subtitle">涓嶅悓鐘舵�佺殑搴撳瓨鍙兘鍏佽鎴栫姝㈡煇浜涙搷浣�</p>
+
+  <div class="mockup">
+    <div class="mockup-header">搴撳瓨鐘舵�佹灇涓�</div>
+    <div class="mockup-body">
+      <div class="status-list">
+        <div class="status-item">
+          <span class="status-badge status-badge-idle">寰呭叆搴�</span>
+          <div class="status-desc">鎵樼洏宸插垱寤轰絾灏氭湭瀹屾垚鍏ュ簱</div>
+        </div>
+        <div class="status-item">
+          <span class="status-badge status-badge-instock">鍦ㄥ簱</span>
+          <div class="status-desc">鎵樼洏姝e父鍦ㄥ簱涓�</div>
+        </div>
+        <div class="status-item">
+          <span class="status-badge status-badge-outbound">鍑哄簱涓�</span>
+          <div class="status-desc">鎵樼洏姝e湪鍑哄簱娴佺▼涓�</div>
+        </div>
+        <div class="status-item">
+          <span class="status-badge status-badge-lock">閿佸畾</span>
+          <div class="status-desc">鎵樼洏琚攣瀹氾紝涓嶅彲鎿嶄綔</div>
+        </div>
+      </div>
+    </div>
+  </div>
+</div>
+
+<div class="section">
+  <h3>鎸夐挳鏄剧ず绛栫暐閫夋嫨</h3>
+  <p class="subtitle">涓嶅悓绛栫暐鐨勭敤鎴蜂綋楠屽拰瀹炵幇澶嶆潅搴�</p>
+
+  <div class="options">
+    <div class="option" data-choice="always" onclick="toggleSelect(this)">
+      <div class="letter">A</div>
+      <div class="content">
+        <h3>濮嬬粓鏄剧ず</h3>
+        <p>鎵�鏈夋搷浣滄寜閽缁堟樉绀猴紝鐐瑰嚮鍚庡湪寮圭獥涓牎楠岀姸鎬�</p>
+        <div class="pros-cons">
+          <div class="pros"><h4>浼樼偣</h4><ul><li>瀹炵幇绠�鍗�</li><li>鐢ㄦ埛娓呮鏈夊摢浜涘姛鑳�</li></ul></div>
+          <div class="cons"><h4>缂虹偣</h4><ul><li>鍙兘浜х敓鏃犳晥鐐瑰嚮</li><li>浣撻獙杈冨樊</li></ul></div>
+        </div>
+      </div>
+    </div>
+    <div class="option" data-choice="dynamic" onclick="toggleSelect(this)">
+      <div class="letter">B</div>
+      <div class="content">
+        <h3>鍔ㄦ�佹樉绀�</h3>
+        <p>鏍规嵁搴撳瓨鐘舵�佸姩鎬佹樉绀�/闅愯棌鎸夐挳</p>
+        <div class="pros-cons">
+          <div class="pros"><h4>浼樼偣</h4><ul><li>鐣岄潰娓呮櫚</li><li>鍑忓皯璇搷浣�</li><li>浣撻獙鏇村ソ</li></ul></div>
+          <div class="cons"><h4>缂虹偣</h4><ul><li>闇�瑕佺淮鎶ょ姸鎬佹槧灏�</li></ul></div>
+        </div>
+      </div>
+    </div>
+    <div class="option" data-choice="disable" onclick="toggleSelect(this)">
+      <div class="letter">C</div>
+      <div class="content">
+        <h3>鏄剧ず骞剁鐢�</h3>
+        <p>鎵�鏈夋寜閽兘鏄剧ず锛屼絾涓嶅彲鐢ㄧ殑鏄剧ず涓虹鐢ㄧ姸鎬�</p>
+        <div class="pros-cons">
+          <div class="pros"><h4>浼樼偣</h4><ul><li>鐢ㄦ埛鐭ラ亾鏈夋鍔熻兘</li><li>娓呮涓轰綍涓嶅彲鐢�</li></ul></div>
+          <div class="cons"><h4>缂虹偣</h4><ul><li>鐣岄潰鍙兘鎷ユ尋</li></ul></div>
+        </div>
+      </div>
+    </div>
+  </div>
+</div>
+
+<div class="section">
+  <h3>绀轰緥锛氬姩鎬佹樉绀烘晥鏋�</h3>
+  <p class="subtitle">涓嶅悓鐘舵�佷笅鐨勬寜閽樉绀烘儏鍐�</p>
+
+  <div class="mockup">
+    <div class="mockup-header">棰勮锛氫笉鍚岀姸鎬佺殑鎸夐挳鏄剧ず</div>
+    <div class="mockup-body">
+      <table class="mock-table">
+        <thead>
+          <tr>
+            <th>鎵樼洏缂栧彿</th>
+            <th>搴撳瓨鐘舵��</th>
+            <th>鎿嶄綔鎸夐挳</th>
+          </tr>
+        </thead>
+        <tbody>
+          <tr>
+            <td>P001</td>
+            <td><span class="status-badge status-badge-idle">寰呭叆搴�</span></td>
+            <td>
+              <button class="mock-btn-inline mock-btn-primary">杩涚珯</button>
+              <button class="mock-btn-inline mock-btn-disabled">鍑虹珯</button>
+            </td>
+          </tr>
+          <tr>
+            <td>P002</td>
+            <td><span class="status-badge status-badge-instock">鍦ㄥ簱</span></td>
+            <td>
+              <button class="mock-btn-inline mock-btn-disabled">杩涚珯</button>
+              <button class="mock-btn-inline mock-btn-success">鍑虹珯</button>
+            </td>
+          </tr>
+          <tr>
+            <td>P003</td>
+            <td><span class="status-badge status-badge-lock">閿佸畾</span></td>
+            <td>
+              <span class="text-muted">鏆傛棤鍙墽琛屾搷浣�</span>
+            </td>
+          </tr>
+        </tbody>
+      </table>
+    </div>
+  </div>
+</div>
+
+<style>
+.status-list {
+  display: flex;
+  flex-direction: column;
+  gap: 12px;
+}
+.status-item {
+  display: flex;
+  align-items: center;
+  gap: 12px;
+  padding: 12px;
+  background: #fafafa;
+  border-radius: 6px;
+}
+.status-badge {
+  padding: 4px 12px;
+  border-radius: 4px;
+  font-size: 13px;
+  font-weight: 500;
+  white-space: nowrap;
+}
+.status-badge-idle {
+  background: #e3f2fd;
+  color: #1976d2;
+}
+.status-badge-instock {
+  background: #e8f5e9;
+  color: #388e3c;
+}
+.status-badge-outbound {
+  background: #fff3e0;
+  color: #f57c00;
+}
+.status-badge-lock {
+  background: #ffebee;
+  color: #d32f2f;
+}
+.status-desc {
+  font-size: 13px;
+  color: #606266;
+}
+.mock-table {
+  width: 100%;
+  border-collapse: collapse;
+  font-size: 13px;
+}
+.mock-table th, .mock-table td {
+  border: 1px solid #e0e0e0;
+  padding: 10px 12px;
+  text-align: left;
+}
+.mock-table th {
+  background: #f5f5f5;
+  font-weight: 600;
+}
+.mock-table tbody tr:nth-child(even) {
+  background: #fafafa;
+}
+.mock-btn-inline {
+  padding: 6px 14px;
+  font-size: 13px;
+  border-radius: 4px;
+  border: 1px solid #dcdfe6;
+  background: white;
+  cursor: pointer;
+  margin-right: 8px;
+}
+.mock-btn-primary {
+  background: #1f5eff;
+  color: white;
+  border-color: #1f5eff;
+}
+.mock-btn-success {
+  background: #67c23a;
+  color: white;
+  border-color: #67c23a;
+}
+.mock-btn-disabled {
+  background: #f5f5f5;
+  color: #c0c4cc;
+  border-color: #e4e7ed;
+  cursor: not-allowed;
+}
+.text-muted {
+  color: #909399;
+  font-size: 13px;
+}
+.pros-cons {
+  display: flex;
+  gap: 16px;
+  margin-top: 12px;
+}
+.pros, .cons {
+  flex: 1;
+  font-size: 13px;
+}
+.pros h4 {
+  color: #4caf50;
+  margin: 0 0 6px 0;
+}
+.cons h4 {
+  color: #f56c6c;
+  margin: 0 0 6px 0;
+}
+.pros ul, .cons ul {
+  margin: 0;
+  padding-left: 16px;
+}
+.pros li, .cons li {
+  margin-bottom: 4px;
+}
+</style>
diff --git a/Code/.superpowers/brainstorm/2159-1775998341/error-handling.html b/Code/.superpowers/brainstorm/2159-1775998341/error-handling.html
new file mode 100644
index 0000000..cf960ea
--- /dev/null
+++ b/Code/.superpowers/brainstorm/2159-1775998341/error-handling.html
@@ -0,0 +1,223 @@
+<h2>閿欒澶勭悊涓庡弽棣�</h2>
+<p class="subtitle">MES鎺ュ彛璋冪敤澶辫触鏃剁殑澶勭悊鏂瑰紡</p>
+
+<div class="section">
+  <h3>鍦烘櫙鍒嗘瀽</h3>
+  <p class="subtitle">MES鎺ュ彛鍙兘鍥犵綉缁溿�丮ES绯荤粺寮傚父銆佸弬鏁伴敊璇瓑鍘熷洜澶辫触</p>
+
+  <div class="mockup">
+    <div class="mockup-header">甯歌閿欒绫诲瀷</div>
+    <div class="mockup-body">
+      <div class="error-list">
+        <div class="error-item">
+          <span class="error-icon error-icon-network">馃摗</span>
+          <div class="error-content">
+            <div class="error-title">缃戠粶瓒呮椂</div>
+            <div class="error-desc">MES鏈嶅姟鍣ㄦ棤鍝嶅簲鎴栬繛鎺ヨ秴鏃�</div>
+          </div>
+        </div>
+        <div class="error-item">
+          <span class="error-icon error-icon-server">鈿狅笍</span>
+          <div class="error-content">
+            <div class="error-title">MES涓氬姟閿欒</div>
+            <div class="error-desc">鎵樼洏涓嶅瓨鍦ㄣ�佺數鑺凡缁戝畾绛変笟鍔℃牎楠屽け璐�</div>
+          </div>
+        </div>
+        <div class="error-item">
+          <span class="error-icon error-icon-auth">馃敀</span>
+          <div class="error-content">
+            <div class="error-title">璁よ瘉澶辫触</div>
+            <div class="error-desc">MES鎺ュ彛璁よ瘉淇℃伅杩囨湡鎴栨棤鏁�</div>
+          </div>
+        </div>
+        <div class="error-item">
+          <span class="error-icon error-icon-unknown">鉂�</span>
+          <div class="error-content">
+            <div class="error-title">鏈煡閿欒</div>
+            <div class="error-desc">MES绯荤粺杩斿洖寮傚父鎴栨湭棰勬湡鐨勫搷搴�</div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</div>
+
+<div class="section">
+  <h3>閿欒澶勭悊鏂瑰紡閫夋嫨</h3>
+  <p class="subtitle">閫夋嫨閫傚悎鎮ㄤ笟鍔$殑澶勭悊绛栫暐</p>
+
+  <div class="options">
+    <div class="option" data-choice="simple" onclick="toggleSelect(this)">
+      <div class="letter">A</div>
+      <div class="content">
+        <h3>绠�鍗曟彁绀�</h3>
+        <p>璋冪敤澶辫触鍚庡脊鍑洪敊璇彁绀猴紝鐢ㄦ埛鑷鍐冲畾鏄惁閲嶈瘯</p>
+        <div class="pros-cons">
+          <div class="pros"><h4>浼樼偣</h4><ul><li>瀹炵幇绠�鍗�</li><li>鐢ㄦ埛瀹屽叏鎺у埗</li></ul></div>
+          <div class="cons"><h4>缂虹偣</h4><ul><li>闇�瑕佹墜鍔ㄩ噸璇�</li><li>瀹规槗閬楁紡</li></ul></div>
+        </div>
+      </div>
+    </div>
+    <div class="option" data-choice="auto-retry" onclick="toggleSelect(this)">
+      <div class="letter">B</div>
+      <div class="content">
+        <h3>鑷姩閲嶈瘯</h3>
+        <p>澶辫触鍚庤嚜鍔ㄩ噸璇曟寚瀹氭鏁帮紙濡�3娆★級锛屼粛澶辫触鍒欐彁绀虹敤鎴�</p>
+        <div class="pros-cons">
+          <div class="pros"><h4>浼樼偣</h4><ul><li>澶勭悊涓存椂缃戠粶闂</li><li>鎻愰珮鎴愬姛鐜�</li></ul></div>
+          <div class="cons"><h4>缂虹偣</h4><ul><li>鍙兘閲嶅鎵ц涓氬姟</li><li>澧炲姞鍝嶅簲鏃堕棿</li></ul></div>
+        </div>
+      </div>
+    </div>
+    <div class="option" data-choice="queue" onclick="toggleSelect(this)">
+      <div class="letter">C</div>
+      <div class="content">
+        <h3>寮傛闃熷垪</h3>
+        <p>澶辫触鍚庡姞鍏ラ噸璇曢槦鍒楋紝鍚庡彴瀹氭椂浠诲姟鑷姩閲嶈瘯</p>
+        <div class="pros-cons">
+          <div class="pros"><h4>浼樼偣</h4><ul><li>涓嶉樆濉炵敤鎴锋搷浣�</li><li>鍙拷婧噸璇曡褰�</li></ul></div>
+          <div class="cons"><h4>缂虹偣</h4><ul><li>瀹炵幇澶嶆潅</li><li>闇�瑕侀澶栫洃鎺�</li></ul></div>
+        </div>
+      </div>
+    </div>
+  </div>
+</div>
+
+<div class="section">
+  <h3>閿欒鎻愮ず灞曠ず</h3>
+  <p class="subtitle">鐢ㄦ埛鐪嬪埌鐨勯敊璇俊鎭牱寮�</p>
+
+  <div class="mockup">
+    <div class="mockup-header">棰勮锛氶敊璇彁绀烘牱寮�</div>
+    <div class="mockup-body">
+      <div class="error-toast error-toast-error">
+        <span class="error-toast-icon">鉁�</span>
+        <div class="error-toast-content">
+          <div class="error-toast-title">鎿嶄綔澶辫触</div>
+          <div class="error-toast-message">MES鏈嶅姟鍣ㄨ繛鎺ヨ秴鏃讹紝璇锋鏌ョ綉缁滃悗閲嶈瘯</div>
+        </div>
+        <button class="error-toast-retry">閲嶈瘯</button>
+      </div>
+      <div style="height: 12px;"></div>
+      <div class="error-toast error-toast-warning">
+        <span class="error-toast-icon">鈿�</span>
+        <div class="error-toast-content">
+          <div class="error-toast-title">涓氬姟鏍¢獙澶辫触</div>
+          <div class="error-toast-message">鎵樼洏 P001 鍦∕ES涓笉瀛樺湪锛岃鍏堝湪MES涓垱寤�</div>
+        </div>
+      </div>
+    </div>
+  </div>
+</div>
+
+<style>
+.error-list {
+  display: flex;
+  flex-direction: column;
+  gap: 12px;
+}
+.error-item {
+  display: flex;
+  align-items: flex-start;
+  gap: 12px;
+  padding: 12px;
+  background: #fafafa;
+  border-radius: 6px;
+  border: 1px solid #e0e0e0;
+}
+.error-icon {
+  font-size: 24px;
+  flex-shrink: 0;
+}
+.error-content {
+  flex: 1;
+}
+.error-title {
+  font-weight: 600;
+  font-size: 14px;
+  color: #303133;
+  margin-bottom: 4px;
+}
+.error-desc {
+  font-size: 13px;
+  color: #606266;
+}
+.pros-cons {
+  display: flex;
+  gap: 16px;
+  margin-top: 12px;
+}
+.pros, .cons {
+  flex: 1;
+  font-size: 13px;
+}
+.pros h4 {
+  color: #4caf50;
+  margin: 0 0 6px 0;
+}
+.cons h4 {
+  color: #f56c6c;
+  margin: 0 0 6px 0;
+}
+.pros ul, .cons ul {
+  margin: 0;
+  padding-left: 16px;
+}
+.pros li, .cons li {
+  margin-bottom: 4px;
+}
+.error-toast {
+  display: flex;
+  align-items: center;
+  gap: 12px;
+  padding: 14px 16px;
+  border-radius: 8px;
+  box-shadow: 0 2px 8px rgba(0,0,0,0.1);
+}
+.error-toast-error {
+  background: #fef0f0;
+  border: 1px solid #fde2e2;
+}
+.error-toast-warning {
+  background: #fdf6ec;
+  border: 1px solid #f5dab1;
+}
+.error-toast-icon {
+  font-size: 20px;
+  flex-shrink: 0;
+}
+.error-toast-error .error-toast-icon {
+  color: #f56c6c;
+}
+.error-toast-warning .error-toast-icon {
+  color: #e6a23c;
+}
+.error-toast-content {
+  flex: 1;
+}
+.error-toast-title {
+  font-weight: 600;
+  font-size: 14px;
+  margin-bottom: 4px;
+}
+.error-toast-error .error-toast-title {
+  color: #f56c6c;
+}
+.error-toast-warning .error-toast-title {
+  color: #e6a23c;
+}
+.error-toast-message {
+  font-size: 13px;
+  color: #606266;
+}
+.error-toast-retry {
+  padding: 6px 16px;
+  background: #1f5eff;
+  color: white;
+  border: none;
+  border-radius: 4px;
+  font-size: 13px;
+  cursor: pointer;
+  flex-shrink: 0;
+}
+</style>
diff --git a/Code/.superpowers/brainstorm/2159-1775998341/operations-column.html b/Code/.superpowers/brainstorm/2159-1775998341/operations-column.html
new file mode 100644
index 0000000..c814435
--- /dev/null
+++ b/Code/.superpowers/brainstorm/2159-1775998341/operations-column.html
@@ -0,0 +1,203 @@
+<h2>搴撳瓨椤甸潰鎿嶄綔鍒楄璁�</h2>
+<p class="subtitle">涓哄簱瀛樹俊鎭拰搴撳瓨鏄庣粏椤甸潰娣诲姞MES鎺ュ彛鎿嶄綔鎸夐挳</p>
+
+<div class="section">
+  <h3>1. 搴撳瓨淇℃伅椤甸潰 - 鎵樼洏绾у埆鎿嶄綔</h3>
+  <p class="subtitle">褰撳墠椤甸潰鏄剧ず鎵樼洏缂栧彿銆佽揣浣嶇紪鍙风瓑淇℃伅锛岄渶瑕佹坊鍔犺繘绔�/鍑虹珯鎿嶄綔</p>
+
+  <div class="mockup">
+    <div class="mockup-header">棰勮锛氬簱瀛樹俊鎭〃鏍�</div>
+    <div class="mockup-body">
+      <table class="mock-table">
+        <thead>
+          <tr>
+            <th>鎵樼洏缂栧彿</th>
+            <th>璐т綅缂栧彿</th>
+            <th>浠撳簱</th>
+            <th>鍒涘缓浜�</th>
+            <th class="op-col">鎿嶄綔</th>
+          </tr>
+        </thead>
+        <tbody>
+          <tr>
+            <td>P001</td>
+            <td>A01-01-01</td>
+            <td>涓�鍙蜂粨</td>
+            <td>寮犱笁</td>
+            <td class="op-col">
+              <button class="mock-button mock-btn-sm">杩涚珯</button>
+              <button class="mock-button mock-btn-sm mock-btn-primary">鍑虹珯</button>
+            </td>
+          </tr>
+          <tr>
+            <td>P002</td>
+            <td>A01-01-02</td>
+            <td>涓�鍙蜂粨</td>
+            <td>鏉庡洓</td>
+            <td class="op-col">
+              <button class="mock-button mock-btn-sm">杩涚珯</button>
+              <button class="mock-button mock-btn-sm mock-btn-primary">鍑虹珯</button>
+            </td>
+          </tr>
+        </tbody>
+      </table>
+    </div>
+  </div>
+</div>
+
+<div class="section">
+  <h3>2. 搴撳瓨鏄庣粏椤甸潰 - 鐢佃姱绾у埆鎿嶄綔</h3>
+  <p class="subtitle">褰撳墠椤甸潰鏄剧ず鐗╂枡缂栧彿銆佺數鑺爜绛変俊鎭紝闇�瑕佹坊鍔犵粦瀹�/瑙g粦/NG涓婃姤鎿嶄綔</p>
+
+  <div class="mockup">
+    <div class="mockup-header">棰勮锛氬簱瀛樻槑缁嗚〃鏍�</div>
+    <div class="mockup-body">
+      <table class="mock-table">
+        <thead>
+          <tr>
+            <th>鐗╂枡缂栧彿</th>
+            <th>鐗╂枡鍚嶇О</th>
+            <th>鐢佃姱鐮�</th>
+            <th>搴撳瓨鏁伴噺</th>
+            <th>鐘舵��</th>
+            <th class="op-col">鎿嶄綔</th>
+          </tr>
+        </thead>
+        <tbody>
+          <tr>
+            <td>M001</td>
+            <td>涓夊厓閿傜數姹�</td>
+            <td>SN20240101001</td>
+            <td>100</td>
+            <td><span class="mock-tag mock-tag-success">姝e父</span></td>
+            <td class="op-col">
+              <button class="mock-button mock-btn-sm mock-btn-primary">缁戝畾</button>
+              <button class="mock-button mock-btn-sm">瑙g粦</button>
+              <button class="mock-button mock-btn-sm mock-btn-danger">NG涓婃姤</button>
+            </td>
+          </tr>
+          <tr>
+            <td>M001</td>
+            <td>涓夊厓閿傜數姹�</td>
+            <td>SN20240101002</td>
+            <td>100</td>
+            <td><span class="mock-tag mock-tag-warning">寮傚父</span></td>
+            <td class="op-col">
+              <button class="mock-button mock-btn-sm mock-btn-primary">缁戝畾</button>
+              <button class="mock-button mock-btn-sm">瑙g粦</button>
+              <button class="mock-button mock-btn-sm mock-btn-danger">NG涓婃姤</button>
+            </td>
+          </tr>
+        </tbody>
+      </table>
+    </div>
+  </div>
+</div>
+
+<div class="section">
+  <h3>鎸夐挳鎿嶄綔纭闂</h3>
+  <p class="subtitle">MES鎺ュ彛璋冪敤鍙兘澶辫触鎴栭渶瑕侀澶栧弬鏁�</p>
+
+  <div class="options">
+    <div class="option" data-choice="direct" onclick="toggleSelect(this)">
+      <div class="letter">A</div>
+      <div class="content">
+        <h3>鐩存帴璋冪敤</h3>
+        <p>鐐瑰嚮鎸夐挳鐩存帴璋冪敤MES鎺ュ彛锛屾垚鍔�/澶辫触鍚庡脊鍑烘彁绀�</p>
+        <div class="pros-cons">
+          <div class="pros"><h4>浼樼偣</h4><ul><li>鎿嶄綔绠�鍗曞揩鎹�</li><li>閫傚悎楂橀鎿嶄綔</li></ul></div>
+          <div class="cons"><h4>缂虹偣</h4><ul><li>鏃犳硶杈撳叆棰濆鍙傛暟</li><li>閿欒鍚庨毦浠ラ噸璇�</li></ul></div>
+        </div>
+      </div>
+    </div>
+    <div class="option" data-choice="dialog" onclick="toggleSelect(this)">
+      <div class="letter">B</div>
+      <div class="content">
+        <h3>寮圭獥纭</h3>
+        <p>鐐瑰嚮鍚庡脊鍑虹‘璁ゅ璇濇锛屾樉绀哄弬鏁板苟鍙慨鏀癸紝纭鍚庤皟鐢�</p>
+        <div class="pros-cons">
+          <div class="pros"><h4>浼樼偣</h4><ul><li>鍙瑙�/淇敼鍙傛暟</li><li>闃叉璇搷浣�</li><li>鏄剧ず璇︾粏閿欒淇℃伅</li></ul></div>
+          <div class="cons"><h4>缂虹偣</h4><ul><li>鎿嶄綔姝ラ澶�</li><li>褰卞搷鏁堢巼</li></ul></div>
+        </div>
+      </div>
+    </div>
+  </div>
+</div>
+
+<style>
+.mock-table {
+  width: 100%;
+  border-collapse: collapse;
+  font-size: 13px;
+}
+.mock-table th, .mock-table td {
+  border: 1px solid #e0e0e0;
+  padding: 10px 12px;
+  text-align: left;
+}
+.mock-table th {
+  background: #f5f5f5;
+  font-weight: 600;
+  color: #333;
+}
+.mock-table .op-col {
+  width: 180px;
+  text-align: center;
+}
+.mock-table tbody tr:nth-child(even) {
+  background: #fafafa;
+}
+.mock-btn-sm {
+  padding: 5px 12px;
+  font-size: 12px;
+  margin: 0 3px;
+}
+.mock-btn-primary {
+  background: #1f5eff;
+  color: white;
+  border: none;
+}
+.mock-btn-danger {
+  background: #f56c6c;
+  color: white;
+  border: none;
+}
+.mock-tag {
+  display: inline-block;
+  padding: 3px 8px;
+  border-radius: 4px;
+  font-size: 12px;
+}
+.mock-tag-success {
+  background: #e1f5e1;
+  color: #4caf50;
+}
+.mock-tag-warning {
+  background: #fff3e0;
+  color: #ff9800;
+}
+.pros-cons {
+  display: flex;
+  gap: 16px;
+  margin-top: 12px;
+}
+.pros, .cons {
+  flex: 1;
+  font-size: 13px;
+}
+.pros h4 {
+  color: #4caf50;
+  margin: 0 0 6px 0;
+}
+.cons h4 {
+  color: #f56c6c;
+  margin: 0 0 6px 0;
+}
+.pros ul, .cons ul {
+  margin: 0;
+  padding-left: 16px;
+}
+.pros li, .cons li {
+  margin-bottom: 4px;
+}
+</style>
diff --git a/Code/.superpowers/brainstorm/2159-1775998341/operations-layout-v2.html b/Code/.superpowers/brainstorm/2159-1775998341/operations-layout-v2.html
new file mode 100644
index 0000000..db4aabb
--- /dev/null
+++ b/Code/.superpowers/brainstorm/2159-1775998341/operations-layout-v2.html
@@ -0,0 +1,347 @@
+<h2>鎿嶄綔鍒楀竷灞�浼樺寲</h2>
+<p class="subtitle">鎸夐挳鍦ㄥ悓涓�鎺掓樉绀猴紝璁剧疆鍥哄畾瀹藉害闃叉鐣岄潰鍙樺舰</p>
+
+<div class="section">
+  <h3>1. 搴撳瓨淇℃伅椤甸潰 - 鎵樼洏绾у埆鎿嶄綔</h3>
+  <p class="subtitle">鎿嶄綔鍒楀浐瀹氬搴︼紝鎸夐挳妯悜鎺掑垪</p>
+
+  <div class="mockup">
+    <div class="mockup-header">棰勮锛氬簱瀛樹俊鎭〃鏍�</div>
+    <div class="mockup-body">
+      <table class="mock-table">
+        <thead>
+          <tr>
+            <th style="width: 120px;">鎵樼洏缂栧彿</th>
+            <th style="width: 150px;">璐т綅缂栧彿</th>
+            <th style="width: 100px;">浠撳簱</th>
+            <th style="width: 90px;">鍒涘缓浜�</th>
+            <th style="width: 200px;">鎿嶄綔</th>
+          </tr>
+        </thead>
+        <tbody>
+          <tr>
+            <td>P001</td>
+            <td>A01-01-01</td>
+            <td>涓�鍙蜂粨</td>
+            <td>寮犱笁</td>
+            <td>
+              <button class="mock-btn-inline mock-btn-primary">杩涚珯</button>
+              <button class="mock-btn-inline mock-btn-success">鍑虹珯</button>
+            </td>
+          </tr>
+          <tr>
+            <td>P002</td>
+            <td>A01-01-02</td>
+            <td>涓�鍙蜂粨</td>
+            <td>鏉庡洓</td>
+            <td>
+              <button class="mock-btn-inline mock-btn-primary">杩涚珯</button>
+              <button class="mock-btn-inline mock-btn-success">鍑虹珯</button>
+            </td>
+          </tr>
+          <tr>
+            <td>P003</td>
+            <td>B01-01-01</td>
+            <td>浜屽彿浠�</td>
+            <td>鐜嬩簲</td>
+            <td>
+              <button class="mock-btn-inline mock-btn-primary">杩涚珯</button>
+              <button class="mock-btn-inline mock-btn-success">鍑虹珯</button>
+            </td>
+          </tr>
+        </tbody>
+      </table>
+    </div>
+  </div>
+</div>
+
+<div class="section">
+  <h3>2. 搴撳瓨鏄庣粏椤甸潰 - 鐢佃姱绾у埆鎿嶄綔</h3>
+  <p class="subtitle">涓変釜鎸夐挳妯悜鎺掑垪锛屾搷浣滃垪鍥哄畾瀹藉害</p>
+
+  <div class="mockup">
+    <div class="mockup-header">棰勮锛氬簱瀛樻槑缁嗚〃鏍�</div>
+    <div class="mockup-body">
+      <table class="mock-table">
+        <thead>
+          <tr>
+            <th style="width: 100px;">鐗╂枡缂栧彿</th>
+            <th style="width: 140px;">鐗╂枡鍚嶇О</th>
+            <th style="width: 150px;">鐢佃姱鐮�</th>
+            <th style="width: 90px;">鏁伴噺</th>
+            <th style="width: 80px;">鐘舵��</th>
+            <th style="width: 280px;">鎿嶄綔</th>
+          </tr>
+        </thead>
+        <tbody>
+          <tr>
+            <td>M001</td>
+            <td>涓夊厓閿傜數姹�</td>
+            <td>SN20240101001</td>
+            <td>100</td>
+            <td><span class="mock-tag mock-tag-success">姝e父</span></td>
+            <td>
+              <button class="mock-btn-inline mock-btn-primary">缁戝畾</button>
+              <button class="mock-btn-inline mock-btn-warning">瑙g粦</button>
+              <button class="mock-btn-inline mock-btn-danger">NG涓婃姤</button>
+            </td>
+          </tr>
+          <tr>
+            <td>M001</td>
+            <td>涓夊厓閿傜數姹�</td>
+            <td>SN20240101002</td>
+            <td>100</td>
+            <td><span class="mock-tag mock-tag-warning">寮傚父</span></td>
+            <td>
+              <button class="mock-btn-inline mock-btn-primary">缁戝畾</button>
+              <button class="mock-btn-inline mock-btn-warning">瑙g粦</button>
+              <button class="mock-btn-inline mock-btn-danger">NG涓婃姤</button>
+            </td>
+          </tr>
+        </tbody>
+      </table>
+    </div>
+  </div>
+</div>
+
+<div class="section">
+  <h3>寮圭獥纭浜や簰娴佺▼</h3>
+  <p class="subtitle">鐐瑰嚮鎸夐挳 鈫� 寮瑰嚭纭瀵硅瘽妗� 鈫� 纭鍚庤皟鐢∕ES鎺ュ彛</p>
+
+  <div class="mockup">
+    <div class="mockup-header">棰勮锛氱‘璁ゅ璇濇绀轰緥</div>
+    <div class="mockup-body">
+      <div class="mock-dialog">
+        <div class="mock-dialog-header">
+          <span class="mock-dialog-title">纭鎿嶄綔</span>
+          <span class="mock-dialog-close">鉁�</span>
+        </div>
+        <div class="mock-dialog-body">
+          <p class="mock-dialog-text">鎮ㄥ嵆灏嗘墽琛� <strong>鎵樼洏杩涚珯</strong> 鎿嶄綔</p>
+          <div class="mock-dialog-info">
+            <div class="mock-info-row">
+              <span class="mock-info-label">鎵樼洏鐮侊細</span>
+              <span class="mock-info-value">P001</span>
+            </div>
+            <div class="mock-info-row">
+              <span class="mock-info-label">璁惧缂栫爜锛�</span>
+              <span class="mock-info-value">WCS_001</span>
+            </div>
+            <div class="mock-info-row">
+              <span class="mock-info-label">璧勬簮缂栫爜锛�</span>
+              <span class="mock-info-value">RESOURCE_001</span>
+            </div>
+          </div>
+        </div>
+        <div class="mock-dialog-footer">
+          <button class="mock-btn-inline mock-btn-default">鍙栨秷</button>
+          <button class="mock-btn-inline mock-btn-primary">纭鎵ц</button>
+        </div>
+      </div>
+    </div>
+  </div>
+</div>
+
+<div class="section">
+  <h3>涓嬩竴涓棶棰�</h3>
+  <p class="subtitle">鍏充簬MES鎺ュ彛璋冪敤鐨勫弬鏁拌幏鍙栨柟寮�</p>
+
+  <div class="options">
+    <div class="option" data-choice="config" onclick="toggleSelect(this)">
+      <div class="letter">A</div>
+      <div class="content">
+        <h3>绯荤粺閰嶇疆</h3>
+        <p>璁惧缂栫爜銆佽祫婧愮紪鐮佺瓑鍙傛暟浠庣郴缁熼厤缃腑璇诲彇锛岀敤鎴锋棤闇�杈撳叆</p>
+        <div class="pros-cons">
+          <div class="pros"><h4>浼樼偣</h4><ul><li>鎿嶄綔绠�鍗�</li><li>鍑忓皯浜轰负閿欒</li></ul></div>
+        </div>
+      </div>
+    </div>
+    <div class="option" data-choice="input" onclick="toggleSelect(this)">
+      <div class="letter">B</div>
+      <div class="content">
+        <h3>寮圭獥杈撳叆</h3>
+        <p>鍦ㄧ‘璁ゅ璇濇涓樉绀哄弬鏁拌緭鍏ユ锛屽厑璁哥敤鎴蜂慨鏀归粯璁ゅ��</p>
+        <div class="pros-cons">
+          <div class="pros"><h4>浼樼偣</h4><ul><li>鐏垫椿鎬ч珮</li><li>閫傚簲涓嶅悓鍦烘櫙</li></ul></div>
+        </div>
+      </div>
+    </div>
+    <div class="option" data-choice="hybrid" onclick="toggleSelect(this)">
+      <div class="letter">C</div>
+      <div class="content">
+        <h3>娣峰悎妯″紡</h3>
+        <p>鍏抽敭鍙傛暟浠庨厤缃鍙栵紝鍙�夊弬鏁板湪寮圭獥涓彁渚涜緭鍏�</p>
+        <div class="pros-cons">
+          <div class="pros"><h4>浼樼偣</h4><ul><li>骞宠 绠�渚挎�у拰鐏垫椿鎬�</li><li>甯歌鎿嶄綔蹇�燂紝鐗规畩鍦烘櫙鍙皟鏁�</li></ul></div>
+        </div>
+      </div>
+    </div>
+  </div>
+</div>
+
+<style>
+.mock-table {
+  width: 100%;
+  border-collapse: collapse;
+  font-size: 13px;
+  table-layout: fixed;
+}
+.mock-table th, .mock-table td {
+  border: 1px solid #e0e0e0;
+  padding: 10px 12px;
+  text-align: left;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+.mock-table th {
+  background: #f5f5f5;
+  font-weight: 600;
+  color: #333;
+}
+.mock-table tbody tr:nth-child(even) {
+  background: #fafafa;
+}
+.mock-table tbody tr:hover {
+  background: #f0f7ff;
+}
+.mock-btn-inline {
+  padding: 6px 14px;
+  font-size: 13px;
+  border: 1px solid #dcdfe6;
+  background: white;
+  border-radius: 4px;
+  cursor: pointer;
+  margin-right: 8px;
+  transition: all 0.2s;
+}
+.mock-btn-inline:last-child {
+  margin-right: 0;
+}
+.mock-btn-inline:hover {
+  opacity: 0.85;
+}
+.mock-btn-primary {
+  background: #1f5eff;
+  color: white;
+  border-color: #1f5eff;
+}
+.mock-btn-success {
+  background: #67c23a;
+  color: white;
+  border-color: #67c23a;
+}
+.mock-btn-warning {
+  background: #e6a23c;
+  color: white;
+  border-color: #e6a23c;
+}
+.mock-btn-danger {
+  background: #f56c6c;
+  color: white;
+  border-color: #f56c6c;
+}
+.mock-btn-default {
+  background: white;
+  color: #606266;
+  border-color: #dcdfe6;
+}
+.mock-tag {
+  display: inline-block;
+  padding: 3px 8px;
+  border-radius: 4px;
+  font-size: 12px;
+}
+.mock-tag-success {
+  background: #e1f5e1;
+  color: #4caf50;
+}
+.mock-tag-warning {
+  background: #fff3e0;
+  color: #ff9800;
+}
+.mock-dialog {
+  width: 420px;
+  margin: 20px auto;
+  border: 1px solid #e0e0e0;
+  border-radius: 8px;
+  box-shadow: 0 4px 12px rgba(0,0,0,0.1);
+  background: white;
+}
+.mock-dialog-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  padding: 16px 20px;
+  border-bottom: 1px solid #e0e0e0;
+  background: #f8fafc;
+}
+.mock-dialog-title {
+  font-weight: 600;
+  font-size: 16px;
+  color: #303133;
+}
+.mock-dialog-close {
+  cursor: pointer;
+  color: #909399;
+  font-size: 18px;
+}
+.mock-dialog-body {
+  padding: 20px;
+}
+.mock-dialog-text {
+  margin: 0 0 16px 0;
+  font-size: 14px;
+  color: #606266;
+}
+.mock-dialog-info {
+  background: #f8fafc;
+  border-radius: 6px;
+  padding: 12px 16px;
+}
+.mock-info-row {
+  display: flex;
+  margin-bottom: 10px;
+  font-size: 13px;
+}
+.mock-info-row:last-child {
+  margin-bottom: 0;
+}
+.mock-info-label {
+  color: #909399;
+  width: 80px;
+}
+.mock-info-value {
+  color: #303133;
+  font-weight: 500;
+}
+.mock-dialog-footer {
+  display: flex;
+  justify-content: flex-end;
+  gap: 12px;
+  padding: 16px 20px;
+  border-top: 1px solid #e0e0e0;
+  background: #f8fafc;
+}
+.pros-cons {
+  display: flex;
+  gap: 16px;
+  margin-top: 12px;
+}
+.pros, .cons {
+  flex: 1;
+  font-size: 13px;
+}
+.pros h4 {
+  color: #4caf50;
+  margin: 0 0 6px 0;
+}
+.pros ul {
+  margin: 0;
+  padding-left: 16px;
+}
+.pros li {
+  margin-bottom: 4px;
+}
+</style>
diff --git a/Code/.superpowers/brainstorm/2159-1775998341/status-mapping.html b/Code/.superpowers/brainstorm/2159-1775998341/status-mapping.html
new file mode 100644
index 0000000..c368d49
--- /dev/null
+++ b/Code/.superpowers/brainstorm/2159-1775998341/status-mapping.html
@@ -0,0 +1,213 @@
+<h2>鐘舵�佷笌鎿嶄綔鏄犲皠瑙勫垯</h2>
+<p class="subtitle">瀹氫箟鍝簺搴撳瓨鐘舵�佷笅鍏佽鎵ц鍝簺MES鎿嶄綔</p>
+
+<div class="section">
+  <h3>搴撳瓨淇℃伅椤甸潰 - 鎵樼洏绾у埆</h3>
+  <p class="subtitle">杩涚珯/鍑虹珯鎿嶄綔鐨勮Е鍙戞潯浠�</p>
+
+  <div class="mockup">
+    <div class="mockup-header">鐘舵�佹槧灏勮〃锛堣鍦ㄦ祻瑙堝櫒涓�夋嫨锛�</div>
+    <div class="mockup-body">
+      <table class="mapping-table">
+        <thead>
+          <tr>
+            <th>搴撳瓨鐘舵��</th>
+            <th>杩涚珯鎿嶄綔</th>
+            <th>鍑虹珯鎿嶄綔</th>
+          </tr>
+        </thead>
+        <tbody>
+          <tr>
+            <td><span class="status-tag status-idle">寰呭叆搴�</span></td>
+            <td><input type="checkbox" checked> 鍏佽</td>
+            <td><input type="checkbox"> 绂佹</td>
+          </tr>
+          <tr>
+            <td><span class="status-tag status-instock">鍦ㄥ簱</span></td>
+            <td><input type="checkbox"> 绂佹</td>
+            <td><input type="checkbox" checked> 鍏佽</td>
+          </tr>
+          <tr>
+            <td><span class="status-tag status-outbound">鍑哄簱涓�</span></td>
+            <td><input type="checkbox"> 绂佹</td>
+            <td><input type="checkbox" checked> 鍏佽</td>
+          </tr>
+          <tr>
+            <td><span class="status-tag status-lock">閿佸畾</span></td>
+            <td><input type="checkbox"> 绂佹</td>
+            <td><input type="checkbox"> 绂佹</td>
+          </tr>
+        </tbody>
+      </table>
+      <p class="hint">鎻愮ず锛氫互涓婃槸榛樿寤鸿锛岃鍦ㄧ粓绔腑鍛婅瘔鎴戦渶瑕佽皟鏁寸殑鍦版柟</p>
+    </div>
+  </div>
+</div>
+
+<div class="section">
+  <h3>搴撳瓨鏄庣粏椤甸潰 - 鐢佃姱绾у埆</h3>
+  <p class="subtitle">缁戝畾/瑙g粦/NG涓婃姤鎿嶄綔鐨勮Е鍙戞潯浠�</p>
+
+  <div class="mockup">
+    <div class="mockup-header">鐘舵�佹槧灏勮〃锛堣鍦ㄦ祻瑙堝櫒涓�夋嫨锛�</div>
+    <div class="mockup-body">
+      <table class="mapping-table">
+        <thead>
+          <tr>
+            <th>鐢佃姱鐘舵��</th>
+            <th>缁戝畾鎿嶄綔</th>
+            <th>瑙g粦鎿嶄綔</th>
+            <th>NG涓婃姤</th>
+          </tr>
+        </thead>
+        <tbody>
+          <tr>
+            <td><span class="status-tag status-normal">姝e父</span></td>
+            <td><input type="checkbox" checked> 鍏佽</td>
+            <td><input type="checkbox" checked> 鍏佽</td>
+            <td><input type="checkbox" checked> 鍏佽</td>
+          </tr>
+          <tr>
+            <td><span class="status-tag status-exception">寮傚父</span></td>
+            <td><input type="checkbox" checked> 鍏佽</td>
+            <td><input type="checkbox" checked> 鍏佽</td>
+            <td><input type="checkbox" checked> 鍏佽</td>
+          </tr>
+          <tr>
+            <td><span class="status-tag status-locked">宸查攣瀹�</span></td>
+            <td><input type="checkbox"> 绂佹</td>
+            <td><input type="checkbox"> 绂佹</td>
+            <td><input type="checkbox"> 绂佹</td>
+          </tr>
+        </tbody>
+      </table>
+      <p class="hint">鎻愮ず锛氫互涓婃槸榛樿寤鸿锛岃鍦ㄧ粓绔腑鍛婅瘔鎴戦渶瑕佽皟鏁寸殑鍦版柟</p>
+    </div>
+  </div>
+</div>
+
+<div class="section">
+  <h3>涓嬩竴涓棶棰�</h3>
+  <p class="subtitle">鏄惁闇�瑕佽褰昅ES鎺ュ彛璋冪敤鏃ュ織锛�</p>
+
+  <div class="options">
+    <div class="option" data-choice="log-full" onclick="toggleSelect(this)">
+      <div class="letter">A</div>
+      <div class="content">
+        <h3>瀹屾暣鏃ュ織</h3>
+        <p>璁板綍姣忔MES鎺ュ彛璋冪敤鐨勫畬鏁翠俊鎭紙璇锋眰銆佸搷搴斻�佽�楁椂銆佺粨鏋滐級</p>
+        <div class="pros-cons">
+          <div class="pros"><h4>浼樼偣</h4><ul><li>渚夸簬闂鎺掓煡</li><li>鏀寔瀹¤杩芥函</li></ul></div>
+        </div>
+      </div>
+    </div>
+    <div class="option" data-choice="log-simple" onclick="toggleSelect(this)">
+      <div class="letter">B</div>
+      <div class="content">
+        <h3>绠�鍗曟棩蹇�</h3>
+        <p>浠呰褰曡皟鐢ㄦ垚鍔�/澶辫触鐘舵�佸拰閿欒淇℃伅</p>
+        <div class="pros-cons">
+          <div class="pros"><h4>浼樼偣</h4><ul><li>瀛樺偍鍗犵敤灏�</li><li>婊¤冻鍩烘湰闇�姹�</li></ul></div>
+        </div>
+      </div>
+    </div>
+    <div class="option" data-choice="log-none" onclick="toggleSelect(this)">
+      <div class="letter">C</div>
+      <div class="content">
+        <h3>涓嶈褰�</h3>
+        <p>涓嶅崟鐙褰曟棩蹇楋紝浠呬緷璧栫郴缁熸棩蹇楀拰MES绯荤粺鏃ュ織</p>
+        <div class="pros-cons">
+          <div class="pros"><h4>浼樼偣</h4><ul><li>鏃犻澶栧瓨鍌�</li><li>瀹炵幇绠�鍗�</li></ul></div>
+        </div>
+      </div>
+    </div>
+  </div>
+</div>
+
+<style>
+.mapping-table {
+  width: 100%;
+  border-collapse: collapse;
+  font-size: 13px;
+}
+.mapping-table th, .mapping-table td {
+  border: 1px solid #e0e0e0;
+  padding: 10px 12px;
+  text-align: center;
+}
+.mapping-table th {
+  background: #f5f5f5;
+  font-weight: 600;
+  color: #303133;
+}
+.mapping-table tbody tr:nth-child(even) {
+  background: #fafafa;
+}
+.mapping-table input[type="checkbox"] {
+  width: 16px;
+  height: 16px;
+  cursor: pointer;
+}
+.status-tag {
+  padding: 4px 10px;
+  border-radius: 4px;
+  font-size: 12px;
+  font-weight: 500;
+}
+.status-idle {
+  background: #e3f2fd;
+  color: #1976d2;
+}
+.status-instock {
+  background: #e8f5e9;
+  color: #388e3c;
+}
+.status-outbound {
+  background: #fff3e0;
+  color: #f57c00;
+}
+.status-lock {
+  background: #ffebee;
+  color: #d32f2f;
+}
+.status-normal {
+  background: #e8f5e9;
+  color: #388e3c;
+}
+.status-exception {
+  background: #fff3e0;
+  color: #f57c00;
+}
+.status-locked {
+  background: #ffebee;
+  color: #d32f2f;
+}
+.hint {
+  margin: 12px 0 0 0;
+  padding: 10px 12px;
+  background: #f0f7ff;
+  border-left: 3px solid #1f5eff;
+  font-size: 12px;
+  color: #606266;
+}
+.pros-cons {
+  display: flex;
+  gap: 16px;
+  margin-top: 12px;
+}
+.pros, .cons {
+  flex: 1;
+  font-size: 13px;
+}
+.pros h4 {
+  color: #4caf50;
+  margin: 0 0 6px 0;
+}
+.pros ul {
+  margin: 0;
+  padding-left: 16px;
+}
+.pros li {
+  margin-bottom: 4px;
+}
+</style>
diff --git a/Code/.superpowers/brainstorm/2159-1775998341/waiting.html b/Code/.superpowers/brainstorm/2159-1775998341/waiting.html
new file mode 100644
index 0000000..9427b04
--- /dev/null
+++ b/Code/.superpowers/brainstorm/2159-1775998341/waiting.html
@@ -0,0 +1,3 @@
+<div style="display:flex;align-items:center;justify-content:center;min-height:60vh">
+  <p class="subtitle">姝e湪鐢熸垚璁捐鏂规...</p>
+</div>
diff --git a/Code/WCS/WIDESEAWCS_Client/.omc/state/idle-notif-cooldown.json b/Code/WCS/WIDESEAWCS_Client/.omc/state/idle-notif-cooldown.json
new file mode 100644
index 0000000..e28f074
--- /dev/null
+++ b/Code/WCS/WIDESEAWCS_Client/.omc/state/idle-notif-cooldown.json
@@ -0,0 +1,3 @@
+{
+  "lastSentAt": "2026-04-12T15:31:49.457Z"
+}
\ No newline at end of file
diff --git a/Code/WCS/WIDESEAWCS_Client/package.json b/Code/WCS/WIDESEAWCS_Client/package.json
index 01274d3..a68d9a8 100644
--- a/Code/WCS/WIDESEAWCS_Client/package.json
+++ b/Code/WCS/WIDESEAWCS_Client/package.json
@@ -25,6 +25,7 @@
   },
   "devDependencies": {
     "@vitejs/plugin-vue": "^4.0.0",
+    "@vitejs/plugin-vue-jsx": "^5.1.5",
     "@vue/compiler-sfc": "^3.0.0",
     "eslint": "^8.50.0",
     "less": "^4.1.1",
diff --git a/Code/WCS/WIDESEAWCS_Client/src/extension/basicinfo/router.js b/Code/WCS/WIDESEAWCS_Client/src/extension/basicinfo/router.jsx
similarity index 100%
rename from Code/WCS/WIDESEAWCS_Client/src/extension/basicinfo/router.js
rename to Code/WCS/WIDESEAWCS_Client/src/extension/basicinfo/router.jsx
diff --git a/Code/WCS/WIDESEAWCS_Client/src/extension/quartzJob/deviceInfo.js b/Code/WCS/WIDESEAWCS_Client/src/extension/quartzJob/deviceInfo.jsx
similarity index 100%
rename from Code/WCS/WIDESEAWCS_Client/src/extension/quartzJob/deviceInfo.js
rename to Code/WCS/WIDESEAWCS_Client/src/extension/quartzJob/deviceInfo.jsx
diff --git a/Code/WCS/WIDESEAWCS_Client/src/extension/quartzJob/deviceProtocol.js b/Code/WCS/WIDESEAWCS_Client/src/extension/quartzJob/deviceProtocol.jsx
similarity index 100%
rename from Code/WCS/WIDESEAWCS_Client/src/extension/quartzJob/deviceProtocol.js
rename to Code/WCS/WIDESEAWCS_Client/src/extension/quartzJob/deviceProtocol.jsx
diff --git a/Code/WCS/WIDESEAWCS_Client/src/extension/quartzJob/deviceProtocolDetail.js b/Code/WCS/WIDESEAWCS_Client/src/extension/quartzJob/deviceProtocolDetail.js
deleted file mode 100644
index a39e193..0000000
--- a/Code/WCS/WIDESEAWCS_Client/src/extension/quartzJob/deviceProtocolDetail.js
+++ /dev/null
@@ -1,58 +0,0 @@
-
-//姝s鏂囦欢鏄敤鏉ヨ嚜瀹氫箟鎵╁睍涓氬姟浠g爜锛屽彲浠ユ墿灞曚竴浜涜嚜瀹氫箟椤甸潰鎴栬�呴噸鏂伴厤缃敓鎴愮殑浠g爜
-
-let extension = {
-    components: {
-      //鏌ヨ鐣岄潰鎵╁睍缁勪欢
-      gridHeader: '',
-      gridBody: '',
-      gridFooter: '',
-      //鏂板缓銆佺紪杈戝脊鍑烘鎵╁睍缁勪欢
-      modelHeader: '',
-      modelBody: '',
-      modelFooter: ''
-    },
-    tableAction: '', //鎸囧畾鏌愬紶琛ㄧ殑鏉冮檺(杩欓噷濉啓琛ㄥ悕,榛樿涓嶇敤濉啓)
-    buttons: { view: [], box: [], detail: [] }, //鎵╁睍鐨勬寜閽�
-    methods: {
-       //涓嬮潰杩欎簺鏂规硶鍙互淇濈暀涔熷彲浠ュ垹闄�
-      onInit() {  
-      },
-      onInited() {
-        //妗嗘灦鍒濆鍖栭厤缃悗
-        //濡傛灉瑕侀厤缃槑缁嗚〃,鍦ㄦ鏂规硶鎿嶄綔
-        //this.detailOptions.columns.forEach(column=>{ });
-      },
-      searchBefore(param) {
-        //鐣岄潰鏌ヨ鍓�,鍙互缁檖aram.wheres娣诲姞鏌ヨ鍙傛暟
-        //杩斿洖false锛屽垯涓嶄細鎵ц鏌ヨ
-        return true;
-      },
-      searchAfter(result) {
-        //鏌ヨ鍚庯紝result杩斿洖鐨勬煡璇㈡暟鎹�,鍙互鍦ㄦ樉绀哄埌琛ㄦ牸鍓嶅鐞嗚〃鏍肩殑鍊�
-        return true;
-      },
-      addBefore(formData) {
-        //鏂板缓淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛紝鍙互缁欑粰琛ㄥ崟璁剧疆鍊硷紝鑷繁杈撳嚭鐪媐ormData鐨勫��
-        return true;
-      },
-      updateBefore(formData) {
-        //缂栬緫淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛ㄣ�佸垹闄よ鐨処d
-        return true;
-      },
-      rowClick({ row, column, event }) {
-        //鏌ヨ鐣岄潰鐐瑰嚮琛屼簨浠�
-        // this.$refs.table.$refs.table.toggleRowSelection(row); //鍗曞嚮琛屾椂閫変腑褰撳墠琛�;
-      },
-      modelOpenAfter(row) {
-        //鐐瑰嚮缂栬緫銆佹柊寤烘寜閽脊鍑烘鍚庯紝鍙互鍦ㄦ澶勫啓閫昏緫锛屽锛屼粠鍚庡彴鑾峰彇鏁版嵁
-        //(1)鍒ゆ柇鏄紪杈戣繕鏄柊寤烘搷浣滐細 this.currentAction=='Add';
-        //(2)缁欏脊鍑烘璁剧疆榛樿鍊�
-        //(3)this.editFormFields.瀛楁='xxx';
-        //濡傛灉闇�瑕佺粰涓嬫媺妗嗚缃粯璁ゅ�硷紝璇烽亶鍘唗his.editFormOptions鎵惧埌瀛楁閰嶇疆瀵瑰簲data灞炴�х殑key鍊�
-        //鐪嬩笉鎳傚氨鎶婅緭鍑虹湅锛歝onsole.log(this.editFormOptions)
-      }
-    }
-  };
-  export default extension;
-  
\ No newline at end of file
diff --git a/Code/WCS/WIDESEAWCS_Client/src/extension/quartzJob/deviceProtocol.js b/Code/WCS/WIDESEAWCS_Client/src/extension/quartzJob/deviceProtocolDetail.jsx
similarity index 100%
copy from Code/WCS/WIDESEAWCS_Client/src/extension/quartzJob/deviceProtocol.js
copy to Code/WCS/WIDESEAWCS_Client/src/extension/quartzJob/deviceProtocolDetail.jsx
diff --git a/Code/WCS/WIDESEAWCS_Client/src/extension/quartzJob/dispatchInfo.js b/Code/WCS/WIDESEAWCS_Client/src/extension/quartzJob/dispatchInfo.js
deleted file mode 100644
index a39e193..0000000
--- a/Code/WCS/WIDESEAWCS_Client/src/extension/quartzJob/dispatchInfo.js
+++ /dev/null
@@ -1,58 +0,0 @@
-
-//姝s鏂囦欢鏄敤鏉ヨ嚜瀹氫箟鎵╁睍涓氬姟浠g爜锛屽彲浠ユ墿灞曚竴浜涜嚜瀹氫箟椤甸潰鎴栬�呴噸鏂伴厤缃敓鎴愮殑浠g爜
-
-let extension = {
-    components: {
-      //鏌ヨ鐣岄潰鎵╁睍缁勪欢
-      gridHeader: '',
-      gridBody: '',
-      gridFooter: '',
-      //鏂板缓銆佺紪杈戝脊鍑烘鎵╁睍缁勪欢
-      modelHeader: '',
-      modelBody: '',
-      modelFooter: ''
-    },
-    tableAction: '', //鎸囧畾鏌愬紶琛ㄧ殑鏉冮檺(杩欓噷濉啓琛ㄥ悕,榛樿涓嶇敤濉啓)
-    buttons: { view: [], box: [], detail: [] }, //鎵╁睍鐨勬寜閽�
-    methods: {
-       //涓嬮潰杩欎簺鏂规硶鍙互淇濈暀涔熷彲浠ュ垹闄�
-      onInit() {  
-      },
-      onInited() {
-        //妗嗘灦鍒濆鍖栭厤缃悗
-        //濡傛灉瑕侀厤缃槑缁嗚〃,鍦ㄦ鏂规硶鎿嶄綔
-        //this.detailOptions.columns.forEach(column=>{ });
-      },
-      searchBefore(param) {
-        //鐣岄潰鏌ヨ鍓�,鍙互缁檖aram.wheres娣诲姞鏌ヨ鍙傛暟
-        //杩斿洖false锛屽垯涓嶄細鎵ц鏌ヨ
-        return true;
-      },
-      searchAfter(result) {
-        //鏌ヨ鍚庯紝result杩斿洖鐨勬煡璇㈡暟鎹�,鍙互鍦ㄦ樉绀哄埌琛ㄦ牸鍓嶅鐞嗚〃鏍肩殑鍊�
-        return true;
-      },
-      addBefore(formData) {
-        //鏂板缓淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛紝鍙互缁欑粰琛ㄥ崟璁剧疆鍊硷紝鑷繁杈撳嚭鐪媐ormData鐨勫��
-        return true;
-      },
-      updateBefore(formData) {
-        //缂栬緫淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛ㄣ�佸垹闄よ鐨処d
-        return true;
-      },
-      rowClick({ row, column, event }) {
-        //鏌ヨ鐣岄潰鐐瑰嚮琛屼簨浠�
-        // this.$refs.table.$refs.table.toggleRowSelection(row); //鍗曞嚮琛屾椂閫変腑褰撳墠琛�;
-      },
-      modelOpenAfter(row) {
-        //鐐瑰嚮缂栬緫銆佹柊寤烘寜閽脊鍑烘鍚庯紝鍙互鍦ㄦ澶勫啓閫昏緫锛屽锛屼粠鍚庡彴鑾峰彇鏁版嵁
-        //(1)鍒ゆ柇鏄紪杈戣繕鏄柊寤烘搷浣滐細 this.currentAction=='Add';
-        //(2)缁欏脊鍑烘璁剧疆榛樿鍊�
-        //(3)this.editFormFields.瀛楁='xxx';
-        //濡傛灉闇�瑕佺粰涓嬫媺妗嗚缃粯璁ゅ�硷紝璇烽亶鍘唗his.editFormOptions鎵惧埌瀛楁閰嶇疆瀵瑰簲data灞炴�х殑key鍊�
-        //鐪嬩笉鎳傚氨鎶婅緭鍑虹湅锛歝onsole.log(this.editFormOptions)
-      }
-    }
-  };
-  export default extension;
-  
\ No newline at end of file
diff --git a/Code/WCS/WIDESEAWCS_Client/src/extension/quartzJob/deviceProtocol.js b/Code/WCS/WIDESEAWCS_Client/src/extension/quartzJob/dispatchInfo.jsx
similarity index 100%
copy from Code/WCS/WIDESEAWCS_Client/src/extension/quartzJob/deviceProtocol.js
copy to Code/WCS/WIDESEAWCS_Client/src/extension/quartzJob/dispatchInfo.jsx
diff --git a/Code/WCS/WIDESEAWCS_Client/src/extension/system/Sys_Dictionary.js b/Code/WCS/WIDESEAWCS_Client/src/extension/system/Sys_Dictionary.jsx
similarity index 100%
rename from Code/WCS/WIDESEAWCS_Client/src/extension/system/Sys_Dictionary.js
rename to Code/WCS/WIDESEAWCS_Client/src/extension/system/Sys_Dictionary.jsx
diff --git a/Code/WCS/WIDESEAWCS_Client/src/extension/system/Sys_DictionaryList.js b/Code/WCS/WIDESEAWCS_Client/src/extension/system/Sys_DictionaryList.jsx
similarity index 100%
rename from Code/WCS/WIDESEAWCS_Client/src/extension/system/Sys_DictionaryList.js
rename to Code/WCS/WIDESEAWCS_Client/src/extension/system/Sys_DictionaryList.jsx
diff --git a/Code/WCS/WIDESEAWCS_Client/src/extension/system/Sys_Log.js b/Code/WCS/WIDESEAWCS_Client/src/extension/system/Sys_Log.jsx
similarity index 100%
rename from Code/WCS/WIDESEAWCS_Client/src/extension/system/Sys_Log.js
rename to Code/WCS/WIDESEAWCS_Client/src/extension/system/Sys_Log.jsx
diff --git a/Code/WCS/WIDESEAWCS_Client/src/extension/system/Sys_Role.js b/Code/WCS/WIDESEAWCS_Client/src/extension/system/Sys_Role.jsx
similarity index 100%
rename from Code/WCS/WIDESEAWCS_Client/src/extension/system/Sys_Role.js
rename to Code/WCS/WIDESEAWCS_Client/src/extension/system/Sys_Role.jsx
diff --git a/Code/WCS/WIDESEAWCS_Client/src/extension/system/Sys_Role1.js b/Code/WCS/WIDESEAWCS_Client/src/extension/system/Sys_Role1.jsx
similarity index 100%
rename from Code/WCS/WIDESEAWCS_Client/src/extension/system/Sys_Role1.js
rename to Code/WCS/WIDESEAWCS_Client/src/extension/system/Sys_Role1.jsx
diff --git a/Code/WCS/WIDESEAWCS_Client/src/extension/system/Sys_Tenant.js b/Code/WCS/WIDESEAWCS_Client/src/extension/system/Sys_Tenant.jsx
similarity index 100%
rename from Code/WCS/WIDESEAWCS_Client/src/extension/system/Sys_Tenant.js
rename to Code/WCS/WIDESEAWCS_Client/src/extension/system/Sys_Tenant.jsx
diff --git a/Code/WCS/WIDESEAWCS_Client/src/extension/system/Sys_User.js b/Code/WCS/WIDESEAWCS_Client/src/extension/system/Sys_User.jsx
similarity index 100%
rename from Code/WCS/WIDESEAWCS_Client/src/extension/system/Sys_User.js
rename to Code/WCS/WIDESEAWCS_Client/src/extension/system/Sys_User.jsx
diff --git a/Code/WCS/WIDESEAWCS_Client/src/extension/system/system/Sys_Department.js b/Code/WCS/WIDESEAWCS_Client/src/extension/system/system/Sys_Department.jsx
similarity index 100%
rename from Code/WCS/WIDESEAWCS_Client/src/extension/system/system/Sys_Department.js
rename to Code/WCS/WIDESEAWCS_Client/src/extension/system/system/Sys_Department.jsx
diff --git a/Code/WCS/WIDESEAWCS_Client/src/extension/taskinfo/robotTask.js b/Code/WCS/WIDESEAWCS_Client/src/extension/taskinfo/robotTask.jsx
similarity index 100%
rename from Code/WCS/WIDESEAWCS_Client/src/extension/taskinfo/robotTask.js
rename to Code/WCS/WIDESEAWCS_Client/src/extension/taskinfo/robotTask.jsx
diff --git a/Code/WCS/WIDESEAWCS_Client/src/extension/taskinfo/task.js b/Code/WCS/WIDESEAWCS_Client/src/extension/taskinfo/task.jsx
similarity index 100%
rename from Code/WCS/WIDESEAWCS_Client/src/extension/taskinfo/task.js
rename to Code/WCS/WIDESEAWCS_Client/src/extension/taskinfo/task.jsx
diff --git a/Code/WCS/WIDESEAWCS_Client/src/extension/taskinfo/taskHty.js b/Code/WCS/WIDESEAWCS_Client/src/extension/taskinfo/taskHty.js
deleted file mode 100644
index 642855b..0000000
--- a/Code/WCS/WIDESEAWCS_Client/src/extension/taskinfo/taskHty.js
+++ /dev/null
@@ -1,69 +0,0 @@
-// 璇ユ墿灞曟枃浠剁敤浜庝换鍔″巻鍙查〉闈㈢殑涓氬姟鎵╁睍銆�
-// 鏂规硶鐩殑锛氱粺涓�棰勭暀鍒楄〃鏌ヨ銆佷繚瀛樺墠鍚庡拰寮圭獥鎵撳紑鏃剁殑鎵╁睍鍏ュ彛锛屼繚鎸佷笌椤圭洰鍐� task 椤甸潰涓�鑷寸殑鎵╁睍鐐广��
-// 鍙傛暟鍚箟锛氱敱妗嗘灦鎸夌敓鍛藉懆鏈熶紶鍏ワ紝鍖呭惈鏌ヨ鍙傛暟銆佽〃鍗曟暟鎹�佽鏁版嵁绛変笂涓嬫枃銆�
-// 杩斿洖鍊艰鏄庯細杩斿洖 true 浠h〃缁х画榛樿琛屼负锛岃繑鍥� false 浠h〃涓柇榛樿琛屼负銆�
-// 寮傚父澶勭悊璇存槑锛氬綋鍓嶆湭寮曞叆澶栭儴璋冪敤锛涜嫢鍚庣画鏂板鎺ュ彛璋冪敤锛岄渶鍦ㄦ柟娉曞唴琛ュ厖 try-catch 骞惰褰曞叧閿笟鍔″弬鏁般��
-
-let extension = {
-  components: {
-    gridHeader: "",
-    gridBody: "",
-    gridFooter: "",
-    modelHeader: "",
-    modelBody: "",
-    modelFooter: "",
-  },
-  tableAction: "",
-  buttons: { view: [], box: [], detail: [] },
-  methods: {
-    // 鏂规硶鐩殑锛氶〉闈㈠垵濮嬪寲鏃舵墽琛岃嚜瀹氫箟閫昏緫銆�
-    // 鍙傛暟锛氭棤銆�
-    // 杩斿洖鍊硷細鏃犮��
-    onInit() {},
-
-    // 鏂规硶鐩殑锛氶〉闈㈠垵濮嬪寲瀹屾垚鍚庢墽琛岃嚜瀹氫箟閫昏緫銆�
-    // 鍙傛暟锛氭棤銆�
-    // 杩斿洖鍊硷細鏃犮��
-    onInited() {},
-
-    // 鏂规硶鐩殑锛氭煡璇㈠墠澶勭悊鏌ヨ鏉′欢銆�
-    // 鍙傛暟锛歱aram 鏌ヨ鍙傛暟瀵硅薄銆�
-    // 杩斿洖鍊硷細true 缁х画鏌ヨ锛宖alse 缁堟鏌ヨ銆�
-    searchBefore(param) {
-      return true;
-    },
-
-    // 鏂规硶鐩殑锛氭煡璇㈠悗澶勭悊杩斿洖缁撴灉銆�
-    // 鍙傛暟锛歳esult 鍚庣杩斿洖鏁版嵁銆�
-    // 杩斿洖鍊硷細true 缁х画娓叉煋锛宖alse 缁堟鍚庣画澶勭悊銆�
-    searchAfter(result) {
-      return true;
-    },
-
-    // 鏂规硶鐩殑锛氭柊澧炲墠鏍¢獙鎴栬ˉ鍏呮彁浜ゅ瓧娈点��
-    // 鍙傛暟锛歠ormData 琛ㄥ崟鎻愪氦瀵硅薄銆�
-    // 杩斿洖鍊硷細true 缁х画鎻愪氦锛宖alse 缁堟鎻愪氦銆�
-    addBefore(formData) {
-      return true;
-    },
-
-    // 鏂规硶鐩殑锛氱紪杈戝墠鏍¢獙鎴栬ˉ鍏呮彁浜ゅ瓧娈点��
-    // 鍙傛暟锛歠ormData 琛ㄥ崟鎻愪氦瀵硅薄銆�
-    // 杩斿洖鍊硷細true 缁х画鎻愪氦锛宖alse 缁堟鎻愪氦銆�
-    updateBefore(formData) {
-      return true;
-    },
-
-    // 鏂规硶鐩殑锛氱偣鍑昏鏃舵墿灞曞鐞嗐��
-    // 鍙傛暟锛歳ow 琛屾暟鎹紝column 鍒楅厤缃紝event 鍘熷浜嬩欢銆�
-    // 杩斿洖鍊硷細鏃犮��
-    rowClick({ row, column, event }) {},
-
-    // 鏂规硶鐩殑锛氱紪杈戝脊绐楁墦寮�鍚庢墽琛屾墿灞曢�昏緫銆�
-    // 鍙傛暟锛歳ow 褰撳墠琛屾暟鎹��
-    // 杩斿洖鍊硷細鏃犮��
-    modelOpenAfter(row) {},
-  },
-};
-
-export default extension;
diff --git a/Code/WCS/WIDESEAWCS_Client/src/extension/taskinfo/robotTask.js b/Code/WCS/WIDESEAWCS_Client/src/extension/taskinfo/taskHty.jsx
similarity index 100%
copy from Code/WCS/WIDESEAWCS_Client/src/extension/taskinfo/robotTask.js
copy to Code/WCS/WIDESEAWCS_Client/src/extension/taskinfo/taskHty.jsx
diff --git a/Code/WCS/WIDESEAWCS_Client/src/views/basicinfo/router.vue b/Code/WCS/WIDESEAWCS_Client/src/views/basicinfo/router.vue
index 319e35e..dc31ec5 100644
--- a/Code/WCS/WIDESEAWCS_Client/src/views/basicinfo/router.vue
+++ b/Code/WCS/WIDESEAWCS_Client/src/views/basicinfo/router.vue
@@ -14,7 +14,7 @@
   </view-grid>
 </template>
     <script>
-import extend from "@/extension/basicinfo/router.js";
+import extend from "@/extension/basicinfo/router.jsx";
 import { ref, defineComponent } from "vue";
 export default defineComponent({
   setup() {
diff --git a/Code/WCS/WIDESEAWCS_Client/src/views/quartzJob/deviceInfo.vue b/Code/WCS/WIDESEAWCS_Client/src/views/quartzJob/deviceInfo.vue
index 0d044e9..35acdd8 100644
--- a/Code/WCS/WIDESEAWCS_Client/src/views/quartzJob/deviceInfo.vue
+++ b/Code/WCS/WIDESEAWCS_Client/src/views/quartzJob/deviceInfo.vue
@@ -14,7 +14,7 @@
   </view-grid>
 </template>
 <script>
-import extend from "@/extension/quartzJob/deviceInfo.js";
+import extend from "@/extension/quartzJob/deviceInfo.jsx";
 import { ref, defineComponent } from "vue";
 export default defineComponent({
   setup() {
diff --git a/Code/WCS/WIDESEAWCS_Client/src/views/quartzJob/deviceProtocol.vue b/Code/WCS/WIDESEAWCS_Client/src/views/quartzJob/deviceProtocol.vue
index 6d3ea40..f9726fc 100644
--- a/Code/WCS/WIDESEAWCS_Client/src/views/quartzJob/deviceProtocol.vue
+++ b/Code/WCS/WIDESEAWCS_Client/src/views/quartzJob/deviceProtocol.vue
@@ -14,7 +14,7 @@
   </view-grid>
 </template>
   <script>
-import extend from "@/extension/quartzJob/deviceProtocol.js";
+import extend from "@/extension/quartzJob/deviceProtocol.jsx";
 import { ref, defineComponent } from "vue";
 export default defineComponent({
   setup() {
diff --git a/Code/WCS/WIDESEAWCS_Client/src/views/quartzJob/deviceProtocolDetail.vue b/Code/WCS/WIDESEAWCS_Client/src/views/quartzJob/deviceProtocolDetail.vue
index cff0406..30955c8 100644
--- a/Code/WCS/WIDESEAWCS_Client/src/views/quartzJob/deviceProtocolDetail.vue
+++ b/Code/WCS/WIDESEAWCS_Client/src/views/quartzJob/deviceProtocolDetail.vue
@@ -14,7 +14,7 @@
   </view-grid>
 </template>
   <script>
-import extend from "@/extension/quartzJob/deviceProtocolDetail.js";
+import extend from "@/extension/quartzJob/deviceProtocolDetail.jsx";
 import { ref, defineComponent } from "vue";
 export default defineComponent({
   setup() {
diff --git a/Code/WCS/WIDESEAWCS_Client/src/views/quartzJob/dispatchInfo.vue b/Code/WCS/WIDESEAWCS_Client/src/views/quartzJob/dispatchInfo.vue
index 094887e..3832761 100644
--- a/Code/WCS/WIDESEAWCS_Client/src/views/quartzJob/dispatchInfo.vue
+++ b/Code/WCS/WIDESEAWCS_Client/src/views/quartzJob/dispatchInfo.vue
@@ -14,7 +14,7 @@
   </view-grid>
 </template>
   <script>
-import extend from "@/extension/quartzJob/dispatchInfo.js";
+import extend from "@/extension/quartzJob/dispatchInfo.jsx";
 import { ref, defineComponent } from "vue";
 export default defineComponent({
   setup() {
diff --git a/Code/WCS/WIDESEAWCS_Client/src/views/system/Sys_Dictionary.vue b/Code/WCS/WIDESEAWCS_Client/src/views/system/Sys_Dictionary.vue
index 5ceafd6..95a84bd 100644
--- a/Code/WCS/WIDESEAWCS_Client/src/views/system/Sys_Dictionary.vue
+++ b/Code/WCS/WIDESEAWCS_Client/src/views/system/Sys_Dictionary.vue
@@ -19,7 +19,7 @@
   </view-grid>
 </template>
 <script>
-import extend from "@/extension/system/Sys_Dictionary.js";
+import extend from "@/extension/system/Sys_Dictionary.jsx";
 import { ref, defineComponent } from "vue";
 export default defineComponent({
   setup() {
diff --git a/Code/WCS/WIDESEAWCS_Client/src/views/system/Sys_DictionaryList.vue b/Code/WCS/WIDESEAWCS_Client/src/views/system/Sys_DictionaryList.vue
index 02427fb..1a91674 100644
--- a/Code/WCS/WIDESEAWCS_Client/src/views/system/Sys_DictionaryList.vue
+++ b/Code/WCS/WIDESEAWCS_Client/src/views/system/Sys_DictionaryList.vue
@@ -19,7 +19,7 @@
 </template>
 
 <script>
-    import extend from "@/extension/system/Sys_DictionaryList.js";
+    import extend from "@/extension/system/Sys_DictionaryList.jsx";
     var vueParam = {
         data() {
             return {
diff --git a/Code/WCS/WIDESEAWCS_Client/src/views/system/Sys_Log.vue b/Code/WCS/WIDESEAWCS_Client/src/views/system/Sys_Log.vue
index 84602fd..03f4341 100644
--- a/Code/WCS/WIDESEAWCS_Client/src/views/system/Sys_Log.vue
+++ b/Code/WCS/WIDESEAWCS_Client/src/views/system/Sys_Log.vue
@@ -19,7 +19,7 @@
   </view-grid>
 </template>
 <script>
-import extend from "@/extension/system/Sys_Log.js";
+import extend from "@/extension/system/Sys_Log.jsx";
 import { ref, defineComponent } from "vue";
 export default defineComponent({
   setup() {
diff --git a/Code/WCS/WIDESEAWCS_Client/src/views/system/Sys_Role.vue b/Code/WCS/WIDESEAWCS_Client/src/views/system/Sys_Role.vue
index 538b0a7..31a8416 100644
--- a/Code/WCS/WIDESEAWCS_Client/src/views/system/Sys_Role.vue
+++ b/Code/WCS/WIDESEAWCS_Client/src/views/system/Sys_Role.vue
@@ -19,7 +19,7 @@
   </view-grid>
 </template>
 <script>
-import extend from "@/extension/system/Sys_Role.js";
+import extend from "@/extension/system/Sys_Role.jsx";
 import { ref, defineComponent } from "vue";
 export default defineComponent({
   setup() {
diff --git a/Code/WCS/WIDESEAWCS_Client/src/views/system/Sys_Role1.vue b/Code/WCS/WIDESEAWCS_Client/src/views/system/Sys_Role1.vue
index 19ed48a..9cccb3b 100644
--- a/Code/WCS/WIDESEAWCS_Client/src/views/system/Sys_Role1.vue
+++ b/Code/WCS/WIDESEAWCS_Client/src/views/system/Sys_Role1.vue
@@ -17,7 +17,7 @@
     </view-grid>
 </template>
 <script>
-    import extend from "@/extension/system/Sys_Role1.js";
+    import extend from "@/extension/system/Sys_Role1.jsx";
     import { ref, defineComponent } from "vue";
     export default defineComponent({
         setup() {
diff --git a/Code/WCS/WIDESEAWCS_Client/src/views/system/Sys_Tenant.vue b/Code/WCS/WIDESEAWCS_Client/src/views/system/Sys_Tenant.vue
index 93d3e4f..89697e0 100644
--- a/Code/WCS/WIDESEAWCS_Client/src/views/system/Sys_Tenant.vue
+++ b/Code/WCS/WIDESEAWCS_Client/src/views/system/Sys_Tenant.vue
@@ -13,7 +13,7 @@
   </view-grid>
 </template>
 <script>
-import extend from "@/extension/system/Sys_Tenant.js";
+import extend from "@/extension/system/Sys_Tenant.jsx";
 import { ref, defineComponent } from "vue";
 
 export default defineComponent({
diff --git a/Code/WCS/WIDESEAWCS_Client/src/views/system/Sys_User.vue b/Code/WCS/WIDESEAWCS_Client/src/views/system/Sys_User.vue
index 21530cd..6fe5a2c 100644
--- a/Code/WCS/WIDESEAWCS_Client/src/views/system/Sys_User.vue
+++ b/Code/WCS/WIDESEAWCS_Client/src/views/system/Sys_User.vue
@@ -14,7 +14,7 @@
   </view-grid>
 </template>
 <script>
-import extend from "@/extension/system/Sys_User.js";
+import extend from "@/extension/system/Sys_User.jsx";
 import { ref, defineComponent } from "vue";
 export default defineComponent({
   setup() {
diff --git a/Code/WCS/WIDESEAWCS_Client/src/views/system/system/Sys_Department.vue b/Code/WCS/WIDESEAWCS_Client/src/views/system/system/Sys_Department.vue
index 0ee20af..0266ca6 100644
--- a/Code/WCS/WIDESEAWCS_Client/src/views/system/system/Sys_Department.vue
+++ b/Code/WCS/WIDESEAWCS_Client/src/views/system/system/Sys_Department.vue
@@ -17,7 +17,7 @@
     </view-grid>
 </template>
 <script>
-    import extend from "@/extension/system/system/Sys_Department.js";
+    import extend from "@/extension/system/system/Sys_Department.jsx";
     import { ref, defineComponent } from "vue";
     export default defineComponent({
         setup() {
diff --git a/Code/WCS/WIDESEAWCS_Client/src/views/taskinfo/robotTask.vue b/Code/WCS/WIDESEAWCS_Client/src/views/taskinfo/robotTask.vue
index 4d39a38..8045fb4 100644
--- a/Code/WCS/WIDESEAWCS_Client/src/views/taskinfo/robotTask.vue
+++ b/Code/WCS/WIDESEAWCS_Client/src/views/taskinfo/robotTask.vue
@@ -14,7 +14,7 @@
 </template>
 
 <script>
-import extend from "@/extension/taskinfo/robotTask.js";
+import extend from "@/extension/taskinfo/robotTask.jsx";
 import { ref, defineComponent } from "vue";
 
 export default defineComponent({
diff --git a/Code/WCS/WIDESEAWCS_Client/src/views/taskinfo/task.vue b/Code/WCS/WIDESEAWCS_Client/src/views/taskinfo/task.vue
index 336c440..57fe13f 100644
--- a/Code/WCS/WIDESEAWCS_Client/src/views/taskinfo/task.vue
+++ b/Code/WCS/WIDESEAWCS_Client/src/views/taskinfo/task.vue
@@ -14,7 +14,7 @@
   </view-grid>
 </template>
   <script>
-import extend from "@/extension/taskinfo/task.js";
+import extend from "@/extension/taskinfo/task.jsx";
 import { ref, defineComponent } from "vue";
 export default defineComponent({
   setup() {
diff --git a/Code/WCS/WIDESEAWCS_Client/src/views/taskinfo/taskHty.vue b/Code/WCS/WIDESEAWCS_Client/src/views/taskinfo/taskHty.vue
index 1211cf3..a0bf2a6 100644
--- a/Code/WCS/WIDESEAWCS_Client/src/views/taskinfo/taskHty.vue
+++ b/Code/WCS/WIDESEAWCS_Client/src/views/taskinfo/taskHty.vue
@@ -13,7 +13,7 @@
   </view-grid>
 </template>
 <script>
-import extend from "@/extension/taskinfo/taskHty.js";
+import extend from "@/extension/taskinfo/taskHty.jsx";
 import { ref, defineComponent } from "vue";
 
 export default defineComponent({
diff --git a/Code/WCS/WIDESEAWCS_Client/vite.config.js b/Code/WCS/WIDESEAWCS_Client/vite.config.mjs
similarity index 91%
rename from Code/WCS/WIDESEAWCS_Client/vite.config.js
rename to Code/WCS/WIDESEAWCS_Client/vite.config.mjs
index 584cc4c..11364ec 100644
--- a/Code/WCS/WIDESEAWCS_Client/vite.config.js
+++ b/Code/WCS/WIDESEAWCS_Client/vite.config.mjs
@@ -1,11 +1,12 @@
 import { defineConfig } from 'vite'
-import vue from '@vitejs/plugin-vue' 
+import vue from '@vitejs/plugin-vue'
+import vueJsx from '@vitejs/plugin-vue-jsx'
 import { fileURLToPath, URL } from 'node:url'
 
 const __dirname = fileURLToPath(new URL('.', import.meta.url))
 
 export default defineConfig({
-  plugins: [vue()],
+  plugins: [vue(), vueJsx()],
   
   server: {
     host: '0.0.0.0',
diff --git a/Code/WMS/WIDESEA_WMSClient/package.json b/Code/WMS/WIDESEA_WMSClient/package.json
index 59391cb..ed3eeec 100644
--- a/Code/WMS/WIDESEA_WMSClient/package.json
+++ b/Code/WMS/WIDESEA_WMSClient/package.json
@@ -31,6 +31,7 @@
   "devDependencies": {
     "@babel/plugin-syntax-dynamic-import": "^7.8.3",
     "@vitejs/plugin-vue": "^4.0.0",
+    "@vitejs/plugin-vue-jsx": "^5.1.5",
     "@vue/compiler-sfc": "^3.0.0",
     "@vue/test-utils": "^2.0.0-0",
     "chai": "^4.1.2",
diff --git a/Code/WMS/WIDESEA_WMSClient/pnpm-lock.yaml b/Code/WMS/WIDESEA_WMSClient/pnpm-lock.yaml
index cea0b3b..ea48169 100644
--- a/Code/WMS/WIDESEA_WMSClient/pnpm-lock.yaml
+++ b/Code/WMS/WIDESEA_WMSClient/pnpm-lock.yaml
@@ -66,6 +66,9 @@
       '@vitejs/plugin-vue':
         specifier: ^4.0.0
         version: 4.6.2(vite@5.4.21(@types/node@25.5.0)(less@4.6.4)(sass@1.98.0)(stylus@0.54.8)(terser@5.46.1))(vue@3.5.30)
+      '@vitejs/plugin-vue-jsx':
+        specifier: ^5.1.5
+        version: 5.1.5(vite@5.4.21(@types/node@25.5.0)(less@4.6.4)(sass@1.98.0)(stylus@0.54.8)(terser@5.46.1))(vue@3.5.30)
       '@vue/compiler-sfc':
         specifier: ^3.0.0
         version: 3.5.30
@@ -115,12 +118,26 @@
     resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==}
     engines: {node: '>=6.9.0'}
 
+  '@babel/helper-annotate-as-pure@7.27.3':
+    resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==}
+    engines: {node: '>=6.9.0'}
+
   '@babel/helper-compilation-targets@7.28.6':
     resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==}
     engines: {node: '>=6.9.0'}
 
+  '@babel/helper-create-class-features-plugin@7.28.6':
+    resolution: {integrity: sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+
   '@babel/helper-globals@7.28.0':
     resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-member-expression-to-functions@7.28.5':
+    resolution: {integrity: sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==}
     engines: {node: '>=6.9.0'}
 
   '@babel/helper-module-imports@7.28.6':
@@ -133,8 +150,22 @@
     peerDependencies:
       '@babel/core': ^7.0.0
 
+  '@babel/helper-optimise-call-expression@7.27.1':
+    resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==}
+    engines: {node: '>=6.9.0'}
+
   '@babel/helper-plugin-utils@7.28.6':
     resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/helper-replace-supers@7.28.6':
+    resolution: {integrity: sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+
+  '@babel/helper-skip-transparent-expression-wrappers@7.27.1':
+    resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==}
     engines: {node: '>=6.9.0'}
 
   '@babel/helper-string-parser@7.27.1':
@@ -160,6 +191,24 @@
 
   '@babel/plugin-syntax-dynamic-import@7.8.3':
     resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-syntax-jsx@7.28.6':
+    resolution: {integrity: sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-syntax-typescript@7.28.6':
+    resolution: {integrity: sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/plugin-transform-typescript@7.28.6':
+    resolution: {integrity: sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==}
+    engines: {node: '>=6.9.0'}
     peerDependencies:
       '@babel/core': ^7.0.0-0
 
@@ -452,6 +501,9 @@
     resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
     engines: {node: '>=14'}
 
+  '@rolldown/pluginutils@1.0.0-rc.15':
+    resolution: {integrity: sha512-UromN0peaE53IaBRe9W7CjrZgXl90fqGpK+mIZbA3qSTeYqg3pqpROBdIPvOG3F5ereDHNwoHBI2e50n1BDr1g==}
+
   '@rollup/rollup-android-arm-eabi@4.60.0':
     resolution: {integrity: sha512-WOhNW9K8bR3kf4zLxbfg6Pxu2ybOUbB2AjMDHSQx86LIF4rH4Ft7vmMwNt0loO0eonglSNy4cpD3MKXXKQu0/A==}
     cpu: [arm]
@@ -617,12 +669,35 @@
   '@types/web-bluetooth@0.0.20':
     resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==}
 
+  '@vitejs/plugin-vue-jsx@5.1.5':
+    resolution: {integrity: sha512-jIAsvHOEtWpslLOI2MeElGFxH7M8pM83BU/Tor4RLyiwH0FM4nUW3xdvbw20EeU9wc5IspQwMq225K3CMnJEpA==}
+    engines: {node: ^20.19.0 || >=22.12.0}
+    peerDependencies:
+      vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0
+      vue: ^3.0.0
+
   '@vitejs/plugin-vue@4.6.2':
     resolution: {integrity: sha512-kqf7SGFoG+80aZG6Pf+gsZIVvGSCKE98JbiWqcCV9cThtg91Jav0yvYFC9Zb+jKetNGF6ZKeoaxgZfND21fWKw==}
     engines: {node: ^14.18.0 || >=16.0.0}
     peerDependencies:
       vite: ^4.0.0 || ^5.0.0
       vue: ^3.2.25
+
+  '@vue/babel-helper-vue-transform-on@2.0.1':
+    resolution: {integrity: sha512-uZ66EaFbnnZSYqYEyplWvn46GhZ1KuYSThdT68p+am7MgBNbQ3hphTL9L+xSIsWkdktwhPYLwPgVWqo96jDdRA==}
+
+  '@vue/babel-plugin-jsx@2.0.1':
+    resolution: {integrity: sha512-a8CaLQjD/s4PVdhrLD/zT574ZNPnZBOY+IhdtKWRB4HRZ0I2tXBi5ne7d9eCfaYwp5gU5+4KIyFTV1W1YL9xZA==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    peerDependenciesMeta:
+      '@babel/core':
+        optional: true
+
+  '@vue/babel-plugin-resolve-type@2.0.1':
+    resolution: {integrity: sha512-ybwgIuRGRRBhOU37GImDoWQoz+TlSqap65qVI6iwg/J7FfLTLmMf97TS7xQH9I7Qtr/gp161kYVdhr1ZMraSYQ==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
 
   '@vue/compiler-core@3.5.30':
     resolution: {integrity: sha512-s3DfdZkcu/qExZ+td75015ljzHc6vE+30cFMGRPROYjqkroYI5NV2X1yAMX9UeyBNWB9MxCfPcsjpLS11nzkkw==}
@@ -2087,6 +2162,10 @@
       '@jridgewell/trace-mapping': 0.3.31
       jsesc: 3.1.0
 
+  '@babel/helper-annotate-as-pure@7.27.3':
+    dependencies:
+      '@babel/types': 7.29.0
+
   '@babel/helper-compilation-targets@7.28.6':
     dependencies:
       '@babel/compat-data': 7.29.0
@@ -2095,7 +2174,27 @@
       lru-cache: 5.1.1
       semver: 6.3.1
 
+  '@babel/helper-create-class-features-plugin@7.28.6(@babel/core@7.29.0)':
+    dependencies:
+      '@babel/core': 7.29.0
+      '@babel/helper-annotate-as-pure': 7.27.3
+      '@babel/helper-member-expression-to-functions': 7.28.5
+      '@babel/helper-optimise-call-expression': 7.27.1
+      '@babel/helper-replace-supers': 7.28.6(@babel/core@7.29.0)
+      '@babel/helper-skip-transparent-expression-wrappers': 7.27.1
+      '@babel/traverse': 7.29.0
+      semver: 6.3.1
+    transitivePeerDependencies:
+      - supports-color
+
   '@babel/helper-globals@7.28.0': {}
+
+  '@babel/helper-member-expression-to-functions@7.28.5':
+    dependencies:
+      '@babel/traverse': 7.29.0
+      '@babel/types': 7.29.0
+    transitivePeerDependencies:
+      - supports-color
 
   '@babel/helper-module-imports@7.28.6':
     dependencies:
@@ -2113,7 +2212,27 @@
     transitivePeerDependencies:
       - supports-color
 
+  '@babel/helper-optimise-call-expression@7.27.1':
+    dependencies:
+      '@babel/types': 7.29.0
+
   '@babel/helper-plugin-utils@7.28.6': {}
+
+  '@babel/helper-replace-supers@7.28.6(@babel/core@7.29.0)':
+    dependencies:
+      '@babel/core': 7.29.0
+      '@babel/helper-member-expression-to-functions': 7.28.5
+      '@babel/helper-optimise-call-expression': 7.27.1
+      '@babel/traverse': 7.29.0
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/helper-skip-transparent-expression-wrappers@7.27.1':
+    dependencies:
+      '@babel/traverse': 7.29.0
+      '@babel/types': 7.29.0
+    transitivePeerDependencies:
+      - supports-color
 
   '@babel/helper-string-parser@7.27.1': {}
 
@@ -2134,6 +2253,27 @@
     dependencies:
       '@babel/core': 7.29.0
       '@babel/helper-plugin-utils': 7.28.6
+
+  '@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0)':
+    dependencies:
+      '@babel/core': 7.29.0
+      '@babel/helper-plugin-utils': 7.28.6
+
+  '@babel/plugin-syntax-typescript@7.28.6(@babel/core@7.29.0)':
+    dependencies:
+      '@babel/core': 7.29.0
+      '@babel/helper-plugin-utils': 7.28.6
+
+  '@babel/plugin-transform-typescript@7.28.6(@babel/core@7.29.0)':
+    dependencies:
+      '@babel/core': 7.29.0
+      '@babel/helper-annotate-as-pure': 7.27.3
+      '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.29.0)
+      '@babel/helper-plugin-utils': 7.28.6
+      '@babel/helper-skip-transparent-expression-wrappers': 7.27.1
+      '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0)
+    transitivePeerDependencies:
+      - supports-color
 
   '@babel/template@7.28.6':
     dependencies:
@@ -2355,6 +2495,8 @@
   '@pkgjs/parseargs@0.11.0':
     optional: true
 
+  '@rolldown/pluginutils@1.0.0-rc.15': {}
+
   '@rollup/rollup-android-arm-eabi@4.60.0':
     optional: true
 
@@ -2458,11 +2600,52 @@
 
   '@types/web-bluetooth@0.0.20': {}
 
+  '@vitejs/plugin-vue-jsx@5.1.5(vite@5.4.21(@types/node@25.5.0)(less@4.6.4)(sass@1.98.0)(stylus@0.54.8)(terser@5.46.1))(vue@3.5.30)':
+    dependencies:
+      '@babel/core': 7.29.0
+      '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0)
+      '@babel/plugin-transform-typescript': 7.28.6(@babel/core@7.29.0)
+      '@rolldown/pluginutils': 1.0.0-rc.15
+      '@vue/babel-plugin-jsx': 2.0.1(@babel/core@7.29.0)
+      vite: 5.4.21(@types/node@25.5.0)(less@4.6.4)(sass@1.98.0)(stylus@0.54.8)(terser@5.46.1)
+      vue: 3.5.30
+    transitivePeerDependencies:
+      - supports-color
+
   '@vitejs/plugin-vue@4.6.2(vite@5.4.21(@types/node@25.5.0)(less@4.6.4)(sass@1.98.0)(stylus@0.54.8)(terser@5.46.1))(vue@3.5.30)':
     dependencies:
       vite: 5.4.21(@types/node@25.5.0)(less@4.6.4)(sass@1.98.0)(stylus@0.54.8)(terser@5.46.1)
       vue: 3.5.30
 
+  '@vue/babel-helper-vue-transform-on@2.0.1': {}
+
+  '@vue/babel-plugin-jsx@2.0.1(@babel/core@7.29.0)':
+    dependencies:
+      '@babel/helper-module-imports': 7.28.6
+      '@babel/helper-plugin-utils': 7.28.6
+      '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0)
+      '@babel/template': 7.28.6
+      '@babel/traverse': 7.29.0
+      '@babel/types': 7.29.0
+      '@vue/babel-helper-vue-transform-on': 2.0.1
+      '@vue/babel-plugin-resolve-type': 2.0.1(@babel/core@7.29.0)
+      '@vue/shared': 3.5.30
+    optionalDependencies:
+      '@babel/core': 7.29.0
+    transitivePeerDependencies:
+      - supports-color
+
+  '@vue/babel-plugin-resolve-type@2.0.1(@babel/core@7.29.0)':
+    dependencies:
+      '@babel/code-frame': 7.29.0
+      '@babel/core': 7.29.0
+      '@babel/helper-module-imports': 7.28.6
+      '@babel/helper-plugin-utils': 7.28.6
+      '@babel/parser': 7.29.2
+      '@vue/compiler-sfc': 3.5.30
+    transitivePeerDependencies:
+      - supports-color
+
   '@vue/compiler-core@3.5.30':
     dependencies:
       '@babel/parser': 7.29.2
diff --git a/Code/WMS/WIDESEA_WMSClient/src/api/mes.js b/Code/WMS/WIDESEA_WMSClient/src/api/mes.js
new file mode 100644
index 0000000..8a97663
--- /dev/null
+++ b/Code/WMS/WIDESEA_WMSClient/src/api/mes.js
@@ -0,0 +1,73 @@
+/**
+ * MES鎺ュ彛API妯″潡
+ * 鎻愪緵涓嶮ES绯荤粺鐨勪氦浜掓帴鍙o紝鍖呮嫭鎵樼洏杩涘嚭绔欍�佺數鑺粦瀹氳В缁戙�丯G涓婃姤绛夊姛鑳�
+ */
+import http from '@/api/http.js';
+
+const baseURL = '/api';
+
+// 搴撳瓨淇℃伅鐩稿叧MES鎺ュ彛
+export const stockInfoMesApi = {
+  /**
+   * 鎵樼洏杩涚珯
+   * @param {Object} data - 璇锋眰鏁版嵁 { palletCode, stockId }
+   * @returns {Promise}
+   */
+  inboundInContainer(data) {
+    return http.post(`${baseURL}/StockInfo/inboundInContainer`, data, false, {
+      headers: { 'Content-Type': 'application/json' }
+    });
+  },
+
+  /**
+   * 鎵樼洏鍑虹珯
+   * @param {Object} data - 璇锋眰鏁版嵁 { palletCode, stockId, paramList }
+   * @returns {Promise}
+   */
+  outboundInContainer(data) {
+    return http.post(`${baseURL}/StockInfo/outboundInContainer`, data, false, {
+      headers: { 'Content-Type': 'application/json' }
+    });
+  }
+};
+
+// 搴撳瓨鏄庣粏鐩稿叧MES鎺ュ彛
+export const stockDetailMesApi = {
+  /**
+   * 鎵樼洏鐢佃姱缁戝畾
+   * @param {Object} data - 璇锋眰鏁版嵁 { palletCode, sfcList, location, operationType }
+   * @returns {Promise}
+   */
+  bindContainer(data) {
+    return http.post(`${baseURL}/StockInfoDetail/bindContainer`, data, false, {
+      headers: { 'Content-Type': 'application/json' }
+    });
+  },
+
+  /**
+   * 鎵樼洏鐢佃姱瑙g粦
+   * @param {Object} data - 璇锋眰鏁版嵁 { palletCode, sfcList }
+   * @returns {Promise}
+   */
+  unbindContainer(data) {
+    return http.post(`${baseURL}/StockInfoDetail/unbindContainer`, data, false, {
+      headers: { 'Content-Type': 'application/json' }
+    });
+  },
+
+  /**
+   * 鎵樼洏NG鐢佃姱涓婃姤
+   * @param {Object} data - 璇锋眰鏁版嵁 { palletCode, ngSfcList }
+   * @returns {Promise}
+   */
+  containerNgReport(data) {
+    return http.post(`${baseURL}/StockInfoDetail/containerNgReport`, data, false, {
+      headers: { 'Content-Type': 'application/json' }
+    });
+  }
+};
+
+export default {
+  stockInfo: stockInfoMesApi,
+  stockDetail: stockDetailMesApi
+};
diff --git a/Code/WMS/WIDESEA_WMSClient/src/components/MesConfirmDialog.vue b/Code/WMS/WIDESEA_WMSClient/src/components/MesConfirmDialog.vue
new file mode 100644
index 0000000..50dfb0e
--- /dev/null
+++ b/Code/WMS/WIDESEA_WMSClient/src/components/MesConfirmDialog.vue
@@ -0,0 +1,273 @@
+<template>
+  <el-dialog
+    v-model="visible"
+    :title="dialogTitle"
+    width="500px"
+    :close-on-click-modal="false"
+    @close="handleClose"
+  >
+    <div class="mes-confirm-content">
+      <p class="operation-text">{{ operationText }}</p>
+
+      <div class="info-section">
+        <div class="info-row" v-for="(item, index) in displayInfo" :key="index">
+          <span class="info-label">{{ item.label }}:</span>
+          <span class="info-value">{{ item.value }}</span>
+        </div>
+      </div>
+
+      <div v-if="errorMessage" class="error-message">
+        <el-icon><Warning /></el-icon>
+        <span>{{ errorMessage }}</span>
+      </div>
+    </div>
+
+    <template #footer>
+      <span class="dialog-footer">
+        <el-button @click="handleClose">鍙栨秷</el-button>
+        <el-button
+          type="primary"
+          :loading="loading"
+          @click="handleConfirm"
+        >
+          纭鎵ц
+        </el-button>
+      </span>
+    </template>
+  </el-dialog>
+</template>
+
+<script>
+import { defineComponent, ref, computed, watch } from 'vue';
+import { Warning } from '@element-plus/icons-vue';
+
+/**
+ * MES纭瀵硅瘽妗嗙粍浠�
+ * 鐢ㄤ簬鍦ㄦ墽琛孧ES鎿嶄綔锛堣繘绔�/鍑虹珯/缁戝畾/瑙g粦/NG涓婃姤锛夊墠鏄剧ず纭淇℃伅
+ */
+export default defineComponent({
+  name: 'MesConfirmDialog',
+
+  components: {
+    Warning
+  },
+
+  props: {
+    modelValue: {
+      type: Boolean,
+      default: false
+    },
+    /**
+     * 鎿嶄綔绫诲瀷: inbound(杩涚珯) | outbound(鍑虹珯) | bind(缁戝畾) | unbind(瑙g粦) | ngReport(NG涓婃姤)
+     */
+    operationType: {
+      type: String,
+      required: true
+    },
+    /**
+     * 鎵樼洏鐮�
+     */
+    palletCode: {
+      type: String,
+      required: true
+    },
+    /**
+     * 搴撳瓨淇℃伅瀵硅薄锛堢敤浜庤繘绔�/鍑虹珯鎿嶄綔锛�
+     */
+    stockInfo: {
+      type: Object,
+      default: null
+    },
+    /**
+     * 搴撳瓨鏄庣粏淇℃伅瀵硅薄锛堢敤浜庣粦瀹�/瑙g粦/NG涓婃姤鎿嶄綔锛�
+     */
+    detailInfo: {
+      type: Object,
+      default: null
+    }
+  },
+
+  emits: ['update:modelValue', 'confirm'],
+
+  setup(props, { emit }) {
+    const visible = ref(false);
+    const loading = ref(false);
+    const errorMessage = ref('');
+
+    // 鐩戝惉modelValue鍙樺寲锛屽悓姝ュ埌visible
+    watch(
+      () => props.modelValue,
+      (newVal) => {
+        visible.value = newVal;
+        // 瀵硅瘽妗嗘墦寮�鏃堕噸缃敊璇俊鎭�
+        if (newVal) {
+          errorMessage.value = '';
+        }
+      },
+      { immediate: true }
+    );
+
+    // 鐩戝惉visible鍙樺寲锛屽悓姝ュ埌modelValue
+    watch(visible, (newVal) => {
+      emit('update:modelValue', newVal);
+    });
+
+    /**
+     * 鎿嶄綔绫诲瀷閰嶇疆鏄犲皠
+     */
+    const operationConfig = {
+      inbound: { title: '鎵樼洏杩涚珯', text: '鎮ㄥ嵆灏嗘墽琛屾墭鐩樿繘绔欐搷浣�' },
+      outbound: { title: '鎵樼洏鍑虹珯', text: '鎮ㄥ嵆灏嗘墽琛屾墭鐩樺嚭绔欐搷浣�' },
+      bind: { title: '鐢佃姱缁戝畾', text: '鎮ㄥ嵆灏嗘墽琛岀數鑺粦瀹氭搷浣�' },
+      unbind: { title: '鐢佃姱瑙g粦', text: '鎮ㄥ嵆灏嗘墽琛岀數鑺В缁戞搷浣�' },
+      ngReport: { title: 'NG涓婃姤', text: '鎮ㄥ嵆灏嗘墽琛孨G鐢佃姱涓婃姤鎿嶄綔' }
+    };
+
+    /**
+     * 瀵硅瘽妗嗘爣棰�
+     */
+    const dialogTitle = computed(() => {
+      return operationConfig[props.operationType]?.title || '纭鎿嶄綔';
+    });
+
+    /**
+     * 鎿嶄綔鎻愮ず鏂囨湰
+     */
+    const operationText = computed(() => {
+      return operationConfig[props.operationType]?.text || '';
+    });
+
+    /**
+     * 鏄剧ず鐨勪俊鎭垪琛�
+     */
+    const displayInfo = computed(() => {
+      const info = [
+        { label: '鎵樼洏鐮�', value: props.palletCode || '-' }
+      ];
+
+      // 濡傛灉鏈夋槑缁嗕俊鎭紝鏄剧ず鐢佃姱鏁伴噺
+      if (props.detailInfo) {
+        info.push({
+          label: '鐢佃姱鏁伴噺',
+          value: props.detailInfo.sfcCount !== undefined ? props.detailInfo.sfcCount : '-'
+        });
+      }
+
+      // 濡傛灉鏈夊簱瀛樹俊鎭紝鍙互鏄剧ず搴撲綅绛変俊鎭�
+      if (props.stockInfo) {
+        info.push({
+          label: '搴撲綅',
+          value: props.stockInfo.location || '-'
+        });
+      }
+
+      return info;
+    });
+
+    /**
+     * 鍏抽棴瀵硅瘽妗�
+     */
+    const handleClose = () => {
+      visible.value = false;
+      errorMessage.value = '';
+      loading.value = false;
+    };
+
+    /**
+     * 纭鎵ц鎿嶄綔
+     * 瑙﹀彂confirm浜嬩欢锛屼紶閫掓搷浣滃洖璋冨拰閿欒澶勭悊鍑芥暟
+     */
+    const handleConfirm = () => {
+      loading.value = true;
+      errorMessage.value = '';
+
+      // 瑙﹀彂confirm浜嬩欢锛屼紶閫掓搷浣滃弬鏁板拰鍥炶皟鍑芥暟
+      emit('confirm', {
+        operationType: props.operationType,
+        palletCode: props.palletCode,
+        stockInfo: props.stockInfo,
+        detailInfo: props.detailInfo,
+        onSuccess: () => {
+          // 鎿嶄綔鎴愬姛锛氬叧闂璇濇骞堕噸缃姸鎬�
+          visible.value = false;
+          loading.value = false;
+          errorMessage.value = '';
+        },
+        onError: (error) => {
+          // 鎿嶄綔澶辫触锛氭樉绀洪敊璇俊鎭苟淇濇寔瀵硅瘽妗嗘墦寮�
+          errorMessage.value = error || '鎿嶄綔澶辫触锛岃閲嶈瘯';
+          loading.value = false;
+        }
+      });
+    };
+
+    return {
+      visible,
+      loading,
+      errorMessage,
+      dialogTitle,
+      operationText,
+      displayInfo,
+      handleClose,
+      handleConfirm
+    };
+  }
+});
+</script>
+
+<style lang="less" scoped>
+.mes-confirm-content {
+  padding: 10px 0;
+}
+
+.operation-text {
+  font-size: 14px;
+  color: #303133;
+  margin-bottom: 20px;
+  font-weight: 500;
+}
+
+.info-section {
+  background: #f8fafc;
+  border-radius: 8px;
+  padding: 16px;
+  margin-bottom: 16px;
+}
+
+.info-row {
+  display: flex;
+  margin-bottom: 12px;
+  font-size: 14px;
+
+  &:last-child {
+    margin-bottom: 0;
+  }
+}
+
+.info-label {
+  color: #909399;
+  width: 80px;
+  flex-shrink: 0;
+}
+
+.info-value {
+  color: #303133;
+  font-weight: 500;
+}
+
+.error-message {
+  display: flex;
+  align-items: center;
+  gap: 8px;
+  padding: 12px;
+  background: #fef0f0;
+  border: 1px solid #fde2e2;
+  border-radius: 6px;
+  color: #f56c6c;
+  font-size: 14px;
+
+  .el-icon {
+    font-size: 18px;
+  }
+}
+</style>
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/basic/customerInfo.js b/Code/WMS/WIDESEA_WMSClient/src/extension/basic/customerInfo.jsx
similarity index 100%
rename from Code/WMS/WIDESEA_WMSClient/src/extension/basic/customerInfo.js
rename to Code/WMS/WIDESEA_WMSClient/src/extension/basic/customerInfo.jsx
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/basic/locationInfo.js b/Code/WMS/WIDESEA_WMSClient/src/extension/basic/locationInfo.jsx
similarity index 100%
rename from Code/WMS/WIDESEA_WMSClient/src/extension/basic/locationInfo.js
rename to Code/WMS/WIDESEA_WMSClient/src/extension/basic/locationInfo.jsx
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/basic/materielCodeInfo.js b/Code/WMS/WIDESEA_WMSClient/src/extension/basic/materielCodeInfo.jsx
similarity index 100%
rename from Code/WMS/WIDESEA_WMSClient/src/extension/basic/materielCodeInfo.js
rename to Code/WMS/WIDESEA_WMSClient/src/extension/basic/materielCodeInfo.jsx
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/basic/materielInfo.js b/Code/WMS/WIDESEA_WMSClient/src/extension/basic/materielInfo.jsx
similarity index 100%
rename from Code/WMS/WIDESEA_WMSClient/src/extension/basic/materielInfo.js
rename to Code/WMS/WIDESEA_WMSClient/src/extension/basic/materielInfo.jsx
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/basic/palletCodeInfo.js b/Code/WMS/WIDESEA_WMSClient/src/extension/basic/palletCodeInfo.jsx
similarity index 100%
rename from Code/WMS/WIDESEA_WMSClient/src/extension/basic/palletCodeInfo.js
rename to Code/WMS/WIDESEA_WMSClient/src/extension/basic/palletCodeInfo.jsx
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/basic/roadwayInfo.js b/Code/WMS/WIDESEA_WMSClient/src/extension/basic/roadwayInfo.jsx
similarity index 100%
rename from Code/WMS/WIDESEA_WMSClient/src/extension/basic/roadwayInfo.js
rename to Code/WMS/WIDESEA_WMSClient/src/extension/basic/roadwayInfo.jsx
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/basic/supplierInfo.js b/Code/WMS/WIDESEA_WMSClient/src/extension/basic/supplierInfo.jsx
similarity index 100%
rename from Code/WMS/WIDESEA_WMSClient/src/extension/basic/supplierInfo.js
rename to Code/WMS/WIDESEA_WMSClient/src/extension/basic/supplierInfo.jsx
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/basic/userInfo.js b/Code/WMS/WIDESEA_WMSClient/src/extension/basic/userInfo.js
deleted file mode 100644
index 852a3cb..0000000
--- a/Code/WMS/WIDESEA_WMSClient/src/extension/basic/userInfo.js
+++ /dev/null
@@ -1,69 +0,0 @@
-
-//姝s鏂囦欢鏄敤鏉ヨ嚜瀹氫箟鎵╁睍涓氬姟浠g爜锛屽彲浠ユ墿灞曚竴浜涜嚜瀹氫箟椤甸潰鎴栬�呴噸鏂伴厤缃敓鎴愮殑浠g爜
-
-let extension = {
-  components: {
-    //鏌ヨ鐣岄潰鎵╁睍缁勪欢
-    gridHeader: '',
-    gridBody: '',
-    gridFooter: '',
-    //鏂板缓銆佺紪杈戝脊鍑烘鎵╁睍缁勪欢
-    modelHeader: '',
-    modelBody: '',
-    modelFooter: ''
-  },
-  tableAction: '', //鎸囧畾鏌愬紶琛ㄧ殑鏉冮檺(杩欓噷濉啓琛ㄥ悕,榛樿涓嶇敤濉啓)
-  buttons: { view: [], box: [], detail: [] }, //鎵╁睍鐨勬寜閽�
-  methods: {
-     //涓嬮潰杩欎簺鏂规硶鍙互淇濈暀涔熷彲浠ュ垹闄�
-    onInit() {  //妗嗘灦鍒濆鍖栭厤缃墠锛�
-        //绀轰緥锛氬湪鎸夐挳鐨勬渶鍓嶉潰娣诲姞涓�涓寜閽�
-        //   this.buttons.unshift({  //涔熷彲浠ョ敤push鎴栬�卻plice鏂规硶鏉ヤ慨鏀筨uttons鏁扮粍
-        //     name: '鎸夐挳', //鎸夐挳鍚嶇О
-        //     icon: 'el-icon-document', //鎸夐挳鍥炬爣vue2鐗堟湰瑙乮view鏂囨。icon锛寁ue3鐗堟湰瑙乪lement ui鏂囨。icon(娉ㄦ剰涓嶆槸element puls鏂囨。)
-        //     type: 'primary', //鎸夐挳鏍峰紡vue2鐗堟湰瑙乮view鏂囨。button锛寁ue3鐗堟湰瑙乪lement ui鏂囨。button
-        //     onClick: function () {
-        //       this.$Message.success('鐐瑰嚮浜嗘寜閽�');
-        //     }
-        //   });
-
-        //绀轰緥锛氳缃慨鏀规柊寤恒�佺紪杈戝脊鍑烘瀛楁鏍囩鐨勯暱搴�
-        // this.boxOptions.labelWidth = 150;
-    },
-    onInited() {
-      //妗嗘灦鍒濆鍖栭厤缃悗
-      //濡傛灉瑕侀厤缃槑缁嗚〃,鍦ㄦ鏂规硶鎿嶄綔
-      //this.detailOptions.columns.forEach(column=>{ });
-    },
-    searchBefore(param) {
-      //鐣岄潰鏌ヨ鍓�,鍙互缁檖aram.wheres娣诲姞鏌ヨ鍙傛暟
-      //杩斿洖false锛屽垯涓嶄細鎵ц鏌ヨ
-      return true;
-    },
-    searchAfter(result) {
-      //鏌ヨ鍚庯紝result杩斿洖鐨勬煡璇㈡暟鎹�,鍙互鍦ㄦ樉绀哄埌琛ㄦ牸鍓嶅鐞嗚〃鏍肩殑鍊�
-      return true;
-    },
-    addBefore(formData) {
-      //鏂板缓淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛紝鍙互缁欑粰琛ㄥ崟璁剧疆鍊硷紝鑷繁杈撳嚭鐪媐ormData鐨勫��
-      return true;
-    },
-    updateBefore(formData) {
-      //缂栬緫淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛ㄣ�佸垹闄よ鐨処d
-      return true;
-    },
-    rowClick({ row, column, event }) {
-      //鏌ヨ鐣岄潰鐐瑰嚮琛屼簨浠�
-      // this.$refs.table.$refs.table.toggleRowSelection(row); //鍗曞嚮琛屾椂閫変腑褰撳墠琛�;
-    },
-    modelOpenAfter(row) {
-      //鐐瑰嚮缂栬緫銆佹柊寤烘寜閽脊鍑烘鍚庯紝鍙互鍦ㄦ澶勫啓閫昏緫锛屽锛屼粠鍚庡彴鑾峰彇鏁版嵁
-      //(1)鍒ゆ柇鏄紪杈戣繕鏄柊寤烘搷浣滐細 this.currentAction=='Add';
-      //(2)缁欏脊鍑烘璁剧疆榛樿鍊�
-      //(3)this.editFormFields.瀛楁='xxx';
-      //濡傛灉闇�瑕佺粰涓嬫媺妗嗚缃粯璁ゅ�硷紝璇烽亶鍘唗his.editFormOptions鎵惧埌瀛楁閰嶇疆瀵瑰簲data灞炴�х殑key鍊�
-      //鐪嬩笉鎳傚氨鎶婅緭鍑虹湅锛歝onsole.log(this.editFormOptions)
-    }
-  }
-};
-export default extension;
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/basic/supplierInfo.js b/Code/WMS/WIDESEA_WMSClient/src/extension/basic/userInfo.jsx
similarity index 100%
copy from Code/WMS/WIDESEA_WMSClient/src/extension/basic/supplierInfo.js
copy to Code/WMS/WIDESEA_WMSClient/src/extension/basic/userInfo.jsx
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/basic/warehouse.js b/Code/WMS/WIDESEA_WMSClient/src/extension/basic/warehouse.jsx
similarity index 100%
rename from Code/WMS/WIDESEA_WMSClient/src/extension/basic/warehouse.js
rename to Code/WMS/WIDESEA_WMSClient/src/extension/basic/warehouse.jsx
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/check/checkOrder.js b/Code/WMS/WIDESEA_WMSClient/src/extension/check/checkOrder.jsx
similarity index 100%
rename from Code/WMS/WIDESEA_WMSClient/src/extension/check/checkOrder.js
rename to Code/WMS/WIDESEA_WMSClient/src/extension/check/checkOrder.jsx
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/check/checkOrderResult.js b/Code/WMS/WIDESEA_WMSClient/src/extension/check/checkOrderResult.js
deleted file mode 100644
index 8935403..0000000
--- a/Code/WMS/WIDESEA_WMSClient/src/extension/check/checkOrderResult.js
+++ /dev/null
@@ -1,75 +0,0 @@
-/*****************************************************************************************
-**  Author:jxx 2022
-**  QQ:283591387
-**瀹屾暣鏂囨。瑙侊細http://v2.volcore.xyz/document/api 銆愪唬鐮佺敓鎴愰〉闈iewGrid銆�
-**甯哥敤绀轰緥瑙侊細http://v2.volcore.xyz/document/vueDev
-**鍚庡彴鎿嶄綔瑙侊細http://v2.volcore.xyz/document/netCoreDev
-*****************************************************************************************/
-//姝s鏂囦欢鏄敤鏉ヨ嚜瀹氫箟鎵╁睍涓氬姟浠g爜锛屽彲浠ユ墿灞曚竴浜涜嚜瀹氫箟椤甸潰鎴栬�呴噸鏂伴厤缃敓鎴愮殑浠g爜
-
-let extension = {
-  components: {
-    //鏌ヨ鐣岄潰鎵╁睍缁勪欢
-    gridHeader: '',
-    gridBody: '',
-    gridFooter: '',
-    //鏂板缓銆佺紪杈戝脊鍑烘鎵╁睍缁勪欢
-    modelHeader: '',
-    modelBody: '',
-    modelFooter: ''
-  },
-  tableAction: '', //鎸囧畾鏌愬紶琛ㄧ殑鏉冮檺(杩欓噷濉啓琛ㄥ悕,榛樿涓嶇敤濉啓)
-  buttons: { view: [], box: [], detail: [] }, //鎵╁睍鐨勬寜閽�
-  methods: {
-     //涓嬮潰杩欎簺鏂规硶鍙互淇濈暀涔熷彲浠ュ垹闄�
-    onInit() {  //妗嗘灦鍒濆鍖栭厤缃墠锛�
-        //绀轰緥锛氬湪鎸夐挳鐨勬渶鍓嶉潰娣诲姞涓�涓寜閽�
-        //   this.buttons.unshift({  //涔熷彲浠ョ敤push鎴栬�卻plice鏂规硶鏉ヤ慨鏀筨uttons鏁扮粍
-        //     name: '鎸夐挳', //鎸夐挳鍚嶇О
-        //     icon: 'el-icon-document', //鎸夐挳鍥炬爣vue2鐗堟湰瑙乮view鏂囨。icon锛寁ue3鐗堟湰瑙乪lement ui鏂囨。icon(娉ㄦ剰涓嶆槸element puls鏂囨。)
-        //     type: 'primary', //鎸夐挳鏍峰紡vue2鐗堟湰瑙乮view鏂囨。button锛寁ue3鐗堟湰瑙乪lement ui鏂囨。button
-        //     onClick: function () {
-        //       this.$Message.success('鐐瑰嚮浜嗘寜閽�');
-        //     }
-        //   });
-
-        //绀轰緥锛氳缃慨鏀规柊寤恒�佺紪杈戝脊鍑烘瀛楁鏍囩鐨勯暱搴�
-        // this.boxOptions.labelWidth = 150;
-    },
-    onInited() {
-      //妗嗘灦鍒濆鍖栭厤缃悗
-      //濡傛灉瑕侀厤缃槑缁嗚〃,鍦ㄦ鏂规硶鎿嶄綔
-      //this.detailOptions.columns.forEach(column=>{ });
-    },
-    searchBefore(param) {
-      //鐣岄潰鏌ヨ鍓�,鍙互缁檖aram.wheres娣诲姞鏌ヨ鍙傛暟
-      //杩斿洖false锛屽垯涓嶄細鎵ц鏌ヨ
-      return true;
-    },
-    searchAfter(result) {
-      //鏌ヨ鍚庯紝result杩斿洖鐨勬煡璇㈡暟鎹�,鍙互鍦ㄦ樉绀哄埌琛ㄦ牸鍓嶅鐞嗚〃鏍肩殑鍊�
-      return true;
-    },
-    addBefore(formData) {
-      //鏂板缓淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛紝鍙互缁欑粰琛ㄥ崟璁剧疆鍊硷紝鑷繁杈撳嚭鐪媐ormData鐨勫��
-      return true;
-    },
-    updateBefore(formData) {
-      //缂栬緫淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛ㄣ�佸垹闄よ鐨処d
-      return true;
-    },
-    rowClick({ row, column, event }) {
-      //鏌ヨ鐣岄潰鐐瑰嚮琛屼簨浠�
-      // this.$refs.table.$refs.table.toggleRowSelection(row); //鍗曞嚮琛屾椂閫変腑褰撳墠琛�;
-    },
-    modelOpenAfter(row) {
-      //鐐瑰嚮缂栬緫銆佹柊寤烘寜閽脊鍑烘鍚庯紝鍙互鍦ㄦ澶勫啓閫昏緫锛屽锛屼粠鍚庡彴鑾峰彇鏁版嵁
-      //(1)鍒ゆ柇鏄紪杈戣繕鏄柊寤烘搷浣滐細 this.currentAction=='Add';
-      //(2)缁欏脊鍑烘璁剧疆榛樿鍊�
-      //(3)this.editFormFields.瀛楁='xxx';
-      //濡傛灉闇�瑕佺粰涓嬫媺妗嗚缃粯璁ゅ�硷紝璇烽亶鍘唗his.editFormOptions鎵惧埌瀛楁閰嶇疆瀵瑰簲data灞炴�х殑key鍊�
-      //鐪嬩笉鎳傚氨鎶婅緭鍑虹湅锛歝onsole.log(this.editFormOptions)
-    }
-  }
-};
-export default extension;
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/check/checkOrder.js b/Code/WMS/WIDESEA_WMSClient/src/extension/check/checkOrderResult.jsx
similarity index 100%
copy from Code/WMS/WIDESEA_WMSClient/src/extension/check/checkOrder.js
copy to Code/WMS/WIDESEA_WMSClient/src/extension/check/checkOrderResult.jsx
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/inbound/inboundOrder.js b/Code/WMS/WIDESEA_WMSClient/src/extension/inbound/inboundOrder.jsx
similarity index 100%
rename from Code/WMS/WIDESEA_WMSClient/src/extension/inbound/inboundOrder.js
rename to Code/WMS/WIDESEA_WMSClient/src/extension/inbound/inboundOrder.jsx
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/inbound/inboundOrderDetail.js b/Code/WMS/WIDESEA_WMSClient/src/extension/inbound/inboundOrderDetail.js
deleted file mode 100644
index 24e1d94..0000000
--- a/Code/WMS/WIDESEA_WMSClient/src/extension/inbound/inboundOrderDetail.js
+++ /dev/null
@@ -1,58 +0,0 @@
-
-//姝s鏂囦欢鏄敤鏉ヨ嚜瀹氫箟鎵╁睍涓氬姟浠g爜锛屽彲浠ユ墿灞曚竴浜涜嚜瀹氫箟椤甸潰鎴栬�呴噸鏂伴厤缃敓鎴愮殑浠g爜
-
-let extension = {
-    components: {
-      //鏌ヨ鐣岄潰鎵╁睍缁勪欢
-      gridHeader: '',
-      gridBody: '',
-      gridFooter: '',
-      //鏂板缓銆佺紪杈戝脊鍑烘鎵╁睍缁勪欢
-      modelHeader: '',
-      modelBody: '',
-      modelFooter: ''
-    },
-    tableAction: '', //鎸囧畾鏌愬紶琛ㄧ殑鏉冮檺(杩欓噷濉啓琛ㄥ悕,榛樿涓嶇敤濉啓)
-    buttons: { view: [], box: [], detail: [] }, //鎵╁睍鐨勬寜閽�
-    methods: {
-       //涓嬮潰杩欎簺鏂规硶鍙互淇濈暀涔熷彲浠ュ垹闄�
-      onInit() {  
-      },
-      onInited() {
-        //妗嗘灦鍒濆鍖栭厤缃悗
-        //濡傛灉瑕侀厤缃槑缁嗚〃,鍦ㄦ鏂规硶鎿嶄綔
-        //this.detailOptions.columns.forEach(column=>{ });
-      },
-      searchBefore(param) {
-        //鐣岄潰鏌ヨ鍓�,鍙互缁檖aram.wheres娣诲姞鏌ヨ鍙傛暟
-        //杩斿洖false锛屽垯涓嶄細鎵ц鏌ヨ
-        return true;
-      },
-      searchAfter(result) {
-        //鏌ヨ鍚庯紝result杩斿洖鐨勬煡璇㈡暟鎹�,鍙互鍦ㄦ樉绀哄埌琛ㄦ牸鍓嶅鐞嗚〃鏍肩殑鍊�
-        return true;
-      },
-      addBefore(formData) {
-        //鏂板缓淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛紝鍙互缁欑粰琛ㄥ崟璁剧疆鍊硷紝鑷繁杈撳嚭鐪媐ormData鐨勫��
-        return true;
-      },
-      updateBefore(formData) {
-        //缂栬緫淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛ㄣ�佸垹闄よ鐨処d
-        return true;
-      },
-      rowClick({ row, column, event }) {
-        //鏌ヨ鐣岄潰鐐瑰嚮琛屼簨浠�
-        this.$refs.table.$refs.table.toggleRowSelection(row); //鍗曞嚮琛屾椂閫変腑褰撳墠琛�;
-      },
-      modelOpenAfter(row) {
-        //鐐瑰嚮缂栬緫銆佹柊寤烘寜閽脊鍑烘鍚庯紝鍙互鍦ㄦ澶勫啓閫昏緫锛屽锛屼粠鍚庡彴鑾峰彇鏁版嵁
-        //(1)鍒ゆ柇鏄紪杈戣繕鏄柊寤烘搷浣滐細 this.currentAction=='Add';
-        //(2)缁欏脊鍑烘璁剧疆榛樿鍊�
-        //(3)this.editFormFields.瀛楁='xxx';
-        //濡傛灉闇�瑕佺粰涓嬫媺妗嗚缃粯璁ゅ�硷紝璇烽亶鍘唗his.editFormOptions鎵惧埌瀛楁閰嶇疆瀵瑰簲data灞炴�х殑key鍊�
-        //鐪嬩笉鎳傚氨鎶婅緭鍑虹湅锛歝onsole.log(this.editFormOptions)
-      }
-    }
-  };
-  export default extension;
-  
\ No newline at end of file
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/inbound/inboundOrder.js b/Code/WMS/WIDESEA_WMSClient/src/extension/inbound/inboundOrderDetail.jsx
similarity index 100%
copy from Code/WMS/WIDESEA_WMSClient/src/extension/inbound/inboundOrder.js
copy to Code/WMS/WIDESEA_WMSClient/src/extension/inbound/inboundOrderDetail.jsx
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/inbound/inboundOrderDetail_Hty.js b/Code/WMS/WIDESEA_WMSClient/src/extension/inbound/inboundOrderDetail_Hty.jsx
similarity index 100%
rename from Code/WMS/WIDESEA_WMSClient/src/extension/inbound/inboundOrderDetail_Hty.js
rename to Code/WMS/WIDESEA_WMSClient/src/extension/inbound/inboundOrderDetail_Hty.jsx
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/inbound/inboundOrder_Hty.js b/Code/WMS/WIDESEA_WMSClient/src/extension/inbound/inboundOrder_Hty.js
deleted file mode 100644
index 8935403..0000000
--- a/Code/WMS/WIDESEA_WMSClient/src/extension/inbound/inboundOrder_Hty.js
+++ /dev/null
@@ -1,75 +0,0 @@
-/*****************************************************************************************
-**  Author:jxx 2022
-**  QQ:283591387
-**瀹屾暣鏂囨。瑙侊細http://v2.volcore.xyz/document/api 銆愪唬鐮佺敓鎴愰〉闈iewGrid銆�
-**甯哥敤绀轰緥瑙侊細http://v2.volcore.xyz/document/vueDev
-**鍚庡彴鎿嶄綔瑙侊細http://v2.volcore.xyz/document/netCoreDev
-*****************************************************************************************/
-//姝s鏂囦欢鏄敤鏉ヨ嚜瀹氫箟鎵╁睍涓氬姟浠g爜锛屽彲浠ユ墿灞曚竴浜涜嚜瀹氫箟椤甸潰鎴栬�呴噸鏂伴厤缃敓鎴愮殑浠g爜
-
-let extension = {
-  components: {
-    //鏌ヨ鐣岄潰鎵╁睍缁勪欢
-    gridHeader: '',
-    gridBody: '',
-    gridFooter: '',
-    //鏂板缓銆佺紪杈戝脊鍑烘鎵╁睍缁勪欢
-    modelHeader: '',
-    modelBody: '',
-    modelFooter: ''
-  },
-  tableAction: '', //鎸囧畾鏌愬紶琛ㄧ殑鏉冮檺(杩欓噷濉啓琛ㄥ悕,榛樿涓嶇敤濉啓)
-  buttons: { view: [], box: [], detail: [] }, //鎵╁睍鐨勬寜閽�
-  methods: {
-     //涓嬮潰杩欎簺鏂规硶鍙互淇濈暀涔熷彲浠ュ垹闄�
-    onInit() {  //妗嗘灦鍒濆鍖栭厤缃墠锛�
-        //绀轰緥锛氬湪鎸夐挳鐨勬渶鍓嶉潰娣诲姞涓�涓寜閽�
-        //   this.buttons.unshift({  //涔熷彲浠ョ敤push鎴栬�卻plice鏂规硶鏉ヤ慨鏀筨uttons鏁扮粍
-        //     name: '鎸夐挳', //鎸夐挳鍚嶇О
-        //     icon: 'el-icon-document', //鎸夐挳鍥炬爣vue2鐗堟湰瑙乮view鏂囨。icon锛寁ue3鐗堟湰瑙乪lement ui鏂囨。icon(娉ㄦ剰涓嶆槸element puls鏂囨。)
-        //     type: 'primary', //鎸夐挳鏍峰紡vue2鐗堟湰瑙乮view鏂囨。button锛寁ue3鐗堟湰瑙乪lement ui鏂囨。button
-        //     onClick: function () {
-        //       this.$Message.success('鐐瑰嚮浜嗘寜閽�');
-        //     }
-        //   });
-
-        //绀轰緥锛氳缃慨鏀规柊寤恒�佺紪杈戝脊鍑烘瀛楁鏍囩鐨勯暱搴�
-        // this.boxOptions.labelWidth = 150;
-    },
-    onInited() {
-      //妗嗘灦鍒濆鍖栭厤缃悗
-      //濡傛灉瑕侀厤缃槑缁嗚〃,鍦ㄦ鏂规硶鎿嶄綔
-      //this.detailOptions.columns.forEach(column=>{ });
-    },
-    searchBefore(param) {
-      //鐣岄潰鏌ヨ鍓�,鍙互缁檖aram.wheres娣诲姞鏌ヨ鍙傛暟
-      //杩斿洖false锛屽垯涓嶄細鎵ц鏌ヨ
-      return true;
-    },
-    searchAfter(result) {
-      //鏌ヨ鍚庯紝result杩斿洖鐨勬煡璇㈡暟鎹�,鍙互鍦ㄦ樉绀哄埌琛ㄦ牸鍓嶅鐞嗚〃鏍肩殑鍊�
-      return true;
-    },
-    addBefore(formData) {
-      //鏂板缓淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛紝鍙互缁欑粰琛ㄥ崟璁剧疆鍊硷紝鑷繁杈撳嚭鐪媐ormData鐨勫��
-      return true;
-    },
-    updateBefore(formData) {
-      //缂栬緫淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛ㄣ�佸垹闄よ鐨処d
-      return true;
-    },
-    rowClick({ row, column, event }) {
-      //鏌ヨ鐣岄潰鐐瑰嚮琛屼簨浠�
-      // this.$refs.table.$refs.table.toggleRowSelection(row); //鍗曞嚮琛屾椂閫変腑褰撳墠琛�;
-    },
-    modelOpenAfter(row) {
-      //鐐瑰嚮缂栬緫銆佹柊寤烘寜閽脊鍑烘鍚庯紝鍙互鍦ㄦ澶勫啓閫昏緫锛屽锛屼粠鍚庡彴鑾峰彇鏁版嵁
-      //(1)鍒ゆ柇鏄紪杈戣繕鏄柊寤烘搷浣滐細 this.currentAction=='Add';
-      //(2)缁欏脊鍑烘璁剧疆榛樿鍊�
-      //(3)this.editFormFields.瀛楁='xxx';
-      //濡傛灉闇�瑕佺粰涓嬫媺妗嗚缃粯璁ゅ�硷紝璇烽亶鍘唗his.editFormOptions鎵惧埌瀛楁閰嶇疆瀵瑰簲data灞炴�х殑key鍊�
-      //鐪嬩笉鎳傚氨鎶婅緭鍑虹湅锛歝onsole.log(this.editFormOptions)
-    }
-  }
-};
-export default extension;
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/inbound/inboundOrderDetail_Hty.js b/Code/WMS/WIDESEA_WMSClient/src/extension/inbound/inboundOrder_Hty.jsx
similarity index 100%
copy from Code/WMS/WIDESEA_WMSClient/src/extension/inbound/inboundOrderDetail_Hty.js
copy to Code/WMS/WIDESEA_WMSClient/src/extension/inbound/inboundOrder_Hty.jsx
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/inbound/purchaseOrder.js b/Code/WMS/WIDESEA_WMSClient/src/extension/inbound/purchaseOrder.js
deleted file mode 100644
index 24e1d94..0000000
--- a/Code/WMS/WIDESEA_WMSClient/src/extension/inbound/purchaseOrder.js
+++ /dev/null
@@ -1,58 +0,0 @@
-
-//姝s鏂囦欢鏄敤鏉ヨ嚜瀹氫箟鎵╁睍涓氬姟浠g爜锛屽彲浠ユ墿灞曚竴浜涜嚜瀹氫箟椤甸潰鎴栬�呴噸鏂伴厤缃敓鎴愮殑浠g爜
-
-let extension = {
-    components: {
-      //鏌ヨ鐣岄潰鎵╁睍缁勪欢
-      gridHeader: '',
-      gridBody: '',
-      gridFooter: '',
-      //鏂板缓銆佺紪杈戝脊鍑烘鎵╁睍缁勪欢
-      modelHeader: '',
-      modelBody: '',
-      modelFooter: ''
-    },
-    tableAction: '', //鎸囧畾鏌愬紶琛ㄧ殑鏉冮檺(杩欓噷濉啓琛ㄥ悕,榛樿涓嶇敤濉啓)
-    buttons: { view: [], box: [], detail: [] }, //鎵╁睍鐨勬寜閽�
-    methods: {
-       //涓嬮潰杩欎簺鏂规硶鍙互淇濈暀涔熷彲浠ュ垹闄�
-      onInit() {  
-      },
-      onInited() {
-        //妗嗘灦鍒濆鍖栭厤缃悗
-        //濡傛灉瑕侀厤缃槑缁嗚〃,鍦ㄦ鏂规硶鎿嶄綔
-        //this.detailOptions.columns.forEach(column=>{ });
-      },
-      searchBefore(param) {
-        //鐣岄潰鏌ヨ鍓�,鍙互缁檖aram.wheres娣诲姞鏌ヨ鍙傛暟
-        //杩斿洖false锛屽垯涓嶄細鎵ц鏌ヨ
-        return true;
-      },
-      searchAfter(result) {
-        //鏌ヨ鍚庯紝result杩斿洖鐨勬煡璇㈡暟鎹�,鍙互鍦ㄦ樉绀哄埌琛ㄦ牸鍓嶅鐞嗚〃鏍肩殑鍊�
-        return true;
-      },
-      addBefore(formData) {
-        //鏂板缓淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛紝鍙互缁欑粰琛ㄥ崟璁剧疆鍊硷紝鑷繁杈撳嚭鐪媐ormData鐨勫��
-        return true;
-      },
-      updateBefore(formData) {
-        //缂栬緫淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛ㄣ�佸垹闄よ鐨処d
-        return true;
-      },
-      rowClick({ row, column, event }) {
-        //鏌ヨ鐣岄潰鐐瑰嚮琛屼簨浠�
-        this.$refs.table.$refs.table.toggleRowSelection(row); //鍗曞嚮琛屾椂閫変腑褰撳墠琛�;
-      },
-      modelOpenAfter(row) {
-        //鐐瑰嚮缂栬緫銆佹柊寤烘寜閽脊鍑烘鍚庯紝鍙互鍦ㄦ澶勫啓閫昏緫锛屽锛屼粠鍚庡彴鑾峰彇鏁版嵁
-        //(1)鍒ゆ柇鏄紪杈戣繕鏄柊寤烘搷浣滐細 this.currentAction=='Add';
-        //(2)缁欏脊鍑烘璁剧疆榛樿鍊�
-        //(3)this.editFormFields.瀛楁='xxx';
-        //濡傛灉闇�瑕佺粰涓嬫媺妗嗚缃粯璁ゅ�硷紝璇烽亶鍘唗his.editFormOptions鎵惧埌瀛楁閰嶇疆瀵瑰簲data灞炴�х殑key鍊�
-        //鐪嬩笉鎳傚氨鎶婅緭鍑虹湅锛歝onsole.log(this.editFormOptions)
-      }
-    }
-  };
-  export default extension;
-  
\ No newline at end of file
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/inbound/inboundOrder.js b/Code/WMS/WIDESEA_WMSClient/src/extension/inbound/purchaseOrder.jsx
similarity index 100%
copy from Code/WMS/WIDESEA_WMSClient/src/extension/inbound/inboundOrder.js
copy to Code/WMS/WIDESEA_WMSClient/src/extension/inbound/purchaseOrder.jsx
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/inbound/purchaseOrderDetail.js b/Code/WMS/WIDESEA_WMSClient/src/extension/inbound/purchaseOrderDetail.js
deleted file mode 100644
index 8935403..0000000
--- a/Code/WMS/WIDESEA_WMSClient/src/extension/inbound/purchaseOrderDetail.js
+++ /dev/null
@@ -1,75 +0,0 @@
-/*****************************************************************************************
-**  Author:jxx 2022
-**  QQ:283591387
-**瀹屾暣鏂囨。瑙侊細http://v2.volcore.xyz/document/api 銆愪唬鐮佺敓鎴愰〉闈iewGrid銆�
-**甯哥敤绀轰緥瑙侊細http://v2.volcore.xyz/document/vueDev
-**鍚庡彴鎿嶄綔瑙侊細http://v2.volcore.xyz/document/netCoreDev
-*****************************************************************************************/
-//姝s鏂囦欢鏄敤鏉ヨ嚜瀹氫箟鎵╁睍涓氬姟浠g爜锛屽彲浠ユ墿灞曚竴浜涜嚜瀹氫箟椤甸潰鎴栬�呴噸鏂伴厤缃敓鎴愮殑浠g爜
-
-let extension = {
-  components: {
-    //鏌ヨ鐣岄潰鎵╁睍缁勪欢
-    gridHeader: '',
-    gridBody: '',
-    gridFooter: '',
-    //鏂板缓銆佺紪杈戝脊鍑烘鎵╁睍缁勪欢
-    modelHeader: '',
-    modelBody: '',
-    modelFooter: ''
-  },
-  tableAction: '', //鎸囧畾鏌愬紶琛ㄧ殑鏉冮檺(杩欓噷濉啓琛ㄥ悕,榛樿涓嶇敤濉啓)
-  buttons: { view: [], box: [], detail: [] }, //鎵╁睍鐨勬寜閽�
-  methods: {
-     //涓嬮潰杩欎簺鏂规硶鍙互淇濈暀涔熷彲浠ュ垹闄�
-    onInit() {  //妗嗘灦鍒濆鍖栭厤缃墠锛�
-        //绀轰緥锛氬湪鎸夐挳鐨勬渶鍓嶉潰娣诲姞涓�涓寜閽�
-        //   this.buttons.unshift({  //涔熷彲浠ョ敤push鎴栬�卻plice鏂规硶鏉ヤ慨鏀筨uttons鏁扮粍
-        //     name: '鎸夐挳', //鎸夐挳鍚嶇О
-        //     icon: 'el-icon-document', //鎸夐挳鍥炬爣vue2鐗堟湰瑙乮view鏂囨。icon锛寁ue3鐗堟湰瑙乪lement ui鏂囨。icon(娉ㄦ剰涓嶆槸element puls鏂囨。)
-        //     type: 'primary', //鎸夐挳鏍峰紡vue2鐗堟湰瑙乮view鏂囨。button锛寁ue3鐗堟湰瑙乪lement ui鏂囨。button
-        //     onClick: function () {
-        //       this.$Message.success('鐐瑰嚮浜嗘寜閽�');
-        //     }
-        //   });
-
-        //绀轰緥锛氳缃慨鏀规柊寤恒�佺紪杈戝脊鍑烘瀛楁鏍囩鐨勯暱搴�
-        // this.boxOptions.labelWidth = 150;
-    },
-    onInited() {
-      //妗嗘灦鍒濆鍖栭厤缃悗
-      //濡傛灉瑕侀厤缃槑缁嗚〃,鍦ㄦ鏂规硶鎿嶄綔
-      //this.detailOptions.columns.forEach(column=>{ });
-    },
-    searchBefore(param) {
-      //鐣岄潰鏌ヨ鍓�,鍙互缁檖aram.wheres娣诲姞鏌ヨ鍙傛暟
-      //杩斿洖false锛屽垯涓嶄細鎵ц鏌ヨ
-      return true;
-    },
-    searchAfter(result) {
-      //鏌ヨ鍚庯紝result杩斿洖鐨勬煡璇㈡暟鎹�,鍙互鍦ㄦ樉绀哄埌琛ㄦ牸鍓嶅鐞嗚〃鏍肩殑鍊�
-      return true;
-    },
-    addBefore(formData) {
-      //鏂板缓淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛紝鍙互缁欑粰琛ㄥ崟璁剧疆鍊硷紝鑷繁杈撳嚭鐪媐ormData鐨勫��
-      return true;
-    },
-    updateBefore(formData) {
-      //缂栬緫淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛ㄣ�佸垹闄よ鐨処d
-      return true;
-    },
-    rowClick({ row, column, event }) {
-      //鏌ヨ鐣岄潰鐐瑰嚮琛屼簨浠�
-      // this.$refs.table.$refs.table.toggleRowSelection(row); //鍗曞嚮琛屾椂閫変腑褰撳墠琛�;
-    },
-    modelOpenAfter(row) {
-      //鐐瑰嚮缂栬緫銆佹柊寤烘寜閽脊鍑烘鍚庯紝鍙互鍦ㄦ澶勫啓閫昏緫锛屽锛屼粠鍚庡彴鑾峰彇鏁版嵁
-      //(1)鍒ゆ柇鏄紪杈戣繕鏄柊寤烘搷浣滐細 this.currentAction=='Add';
-      //(2)缁欏脊鍑烘璁剧疆榛樿鍊�
-      //(3)this.editFormFields.瀛楁='xxx';
-      //濡傛灉闇�瑕佺粰涓嬫媺妗嗚缃粯璁ゅ�硷紝璇烽亶鍘唗his.editFormOptions鎵惧埌瀛楁閰嶇疆瀵瑰簲data灞炴�х殑key鍊�
-      //鐪嬩笉鎳傚氨鎶婅緭鍑虹湅锛歝onsole.log(this.editFormOptions)
-    }
-  }
-};
-export default extension;
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/inbound/inboundOrderDetail_Hty.js b/Code/WMS/WIDESEA_WMSClient/src/extension/inbound/purchaseOrderDetail.jsx
similarity index 100%
copy from Code/WMS/WIDESEA_WMSClient/src/extension/inbound/inboundOrderDetail_Hty.js
copy to Code/WMS/WIDESEA_WMSClient/src/extension/inbound/purchaseOrderDetail.jsx
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/inbound/receiveOrder.js b/Code/WMS/WIDESEA_WMSClient/src/extension/inbound/receiveOrder.jsx
similarity index 100%
rename from Code/WMS/WIDESEA_WMSClient/src/extension/inbound/receiveOrder.js
rename to Code/WMS/WIDESEA_WMSClient/src/extension/inbound/receiveOrder.jsx
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/inbound/receiveOrderDetail.js b/Code/WMS/WIDESEA_WMSClient/src/extension/inbound/receiveOrderDetail.js
deleted file mode 100644
index 8935403..0000000
--- a/Code/WMS/WIDESEA_WMSClient/src/extension/inbound/receiveOrderDetail.js
+++ /dev/null
@@ -1,75 +0,0 @@
-/*****************************************************************************************
-**  Author:jxx 2022
-**  QQ:283591387
-**瀹屾暣鏂囨。瑙侊細http://v2.volcore.xyz/document/api 銆愪唬鐮佺敓鎴愰〉闈iewGrid銆�
-**甯哥敤绀轰緥瑙侊細http://v2.volcore.xyz/document/vueDev
-**鍚庡彴鎿嶄綔瑙侊細http://v2.volcore.xyz/document/netCoreDev
-*****************************************************************************************/
-//姝s鏂囦欢鏄敤鏉ヨ嚜瀹氫箟鎵╁睍涓氬姟浠g爜锛屽彲浠ユ墿灞曚竴浜涜嚜瀹氫箟椤甸潰鎴栬�呴噸鏂伴厤缃敓鎴愮殑浠g爜
-
-let extension = {
-  components: {
-    //鏌ヨ鐣岄潰鎵╁睍缁勪欢
-    gridHeader: '',
-    gridBody: '',
-    gridFooter: '',
-    //鏂板缓銆佺紪杈戝脊鍑烘鎵╁睍缁勪欢
-    modelHeader: '',
-    modelBody: '',
-    modelFooter: ''
-  },
-  tableAction: '', //鎸囧畾鏌愬紶琛ㄧ殑鏉冮檺(杩欓噷濉啓琛ㄥ悕,榛樿涓嶇敤濉啓)
-  buttons: { view: [], box: [], detail: [] }, //鎵╁睍鐨勬寜閽�
-  methods: {
-     //涓嬮潰杩欎簺鏂规硶鍙互淇濈暀涔熷彲浠ュ垹闄�
-    onInit() {  //妗嗘灦鍒濆鍖栭厤缃墠锛�
-        //绀轰緥锛氬湪鎸夐挳鐨勬渶鍓嶉潰娣诲姞涓�涓寜閽�
-        //   this.buttons.unshift({  //涔熷彲浠ョ敤push鎴栬�卻plice鏂规硶鏉ヤ慨鏀筨uttons鏁扮粍
-        //     name: '鎸夐挳', //鎸夐挳鍚嶇О
-        //     icon: 'el-icon-document', //鎸夐挳鍥炬爣vue2鐗堟湰瑙乮view鏂囨。icon锛寁ue3鐗堟湰瑙乪lement ui鏂囨。icon(娉ㄦ剰涓嶆槸element puls鏂囨。)
-        //     type: 'primary', //鎸夐挳鏍峰紡vue2鐗堟湰瑙乮view鏂囨。button锛寁ue3鐗堟湰瑙乪lement ui鏂囨。button
-        //     onClick: function () {
-        //       this.$Message.success('鐐瑰嚮浜嗘寜閽�');
-        //     }
-        //   });
-
-        //绀轰緥锛氳缃慨鏀规柊寤恒�佺紪杈戝脊鍑烘瀛楁鏍囩鐨勯暱搴�
-        // this.boxOptions.labelWidth = 150;
-    },
-    onInited() {
-      //妗嗘灦鍒濆鍖栭厤缃悗
-      //濡傛灉瑕侀厤缃槑缁嗚〃,鍦ㄦ鏂规硶鎿嶄綔
-      //this.detailOptions.columns.forEach(column=>{ });
-    },
-    searchBefore(param) {
-      //鐣岄潰鏌ヨ鍓�,鍙互缁檖aram.wheres娣诲姞鏌ヨ鍙傛暟
-      //杩斿洖false锛屽垯涓嶄細鎵ц鏌ヨ
-      return true;
-    },
-    searchAfter(result) {
-      //鏌ヨ鍚庯紝result杩斿洖鐨勬煡璇㈡暟鎹�,鍙互鍦ㄦ樉绀哄埌琛ㄦ牸鍓嶅鐞嗚〃鏍肩殑鍊�
-      return true;
-    },
-    addBefore(formData) {
-      //鏂板缓淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛紝鍙互缁欑粰琛ㄥ崟璁剧疆鍊硷紝鑷繁杈撳嚭鐪媐ormData鐨勫��
-      return true;
-    },
-    updateBefore(formData) {
-      //缂栬緫淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛ㄣ�佸垹闄よ鐨処d
-      return true;
-    },
-    rowClick({ row, column, event }) {
-      //鏌ヨ鐣岄潰鐐瑰嚮琛屼簨浠�
-      // this.$refs.table.$refs.table.toggleRowSelection(row); //鍗曞嚮琛屾椂閫変腑褰撳墠琛�;
-    },
-    modelOpenAfter(row) {
-      //鐐瑰嚮缂栬緫銆佹柊寤烘寜閽脊鍑烘鍚庯紝鍙互鍦ㄦ澶勫啓閫昏緫锛屽锛屼粠鍚庡彴鑾峰彇鏁版嵁
-      //(1)鍒ゆ柇鏄紪杈戣繕鏄柊寤烘搷浣滐細 this.currentAction=='Add';
-      //(2)缁欏脊鍑烘璁剧疆榛樿鍊�
-      //(3)this.editFormFields.瀛楁='xxx';
-      //濡傛灉闇�瑕佺粰涓嬫媺妗嗚缃粯璁ゅ�硷紝璇烽亶鍘唗his.editFormOptions鎵惧埌瀛楁閰嶇疆瀵瑰簲data灞炴�х殑key鍊�
-      //鐪嬩笉鎳傚氨鎶婅緭鍑虹湅锛歝onsole.log(this.editFormOptions)
-    }
-  }
-};
-export default extension;
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/inbound/inboundOrderDetail_Hty.js b/Code/WMS/WIDESEA_WMSClient/src/extension/inbound/receiveOrderDetail.jsx
similarity index 100%
copy from Code/WMS/WIDESEA_WMSClient/src/extension/inbound/inboundOrderDetail_Hty.js
copy to Code/WMS/WIDESEA_WMSClient/src/extension/inbound/receiveOrderDetail.jsx
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/outbound/mesOutboundOrder.js b/Code/WMS/WIDESEA_WMSClient/src/extension/outbound/mesOutboundOrder.jsx
similarity index 100%
rename from Code/WMS/WIDESEA_WMSClient/src/extension/outbound/mesOutboundOrder.js
rename to Code/WMS/WIDESEA_WMSClient/src/extension/outbound/mesOutboundOrder.jsx
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/outbound/outStockLockInfo.js b/Code/WMS/WIDESEA_WMSClient/src/extension/outbound/outStockLockInfo.jsx
similarity index 100%
rename from Code/WMS/WIDESEA_WMSClient/src/extension/outbound/outStockLockInfo.js
rename to Code/WMS/WIDESEA_WMSClient/src/extension/outbound/outStockLockInfo.jsx
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/outbound/outboundOrder.js b/Code/WMS/WIDESEA_WMSClient/src/extension/outbound/outboundOrder.jsx
similarity index 100%
rename from Code/WMS/WIDESEA_WMSClient/src/extension/outbound/outboundOrder.js
rename to Code/WMS/WIDESEA_WMSClient/src/extension/outbound/outboundOrder.jsx
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/outbound/outboundOrderDetail.js b/Code/WMS/WIDESEA_WMSClient/src/extension/outbound/outboundOrderDetail.jsx
similarity index 100%
rename from Code/WMS/WIDESEA_WMSClient/src/extension/outbound/outboundOrderDetail.js
rename to Code/WMS/WIDESEA_WMSClient/src/extension/outbound/outboundOrderDetail.jsx
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/outbound/outboundOrderDetail_Hty.js b/Code/WMS/WIDESEA_WMSClient/src/extension/outbound/outboundOrderDetail_Hty.jsx
similarity index 100%
rename from Code/WMS/WIDESEA_WMSClient/src/extension/outbound/outboundOrderDetail_Hty.js
rename to Code/WMS/WIDESEA_WMSClient/src/extension/outbound/outboundOrderDetail_Hty.jsx
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/outbound/outboundOrder_Hty.js b/Code/WMS/WIDESEA_WMSClient/src/extension/outbound/outboundOrder_Hty.js
deleted file mode 100644
index 8935403..0000000
--- a/Code/WMS/WIDESEA_WMSClient/src/extension/outbound/outboundOrder_Hty.js
+++ /dev/null
@@ -1,75 +0,0 @@
-/*****************************************************************************************
-**  Author:jxx 2022
-**  QQ:283591387
-**瀹屾暣鏂囨。瑙侊細http://v2.volcore.xyz/document/api 銆愪唬鐮佺敓鎴愰〉闈iewGrid銆�
-**甯哥敤绀轰緥瑙侊細http://v2.volcore.xyz/document/vueDev
-**鍚庡彴鎿嶄綔瑙侊細http://v2.volcore.xyz/document/netCoreDev
-*****************************************************************************************/
-//姝s鏂囦欢鏄敤鏉ヨ嚜瀹氫箟鎵╁睍涓氬姟浠g爜锛屽彲浠ユ墿灞曚竴浜涜嚜瀹氫箟椤甸潰鎴栬�呴噸鏂伴厤缃敓鎴愮殑浠g爜
-
-let extension = {
-  components: {
-    //鏌ヨ鐣岄潰鎵╁睍缁勪欢
-    gridHeader: '',
-    gridBody: '',
-    gridFooter: '',
-    //鏂板缓銆佺紪杈戝脊鍑烘鎵╁睍缁勪欢
-    modelHeader: '',
-    modelBody: '',
-    modelFooter: ''
-  },
-  tableAction: '', //鎸囧畾鏌愬紶琛ㄧ殑鏉冮檺(杩欓噷濉啓琛ㄥ悕,榛樿涓嶇敤濉啓)
-  buttons: { view: [], box: [], detail: [] }, //鎵╁睍鐨勬寜閽�
-  methods: {
-     //涓嬮潰杩欎簺鏂规硶鍙互淇濈暀涔熷彲浠ュ垹闄�
-    onInit() {  //妗嗘灦鍒濆鍖栭厤缃墠锛�
-        //绀轰緥锛氬湪鎸夐挳鐨勬渶鍓嶉潰娣诲姞涓�涓寜閽�
-        //   this.buttons.unshift({  //涔熷彲浠ョ敤push鎴栬�卻plice鏂规硶鏉ヤ慨鏀筨uttons鏁扮粍
-        //     name: '鎸夐挳', //鎸夐挳鍚嶇О
-        //     icon: 'el-icon-document', //鎸夐挳鍥炬爣vue2鐗堟湰瑙乮view鏂囨。icon锛寁ue3鐗堟湰瑙乪lement ui鏂囨。icon(娉ㄦ剰涓嶆槸element puls鏂囨。)
-        //     type: 'primary', //鎸夐挳鏍峰紡vue2鐗堟湰瑙乮view鏂囨。button锛寁ue3鐗堟湰瑙乪lement ui鏂囨。button
-        //     onClick: function () {
-        //       this.$Message.success('鐐瑰嚮浜嗘寜閽�');
-        //     }
-        //   });
-
-        //绀轰緥锛氳缃慨鏀规柊寤恒�佺紪杈戝脊鍑烘瀛楁鏍囩鐨勯暱搴�
-        // this.boxOptions.labelWidth = 150;
-    },
-    onInited() {
-      //妗嗘灦鍒濆鍖栭厤缃悗
-      //濡傛灉瑕侀厤缃槑缁嗚〃,鍦ㄦ鏂规硶鎿嶄綔
-      //this.detailOptions.columns.forEach(column=>{ });
-    },
-    searchBefore(param) {
-      //鐣岄潰鏌ヨ鍓�,鍙互缁檖aram.wheres娣诲姞鏌ヨ鍙傛暟
-      //杩斿洖false锛屽垯涓嶄細鎵ц鏌ヨ
-      return true;
-    },
-    searchAfter(result) {
-      //鏌ヨ鍚庯紝result杩斿洖鐨勬煡璇㈡暟鎹�,鍙互鍦ㄦ樉绀哄埌琛ㄦ牸鍓嶅鐞嗚〃鏍肩殑鍊�
-      return true;
-    },
-    addBefore(formData) {
-      //鏂板缓淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛紝鍙互缁欑粰琛ㄥ崟璁剧疆鍊硷紝鑷繁杈撳嚭鐪媐ormData鐨勫��
-      return true;
-    },
-    updateBefore(formData) {
-      //缂栬緫淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛ㄣ�佸垹闄よ鐨処d
-      return true;
-    },
-    rowClick({ row, column, event }) {
-      //鏌ヨ鐣岄潰鐐瑰嚮琛屼簨浠�
-      // this.$refs.table.$refs.table.toggleRowSelection(row); //鍗曞嚮琛屾椂閫変腑褰撳墠琛�;
-    },
-    modelOpenAfter(row) {
-      //鐐瑰嚮缂栬緫銆佹柊寤烘寜閽脊鍑烘鍚庯紝鍙互鍦ㄦ澶勫啓閫昏緫锛屽锛屼粠鍚庡彴鑾峰彇鏁版嵁
-      //(1)鍒ゆ柇鏄紪杈戣繕鏄柊寤烘搷浣滐細 this.currentAction=='Add';
-      //(2)缁欏脊鍑烘璁剧疆榛樿鍊�
-      //(3)this.editFormFields.瀛楁='xxx';
-      //濡傛灉闇�瑕佺粰涓嬫媺妗嗚缃粯璁ゅ�硷紝璇烽亶鍘唗his.editFormOptions鎵惧埌瀛楁閰嶇疆瀵瑰簲data灞炴�х殑key鍊�
-      //鐪嬩笉鎳傚氨鎶婅緭鍑虹湅锛歝onsole.log(this.editFormOptions)
-    }
-  }
-};
-export default extension;
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/outbound/outboundOrderDetail_Hty.js b/Code/WMS/WIDESEA_WMSClient/src/extension/outbound/outboundOrder_Hty.jsx
similarity index 100%
copy from Code/WMS/WIDESEA_WMSClient/src/extension/outbound/outboundOrderDetail_Hty.js
copy to Code/WMS/WIDESEA_WMSClient/src/extension/outbound/outboundOrder_Hty.jsx
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/record/locationStatusChangeRecord.js b/Code/WMS/WIDESEA_WMSClient/src/extension/record/locationStatusChangeRecord.jsx
similarity index 100%
rename from Code/WMS/WIDESEA_WMSClient/src/extension/record/locationStatusChangeRecord.js
rename to Code/WMS/WIDESEA_WMSClient/src/extension/record/locationStatusChangeRecord.jsx
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/record/stockQuantityChangeRecord.js b/Code/WMS/WIDESEA_WMSClient/src/extension/record/stockQuantityChangeRecord.jsx
similarity index 100%
rename from Code/WMS/WIDESEA_WMSClient/src/extension/record/stockQuantityChangeRecord.js
rename to Code/WMS/WIDESEA_WMSClient/src/extension/record/stockQuantityChangeRecord.jsx
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/stock/stock.js b/Code/WMS/WIDESEA_WMSClient/src/extension/stock/stock.jsx
similarity index 100%
rename from Code/WMS/WIDESEA_WMSClient/src/extension/stock/stock.js
rename to Code/WMS/WIDESEA_WMSClient/src/extension/stock/stock.jsx
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/stock/stockChat.js b/Code/WMS/WIDESEA_WMSClient/src/extension/stock/stockChat.jsx
similarity index 100%
rename from Code/WMS/WIDESEA_WMSClient/src/extension/stock/stockChat.js
rename to Code/WMS/WIDESEA_WMSClient/src/extension/stock/stockChat.jsx
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/stock/stockInfo.js b/Code/WMS/WIDESEA_WMSClient/src/extension/stock/stockInfo.js
deleted file mode 100644
index 6292426..0000000
--- a/Code/WMS/WIDESEA_WMSClient/src/extension/stock/stockInfo.js
+++ /dev/null
@@ -1,59 +0,0 @@
-
-//姝s鏂囦欢鏄敤鏉ヨ嚜瀹氫箟鎵╁睍涓氬姟浠g爜锛屽彲浠ユ墿灞曚竴浜涜嚜瀹氫箟椤甸潰鎴栬�呴噸鏂伴厤缃敓鎴愮殑浠g爜
-
-let extension = {
-    components: {
-      //鏌ヨ鐣岄潰鎵╁睍缁勪欢
-      gridHeader: '',
-      gridBody: '',
-      gridFooter: '',
-      //鏂板缓銆佺紪杈戝脊鍑烘鎵╁睍缁勪欢
-      modelHeader: '',
-      modelBody: '',
-      modelFooter: ''
-    },
-    tableAction: '', //鎸囧畾鏌愬紶琛ㄧ殑鏉冮檺(杩欓噷濉啓琛ㄥ悕,榛樿涓嶇敤濉啓)
-    buttons: { view: [], box: [], detail: [] }, //鎵╁睍鐨勬寜閽�
-    methods: {
-       //涓嬮潰杩欎簺鏂规硶鍙互淇濈暀涔熷彲浠ュ垹闄�
-      onInit() {  
-        
-      },
-      onInited() {
-        //妗嗘灦鍒濆鍖栭厤缃悗
-        //濡傛灉瑕侀厤缃槑缁嗚〃,鍦ㄦ鏂规硶鎿嶄綔
-        //this.detailOptions.columns.forEach(column=>{ });
-      },
-      searchBefore(param) {
-        //鐣岄潰鏌ヨ鍓�,鍙互缁檖aram.wheres娣诲姞鏌ヨ鍙傛暟
-        //杩斿洖false锛屽垯涓嶄細鎵ц鏌ヨ
-        return true;
-      },
-      searchAfter(result) {
-        //鏌ヨ鍚庯紝result杩斿洖鐨勬煡璇㈡暟鎹�,鍙互鍦ㄦ樉绀哄埌琛ㄦ牸鍓嶅鐞嗚〃鏍肩殑鍊�
-        return true;
-      },
-      addBefore(formData) {
-        //鏂板缓淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛紝鍙互缁欑粰琛ㄥ崟璁剧疆鍊硷紝鑷繁杈撳嚭鐪媐ormData鐨勫��
-        return true;
-      },
-      updateBefore(formData) {
-        //缂栬緫淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛ㄣ�佸垹闄よ鐨処d
-        return true;
-      },
-      rowClick({ row, column, event }) {
-        //鏌ヨ鐣岄潰鐐瑰嚮琛屼簨浠�
-        this.$refs.table.$refs.table.toggleRowSelection(row); //鍗曞嚮琛屾椂閫変腑褰撳墠琛�;
-      },
-      modelOpenAfter(row) {
-        //鐐瑰嚮缂栬緫銆佹柊寤烘寜閽脊鍑烘鍚庯紝鍙互鍦ㄦ澶勫啓閫昏緫锛屽锛屼粠鍚庡彴鑾峰彇鏁版嵁
-        //(1)鍒ゆ柇鏄紪杈戣繕鏄柊寤烘搷浣滐細 this.currentAction=='Add';
-        //(2)缁欏脊鍑烘璁剧疆榛樿鍊�
-        //(3)this.editFormFields.瀛楁='xxx';
-        //濡傛灉闇�瑕佺粰涓嬫媺妗嗚缃粯璁ゅ�硷紝璇烽亶鍘唗his.editFormOptions鎵惧埌瀛楁閰嶇疆瀵瑰簲data灞炴�х殑key鍊�
-        //鐪嬩笉鎳傚氨鎶婅緭鍑虹湅锛歝onsole.log(this.editFormOptions)
-      }
-    }
-  };
-  export default extension;
-  
\ No newline at end of file
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/stock/stockInfo.jsx b/Code/WMS/WIDESEA_WMSClient/src/extension/stock/stockInfo.jsx
new file mode 100644
index 0000000..809dd5f
--- /dev/null
+++ b/Code/WMS/WIDESEA_WMSClient/src/extension/stock/stockInfo.jsx
@@ -0,0 +1,123 @@
+//姝s鏂囦欢鏄敤鏉ヨ嚜瀹氫箟鎵╁睍涓氬姟浠g爜锛屽彲浠ユ墿灞曚竴浜涜嚜瀹氫箟椤甸潰鎴栬�呴噸鏂伴厤缃敓鎴愮殑浠g爜
+
+let extension = {
+  components: {
+    //鏌ヨ鐣岄潰鎵╁睍缁勪欢
+    gridHeader: '',
+    gridBody: '',
+    gridFooter: '',
+    //鏂板缓銆佺紪杈戝脊鍑烘鎵╁睍缁勪欢
+    modelHeader: '',
+    modelBody: '',
+    modelFooter: ''
+  },
+  tableAction: '',
+  buttons: { view: [], box: [], detail: [] },
+  methods: {
+    onInit() {
+      // 娣诲姞MES鎿嶄綔鍒�
+      this.columns.push({
+        title: '鎿嶄綔',
+        field: '鎿嶄綔',
+        align: 'center',
+        width: 200,
+        fixed: 'right',
+        render: (h, { row, column, index }) => {
+          return (
+            <div>
+              <el-button
+                type="primary"
+                size="small"
+                onClick={($e) => { this.handleInbound(row); }}
+              >杩涚珯</el-button>
+              <el-button
+                type="success"
+                size="small"
+                style="margin-left: 8px"
+                onClick={($e) => { this.handleOutbound(row); }}
+              >鍑虹珯</el-button>
+            </div>
+          );
+        }
+      });
+    },
+
+    // 鎵樼洏杩涚珯鎿嶄綔
+    async handleInbound(row) {
+      try {
+        await this.$confirm(`纭鎵ц鎵樼洏杩涚珯鎿嶄綔锛焅n鎵樼洏缂栧彿锛�${row.palletCode}`, "杩涚珯纭", {
+          confirmButtonText: "纭",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        });
+
+        const result = await this.http.post("/api/StockInfo/inboundInContainer", {
+          palletCode: row.palletCode,
+          stockId: row.id
+        }, "姝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 || "缃戠粶閿欒锛岃绋嶅悗閲嶈瘯");
+        }
+      }
+    },
+
+    // 鎵樼洏鍑虹珯鎿嶄綔
+    async handleOutbound(row) {
+      try {
+        await this.$confirm(`纭鎵ц鎵樼洏鍑虹珯鎿嶄綔锛焅n鎵樼洏缂栧彿锛�${row.palletCode}`, "鍑虹珯纭", {
+          confirmButtonText: "纭",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        });
+
+        const result = await this.http.post("/api/StockInfo/outboundInContainer", {
+          palletCode: row.palletCode,
+          stockId: row.id
+        }, "姝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 || "缃戠粶閿欒锛岃绋嶅悗閲嶈瘯");
+        }
+      }
+    },
+
+    onInited() {
+      // 妗嗘灦鍒濆鍖栭厤缃悗
+    },
+    searchBefore(param) {
+      return true;
+    },
+    searchAfter(result) {
+      return true;
+    },
+    addBefore(formData) {
+      return true;
+    },
+    updateBefore(formData) {
+      return true;
+    },
+    rowClick({ row, column, event }) {
+      this.$refs.table.$refs.table.toggleRowSelection(row);
+    },
+    modelOpenAfter(row) {
+      // 鐐瑰嚮缂栬緫銆佹柊寤烘寜閽脊鍑烘鍚�
+    }
+  }
+};
+
+export default extension;
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/stock/stockInfoDetail.js b/Code/WMS/WIDESEA_WMSClient/src/extension/stock/stockInfoDetail.js
deleted file mode 100644
index 24e1d94..0000000
--- a/Code/WMS/WIDESEA_WMSClient/src/extension/stock/stockInfoDetail.js
+++ /dev/null
@@ -1,58 +0,0 @@
-
-//姝s鏂囦欢鏄敤鏉ヨ嚜瀹氫箟鎵╁睍涓氬姟浠g爜锛屽彲浠ユ墿灞曚竴浜涜嚜瀹氫箟椤甸潰鎴栬�呴噸鏂伴厤缃敓鎴愮殑浠g爜
-
-let extension = {
-    components: {
-      //鏌ヨ鐣岄潰鎵╁睍缁勪欢
-      gridHeader: '',
-      gridBody: '',
-      gridFooter: '',
-      //鏂板缓銆佺紪杈戝脊鍑烘鎵╁睍缁勪欢
-      modelHeader: '',
-      modelBody: '',
-      modelFooter: ''
-    },
-    tableAction: '', //鎸囧畾鏌愬紶琛ㄧ殑鏉冮檺(杩欓噷濉啓琛ㄥ悕,榛樿涓嶇敤濉啓)
-    buttons: { view: [], box: [], detail: [] }, //鎵╁睍鐨勬寜閽�
-    methods: {
-       //涓嬮潰杩欎簺鏂规硶鍙互淇濈暀涔熷彲浠ュ垹闄�
-      onInit() {  
-      },
-      onInited() {
-        //妗嗘灦鍒濆鍖栭厤缃悗
-        //濡傛灉瑕侀厤缃槑缁嗚〃,鍦ㄦ鏂规硶鎿嶄綔
-        //this.detailOptions.columns.forEach(column=>{ });
-      },
-      searchBefore(param) {
-        //鐣岄潰鏌ヨ鍓�,鍙互缁檖aram.wheres娣诲姞鏌ヨ鍙傛暟
-        //杩斿洖false锛屽垯涓嶄細鎵ц鏌ヨ
-        return true;
-      },
-      searchAfter(result) {
-        //鏌ヨ鍚庯紝result杩斿洖鐨勬煡璇㈡暟鎹�,鍙互鍦ㄦ樉绀哄埌琛ㄦ牸鍓嶅鐞嗚〃鏍肩殑鍊�
-        return true;
-      },
-      addBefore(formData) {
-        //鏂板缓淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛紝鍙互缁欑粰琛ㄥ崟璁剧疆鍊硷紝鑷繁杈撳嚭鐪媐ormData鐨勫��
-        return true;
-      },
-      updateBefore(formData) {
-        //缂栬緫淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛ㄣ�佸垹闄よ鐨処d
-        return true;
-      },
-      rowClick({ row, column, event }) {
-        //鏌ヨ鐣岄潰鐐瑰嚮琛屼簨浠�
-        this.$refs.table.$refs.table.toggleRowSelection(row); //鍗曞嚮琛屾椂閫変腑褰撳墠琛�;
-      },
-      modelOpenAfter(row) {
-        //鐐瑰嚮缂栬緫銆佹柊寤烘寜閽脊鍑烘鍚庯紝鍙互鍦ㄦ澶勫啓閫昏緫锛屽锛屼粠鍚庡彴鑾峰彇鏁版嵁
-        //(1)鍒ゆ柇鏄紪杈戣繕鏄柊寤烘搷浣滐細 this.currentAction=='Add';
-        //(2)缁欏脊鍑烘璁剧疆榛樿鍊�
-        //(3)this.editFormFields.瀛楁='xxx';
-        //濡傛灉闇�瑕佺粰涓嬫媺妗嗚缃粯璁ゅ�硷紝璇烽亶鍘唗his.editFormOptions鎵惧埌瀛楁閰嶇疆瀵瑰簲data灞炴�х殑key鍊�
-        //鐪嬩笉鎳傚氨鎶婅緭鍑虹湅锛歝onsole.log(this.editFormOptions)
-      }
-    }
-  };
-  export default extension;
-  
\ No newline at end of file
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/stock/stockInfoDetail.jsx b/Code/WMS/WIDESEA_WMSClient/src/extension/stock/stockInfoDetail.jsx
new file mode 100644
index 0000000..133cbc5
--- /dev/null
+++ b/Code/WMS/WIDESEA_WMSClient/src/extension/stock/stockInfoDetail.jsx
@@ -0,0 +1,170 @@
+//姝s鏂囦欢鏄敤鏉ヨ嚜瀹氫箟鎵╁睍涓氬姟浠g爜锛屽彲浠ユ墿灞曚竴浜涜嚜瀹氫箟椤甸潰鎴栬�呴噸鏂伴厤缃敓鎴愮殑浠g爜
+
+let extension = {
+  components: {
+    //鏌ヨ鐣岄潰鎵╁睍缁勪欢
+    gridHeader: '',
+    gridBody: '',
+    gridFooter: '',
+    //鏂板缓銆佺紪杈戝脊鍑烘鎵╁睍缁勪欢
+    modelHeader: '',
+    modelBody: '',
+    modelFooter: ''
+  },
+  tableAction: '',
+  buttons: { view: [], box: [], detail: [] },
+  methods: {
+    onInit() {
+      // 娣诲姞MES鎿嶄綔鍒�
+      this.columns.push({
+        title: '鎿嶄綔',
+        field: '鎿嶄綔',
+        align: 'center',
+        width: 280,
+        fixed: 'right',
+        render: (h, { row, column, index }) => {
+          // 閿佸畾鐘舵�佷笉鏄剧ず鎸夐挳
+          // 鐘舵��: 7=鍑哄簱閿佸畾, 9=绉诲簱閿佸畾, 99=缁勭洏鎾ら攢, 199=鍏ュ簱鎾ら攢
+          const lockedStatuses = [7, 9, 99, 199];
+          if (lockedStatuses.includes(row.status)) {
+            return <span style="color: #909399">鏆傛棤鍙墽琛屾搷浣�</span>;
+          }
+
+          return (
+            <div>
+              <el-button
+                type="primary"
+                size="small"
+                onClick={($e) => { this.handleBind(row); }}
+              >缁戝畾</el-button>
+              <el-button
+                type="warning"
+                size="small"
+                style="margin-left: 6px"
+                onClick={($e) => { this.handleUnbind(row); }}
+              >瑙g粦</el-button>
+              <el-button
+                type="danger"
+                size="small"
+                style="margin-left: 6px"
+                onClick={($e) => { this.handleNgReport(row); }}
+              >NG涓婃姤</el-button>
+            </div>
+          );
+        }
+      });
+    },
+
+    // 鎵樼洏鐢佃姱缁戝畾鎿嶄綔
+    async handleBind(row) {
+      try {
+        await this.$confirm(`纭鎵ц鐢佃姱缁戝畾鎿嶄綔锛焅n鐢佃姱鐮侊細${row.serialNumber}`, "缁戝畾纭", {
+          confirmButtonText: "纭",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        });
+
+        const result = await this.http.post("/api/StockInfoDetail/bindContainer", {
+          palletCode: row.palletCode || "P001",
+          sfcList: [row.serialNumber],
+          location: row.location || "",
+          operationType: 1
+        }, "姝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 || "缃戠粶閿欒锛岃绋嶅悗閲嶈瘯");
+        }
+      }
+    },
+
+    // 鎵樼洏鐢佃姱瑙g粦鎿嶄綔
+    async handleUnbind(row) {
+      try {
+        await this.$confirm(`纭鎵ц鐢佃姱瑙g粦鎿嶄綔锛焅n鐢佃姱鐮侊細${row.serialNumber}`, "瑙g粦纭", {
+          confirmButtonText: "纭",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        });
+
+        const result = await this.http.post("/api/StockInfoDetail/unbindContainer", {
+          palletCode: row.palletCode || "P001",
+          sfcList: [row.serialNumber]
+        }, "姝e湪璋冪敤MES鎺ュ彛...");
+
+        if (result.status) {
+          this.$Message.success(result.message || "鐢佃姱瑙g粦鎴愬姛");
+          this.$refs.table.load();
+        } else {
+          this.$error(result.message || "鐢佃姱瑙g粦澶辫触");
+        }
+      } catch (error) {
+        if (error !== "cancel") {
+          this.$error(error.message || "缃戠粶閿欒锛岃绋嶅悗閲嶈瘯");
+        }
+      }
+    },
+
+    // 鎵樼洏NG鐢佃姱涓婃姤鎿嶄綔
+    async handleNgReport(row) {
+      try {
+        await this.$confirm(`纭鎵цNG鐢佃姱涓婃姤鎿嶄綔锛焅n鐢佃姱鐮侊細${row.serialNumber}`, "NG涓婃姤纭", {
+          confirmButtonText: "纭",
+          cancelButtonText: "鍙栨秷",
+          type: "warning"
+        });
+
+        const result = await this.http.post("/api/StockInfoDetail/containerNgReport", {
+          palletCode: row.palletCode || "P001",
+          ngSfcList: [{
+            sfc: row.serialNumber,
+            ngCode: "NG001",
+            ngEquipmentCode: "WCS_001",
+            ngResourceCode: "RESOURCE_001"
+          }]
+        }, "姝e湪璋冪敤MES鎺ュ彛...");
+
+        if (result.status) {
+          this.$Message.success(result.message || "NG涓婃姤鎴愬姛");
+          this.$refs.table.load();
+        } else {
+          this.$error(result.message || "NG涓婃姤澶辫触");
+        }
+      } catch (error) {
+        if (error !== "cancel") {
+          this.$error(error.message || "缃戠粶閿欒锛岃绋嶅悗閲嶈瘯");
+        }
+      }
+    },
+
+    onInited() {
+      // 妗嗘灦鍒濆鍖栭厤缃悗
+    },
+    searchBefore(param) {
+      return true;
+    },
+    searchAfter(result) {
+      return true;
+    },
+    addBefore(formData) {
+      return true;
+    },
+    updateBefore(formData) {
+      return true;
+    },
+    rowClick({ row, column, event }) {
+      this.$refs.table.$refs.table.toggleRowSelection(row);
+    },
+    modelOpenAfter(row) {
+      // 鐐瑰嚮缂栬緫銆佹柊寤烘寜閽脊鍑烘鍚�
+    }
+  }
+};
+
+export default extension;
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/stock/stockInfoDetail_Hty.js b/Code/WMS/WIDESEA_WMSClient/src/extension/stock/stockInfoDetail_Hty.jsx
similarity index 100%
rename from Code/WMS/WIDESEA_WMSClient/src/extension/stock/stockInfoDetail_Hty.js
rename to Code/WMS/WIDESEA_WMSClient/src/extension/stock/stockInfoDetail_Hty.jsx
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/stock/stockInfo_Hty.js b/Code/WMS/WIDESEA_WMSClient/src/extension/stock/stockInfo_Hty.js
deleted file mode 100644
index 8935403..0000000
--- a/Code/WMS/WIDESEA_WMSClient/src/extension/stock/stockInfo_Hty.js
+++ /dev/null
@@ -1,75 +0,0 @@
-/*****************************************************************************************
-**  Author:jxx 2022
-**  QQ:283591387
-**瀹屾暣鏂囨。瑙侊細http://v2.volcore.xyz/document/api 銆愪唬鐮佺敓鎴愰〉闈iewGrid銆�
-**甯哥敤绀轰緥瑙侊細http://v2.volcore.xyz/document/vueDev
-**鍚庡彴鎿嶄綔瑙侊細http://v2.volcore.xyz/document/netCoreDev
-*****************************************************************************************/
-//姝s鏂囦欢鏄敤鏉ヨ嚜瀹氫箟鎵╁睍涓氬姟浠g爜锛屽彲浠ユ墿灞曚竴浜涜嚜瀹氫箟椤甸潰鎴栬�呴噸鏂伴厤缃敓鎴愮殑浠g爜
-
-let extension = {
-  components: {
-    //鏌ヨ鐣岄潰鎵╁睍缁勪欢
-    gridHeader: '',
-    gridBody: '',
-    gridFooter: '',
-    //鏂板缓銆佺紪杈戝脊鍑烘鎵╁睍缁勪欢
-    modelHeader: '',
-    modelBody: '',
-    modelFooter: ''
-  },
-  tableAction: '', //鎸囧畾鏌愬紶琛ㄧ殑鏉冮檺(杩欓噷濉啓琛ㄥ悕,榛樿涓嶇敤濉啓)
-  buttons: { view: [], box: [], detail: [] }, //鎵╁睍鐨勬寜閽�
-  methods: {
-     //涓嬮潰杩欎簺鏂规硶鍙互淇濈暀涔熷彲浠ュ垹闄�
-    onInit() {  //妗嗘灦鍒濆鍖栭厤缃墠锛�
-        //绀轰緥锛氬湪鎸夐挳鐨勬渶鍓嶉潰娣诲姞涓�涓寜閽�
-        //   this.buttons.unshift({  //涔熷彲浠ョ敤push鎴栬�卻plice鏂规硶鏉ヤ慨鏀筨uttons鏁扮粍
-        //     name: '鎸夐挳', //鎸夐挳鍚嶇О
-        //     icon: 'el-icon-document', //鎸夐挳鍥炬爣vue2鐗堟湰瑙乮view鏂囨。icon锛寁ue3鐗堟湰瑙乪lement ui鏂囨。icon(娉ㄦ剰涓嶆槸element puls鏂囨。)
-        //     type: 'primary', //鎸夐挳鏍峰紡vue2鐗堟湰瑙乮view鏂囨。button锛寁ue3鐗堟湰瑙乪lement ui鏂囨。button
-        //     onClick: function () {
-        //       this.$Message.success('鐐瑰嚮浜嗘寜閽�');
-        //     }
-        //   });
-
-        //绀轰緥锛氳缃慨鏀规柊寤恒�佺紪杈戝脊鍑烘瀛楁鏍囩鐨勯暱搴�
-        // this.boxOptions.labelWidth = 150;
-    },
-    onInited() {
-      //妗嗘灦鍒濆鍖栭厤缃悗
-      //濡傛灉瑕侀厤缃槑缁嗚〃,鍦ㄦ鏂规硶鎿嶄綔
-      //this.detailOptions.columns.forEach(column=>{ });
-    },
-    searchBefore(param) {
-      //鐣岄潰鏌ヨ鍓�,鍙互缁檖aram.wheres娣诲姞鏌ヨ鍙傛暟
-      //杩斿洖false锛屽垯涓嶄細鎵ц鏌ヨ
-      return true;
-    },
-    searchAfter(result) {
-      //鏌ヨ鍚庯紝result杩斿洖鐨勬煡璇㈡暟鎹�,鍙互鍦ㄦ樉绀哄埌琛ㄦ牸鍓嶅鐞嗚〃鏍肩殑鍊�
-      return true;
-    },
-    addBefore(formData) {
-      //鏂板缓淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛紝鍙互缁欑粰琛ㄥ崟璁剧疆鍊硷紝鑷繁杈撳嚭鐪媐ormData鐨勫��
-      return true;
-    },
-    updateBefore(formData) {
-      //缂栬緫淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛ㄣ�佸垹闄よ鐨処d
-      return true;
-    },
-    rowClick({ row, column, event }) {
-      //鏌ヨ鐣岄潰鐐瑰嚮琛屼簨浠�
-      // this.$refs.table.$refs.table.toggleRowSelection(row); //鍗曞嚮琛屾椂閫変腑褰撳墠琛�;
-    },
-    modelOpenAfter(row) {
-      //鐐瑰嚮缂栬緫銆佹柊寤烘寜閽脊鍑烘鍚庯紝鍙互鍦ㄦ澶勫啓閫昏緫锛屽锛屼粠鍚庡彴鑾峰彇鏁版嵁
-      //(1)鍒ゆ柇鏄紪杈戣繕鏄柊寤烘搷浣滐細 this.currentAction=='Add';
-      //(2)缁欏脊鍑烘璁剧疆榛樿鍊�
-      //(3)this.editFormFields.瀛楁='xxx';
-      //濡傛灉闇�瑕佺粰涓嬫媺妗嗚缃粯璁ゅ�硷紝璇烽亶鍘唗his.editFormOptions鎵惧埌瀛楁閰嶇疆瀵瑰簲data灞炴�х殑key鍊�
-      //鐪嬩笉鎳傚氨鎶婅緭鍑虹湅锛歝onsole.log(this.editFormOptions)
-    }
-  }
-};
-export default extension;
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/stock/stockInfoDetail_Hty.js b/Code/WMS/WIDESEA_WMSClient/src/extension/stock/stockInfo_Hty.jsx
similarity index 100%
copy from Code/WMS/WIDESEA_WMSClient/src/extension/stock/stockInfoDetail_Hty.js
copy to Code/WMS/WIDESEA_WMSClient/src/extension/stock/stockInfo_Hty.jsx
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/stock/stockView.js b/Code/WMS/WIDESEA_WMSClient/src/extension/stock/stockView.jsx
similarity index 100%
rename from Code/WMS/WIDESEA_WMSClient/src/extension/stock/stockView.js
rename to Code/WMS/WIDESEA_WMSClient/src/extension/stock/stockView.jsx
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Dictionary.js b/Code/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Dictionary.jsx
similarity index 100%
rename from Code/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Dictionary.js
rename to Code/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Dictionary.jsx
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/system/Sys_DictionaryList.js b/Code/WMS/WIDESEA_WMSClient/src/extension/system/Sys_DictionaryList.jsx
similarity index 100%
rename from Code/WMS/WIDESEA_WMSClient/src/extension/system/Sys_DictionaryList.js
rename to Code/WMS/WIDESEA_WMSClient/src/extension/system/Sys_DictionaryList.jsx
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Log.js b/Code/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Log.jsx
similarity index 100%
rename from Code/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Log.js
rename to Code/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Log.jsx
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Role.js b/Code/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Role.jsx
similarity index 100%
rename from Code/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Role.js
rename to Code/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Role.jsx
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Role1.js b/Code/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Role1.jsx
similarity index 100%
rename from Code/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Role1.js
rename to Code/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Role1.jsx
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Tenant.js b/Code/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Tenant.jsx
similarity index 100%
rename from Code/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Tenant.js
rename to Code/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Tenant.jsx
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/system/Sys_User.js b/Code/WMS/WIDESEA_WMSClient/src/extension/system/Sys_User.jsx
similarity index 100%
rename from Code/WMS/WIDESEA_WMSClient/src/extension/system/Sys_User.js
rename to Code/WMS/WIDESEA_WMSClient/src/extension/system/Sys_User.jsx
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/system/system/Sys_Department.js b/Code/WMS/WIDESEA_WMSClient/src/extension/system/system/Sys_Department.jsx
similarity index 100%
rename from Code/WMS/WIDESEA_WMSClient/src/extension/system/system/Sys_Department.js
rename to Code/WMS/WIDESEA_WMSClient/src/extension/system/system/Sys_Department.jsx
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/taskinfo/task.js b/Code/WMS/WIDESEA_WMSClient/src/extension/taskinfo/task.jsx
similarity index 100%
rename from Code/WMS/WIDESEA_WMSClient/src/extension/taskinfo/task.js
rename to Code/WMS/WIDESEA_WMSClient/src/extension/taskinfo/task.jsx
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/taskinfo/task_hty.js b/Code/WMS/WIDESEA_WMSClient/src/extension/taskinfo/task_hty.jsx
similarity index 100%
rename from Code/WMS/WIDESEA_WMSClient/src/extension/taskinfo/task_hty.js
rename to Code/WMS/WIDESEA_WMSClient/src/extension/taskinfo/task_hty.jsx
diff --git a/Code/WMS/WIDESEA_WMSClient/src/views/basic/customerInfo.vue b/Code/WMS/WIDESEA_WMSClient/src/views/basic/customerInfo.vue
index 7ee104e..4fd63d2 100644
--- a/Code/WMS/WIDESEA_WMSClient/src/views/basic/customerInfo.vue
+++ b/Code/WMS/WIDESEA_WMSClient/src/views/basic/customerInfo.vue
@@ -17,7 +17,7 @@
     </view-grid>
 </template>
 <script>
-    import extend from "@/extension/basic/customerInfo.js";
+    import extend from "@/extension/basic/customerInfo.jsx";
     import { ref, defineComponent } from "vue";
     export default defineComponent({
         setup() {
diff --git a/Code/WMS/WIDESEA_WMSClient/src/views/basic/locationInfo.vue b/Code/WMS/WIDESEA_WMSClient/src/views/basic/locationInfo.vue
index 24a53e1..43d8a94 100644
--- a/Code/WMS/WIDESEA_WMSClient/src/views/basic/locationInfo.vue
+++ b/Code/WMS/WIDESEA_WMSClient/src/views/basic/locationInfo.vue
@@ -14,7 +14,7 @@
   </view-grid>
 </template>
     <script>
-import extend from "@/extension/basic/locationInfo.js";
+import extend from "@/extension/basic/locationInfo.jsx";
 import { ref, defineComponent } from "vue";
 export default defineComponent({
   setup() {
diff --git a/Code/WMS/WIDESEA_WMSClient/src/views/basic/materielCodeInfo.vue b/Code/WMS/WIDESEA_WMSClient/src/views/basic/materielCodeInfo.vue
index bb374b8..c4d4cc0 100644
--- a/Code/WMS/WIDESEA_WMSClient/src/views/basic/materielCodeInfo.vue
+++ b/Code/WMS/WIDESEA_WMSClient/src/views/basic/materielCodeInfo.vue
@@ -14,7 +14,7 @@
   </view-grid>
 </template>
       <script>
-import extend from "@/extension/basic/materielCodeInfo.js";
+import extend from "@/extension/basic/materielCodeInfo.jsx";
 import { ref, defineComponent } from "vue";
 export default defineComponent({
   setup() {
diff --git a/Code/WMS/WIDESEA_WMSClient/src/views/basic/materielInfo.vue b/Code/WMS/WIDESEA_WMSClient/src/views/basic/materielInfo.vue
index aaacaa0..f0eb4b8 100644
--- a/Code/WMS/WIDESEA_WMSClient/src/views/basic/materielInfo.vue
+++ b/Code/WMS/WIDESEA_WMSClient/src/views/basic/materielInfo.vue
@@ -14,7 +14,7 @@
   </view-grid>
 </template>
     <script>
-import extend from "@/extension/basic/materielInfo.js";
+import extend from "@/extension/basic/materielInfo.jsx";
 import { ref, defineComponent } from "vue";
 export default defineComponent({
   setup() {
diff --git a/Code/WMS/WIDESEA_WMSClient/src/views/basic/palletCodeInfo.vue b/Code/WMS/WIDESEA_WMSClient/src/views/basic/palletCodeInfo.vue
index bcdf2bc..9201017 100644
--- a/Code/WMS/WIDESEA_WMSClient/src/views/basic/palletCodeInfo.vue
+++ b/Code/WMS/WIDESEA_WMSClient/src/views/basic/palletCodeInfo.vue
@@ -14,7 +14,7 @@
   </view-grid>
 </template>
       <script>
-import extend from "@/extension/basic/palletCodeInfo.js";
+import extend from "@/extension/basic/palletCodeInfo.jsx";
 import { ref, defineComponent } from "vue";
 export default defineComponent({
   setup() {
diff --git a/Code/WMS/WIDESEA_WMSClient/src/views/basic/supplierInfo.vue b/Code/WMS/WIDESEA_WMSClient/src/views/basic/supplierInfo.vue
index 402798a..e5f73bc 100644
--- a/Code/WMS/WIDESEA_WMSClient/src/views/basic/supplierInfo.vue
+++ b/Code/WMS/WIDESEA_WMSClient/src/views/basic/supplierInfo.vue
@@ -17,7 +17,7 @@
     </view-grid>
 </template>
 <script>
-    import extend from "@/extension/basic/supplierInfo.js";
+    import extend from "@/extension/basic/supplierInfo.jsx";
     import { ref, defineComponent } from "vue";
     export default defineComponent({
         setup() {
diff --git a/Code/WMS/WIDESEA_WMSClient/src/views/basic/userInfo.vue b/Code/WMS/WIDESEA_WMSClient/src/views/basic/userInfo.vue
index 5aa50c2..d041064 100644
--- a/Code/WMS/WIDESEA_WMSClient/src/views/basic/userInfo.vue
+++ b/Code/WMS/WIDESEA_WMSClient/src/views/basic/userInfo.vue
@@ -17,7 +17,7 @@
     </view-grid>
 </template>
 <script>
-    import extend from "@/extension/basic/userInfo.js";
+    import extend from "@/extension/basic/userInfo.jsx";
     import { ref, defineComponent } from "vue";
     export default defineComponent({
         setup() {
diff --git a/Code/WMS/WIDESEA_WMSClient/src/views/basic/warehouse.vue b/Code/WMS/WIDESEA_WMSClient/src/views/basic/warehouse.vue
index 83c3c29..6a9765c 100644
--- a/Code/WMS/WIDESEA_WMSClient/src/views/basic/warehouse.vue
+++ b/Code/WMS/WIDESEA_WMSClient/src/views/basic/warehouse.vue
@@ -14,7 +14,7 @@
   </view-grid>
 </template>
     <script>
-import extend from "@/extension/basic/warehouse.js";
+import extend from "@/extension/basic/warehouse.jsx";
 import { ref, defineComponent } from "vue";
 export default defineComponent({
   setup() {
diff --git a/Code/WMS/WIDESEA_WMSClient/src/views/check/checkOrder.vue b/Code/WMS/WIDESEA_WMSClient/src/views/check/checkOrder.vue
index 41ee0fc..fc35fe8 100644
--- a/Code/WMS/WIDESEA_WMSClient/src/views/check/checkOrder.vue
+++ b/Code/WMS/WIDESEA_WMSClient/src/views/check/checkOrder.vue
@@ -17,7 +17,7 @@
     </view-grid>
 </template>
 <script>
-    import extend from "@/extension/check/checkOrder.js";
+    import extend from "@/extension/check/checkOrder.jsx";
     import { ref, defineComponent } from "vue";
     export default defineComponent({
         setup() {
diff --git a/Code/WMS/WIDESEA_WMSClient/src/views/check/checkOrderResult.vue b/Code/WMS/WIDESEA_WMSClient/src/views/check/checkOrderResult.vue
index 74b1d89..f1e0738 100644
--- a/Code/WMS/WIDESEA_WMSClient/src/views/check/checkOrderResult.vue
+++ b/Code/WMS/WIDESEA_WMSClient/src/views/check/checkOrderResult.vue
@@ -17,7 +17,7 @@
     </view-grid>
 </template>
 <script>
-    import extend from "@/extension/check/checkOrderResult.js";
+    import extend from "@/extension/check/checkOrderResult.jsx";
     import { ref, defineComponent } from "vue";
     export default defineComponent({
         setup() {
diff --git a/Code/WMS/WIDESEA_WMSClient/src/views/inbound/inboundOrder.vue b/Code/WMS/WIDESEA_WMSClient/src/views/inbound/inboundOrder.vue
index 0f6b3d0..cca7868 100644
--- a/Code/WMS/WIDESEA_WMSClient/src/views/inbound/inboundOrder.vue
+++ b/Code/WMS/WIDESEA_WMSClient/src/views/inbound/inboundOrder.vue
@@ -14,7 +14,7 @@
   </view-grid>
 </template>
     <script>
-import extend from "@/extension/inbound/inboundOrder.js";
+import extend from "@/extension/inbound/inboundOrder.jsx";
 import { ref, defineComponent } from "vue";
 export default defineComponent({
   setup() {
diff --git a/Code/WMS/WIDESEA_WMSClient/src/views/inbound/inboundOrderDetail.vue b/Code/WMS/WIDESEA_WMSClient/src/views/inbound/inboundOrderDetail.vue
index 5046820..2582caa 100644
--- a/Code/WMS/WIDESEA_WMSClient/src/views/inbound/inboundOrderDetail.vue
+++ b/Code/WMS/WIDESEA_WMSClient/src/views/inbound/inboundOrderDetail.vue
@@ -14,7 +14,7 @@
     </view-grid>
   </template>
     <script>
-  import extend from "@/extension/inbound/inboundOrderDetail.js";
+  import extend from "@/extension/inbound/inboundOrderDetail.jsx";
   import { ref, defineComponent } from "vue";
   export default defineComponent({
     setup() {
diff --git a/Code/WMS/WIDESEA_WMSClient/src/views/inbound/inboundOrderDetail_Hty.vue b/Code/WMS/WIDESEA_WMSClient/src/views/inbound/inboundOrderDetail_Hty.vue
index fece3a0..6587279 100644
--- a/Code/WMS/WIDESEA_WMSClient/src/views/inbound/inboundOrderDetail_Hty.vue
+++ b/Code/WMS/WIDESEA_WMSClient/src/views/inbound/inboundOrderDetail_Hty.vue
@@ -17,7 +17,7 @@
     </view-grid>
 </template>
 <script>
-    import extend from "@/extension/inbound/inboundOrderDetail_Hty.js";
+    import extend from "@/extension/inbound/inboundOrderDetail_Hty.jsx";
     import { ref, defineComponent } from "vue";
     export default defineComponent({
         setup() {
diff --git a/Code/WMS/WIDESEA_WMSClient/src/views/inbound/inboundOrder_Hty.vue b/Code/WMS/WIDESEA_WMSClient/src/views/inbound/inboundOrder_Hty.vue
index 749258e..fd04442 100644
--- a/Code/WMS/WIDESEA_WMSClient/src/views/inbound/inboundOrder_Hty.vue
+++ b/Code/WMS/WIDESEA_WMSClient/src/views/inbound/inboundOrder_Hty.vue
@@ -17,7 +17,7 @@
     </view-grid>
 </template>
 <script>
-    import extend from "@/extension/inbound/inboundOrder_Hty.js";
+    import extend from "@/extension/inbound/inboundOrder_Hty.jsx";
     import { ref, defineComponent } from "vue";
     export default defineComponent({
         setup() {
diff --git a/Code/WMS/WIDESEA_WMSClient/src/views/inbound/purchaseOrder.vue b/Code/WMS/WIDESEA_WMSClient/src/views/inbound/purchaseOrder.vue
index 8851231..97e11bc 100644
--- a/Code/WMS/WIDESEA_WMSClient/src/views/inbound/purchaseOrder.vue
+++ b/Code/WMS/WIDESEA_WMSClient/src/views/inbound/purchaseOrder.vue
@@ -14,7 +14,7 @@
   </view-grid>
 </template>
     <script>
-import extend from "@/extension/inbound/purchaseOrder.js";
+import extend from "@/extension/inbound/purchaseOrder.jsx";
 import { ref, defineComponent } from "vue";
 export default defineComponent({
   setup() {
diff --git a/Code/WMS/WIDESEA_WMSClient/src/views/inbound/purchaseOrderDetail.vue b/Code/WMS/WIDESEA_WMSClient/src/views/inbound/purchaseOrderDetail.vue
index 6161c3a..ca43a0a 100644
--- a/Code/WMS/WIDESEA_WMSClient/src/views/inbound/purchaseOrderDetail.vue
+++ b/Code/WMS/WIDESEA_WMSClient/src/views/inbound/purchaseOrderDetail.vue
@@ -17,7 +17,7 @@
     </view-grid>
 </template>
 <script>
-    import extend from "@/extension/inbound/purchaseOrderDetail.js";
+    import extend from "@/extension/inbound/purchaseOrderDetail.jsx";
     import { ref, defineComponent } from "vue";
     export default defineComponent({
         setup() {
diff --git a/Code/WMS/WIDESEA_WMSClient/src/views/inbound/receiveOrder.vue b/Code/WMS/WIDESEA_WMSClient/src/views/inbound/receiveOrder.vue
index 4d9407f..c849a33 100644
--- a/Code/WMS/WIDESEA_WMSClient/src/views/inbound/receiveOrder.vue
+++ b/Code/WMS/WIDESEA_WMSClient/src/views/inbound/receiveOrder.vue
@@ -14,7 +14,7 @@
   </view-grid>
 </template>
       <script>
-import extend from "@/extension/inbound/receiveOrder.js";
+import extend from "@/extension/inbound/receiveOrder.jsx";
 import { ref, defineComponent } from "vue";
 export default defineComponent({
   setup() {
diff --git a/Code/WMS/WIDESEA_WMSClient/src/views/inbound/receiveOrderDetail.vue b/Code/WMS/WIDESEA_WMSClient/src/views/inbound/receiveOrderDetail.vue
index c27198a..64c34c5 100644
--- a/Code/WMS/WIDESEA_WMSClient/src/views/inbound/receiveOrderDetail.vue
+++ b/Code/WMS/WIDESEA_WMSClient/src/views/inbound/receiveOrderDetail.vue
@@ -17,7 +17,7 @@
     </view-grid>
 </template>
 <script>
-    import extend from "@/extension/inbound/receiveOrderDetail.js";
+    import extend from "@/extension/inbound/receiveOrderDetail.jsx";
     import { ref, defineComponent } from "vue";
     export default defineComponent({
         setup() {
diff --git a/Code/WMS/WIDESEA_WMSClient/src/views/outbound/mesOutboundOrder.vue b/Code/WMS/WIDESEA_WMSClient/src/views/outbound/mesOutboundOrder.vue
index e5c696c..7cfdefb 100644
--- a/Code/WMS/WIDESEA_WMSClient/src/views/outbound/mesOutboundOrder.vue
+++ b/Code/WMS/WIDESEA_WMSClient/src/views/outbound/mesOutboundOrder.vue
@@ -14,7 +14,7 @@
     </view-grid>
   </template>
     <script>
-  import extend from "@/extension/outbound/mesOutboundOrder.js";
+  import extend from "@/extension/outbound/mesOutboundOrder.jsx";
   import { ref, defineComponent } from "vue";
   export default defineComponent({
     setup() {
diff --git a/Code/WMS/WIDESEA_WMSClient/src/views/outbound/outStockLockInfo.vue b/Code/WMS/WIDESEA_WMSClient/src/views/outbound/outStockLockInfo.vue
index 4467fac..2670039 100644
--- a/Code/WMS/WIDESEA_WMSClient/src/views/outbound/outStockLockInfo.vue
+++ b/Code/WMS/WIDESEA_WMSClient/src/views/outbound/outStockLockInfo.vue
@@ -13,7 +13,7 @@
   </view-grid>
 </template>
 <script>
-import extend from "@/extension/outbound/outStockLockInfo.js";
+import extend from "@/extension/outbound/outStockLockInfo.jsx";
 import { ref, defineComponent } from "vue";
 
 export default defineComponent({
diff --git a/Code/WMS/WIDESEA_WMSClient/src/views/outbound/outboundOrder.vue b/Code/WMS/WIDESEA_WMSClient/src/views/outbound/outboundOrder.vue
index 0fe8eda..dd003f6 100644
--- a/Code/WMS/WIDESEA_WMSClient/src/views/outbound/outboundOrder.vue
+++ b/Code/WMS/WIDESEA_WMSClient/src/views/outbound/outboundOrder.vue
@@ -14,7 +14,7 @@
   </view-grid>
 </template>
     <script>
-import extend from "@/extension/outbound/outboundOrder.js";
+import extend from "@/extension/outbound/outboundOrder.jsx";
 import { ref, defineComponent } from "vue";
 export default defineComponent({
   setup() {
diff --git a/Code/WMS/WIDESEA_WMSClient/src/views/outbound/outboundOrderDetail.vue b/Code/WMS/WIDESEA_WMSClient/src/views/outbound/outboundOrderDetail.vue
index e992c4c..2bc08af 100644
--- a/Code/WMS/WIDESEA_WMSClient/src/views/outbound/outboundOrderDetail.vue
+++ b/Code/WMS/WIDESEA_WMSClient/src/views/outbound/outboundOrderDetail.vue
@@ -14,7 +14,7 @@
     </view-grid>
   </template>
     <script>
-  import extend from "@/extension/outbound/outboundOrderDetail.js";
+  import extend from "@/extension/outbound/outboundOrderDetail.jsx";
   import { ref, defineComponent } from "vue";
   export default defineComponent({
     setup() {
diff --git a/Code/WMS/WIDESEA_WMSClient/src/views/outbound/outboundOrderDetail_Hty.vue b/Code/WMS/WIDESEA_WMSClient/src/views/outbound/outboundOrderDetail_Hty.vue
index 704e977..b2982b6 100644
--- a/Code/WMS/WIDESEA_WMSClient/src/views/outbound/outboundOrderDetail_Hty.vue
+++ b/Code/WMS/WIDESEA_WMSClient/src/views/outbound/outboundOrderDetail_Hty.vue
@@ -17,7 +17,7 @@
     </view-grid>
 </template>
 <script>
-    import extend from "@/extension/outbound/outboundOrderDetail_Hty.js";
+    import extend from "@/extension/outbound/outboundOrderDetail_Hty.jsx";
     import { ref, defineComponent } from "vue";
     export default defineComponent({
         setup() {
diff --git a/Code/WMS/WIDESEA_WMSClient/src/views/outbound/outboundOrder_Hty.vue b/Code/WMS/WIDESEA_WMSClient/src/views/outbound/outboundOrder_Hty.vue
index 7019c6c..b3e00a2 100644
--- a/Code/WMS/WIDESEA_WMSClient/src/views/outbound/outboundOrder_Hty.vue
+++ b/Code/WMS/WIDESEA_WMSClient/src/views/outbound/outboundOrder_Hty.vue
@@ -17,7 +17,7 @@
     </view-grid>
 </template>
 <script>
-    import extend from "@/extension/outbound/outboundOrder_Hty.js";
+    import extend from "@/extension/outbound/outboundOrder_Hty.jsx";
     import { ref, defineComponent } from "vue";
     export default defineComponent({
         setup() {
diff --git a/Code/WMS/WIDESEA_WMSClient/src/views/record/locationStatusChangeRecord.vue b/Code/WMS/WIDESEA_WMSClient/src/views/record/locationStatusChangeRecord.vue
index a22ee58..000ebdf 100644
--- a/Code/WMS/WIDESEA_WMSClient/src/views/record/locationStatusChangeRecord.vue
+++ b/Code/WMS/WIDESEA_WMSClient/src/views/record/locationStatusChangeRecord.vue
@@ -14,7 +14,7 @@
   </view-grid>
 </template>
     <script>
-import extend from "@/extension/record/locationStatusChangeRecord.js";
+import extend from "@/extension/record/locationStatusChangeRecord.jsx";
 import { ref, defineComponent } from "vue";
 export default defineComponent({
   setup() {
diff --git a/Code/WMS/WIDESEA_WMSClient/src/views/record/stockQuantityChangeRecord.vue b/Code/WMS/WIDESEA_WMSClient/src/views/record/stockQuantityChangeRecord.vue
index f7d65a4..e766e02 100644
--- a/Code/WMS/WIDESEA_WMSClient/src/views/record/stockQuantityChangeRecord.vue
+++ b/Code/WMS/WIDESEA_WMSClient/src/views/record/stockQuantityChangeRecord.vue
@@ -14,7 +14,7 @@
     </view-grid>
   </template>
     <script>
-  import extend from "@/extension/record/stockQuantityChangeRecord.js";
+  import extend from "@/extension/record/stockQuantityChangeRecord.jsx";
   import { ref, defineComponent } from "vue";
   export default defineComponent({
     setup() {
diff --git a/Code/WMS/WIDESEA_WMSClient/src/views/stock/stock.vue b/Code/WMS/WIDESEA_WMSClient/src/views/stock/stock.vue
index 006da06..de52fbf 100644
--- a/Code/WMS/WIDESEA_WMSClient/src/views/stock/stock.vue
+++ b/Code/WMS/WIDESEA_WMSClient/src/views/stock/stock.vue
@@ -13,7 +13,7 @@
   </view-grid>
 </template>
 <script>
-import extend from "@/extension/stock/stock.js";
+import extend from "@/extension/stock/stock.jsx";
 import { ref, defineComponent } from "vue";
 
 export default defineComponent({
diff --git a/Code/WMS/WIDESEA_WMSClient/src/views/stock/stockInfo.vue b/Code/WMS/WIDESEA_WMSClient/src/views/stock/stockInfo.vue
index 96fae1f..10e9364 100644
--- a/Code/WMS/WIDESEA_WMSClient/src/views/stock/stockInfo.vue
+++ b/Code/WMS/WIDESEA_WMSClient/src/views/stock/stockInfo.vue
@@ -15,7 +15,7 @@
 </template>
 
 <script>
-import extend from "@/extension/stock/stockInfo.js";
+import extend from "@/extension/stock/stockInfo.jsx";
 import {
   defineComponent,
   getCurrentInstance,
diff --git a/Code/WMS/WIDESEA_WMSClient/src/views/stock/stockInfoDetail.vue b/Code/WMS/WIDESEA_WMSClient/src/views/stock/stockInfoDetail.vue
index 0b94c04..214d65f 100644
--- a/Code/WMS/WIDESEA_WMSClient/src/views/stock/stockInfoDetail.vue
+++ b/Code/WMS/WIDESEA_WMSClient/src/views/stock/stockInfoDetail.vue
@@ -5,7 +5,7 @@
   </view-grid>
 </template>
 <script>
-import extend from "@/extension/stock/stockInfoDetail.js";
+import extend from "@/extension/stock/stockInfoDetail.jsx";
 import { ref, defineComponent } from "vue";
 export default defineComponent({
   setup() {
diff --git a/Code/WMS/WIDESEA_WMSClient/src/views/stock/stockInfoDetail_Hty.vue b/Code/WMS/WIDESEA_WMSClient/src/views/stock/stockInfoDetail_Hty.vue
index e97706c..cb7e313 100644
--- a/Code/WMS/WIDESEA_WMSClient/src/views/stock/stockInfoDetail_Hty.vue
+++ b/Code/WMS/WIDESEA_WMSClient/src/views/stock/stockInfoDetail_Hty.vue
@@ -17,7 +17,7 @@
     </view-grid>
 </template>
 <script>
-    import extend from "@/extension/stock/stockInfoDetail_Hty.js";
+    import extend from "@/extension/stock/stockInfoDetail_Hty.jsx";
     import { ref, defineComponent } from "vue";
     export default defineComponent({
         setup() {
diff --git a/Code/WMS/WIDESEA_WMSClient/src/views/stock/stockInfo_Hty.vue b/Code/WMS/WIDESEA_WMSClient/src/views/stock/stockInfo_Hty.vue
index e0a65ff..1292217 100644
--- a/Code/WMS/WIDESEA_WMSClient/src/views/stock/stockInfo_Hty.vue
+++ b/Code/WMS/WIDESEA_WMSClient/src/views/stock/stockInfo_Hty.vue
@@ -17,7 +17,7 @@
     </view-grid>
 </template>
 <script>
-    import extend from "@/extension/stock/stockInfo_Hty.js";
+    import extend from "@/extension/stock/stockInfo_Hty.jsx";
     import { ref, defineComponent } from "vue";
     export default defineComponent({
         setup() {
diff --git a/Code/WMS/WIDESEA_WMSClient/src/views/stock/stockView.vue b/Code/WMS/WIDESEA_WMSClient/src/views/stock/stockView.vue
index fc8b569..1403d34 100644
--- a/Code/WMS/WIDESEA_WMSClient/src/views/stock/stockView.vue
+++ b/Code/WMS/WIDESEA_WMSClient/src/views/stock/stockView.vue
@@ -14,7 +14,7 @@
   </view-grid>
 </template>
     <script>
-import extend from "@/extension/stock/stockView.js";
+import extend from "@/extension/stock/stockView.jsx";
 import { ref, defineComponent } from "vue";
 export default defineComponent({
   setup() {
diff --git a/Code/WMS/WIDESEA_WMSClient/src/views/system/Sys_Dictionary.vue b/Code/WMS/WIDESEA_WMSClient/src/views/system/Sys_Dictionary.vue
index 51df000..1651641 100644
--- a/Code/WMS/WIDESEA_WMSClient/src/views/system/Sys_Dictionary.vue
+++ b/Code/WMS/WIDESEA_WMSClient/src/views/system/Sys_Dictionary.vue
@@ -19,7 +19,7 @@
   </view-grid>
 </template>
 <script>
-import extend from "@/extension/system/Sys_Dictionary.js";
+import extend from "@/extension/system/Sys_Dictionary.jsx";
 import { ref, defineComponent } from "vue";
 export default defineComponent({
   setup() {
diff --git a/Code/WMS/WIDESEA_WMSClient/src/views/system/Sys_DictionaryList.vue b/Code/WMS/WIDESEA_WMSClient/src/views/system/Sys_DictionaryList.vue
index 02427fb..1a91674 100644
--- a/Code/WMS/WIDESEA_WMSClient/src/views/system/Sys_DictionaryList.vue
+++ b/Code/WMS/WIDESEA_WMSClient/src/views/system/Sys_DictionaryList.vue
@@ -19,7 +19,7 @@
 </template>
 
 <script>
-    import extend from "@/extension/system/Sys_DictionaryList.js";
+    import extend from "@/extension/system/Sys_DictionaryList.jsx";
     var vueParam = {
         data() {
             return {
diff --git a/Code/WMS/WIDESEA_WMSClient/src/views/system/Sys_Log.vue b/Code/WMS/WIDESEA_WMSClient/src/views/system/Sys_Log.vue
index 8ff9d21..aae7c83 100644
--- a/Code/WMS/WIDESEA_WMSClient/src/views/system/Sys_Log.vue
+++ b/Code/WMS/WIDESEA_WMSClient/src/views/system/Sys_Log.vue
@@ -19,7 +19,7 @@
   </view-grid>
 </template>
   <script>
-import extend from "@/extension/system/Sys_Log.js";
+import extend from "@/extension/system/Sys_Log.jsx";
 import { ref, defineComponent } from "vue";
 export default defineComponent({
   setup() {
diff --git a/Code/WMS/WIDESEA_WMSClient/src/views/system/Sys_Role.vue b/Code/WMS/WIDESEA_WMSClient/src/views/system/Sys_Role.vue
index 7da98d2..90f9bcd 100644
--- a/Code/WMS/WIDESEA_WMSClient/src/views/system/Sys_Role.vue
+++ b/Code/WMS/WIDESEA_WMSClient/src/views/system/Sys_Role.vue
@@ -19,7 +19,7 @@
   </view-grid>
 </template>
 <script>
-import extend from "@/extension/system/Sys_Role.js";
+import extend from "@/extension/system/Sys_Role.jsx";
 import { ref, defineComponent } from "vue";
 export default defineComponent({
   setup() {
diff --git a/Code/WMS/WIDESEA_WMSClient/src/views/system/Sys_Role1.vue b/Code/WMS/WIDESEA_WMSClient/src/views/system/Sys_Role1.vue
index 19ed48a..9cccb3b 100644
--- a/Code/WMS/WIDESEA_WMSClient/src/views/system/Sys_Role1.vue
+++ b/Code/WMS/WIDESEA_WMSClient/src/views/system/Sys_Role1.vue
@@ -17,7 +17,7 @@
     </view-grid>
 </template>
 <script>
-    import extend from "@/extension/system/Sys_Role1.js";
+    import extend from "@/extension/system/Sys_Role1.jsx";
     import { ref, defineComponent } from "vue";
     export default defineComponent({
         setup() {
diff --git a/Code/WMS/WIDESEA_WMSClient/src/views/system/Sys_Tenant.vue b/Code/WMS/WIDESEA_WMSClient/src/views/system/Sys_Tenant.vue
index d0bd301..6f57e08 100644
--- a/Code/WMS/WIDESEA_WMSClient/src/views/system/Sys_Tenant.vue
+++ b/Code/WMS/WIDESEA_WMSClient/src/views/system/Sys_Tenant.vue
@@ -13,7 +13,7 @@
   </view-grid>
 </template>
 <script>
-import extend from "@/extension/system/Sys_Tenant.js";
+import extend from "@/extension/system/Sys_Tenant.jsx";
 import { ref, defineComponent } from "vue";
 
 export default defineComponent({
diff --git a/Code/WMS/WIDESEA_WMSClient/src/views/system/Sys_User.vue b/Code/WMS/WIDESEA_WMSClient/src/views/system/Sys_User.vue
index b53cf53..7d4453d 100644
--- a/Code/WMS/WIDESEA_WMSClient/src/views/system/Sys_User.vue
+++ b/Code/WMS/WIDESEA_WMSClient/src/views/system/Sys_User.vue
@@ -14,7 +14,7 @@
   </view-grid>
 </template>
 <script>
-import extend from "@/extension/system/Sys_User.js";
+import extend from "@/extension/system/Sys_User.jsx";
 import { ref, defineComponent } from "vue";
 export default defineComponent({
   setup() {
diff --git a/Code/WMS/WIDESEA_WMSClient/src/views/system/system/Sys_Department.vue b/Code/WMS/WIDESEA_WMSClient/src/views/system/system/Sys_Department.vue
index 0ee20af..0266ca6 100644
--- a/Code/WMS/WIDESEA_WMSClient/src/views/system/system/Sys_Department.vue
+++ b/Code/WMS/WIDESEA_WMSClient/src/views/system/system/Sys_Department.vue
@@ -17,7 +17,7 @@
     </view-grid>
 </template>
 <script>
-    import extend from "@/extension/system/system/Sys_Department.js";
+    import extend from "@/extension/system/system/Sys_Department.jsx";
     import { ref, defineComponent } from "vue";
     export default defineComponent({
         setup() {
diff --git a/Code/WMS/WIDESEA_WMSClient/src/views/taskinfo/task.vue b/Code/WMS/WIDESEA_WMSClient/src/views/taskinfo/task.vue
index 7266c31..fc337f4 100644
--- a/Code/WMS/WIDESEA_WMSClient/src/views/taskinfo/task.vue
+++ b/Code/WMS/WIDESEA_WMSClient/src/views/taskinfo/task.vue
@@ -14,7 +14,7 @@
   </view-grid>
 </template>
     <script>
-import extend from "@/extension/taskinfo/task.js";
+import extend from "@/extension/taskinfo/task.jsx";
 import { ref, defineComponent } from "vue";
 export default defineComponent({
   setup() {
diff --git a/Code/WMS/WIDESEA_WMSClient/src/views/taskinfo/task_hty.vue b/Code/WMS/WIDESEA_WMSClient/src/views/taskinfo/task_hty.vue
index 380f32f..d780f6e 100644
--- a/Code/WMS/WIDESEA_WMSClient/src/views/taskinfo/task_hty.vue
+++ b/Code/WMS/WIDESEA_WMSClient/src/views/taskinfo/task_hty.vue
@@ -14,7 +14,7 @@
   </view-grid>
 </template>
     <script>
-import extend from "@/extension/taskinfo/task_hty.js";
+import extend from "@/extension/taskinfo/task_hty.jsx";
 import { ref, defineComponent } from "vue";
 export default defineComponent({
   setup() {
diff --git a/Code/WMS/WIDESEA_WMSClient/vite.config.js b/Code/WMS/WIDESEA_WMSClient/vite.config.js
deleted file mode 100644
index ab9d3ee..0000000
--- a/Code/WMS/WIDESEA_WMSClient/vite.config.js
+++ /dev/null
@@ -1,20 +0,0 @@
-import { defineConfig } from 'vite'
-import vue from '@vitejs/plugin-vue'
-import { resolve } from 'path'
-
-export default defineConfig({
-  plugins: [vue()],
-  resolve: {
-    alias: {
-      '@': resolve(__dirname, 'src')
-    }
-  },
-  server: {
-    host: '0.0.0.0',
-    port: 8080,
-    open: false
-  },
-  build: {
-    sourcemap: false
-  }
-})
diff --git a/Code/WMS/WIDESEA_WMSClient/vite.config.mjs b/Code/WMS/WIDESEA_WMSClient/vite.config.mjs
new file mode 100644
index 0000000..bea34dd
--- /dev/null
+++ b/Code/WMS/WIDESEA_WMSClient/vite.config.mjs
@@ -0,0 +1,23 @@
+import { defineConfig } from 'vite'
+import vue from '@vitejs/plugin-vue'
+import vueJsx from '@vitejs/plugin-vue-jsx'
+import { resolve, dirname } from 'path'
+import { fileURLToPath } from 'url'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+  plugins: [vue(), vueJsx()],
+  resolve: {
+    alias: {
+      '@': resolve(dirname(fileURLToPath(import.meta.url)), 'src')
+    }
+  },
+  server: {
+    host: '0.0.0.0',
+    port: 8080,
+    open: false
+  },
+  build: {
+    sourcemap: false
+  }
+})
diff --git a/Code/WMS/WIDESEA_WMSServer/Database/Scripts/20260412_MesApiLog.sql b/Code/WMS/WIDESEA_WMSServer/Database/Scripts/20260412_MesApiLog.sql
new file mode 100644
index 0000000..384f089
--- /dev/null
+++ b/Code/WMS/WIDESEA_WMSServer/Database/Scripts/20260412_MesApiLog.sql
@@ -0,0 +1,92 @@
+-- =============================================
+-- WMS MES鎺ュ彛璋冪敤鏃ュ織琛�
+-- 鍒涘缓鏃ユ湡: 2026-04-12
+-- 鎻忚堪: 璁板綍鎵�鏈塎ES鎺ュ彛鐨勮皟鐢ㄦ棩蹇楋紝鍖呮嫭璇锋眰銆佸搷搴斻�佽�楁椂銆佹垚鍔�/澶辫触鐘舵�佺瓑淇℃伅
+-- =============================================
+
+IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'Dt_MesApiLog')
+BEGIN
+    CREATE TABLE Dt_MesApiLog (
+        Id BIGINT PRIMARY KEY IDENTITY(1,1),
+        ApiType NVARCHAR(50) NOT NULL,           -- 鎺ュ彛绫诲瀷
+        RequestJson NVARCHAR(MAX) NULL,          -- 璇锋眰JSON
+        ResponseJson NVARCHAR(MAX) NULL,         -- 鍝嶅簲JSON
+        IsSuccess BIT NOT NULL DEFAULT 0,        -- 鏄惁鎴愬姛
+        ErrorMessage NVARCHAR(500) NULL,         -- 閿欒淇℃伅
+        ElapsedMs INT NOT NULL DEFAULT 0,        -- 鑰楁椂(姣)
+        CreateDate DATETIME NOT NULL,            -- 鍒涘缓鏃堕棿
+        Creator NVARCHAR(50) NULL,               -- 鍒涘缓浜�
+        ModifyDate DATETIME NULL,                -- 淇敼鏃堕棿
+        Modifier NVARCHAR(50) NULL               -- 淇敼浜�
+    );
+
+    -- 鍒涘缓绱㈠紩
+    CREATE INDEX IX_MesApiLog_ApiType ON Dt_MesApiLog(ApiType);
+    CREATE INDEX IX_MesApiLog_CreateDate ON Dt_MesApiLog(CreateDate);
+    CREATE INDEX IX_MesApiLog_IsSuccess ON Dt_MesApiLog(IsSuccess);
+
+    PRINT 'MES鎺ュ彛鏃ュ織琛� Dt_MesApiLog 鍒涘缓鎴愬姛';
+END
+ELSE
+BEGIN
+    PRINT 'MES鎺ュ彛鏃ュ織琛� Dt_MesApiLog 宸插瓨鍦�';
+END
+GO
+
+-- =============================================
+-- 鎻掑叆MES绯荤粺閰嶇疆
+-- =============================================
+
+-- 妫�鏌ュ苟鎻掑叆MES璁惧缂栫爜閰嶇疆
+IF NOT EXISTS (SELECT * FROM Dt_SystemConfig WHERE ConfigKey = 'MES_EquipmentCode')
+BEGIN
+    INSERT INTO Dt_SystemConfig (ConfigKey, ConfigValue, Description, CreateDate, Modifier)
+    VALUES ('MES_EquipmentCode', 'WCS_001', 'MES璁惧缂栫爜', GETDATE(), 'System');
+    PRINT 'MES璁惧缂栫爜閰嶇疆鎻掑叆鎴愬姛';
+END
+ELSE
+BEGIN
+    PRINT 'MES璁惧缂栫爜閰嶇疆宸插瓨鍦�';
+END
+GO
+
+-- 妫�鏌ュ苟鎻掑叆MES璧勬簮缂栫爜閰嶇疆
+IF NOT EXISTS (SELECT * FROM Dt_SystemConfig WHERE ConfigKey = 'MES_ResourceCode')
+BEGIN
+    INSERT INTO Dt_SystemConfig (ConfigKey, ConfigValue, Description, CreateDate, Modifier)
+    VALUES ('MES_ResourceCode', 'RESOURCE_001', 'MES璧勬簮缂栫爜', GETDATE(), 'System');
+    PRINT 'MES璧勬簮缂栫爜閰嶇疆鎻掑叆鎴愬姛';
+END
+ELSE
+BEGIN
+    PRINT 'MES璧勬簮缂栫爜閰嶇疆宸插瓨鍦�';
+END
+GO
+
+-- 妫�鏌ュ苟鎻掑叆MES鎺ュ彛鍦板潃閰嶇疆
+IF NOT EXISTS (SELECT * FROM Dt_SystemConfig WHERE ConfigKey = 'MES_ApiBaseUrl')
+BEGIN
+    INSERT INTO Dt_SystemConfig (ConfigKey, ConfigValue, Description, CreateDate, Modifier)
+    VALUES ('MES_ApiBaseUrl', 'http://mes-server/api', 'MES鎺ュ彛鍦板潃', GETDATE(), 'System');
+    PRINT 'MES鎺ュ彛鍦板潃閰嶇疆鎻掑叆鎴愬姛';
+END
+ELSE
+BEGIN
+    PRINT 'MES鎺ュ彛鍦板潃閰嶇疆宸插瓨鍦�';
+END
+GO
+
+-- 妫�鏌ュ苟鎻掑叆MES鎺ュ彛瓒呮椂鏃堕棿閰嶇疆
+IF NOT EXISTS (SELECT * FROM Dt_SystemConfig WHERE ConfigKey = 'MES_TimeoutSeconds')
+BEGIN
+    INSERT INTO Dt_SystemConfig (ConfigKey, ConfigValue, Description, CreateDate, Modifier)
+    VALUES ('MES_TimeoutSeconds', '30', 'MES鎺ュ彛瓒呮椂鏃堕棿(绉�)', GETDATE(), 'System');
+    PRINT 'MES鎺ュ彛瓒呮椂鏃堕棿閰嶇疆鎻掑叆鎴愬姛';
+END
+ELSE
+BEGIN
+    PRINT 'MES鎺ュ彛瓒呮椂鏃堕棿閰嶇疆宸插瓨鍦�';
+END
+GO
+
+PRINT 'MES鎺ュ彛鏃ュ織琛ㄥ拰绯荤粺閰嶇疆鑴氭湰鎵ц瀹屾垚';
diff --git a/Code/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MES/BindContainerRequestDto.cs b/Code/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MES/BindContainerRequestDto.cs
new file mode 100644
index 0000000..2e9d728
--- /dev/null
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MES/BindContainerRequestDto.cs
@@ -0,0 +1,30 @@
+using System.Collections.Generic;
+
+namespace WIDESEA_DTO.MES
+{
+    /// <summary>
+    /// 鎵樼洏鐢佃姱缁戝畾璇锋眰DTO
+    /// </summary>
+    public class BindContainerRequestDto
+    {
+        /// <summary>
+        /// 鎵樼洏缂栧彿
+        /// </summary>
+        public string PalletCode { get; set; }
+
+        /// <summary>
+        /// 鐢佃姱鐮佸垪琛�
+        /// </summary>
+        public List<string> SfcList { get; set; }
+
+        /// <summary>
+        /// 浣嶇疆淇℃伅
+        /// </summary>
+        public string Location { get; set; }
+
+        /// <summary>
+        /// 鎿嶄綔绫诲瀷锛�0-榛樿 1-杩涚珯 2-鍑虹珯 3-杩涘嚭绔�
+        /// </summary>
+        public int OperationType { get; set; } = 1;
+    }
+}
diff --git a/Code/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MES/ContainerNgReportRequestDto.cs b/Code/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MES/ContainerNgReportRequestDto.cs
new file mode 100644
index 0000000..dbf82b6
--- /dev/null
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MES/ContainerNgReportRequestDto.cs
@@ -0,0 +1,46 @@
+using System.Collections.Generic;
+
+namespace WIDESEA_DTO.MES
+{
+    /// <summary>
+    /// 鎵樼洏NG鐢佃姱涓婃姤璇锋眰DTO
+    /// </summary>
+    public class ContainerNgReportRequestDto
+    {
+        /// <summary>
+        /// 鎵樼洏缂栧彿
+        /// </summary>
+        public string PalletCode { get; set; }
+
+        /// <summary>
+        /// NG鐢佃姱鍒楄〃
+        /// </summary>
+        public List<NgSfcItemDto> NgSfcList { get; set; }
+
+        /// <summary>
+        /// NG鐢佃姱椤笵TO
+        /// </summary>
+        public class NgSfcItemDto
+        {
+            /// <summary>
+            /// 浜у搧鏉$爜
+            /// </summary>
+            public string Sfc { get; set; }
+
+            /// <summary>
+            /// NG浠g爜
+            /// </summary>
+            public string NgCode { get; set; }
+
+            /// <summary>
+            /// NG璁惧
+            /// </summary>
+            public string NgEquipmentCode { get; set; }
+
+            /// <summary>
+            /// NG璧勬簮
+            /// </summary>
+            public string NgResourceCode { get; set; }
+        }
+    }
+}
diff --git a/Code/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MES/InboundInContainerRequestDto.cs b/Code/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MES/InboundInContainerRequestDto.cs
new file mode 100644
index 0000000..23ea01a
--- /dev/null
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MES/InboundInContainerRequestDto.cs
@@ -0,0 +1,18 @@
+namespace WIDESEA_DTO.MES
+{
+    /// <summary>
+    /// 鎵樼洏杩涚珯璇锋眰DTO
+    /// </summary>
+    public class InboundInContainerRequestDto
+    {
+        /// <summary>
+        /// 鎵樼洏缂栧彿
+        /// </summary>
+        public string PalletCode { get; set; }
+
+        /// <summary>
+        /// 搴撳瓨ID
+        /// </summary>
+        public long StockId { get; set; }
+    }
+}
diff --git a/Code/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MES/MesApiLogDto.cs b/Code/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MES/MesApiLogDto.cs
new file mode 100644
index 0000000..508d997
--- /dev/null
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MES/MesApiLogDto.cs
@@ -0,0 +1,43 @@
+namespace WIDESEA_DTO.MES
+{
+    /// <summary>
+    /// MES鎺ュ彛鏃ュ織DTO
+    /// </summary>
+    public class MesApiLogDto
+    {
+        /// <summary>
+        /// 鎺ュ彛绫诲瀷
+        /// </summary>
+        public string ApiType { get; set; }
+
+        /// <summary>
+        /// 璇锋眰JSON
+        /// </summary>
+        public string RequestJson { get; set; }
+
+        /// <summary>
+        /// 鍝嶅簲JSON
+        /// </summary>
+        public string ResponseJson { get; set; }
+
+        /// <summary>
+        /// 鏄惁鎴愬姛
+        /// </summary>
+        public bool IsSuccess { get; set; }
+
+        /// <summary>
+        /// 閿欒淇℃伅
+        /// </summary>
+        public string ErrorMessage { get; set; }
+
+        /// <summary>
+        /// 鑰楁椂锛堟绉掞級
+        /// </summary>
+        public int ElapsedMs { get; set; }
+
+        /// <summary>
+        /// 鍒涘缓浜�
+        /// </summary>
+        public string Creator { get; set; }
+    }
+}
diff --git a/Code/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MES/OutboundInContainerRequestDto.cs b/Code/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MES/OutboundInContainerRequestDto.cs
new file mode 100644
index 0000000..08720f5
--- /dev/null
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MES/OutboundInContainerRequestDto.cs
@@ -0,0 +1,46 @@
+using System.Collections.Generic;
+
+namespace WIDESEA_DTO.MES
+{
+    /// <summary>
+    /// 鎵樼洏鍑虹珯璇锋眰DTO
+    /// </summary>
+    public class OutboundInContainerRequestDto
+    {
+        /// <summary>
+        /// 鎵樼洏缂栧彿
+        /// </summary>
+        public string PalletCode { get; set; }
+
+        /// <summary>
+        /// 搴撳瓨ID
+        /// </summary>
+        public long StockId { get; set; }
+
+        /// <summary>
+        /// 浜у搧鍙傛暟鍒楄〃锛堝彲閫夛級
+        /// </summary>
+        public List<ParamItemDto> ParamList { get; set; }
+
+        /// <summary>
+        /// 鍙傛暟椤笵TO
+        /// </summary>
+        public class ParamItemDto
+        {
+            /// <summary>
+            /// 鍙傛暟缂栫爜
+            /// </summary>
+            public string ParamCode { get; set; }
+
+            /// <summary>
+            /// 鍙傛暟鍊�
+            /// </summary>
+            public string ParamValue { get; set; }
+
+            /// <summary>
+            /// 閲囬泦鏃堕棿
+            /// </summary>
+            public string CollectionTime { get; set; }
+        }
+    }
+}
diff --git a/Code/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MES/UnbindContainerRequestDto.cs b/Code/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MES/UnbindContainerRequestDto.cs
new file mode 100644
index 0000000..f994036
--- /dev/null
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MES/UnbindContainerRequestDto.cs
@@ -0,0 +1,20 @@
+using System.Collections.Generic;
+
+namespace WIDESEA_DTO.MES
+{
+    /// <summary>
+    /// 鎵樼洏鐢佃姱瑙g粦璇锋眰DTO
+    /// </summary>
+    public class UnbindContainerRequestDto
+    {
+        /// <summary>
+        /// 鎵樼洏缂栧彿
+        /// </summary>
+        public string PalletCode { get; set; }
+
+        /// <summary>
+        /// 鐢佃姱鐮佸垪琛�
+        /// </summary>
+        public List<string> SfcList { get; set; }
+    }
+}
diff --git a/Code/WMS/WIDESEA_WMSServer/WIDESEA_IMesService/IMesLogService.cs b/Code/WMS/WIDESEA_WMSServer/WIDESEA_IMesService/IMesLogService.cs
new file mode 100644
index 0000000..595c03f
--- /dev/null
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_IMesService/IMesLogService.cs
@@ -0,0 +1,28 @@
+using System.Collections.Generic;
+using System.Threading.Tasks;
+using WIDESEA_Core;
+using WIDESEA_DTO.MES;
+
+namespace WIDESEA_IMesService
+{
+    /// <summary>
+    /// MES鎺ュ彛鏃ュ織鏈嶅姟鎺ュ彛
+    /// </summary>
+    public interface IMesLogService : IDependency
+    {
+        /// <summary>
+        /// 璁板綍MES鎺ュ彛璋冪敤鏃ュ織
+        /// </summary>
+        /// <param name="log">鏃ュ織DTO</param>
+        /// <returns>鏄惁璁板綍鎴愬姛</returns>
+        Task<bool> LogAsync(MesApiLogDto log);
+
+        /// <summary>
+        /// 鑾峰彇鏈�杩戠殑MES鎺ュ彛璋冪敤璁板綍
+        /// </summary>
+        /// <param name="apiType">鎺ュ彛绫诲瀷</param>
+        /// <param name="count">璁板綍鏁伴噺</param>
+        /// <returns>鏃ュ織鍒楄〃</returns>
+        Task<List<MesApiLogDto>> GetRecentLogsAsync(string apiType, int count = 50);
+    }
+}
diff --git a/Code/WMS/WIDESEA_WMSServer/WIDESEA_IMesService/WIDESEA_IMesService.csproj b/Code/WMS/WIDESEA_WMSServer/WIDESEA_IMesService/WIDESEA_IMesService.csproj
new file mode 100644
index 0000000..56e718b
--- /dev/null
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_IMesService/WIDESEA_IMesService.csproj
@@ -0,0 +1,14 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net8.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\WIDESEA_DTO\WIDESEA_DTO.csproj" />
+    <ProjectReference Include="..\WIDESEA_Core\WIDESEA_Core.csproj" />
+  </ItemGroup>
+
+</Project>
diff --git a/Code/WMS/WIDESEA_WMSServer/WIDESEA_MesService/MesLogService.cs b/Code/WMS/WIDESEA_WMSServer/WIDESEA_MesService/MesLogService.cs
new file mode 100644
index 0000000..30b40c9
--- /dev/null
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_MesService/MesLogService.cs
@@ -0,0 +1,95 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using SqlSugar;
+using WIDESEA_Core;
+using WIDESEA_DTO.MES;
+using WIDESEA_IMesService;
+using WIDESEA_Model.Models.Mes;
+
+namespace WIDESEA_MesService
+{
+    /// <summary>
+    /// MES鎺ュ彛鏃ュ織鏈嶅姟瀹炵幇
+    /// </summary>
+    public class MesLogService : IMesLogService
+    {
+        private readonly ISqlSugarClient _db;
+
+        /// <summary>
+        /// 鏋勯�犲嚱鏁�
+        /// </summary>
+        /// <param name="db">鏁版嵁搴撳鎴风</param>
+        public MesLogService(ISqlSugarClient db)
+        {
+            _db = db;
+        }
+
+        /// <summary>
+        /// 璁板綍MES鎺ュ彛璋冪敤鏃ュ織
+        /// </summary>
+        /// <param name="log">鏃ュ織DTO</param>
+        /// <returns>鏄惁璁板綍鎴愬姛</returns>
+        public async Task<bool> LogAsync(MesApiLogDto log)
+        {
+            try
+            {
+                var entity = new Dt_MesApiLog
+                {
+                    ApiType = log.ApiType,
+                    RequestJson = log.RequestJson,
+                    ResponseJson = log.ResponseJson,
+                    IsSuccess = log.IsSuccess,
+                    ErrorMessage = log.ErrorMessage,
+                    ElapsedMs = log.ElapsedMs,
+                    CreateDate = DateTime.Now,
+                    Creator = log.Creator
+                };
+
+                var result = await _db.Insertable(entity).ExecuteCommandAsync();
+                return result > 0;
+            }
+            catch (Exception ex)
+            {
+                // 璁板綍鏃ュ織澶辫触涓嶅奖鍝嶄富娴佺▼
+                Console.WriteLine($"璁板綍MES鏃ュ織澶辫触: {ex.Message}");
+                return false;
+            }
+        }
+
+        /// <summary>
+        /// 鑾峰彇鏈�杩戠殑MES鎺ュ彛璋冪敤璁板綍
+        /// </summary>
+        /// <param name="apiType">鎺ュ彛绫诲瀷</param>
+        /// <param name="count">璁板綍鏁伴噺</param>
+        /// <returns>鏃ュ織鍒楄〃</returns>
+        public async Task<List<MesApiLogDto>> GetRecentLogsAsync(string apiType, int count = 50)
+        {
+            try
+            {
+                var entities = await _db.Queryable<Dt_MesApiLog>()
+                    .Where(x => x.ApiType == apiType)
+                    .OrderByDescending(x => x.CreateDate)
+                    .Take(count)
+                    .ToListAsync();
+
+                return entities.Select(e => new MesApiLogDto
+                {
+                    ApiType = e.ApiType,
+                    RequestJson = e.RequestJson,
+                    ResponseJson = e.ResponseJson,
+                    IsSuccess = e.IsSuccess,
+                    ErrorMessage = e.ErrorMessage,
+                    ElapsedMs = e.ElapsedMs,
+                    Creator = e.Creator
+                }).ToList();
+            }
+            catch (Exception ex)
+            {
+                Console.WriteLine($"鑾峰彇MES鏃ュ織澶辫触: {ex.Message}");
+                return new List<MesApiLogDto>();
+            }
+        }
+    }
+}
diff --git a/Code/WMS/WIDESEA_WMSServer/WIDESEA_MesService/WIDESEA_MesService.csproj b/Code/WMS/WIDESEA_WMSServer/WIDESEA_MesService/WIDESEA_MesService.csproj
new file mode 100644
index 0000000..0498bd2
--- /dev/null
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_MesService/WIDESEA_MesService.csproj
@@ -0,0 +1,16 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net8.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\WIDESEA_IMesService\WIDESEA_IMesService.csproj" />
+    <ProjectReference Include="..\WIDESEA_Core\WIDESEA_Core.csproj" />
+    <ProjectReference Include="..\WIDESEA_Model\WIDESEA_Model.csproj" />
+    <ProjectReference Include="..\WIDESEA_DTO\WIDESEA_DTO.csproj" />
+  </ItemGroup>
+
+</Project>
diff --git a/Code/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Mes/Dt_MesApiLog.cs b/Code/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Mes/Dt_MesApiLog.cs
new file mode 100644
index 0000000..0ec802a
--- /dev/null
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Mes/Dt_MesApiLog.cs
@@ -0,0 +1,77 @@
+using SqlSugar;
+using System;
+
+namespace WIDESEA_Model.Models.Mes
+{
+    /// <summary>
+    /// MES鎺ュ彛璋冪敤鏃ュ織瀹炰綋
+    /// </summary>
+    [SugarTable("Dt_MesApiLog")]
+    public class Dt_MesApiLog
+    {
+        /// <summary>
+        /// 涓婚敭ID
+        /// </summary>
+        [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
+        public long Id { get; set; }
+
+        /// <summary>
+        /// 鎺ュ彛绫诲瀷锛欼nboundInContainer, OutboundInContainer, BindContainer, UnbindContainer, ContainerNgReport
+        /// </summary>
+        [SugarColumn(Length = 50, IsNullable = false)]
+        public string ApiType { get; set; }
+
+        /// <summary>
+        /// 璇锋眰JSON
+        /// </summary>
+        [SugarColumn(ColumnDataType = "nvarchar(max)", IsNullable = true)]
+        public string RequestJson { get; set; }
+
+        /// <summary>
+        /// 鍝嶅簲JSON
+        /// </summary>
+        [SugarColumn(ColumnDataType = "nvarchar(max)", IsNullable = true)]
+        public string ResponseJson { get; set; }
+
+        /// <summary>
+        /// 鏄惁鎴愬姛
+        /// </summary>
+        [SugarColumn(IsNullable = false)]
+        public bool IsSuccess { get; set; }
+
+        /// <summary>
+        /// 閿欒淇℃伅
+        /// </summary>
+        [SugarColumn(Length = 500, IsNullable = true)]
+        public string ErrorMessage { get; set; }
+
+        /// <summary>
+        /// 鑰楁椂锛堟绉掞級
+        /// </summary>
+        [SugarColumn(IsNullable = false)]
+        public int ElapsedMs { get; set; }
+
+        /// <summary>
+        /// 鍒涘缓鏃堕棿
+        /// </summary>
+        [SugarColumn(IsNullable = false)]
+        public DateTime CreateDate { get; set; }
+
+        /// <summary>
+        /// 鍒涘缓浜�
+        /// </summary>
+        [SugarColumn(Length = 50, IsNullable = true)]
+        public string Creator { get; set; }
+
+        /// <summary>
+        /// 淇敼鏃堕棿
+        /// </summary>
+        public DateTime? ModifyDate { get; set; }
+
+        /// <summary>
+        /// 淇敼浜�
+        /// </summary>
+        [SugarColumn(Length = 50, IsNullable = true)]
+        public string Modifier { get; set; }
+    }
+}
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 1a7ac90..1d4292c 100644
--- a/Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Stock/StockInfoController.cs
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Stock/StockInfoController.cs
@@ -4,8 +4,14 @@
 using WIDESEA_Core;
 using WIDESEA_Core.BaseController;
 using WIDESEA_DTO.Stock;
+using WIDESEA_DTO.MES;
 using WIDESEA_IStockService;
+using WIDESEA_IBasicService;
+using WIDESEA_IMesService;
+using WIDESEA_ISystemService;
 using WIDESEA_Model.Models;
+using WIDESEA_Common.StockEnum;
+using System.Diagnostics;
 
 namespace WIDESEA_WMSServer.Controllers.Stock
 {
@@ -16,8 +22,19 @@
     [ApiController]
     public class StockInfoController : ApiBaseController<IStockInfoService, Dt_StockInfo>
     {
-        public StockInfoController(IStockInfoService service) : base(service)
+        private readonly IMesLogService _mesLogService;
+        private readonly IMesService _mesService;
+        private readonly ISys_DictionaryService _sysDictionaryService;
+
+        public StockInfoController(
+            IStockInfoService service,
+            IMesLogService mesLogService,
+            IMesService mesService,
+            ISys_DictionaryService sysDictionaryService) : base(service)
         {
+            _mesLogService = mesLogService;
+            _mesService = mesService;
+            _sysDictionaryService = sysDictionaryService;
         }
 
         /// <summary>
@@ -31,5 +48,250 @@
             var result = await Service.Get3DLayoutAsync(warehouseId);
             return WebResponseContent.Instance.OK(data: result);
         }
+
+        /// <summary>
+        /// 鎵樼洏杩涚珯 - 璋冪敤MES鎺ュ彛
+        /// </summary>
+        /// <param name="dto">杩涚珯璇锋眰鍙傛暟</param>
+        /// <returns>鎿嶄綔缁撴灉</returns>
+        [HttpPost("inboundInContainer")]
+        public async Task<WebResponseContent> InboundInContainer([FromBody] InboundInContainerRequestDto dto)
+        {
+            var response = new WebResponseContent();
+            var stopwatch = Stopwatch.StartNew();
+
+            try
+            {
+                // 1. 鍙傛暟楠岃瘉
+                if (string.IsNullOrWhiteSpace(dto.PalletCode))
+                {
+                    return response.Error("鎵樼洏缂栧彿涓嶈兘涓虹┖");
+                }
+
+                // 2. 鏌ヨ搴撳瓨淇℃伅 - 浣跨敤鍗曟潯璁板綍鏌ヨ鏂规硶鎻愰珮鏁堢巼
+                var stockInfo = await Service.Repository.QueryDataNavFirstAsync(x => x.Id == dto.StockId);
+
+                if (stockInfo == null)
+                {
+                    return response.Error("搴撳瓨淇℃伅涓嶅瓨鍦�");
+                }
+
+                // 3. 楠岃瘉搴撳瓨鐘舵�侊紙浠�"鍏ュ簱瀹屾垚"鐘舵�佸厑璁歌繘绔欙級
+                if (stockInfo.StockStatus != StockStatusEmun.鍏ュ簱瀹屾垚.GetHashCode())
+                {
+                    return response.Error($"褰撳墠搴撳瓨鐘舵�佷笉鍏佽杩涚珯鎿嶄綔锛屽綋鍓嶇姸鎬侊細{stockInfo.StockStatus}");
+                }
+
+                // 4. 鑾峰彇绯荤粺閰嶇疆 - 鐩存帴浠庢暟鎹簱鏌ヨ
+                var configs = _sysDictionaryService.GetVueDictionary(new[] { "MES_EquipmentCode", "MES_ResourceCode" });
+
+                string equipmentCode = GetConfigValue(configs, "MES_EquipmentCode", "WCS_001");
+                string resourceCode = GetConfigValue(configs, "MES_ResourceCode", "RESOURCE_001");
+
+                // 5. 鏋勯�燤ES璇锋眰
+                var mesRequest = new InboundInContainerRequest
+                {
+                    EquipmentCode = equipmentCode,
+                    ResourceCode = resourceCode,
+                    LocalTime = DateTime.Now,
+                    ContainerCode = dto.PalletCode
+                };
+
+                string requestJson = System.Text.Json.JsonSerializer.Serialize(mesRequest);
+
+                // 6. 璋冪敤MES鎺ュ彛锛堝悓姝ユ柟娉曪級
+                var mesResult = _mesService.InboundInContainer(mesRequest);
+                stopwatch.Stop();
+
+                // 7. 璁板綍鏃ュ織
+                await _mesLogService.LogAsync(new MesApiLogDto
+                {
+                    ApiType = "InboundInContainer",
+                    RequestJson = requestJson,
+                    ResponseJson = System.Text.Json.JsonSerializer.Serialize(mesResult),
+                    IsSuccess = mesResult.IsSuccess,
+                    ErrorMessage = mesResult.ErrorMessage,
+                    ElapsedMs = (int)stopwatch.ElapsedMilliseconds,
+                    Creator = App.User.UserName
+                });
+
+                // 8. 杩斿洖缁撴灉
+                if (mesResult.IsSuccess)
+                {
+                    return response.OK("鎵樼洏杩涚珯鎴愬姛");
+                }
+                else
+                {
+                    return response.Error($"MES鎺ュ彛璋冪敤澶辫触: {mesResult.ErrorMessage}");
+                }
+            }
+            catch (System.Exception ex)
+            {
+                stopwatch.Stop();
+
+                // 璁板綍閿欒鏃ュ織
+                await _mesLogService.LogAsync(new MesApiLogDto
+                {
+                    ApiType = "InboundInContainer",
+                    IsSuccess = false,
+                    ErrorMessage = ex.Message,
+                    ElapsedMs = (int)stopwatch.ElapsedMilliseconds,
+                    Creator = App.User.UserName
+                });
+
+                return response.Error($"鎵樼洏杩涚珯澶辫触: {ex.Message}");
+            }
+        }
+
+        /// <summary>
+        /// 鎵樼洏鍑虹珯 - 璋冪敤MES鎺ュ彛
+        /// </summary>
+        /// <param name="dto">鍑虹珯璇锋眰鍙傛暟</param>
+        /// <returns>鎿嶄綔缁撴灉</returns>
+        [HttpPost("outboundInContainer")]
+        public async Task<WebResponseContent> OutboundInContainer([FromBody] OutboundInContainerRequestDto dto)
+        {
+            var response = new WebResponseContent();
+            var stopwatch = Stopwatch.StartNew();
+
+            try
+            {
+                // 1. 鍙傛暟楠岃瘉
+                if (string.IsNullOrWhiteSpace(dto.PalletCode))
+                {
+                    return response.Error("鎵樼洏缂栧彿涓嶈兘涓虹┖");
+                }
+
+                // 2. 鏌ヨ搴撳瓨淇℃伅 - 浣跨敤鍗曟潯璁板綍鏌ヨ鏂规硶鎻愰珮鏁堢巼
+                var stockInfo = await Service.Repository.QueryDataNavFirstAsync(x => x.Id == dto.StockId);
+
+                if (stockInfo == null)
+                {
+                    return response.Error("搴撳瓨淇℃伅涓嶅瓨鍦�");
+                }
+
+                // 3. 楠岃瘉搴撳瓨鐘舵�侊紙"鍑哄簱閿佸畾"鎴�"鍑哄簱瀹屾垚"鐘舵�佸厑璁稿嚭绔欙級
+                var allowedStatuses = new[]
+                {
+                    StockStatusEmun.鍑哄簱閿佸畾.GetHashCode(),
+                    StockStatusEmun.鍑哄簱瀹屾垚.GetHashCode()
+                };
+
+                if (!allowedStatuses.Contains(stockInfo.StockStatus))
+                {
+                    return response.Error($"褰撳墠搴撳瓨鐘舵�佷笉鍏佽鍑虹珯鎿嶄綔锛屽綋鍓嶇姸鎬侊細{stockInfo.StockStatus}");
+                }
+
+                // 4. 鑾峰彇绯荤粺閰嶇疆
+                var configs = _sysDictionaryService.GetVueDictionary(new[] { "MES_EquipmentCode", "MES_ResourceCode" });
+
+                string equipmentCode = GetConfigValue(configs, "MES_EquipmentCode", "WCS_001");
+                string resourceCode = GetConfigValue(configs, "MES_ResourceCode", "RESOURCE_001");
+
+                // 5. 鏋勯�燤ES璇锋眰
+                var mesRequest = new OutboundInContainerRequest
+                {
+                    EquipmentCode = equipmentCode,
+                    ResourceCode = resourceCode,
+                    LocalTime = DateTime.Now,
+                    ContainerCode = dto.PalletCode,
+                    ParamList = dto.ParamList?.Select(p => new ParamItem
+                    {
+                        ParamCode = p.ParamCode,
+                        ParamValue = p.ParamValue,
+                        CollectionTime = DateTime.TryParse(p.CollectionTime, out var ct) ? ct : DateTime.Now
+                    }).ToList()
+                };
+
+                string requestJson = System.Text.Json.JsonSerializer.Serialize(mesRequest);
+
+                // 6. 璋冪敤MES鎺ュ彛锛堝悓姝ユ柟娉曪級
+                var mesResult = _mesService.OutboundInContainer(mesRequest);
+                stopwatch.Stop();
+
+                // 7. 璁板綍鏃ュ織
+                await _mesLogService.LogAsync(new MesApiLogDto
+                {
+                    ApiType = "OutboundInContainer",
+                    RequestJson = requestJson,
+                    ResponseJson = System.Text.Json.JsonSerializer.Serialize(mesResult),
+                    IsSuccess = mesResult.IsSuccess,
+                    ErrorMessage = mesResult.ErrorMessage,
+                    ElapsedMs = (int)stopwatch.ElapsedMilliseconds,
+                    Creator = App.User.UserName
+                });
+
+                // 8. 杩斿洖缁撴灉
+                if (mesResult.IsSuccess)
+                {
+                    return response.OK("鎵樼洏鍑虹珯鎴愬姛");
+                }
+                else
+                {
+                    return response.Error($"MES鎺ュ彛璋冪敤澶辫触: {mesResult.ErrorMessage}");
+                }
+            }
+            catch (System.Exception ex)
+            {
+                stopwatch.Stop();
+
+                // 璁板綍閿欒鏃ュ織
+                await _mesLogService.LogAsync(new MesApiLogDto
+                {
+                    ApiType = "OutboundInContainer",
+                    IsSuccess = false,
+                    ErrorMessage = ex.Message,
+                    ElapsedMs = (int)stopwatch.ElapsedMilliseconds,
+                    Creator = App.User.UserName
+                });
+
+                return response.Error($"鎵樼洏鍑虹珯澶辫触: {ex.Message}");
+            }
+        }
+
+        /// <summary>
+        /// 浠庨厤缃瓧鍏镐腑鑾峰彇閰嶇疆鍊�
+        /// </summary>
+        /// <param name="configs">閰嶇疆瀛楀吀鍒楄〃</param>
+        /// <param name="key">閰嶇疆閿�</param>
+        /// <param name="defaultValue">榛樿鍊�</param>
+        /// <returns>閰嶇疆鍊�</returns>
+        private string GetConfigValue(System.Collections.Generic.List<WIDESEA_DTO.System.VueDictionaryDTO> configs, string key, string defaultValue = "")
+        {
+            if (configs != null)
+            {
+                var config = configs.FirstOrDefault(c => c.DicNo == key);
+                if (config != null && config.Data != null)
+                {
+                    // Data鏄痙ynamic绫诲瀷锛屽皾璇曡幏鍙栫涓�涓厓绱犵殑value灞炴��
+                    try
+                    {
+                        // 浣跨敤dynamic鏉ヨ闂尶鍚嶇被鍨嬬殑灞炴��
+                        dynamic data = config.Data;
+                        if (data != null)
+                        {
+                            // data鍙兘鏄疘Enumerable鎴栬�呭崟涓璞�
+                            var enumerable = data as System.Collections.IEnumerable;
+                            if (enumerable != null)
+                            {
+                                foreach (var item in enumerable)
+                                {
+                                    // 鑾峰彇绗竴涓厓绱�
+                                    dynamic firstItem = item;
+                                    var value = firstItem.value;
+                                    return value?.ToString() ?? defaultValue;
+                                }
+                            }
+                        }
+                    }
+                    catch
+                    {
+                        // 濡傛灉鏃犳硶鑾峰彇锛岃繑鍥為粯璁ゅ��
+                        return defaultValue;
+                    }
+                }
+            }
+            return defaultValue;
+        }
     }
 }
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 5ff0f67..1c4242a 100644
--- a/Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Stock/StockInfoDetailController.cs
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Stock/StockInfoDetailController.cs
@@ -1,8 +1,14 @@
 锘縰sing Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Mvc;
+using WIDESEA_Core;
 using WIDESEA_Core.BaseController;
+using WIDESEA_DTO.MES;
 using WIDESEA_IStockService;
+using WIDESEA_IBasicService;
+using WIDESEA_IMesService;
+using WIDESEA_ISystemService;
 using WIDESEA_Model.Models;
+using System.Diagnostics;
 
 namespace WIDESEA_WMSServer.Controllers.Stock
 {
@@ -13,8 +19,355 @@
     [ApiController]
     public class StockInfoDetailController : ApiBaseController<IStockInfoDetailService, Dt_StockInfoDetail>
     {
-        public StockInfoDetailController(IStockInfoDetailService service) : base(service)
+        private readonly IMesLogService _mesLogService;
+        private readonly IMesService _mesService;
+        private readonly ISys_DictionaryService _sysDictionaryService;
+
+        public StockInfoDetailController(
+            IStockInfoDetailService service,
+            IMesLogService mesLogService,
+            IMesService mesService,
+            ISys_DictionaryService sysDictionaryService) : base(service)
         {
+            _mesLogService = mesLogService;
+            _mesService = mesService;
+            _sysDictionaryService = sysDictionaryService;
+        }
+
+        /// <summary>
+        /// 鎵樼洏鐢佃姱缁戝畾 - 璋冪敤MES鎺ュ彛
+        /// </summary>
+        /// <param name="dto">缁戝畾璇锋眰鍙傛暟</param>
+        /// <returns>鎿嶄綔缁撴灉</returns>
+        [HttpPost("bindContainer")]
+        public async Task<WebResponseContent> BindContainer([FromBody] BindContainerRequestDto dto)
+        {
+            var response = new WebResponseContent();
+            var stopwatch = Stopwatch.StartNew();
+
+            try
+            {
+                // 1. 鍙傛暟楠岃瘉
+                if (string.IsNullOrWhiteSpace(dto.PalletCode))
+                {
+                    return response.Error("鎵樼洏缂栧彿涓嶈兘涓虹┖");
+                }
+
+                if (dto.SfcList == null || !dto.SfcList.Any())
+                {
+                    return response.Error("鐢佃姱鐮佸垪琛ㄤ笉鑳戒负绌�");
+                }
+
+                // 2. 楠岃瘉鐢佃姱鐘舵�侊紙闈�'宸查攣瀹�'鐘舵�佸厑璁哥粦瀹氾級
+                var stockDetails = await Service.Repository.QueryDataAsync(x => dto.SfcList.Contains(x.SerialNumber));
+                if (stockDetails != null && stockDetails.Any(d => d.Status == 99))
+                {
+                    return response.Error("褰撳墠搴撳瓨鏄庣粏鍖呭惈宸查攣瀹氱姸鎬侊紝涓嶅厑璁告墽琛岀粦瀹氭搷浣�");
+                }
+
+                // 3. 鑾峰彇绯荤粺閰嶇疆
+                var configs = _sysDictionaryService.GetVueDictionary(new[] { "MES_EquipmentCode", "MES_ResourceCode" });
+
+                string equipmentCode = GetConfigValue(configs, "MES_EquipmentCode", "WCS_001");
+                string resourceCode = GetConfigValue(configs, "MES_ResourceCode", "RESOURCE_001");
+
+                // 3. 鏋勯�燤ES璇锋眰 - 灏嗙數鑺垪琛ㄨ浆鎹负ContainerSfcItem鏍煎紡
+                var mesRequest = new BindContainerRequest
+                {
+                    EquipmentCode = equipmentCode,
+                    ResourceCode = resourceCode,
+                    LocalTime = DateTime.Now,
+                    ContainerCode = dto.PalletCode,
+                    ContainerSfcList = dto.SfcList.Select(sfc => new ContainerSfcItem
+                    {
+                        Sfc = sfc,
+                        Location = dto.Location ?? ""
+                    }).ToList(),
+                    OperationType = dto.OperationType
+                };
+
+                string requestJson = System.Text.Json.JsonSerializer.Serialize(mesRequest);
+
+                // 4. 璋冪敤MES鎺ュ彛锛堝悓姝ユ柟娉曪級
+                var mesResult = _mesService.BindContainer(mesRequest);
+                stopwatch.Stop();
+
+                // 5. 璁板綍鏃ュ織
+                await _mesLogService.LogAsync(new MesApiLogDto
+                {
+                    ApiType = "BindContainer",
+                    RequestJson = requestJson,
+                    ResponseJson = System.Text.Json.JsonSerializer.Serialize(mesResult),
+                    IsSuccess = mesResult.IsSuccess,
+                    ErrorMessage = mesResult.ErrorMessage,
+                    ElapsedMs = (int)stopwatch.ElapsedMilliseconds,
+                    Creator = App.User.UserName
+                });
+
+                // 6. 杩斿洖缁撴灉
+                if (mesResult.IsSuccess)
+                {
+                    return response.OK("鎵樼洏鐢佃姱缁戝畾鎴愬姛");
+                }
+                else
+                {
+                    return response.Error($"MES鎺ュ彛璋冪敤澶辫触: {mesResult.ErrorMessage}");
+                }
+            }
+            catch (System.Exception ex)
+            {
+                stopwatch.Stop();
+
+                // 璁板綍閿欒鏃ュ織
+                await _mesLogService.LogAsync(new MesApiLogDto
+                {
+                    ApiType = "BindContainer",
+                    IsSuccess = false,
+                    ErrorMessage = ex.Message,
+                    ElapsedMs = (int)stopwatch.ElapsedMilliseconds,
+                    Creator = App.User.UserName
+                });
+
+                return response.Error($"鎵樼洏鐢佃姱缁戝畾澶辫触: {ex.Message}");
+            }
+        }
+
+        /// <summary>
+        /// 鎵樼洏鐢佃姱瑙g粦 - 璋冪敤MES鎺ュ彛
+        /// </summary>
+        /// <param name="dto">瑙g粦璇锋眰鍙傛暟</param>
+        /// <returns>鎿嶄綔缁撴灉</returns>
+        [HttpPost("unbindContainer")]
+        public async Task<WebResponseContent> UnbindContainer([FromBody] UnbindContainerRequestDto dto)
+        {
+            var response = new WebResponseContent();
+            var stopwatch = Stopwatch.StartNew();
+
+            try
+            {
+                // 1. 鍙傛暟楠岃瘉
+                if (string.IsNullOrWhiteSpace(dto.PalletCode))
+                {
+                    return response.Error("鎵樼洏缂栧彿涓嶈兘涓虹┖");
+                }
+
+                if (dto.SfcList == null || !dto.SfcList.Any())
+                {
+                    return response.Error("鐢佃姱鐮佸垪琛ㄤ笉鑳戒负绌�");
+                }
+
+                // 2. 楠岃瘉鐢佃姱鐘舵�侊紙闈�'宸查攣瀹�'鐘舵�佸厑璁歌В缁戯級
+                var stockDetails = await Service.Repository.QueryDataAsync(x => dto.SfcList.Contains(x.SerialNumber));
+                if (stockDetails != null && stockDetails.Any(d => d.Status == 99))
+                {
+                    return response.Error("褰撳墠搴撳瓨鏄庣粏鍖呭惈宸查攣瀹氱姸鎬侊紝涓嶅厑璁告墽琛岃В缁戞搷浣�");
+                }
+
+                // 3. 鑾峰彇绯荤粺閰嶇疆
+                var configs = _sysDictionaryService.GetVueDictionary(new[] { "MES_EquipmentCode", "MES_ResourceCode" });
+
+                string equipmentCode = GetConfigValue(configs, "MES_EquipmentCode", "WCS_001");
+                string resourceCode = GetConfigValue(configs, "MES_ResourceCode", "RESOURCE_001");
+
+                // 3. 鏋勯�燤ES璇锋眰
+                var mesRequest = new UnBindContainerRequest
+                {
+                    EquipmentCode = equipmentCode,
+                    ResourceCode = resourceCode,
+                    LocalTime = DateTime.Now,
+                    ContainCode = dto.PalletCode,
+                    SfcList = dto.SfcList
+                };
+
+                string requestJson = System.Text.Json.JsonSerializer.Serialize(mesRequest);
+
+                // 4. 璋冪敤MES鎺ュ彛锛堝悓姝ユ柟娉曪級
+                var mesResult = _mesService.UnBindContainer(mesRequest);
+                stopwatch.Stop();
+
+                // 5. 璁板綍鏃ュ織
+                await _mesLogService.LogAsync(new MesApiLogDto
+                {
+                    ApiType = "UnbindContainer",
+                    RequestJson = requestJson,
+                    ResponseJson = System.Text.Json.JsonSerializer.Serialize(mesResult),
+                    IsSuccess = mesResult.IsSuccess,
+                    ErrorMessage = mesResult.ErrorMessage,
+                    ElapsedMs = (int)stopwatch.ElapsedMilliseconds,
+                    Creator = App.User.UserName
+                });
+
+                // 6. 杩斿洖缁撴灉
+                if (mesResult.IsSuccess)
+                {
+                    return response.OK("鎵樼洏鐢佃姱瑙g粦鎴愬姛");
+                }
+                else
+                {
+                    return response.Error($"MES鎺ュ彛璋冪敤澶辫触: {mesResult.ErrorMessage}");
+                }
+            }
+            catch (System.Exception ex)
+            {
+                stopwatch.Stop();
+
+                // 璁板綍閿欒鏃ュ織
+                await _mesLogService.LogAsync(new MesApiLogDto
+                {
+                    ApiType = "UnbindContainer",
+                    IsSuccess = false,
+                    ErrorMessage = ex.Message,
+                    ElapsedMs = (int)stopwatch.ElapsedMilliseconds,
+                    Creator = App.User.UserName
+                });
+
+                return response.Error($"鎵樼洏鐢佃姱瑙g粦澶辫触: {ex.Message}");
+            }
+        }
+
+        /// <summary>
+        /// 鎵樼洏NG鐢佃姱涓婃姤 - 璋冪敤MES鎺ュ彛
+        /// </summary>
+        /// <param name="dto">NG涓婃姤璇锋眰鍙傛暟</param>
+        /// <returns>鎿嶄綔缁撴灉</returns>
+        [HttpPost("containerNgReport")]
+        public async Task<WebResponseContent> ContainerNgReport([FromBody] ContainerNgReportRequestDto dto)
+        {
+            var response = new WebResponseContent();
+            var stopwatch = Stopwatch.StartNew();
+
+            try
+            {
+                // 1. 鍙傛暟楠岃瘉
+                if (string.IsNullOrWhiteSpace(dto.PalletCode))
+                {
+                    return response.Error("鎵樼洏缂栧彿涓嶈兘涓虹┖");
+                }
+
+                if (dto.NgSfcList == null || !dto.NgSfcList.Any())
+                {
+                    return response.Error("NG鐢佃姱鍒楄〃涓嶈兘涓虹┖");
+                }
+
+                // 2. 楠岃瘉鐢佃姱鐘舵�侊紙闈�'宸查攣瀹�'鐘舵�佸厑璁窷G涓婃姤锛�
+                var sfcList = dto.NgSfcList.Select(x => x.Sfc).ToList();
+                var stockDetails = await Service.Repository.QueryDataAsync(x => sfcList.Contains(x.SerialNumber));
+                if (stockDetails != null && stockDetails.Any(d => d.Status == 99))
+                {
+                    return response.Error("褰撳墠搴撳瓨鏄庣粏鍖呭惈宸查攣瀹氱姸鎬侊紝涓嶅厑璁告墽琛孨G涓婃姤鎿嶄綔");
+                }
+
+                // 3. 鑾峰彇绯荤粺閰嶇疆
+                var configs = _sysDictionaryService.GetVueDictionary(new[] { "MES_EquipmentCode", "MES_ResourceCode" });
+
+                string equipmentCode = GetConfigValue(configs, "MES_EquipmentCode", "WCS_001");
+                string resourceCode = GetConfigValue(configs, "MES_ResourceCode", "RESOURCE_001");
+
+                // 3. 鏋勯�燤ES璇锋眰 - 灏咲TO鏍煎紡杞崲涓篗ES璇锋眰鏍煎紡
+                var mesRequest = new ContainerNgReportRequest
+                {
+                    EquipmentCode = equipmentCode,
+                    ResourceCode = resourceCode,
+                    LocalTime = DateTime.Now,
+                    ContainerCode = dto.PalletCode,
+                    NgSfcList = dto.NgSfcList.Select(ng => new NgSfcItem
+                    {
+                        Sfc = ng.Sfc,
+                        NgCode = ng.NgCode,
+                        NgEquipmentCode = ng.NgEquipmentCode,
+                        NgResourceCode = ng.NgResourceCode
+                    }).ToList()
+                };
+
+                string requestJson = System.Text.Json.JsonSerializer.Serialize(mesRequest);
+
+                // 4. 璋冪敤MES鎺ュ彛锛堝悓姝ユ柟娉曪級
+                var mesResult = _mesService.ContainerNgReport(mesRequest);
+                stopwatch.Stop();
+
+                // 5. 璁板綍鏃ュ織
+                await _mesLogService.LogAsync(new MesApiLogDto
+                {
+                    ApiType = "ContainerNgReport",
+                    RequestJson = requestJson,
+                    ResponseJson = System.Text.Json.JsonSerializer.Serialize(mesResult),
+                    IsSuccess = mesResult.IsSuccess,
+                    ErrorMessage = mesResult.ErrorMessage,
+                    ElapsedMs = (int)stopwatch.ElapsedMilliseconds,
+                    Creator = App.User.UserName
+                });
+
+                // 6. 杩斿洖缁撴灉
+                if (mesResult.IsSuccess)
+                {
+                    return response.OK("NG鐢佃姱涓婃姤鎴愬姛");
+                }
+                else
+                {
+                    return response.Error($"MES鎺ュ彛璋冪敤澶辫触: {mesResult.ErrorMessage}");
+                }
+            }
+            catch (System.Exception ex)
+            {
+                stopwatch.Stop();
+
+                // 璁板綍閿欒鏃ュ織
+                await _mesLogService.LogAsync(new MesApiLogDto
+                {
+                    ApiType = "ContainerNgReport",
+                    IsSuccess = false,
+                    ErrorMessage = ex.Message,
+                    ElapsedMs = (int)stopwatch.ElapsedMilliseconds,
+                    Creator = App.User.UserName
+                });
+
+                return response.Error($"NG鐢佃姱涓婃姤澶辫触: {ex.Message}");
+            }
+        }
+
+        /// <summary>
+        /// 浠庨厤缃瓧鍏镐腑鑾峰彇閰嶇疆鍊�
+        /// </summary>
+        /// <param name="configs">閰嶇疆瀛楀吀鍒楄〃</param>
+        /// <param name="key">閰嶇疆閿�</param>
+        /// <param name="defaultValue">榛樿鍊�</param>
+        /// <returns>閰嶇疆鍊�</returns>
+        private string GetConfigValue(System.Collections.Generic.List<WIDESEA_DTO.System.VueDictionaryDTO> configs, string key, string defaultValue = "")
+        {
+            if (configs != null)
+            {
+                var config = configs.FirstOrDefault(c => c.DicNo == key);
+                if (config != null && config.Data != null)
+                {
+                    // Data鏄痙ynamic绫诲瀷锛屽皾璇曡幏鍙栫涓�涓厓绱犵殑value灞炴��
+                    try
+                    {
+                        // 浣跨敤dynamic鏉ヨ闂尶鍚嶇被鍨嬬殑灞炴��
+                        dynamic data = config.Data;
+                        if (data != null)
+                        {
+                            // data鍙兘鏄疘Enumerable鎴栬�呭崟涓璞�
+                            var enumerable = data as System.Collections.IEnumerable;
+                            if (enumerable != null)
+                            {
+                                foreach (var item in enumerable)
+                                {
+                                    // 鑾峰彇绗竴涓厓绱�
+                                    dynamic firstItem = item;
+                                    var value = firstItem.value;
+                                    return value?.ToString() ?? defaultValue;
+                                }
+                            }
+                        }
+                    }
+                    catch
+                    {
+                        // 濡傛灉鏃犳硶鑾峰彇锛岃繑鍥為粯璁ゅ��
+                        return defaultValue;
+                    }
+                }
+            }
+            return defaultValue;
         }
     }
 }
diff --git a/Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/WIDESEA_WMSServer.csproj b/Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/WIDESEA_WMSServer.csproj
index 234f1e2..89edbde 100644
--- a/Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/WIDESEA_WMSServer.csproj
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/WIDESEA_WMSServer.csproj
@@ -59,6 +59,7 @@
 	  <ProjectReference Include="..\WIDESEA_BasicService\WIDESEA_BasicService.csproj" />
 	  <ProjectReference Include="..\WIDESEA_CheckService\WIDESEA_CheckService.csproj" />
 	  <ProjectReference Include="..\WIDESEA_InboundService\WIDESEA_InboundService.csproj" />
+	  <ProjectReference Include="..\WIDESEA_MesService\WIDESEA_MesService.csproj" />
 	  <ProjectReference Include="..\WIDESEA_OutboundService\WIDESEA_OutboundService.csproj" />
 	  <ProjectReference Include="..\WIDESEA_RecordService\WIDESEA_RecordService.csproj" />
 	  <ProjectReference Include="..\WIDESEA_StockService\WIDESEA_StockService.csproj" />
diff --git a/Code/docs/superpowers/plans/2026-04-12-mes-integration-plan.md b/Code/docs/superpowers/plans/2026-04-12-mes-integration-plan.md
new file mode 100644
index 0000000..3322365
--- /dev/null
+++ b/Code/docs/superpowers/plans/2026-04-12-mes-integration-plan.md
@@ -0,0 +1,1933 @@
+# WMS搴撳瓨椤甸潰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:** 涓篧MS搴撳瓨淇℃伅椤甸潰鍜屽簱瀛樻槑缁嗛〉闈㈡坊鍔犳搷浣滃垪锛岃皟鐢∕ES绯荤粺鐨勮繘绔�/鍑虹珯/缁戝畾/瑙g粦/NG涓婃姤鎺ュ彛
+
+**Architecture:** 鍓嶇鍦ㄥ簱瀛樿〃鏍间腑娣诲姞鎿嶄綔鍒楋紝鐐瑰嚮鍚庡脊鍑虹‘璁ゅ璇濇锛岀‘璁ゅ悗璋冪敤鍚庣API锛涘悗绔帴鏀惰姹傦紝璋冪敤MES鏈嶅姟锛岃褰曞畬鏁存棩蹇楋紝杩斿洖缁撴灉
+
+**Tech Stack:** Vue 3, Element Plus, .NET 8, SqlSugar ORM, SQL Server, HttpClient
+
+---
+
+## 鏂囦欢缁撴瀯
+
+### 鍓嶇鏂囦欢
+
+```
+WMS/WIDESEA_WMSClient/src/
+鈹溾攢鈹� views/stock/
+鈹�   鈹溾攢鈹� stockInfo.vue                         # 淇敼锛氭坊鍔犳搷浣滃垪
+鈹�   鈹斺攢鈹� stockInfoDetail.vue                   # 淇敼锛氭坊鍔犳搷浣滃垪
+鈹溾攢鈹� components/
+鈹�   鈹斺攢鈹� MesConfirmDialog.vue                  # 鏂板锛歁ES纭瀵硅瘽妗�
+鈹斺攢鈹� api/
+    鈹斺攢鈹� mes.js                                # 鏂板锛歁ES API璋冪敤
+```
+
+### 鍚庣鏂囦欢
+
+```
+WMS/WIDESEA_WMSServer/
+鈹溾攢鈹� Controllers/
+鈹�   鈹斺攢鈹� Stock/
+鈹�       鈹溾攢鈹� StockInfoController.cs            # 淇敼锛氭坊鍔犺繘绔�/鍑虹珯鎺ュ彛
+鈹�       鈹斺攢鈹� StockInfoDetailController.cs      # 淇敼锛氭坊鍔犵粦瀹�/瑙g粦/NG涓婃姤鎺ュ彛
+鈹溾攢鈹� Services/
+鈹�   鈹斺攢鈹� Mes/
+鈹�       鈹溾攢鈹� IMesLogService.cs                 # 鏂板锛氭棩蹇楁湇鍔℃帴鍙�
+鈹�       鈹斺攢鈹� MesLogService.cs                  # 鏂板锛氭棩蹇楁湇鍔″疄鐜�
+鈹溾攢鈹� DTO/
+鈹�   鈹溾攢鈹� Mes/
+鈹�   鈹�   鈹溾攢鈹� MesApiLogDto.cs                   # 鏂板锛氭棩蹇桪TO
+鈹�   鈹�   鈹溾攢鈹� InboundInContainerRequestDto.cs   # 鏂板锛氳繘绔欒姹侱TO
+鈹�   鈹�   鈹溾攢鈹� OutboundInContainerRequestDto.cs  # 鏂板锛氬嚭绔欒姹侱TO
+鈹�   鈹�   鈹溾攢鈹� BindContainerRequestDto.cs        # 鏂板锛氱粦瀹氳姹侱TO
+鈹�   鈹�   鈹溾攢鈹� UnbindContainerRequestDto.cs      # 鏂板锛氳В缁戣姹侱TO
+鈹�   鈹�   鈹斺攢鈹� ContainerNgReportRequestDto.cs    # 鏂板锛歂G涓婃姤璇锋眰DTO
+鈹�   鈹斺攢鈹� Models/
+鈹�       鈹斺攢鈹� Mes/
+鈹�           鈹斺攢鈹� Dt_MesApiLog.cs                # 鏂板锛氭棩蹇楀疄浣�
+鈹斺攢鈹� Database/
+    鈹斺攢鈹� Scripts/
+        鈹斺攢鈹� 20260412_MesApiLog.sql             # 鏂板锛氭棩蹇楄〃鍒涘缓鑴氭湰
+```
+
+---
+
+## Task 1: 鍒涘缓鏁版嵁搴撹〃
+
+**Files:**
+- Create: `WMS/WIDESEA_WMSServer/Database/Scripts/20260412_MesApiLog.sql`
+
+- [ ] **Step 1: 鍒涘缓MES鎺ュ彛鏃ュ織琛⊿QL鑴氭湰**
+
+```sql
+-- =============================================
+-- WMS MES鎺ュ彛璋冪敤鏃ュ織琛�
+-- =============================================
+
+IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = 'Dt_MesApiLog')
+BEGIN
+    CREATE TABLE Dt_MesApiLog (
+        Id BIGINT PRIMARY KEY IDENTITY(1,1),
+        ApiType NVARCHAR(50) NOT NULL,           -- 鎺ュ彛绫诲瀷
+        RequestJson NVARCHAR(MAX) NULL,          -- 璇锋眰JSON
+        ResponseJson NVARCHAR(MAX) NULL,         -- 鍝嶅簲JSON
+        IsSuccess BIT NOT NULL DEFAULT 0,        -- 鏄惁鎴愬姛
+        ErrorMessage NVARCHAR(500) NULL,         -- 閿欒淇℃伅
+        ElapsedMs INT NOT NULL DEFAULT 0,        -- 鑰楁椂(姣)
+        CreateDate DATETIME NOT NULL,            -- 鍒涘缓鏃堕棿
+        Creator NVARCHAR(50) NULL,               -- 鍒涘缓浜�
+        ModifyDate DATETIME NULL,                -- 淇敼鏃堕棿
+        Modifier NVARCHAR(50) NULL               -- 淇敼浜�
+    );
+
+    -- 鍒涘缓绱㈠紩
+    CREATE INDEX IX_MesApiLog_ApiType ON Dt_MesApiLog(ApiType);
+    CREATE INDEX IX_MesApiLog_CreateDate ON Dt_MesApiLog(CreateDate);
+    CREATE INDEX IX_MesApiLog_IsSuccess ON Dt_MesApiLog(IsSuccess);
+
+    PRINT 'MES鎺ュ彛鏃ュ織琛� Dt_MesApiLog 鍒涘缓鎴愬姛';
+END
+ELSE
+BEGIN
+    PRINT 'MES鎺ュ彛鏃ュ織琛� Dt_MesApiLog 宸插瓨鍦�';
+END
+
+-- 鎻掑叆MES绯荤粺閰嶇疆
+IF NOT EXISTS (SELECT * FROM Dt_SystemConfig WHERE ConfigKey = 'MES_EquipmentCode')
+BEGIN
+    INSERT INTO Dt_SystemConfig (ConfigKey, ConfigValue, Description, CreateDate, Modifier)
+    VALUES ('MES_EquipmentCode', 'WCS_001', 'MES璁惧缂栫爜', GETDATE(), 'System');
+
+    INSERT INTO Dt_SystemConfig (ConfigKey, ConfigValue, Description, CreateDate, Modifier)
+    VALUES ('MES_ResourceCode', 'RESOURCE_001', 'MES璧勬簮缂栫爜', GETDATE(), 'System');
+
+    INSERT INTO Dt_SystemConfig (ConfigKey, ConfigValue, Description, CreateDate, Modifier)
+    VALUES ('MES_ApiBaseUrl', 'http://mes-server/api', 'MES鎺ュ彛鍦板潃', GETDATE(), 'System');
+
+    INSERT INTO Dt_SystemConfig (ConfigKey, ConfigValue, Description, CreateDate, Modifier)
+    VALUES ('MES_TimeoutSeconds', '30', 'MES鎺ュ彛瓒呮椂鏃堕棿(绉�)', GETDATE(), 'System');
+
+    PRINT 'MES绯荤粺閰嶇疆鎻掑叆鎴愬姛';
+END
+```
+
+- [ ] **Step 2: 鎵цSQL鑴氭湰鍒涘缓琛�**
+
+Run: 鍦⊿QL Server Management Studio涓墽琛岃鑴氭湰
+Expected: 琛ㄥ垱寤烘垚鍔燂紝閰嶇疆鎻掑叆鎴愬姛
+
+- [ ] **Step 3: 鎻愪氦**
+
+```bash
+git add WMS/WIDESEA_WMSServer/Database/Scripts/20260412_MesApiLog.sql
+git commit -m "feat(MES): 娣诲姞MES鎺ュ彛鏃ュ織琛ㄥ拰绯荤粺閰嶇疆
+
+- 鍒涘缓 Dt_MesApiLog 琛ㄨ褰曟帴鍙h皟鐢ㄦ棩蹇�
+- 娣诲姞MES鐩稿叧绯荤粺閰嶇疆椤癸紙璁惧缂栫爜銆佽祫婧愮紪鐮併�佹帴鍙e湴鍧�绛夛級
+
+Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>"
+```
+
+---
+
+## Task 2: 鍒涘缓鍚庣瀹炰綋鍜孌TO
+
+**Files:**
+- Create: `WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Mes/Dt_MesApiLog.cs`
+- Create: `WMS/WIDESEA_WMSServer/WIDESEA_DTO/Mes/MesApiLogDto.cs`
+- Create: `WMS/WIDESEA_WMSServer/WIDESEA_DTO/Mes/InboundInContainerRequestDto.cs`
+- Create: `WMS/WIDESEA_WMSServer/WIDESEA_DTO/Mes/OutboundInContainerRequestDto.cs`
+- Create: `WMS/WIDESEA_WMSServer/WIDESEA_DTO/Mes/BindContainerRequestDto.cs`
+- Create: `WMS/WIDESEA_WMSServer/WIDESEA_DTO/Mes/UnbindContainerRequestDto.cs`
+- Create: `WMS/WIDESEA_WMSServer/WIDESEA_DTO/Mes/ContainerNgReportRequestDto.cs`
+
+- [ ] **Step 1: 鍒涘缓MES鏃ュ織瀹炰綋**
+
+```csharp
+using SqlSugar;
+using System;
+
+namespace WIDESEA_Model.Models.Mes
+{
+    /// <summary>
+    /// MES鎺ュ彛璋冪敤鏃ュ織瀹炰綋
+    /// </summary>
+    [SugarTable("Dt_MesApiLog")]
+    public class Dt_MesApiLog
+    {
+        /// <summary>
+        /// 涓婚敭ID
+        /// </summary>
+        [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
+        public long Id { get; set; }
+
+        /// <summary>
+        /// 鎺ュ彛绫诲瀷锛欼nboundInContainer, OutboundInContainer, BindContainer, UnbindContainer, ContainerNgReport
+        /// </summary>
+        [SugarColumn(Length = 50, IsNullable = false)]
+        public string ApiType { get; set; }
+
+        /// <summary>
+        /// 璇锋眰JSON
+        /// </summary>
+        [SugarColumn(ColumnDataType = "nvarchar(max)", IsNullable = true)]
+        public string RequestJson { get; set; }
+
+        /// <summary>
+        /// 鍝嶅簲JSON
+        /// </summary>
+        [SugarColumn(ColumnDataType = "nvarchar(max)", IsNullable = true)]
+        public string ResponseJson { get; set; }
+
+        /// <summary>
+        /// 鏄惁鎴愬姛
+        /// </summary>
+        [SugarColumn(IsNullable = false)]
+        public bool IsSuccess { get; set; }
+
+        /// <summary>
+        /// 閿欒淇℃伅
+        /// </summary>
+        [SugarColumn(Length = 500, IsNullable = true)]
+        public string ErrorMessage { get; set; }
+
+        /// <summary>
+        /// 鑰楁椂锛堟绉掞級
+        /// </summary>
+        [SugarColumn(IsNullable = false)]
+        public int ElapsedMs { get; set; }
+
+        /// <summary>
+        /// 鍒涘缓鏃堕棿
+        /// </summary>
+        [SugarColumn(IsNullable = false)]
+        public DateTime CreateDate { get; set; }
+
+        /// <summary>
+        /// 鍒涘缓浜�
+        /// </summary>
+        [SugarColumn(Length = 50, IsNullable = true)]
+        public string Creator { get; set; }
+
+        /// <summary>
+        /// 淇敼鏃堕棿
+        /// </summary>
+        public DateTime? ModifyDate { get; set; }
+
+        /// <summary>
+        /// 淇敼浜�
+        /// </summary>
+        [SugarColumn(Length = 50, IsNullable = true)]
+        public string Modifier { get; set; }
+    }
+}
+```
+
+- [ ] **Step 2: 鍒涘缓MES鏃ュ織DTO**
+
+```csharp
+namespace WIDESEA_DTO.Mes
+{
+    /// <summary>
+    /// MES鎺ュ彛鏃ュ織DTO
+    /// </summary>
+    public class MesApiLogDto
+    {
+        /// <summary>
+        /// 鎺ュ彛绫诲瀷
+        /// </summary>
+        public string ApiType { get; set; }
+
+        /// <summary>
+        /// 璇锋眰JSON
+        /// </summary>
+        public string RequestJson { get; set; }
+
+        /// <summary>
+        /// 鍝嶅簲JSON
+        /// </summary>
+        public string ResponseJson { get; set; }
+
+        /// <summary>
+        /// 鏄惁鎴愬姛
+        /// </summary>
+        public bool IsSuccess { get; set; }
+
+        /// <summary>
+        /// 閿欒淇℃伅
+        /// </summary>
+        public string ErrorMessage { get; set; }
+
+        /// <summary>
+        /// 鑰楁椂锛堟绉掞級
+        /// </summary>
+        public int ElapsedMs { get; set; }
+
+        /// <summary>
+        /// 鍒涘缓浜�
+        /// </summary>
+        public string Creator { get; set; }
+    }
+}
+```
+
+- [ ] **Step 3: 鍒涘缓杩涚珯璇锋眰DTO**
+
+```csharp
+namespace WIDESEA_DTO.Mes
+{
+    /// <summary>
+    /// 鎵樼洏杩涚珯璇锋眰DTO
+    /// </summary>
+    public class InboundInContainerRequestDto
+    {
+        /// <summary>
+        /// 鎵樼洏缂栧彿
+        /// </summary>
+        public string PalletCode { get; set; }
+
+        /// <summary>
+        /// 搴撳瓨ID
+        /// </summary>
+        public long StockId { get; set; }
+    }
+}
+```
+
+- [ ] **Step 4: 鍒涘缓鍑虹珯璇锋眰DTO**
+
+```csharp
+using System.Collections.Generic;
+
+namespace WIDESEA_DTO.Mes
+{
+    /// <summary>
+    /// 鎵樼洏鍑虹珯璇锋眰DTO
+    /// </summary>
+    public class OutboundInContainerRequestDto
+    {
+        /// <summary>
+        /// 鎵樼洏缂栧彿
+        /// </summary>
+        public string PalletCode { get; set; }
+
+        /// <summary>
+        /// 搴撳瓨ID
+        /// </summary>
+        public long StockId { get; set; }
+
+        /// <summary>
+        /// 浜у搧鍙傛暟鍒楄〃锛堝彲閫夛級
+        /// </summary>
+        public List<ParamItemDto> ParamList { get; set; }
+
+        /// <summary>
+        /// 鍙傛暟椤笵TO
+        /// </summary>
+        public class ParamItemDto
+        {
+            /// <summary>
+            /// 鍙傛暟缂栫爜
+            /// </summary>
+            public string ParamCode { get; set; }
+
+            /// <summary>
+            /// 鍙傛暟鍊�
+            /// </summary>
+            public string ParamValue { get; set; }
+
+            /// <summary>
+            /// 閲囬泦鏃堕棿
+            /// </summary>
+            public string CollectionTime { get; set; }
+        }
+    }
+}
+```
+
+- [ ] **Step 5: 鍒涘缓缁戝畾璇锋眰DTO**
+
+```csharp
+using System.Collections.Generic;
+
+namespace WIDESEA_DTO.Mes
+{
+    /// <summary>
+    /// 鎵樼洏鐢佃姱缁戝畾璇锋眰DTO
+    /// </summary>
+    public class BindContainerRequestDto
+    {
+        /// <summary>
+        /// 鎵樼洏缂栧彿
+        /// </summary>
+        public string PalletCode { get; set; }
+
+        /// <summary>
+        /// 鐢佃姱鐮佸垪琛�
+        /// </summary>
+        public List<string> SfcList { get; set; }
+
+        /// <summary>
+        /// 浣嶇疆淇℃伅
+        /// </summary>
+        public string Location { get; set; }
+
+        /// <summary>
+        /// 鎿嶄綔绫诲瀷锛�0-榛樿 1-杩涚珯 2-鍑虹珯 3-杩涘嚭绔�
+        /// </summary>
+        public int OperationType { get; set; } = 1;
+    }
+}
+```
+
+- [ ] **Step 6: 鍒涘缓瑙g粦璇锋眰DTO**
+
+```csharp
+using System.Collections.Generic;
+
+namespace WIDESEA_DTO.Mes
+{
+    /// <summary>
+    /// 鎵樼洏鐢佃姱瑙g粦璇锋眰DTO
+    /// </summary>
+    public class UnbindContainerRequestDto
+    {
+        /// <summary>
+        /// 鎵樼洏缂栧彿
+        /// </summary>
+        public string PalletCode { get; set; }
+
+        /// <summary>
+        /// 鐢佃姱鐮佸垪琛�
+        /// </summary>
+        public List<string> SfcList { get; set; }
+    }
+}
+```
+
+- [ ] **Step 7: 鍒涘缓NG涓婃姤璇锋眰DTO**
+
+```csharp
+using System.Collections.Generic;
+
+namespace WIDESEA_DTO.Mes
+{
+    /// <summary>
+    /// 鎵樼洏NG鐢佃姱涓婃姤璇锋眰DTO
+    /// </summary>
+    public class ContainerNgReportRequestDto
+    {
+        /// <summary>
+        /// 鎵樼洏缂栧彿
+        /// </summary>
+        public string PalletCode { get; set; }
+
+        /// <summary>
+        /// NG鐢佃姱鍒楄〃
+        /// </summary>
+        public List<NgSfcItemDto> NgSfcList { get; set; }
+
+        /// <summary>
+        /// NG鐢佃姱椤笵TO
+        /// </summary>
+        public class NgSfcItemDto
+        {
+            /// <summary>
+            /// 浜у搧鏉$爜
+            /// </summary>
+            public string Sfc { get; set; }
+
+            /// <summary>
+            /// NG浠g爜
+            /// </summary>
+            public string NgCode { get; set; }
+
+            /// <summary>
+            /// NG璁惧
+            /// </summary>
+            public string NgEquipmentCode { get; set; }
+
+            /// <summary>
+            /// NG璧勬簮
+            /// </summary>
+            public string NgResourceCode { get; set; }
+        }
+    }
+}
+```
+
+- [ ] **Step 8: 鎻愪氦**
+
+```bash
+git add WMS/WIDESEA_WMSServer/WIDESEA_Model/Models/Mes/Dt_MesApiLog.cs
+git add WMS/WIDESEA_WMSServer/WIDESEA_DTO/Mes/*.cs
+git commit -m "feat(MES): 娣诲姞MES鎺ュ彛鐩稿叧瀹炰綋鍜孌TO
+
+- 娣诲姞 Dt_MesApiLog 鏃ュ織瀹炰綋
+- 娣诲姞 MesApiLogDto 鍙婂悇鎺ュ彛璇锋眰DTO
+- 鏀寔杩涚珯銆佸嚭绔欍�佺粦瀹氥�佽В缁戙�丯G涓婃姤鎺ュ彛
+
+Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>"
+```
+
+---
+
+## Task 3: 鍒涘缓MES鏃ュ織鏈嶅姟
+
+**Files:**
+- Create: `WMS/WIDESEA_WMSServer/WIDESEA_IMesService/IMesLogService.cs`
+- Create: `WMS/WIDESEA_WMSServer/WIDESEA_MesService/MesLogService.cs`
+
+- [ ] **Step 1: 鍒涘缓MES鏃ュ織鏈嶅姟鎺ュ彛**
+
+```csharp
+using System.Collections.Generic;
+using System.Threading.Tasks;
+using WIDESEA_Core;
+using WIDESEA_DTO.Mes;
+
+namespace WIDESEA_IMesService
+{
+    /// <summary>
+    /// MES鎺ュ彛鏃ュ織鏈嶅姟鎺ュ彛
+    /// </summary>
+    public interface IMesLogService : IDependency
+    {
+        /// <summary>
+        /// 璁板綍MES鎺ュ彛璋冪敤鏃ュ織
+        /// </summary>
+        /// <param name="log">鏃ュ織DTO</param>
+        /// <returns>鏄惁璁板綍鎴愬姛</returns>
+        Task<bool> LogAsync(MesApiLogDto log);
+
+        /// <summary>
+        /// 鑾峰彇鏈�杩戠殑MES鎺ュ彛璋冪敤璁板綍
+        /// </summary>
+        /// <param name="apiType">鎺ュ彛绫诲瀷</param>
+        /// <param name="count">璁板綍鏁伴噺</param>
+        /// <returns>鏃ュ織鍒楄〃</returns>
+        Task<List<MesApiLogDto>> GetRecentLogsAsync(string apiType, int count = 50);
+    }
+}
+```
+
+- [ ] **Step 2: 鍒涘缓MES鏃ュ織鏈嶅姟瀹炵幇**
+
+```csharp
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using WIDESEA_Core;
+using WIDESEA_DTO.Mes;
+using WIDESEA_IMesService;
+using WIDESEA_Model.Models.Mes;
+
+namespace WIDESEA_MesService
+{
+    /// <summary>
+    /// MES鎺ュ彛鏃ュ織鏈嶅姟瀹炵幇
+    /// </summary>
+    public class MesLogService : IMesLogService
+    {
+        private readonly ISqlSugarClient _db;
+
+        /// <summary>
+        /// 鏋勯�犲嚱鏁�
+        /// </summary>
+        public MesLogService(ISqlSugarClient db)
+        {
+            _db = db;
+        }
+
+        /// <summary>
+        /// 璁板綍MES鎺ュ彛璋冪敤鏃ュ織
+        /// </summary>
+        public async Task<bool> LogAsync(MesApiLogDto log)
+        {
+            try
+            {
+                var entity = new Dt_MesApiLog
+                {
+                    ApiType = log.ApiType,
+                    RequestJson = log.RequestJson,
+                    ResponseJson = log.ResponseJson,
+                    IsSuccess = log.IsSuccess,
+                    ErrorMessage = log.ErrorMessage,
+                    ElapsedMs = log.ElapsedMs,
+                    CreateDate = DateTime.Now,
+                    Creator = log.Creator
+                };
+
+                var result = await _db.Insertable(entity).ExecuteCommandAsync();
+                return result > 0;
+            }
+            catch (Exception ex)
+            {
+                // 璁板綍鏃ュ織澶辫触涓嶅奖鍝嶄富娴佺▼
+                Console.WriteLine($"璁板綍MES鏃ュ織澶辫触: {ex.Message}");
+                return false;
+            }
+        }
+
+        /// <summary>
+        /// 鑾峰彇鏈�杩戠殑MES鎺ュ彛璋冪敤璁板綍
+        /// </summary>
+        public async Task<List<MesApiLogDto>> GetRecentLogsAsync(string apiType, int count = 50)
+        {
+            try
+            {
+                var entities = await _db.Queryable<Dt_MesApiLog>()
+                    .Where(x => x.ApiType == apiType)
+                    .OrderByDescending(x => x.CreateDate)
+                    .Take(count)
+                    .ToListAsync();
+
+                return entities.Select(e => new MesApiLogDto
+                {
+                    ApiType = e.ApiType,
+                    RequestJson = e.RequestJson,
+                    ResponseJson = e.ResponseJson,
+                    IsSuccess = e.IsSuccess,
+                    ErrorMessage = e.ErrorMessage,
+                    ElapsedMs = e.ElapsedMs,
+                    Creator = e.Creator
+                }).ToList();
+            }
+            catch (Exception ex)
+            {
+                Console.WriteLine($"鑾峰彇MES鏃ュ織澶辫触: {ex.Message}");
+                return new List<MesApiLogDto>();
+            }
+        }
+    }
+}
+```
+
+- [ ] **Step 3: 鎻愪氦**
+
+```bash
+git add WMS/WIDESEA_WMSServer/WIDESEA_IMesService/IMesLogService.cs
+git add WMS/WIDESEA_WMSServer/WIDESEA_MesService/MesLogService.cs
+git commit -m "feat(MES): 娣诲姞MES鏃ュ織鏈嶅姟
+
+- 瀹炵幇 IMesLogService 鎺ュ彛
+- 鏀寔璁板綍鍜屾煡璇ES鎺ュ彛璋冪敤鏃ュ織
+- 寮傚父澶勭悊涓嶅奖鍝嶄富娴佺▼
+
+Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>"
+```
+
+---
+
+## Task 4: 鎵╁睍StockInfoController娣诲姞杩涚珯/鍑虹珯鎺ュ彛
+
+**Files:**
+- Modify: `WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Stock/StockInfoController.cs`
+
+- [ ] **Step 1: 鍦⊿tockInfoController涓坊鍔燤ES鎺ュ彛鏂规硶**
+
+鍦ㄧ幇鏈塖tockInfoController绫讳腑娣诲姞浠ヤ笅鏂规硶锛�
+
+```csharp
+/// <summary>
+/// MES鏃ュ織鏈嶅姟
+/// </summary>
+private readonly IMesLogService _mesLogService;
+
+/// <summary>
+/// MES鏈嶅姟锛堝凡鍦ㄩ」鐩腑瀹氫箟锛�
+/// </summary>
+private readonly IMesService _mesService;
+
+/// <summary>
+/// 绯荤粺閰嶇疆鏈嶅姟
+/// </summary>
+private readonly ISystemConfigService _configService;
+
+// 鍦ㄦ瀯閫犲嚱鏁颁腑娉ㄥ叆杩欎簺鏈嶅姟锛堝鏋滃皻鏈敞鍏ワ級
+```
+
+娣诲姞杩涚珯鎺ュ彛锛�
+
+```csharp
+/// <summary>
+/// 鎵樼洏杩涚珯 - 璋冪敤MES鎺ュ彛
+/// </summary>
+/// <param name="dto">杩涚珯璇锋眰DTO</param>
+/// <returns>鎿嶄綔缁撴灉</returns>
+[HttpPost("inboundInContainer")]
+[Permission("MES_INBOUND")]
+public async Task<WebResponseContent> InboundInContainer([FromBody] InboundInContainerRequestDto dto)
+{
+    var response = new WebResponseContent();
+    var stopwatch = System.Diagnostics.Stopwatch.StartNew();
+
+    try
+    {
+        // 1. 鍙傛暟楠岃瘉
+        if (string.IsNullOrWhiteSpace(dto.PalletCode))
+        {
+            return response.Error("鎵樼洏缂栧彿涓嶈兘涓虹┖");
+        }
+
+        // 2. 鏌ヨ搴撳瓨淇℃伅
+        var stockInfo = await _service.FindAsIQueryable(x => x.Id == dto.StockId)
+            .FirstAsync();
+
+        if (stockInfo == null)
+        {
+            return response.Error("搴撳瓨淇℃伅涓嶅瓨鍦�");
+        }
+
+        // 3. 楠岃瘉搴撳瓨鐘舵�侊紙浠�"寰呭叆搴�"鐘舵�佸厑璁歌繘绔欙級
+        if (stockInfo.Status != 0) // 鍋囪0=寰呭叆搴�
+        {
+            return response.Error($"褰撳墠搴撳瓨鐘舵�佷笉鍏佽杩涚珯鎿嶄綔");
+        }
+
+        // 4. 鑾峰彇绯荤粺閰嶇疆
+        var equipmentCode = await _configService.GetConfigValueAsync("MES_EquipmentCode");
+        var resourceCode = await _configService.GetConfigValueAsync("MES_ResourceCode");
+
+        if (string.IsNullOrWhiteSpace(equipmentCode) || string.IsNullOrWhiteSpace(resourceCode))
+        {
+            return response.Error("MES绯荤粺閰嶇疆涓嶅畬鏁达紝璇疯仈绯荤鐞嗗憳");
+        }
+
+        // 5. 鏋勯�燤ES璇锋眰
+        var mesRequest = new InboundInContainerRequest
+        {
+            EquipmentCode = equipmentCode,
+            ResourceCode = resourceCode,
+            LocalTime = DateTime.Now,
+            ContainerCode = dto.PalletCode
+        };
+
+        string requestJson = System.Text.Json.JsonSerializer.Serialize(mesRequest);
+
+        // 6. 璋冪敤MES鎺ュ彛
+        var mesResult = await _mesService.InboundInContainer(mesRequest);
+        stopwatch.Stop();
+
+        // 7. 璁板綍鏃ュ織
+        await _mesLogService.LogAsync(new MesApiLogDto
+        {
+            ApiType = "InboundInContainer",
+            RequestJson = requestJson,
+            ResponseJson = System.Text.Json.JsonSerializer.Serialize(mesResult),
+            IsSuccess = mesResult.Success,
+            ErrorMessage = mesResult.ErrorMessage,
+            ElapsedMs = (int)stopwatch.ElapsedMilliseconds,
+            Creator = UserContext.Current.UserName
+        });
+
+        // 8. 杩斿洖缁撴灉
+        if (mesResult.Success)
+        {
+            return response.OK("鎵樼洏杩涚珯鎴愬姛");
+        }
+        else
+        {
+            return response.Error($"MES鎺ュ彛璋冪敤澶辫触: {mesResult.ErrorMessage}");
+        }
+    }
+    catch (System.Exception ex)
+    {
+        stopwatch.Stop();
+
+        // 璁板綍閿欒鏃ュ織
+        await _mesLogService.LogAsync(new MesApiLogDto
+        {
+            ApiType = "InboundInContainer",
+            IsSuccess = false,
+            ErrorMessage = ex.Message,
+            ElapsedMs = (int)stopwatch.ElapsedMilliseconds,
+            Creator = UserContext.Current.UserName
+        });
+
+        return response.Error($"鎵樼洏杩涚珯澶辫触: {ex.Message}");
+    }
+}
+```
+
+娣诲姞鍑虹珯鎺ュ彛锛�
+
+```csharp
+/// <summary>
+/// 鎵樼洏鍑虹珯 - 璋冪敤MES鎺ュ彛
+/// </summary>
+/// <param name="dto">鍑虹珯璇锋眰DTO</param>
+/// <returns>鎿嶄綔缁撴灉</returns>
+[HttpPost("outboundInContainer")]
+[Permission("MES_OUTBOUND")]
+public async Task<WebResponseContent> OutboundInContainer([FromBody] OutboundInContainerRequestDto dto)
+{
+    var response = new WebResponseContent();
+    var stopwatch = System.Diagnostics.Stopwatch.StartNew();
+
+    try
+    {
+        // 1. 鍙傛暟楠岃瘉
+        if (string.IsNullOrWhiteSpace(dto.PalletCode))
+        {
+            return response.Error("鎵樼洏缂栧彿涓嶈兘涓虹┖");
+        }
+
+        // 2. 鏌ヨ搴撳瓨淇℃伅
+        var stockInfo = await _service.FindAsIQueryable(x => x.Id == dto.StockId)
+            .FirstAsync();
+
+        if (stockInfo == null)
+        {
+            return response.Error("搴撳瓨淇℃伅涓嶅瓨鍦�");
+        }
+
+        // 3. 楠岃瘉搴撳瓨鐘舵�侊紙"鍦ㄥ簱"鎴�"鍑哄簱涓�"鐘舵�佸厑璁稿嚭绔欙級
+        if (stockInfo.Status != 1 && stockInfo.Status != 2) // 鍋囪1=鍦ㄥ簱, 2=鍑哄簱涓�
+        {
+            return response.Error($"褰撳墠搴撳瓨鐘舵�佷笉鍏佽鍑虹珯鎿嶄綔");
+        }
+
+        // 4. 鑾峰彇绯荤粺閰嶇疆
+        var equipmentCode = await _configService.GetConfigValueAsync("MES_EquipmentCode");
+        var resourceCode = await _configService.GetConfigValueAsync("MES_ResourceCode");
+
+        if (string.IsNullOrWhiteSpace(equipmentCode) || string.IsNullOrWhiteSpace(resourceCode))
+        {
+            return response.Error("MES绯荤粺閰嶇疆涓嶅畬鏁达紝璇疯仈绯荤鐞嗗憳");
+        }
+
+        // 5. 鏋勯�燤ES璇锋眰
+        var mesRequest = new OutboundInContainerRequest
+        {
+            EquipmentCode = equipmentCode,
+            ResourceCode = resourceCode,
+            LocalTime = DateTime.Now,
+            ContainerCode = dto.PalletCode,
+            ParamList = dto.ParamList?.Select(p => new ParamItem
+            {
+                ParamCode = p.ParamCode,
+                ParamValue = p.ParamValue,
+                CollectionTime = DateTime.TryParse(p.CollectionTime, out var ct) ? ct : DateTime.Now
+            }).ToList()
+        };
+
+        string requestJson = System.Text.Json.JsonSerializer.Serialize(mesRequest);
+
+        // 6. 璋冪敤MES鎺ュ彛
+        var mesResult = await _mesService.OutboundInContainer(mesRequest);
+        stopwatch.Stop();
+
+        // 7. 璁板綍鏃ュ織
+        await _mesLogService.LogAsync(new MesApiLogDto
+        {
+            ApiType = "OutboundInContainer",
+            RequestJson = requestJson,
+            ResponseJson = System.Text.Json.JsonSerializer.Serialize(mesResult),
+            IsSuccess = mesResult.Success,
+            ErrorMessage = mesResult.ErrorMessage,
+            ElapsedMs = (int)stopwatch.ElapsedMilliseconds,
+            Creator = UserContext.Current.UserName
+        });
+
+        // 8. 杩斿洖缁撴灉
+        if (mesResult.Success)
+        {
+            return response.OK("鎵樼洏鍑虹珯鎴愬姛");
+        }
+        else
+        {
+            return response.Error($"MES鎺ュ彛璋冪敤澶辫触: {mesResult.ErrorMessage}");
+        }
+    }
+    catch (System.Exception ex)
+    {
+        stopwatch.Stop();
+
+        // 璁板綍閿欒鏃ュ織
+        await _mesLogService.LogAsync(new MesApiLogDto
+        {
+            ApiType = "OutboundInContainer",
+            IsSuccess = false,
+            ErrorMessage = ex.Message,
+            ElapsedMs = (int)stopwatch.ElapsedMilliseconds,
+            Creator = UserContext.Current.UserName
+        });
+
+        return response.Error($"鎵樼洏鍑虹珯澶辫触: {ex.Message}");
+    }
+}
+```
+
+- [ ] **Step 2: 娣诲姞蹇呰鐨剈sing璇彞**
+
+鍦ㄦ枃浠堕《閮ㄦ坊鍔狅細
+
+```csharp
+using WIDESEA_DTO.MES;
+using WIDESEA_DTO.Mes;
+using WIDESEA_IMesService;
+```
+
+- [ ] **Step 3: 鎻愪氦**
+
+```bash
+git add WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Stock/StockInfoController.cs
+git commit -m "feat(MES): 搴撳瓨淇℃伅椤甸潰娣诲姞杩涚珯/鍑虹珯鎺ュ彛
+
+- POST /api/StockInfo/inboundInContainer 鎵樼洏杩涚珯
+- POST /api/StockInfo/outboundInContainer 鎵樼洏鍑虹珯
+- 娣诲姞搴撳瓨鐘舵�佹牎楠�
+- 璁板綍瀹屾暣璋冪敤鏃ュ織
+
+Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>"
+```
+
+---
+
+## Task 5: 鎵╁睍StockInfoDetailController娣诲姞缁戝畾/瑙g粦/NG涓婃姤鎺ュ彛
+
+**Files:**
+- Modify: `WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Stock/StockInfoDetailController.cs`
+
+- [ ] **Step 1: 鍦⊿tockInfoDetailController涓坊鍔燤ES鎺ュ彛鏂规硶**
+
+鍦ㄧ幇鏈塖tockInfoDetailController绫讳腑娣诲姞渚濊禆娉ㄥ叆鍜屾帴鍙f柟娉曪細
+
+```csharp
+/// <summary>
+/// MES鏃ュ織鏈嶅姟
+/// </summary>
+private readonly IMesLogService _mesLogService;
+
+/// <summary>
+/// MES鏈嶅姟
+/// </summary>
+private readonly IMesService _mesService;
+
+/// <summary>
+/// 绯荤粺閰嶇疆鏈嶅姟
+/// </summary>
+private readonly ISystemConfigService _configService;
+```
+
+娣诲姞缁戝畾鎺ュ彛锛�
+
+```csharp
+/// <summary>
+/// 鎵樼洏鐢佃姱缁戝畾 - 璋冪敤MES鎺ュ彛
+/// </summary>
+/// <param name="dto">缁戝畾璇锋眰DTO</param>
+/// <returns>鎿嶄綔缁撴灉</returns>
+[HttpPost("bindContainer")]
+[Permission("MES_BIND")]
+public async Task<WebResponseContent> BindContainer([FromBody] BindContainerRequestDto dto)
+{
+    var response = new WebResponseContent();
+    var stopwatch = System.Diagnostics.Stopwatch.StartNew();
+
+    try
+    {
+        // 1. 鍙傛暟楠岃瘉
+        if (string.IsNullOrWhiteSpace(dto.PalletCode))
+        {
+            return response.Error("鎵樼洏缂栧彿涓嶈兘涓虹┖");
+        }
+
+        if (dto.SfcList == null || !dto.SfcList.Any())
+        {
+            return response.Error("鐢佃姱鐮佸垪琛ㄤ笉鑳戒负绌�");
+        }
+
+        // 2. 鑾峰彇绯荤粺閰嶇疆
+        var equipmentCode = await _configService.GetConfigValueAsync("MES_EquipmentCode");
+        var resourceCode = await _configService.GetConfigValueAsync("MES_ResourceCode");
+
+        if (string.IsNullOrWhiteSpace(equipmentCode) || string.IsNullOrWhiteSpace(resourceCode))
+        {
+            return response.Error("MES绯荤粺閰嶇疆涓嶅畬鏁达紝璇疯仈绯荤鐞嗗憳");
+        }
+
+        // 3. 鏋勯�燤ES璇锋眰
+        var mesRequest = new BindContainerRequest
+        {
+            EquipmentCode = equipmentCode,
+            ResourceCode = resourceCode,
+            LocalTime = DateTime.Now,
+            ContainerCode = dto.PalletCode,
+            ContainerSfcList = dto.SfcList.Select(sfc => new ContainerSfcItem
+            {
+                Sfc = sfc,
+                Location = dto.Location ?? ""
+            }).ToList(),
+            OperationType = dto.OperationType
+        };
+
+        string requestJson = System.Text.Json.JsonSerializer.Serialize(mesRequest);
+
+        // 4. 璋冪敤MES鎺ュ彛
+        var mesResult = await _mesService.BindContainer(mesRequest);
+        stopwatch.Stop();
+
+        // 5. 璁板綍鏃ュ織
+        await _mesLogService.LogAsync(new MesApiLogDto
+        {
+            ApiType = "BindContainer",
+            RequestJson = requestJson,
+            ResponseJson = System.Text.Json.JsonSerializer.Serialize(mesResult),
+            IsSuccess = mesResult.Success,
+            ErrorMessage = mesResult.ErrorMessage,
+            ElapsedMs = (int)stopwatch.ElapsedMilliseconds,
+            Creator = UserContext.Current.UserName
+        });
+
+        // 6. 杩斿洖缁撴灉
+        if (mesResult.Success)
+        {
+            return response.OK($"鎴愬姛缁戝畾 {dto.SfcList.Count} 涓數鑺�");
+        }
+        else
+        {
+            return response.Error($"MES鎺ュ彛璋冪敤澶辫触: {mesResult.ErrorMessage}");
+        }
+    }
+    catch (System.Exception ex)
+    {
+        stopwatch.Stop();
+
+        await _mesLogService.LogAsync(new MesApiLogDto
+        {
+            ApiType = "BindContainer",
+            IsSuccess = false,
+            ErrorMessage = ex.Message,
+            ElapsedMs = (int)stopwatch.ElapsedMilliseconds,
+            Creator = UserContext.Current.UserName
+        });
+
+        return response.Error($"鐢佃姱缁戝畾澶辫触: {ex.Message}");
+    }
+}
+```
+
+娣诲姞瑙g粦鎺ュ彛锛�
+
+```csharp
+/// <summary>
+/// 鎵樼洏鐢佃姱瑙g粦 - 璋冪敤MES鎺ュ彛
+/// </summary>
+/// <param name="dto">瑙g粦璇锋眰DTO</param>
+/// <returns>鎿嶄綔缁撴灉</returns>
+[HttpPost("unbindContainer")]
+[Permission("MES_UNBIND")]
+public async Task<WebResponseContent> UnbindContainer([FromBody] UnbindContainerRequestDto dto)
+{
+    var response = new WebResponseContent();
+    var stopwatch = System.Diagnostics.Stopwatch.StartNew();
+
+    try
+    {
+        // 1. 鍙傛暟楠岃瘉
+        if (string.IsNullOrWhiteSpace(dto.PalletCode))
+        {
+            return response.Error("鎵樼洏缂栧彿涓嶈兘涓虹┖");
+        }
+
+        if (dto.SfcList == null || !dto.SfcList.Any())
+        {
+            return response.Error("鐢佃姱鐮佸垪琛ㄤ笉鑳戒负绌�");
+        }
+
+        // 2. 鑾峰彇绯荤粺閰嶇疆
+        var equipmentCode = await _configService.GetConfigValueAsync("MES_EquipmentCode");
+        var resourceCode = await _configService.GetConfigValueAsync("MES_ResourceCode");
+
+        if (string.IsNullOrWhiteSpace(equipmentCode) || string.IsNullOrWhiteSpace(resourceCode))
+        {
+            return response.Error("MES绯荤粺閰嶇疆涓嶅畬鏁达紝璇疯仈绯荤鐞嗗憳");
+        }
+
+        // 3. 鏋勯�燤ES璇锋眰
+        var mesRequest = new UnBindContainerRequest
+        {
+            EquipmentCode = equipmentCode,
+            ResourceCode = resourceCode,
+            LocalTime = DateTime.Now,
+            ContainCode = dto.PalletCode,
+            SfcList = dto.SfcList
+        };
+
+        string requestJson = System.Text.Json.JsonSerializer.Serialize(mesRequest);
+
+        // 4. 璋冪敤MES鎺ュ彛
+        var mesResult = await _mesService.UnBindContainer(mesRequest);
+        stopwatch.Stop();
+
+        // 5. 璁板綍鏃ュ織
+        await _mesLogService.LogAsync(new MesApiLogDto
+        {
+            ApiType = "UnbindContainer",
+            RequestJson = requestJson,
+            ResponseJson = System.Text.Json.JsonSerializer.Serialize(mesResult),
+            IsSuccess = mesResult.Success,
+            ErrorMessage = mesResult.ErrorMessage,
+            ElapsedMs = (int)stopwatch.ElapsedMilliseconds,
+            Creator = UserContext.Current.UserName
+        });
+
+        // 6. 杩斿洖缁撴灉
+        if (mesResult.Success)
+        {
+            return response.OK($"鎴愬姛瑙g粦 {dto.SfcList.Count} 涓數鑺�");
+        }
+        else
+        {
+            return response.Error($"MES鎺ュ彛璋冪敤澶辫触: {mesResult.ErrorMessage}");
+        }
+    }
+    catch (System.Exception ex)
+    {
+        stopwatch.Stop();
+
+        await _mesLogService.LogAsync(new MesApiLogDto
+        {
+            ApiType = "UnbindContainer",
+            IsSuccess = false,
+            ErrorMessage = ex.Message,
+            ElapsedMs = (int)stopwatch.ElapsedMilliseconds,
+            Creator = UserContext.Current.UserName
+        });
+
+        return response.Error($"鐢佃姱瑙g粦澶辫触: {ex.Message}");
+    }
+}
+```
+
+娣诲姞NG涓婃姤鎺ュ彛锛�
+
+```csharp
+/// <summary>
+/// 鎵樼洏NG鐢佃姱涓婃姤 - 璋冪敤MES鎺ュ彛
+/// </summary>
+/// <param name="dto">NG涓婃姤璇锋眰DTO</param>
+/// <returns>鎿嶄綔缁撴灉</returns>
+[HttpPost("containerNgReport")]
+[Permission("MES_NG_REPORT")]
+public async Task<WebResponseContent> ContainerNgReport([FromBody] ContainerNgReportRequestDto dto)
+{
+    var response = new WebResponseContent();
+    var stopwatch = System.Diagnostics.Stopwatch.StartNew();
+
+    try
+    {
+        // 1. 鍙傛暟楠岃瘉
+        if (string.IsNullOrWhiteSpace(dto.PalletCode))
+        {
+            return response.Error("鎵樼洏缂栧彿涓嶈兘涓虹┖");
+        }
+
+        if (dto.NgSfcList == null || !dto.NgSfcList.Any())
+        {
+            return response.Error("NG鐢佃姱鍒楄〃涓嶈兘涓虹┖");
+        }
+
+        // 2. 鑾峰彇绯荤粺閰嶇疆
+        var equipmentCode = await _configService.GetConfigValueAsync("MES_EquipmentCode");
+        var resourceCode = await _configService.GetConfigValueAsync("MES_ResourceCode");
+
+        if (string.IsNullOrWhiteSpace(equipmentCode) || string.IsNullOrWhiteSpace(resourceCode))
+        {
+            return response.Error("MES绯荤粺閰嶇疆涓嶅畬鏁达紝璇疯仈绯荤鐞嗗憳");
+        }
+
+        // 3. 鏋勯�燤ES璇锋眰
+        var mesRequest = new ContainerNgReportRequest
+        {
+            EquipmentCode = equipmentCode,
+            ResourceCode = resourceCode,
+            LocalTime = DateTime.Now,
+            ContainerCode = dto.PalletCode,
+            NgSfcList = dto.NgSfcList.Select(ng => new NgSfcItem
+            {
+                Sfc = ng.Sfc,
+                NgCode = ng.NgCode,
+                NgEquipmentCode = ng.NgEquipmentCode,
+                NgResourceCode = ng.NgResourceCode
+            }).ToList()
+        };
+
+        string requestJson = System.Text.Json.JsonSerializer.Serialize(mesRequest);
+
+        // 4. 璋冪敤MES鎺ュ彛
+        var mesResult = await _mesService.ContainerNgReport(mesRequest);
+        stopwatch.Stop();
+
+        // 5. 璁板綍鏃ュ織
+        await _mesLogService.LogAsync(new MesApiLogDto
+        {
+            ApiType = "ContainerNgReport",
+            RequestJson = requestJson,
+            ResponseJson = System.Text.Json.JsonSerializer.Serialize(mesResult),
+            IsSuccess = mesResult.Success,
+            ErrorMessage = mesResult.ErrorMessage,
+            ElapsedMs = (int)stopwatch.ElapsedMilliseconds,
+            Creator = UserContext.Current.UserName
+        });
+
+        // 6. 杩斿洖缁撴灉
+        if (mesResult.Success)
+        {
+            return response.OK($"鎴愬姛涓婃姤 {dto.NgSfcList.Count} 涓狽G鐢佃姱");
+        }
+        else
+        {
+            return response.Error($"MES鎺ュ彛璋冪敤澶辫触: {mesResult.ErrorMessage}");
+        }
+    }
+    catch (System.Exception ex)
+    {
+        stopwatch.Stop();
+
+        await _mesLogService.LogAsync(new MesApiLogDto
+        {
+            ApiType = "ContainerNgReport",
+            IsSuccess = false,
+            ErrorMessage = ex.Message,
+            ElapsedMs = (int)stopwatch.ElapsedMilliseconds,
+            Creator = UserContext.Current.UserName
+        });
+
+        return response.Error($"NG涓婃姤澶辫触: {ex.Message}");
+    }
+}
+```
+
+- [ ] **Step 2: 娣诲姞蹇呰鐨剈sing璇彞**
+
+鍦ㄦ枃浠堕《閮ㄦ坊鍔狅細
+
+```csharp
+using WIDESEA_DTO.MES;
+using WIDESEA_DTO.Mes;
+using WIDESEA_IMesService;
+```
+
+- [ ] **Step 3: 鎻愪氦**
+
+```bash
+git add WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Stock/StockInfoDetailController.cs
+git commit -m "feat(MES): 搴撳瓨鏄庣粏椤甸潰娣诲姞缁戝畾/瑙g粦/NG涓婃姤鎺ュ彛
+
+- POST /api/StockInfoDetail/bindContainer 鎵樼洏鐢佃姱缁戝畾
+- POST /api/StockInfoDetail/unbindContainer 鎵樼洏鐢佃姱瑙g粦
+- POST /api/StockInfoDetail/containerNgReport NG鐢佃姱涓婃姤
+- 璁板綍瀹屾暣璋冪敤鏃ュ織
+
+Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>"
+```
+
+---
+
+## Task 6: 鍒涘缓鍓嶇MES API璋冪敤妯″潡
+
+**Files:**
+- Create: `WMS/WIDESEA_WMSClient/src/api/mes.js`
+
+- [ ] **Step 1: 鍒涘缓MES API妯″潡**
+
+```javascript
+/**
+ * MES鎺ュ彛API妯″潡
+ */
+import axios from 'axios';
+
+const baseURL = '/api';
+
+// 搴撳瓨淇℃伅鐩稿叧MES鎺ュ彛
+export const stockInfoMesApi = {
+  /**
+   * 鎵樼洏杩涚珯
+   * @param {Object} data - 璇锋眰鏁版嵁 { palletCode, stockId }
+   * @returns {Promise}
+   */
+  inboundInContainer(data) {
+    return axios.post(`${baseURL}/StockInfo/inboundInContainer`, data);
+  },
+
+  /**
+   * 鎵樼洏鍑虹珯
+   * @param {Object} data - 璇锋眰鏁版嵁 { palletCode, stockId, paramList }
+   * @returns {Promise}
+   */
+  outboundInContainer(data) {
+    return axios.post(`${baseURL}/StockInfo/outboundInContainer`, data);
+  }
+};
+
+// 搴撳瓨鏄庣粏鐩稿叧MES鎺ュ彛
+export const stockDetailMesApi = {
+  /**
+   * 鎵樼洏鐢佃姱缁戝畾
+   * @param {Object} data - 璇锋眰鏁版嵁 { palletCode, sfcList, location, operationType }
+   * @returns {Promise}
+   */
+  bindContainer(data) {
+    return axios.post(`${baseURL}/StockInfoDetail/bindContainer`, data);
+  },
+
+  /**
+   * 鎵樼洏鐢佃姱瑙g粦
+   * @param {Object} data - 璇锋眰鏁版嵁 { palletCode, sfcList }
+   * @returns {Promise}
+   */
+  unbindContainer(data) {
+    return axios.post(`${baseURL}/StockInfoDetail/unbindContainer`, data);
+  },
+
+  /**
+   * 鎵樼洏NG鐢佃姱涓婃姤
+   * @param {Object} data - 璇锋眰鏁版嵁 { palletCode, ngSfcList }
+   * @returns {Promise}
+   */
+  containerNgReport(data) {
+    return axios.post(`${baseURL}/StockInfoDetail/containerNgReport`, data);
+  }
+};
+
+export default {
+  stockInfo: stockInfoMesApi,
+  stockDetail: stockDetailMesApi
+};
+```
+
+- [ ] **Step 2: 鎻愪氦**
+
+```bash
+git add WMS/WIDESEA_WMSClient/src/api/mes.js
+git commit -m "feat(MES): 娣诲姞鍓嶇MES API璋冪敤妯″潡
+
+- 灏佽搴撳瓨淇℃伅杩涚珯/鍑虹珯鎺ュ彛
+- 灏佽搴撳瓨鏄庣粏缁戝畾/瑙g粦/NG涓婃姤鎺ュ彛
+
+Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>"
+```
+
+---
+
+## Task 7: 鍒涘缓MES纭瀵硅瘽妗嗙粍浠�
+
+**Files:**
+- Create: `WMS/WIDESEA_WMSClient/src/components/MesConfirmDialog.vue`
+
+- [ ] **Step 1: 鍒涘缓纭瀵硅瘽妗嗙粍浠�**
+
+```vue
+<template>
+  <el-dialog
+    v-model="visible"
+    :title="dialogTitle"
+    width="500px"
+    :close-on-click-modal="false"
+    @close="handleClose"
+  >
+    <div class="mes-confirm-content">
+      <p class="operation-text">{{ operationText }}</p>
+
+      <div class="info-section">
+        <div class="info-row" v-for="(item, index) in displayInfo" :key="index">
+          <span class="info-label">{{ item.label }}:</span>
+          <span class="info-value">{{ item.value }}</span>
+        </div>
+      </div>
+
+      <div v-if="errorMessage" class="error-message">
+        <el-icon><Warning /></el-icon>
+        <span>{{ errorMessage }}</span>
+      </div>
+    </div>
+
+    <template #footer>
+      <span class="dialog-footer">
+        <el-button @click="handleClose">鍙栨秷</el-button>
+        <el-button
+          type="primary"
+          :loading="loading"
+          @click="handleConfirm"
+        >
+          纭鎵ц
+        </el-button>
+      </span>
+    </template>
+  </el-dialog>
+</template>
+
+<script>
+import { ref, computed } from 'vue';
+import { Warning } from '@element-plus/icons-vue';
+import { ElMessage } from 'element-plus';
+
+export default {
+  name: 'MesConfirmDialog',
+
+  components: {
+    Warning
+  },
+
+  props: {
+    modelValue: {
+      type: Boolean,
+      default: false
+    },
+    operationType: {
+      type: String,
+      required: true
+      },
+    palletCode: {
+      type: String,
+      required: true
+    },
+    stockInfo: {
+      type: Object,
+      default: null
+    },
+    detailInfo: {
+      type: Object,
+      default: null
+    }
+  },
+
+  emits: ['update:modelValue', 'confirm'],
+
+  setup(props, { emit }) {
+    const visible = computed({
+      get: () => props.modelValue,
+      set: (val) => emit('update:modelValue', val)
+    });
+
+    const loading = ref(false);
+    const errorMessage = ref('');
+
+    const operationConfig = {
+      inbound: { title: '鎵樼洏杩涚珯', text: '鎮ㄥ嵆灏嗘墽琛屾墭鐩樿繘绔欐搷浣�' },
+      outbound: { title: '鎵樼洏鍑虹珯', text: '鎮ㄥ嵆灏嗘墽琛屾墭鐩樺嚭绔欐搷浣�' },
+      bind: { title: '鐢佃姱缁戝畾', text: '鎮ㄥ嵆灏嗘墽琛岀數鑺粦瀹氭搷浣�' },
+      unbind: { title: '鐢佃姱瑙g粦', text: '鎮ㄥ嵆灏嗘墽琛岀數鑺В缁戞搷浣�' },
+      ngReport: { title: 'NG涓婃姤', text: '鎮ㄥ嵆灏嗘墽琛孨G鐢佃姱涓婃姤鎿嶄綔' }
+    };
+
+    const dialogTitle = computed(() => {
+      return operationConfig[props.operationType]?.title || '纭鎿嶄綔';
+    });
+
+    const operationText = computed(() => {
+      return operationConfig[props.operationType]?.text || '';
+    });
+
+    const displayInfo = computed(() => {
+      const info = [
+        { label: '鎵樼洏鐮�', value: props.palletCode }
+      ];
+
+      if (props.detailInfo) {
+        info.push({ label: '鐢佃姱鏁伴噺', value: props.detailInfo.sfcCount || '-' });
+      }
+
+      return info;
+    });
+
+    const handleClose = () => {
+      visible.value = false;
+      errorMessage.value = '';
+    };
+
+    const handleConfirm = async () => {
+      loading.value = true;
+      errorMessage.value = '';
+
+      try {
+        emit('confirm', {
+          operationType: props.operationType,
+          palletCode: props.palletCode,
+          stockInfo: props.stockInfo,
+          detailInfo: props.detailInfo,
+          onSuccess: () => {
+            visible.value = false;
+            loading.value = false;
+          },
+          onError: (error) => {
+            errorMessage.value = error;
+            loading.value = false;
+          }
+        });
+      } catch (error) {
+        errorMessage.value = error.message || '鎿嶄綔澶辫触';
+        loading.value = false;
+      }
+    };
+
+    return {
+      visible,
+      loading,
+      errorMessage,
+      dialogTitle,
+      operationText,
+      displayInfo,
+      handleClose,
+      handleConfirm
+    };
+  }
+};
+</script>
+
+<style scoped>
+.mes-confirm-content {
+  padding: 10px 0;
+}
+
+.operation-text {
+  font-size: 14px;
+  color: #303133;
+  margin-bottom: 20px;
+  font-weight: 500;
+}
+
+.info-section {
+  background: #f8fafc;
+  border-radius: 8px;
+  padding: 16px;
+  margin-bottom: 16px;
+}
+
+.info-row {
+  display: flex;
+  margin-bottom: 12px;
+  font-size: 14px;
+}
+
+.info-row:last-child {
+  margin-bottom: 0;
+}
+
+.info-label {
+  color: #909399;
+  width: 80px;
+  flex-shrink: 0;
+}
+
+.info-value {
+  color: #303133;
+  font-weight: 500;
+}
+
+.error-message {
+  display: flex;
+  align-items: center;
+  gap: 8px;
+  padding: 12px;
+  background: #fef0f0;
+  border: 1px solid #fde2e2;
+  border-radius: 6px;
+  color: #f56c6c;
+  font-size: 14px;
+}
+
+.error-message .el-icon {
+  font-size: 18px;
+}
+</style>
+```
+
+- [ ] **Step 2: 鎻愪氦**
+
+```bash
+git add WMS/WIDESEA_WMSClient/src/components/MesConfirmDialog.vue
+git commit -m "feat(MES): 娣诲姞MES鎿嶄綔纭瀵硅瘽妗嗙粍浠�
+
+- 鏀寔澶氱鎿嶄綔绫诲瀷锛堣繘绔欍�佸嚭绔欍�佺粦瀹氥�佽В缁戙�丯G涓婃姤锛�
+- 鏄剧ず鍏抽敭淇℃伅锛堟墭鐩樼爜銆佺數鑺暟閲忕瓑锛�
+- 閿欒鐘舵�佸睍绀�
+- 纭/鍙栨秷鎿嶄綔
+
+Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>"
+```
+
+---
+
+## Task 8: 淇敼stockInfo.vue娣诲姞鎿嶄綔鍒�
+
+**Files:**
+- Modify: `WMS/WIDESEA_WMSClient/src/views/stock/stockInfo.vue`
+
+- [ ] **Step 1: 鍦╯cript涓坊鍔犵粍浠跺紩鍏ュ拰鏂规硶**
+
+鍦ㄧ幇鏈夌殑script setup涓坊鍔狅細
+
+```javascript
+import MesConfirmDialog from '@/components/MesConfirmDialog.vue';
+import { stockInfoMesApi } from '@/api/mes';
+import { ElMessage, ElMessageBox } from 'element-plus';
+import { ref } from 'vue';
+
+// MES瀵硅瘽妗嗙姸鎬�
+const mesDialogVisible = ref(false);
+const currentOperationType = ref('');
+const currentStockRow = ref(null);
+const mesLoading = ref(false);
+
+// 鎵撳紑MES纭瀵硅瘽妗�
+const openMesDialog = (operationType, row) => {
+  currentOperationType.value = operationType;
+  currentStockRow.value = row;
+  mesDialogVisible.value = true;
+};
+
+// 澶勭悊MES纭
+const handleMesConfirm = async ({ onSuccess, onError }) => {
+  const row = currentStockRow.value;
+  const operationType = currentOperationType.value;
+
+  try {
+    let result;
+
+    switch (operationType) {
+      case 'inbound':
+        result = await stockInfoMesApi.inboundInContainer({
+          palletCode: row.palletCode,
+          stockId: row.id
+        });
+        break;
+      case 'outbound':
+        result = await stockInfoMesApi.outboundInContainer({
+          palletCode: row.palletCode,
+          stockId: row.id
+        });
+        break;
+    }
+
+    if (result.data.status) {
+      ElMessage.success(result.data.message || '鎿嶄綔鎴愬姛');
+      onSuccess();
+      // 鍒锋柊鍒楄〃
+      proxy.$refs.grid.load();
+    } else {
+      onError(result.data.message || '鎿嶄綔澶辫触');
+    }
+  } catch (error) {
+    onError(error.response?.data?.message || error.message || '缃戠粶閿欒锛岃绋嶅悗閲嶈瘯');
+  }
+};
+
+// 妫�鏌ユ寜閽槸鍚﹀簲璇ユ樉绀�
+const shouldShowButton = (buttonType, row) => {
+  const status = row.status; // 0=寰呭叆搴�, 1=鍦ㄥ簱, 2=鍑哄簱涓�, 3=閿佸畾
+
+  switch (buttonType) {
+    case 'inbound':
+      return status === 0; // 浠呭緟鍏ュ簱鏄剧ず杩涚珯
+    case 'outbound':
+      return status === 1 || status === 2; // 鍦ㄥ簱鎴栧嚭搴撲腑鏄剧ず鍑虹珯
+    default:
+      return false;
+  }
+};
+```
+
+- [ ] **Step 2: 鍦╟olumns涓坊鍔犳搷浣滃垪**
+
+鍦ㄧ幇鏈夌殑columns ref瀹氫箟涓坊鍔犳搷浣滃垪锛堝湪鏈�鍚庢坊鍔狅級锛�
+
+```javascript
+const columns = ref([
+  // ... 鐜版湁鍒楀畾涔� ...
+  {
+    field: "actions",
+    title: "鎿嶄綔",
+    width: 200,
+    fixed: "right",
+    align: "center",
+    formatter: (row) => {
+      const buttons = [];
+
+      if (shouldShowButton('inbound', row)) {
+        buttons.push(
+          `<el-button type="primary" size="small" onclick="window.handleInbound(${row.id})">杩涚珯</el-button>`
+        );
+      }
+
+      if (shouldShowButton('outbound', row)) {
+        buttons.push(
+          `<el-button type="success" size="small" onclick="window.handleOutbound(${row.id})">鍑虹珯</el-button>`
+        );
+      }
+
+      return buttons.join(' ');
+    }
+  }
+]);
+```
+
+- [ ] **Step 3: 鍦ㄦā鏉夸腑娣诲姞瀵硅瘽妗嗙粍浠�**
+
+鍦╰emplate涓殑view-grid鏍囩鍚庢坊鍔狅細
+
+```vue
+<template>
+  <view-grid ... >
+  </view-grid>
+
+  <!-- MES纭瀵硅瘽妗� -->
+  <MesConfirmDialog
+    v-model="mesDialogVisible"
+    :operation-type="currentOperationType"
+    :pallet-code="currentStockRow?.palletCode"
+    :stock-info="currentStockRow"
+    @confirm="handleMesConfirm"
+  />
+</template>
+```
+
+- [ ] **Step 4: 娣诲姞鍏ㄥ眬鏂规硶鐢ㄤ簬HTML瀛楃涓蹭腑鐨刼nclick**
+
+鍦╯etup鐨勬渶鍚庢坊鍔狅細
+
+```javascript
+// 鎸傝浇鍒皐indow渚汬TML瀛楃涓蹭腑鐨刼nclick浣跨敤
+window.handleInbound = (id) => {
+  const row = proxy.$refs.grid.tableData.find(item => item.id === id);
+  if (row) openMesDialog('inbound', row);
+};
+
+window.handleOutbound = (id) => {
+  const row = proxy.$refs.grid.tableData.find(item => item.id === id);
+  if (row) openMesDialog('outbound', row);
+};
+```
+
+- [ ] **Step 5: 鎻愪氦**
+
+```bash
+git add WMS/WIDESEA_WMSClient/src/views/stock/stockInfo.vue
+git commit -m "feat(MES): 搴撳瓨淇℃伅椤甸潰娣诲姞杩涚珯/鍑虹珯鎿嶄綔鍒�
+
+- 娣诲姞鎿嶄綔鍒楋紝鏍规嵁搴撳瓨鐘舵�佸姩鎬佹樉绀烘寜閽�
+- 寰呭叆搴撶姸鎬佹樉绀鸿繘绔欐寜閽�
+- 鍦ㄥ簱/鍑哄簱涓姸鎬佹樉绀哄嚭绔欐寜閽�
+- 闆嗘垚MES纭瀵硅瘽妗�
+
+Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>"
+```
+
+---
+
+## Task 9: 淇敼stockInfoDetail.vue娣诲姞鎿嶄綔鍒�
+
+**Files:**
+- Modify: `WMS/WIDESEA_WMSClient/src/views/stock/stockInfoDetail.vue`
+
+- [ ] **Step 1: 鍦╯cript涓坊鍔犵粍浠跺紩鍏ュ拰鏂规硶**
+
+鍦ㄧ幇鏈夌殑script setup涓坊鍔狅細
+
+```javascript
+import MesConfirmDialog from '@/components/MesConfirmDialog.vue';
+import { stockDetailMesApi } from '@/api/mes';
+import { ElMessage } from 'element-plus';
+import { ref } from 'vue';
+
+// MES瀵硅瘽妗嗙姸鎬�
+const mesDialogVisible = ref(false);
+const currentOperationType = ref('');
+const currentDetailRow = ref(null);
+const mesLoading = ref(false);
+
+// 鎵撳紑MES纭瀵硅瘽妗�
+const openMesDialog = (operationType, row) => {
+  currentOperationType.value = operationType;
+  currentDetailRow.value = row;
+  mesDialogVisible.value = true;
+};
+
+// 澶勭悊MES纭
+const handleMesConfirm = async ({ onSuccess, onError }) => {
+  const row = currentDetailRow.value;
+  const operationType = currentOperationType.value;
+
+  try {
+    let result;
+
+    switch (operationType) {
+      case 'bind':
+        result = await stockDetailMesApi.bindContainer({
+          palletCode: row.palletCode || 'P001', // 闇�瑕佷粠搴撳瓨淇℃伅鑾峰彇
+          sfcList: [row.serialNumber],
+          location: row.location || '',
+          operationType: 1
+        });
+        break;
+      case 'unbind':
+        result = await stockDetailMesApi.unbindContainer({
+          palletCode: row.palletCode || 'P001',
+          sfcList: [row.serialNumber]
+        });
+        break;
+      case 'ngReport':
+        result = await stockDetailMesApi.containerNgReport({
+          palletCode: row.palletCode || 'P001',
+          ngSfcList: [{
+            sfc: row.serialNumber,
+            ngCode: 'NG001',
+            ngEquipmentCode: 'WCS_001',
+            ngResourceCode: 'RESOURCE_001'
+          }]
+        });
+        break;
+    }
+
+    if (result.data.status) {
+      ElMessage.success(result.data.message || '鎿嶄綔鎴愬姛');
+      onSuccess();
+      proxy.$refs.grid.load();
+    } else {
+      onError(result.data.message || '鎿嶄綔澶辫触');
+    }
+  } catch (error) {
+    onError(error.response?.data?.message || error.message || '缃戠粶閿欒锛岃绋嶅悗閲嶈瘯');
+  }
+};
+
+// 妫�鏌ユ寜閽槸鍚﹀簲璇ユ樉绀�
+const shouldShowButton = (row) => {
+  const status = row.status; // 1=姝e父, 2=寮傚父, 99=宸查攣瀹�
+  return status !== 99; // 闈�"宸查攣瀹�"鐘舵�佹樉绀烘墍鏈夋寜閽�
+};
+```
+
+- [ ] **Step 2: 鍦╟olumns涓坊鍔犳搷浣滃垪**
+
+鍦ㄧ幇鏈夌殑columns ref瀹氫箟涓坊鍔犳搷浣滃垪锛堝湪鏈�鍚庢坊鍔狅級锛�
+
+```javascript
+const columns = ref([
+  // ... 鐜版湁鍒楀畾涔� ...
+  {
+    field: "actions",
+    title: "鎿嶄綔",
+    width: 280,
+    fixed: "right",
+    align: "center",
+    formatter: (row) => {
+      if (!shouldShowButton(row)) {
+        return '<span class="text-muted">鏆傛棤鍙墽琛屾搷浣�</span>';
+      }
+
+      return `
+        <el-button type="primary" size="small" onclick="window.handleBind(${row.id})">缁戝畾</el-button>
+        <el-button type="warning" size="small" onclick="window.handleUnbind(${row.id})">瑙g粦</el-button>
+        <el-button type="danger" size="small" onclick="window.handleNgReport(${row.id})">NG涓婃姤</el-button>
+      `;
+    }
+  }
+]);
+```
+
+- [ ] **Step 3: 鍦ㄦā鏉夸腑娣诲姞瀵硅瘽妗嗙粍浠�**
+
+鍦╰emplate涓殑view-grid鏍囩鍚庢坊鍔狅細
+
+```vue
+<template>
+  <view-grid ... >
+  </view-grid>
+
+  <!-- MES纭瀵硅瘽妗� -->
+  <MesConfirmDialog
+    v-model="mesDialogVisible"
+    :operation-type="currentOperationType"
+    :pallet-code="currentDetailRow?.palletCode"
+    :detail-info="{ sfcCount: 1 }"
+    @confirm="handleMesConfirm"
+  />
+</template>
+```
+
+- [ ] **Step 4: 娣诲姞鍏ㄥ眬鏂规硶**
+
+鍦╯etup鐨勬渶鍚庢坊鍔狅細
+
+```javascript
+window.handleBind = (id) => {
+  const row = proxy.$refs.grid.tableData.find(item => item.id === id);
+  if (row) openMesDialog('bind', row);
+};
+
+window.handleUnbind = (id) => {
+  const row = proxy.$refs.grid.tableData.find(item => item.id === id);
+  if (row) openMesDialog('unbind', row);
+};
+
+window.handleNgReport = (id) => {
+  const row = proxy.$refs.grid.tableData.find(item => item.id === id);
+  if (row) openMesDialog('ngReport', row);
+};
+```
+
+- [ ] **Step 5: 鎻愪氦**
+
+```bash
+git add WMS/WIDESEA_WMSClient/src/views/stock/stockInfoDetail.vue
+git commit -m "feat(MES): 搴撳瓨鏄庣粏椤甸潰娣诲姞缁戝畾/瑙g粦/NG涓婃姤鎿嶄綔鍒�
+
+- 娣诲姞鎿嶄綔鍒楋紝鏍规嵁鐢佃姱鐘舵�佸姩鎬佹樉绀烘寜閽�
+- 闈為攣瀹氱姸鎬佹樉绀虹粦瀹氥�佽В缁戙�丯G涓婃姤鎸夐挳
+- 闆嗘垚MES纭瀵硅瘽妗�
+
+Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>"
+```
+
+---
+
+## 娴嬭瘯妫�鏌ユ竻鍗�
+
+瀹屾垚浠ヤ笂鎵�鏈変换鍔″悗锛岃繘琛屼互涓嬫祴璇曪細
+
+### 鍚庣娴嬭瘯
+
+- [ ] 楠岃瘉鏁版嵁搴撹〃 Dt_MesApiLog 宸插垱寤�
+- [ ] 楠岃瘉绯荤粺閰嶇疆宸叉彃鍏�
+- [ ] 娴嬭瘯杩涚珯鎺ュ彛锛圥ostman鎴朣wagger锛�
+- [ ] 娴嬭瘯鍑虹珯鎺ュ彛
+- [ ] 娴嬭瘯缁戝畾鎺ュ彛
+- [ ] 娴嬭瘯瑙g粦鎺ュ彛
+- [ ] 娴嬭瘯NG涓婃姤鎺ュ彛
+- [ ] 楠岃瘉鏃ュ織璁板綍姝g‘
+
+### 鍓嶇娴嬭瘯
+
+- [ ] 搴撳瓨淇℃伅椤甸潰鎿嶄綔鍒楁甯告樉绀�
+- [ ] 鎸夐挳鏍规嵁鐘舵�佹纭樉绀�/闅愯棌
+- [ ] 鐐瑰嚮鎸夐挳寮瑰嚭纭瀵硅瘽妗�
+- [ ] 纭鍚庢垚鍔熻皟鐢ㄦ帴鍙�
+- [ ] 鎴愬姛鍚庡埛鏂板垪琛�
+- [ ] 澶辫触鍚庢樉绀洪敊璇彁绀�
+- [ ] 搴撳瓨鏄庣粏椤甸潰鎿嶄綔鍒楁甯告樉绀�
+- [ ] 鎵�鏈夋寜閽姛鑳芥甯�
+
+### 闆嗘垚娴嬭瘯
+
+- [ ] 瀹屾暣娴佺▼娴嬭瘯锛堢偣鍑烩啋纭鈫掓墽琛屸啋缁撴灉锛�
+- [ ] 缃戠粶寮傚父澶勭悊
+- [ ] MES鏈嶅姟寮傚父澶勭悊
+- [ ] 鏉冮檺鎺у埗娴嬭瘯
+
+---
+
+## 澶囨敞
+
+1. **鐘舵�佸�兼槧灏�**锛氫唬鐮佷腑浣跨敤鐨勭姸鎬佸�硷紙0=寰呭叆搴�, 1=鍦ㄥ簱绛夛級闇�瑕佹牴鎹疄闄呮灇涓惧�艰皟鏁�
+2. **鎵樼洏鐮佽幏鍙�**锛氬簱瀛樻槑缁嗛〉闈腑闇�瑕侀�氳繃stockId鍏宠仈鑾峰彇鎵樼洏鐮�
+3. **鏉冮檺閰嶇疆**锛氶渶瑕佸湪绯荤粺涓坊鍔燤ES鐩稿叧鏉冮檺椤�
+4. **MES鎺ュ彛鍦板潃**锛氬湪绯荤粺閰嶇疆涓缃纭殑MES鎺ュ彛鍦板潃
+5. **閿欒澶勭悊**锛氭牴鎹疄闄匨ES杩斿洖鐨勯敊璇爜璋冩暣鎻愮ず淇℃伅
diff --git a/Code/docs/superpowers/specs/2026-04-12-mes-integration-design.md b/Code/docs/superpowers/specs/2026-04-12-mes-integration-design.md
new file mode 100644
index 0000000..27930b9
--- /dev/null
+++ b/Code/docs/superpowers/specs/2026-04-12-mes-integration-design.md
@@ -0,0 +1,700 @@
+# WMS搴撳瓨椤甸潰MES鎺ュ彛闆嗘垚璁捐鏂囨。
+
+**鏃ユ湡**: 2026-04-12
+**椤圭洰**: WIDESEA WMS
+**浣滆��**: Claude Code
+
+---
+
+## 涓�銆侀渶姹傛杩�
+
+涓篧MS搴撳瓨淇℃伅椤甸潰鍜屽簱瀛樻槑缁嗛〉闈㈡坊鍔犳搷浣滃垪锛岃皟鐢∕ES绯荤粺鐨勫嚭绔�/鍏ョ珯/缁戝畾/瑙g粦/NG涓婃姤鎺ュ彛锛屽疄鐜癢MS涓嶮ES鐨勬暟鎹悓姝ャ��
+
+### 鍔熻兘鑼冨洿
+
+**搴撳瓨淇℃伅椤甸潰锛坰tockInfo.vue锛�- 鎵樼洏绾у埆锛�**
+- 鎵樼洏杩涚珯锛堣皟鐢∕ES InboundInContainer鎺ュ彛锛�
+- 鎵樼洏鍑虹珯锛堣皟鐢∕ES OutboundInContainer鎺ュ彛锛�
+
+**搴撳瓨鏄庣粏椤甸潰锛坰tockInfoDetail.vue锛�- 鐢佃姱绾у埆锛�**
+- 鎵樼洏鐢佃姱缁戝畾锛堣皟鐢∕ES BindContainer鎺ュ彛锛�
+- 鎵樼洏鐢佃姱瑙g粦锛堣皟鐢∕ES UnBindContainer鎺ュ彛锛�
+- 鎵樼洏NG鐢佃姱涓婃姤锛堣皟鐢∕ES ContainerNgReport鎺ュ彛锛�
+
+---
+
+## 浜屻�佹灦鏋勮璁�
+
+### 2.1 绯荤粺鏋舵瀯鍥�
+
+```
+鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹�                         鍓嶇 (Vue 3)                           鈹�
+鈹�  鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�  鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�  鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹� 鈹�
+鈹�  鈹�  stockInfo.vue   鈹�  鈹俿tockInfoDetail   鈹�  鈹� MesDialog.vue  鈹� 鈹�
+鈹�  鈹�  (搴撳瓨淇℃伅)       鈹�  鈹�  .vue(搴撳瓨鏄庣粏)   鈹�  鈹� (纭瀵硅瘽妗�)    鈹� 鈹�
+鈹�  鈹�  + 鎿嶄綔鍒�        鈹�  鈹�  + 鎿嶄綔鍒�         鈹�  鈹�                鈹� 鈹�
+鈹�  鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�  鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�  鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹攢鈹�鈹�鈹�鈹�鈹�鈹�鈹� 鈹�
+鈹�           鈹�                     鈹�                      鈹�         鈹�
+鈹�           鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹粹攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�         鈹�
+鈹�                              鈹�                                   鈹�
+鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹尖攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+                               鈹� HTTP API
+鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹尖攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹�                               鈻�                    鍚庣 (.NET)   鈹�
+鈹�  鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�  鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�  鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹� 鈹�
+鈹�  鈹� StockController  鈹傗啋 鈹�  MesController   鈹�  鈹� MesLogService  鈹� 鈹�
+鈹�  鈹�                  鈹�  鈹�                  鈹�  鈹�                鈹� 鈹�
+鈹�  鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�  鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�  鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹� 鈹�
+鈹�                                 鈹�                                  鈹�
+鈹�                                 鈻�                                  鈹�
+鈹�  鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�  鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�  鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹� 鈹�
+鈹�  鈹�   IMesService    鈹傗啋 鈹�   MesService     鈹�  鈹侱t_MesApiLog    鈹� 鈹�
+鈹�  鈹�   (鎺ュ彛瀹氫箟)      鈹�  鈹�   (HTTP璋冪敤)     鈹�  鈹�  (鏃ュ織琛�)       鈹� 鈹�
+鈹�  鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�  鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�  鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹� 鈹�
+鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+                               鈹�
+                               鈻�
+                        鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+                        鈹�  MES绯荤粺     鈹�
+                        鈹�  (澶栭儴鎺ュ彛)   鈹�
+                        鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+```
+
+### 2.2 鎶�鏈爤
+
+- **鍓嶇**: Vue 3, Element Plus, Pinia
+- **鍚庣**: .NET 8, ASP.NET Core, SqlSugar ORM
+- **鏁版嵁搴�**: SQL Server
+- **HTTP瀹㈡埛绔�**: HttpClient (鍚庣璋冪敤MES)
+
+---
+
+## 涓夈�佸墠绔璁�
+
+### 3.1 搴撳瓨淇℃伅椤甸潰 (stockInfo.vue)
+
+#### 鎿嶄綔鍒楄璁�
+
+**琛ㄦ牸鍒楅厤缃細**
+```javascript
+{
+  field: "actions",
+  title: "鎿嶄綔",
+  width: 200,
+  fixed: "right",
+  align: "center",
+  formatter: (row) => renderActions(row)
+}
+```
+
+**鎸夐挳瀹氫箟锛�**
+- 杩涚珯鎸夐挳锛氳皟鐢ㄦ墭鐩樿繘绔欐帴鍙�
+- 鍑虹珯鎸夐挳锛氳皟鐢ㄦ墭鐩樺嚭绔欐帴鍙�
+
+**鎸夐挳鏄剧ず瑙勫垯锛�**
+
+| 搴撳瓨鐘舵�� | 杩涚珯 | 鍑虹珯 |
+|---------|:----:|:----:|
+| 寰呭叆搴� (0) | 鉁� | 鉁� |
+| 鍦ㄥ簱 (1) | 鉁� | 鉁� |
+| 鍑哄簱涓� (2) | 鉁� | 鉁� |
+| 閿佸畾 (3) | 鉁� | 鉁� |
+
+### 3.2 搴撳瓨鏄庣粏椤甸潰 (stockInfoDetail.vue)
+
+#### 鎿嶄綔鍒楄璁�
+
+**琛ㄦ牸鍒楅厤缃細**
+```javascript
+{
+  field: "actions",
+  title: "鎿嶄綔",
+  width: 280,
+  fixed: "right",
+  align: "center",
+  formatter: (row) => renderActions(row)
+}
+```
+
+**鎸夐挳瀹氫箟锛�**
+- 缁戝畾鎸夐挳锛氳皟鐢ㄦ墭鐩樼數鑺粦瀹氭帴鍙�
+- 瑙g粦鎸夐挳锛氳皟鐢ㄦ墭鐩樼數鑺В缁戞帴鍙�
+- NG涓婃姤鎸夐挳锛氳皟鐢ㄦ墭鐩楴G鐢佃姱涓婃姤鎺ュ彛
+
+**鎸夐挳鏄剧ず瑙勫垯锛�**
+
+| 鐢佃姱鐘舵�� | 缁戝畾 | 瑙g粦 | NG涓婃姤 |
+|---------|:----:|:----:|:------:|
+| 姝e父 (1) | 鉁� | 鉁� | 鉁� |
+| 寮傚父 (2) | 鉁� | 鉁� | 鉁� |
+| 宸查攣瀹� (99) | 鉁� | 鉁� | 鉁� |
+
+### 3.3 纭瀵硅瘽妗嗙粍浠� (MesConfirmDialog.vue)
+
+**缁勪欢鑱岃矗锛�**
+- 鏄剧ず鍗冲皢鎵ц鐨勬搷浣滀俊鎭�
+- 灞曠ず鍏抽敭鍙傛暟锛堟墭鐩樼爜銆佽澶囩紪鐮佺瓑锛�
+- 鎻愪緵纭/鍙栨秷鎸夐挳
+- 鏄剧ず璋冪敤缁撴灉锛堟垚鍔�/澶辫触锛�
+
+**Props瀹氫箟锛�**
+```typescript
+interface MesConfirmDialogProps {
+  visible: boolean;
+  operationType: 'inbound' | 'outbound' | 'bind' | 'unbind' | 'ngReport';
+  palletCode: string;
+  stockInfo?: any;
+  detailInfo?: any;
+}
+```
+
+### 3.4 浜や簰娴佺▼
+
+```
+鐢ㄦ埛鐐瑰嚮鎿嶄綔鎸夐挳
+    鈹�
+    鈻�
+妫�鏌ョ櫥褰曠姸鎬� 鈹�鈹�鈹�鈹�鈹�鈹�鈫� 鏈櫥褰� 鈹�鈹�鈹�鈹�鈫� 鎻愮ず"璇峰厛鐧诲綍"
+    鈹�
+    鈻� 宸茬櫥褰�
+妫�鏌ユ搷浣滄潈闄� 鈹�鈹�鈹�鈹�鈹�鈹�鈫� 鏃犳潈闄� 鈹�鈹�鈹�鈹�鈫� 鎻愮ず"鏃犳潈闄愭墽琛屾鎿嶄綔"
+    鈹�
+    鈻� 鏈夋潈闄�
+寮瑰嚭纭瀵硅瘽妗�
+    鈹�
+    鈻�
+鐢ㄦ埛鐐瑰嚮"纭鎵ц"
+    鈹�
+    鈻�
+鏄剧ずloading鐘舵��
+    鈹�
+    鈻�
+璋冪敤鍚庣API
+    鈹�
+    鈹溾攢鈫� 鎴愬姛 鈹�鈹�鈹�鈹�鈫� 鏄剧ず鎴愬姛鎻愮ず 鈹�鈹�鈹�鈹�鈫� 鍒锋柊鍒楄〃
+    鈹�
+    鈹斺攢鈫� 澶辫触 鈹�鈹�鈹�鈹�鈫� 鏄剧ず閿欒鎻愮ず + "閲嶈瘯"鎸夐挳
+```
+
+---
+
+## 鍥涖�佸悗绔璁�
+
+### 4.1 API鎺ュ彛璁捐
+
+#### 4.1.1 搴撳瓨淇℃伅鐩稿叧鎺ュ彛
+
+**鎵樼洏杩涚珯**
+```csharp
+/// <summary>
+/// 鎵樼洏杩涚珯 - 璋冪敤MES鎺ュ彛
+/// </summary>
+[HttpPost("inboundInContainer")]
+public async Task<WebResponseContent> InboundInContainer([FromBody] InboundInContainerRequestDto dto)
+```
+
+**璇锋眰DTO锛�**
+```csharp
+public class InboundInContainerRequestDto
+{
+    /// <summary>
+    /// 鎵樼洏缂栧彿
+    /// </summary>
+    public string PalletCode { get; set; }
+
+    /// <summary>
+    /// 搴撳瓨ID
+    /// </summary>
+    public long StockId { get; set; }
+}
+```
+
+**鎵樼洏鍑虹珯**
+```csharp
+/// <summary>
+/// 鎵樼洏鍑虹珯 - 璋冪敤MES鎺ュ彛
+/// </summary>
+[HttpPost("outboundInContainer")]
+public async Task<WebResponseContent> OutboundInContainer([FromBody] OutboundInContainerRequestDto dto)
+```
+
+**璇锋眰DTO锛�**
+```csharp
+public class OutboundInContainerRequestDto
+{
+    /// <summary>
+    /// 鎵樼洏缂栧彿
+    /// </summary>
+    public string PalletCode { get; set; }
+
+    /// <summary>
+    /// 搴撳瓨ID
+    /// </summary>
+    public long StockId { get; set; }
+
+    /// <summary>
+    /// 浜у搧鍙傛暟鍒楄〃锛堝彲閫夛級
+    /// </summary>
+    public List<ParamItemDto> ParamList { get; set; }
+}
+```
+
+#### 4.1.2 搴撳瓨鏄庣粏鐩稿叧鎺ュ彛
+
+**鎵樼洏鐢佃姱缁戝畾**
+```csharp
+/// <summary>
+/// 鎵樼洏鐢佃姱缁戝畾 - 璋冪敤MES鎺ュ彛
+/// </summary>
+[HttpPost("bindContainer")]
+public async Task<WebResponseContent> BindContainer([FromBody] BindContainerRequestDto dto)
+```
+
+**璇锋眰DTO锛�**
+```csharp
+public class BindContainerRequestDto
+{
+    /// <summary>
+    /// 鎵樼洏缂栧彿
+    /// </summary>
+    public string PalletCode { get; set; }
+
+    /// <summary>
+    /// 鐢佃姱鐮佸垪琛�
+    /// </summary>
+    public List<string> SfcList { get; set; }
+
+    /// <summary>
+    /// 浣嶇疆淇℃伅
+    /// </summary>
+    public string Location { get; set; }
+
+    /// <summary>
+    /// 鎿嶄綔绫诲瀷锛�0-榛樿 1-杩涚珯 2-鍑虹珯 3-杩涘嚭绔�
+    /// </summary>
+    public int OperationType { get; set; } = 1;
+}
+```
+
+**鎵樼洏鐢佃姱瑙g粦**
+```csharp
+/// <summary>
+/// 鎵樼洏鐢佃姱瑙g粦 - 璋冪敤MES鎺ュ彛
+/// </summary>
+[HttpPost("unbindContainer")]
+public async Task<WebResponseContent> UnbindContainer([FromBody] UnbindContainerRequestDto dto)
+```
+
+**璇锋眰DTO锛�**
+```csharp
+public class UnbindContainerRequestDto
+{
+    /// <summary>
+    /// 鎵樼洏缂栧彿
+    /// </summary>
+    public string PalletCode { get; set; }
+
+    /// <summary>
+    /// 鐢佃姱鐮佸垪琛�
+    /// </summary>
+    public List<string> SfcList { get; set; }
+}
+```
+
+**鎵樼洏NG鐢佃姱涓婃姤**
+```csharp
+/// <summary>
+/// 鎵樼洏NG鐢佃姱涓婃姤 - 璋冪敤MES鎺ュ彛
+/// </summary>
+[HttpPost("containerNgReport")]
+public async Task<WebResponseContent> ContainerNgReport([FromBody] ContainerNgReportRequestDto dto)
+```
+
+**璇锋眰DTO锛�**
+```csharp
+public class ContainerNgReportRequestDto
+{
+    /// <summary>
+    /// 鎵樼洏缂栧彿
+    /// </summary>
+    public string PalletCode { get; set; }
+
+    /// <summary>
+    /// NG鐢佃姱鍒楄〃
+    /// </summary>
+    public List<NgSfcItemDto> NgSfcList { get; set; }
+}
+
+public class NgSfcItemDto
+{
+    /// <summary>
+    /// 浜у搧鏉$爜
+    /// </summary>
+    public string Sfc { get; set; }
+
+    /// <summary>
+    /// NG浠g爜
+    /// </summary>
+    public string NgCode { get; set; }
+
+    /// <summary>
+    /// NG璁惧
+    /// </summary>
+    public string NgEquipmentCode { get; set; }
+
+    /// <summary>
+    /// NG璧勬簮
+    /// </summary>
+    public string NgResourceCode { get; set; }
+}
+```
+
+### 4.2 鏁版嵁搴撹璁�
+
+#### 4.2.1 MES鎺ュ彛璋冪敤鏃ュ織琛�
+
+```sql
+CREATE TABLE Dt_MesApiLog (
+    Id BIGINT PRIMARY KEY IDENTITY(1,1),
+    ApiType NVARCHAR(50) NOT NULL,           -- 鎺ュ彛绫诲瀷
+    RequestJson NVARCHAR(MAX) NULL,          -- 璇锋眰JSON
+    ResponseJson NVARCHAR(MAX) NULL,         -- 鍝嶅簲JSON
+    IsSuccess BIT NOT NULL DEFAULT 0,        -- 鏄惁鎴愬姛
+    ErrorMessage NVARCHAR(500) NULL,         -- 閿欒淇℃伅
+    ElapsedMs INT NOT NULL DEFAULT 0,        -- 鑰楁椂(姣)
+    CreateDate DATETIME NOT NULL,            -- 鍒涘缓鏃堕棿
+    Creator NVARCHAR(50) NULL,               -- 鍒涘缓浜�
+    INDEX IX_MesApiLog_ApiType (ApiType),
+    INDEX IX_MesApiLog_CreateDate (CreateDate)
+);
+```
+
+**瀛楁璇存槑锛�**
+
+| 瀛楁 | 绫诲瀷 | 璇存槑 |
+|------|------|------|
+| Id | bigint | 涓婚敭 |
+| ApiType | string(50) | 鎺ュ彛绫诲瀷锛欼nboundInContainer, OutboundInContainer, BindContainer, UnbindContainer, ContainerNgReport |
+| RequestJson | string(MAX) | MES鎺ュ彛璇锋眰JSON |
+| ResponseJson | string(MAX) | MES鎺ュ彛鍝嶅簲JSON |
+| IsSuccess | bool | 璋冪敤鏄惁鎴愬姛 |
+| ErrorMessage | string(500) | 澶辫触鏃剁殑閿欒淇℃伅 |
+| ElapsedMs | int | 鎺ュ彛璋冪敤鑰楁椂锛堟绉掞級 |
+| CreateDate | datetime | 鍒涘缓鏃堕棿 |
+| Creator | string(50) | 鍒涘缓浜� |
+
+#### 4.2.2 绯荤粺閰嶇疆琛ㄦ墿灞�
+
+```sql
+-- 鍦� Dt_SystemConfig 琛ㄤ腑鏂板MES閰嶇疆椤�
+INSERT INTO Dt_SystemConfig (ConfigKey, ConfigValue, Description, CreateDate)
+VALUES
+('MES_EquipmentCode', 'WCS_001', 'MES璁惧缂栫爜', GETDATE()),
+('MES_ResourceCode', 'RESOURCE_001', 'MES璧勬簮缂栫爜', GETDATE()),
+('MES_ApiBaseUrl', 'http://mes-server/api', 'MES鎺ュ彛鍦板潃', GETDATE()),
+('MES_TimeoutSeconds', '30', 'MES鎺ュ彛瓒呮椂鏃堕棿(绉�)', GETDATE());
+```
+
+### 4.3 鏈嶅姟灞傝璁�
+
+#### 4.3.1 MES鏃ュ織鏈嶅姟鎺ュ彛
+
+```csharp
+/// <summary>
+/// MES鎺ュ彛鏃ュ織鏈嶅姟鎺ュ彛
+/// </summary>
+public interface IMesLogService : IDependency
+{
+    /// <summary>
+    /// 璁板綍MES鎺ュ彛璋冪敤鏃ュ織
+    /// </summary>
+    Task<bool> LogAsync(MesApiLogDto log);
+
+    /// <summary>
+    /// 鑾峰彇鏈�杩戠殑MES鎺ュ彛璋冪敤璁板綍
+    /// </summary>
+    Task<List<MesApiLogDto>> GetRecentLogsAsync(string apiType, int count = 50);
+}
+```
+
+#### 4.3.2 MES鏃ュ織鏈嶅姟瀹炵幇
+
+```csharp
+/// <summary>
+/// MES鎺ュ彛鏃ュ織鏈嶅姟瀹炵幇
+/// </summary>
+public class MesLogService : IMesLogService
+{
+    private readonly ISqlSugarClient _db;
+
+    public async Task<bool> LogAsync(MesApiLogDto log)
+    {
+        var entity = new Dt_MesApiLog
+        {
+            ApiType = log.ApiType,
+            RequestJson = log.RequestJson,
+            ResponseJson = log.ResponseJson,
+            IsSuccess = log.IsSuccess,
+            ErrorMessage = log.ErrorMessage,
+            ElapsedMs = log.ElapsedMs,
+            CreateDate = DateTime.Now,
+            Creator = log.Creator
+        };
+
+        return await _db.Insertable(entity).ExecuteCommandAsync() > 0;
+    }
+
+    public async Task<List<MesApiLogDto>> GetRecentLogsAsync(string apiType, int count = 50)
+    {
+        return await _db.Queryable<Dt_MesApiLog>()
+            .Where(x => x.ApiType == apiType)
+            .OrderByDescending(x => x.CreateDate)
+            .Take(count)
+            .ToListAsync();
+    }
+}
+```
+
+---
+
+## 浜斻�佹帴鍙h皟鐢ㄦ祦绋�
+
+### 5.1 鎵樼洏杩涚珯娴佺▼
+
+```
+鐢ㄦ埛鐐瑰嚮"杩涚珯"鎸夐挳
+    鈹�
+    鈻�
+鍓嶇寮瑰嚭纭瀵硅瘽妗嗭紙鏄剧ず鎵樼洏鐮併�佽澶囩紪鐮佺瓑锛�
+    鈹�
+    鈻�
+鐢ㄦ埛纭
+    鈹�
+    鈻�
+鍓嶇璋冪敤 POST /api/StockInfo/inboundInContainer
+    鈹�
+    鈻�
+鍚庣 StockInfoController.InboundInContainer()
+    鈹�
+    鈹溾攢鈫� 1. 楠岃瘉搴撳瓨鐘舵�侊紙浠�"寰呭叆搴�"鐘舵�佸厑璁歌繘绔欙級
+    鈹�
+    鈹溾攢鈫� 2. 鑾峰彇绯荤粺閰嶇疆锛堣澶囩紪鐮併�佽祫婧愮紪鐮侊級
+    鈹�
+    鈹溾攢鈫� 3. 鏋勯�燤ES璇锋眰瀵硅薄
+    鈹�
+    鈹溾攢鈫� 4. 璋冪敤 IMesService.InboundInContainer()
+    鈹�   鈹�
+    鈹�   鈹溾攢鈫� 璁板綍寮�濮嬫椂闂�
+    鈹�   鈹溾攢鈫� 鍙戦�丠TTP璇锋眰鍒癕ES
+    鈹�   鈹溾攢鈫� 璁板綍鍝嶅簲銆佽�楁椂
+    鈹�   鈹斺攢鈫� 淇濆瓨鏃ュ織鍒� Dt_MesApiLog
+    鈹�
+    鈹溾攢鈫� 5. 杩斿洖缁撴灉缁欏墠绔�
+    鈹�
+    鈹斺攢鈫� 鍓嶇鏄剧ず鎴愬姛/澶辫触鎻愮ず
+```
+
+### 5.2 鎵樼洏鐢佃姱缁戝畾娴佺▼
+
+```
+鐢ㄦ埛鐐瑰嚮"缁戝畾"鎸夐挳
+    鈹�
+    鈻�
+鍓嶇寮瑰嚭纭瀵硅瘽妗嗭紙鏄剧ず鎵樼洏鐮併�佺數鑺爜鍒楄〃锛�
+    鈹�
+    鈻�
+鐢ㄦ埛纭
+    鈹�
+    鈻�
+鍓嶇璋冪敤 POST /api/StockInfoDetail/bindContainer
+    鈹�
+    鈻�
+鍚庣 StockInfoDetailController.BindContainer()
+    鈹�
+    鈹溾攢鈫� 1. 楠岃瘉鐢佃姱鐘舵�侊紙闈�"宸查攣瀹�"鐘舵�佸厑璁哥粦瀹氾級
+    鈹�
+    鈹溾攢鈫� 2. 鑾峰彇绯荤粺閰嶇疆
+    鈹�
+    鈹溾攢鈫� 3. 鏋勯�燤ES璇锋眰瀵硅薄锛堝寘鍚數鑺爜鍒楄〃锛�
+    鈹�
+    鈹溾攢鈫� 4. 璋冪敤 IMesService.BindContainer()
+    鈹�   鈹�
+    鈹�   鈹溾攢鈫� 璁板綍寮�濮嬫椂闂�
+    鈹�   鈹溾攢鈫� 鍙戦�丠TTP璇锋眰鍒癕ES
+    鈹�   鈹溾攢鈫� 璁板綍鍝嶅簲銆佽�楁椂
+    鈹�   鈹斺攢鈫� 淇濆瓨鏃ュ織鍒� Dt_MesApiLog
+    鈹�
+    鈹溾攢鈫� 5. 杩斿洖缁撴灉缁欏墠绔�
+    鈹�
+    鈹斺攢鈫� 鍓嶇鏄剧ず鎴愬姛/澶辫触鎻愮ず
+```
+
+---
+
+## 鍏�侀敊璇鐞�
+
+### 6.1 閿欒绫诲瀷
+
+| 閿欒绫诲瀷 | 璇存槑 | 澶勭悊鏂瑰紡 |
+|---------|------|---------|
+| 缃戠粶瓒呮椂 | MES鏈嶅姟鍣ㄦ棤鍝嶅簲鎴栬繛鎺ヨ秴鏃� | 鏄剧ず閿欒鎻愮ず锛屾彁渚�"閲嶈瘯"鎸夐挳 |
+| 涓氬姟鏍¢獙澶辫触 | 鎵樼洏涓嶅瓨鍦ㄣ�佺數鑺凡缁戝畾绛� | 鏄剧ずMES杩斿洖鐨勯敊璇俊鎭� |
+| 璁よ瘉澶辫触 | MES鎺ュ彛璁よ瘉淇℃伅杩囨湡 | 鏄剧ず"MES璁よ瘉澶辫触锛岃鑱旂郴绠$悊鍛�" |
+| 鍙傛暟閿欒 | 璇锋眰鍙傛暟涓嶅畬鏁存垨鏍煎紡閿欒 | 鏄剧ず"鍙傛暟閿欒锛歿鍏蜂綋閿欒}" |
+| 鏈煡閿欒 | MES绯荤粺杩斿洖寮傚父鍝嶅簲 | 鏄剧ず"MES绯荤粺寮傚父锛岃绋嶅悗閲嶈瘯" |
+
+### 6.2 鍓嶇閿欒鎻愮ず
+
+```javascript
+// 鎴愬姛鎻愮ず
+ElMessage.success('鎵樼洏杩涚珯鎴愬姛');
+
+// 澶辫触鎻愮ず
+ElMessage.error({
+  message: 'MES鏈嶅姟鍣ㄨ繛鎺ヨ秴鏃讹紝璇锋鏌ョ綉缁滃悗閲嶈瘯',
+  showRetry: true,
+  onRetry: () => retryOperation()
+});
+```
+
+### 6.3 鍚庣閿欒鏃ュ織
+
+```csharp
+try
+{
+    // 璋冪敤MES鎺ュ彛
+}
+catch (HttpRequestException ex)
+{
+    // 缃戠粶寮傚父
+    await _mesLogService.LogAsync(new MesApiLogDto
+    {
+        ApiType = "InboundInContainer",
+        IsSuccess = false,
+        ErrorMessage = $"缃戠粶寮傚父: {ex.Message}",
+        ElapsedMs = elapsedMs
+    });
+    return ResponseContent.Error("MES鏈嶅姟鍣ㄨ繛鎺ュけ璐ワ紝璇锋鏌ョ綉缁�");
+}
+catch (Exception ex)
+{
+    // 鍏朵粬寮傚父
+    _logger.LogError(ex, "璋冪敤MES鎺ュ彛寮傚父");
+    return ResponseContent.Error($"MES鎺ュ彛璋冪敤澶辫触: {ex.Message}");
+}
+```
+
+---
+
+## 涓冦�佹潈闄愭帶鍒�
+
+### 7.1 鍔熻兘鏉冮檺瀹氫箟
+
+寤鸿鍦ㄧ郴缁熶腑鏂板浠ヤ笅鍔熻兘鏉冮檺锛�
+
+| 鏉冮檺浠g爜 | 鏉冮檺鍚嶇О | 璇存槑 |
+|---------|---------|------|
+| MES_INBOUND | MES杩涚珯鎿嶄綔 | 鍏佽鎵ц鎵樼洏杩涚珯鎿嶄綔 |
+| MES_OUTBOUND | MES鍑虹珯鎿嶄綔 | 鍏佽鎵ц鎵樼洏鍑虹珯鎿嶄綔 |
+| MES_BIND | MES缁戝畾鎿嶄綔 | 鍏佽鎵ц鐢佃姱缁戝畾鎿嶄綔 |
+| MES_UNBIND | MES瑙g粦鎿嶄綔 | 鍏佽鎵ц鐢佃姱瑙g粦鎿嶄綔 |
+| MES_NG_REPORT | MES NG涓婃姤 | 鍏佽鎵цNG涓婃姤鎿嶄綔 |
+
+### 7.2 鏉冮檺楠岃瘉
+
+```csharp
+[HttpPost("inboundInContainer")]
+[Permission("MES_INBOUND")]
+public async Task<WebResponseContent> InboundInContainer([FromBody] InboundInContainerRequestDto dto)
+{
+    // 鎺ュ彛瀹炵幇
+}
+```
+
+---
+
+## 鍏�佹枃浠跺彉鏇存竻鍗�
+
+### 8.1 鍓嶇鏂囦欢
+
+```
+WMS/WIDESEA_WMSClient/src/
+鈹溾攢鈹� views/stock/
+鈹�   鈹溾攢鈹� stockInfo.vue                         # 淇敼锛氭坊鍔犳搷浣滃垪
+鈹�   鈹斺攢鈹� stockInfoDetail.vue                   # 淇敼锛氭坊鍔犳搷浣滃垪
+鈹溾攢鈹� components/
+鈹�   鈹斺攢鈹� MesConfirmDialog.vue                  # 鏂板锛歁ES纭瀵硅瘽妗�
+鈹斺攢鈹� api/
+    鈹斺攢鈹� mes.js                                # 鏂板锛歁ES API璋冪敤
+```
+
+### 8.2 鍚庣鏂囦欢
+
+```
+WMS/WIDESEA_WMSServer/
+鈹溾攢鈹� Controllers/
+鈹�   鈹斺攢鈹� Stock/
+鈹�       鈹溾攢鈹� StockInfoController.cs            # 淇敼锛氭坊鍔犺繘绔�/鍑虹珯鎺ュ彛
+鈹�       鈹斺攢鈹� StockInfoDetailController.cs      # 淇敼锛氭坊鍔犵粦瀹�/瑙g粦/NG涓婃姤鎺ュ彛
+鈹溾攢鈹� Services/
+鈹�   鈹斺攢鈹� Mes/
+鈹�       鈹溾攢鈹� IMesLogService.cs                 # 鏂板锛氭棩蹇楁湇鍔℃帴鍙�
+鈹�       鈹斺攢鈹� MesLogService.cs                  # 鏂板锛氭棩蹇楁湇鍔″疄鐜�
+鈹斺攢鈹� DTO/
+    鈹溾攢鈹� Mes/
+    鈹�   鈹溾攢鈹� MesApiLogDto.cs                   # 鏂板锛氭棩蹇桪TO
+    鈹�   鈹溾攢鈹� InboundInContainerRequestDto.cs   # 鏂板锛氳繘绔欒姹侱TO
+    鈹�   鈹溾攢鈹� OutboundInContainerRequestDto.cs  # 鏂板锛氬嚭绔欒姹侱TO
+    鈹�   鈹溾攢鈹� BindContainerRequestDto.cs        # 鏂板锛氱粦瀹氳姹侱TO
+    鈹�   鈹溾攢鈹� UnbindContainerRequestDto.cs      # 鏂板锛氳В缁戣姹侱TO
+    鈹�   鈹斺攢鈹� ContainerNgReportRequestDto.cs    # 鏂板锛歂G涓婃姤璇锋眰DTO
+    鈹斺攢鈹� Models/
+        鈹斺攢鈹� Mes/
+            鈹斺攢鈹� Dt_MesApiLog.cs                # 鏂板锛氭棩蹇楀疄浣�
+```
+
+### 8.3 鏁版嵁搴撴枃浠�
+
+```
+Database/
+鈹斺攢鈹� Scripts/
+    鈹斺攢鈹� 20260412_MesApiLog.sql                # 鏂板锛氭棩蹇楄〃鍒涘缓鑴氭湰
+```
+
+---
+
+## 涔濄�佹祴璇曡鐐�
+
+### 9.1 鍔熻兘娴嬭瘯
+
+| 娴嬭瘯鍦烘櫙 | 棰勬湡缁撴灉 |
+|---------|---------|
+| 寰呭叆搴撶姸鎬佹墭鐩樼偣鍑昏繘绔� | 寮瑰嚭纭瀵硅瘽妗嗭紝纭鍚庢垚鍔熻皟鐢� |
+| 鍦ㄥ簱鐘舵�佹墭鐩樼偣鍑昏繘绔� | 杩涚珯鎸夐挳涓嶆樉绀� |
+| 缃戠粶涓柇鏃剁偣鍑绘搷浣� | 鏄剧ず缃戠粶閿欒鎻愮ず锛屾彁渚涢噸璇曟寜閽� |
+| MES杩斿洖涓氬姟閿欒 | 鏄剧ずMES杩斿洖鐨勫叿浣撻敊璇俊鎭� |
+| 鐐瑰嚮鎿嶄綔鍚庡埛鏂伴〉闈� | 鎿嶄綔璁板綍宸蹭繚瀛樺埌鏃ュ織琛� |
+
+### 9.2 鎬ц兘娴嬭瘯
+
+| 鎸囨爣 | 鐩爣鍊� |
+|------|--------|
+| MES鎺ュ彛鍝嶅簲鏃堕棿 | < 2绉� |
+| 鍓嶇鎸夐挳鐐瑰嚮鍝嶅簲 | < 100ms |
+| 鏃ュ織鍐欏叆鑰楁椂 | < 50ms |
+
+---
+
+## 鍗併�佸悗缁紭鍖栧缓璁�
+
+1. **鎵归噺鎿嶄綔**锛氭敮鎸侀�変腑澶氫釜鎵樼洏/鐢佃姱鎵归噺璋冪敤MES鎺ュ彛
+2. **鑷姩閲嶈瘯**锛氬浜庣綉缁滆秴鏃剁瓑涓存椂鏁呴殰锛岃嚜鍔ㄩ噸璇�3娆�
+3. **鎺ュ彛鐩戞帶**锛氬鍔燤ES鎺ュ彛璋冪敤鐨勫疄鏃剁洃鎺у拰鍛婅
+4. **鍙傛暟閰嶇疆鍖�**锛氬皢瓒呮椂鏃堕棿銆侀噸璇曟鏁扮瓑鍙傛暟鍋氭垚鍙厤缃」
+5. **鎿嶄綔瀹¤**锛氬鍔犳搷浣滃璁℃棩蹇楋紝璁板綍璋佸湪浠�涔堟椂闂存墽琛屼簡浠�涔堟搷浣�
+
+---
+
+**鏂囨。鐗堟湰**: 1.0
+**鏈�鍚庢洿鏂�**: 2026-04-12

--
Gitblit v1.9.3