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