From 2db17e312a9bf0cff60917104447260b86178ca2 Mon Sep 17 00:00:00 2001
From: wanshenmean <cathay_xy@163.com>
Date: 星期四, 23 四月 2026 08:40:38 +0800
Subject: [PATCH] Merge branch 'xiaoyang' into dev
---
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Flows/OutboundTaskFlowService.cs | 4
Code/WMS/WIDESEA_WMSServer/WIDESEA_Common/Constants/OutboundTimeConstants.cs | 4
Code/WCS/WIDESEAWCS_Client/src/views/taskinfo/robotState.vue | 46 ++--
Code/docs/superpowers/plans/2026-04-22-stacker-crane-executing-task-check.md | 145 +++++++++++++
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Workflow/RobotWorkflowOrchestrator.cs | 5
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService/TaskService.Query.cs | 15 +
Code/WMS/WIDESEA_WMSClient/src/extension/stock/stockInfo.jsx | 23 -
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/appsettings.json | 18
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/CommonConveyorLineNewJob.cs | 2
Code/.omc/state/subagent-tracking.json | 42 +++
Code/WCS/WIDESEAWCS_Client/src/extension/taskinfo/robotState.jsx | 40 ++-
Code/.omc/state/mission-state.json | 110 +++++----
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotMessageHandler.cs | 12
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneTaskSelector.cs | 8
Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/appsettings.json | 2
Code/WCS/WIDESEAWCS_Client/src/api/http.js | 2
Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WCS/TaskService_Inbound.cs | 2
Code/docs/superpowers/specs/2026-04-22-stacker-crane-executing-task-check-design.md | 55 +++++
Code/.omc/state/last-tool-error.json | 8
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/ITaskService.cs | 8
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Workflow/RobotSimpleCommandHandler.cs | 4
Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WCS/TaskService_Tray.cs | 17
Code/WMS/WIDESEA_WMSClient/src/views/stock/groupPalle.vue | 9
Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Flows/RelocationTaskFlowService.cs | 2
Code/WMS/WIDESEA_WMSClient/src/extension/stock/groupPalle.jsx | 69 +-----
25 files changed, 448 insertions(+), 204 deletions(-)
diff --git a/Code/.omc/state/last-tool-error.json b/Code/.omc/state/last-tool-error.json
index 5f72dd0..5bb5278 100644
--- a/Code/.omc/state/last-tool-error.json
+++ b/Code/.omc/state/last-tool-error.json
@@ -1,7 +1,7 @@
{
"tool_name": "Bash",
- "tool_input_preview": "{\"command\":\"cd \\\"D:/Git/ShanMeiXinNengYuan/Code\\\" && dotnet build WCS/WIDESEAWCS_Server/WIDESEAWCS_Server.sln 2>&1\",\"timeout\":120000,\"description\":\"Build WCS solution to verify compilation\"}",
- "error": "Exit code 1\n 姝e湪纭畾瑕佽繕鍘熺殑椤圭洰鈥r\n 鎵�鏈夐」鐩潎鏄渶鏂扮殑锛屾棤娉曡繕鍘熴�俓r\n WIDESEAWCS_Common -> D:\\Git\\ShanMeiXinNengYuan\\Code\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Common\\bin\\Debug\\net8.0\\WIDESEAWCS_Common.dll\r\n WIDESEAWCS_Communicator -> D:\\Git\\ShanMeiXinNengYuan\\Code\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Communicator\\bin\\Debug\\net8.0\\WIDESEAWCS_Communicator.dll\r\n WIDESEAWCS_Core -> D:\\Git\\ShanMeiXinNengYuan\\Code\\WCS\\WIDESEAWCS_Server\\WIDESEAWCS_Core\\bin\\Debug\\net8.0\\WIDESEAWCS_Core.dll\r\n WIDESEAWCS_Model -> D:\\Git\\ShanMeiXinN...",
- "timestamp": "2026-04-21T09:39:52.122Z",
- "retry_count": 1
+ "tool_input_preview": "{\"command\":\"cd \\\"D:/Git/ShanMeiXinNengYuan/Code\\\" && git show 556ce5b --no-stat -p\",\"description\":\"Show full diff for commit 556ce5b (StackerCraneTaskSelector call)\"}",
+ "error": "Exit code 128\nfatal: unrecognized argument: --no-stat",
+ "timestamp": "2026-04-22T07:58:02.431Z",
+ "retry_count": 3
}
\ No newline at end of file
diff --git a/Code/.omc/state/mission-state.json b/Code/.omc/state/mission-state.json
index 1228a50..0740a61 100644
--- a/Code/.omc/state/mission-state.json
+++ b/Code/.omc/state/mission-state.json
@@ -1,5 +1,5 @@
{
- "updatedAt": "2026-04-21T11:39:09.598Z",
+ "updatedAt": "2026-04-22T08:00:38.578Z",
"missions": [
{
"id": "session:9007b9ea-1eb6-4d24-8fe7-2c3a949eac88:none",
@@ -2357,15 +2357,15 @@
"name": "none",
"objective": "Session mission",
"createdAt": "2026-04-21T08:05:57.739Z",
- "updatedAt": "2026-04-21T11:39:09.598Z",
+ "updatedAt": "2026-04-22T08:00:38.578Z",
"status": "done",
- "workerCount": 9,
+ "workerCount": 13,
"taskCounts": {
- "total": 9,
+ "total": 13,
"pending": 0,
"blocked": 0,
"inProgress": 0,
- "completed": 9,
+ "completed": 13,
"failed": 0
},
"agents": [
@@ -2458,64 +2458,80 @@
"latestUpdate": "completed",
"completedSummary": null,
"updatedAt": "2026-04-21T09:39:25.226Z"
+ },
+ {
+ "name": "general-purpose:a40e637",
+ "role": "general-purpose",
+ "ownership": "a40e637b5ac0356a8",
+ "status": "done",
+ "currentStep": null,
+ "latestUpdate": "completed",
+ "completedSummary": null,
+ "updatedAt": "2026-04-22T07:54:17.803Z"
+ },
+ {
+ "name": "general-purpose:adcf684",
+ "role": "general-purpose",
+ "ownership": "adcf684708494b341",
+ "status": "done",
+ "currentStep": null,
+ "latestUpdate": "completed",
+ "completedSummary": null,
+ "updatedAt": "2026-04-22T07:54:49.075Z"
+ },
+ {
+ "name": "general-purpose:a4a7781",
+ "role": "general-purpose",
+ "ownership": "a4a778186b3c312c8",
+ "status": "done",
+ "currentStep": null,
+ "latestUpdate": "completed",
+ "completedSummary": null,
+ "updatedAt": "2026-04-22T07:57:05.481Z"
+ },
+ {
+ "name": "general-purpose:a70a5d0",
+ "role": "general-purpose",
+ "ownership": "a70a5d0efcc81d263",
+ "status": "done",
+ "currentStep": null,
+ "latestUpdate": "completed",
+ "completedSummary": null,
+ "updatedAt": "2026-04-22T08:00:38.578Z"
}
],
"timeline": [
{
- "id": "session-start:afb9663c306b7ffb2:2026-04-21T09:36:45.991Z",
- "at": "2026-04-21T09:36:45.991Z",
+ "id": "session-start:a4a778186b3c312c8:2026-04-22T07:55:43.614Z",
+ "at": "2026-04-22T07:55:43.614Z",
"kind": "update",
- "agent": "general-purpose:afb9663",
- "detail": "started general-purpose:afb9663",
- "sourceKey": "session-start:afb9663c306b7ffb2"
+ "agent": "general-purpose:a4a7781",
+ "detail": "started general-purpose:a4a7781",
+ "sourceKey": "session-start:a4a778186b3c312c8"
},
{
- "id": "session-stop:afb9663c306b7ffb2:2026-04-21T09:37:29.377Z",
- "at": "2026-04-21T09:37:29.377Z",
+ "id": "session-stop:a4a778186b3c312c8:2026-04-22T07:57:05.481Z",
+ "at": "2026-04-22T07:57:05.481Z",
"kind": "completion",
- "agent": "general-purpose:afb9663",
+ "agent": "general-purpose:a4a7781",
"detail": "completed",
- "sourceKey": "session-stop:afb9663c306b7ffb2"
+ "sourceKey": "session-stop:a4a778186b3c312c8"
},
{
- "id": "session-start:a5387bf0397247d5c:2026-04-21T09:37:41.613Z",
- "at": "2026-04-21T09:37:41.613Z",
+ "id": "session-start:a70a5d0efcc81d263:2026-04-22T07:57:26.976Z",
+ "at": "2026-04-22T07:57:26.976Z",
"kind": "update",
- "agent": "code-reviewer:a5387bf",
- "detail": "started code-reviewer:a5387bf",
- "sourceKey": "session-start:a5387bf0397247d5c"
+ "agent": "general-purpose:a70a5d0",
+ "detail": "started general-purpose:a70a5d0",
+ "sourceKey": "session-start:a70a5d0efcc81d263"
},
{
- "id": "session-stop:a5387bf0397247d5c:2026-04-21T09:39:25.226Z",
- "at": "2026-04-21T09:39:25.226Z",
+ "id": "session-stop:a70a5d0efcc81d263:2026-04-22T08:00:38.578Z",
+ "at": "2026-04-22T08:00:38.578Z",
"kind": "completion",
- "agent": "code-reviewer:a5387bf",
+ "agent": "general-purpose:a70a5d0",
"detail": "completed",
- "sourceKey": "session-stop:a5387bf0397247d5c"
- },
- {
- "id": "session-stop:a93c9aa6de8251ecb:2026-04-21T09:43:18.886Z",
- "at": "2026-04-21T09:43:18.886Z",
- "kind": "completion",
- "agent": "general-purpose:adfd244",
- "detail": "completed",
- "sourceKey": "session-stop:a93c9aa6de8251ecb"
- },
- {
- "id": "session-stop:a34767c74aa84d9d8:2026-04-21T11:30:52.701Z",
- "at": "2026-04-21T11:30:52.701Z",
- "kind": "completion",
- "agent": "general-purpose:adfd244",
- "detail": "completed",
- "sourceKey": "session-stop:a34767c74aa84d9d8"
- },
- {
- "id": "session-stop:aecf873500f38d936:2026-04-21T11:39:09.598Z",
- "at": "2026-04-21T11:39:09.598Z",
- "kind": "completion",
- "agent": "general-purpose:adfd244",
- "detail": "completed",
- "sourceKey": "session-stop:aecf873500f38d936"
+ "sourceKey": "session-stop:a70a5d0efcc81d263"
}
]
}
diff --git a/Code/.omc/state/subagent-tracking.json b/Code/.omc/state/subagent-tracking.json
index bf72009..ed732a5 100644
--- a/Code/.omc/state/subagent-tracking.json
+++ b/Code/.omc/state/subagent-tracking.json
@@ -1535,10 +1535,46 @@
"status": "completed",
"completed_at": "2026-04-21T09:39:25.224Z",
"duration_ms": 103611
+ },
+ {
+ "agent_id": "a40e637b5ac0356a8",
+ "agent_type": "general-purpose",
+ "started_at": "2026-04-22T07:53:22.787Z",
+ "parent_mode": "none",
+ "status": "completed",
+ "completed_at": "2026-04-22T07:54:17.801Z",
+ "duration_ms": 55014
+ },
+ {
+ "agent_id": "adcf684708494b341",
+ "agent_type": "general-purpose",
+ "started_at": "2026-04-22T07:53:22.841Z",
+ "parent_mode": "none",
+ "status": "completed",
+ "completed_at": "2026-04-22T07:54:49.074Z",
+ "duration_ms": 86233
+ },
+ {
+ "agent_id": "a4a778186b3c312c8",
+ "agent_type": "general-purpose",
+ "started_at": "2026-04-22T07:55:43.614Z",
+ "parent_mode": "none",
+ "status": "completed",
+ "completed_at": "2026-04-22T07:57:05.479Z",
+ "duration_ms": 81865
+ },
+ {
+ "agent_id": "a70a5d0efcc81d263",
+ "agent_type": "general-purpose",
+ "started_at": "2026-04-22T07:57:26.976Z",
+ "parent_mode": "none",
+ "status": "completed",
+ "completed_at": "2026-04-22T08:00:38.576Z",
+ "duration_ms": 191600
}
],
- "total_spawned": 144,
- "total_completed": 166,
+ "total_spawned": 147,
+ "total_completed": 170,
"total_failed": 0,
- "last_updated": "2026-04-21T13:08:04.028Z"
+ "last_updated": "2026-04-22T08:00:38.695Z"
}
\ No newline at end of file
diff --git a/Code/WCS/WIDESEAWCS_Client/src/api/http.js b/Code/WCS/WIDESEAWCS_Client/src/api/http.js
index 0d7cc1f..57f0d9f 100644
--- a/Code/WCS/WIDESEAWCS_Client/src/api/http.js
+++ b/Code/WCS/WIDESEAWCS_Client/src/api/http.js
@@ -12,7 +12,7 @@
let loadingInstance;
let loadingStatus = false;
if (process.env.NODE_ENV == 'development') {
- axios.defaults.baseURL = window.webConfig.webApiBaseUrl;
+ axios.defaults.baseURL = window.webConfig.webApiProduction;
}
else if (process.env.NODE_ENV == 'debug') {
axios.defaults.baseURL = window.webConfig.webApiBaseUrl;
diff --git a/Code/WCS/WIDESEAWCS_Client/src/extension/taskinfo/robotState.jsx b/Code/WCS/WIDESEAWCS_Client/src/extension/taskinfo/robotState.jsx
index 0dfb0c9..3f7431e 100644
--- a/Code/WCS/WIDESEAWCS_Client/src/extension/taskinfo/robotState.jsx
+++ b/Code/WCS/WIDESEAWCS_Client/src/extension/taskinfo/robotState.jsx
@@ -12,42 +12,52 @@
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;
},
- addAfter(result) {
- return true;
- },
-
+ // 鏂规硶鐩殑锛氱紪杈戝墠鏍¢獙鎴栬ˉ鍏呮彁浜ゅ瓧娈点��
+ // 鍙傛暟锛歠ormData 琛ㄥ崟鎻愪氦瀵硅薄銆�
+ // 杩斿洖鍊硷細true 缁х画鎻愪氦锛宖alse 缁堟鎻愪氦銆�
updateBefore(formData) {
return true;
},
- updateAfter(result) {
- return true;
- },
+ // 鏂规硶鐩殑锛氱偣鍑昏鏃舵墿灞曞鐞嗐��
+ // 鍙傛暟锛歳ow 琛屾暟鎹紝column 鍒楅厤缃紝event 鍘熷浜嬩欢銆�
+ // 杩斿洖鍊硷細鏃犮��
+ rowClick({ row, column, event }) {},
- deleteBefore(ids) {
- return true;
- },
-
- deleteAfter(ids) {
- return true;
- },
-
+ // 鏂规硶鐩殑锛氱紪杈戝脊绐楁墦寮�鍚庢墽琛屾墿灞曢�昏緫銆�
+ // 鍙傛暟锛歳ow 褰撳墠琛屾暟鎹��
+ // 杩斿洖鍊硷細鏃犮��
modelOpenAfter(row) {},
},
};
diff --git a/Code/WCS/WIDESEAWCS_Client/src/views/taskinfo/robotState.vue b/Code/WCS/WIDESEAWCS_Client/src/views/taskinfo/robotState.vue
index 3547526..c90456f 100644
--- a/Code/WCS/WIDESEAWCS_Client/src/views/taskinfo/robotState.vue
+++ b/Code/WCS/WIDESEAWCS_Client/src/views/taskinfo/robotState.vue
@@ -1,15 +1,7 @@
<template>
- <view-grid
- ref="grid"
- :columns="columns"
- :detail="detail"
- :editFormFields="editFormFields"
- :editFormOptions="editFormOptions"
- :searchFormFields="searchFormFields"
- :searchFormOptions="searchFormOptions"
- :table="table"
- :extend="extend"
- >
+ <view-grid ref="grid" :columns="columns" :detail="detail" :editFormFields="editFormFields"
+ :editFormOptions="editFormOptions" :searchFormFields="searchFormFields" :searchFormOptions="searchFormOptions"
+ :table="table" :extend="extend">
</view-grid>
</template>
@@ -150,24 +142,30 @@
const columns = ref([
{ field: "ipAddress", title: "IP鍦板潃", type: "string", width: 140, align: "left" },
{ field: "version", title: "鐗堟湰", type: "int", width: 80, align: "left" },
- { field: "robotRunMode", title: "杩愯妯″紡", type: "int", width: 100, bind: { key: "robotRunMode", data: [{ key: 1, value: "鎵嬪姩妯″紡" },{ key: 2, value: "鑷姩妯″紡" }] }, align: "center" },
- { field: "robotControlMode", title: "鎺у埗妯″紡", type: "int", width: 100, bind: { key: "robotControlMode", data: [{ key: 1, value: "瀹㈡埛绔帶鍒�" },{ key: 2, value: "鍏朵粬" }] }, align: "center" },
- { field: "robotArmObject", title: "鎵嬭噦鐘舵��", type: "int", width: 90, bind: { key: "robotArmObject", data: [{ key: 0, value: "绌洪棽"}, { key: 1, value: "鏈夌墿鏂�" }] }, align: "center" },
- { field: "homed", title: "鍥為浂鐘舵��", type: "string", width: 100, align: "center" },
- { field: "currentAction", title: "褰撳墠鍔ㄤ綔", type: "string", width: 100, align: "center" },
- { field: "operStatus", title: "杩愯鐘舵��", type: "string", width: 100, align: "center" },
+ { field: "robotRunMode", title: "杩愯妯″紡", type: "int", width: 100, bind: { key: "robotRunMode", data: [{ key: 1, value: "鎵嬪姩妯″紡" }, { key: 2, value: "鑷姩妯″紡" }] }, align: "center" },
+ { field: "robotControlMode", title: "鎺у埗妯″紡", type: "int", width: 100, bind: { key: "robotControlMode", data: [{ key: 1, value: "瀹㈡埛绔帶鍒�" }, { key: 2, value: "鍏朵粬" }] }, align: "center" },
+ { field: "robotArmObject", title: "鎵嬭噦鐘舵��", type: "int", width: 90, bind: { key: "robotArmObject", data: [{ key: 0, value: "绌洪棽" }, { key: 1, value: "鏈夌墿鏂�" }] }, align: "center" },
+ { field: "homed", title: "鍥為浂鐘舵��", type: "string", width: 100, align: "center", bind: { key: "homed", data: [{ key: "Homed", value: "鍥為浂" }, { key: "Homing", value: "鍥為浂涓�" }] }, },
+ { field: "currentAction", title: "褰撳墠鍔ㄤ綔", type: "string", width: 100, align: "center", bind: { key: "currentAction", data: [{ key: "Picking", value: "姝e湪鍙栬揣" }, { key: "Putting", value: "姝e湪鏀捐揣" }, { key: "AllPickFinished", value: "鍏ㄩ儴鍙栬揣瀹屾垚" }, { key: "AllPutFinished", value: "鍏ㄩ儴鏀捐揣瀹屾垚" }, { key: "PickFinished", value: "鍙栬揣瀹屾垚" }, { key: "PutFinished", value: "鏀捐揣瀹屾垚" }] }, },
+ { field: "operStatus", title: "杩愯鐘舵��", type: "string", width: 100, align: "center", hidden: true },
{ field: "robotTaskTotalNum", title: "浠诲姟鎬绘暟", type: "int", width: 90, align: "center" },
- { field: "isSplitPallet", title: "鎷嗙洏", type: "byte", width: 60, align: "center" },
- { field: "isGroupPallet", title: "缁勭洏", type: "byte", width: 60, align: "center" },
- { field: "isInFakeBatteryMode", title: "鍋囩數鑺�", type: "byte", width: 70, align: "center" },
+ { field: "isSplitPallet", title: "鎷嗙洏", type: "byte", width: 60, align: "center", bind: { key: "isTrue", data: [] }, },
+ { field: "isGroupPallet", title: "缁勭洏", type: "byte", width: 60, align: "center" , bind: { key: "isTrue", data: [] }, },
+ { field: "isInFakeBatteryMode", title: "鍋囩數鑺�", type: "byte", width: 70, align: "center" , bind: { key: "isTrue", data: [] }, },
{ field: "currentBatchIndex", title: "鎵规", type: "int", width: 60, align: "center" },
{ field: "changePalletPhase", title: "鎹㈢洏闃舵", type: "int", width: 80, align: "center" },
- { field: "isScanNG", title: "鎵爜NG", type: "byte", width: 80, align: "center" },
- { field: "batteryArrived", title: "鐢佃姱鍒颁綅", type: "byte", width: 80, align: "center" },
- { field: "isEventSubscribed", title: "宸茶闃�", type: "byte", width: 70, align: "center" },
+ { field: "isScanNG", title: "鎵爜NG", type: "byte", width: 80, align: "center" , bind: { key: "isTrue", data: [] }, },
+ { field: "batteryArrived", title: "鐢佃姱鍒颁綅", type: "byte", width: 80, align: "center" , bind: { key: "isTrue", data: [] }, },
+ { field: "isEventSubscribed", title: "宸茶闃�", type: "byte", width: 70, align: "center", bind: { key: "isTrue", data: [] }, },
]);
- const detail = ref({});
+ const detail = ref({
+ cnName: "",
+ table: "",
+ columns: [],
+ sortName: "",
+ key: "",
+ });
return {
table,
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/ITaskService.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/ITaskService.cs
index 7da55c0..6696d46 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/ITaskService.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/ITaskService.cs
@@ -218,5 +218,13 @@
/// <param name="taskNum">瑕佽幏鍙栫殑浠诲姟鐨勫敮涓�鏍囪瘑绗︺��</param>
/// <returns>琛ㄧず鎸囧畾缂栧彿浠诲姟鐨�<see cref="Dt_Task"/>瀵硅薄锛屽鏋滀笉瀛樺湪璇ヤ换鍔″垯杩斿洖<c>null</c>銆�</returns>
public Dt_Task QueryByTaskNum(int taskNum);
+
+ /// <summary>
+ /// 鏌ヨ鏄惁鏈夋鍦ㄦ墽琛岀殑鍘诲線鎸囧畾 TargetAddress 鐨勮緭閫佺嚎浠诲姟
+ /// </summary>
+ /// <param name="roadway">宸烽亾鍙�</param>
+ /// <param name="targetAddress">鐩爣鍦板潃</param>
+ /// <returns>瀛樺湪杩斿洖 true</returns>
+ bool HasExecutingTaskToTarget(string roadway, string targetAddress);
}
}
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/appsettings.json b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/appsettings.json
index 6468d80..acebc6b 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/appsettings.json
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/appsettings.json
@@ -4,15 +4,15 @@
"MinimumLevel": {
"Default": "Information",
"Override": {
- "Microsoft": "Information",
- "Microsoft.AspNetCore": "Information",
- "Microsoft.AspNetCore.Routing": "Information",
- "Microsoft.AspNetCore.Mvc": "Information",
- "Microsoft.AspNetCore.Mvc.Infrastructure": "Information",
- "Microsoft.AspNetCore.Mvc.Filters": "Information",
- "Microsoft.AspNetCore.Mvc.ModelBinding": "Information",
- "Microsoft.EntityFrameworkCore": "Information",
- "Quartz": "Debug"
+ "Microsoft": "Warning",
+ "Microsoft.AspNetCore": "Warning",
+ "Microsoft.AspNetCore.Routing": "Warning",
+ "Microsoft.AspNetCore.Mvc": "Warning",
+ "Microsoft.AspNetCore.Mvc.Infrastructure": "Warning",
+ "Microsoft.AspNetCore.Mvc.Filters": "Warning",
+ "Microsoft.AspNetCore.Mvc.ModelBinding": "Warning",
+ "Microsoft.EntityFrameworkCore": "Warning",
+ "Quartz": "Warning"
}
}
},
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Flows/OutboundTaskFlowService.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Flows/OutboundTaskFlowService.cs
index dbe7256..2db6032 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Flows/OutboundTaskFlowService.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Flows/OutboundTaskFlowService.cs
@@ -83,6 +83,7 @@
/// <returns>鎺ㄨ繘缁撴灉銆�</returns>
public WebResponseContent MoveToNextStatus([NotNull] Dt_Task task)
{
+ WebResponseContent content = new WebResponseContent();
if (task.TaskStatus >= (int)TaskOutStatusEnum.OutFinish)
return WebResponseContent.Instance.Error($"璇ヤ换鍔$姸鎬佷笉鍙烦杞埌涓嬩竴姝�,浠诲姟鍙�:銆恵task.TaskNum}銆�,浠诲姟鐘舵��:銆恵task.TaskStatus}銆�");
@@ -92,12 +93,13 @@
if (task.TaskStatus == (int)TaskOutStatusEnum.Line_OutFinish && task.TaskType == (int)TaskOutboundTypeEnum.Outbound)
{
+ return WebResponseContent.Instance.OK();
return GetWMSOutboundTrayTask(task);
}
if (task.TaskStatus == (int)TaskOutStatusEnum.Line_OutFinish && task.TaskType == (int)TaskOutboundTypeEnum.OutEmpty)
{
- return _robotTaskService.GetWMSRobotTask(task);
+ _robotTaskService.GetWMSRobotTask(task);
//if (!content.Status)
//{
// return content;
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Flows/RelocationTaskFlowService.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Flows/RelocationTaskFlowService.cs
index 3f74943..321df15 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Flows/RelocationTaskFlowService.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/Flows/RelocationTaskFlowService.cs
@@ -95,7 +95,7 @@
return content.Error($"閫氱煡WMS绯荤粺鍫嗗灈鏈虹Щ搴撳畬鎴愬け璐�,浠诲姟鍙�:銆恵task.TaskNum}銆�,鎵樼洏鍙�:銆恵task.PalletCode}銆�,閿欒淇℃伅:銆恵result.Message}銆�");
}
- return content.Error($"閫氱煡WMS绯荤粺鍫嗗灈鏈虹Щ搴撳畬鎴愭垚鍔�,浠诲姟鍙�:銆恵task.TaskNum}銆�,鎵樼洏鍙�:銆恵task.PalletCode}銆�");
+ return content.OK($"閫氱煡WMS绯荤粺鍫嗗灈鏈虹Щ搴撳畬鎴愭垚鍔�,浠诲姟鍙�:銆恵task.TaskNum}銆�,鎵樼洏鍙�:銆恵task.PalletCode}銆�");
}
/// <summary>
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService/TaskService.Query.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService/TaskService.Query.cs
index 9eb512b..a633f79 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService/TaskService.Query.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService/TaskService.Query.cs
@@ -34,6 +34,21 @@
}
/// <summary>
+ /// 鏌ヨ鏄惁鏈夋鍦ㄦ墽琛岀殑鍘诲線鎸囧畾 TargetAddress 鐨勮緭閫佺嚎浠诲姟
+ /// </summary>
+ /// <param name="roadway">宸烽亾鍙�</param>
+ /// <param name="targetAddress">鐩爣鍦板潃</param>
+ /// <returns>瀛樺湪杩斿洖 true</returns>
+ public bool HasExecutingTaskToTarget(string roadway, string targetAddress)
+ {
+ return BaseDal.QueryFirst(x =>
+ x.Roadway == roadway &&
+ x.TargetAddress == targetAddress &&
+ x.TaskStatus == (int)TaskOutStatusEnum.Line_OutExecuting,
+ TaskOrderBy) != null;
+ }
+
+ /// <summary>
/// 鏍规嵁浠诲姟鍙枫�佸綋鍓嶅湴鍧�鏌ヨ杈撻�佺嚎瀹屾垚鐨勪换鍔�
/// </summary>
/// <param name="taskNum">浠诲姟鍙�</param>
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/CommonConveyorLineNewJob.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/CommonConveyorLineNewJob.cs
index 9381bfd..ac18766 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/CommonConveyorLineNewJob.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/CommonConveyorLineNewJob.cs
@@ -275,7 +275,7 @@
ProcessTaskState(conveyorLine, command, task, childDeviceCode);
return Task.CompletedTask;
}
- else if (command.TaskNo == 1 && !command.Barcode.IsNullOrEmpty() && childDeviceCode == "11068")
+ else if (!command.Barcode.IsNullOrEmpty() && childDeviceCode == "11068")
{
if (_robotTaskService.Db.Queryable<Dt_RobotTask>().Any(x => x.RobotTargetAddressPalletCode == command.Barcode))
{
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotMessageHandler.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotMessageHandler.cs
index 62ea8ee..90a5b70 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotMessageHandler.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotMessageHandler.cs
@@ -112,12 +112,12 @@
// 绠�鍗曞懡浠ゅ寘鎷細homing銆乭omed銆乺unning銆乸ausing銆乺unmode銆乧ontrolmode 绛�
if (await _simpleCommandHandler.HandleAsync(messageLower, state))
{
- if (messageLower != "batteryarrived")
- {
- // 澶勭悊鎴愬姛鍚庯紝灏嗗師娑堟伅鍥炲啓鍒板鎴风锛堜繚鎸佸師鏈夎涓猴級
- await _socketClientGateway.SendMessageAsync(client, message);
- QuartzLogHelper.LogInfo(_logger, $"鍙戦�佹秷鎭細銆恵message}銆�", state.RobotCrane?.DeviceName);
- }
+ //if (messageLower != "batteryarrived")
+ //{
+ // 澶勭悊鎴愬姛鍚庯紝灏嗗師娑堟伅鍥炲啓鍒板鎴风锛堜繚鎸佸師鏈夎涓猴級
+ //await _socketClientGateway.SendMessageAsync(client, message);
+ QuartzLogHelper.LogInfo(_logger, $"鎺ユ敹鍒版秷鎭秷鎭�恵message}銆戯紝绾﹀畾涓嶈繑鍥炲彂閫佹秷鎭細銆恵message}銆�", state.RobotCrane?.DeviceName);
+ //}
// 瀹夊叏鏇存柊鐘舵�佸埌鏁版嵁搴�
_stateManager.TryUpdateStateSafely(state.IPAddress, state);
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Workflow/RobotSimpleCommandHandler.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Workflow/RobotSimpleCommandHandler.cs
index 9f8efa0..b0c1d9d 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Workflow/RobotSimpleCommandHandler.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Workflow/RobotSimpleCommandHandler.cs
@@ -96,6 +96,8 @@
// 鏈哄櫒浜哄凡瀹屾垚鍥為浂
case "homed":
state.Homed = "Homed";
+
+ await _socketClientGateway.SendToClientAsync(state.IPAddress, "Homed");
return true;
// 鏈哄櫒浜烘鍦ㄨ繍琛�
@@ -136,6 +138,8 @@
// 鏄惁鐢佃姱鍒颁綅
case "batteryarrivedno":
state.BatteryArrived = false;
+
+ await _socketClientGateway.SendToClientAsync(state.IPAddress, "batteryarrivedno");
return true;
// ==================== 鍏ㄩ儴瀹屾垚鍛戒护 ====================
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Workflow/RobotWorkflowOrchestrator.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Workflow/RobotWorkflowOrchestrator.cs
index 158d35c..c78fc4f 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Workflow/RobotWorkflowOrchestrator.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Workflow/RobotWorkflowOrchestrator.cs
@@ -327,11 +327,12 @@
// 妫�鏌ョ數姹犳槸鍚﹀凡鍒颁綅
if (!stateForUpdate.BatteryArrived)
{
+ QuartzLogHelper.LogError(_logger, $"HandlePutFinishedStateAsync锛氱數鑺湭鍒颁綅锛屼换鍔″彿: {task.RobotTaskNum}", stateForUpdate?.RobotCrane?.DeviceName ?? ipAddress);
return;
}
// 璇诲彇绾夸綋鐢佃姱鏉$爜
- string trayBarcode1 = RobotBarcodeGenerator.GenerateTrayBarcode("DB40.990");
- string trayBarcode2 = RobotBarcodeGenerator.GenerateTrayBarcode("DB40.1020");
+ string trayBarcode2 = RobotBarcodeGenerator.GenerateTrayBarcode("DB40.990");
+ string trayBarcode1 = RobotBarcodeGenerator.GenerateTrayBarcode("DB40.1020");
// 濡傛灉鏉$爜鐢熸垚鎴愬姛
if (!string.IsNullOrEmpty(trayBarcode1) && !string.IsNullOrEmpty(trayBarcode2))
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneTaskSelector.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneTaskSelector.cs
index 96be485..87e03ab 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneTaskSelector.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneTaskSelector.cs
@@ -216,6 +216,14 @@
return null;
}
+ // 妫�鏌ユ槸鍚︽湁姝e湪鎵ц鐨勮緭閫佺嚎浠诲姟鍘诲線鍚屼竴 TargetAddress
+ if (_taskService.HasExecutingTaskToTarget(outboundTask.Roadway, outboundTask.TargetAddress))
+ {
+ QuartzLogHelper.LogInfo(_logger, "TrySelectOutboundTask锛歍argetAddress: {TargetAddress} 宸叉湁姝e湪鎵ц鐨勮緭閫佺嚎浠诲姟锛屼换鍔″彿: {TaskNum}",
+ $"TrySelectOutboundTask锛歍argetAddress: {outboundTask.TargetAddress} 宸叉湁姝e湪鎵ц鐨勮緭閫佺嚎浠诲姟", outboundTask.Roadway, outboundTask.TargetAddress, outboundTask.TaskNum);
+ return null;
+ }
+
// 绔欏彴妫�鏌ラ�氳繃鍚庯紝璋冪敤 WMS 鍒ゆ柇鏄惁闇�瑕佺Щ搴�
var taskAfterTransferCheck = _transferCheck(outboundTask.TaskNum) ?? outboundTask;
var taskGroup = taskAfterTransferCheck.TaskType.GetTaskTypeGroup();
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/stock/groupPalle.jsx b/Code/WMS/WIDESEA_WMSClient/src/extension/stock/groupPalle.jsx
index 3adeaf6..ae0d543 100644
--- a/Code/WMS/WIDESEA_WMSClient/src/extension/stock/groupPalle.jsx
+++ b/Code/WMS/WIDESEA_WMSClient/src/extension/stock/groupPalle.jsx
@@ -1,10 +1,11 @@
//姝s鏂囦欢鏄敤鏉ヨ嚜瀹氫箟鎵╁睍涓氬姟浠g爜锛屽彲浠ユ墿灞曚竴浜涜嚜瀹氫箟椤甸潰鎴栬�呴噸鏂伴厤缃敓鎴愮殑浠g爜
+import RobotSelect from './extend/RobotSelect.vue';
let extension = {
components: {
//鏌ヨ鐣岄潰鎵╁睍缁勪欢
gridHeader: '',
- gridBody: '',
+ gridBody: RobotSelect,
gridFooter: '',
//鏂板缓銆佺紪杈戝脊鍑烘鎵╁睍缁勪欢
modelHeader: '',
@@ -28,72 +29,28 @@
<el-button
type="primary"
size="small"
- onClick={($e) => { this.handleInbound(row); }}
- >杩涚珯</el-button>
+ onClick={($e) => { this.handleBind(row); }}
+ >缁戝畾</el-button>
<el-button
type="success"
size="small"
style="margin-left: 8px"
- onClick={($e) => { this.handleOutbound(row); }}
- >鍑虹珯</el-button>
+ onClick={($e) => { this.handleUnbind(row); }}
+ >瑙g粦</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 || "缃戠粶閿欒锛岃绋嶅悗閲嶈瘯");
- }
- }
+ // 鎵樼洏缁勭洏鎿嶄綔
+ handleBind(row) {
+ this.$refs.gridBody.open('bind', row);
},
-
- // 鎵樼洏鍑虹珯鎿嶄綔
- 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 || "缃戠粶閿欒锛岃绋嶅悗閲嶈瘯");
- }
- }
+
+ // 鎵樼洏鎷嗙洏鎿嶄綔
+ handleUnbind(row) {
+ this.$refs.gridBody.open('unbind', row);
},
onInited() {
diff --git a/Code/WMS/WIDESEA_WMSClient/src/extension/stock/stockInfo.jsx b/Code/WMS/WIDESEA_WMSClient/src/extension/stock/stockInfo.jsx
index 0204d4e..d76739f 100644
--- a/Code/WMS/WIDESEA_WMSClient/src/extension/stock/stockInfo.jsx
+++ b/Code/WMS/WIDESEA_WMSClient/src/extension/stock/stockInfo.jsx
@@ -1,11 +1,10 @@
//姝s鏂囦欢鏄敤鏉ヨ嚜瀹氫箟鎵╁睍涓氬姟浠g爜锛屽彲浠ユ墿灞曚竴浜涜嚜瀹氫箟椤甸潰鎴栬�呴噸鏂伴厤缃敓鎴愮殑浠g爜
-import RobotSelect from './extend/RobotSelect.vue';
let extension = {
components: {
//鏌ヨ鐣岄潰鎵╁睍缁勪欢
gridHeader: '',
- gridBody: RobotSelect,
+ gridBody: '',
gridFooter: '',
//鏂板缓銆佺紪杈戝脊鍑烘鎵╁睍缁勪欢
modelHeader: "",
@@ -26,11 +25,7 @@
render: (h, { row, column, index }) => {
return (
<div>
- <el-button
- type="primary"
- size="small"
- onClick={($e) => { this.handleBind(row); }}
- >缁戝畾</el-button>
+
<el-button
type="primary"
size="small"
@@ -42,22 +37,12 @@
style="margin-left: 8px"
onClick={($e) => { this.handleOutbound(row); }}
>鍑虹珯</el-button>
- <el-button
- type="success"
- size="small"
- style="margin-left: 8px"
- onClick={($e) => { this.handleUnbind(row); }}
- >瑙g粦</el-button>
</div>
);
},
});
},
- // 鎵樼洏缁勭洏鎿嶄綔
- handleBind(row) {
- this.$refs.gridBody.open('bind', row);
- },
// 鎵樼洏杩涚珯鎿嶄綔
async handleInbound(row) {
@@ -129,10 +114,6 @@
}
},
- // 鎵樼洏鎷嗙洏鎿嶄綔
- handleUnbind(row) {
- this.$refs.gridBody.open('unbind', row);
- },
onInited() {
// 妗嗘灦鍒濆鍖栭厤缃悗
diff --git a/Code/WMS/WIDESEA_WMSClient/src/views/stock/groupPalle.vue b/Code/WMS/WIDESEA_WMSClient/src/views/stock/groupPalle.vue
index 17b5580..e2c7501 100644
--- a/Code/WMS/WIDESEA_WMSClient/src/views/stock/groupPalle.vue
+++ b/Code/WMS/WIDESEA_WMSClient/src/views/stock/groupPalle.vue
@@ -123,6 +123,15 @@
align: "left",
bind: { key: "stockStatusEmun", data: [] },
},
+
+ {
+ field: "mesUploadStatus",
+ title: "MES鐘舵��",
+ type: "int",
+ width: 120,
+ align: "left",
+ bind: { key: "mesUploadStatusEnum", data: [] },
+ },
// {
// field: "locationCode",
// title: TEXT.locationCode,
diff --git a/Code/WMS/WIDESEA_WMSServer/WIDESEA_Common/Constants/OutboundTimeConstants.cs b/Code/WMS/WIDESEA_WMSServer/WIDESEA_Common/Constants/OutboundTimeConstants.cs
index 625e140..b1e0174 100644
--- a/Code/WMS/WIDESEA_WMSServer/WIDESEA_Common/Constants/OutboundTimeConstants.cs
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_Common/Constants/OutboundTimeConstants.cs
@@ -27,9 +27,9 @@
public static class OutboundTimeConstants
{
/// <summary>
- /// GW_1棣栨斁鍏ュ簱鏃舵晥锛�16灏忔椂锛�
+ /// GW_1棣栨斁鍏ュ簱鏃舵晥锛�24灏忔椂锛�
/// </summary>
- public const int OUTBOUND_HOURS_GW1_FIRST = 16;
+ public const int OUTBOUND_HOURS_GW1_FIRST = 24;
/// <summary>
/// GW_1浜屾斁鍏ュ簱鏃舵晥锛�24灏忔椂锛�
diff --git a/Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WCS/TaskService_Inbound.cs b/Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WCS/TaskService_Inbound.cs
index 4cbd519..f501dba 100644
--- a/Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WCS/TaskService_Inbound.cs
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WCS/TaskService_Inbound.cs
@@ -188,7 +188,7 @@
EquipmentCode = equipmentCode,
ResourceCode = resourceCode,
LocalTime = DateTime.Now,
- ContainerCode = taskDto.PalletCode
+ ContainerCode = taskDto.PalletCode,
};
string requestJson = inboundRequest.ToJson();
var palletCode = taskDto.PalletCode;
diff --git a/Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WCS/TaskService_Tray.cs b/Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WCS/TaskService_Tray.cs
index 0a64c28..83d8cbc 100644
--- a/Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WCS/TaskService_Tray.cs
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WCS/TaskService_Tray.cs
@@ -151,10 +151,10 @@
{
try
{
- var task = await BaseDal.QueryFirstAsync(s => s.PalletCode == taskDto.PalletCode);
- if (task == null) return WebResponseContent.Instance.Error("鏈壘鍒板搴旂殑浠诲姟");
+ //var task = await BaseDal.QueryFirstAsync(s => s.PalletCode == taskDto.PalletCode);
+ //if (task == null) return WebResponseContent.Instance.Error("鏈壘鍒板搴旂殑浠诲姟");
- var location = await _locationInfoService.GetLocationInfo(task.Roadway, task.SourceAddress);
+ var location = await _locationInfoService.GetLocationInfo(taskDto.Roadway, taskDto.SourceAddress);
if (location == null) return WebResponseContent.Instance.Error("鏈壘鍒板搴旂殑璐т綅");
var stockInfo = await _stockInfoService.GetStockInfoAsync(taskDto.PalletCode);
@@ -168,23 +168,22 @@
location.LocationStatus = LocationStatusEnum.Free.GetHashCode();
- task.TaskStatus = TaskOutStatusEnum.OutFinish.GetHashCode();
var updateLocationResult = await _locationInfoService.UpdateLocationInfoAsync(location);
var updateStockResult = await _stockInfoService.UpdateStockAsync(stockInfo);
if (!updateLocationResult || !updateStockResult)
return WebResponseContent.Instance.Error("浠诲姟瀹屾垚澶辫触");
- var saveTaskHistoryResult = await SaveTaskHistoryAsync(task, "绌烘墭鐩樺嚭搴撳畬鎴�");
- if (!saveTaskHistoryResult.Status)
- return saveTaskHistoryResult;
+ //var saveTaskHistoryResult = await SaveTaskHistoryAsync(task, "绌烘墭鐩樺嚭搴撳畬鎴�");
+ //if (!saveTaskHistoryResult.Status)
+ // return saveTaskHistoryResult;
var saveStockHistoryResult = await SaveStockHistoryAsync(stockInfo, "绌烘墭鐩樺嚭搴撳畬鎴�");
if (!saveStockHistoryResult.Status)
return saveStockHistoryResult;
- var deleteResult = await BaseDal.DeleteDataAsync(task);
- if (!deleteResult) return WebResponseContent.Instance.Error("浠诲姟瀹屾垚澶辫触");
+ //var deleteResult = await BaseDal.DeleteDataAsync(task);
+ //if (!deleteResult) return WebResponseContent.Instance.Error("浠诲姟瀹屾垚澶辫触");
return WebResponseContent.Instance.OK("浠诲姟瀹屾垚");
});
diff --git a/Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/appsettings.json b/Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/appsettings.json
index 38551e1..76114fd 100644
--- a/Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/appsettings.json
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/appsettings.json
@@ -34,7 +34,7 @@
"MainDB": "DB_WIDESEA", //褰撳墠椤圭洰鐨勪富搴擄紝鎵�瀵瑰簲鐨勮繛鎺ュ瓧绗︿覆鐨凟nabled蹇呴』涓簍rue
//杩炴帴瀛楃涓�
//"ConnectionString": "HTI6FB1H05Krd07mNm9yBCNhofW6edA5zLs9TY~MNthRYW3kn0qKbMIsGp~3yyPDF1YZUCPBQx8U0Jfk4PH~ajNFXVIwlH85M3F~v_qKYQ3CeAz3q1mLVDn8O5uWt1~3Ut2V3KRkEwYHvW2oMDN~QIDXPxDgXN0R2oTIhc9dNu7QNaLEknblqmHhjaNSSpERdDVZIgHnMKejU_SL49tralBkZmDNi0hmkbL~837j1NWe37u9fJKmv91QPb~16JsuI9uu0EvNZ06g6PuZfOSAeFH9GMMIZiketdcJG3tHelo=",
- "ConnectionString": "Data Source=.;Initial Catalog=WIDESEAWMS_ShanMei;User ID=sa;Password=P@ssw0rd;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
+ "ConnectionString": "Data Source=192.168.60.30;Initial Catalog=WIDESEAWMS_ShanMei;User ID=sa;Password=P@ssw0rd;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
//"ConnectionString": "Data Source=.;Initial Catalog=WIDESEAWMS_ShanMei;User ID=sa;Password=123456;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
//"ConnectionString": "Data Source=10.30.4.92;Initial Catalog=WMS_TC;User ID=sa;Password=duo123456;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
//鏃MS鏁版嵁搴撹繛鎺�
diff --git a/Code/docs/superpowers/plans/2026-04-22-stacker-crane-executing-task-check.md b/Code/docs/superpowers/plans/2026-04-22-stacker-crane-executing-task-check.md
new file mode 100644
index 0000000..d20dd84
--- /dev/null
+++ b/Code/docs/superpowers/plans/2026-04-22-stacker-crane-executing-task-check.md
@@ -0,0 +1,145 @@
+# 鍑哄簱浠诲姟 TargetAddress 杈撻�佺嚎浠诲姟鍐茬獊妫�鏌� 瀹炴柦璁″垝
+
+> **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:** 鍦ㄥ嚭搴撲换鍔¢�夋嫨鏃讹紝妫�鏌ユ槸鍚︽湁姝e湪鎵ц鐨勮緭閫佺嚎浠诲姟鍘诲線鍚屼竴 TargetAddress锛岄伩鍏嶅啿绐併��
+
+**Architecture:** 鍦� `ITaskService` 鏂板 `HasExecutingTaskToTarget` 鏂规硶锛屽湪 `TaskService` 涓疄鐜版暟鎹簱鏌ヨ锛屽湪 `StackerCraneTaskSelector.TrySelectOutboundTask` 涓皟鐢ㄣ��
+
+**Tech Stack:** C# / .NET 8锛孲qlSugar ORM锛孲erilog
+
+---
+
+## 娑夊強鏂囦欢
+
+- 淇敼: `WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/ITaskService.cs`
+- 淇敼: `WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService/TaskService.Query.cs`
+- 淇敼: `WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneTaskSelector.cs`
+
+---
+
+## Task 1: 鏂板 ITaskService 鎺ュ彛鏂规硶
+
+**Files:**
+- Modify: `WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/ITaskService.cs`
+
+- [ ] **Step 1: 鍦ㄦ帴鍙f湯灏撅紙`public Dt_Task QueryByTaskNum(int taskNum);` 涔嬪悗锛宍}` 涔嬪墠锛夋坊鍔犳柟娉曞0鏄�**
+
+```csharp
+/// <summary>
+/// 鏌ヨ鏄惁鏈夋鍦ㄦ墽琛岀殑鍘诲線鎸囧畾 TargetAddress 鐨勮緭閫佺嚎浠诲姟
+/// </summary>
+/// <param name="roadway">宸烽亾鍙�</param>
+/// <param name="targetAddress">鐩爣鍦板潃</param>
+/// <returns>瀛樺湪杩斿洖 true</returns>
+bool HasExecutingTaskToTarget(string roadway, string targetAddress);
+```
+
+- [ ] **Step 2: Commit**
+
+```bash
+git add WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/ITaskService.cs
+git commit -m "feat(ITaskService): 鏂板 HasExecutingTaskToTarget 鎺ュ彛鏂规硶
+
+鏌ヨ鏄惁鏈夋鍦ㄦ墽琛岀殑鍘诲線鎸囧畾 TargetAddress 鐨勮緭閫佺嚎浠诲姟
+
+Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>"
+```
+
+---
+
+## Task 2: 瀹炵幇 TaskService 鏂规硶
+
+**Files:**
+- Modify: `WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService/TaskService.Query.cs`
+
+- [ ] **Step 1: 鍦� `QueryExecutingConveyorLineTask` 鏂规硶涔嬪悗娣诲姞瀹炵幇**
+
+鍦� `TaskService.Query.cs` 鏂囦欢涓紝鎵惧埌 `QueryExecutingConveyorLineTask` 鏂规硶锛堢害 line 28-34锛夛紝鍦ㄥ叾涔嬪悗锛坄QueryCompletedConveyorLineTask` 涔嬪墠锛夋彃鍏ワ細
+
+```csharp
+/// <summary>
+/// 鏌ヨ鏄惁鏈夋鍦ㄦ墽琛岀殑鍘诲線鎸囧畾 TargetAddress 鐨勮緭閫佺嚎浠诲姟
+/// </summary>
+/// <param name="roadway">宸烽亾鍙�</param>
+/// <param name="targetAddress">鐩爣鍦板潃</param>
+/// <returns>瀛樺湪杩斿洖 true</returns>
+public bool HasExecutingTaskToTarget(string roadway, string targetAddress)
+{
+ return BaseDal.QueryFirst(x =>
+ x.Roadway == roadway &&
+ x.TargetAddress == targetAddress &&
+ x.TaskStatus == (int)TaskOutStatusEnum.Line_OutExecuting,
+ TaskOrderBy) != null;
+}
+```
+
+- [ ] **Step 2: Commit**
+
+```bash
+git add WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService/TaskService.Query.cs
+git commit -m "feat(TaskService): 瀹炵幇 HasExecutingTaskToTarget 鏂规硶
+
+鏌ヨ TaskStatus == Line_OutExecuting 涓� Roadway 鍜� TargetAddress 鍖归厤鐨勪换鍔�
+
+Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>"
+```
+
+---
+
+## Task 3: 鍦� TrySelectOutboundTask 涓皟鐢ㄦ柊鏂规硶
+
+**Files:**
+- Modify: `WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneTaskSelector.cs`
+
+- [ ] **Step 1: 鍦� `TrySelectOutboundTask` 鏂规硶涓紝NextAddress 妫�鏌ラ�氳繃涔嬪悗銆乄MS 绉诲簱妫�鏌ヤ箣鍓嶆彃鍏�**
+
+褰撳墠浠g爜锛堢害 line 203-235锛夛細
+
+```csharp
+// 鍒ゆ柇 NextAddress 鍑哄簱绔欏彴鏄惁鍙敤
+if (!IsOutTaskStationAvailable(outboundTask))
+{
+ return null;
+}
+
+// 绔欏彴妫�鏌ラ�氳繃鍚庯紝璋冪敤 WMS 鍒ゆ柇鏄惁闇�瑕佺Щ搴�
+```
+
+鍦� `// 绔欏彴妫�鏌ラ�氳繃鍚巂 娉ㄩ噴涔嬪墠鎻掑叆锛�
+
+```csharp
+// 妫�鏌ユ槸鍚︽湁姝e湪鎵ц鐨勮緭閫佺嚎浠诲姟鍘诲線鍚屼竴 TargetAddress
+if (_taskService.HasExecutingTaskToTarget(outboundTask.Roadway, outboundTask.TargetAddress))
+{
+ QuartzLogHelper.LogInfo(_logger, "TrySelectOutboundTask锛歍argetAddress: {TargetAddress} 宸叉湁姝e湪鎵ц鐨勮緭閫佺嚎浠诲姟锛屼换鍔″彿: {TaskNum}",
+ $"TrySelectOutboundTask锛歍argetAddress: {outboundTask.TargetAddress} 宸叉湁姝e湪鎵ц鐨勮緭閫佺嚎浠诲姟", outboundTask.Roadway, outboundTask.TargetAddress, outboundTask.TaskNum);
+ return null;
+}
+```
+
+- [ ] **Step 2: Commit**
+
+```bash
+git add WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneTaskSelector.cs
+git commit -m "feat(StackerCraneTaskSelector): 鍑哄簱浠诲姟閫夋嫨鏃舵鏌� TargetAddress 杈撻�佺嚎浠诲姟鍐茬獊
+
+绔欏彴鍙敤鍚庛�乄MS 绉诲簱妫�鏌ュ墠锛屾煡璇㈡槸鍚︽湁 Line_OutExecuting 鐘舵�佺殑浠诲姟鍘诲悓涓� TargetAddress
+
+Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>"
+```
+
+---
+
+## Task 4: 楠岃瘉鏋勫缓
+
+- [ ] **Step 1: 鎵ц鏋勫缓楠岃瘉**
+
+```bash
+cd D:/Git/ShanMeiXinNengYuan/Code
+dotnet build WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server.csproj
+```
+
+棰勬湡锛�0 涓敊璇�
+
+- [ ] **Step 2: 濡傛湁閿欒锛屽垎鏋愬苟淇**
diff --git a/Code/docs/superpowers/specs/2026-04-22-stacker-crane-executing-task-check-design.md b/Code/docs/superpowers/specs/2026-04-22-stacker-crane-executing-task-check-design.md
new file mode 100644
index 0000000..d54d5ec
--- /dev/null
+++ b/Code/docs/superpowers/specs/2026-04-22-stacker-crane-executing-task-check-design.md
@@ -0,0 +1,55 @@
+# 鍑哄簱浠诲姟 TargetAddress 杈撻�佺嚎浠诲姟鍐茬獊妫�鏌� 璁捐鏂囨。
+
+## 1. 鑳屾櫙涓庣洰鏍�
+
+鍦� `TrySelectOutboundTask` 鏂规硶涓紝褰� TargetAddress 杈撻�佺嚎绔欏彴绌洪棽涓� NextAddress 鍑哄簱绔欏彴鍙敤鏃讹紝闇�瑕侀澶栨鏌ユ槸鍚﹀瓨鍦ㄦ鍦ㄦ墽琛岀殑杈撻�佺嚎浠诲姟鍘诲線鍚屼竴 TargetAddress銆傚鏋滃瓨鍦紝璇存槑 TargetAddress 鍗冲皢琚崰鐢紝涓嶅簲閫夋嫨璇ュ嚭搴撲换鍔°��
+
+## 2. 璁捐鏂规
+
+### 2.1 鏂板 ITaskService 鏂规硶
+
+鍦� `ITaskService` 鎺ュ彛涓柊澧炴柟娉曪細
+
+```csharp
+/// <summary>
+/// 鏌ヨ鏄惁鏈夋鍦ㄦ墽琛岀殑鍘诲線鎸囧畾 TargetAddress 鐨勮緭閫佺嚎浠诲姟
+/// </summary>
+/// <param name="roadway">宸烽亾鍙�</param>
+/// <param name="targetAddress">鐩爣鍦板潃</param>
+/// <returns>瀛樺湪杩斿洖 true</returns>
+bool HasExecutingTaskToTarget(string roadway, string targetAddress);
+```
+
+### 2.2 TaskService 瀹炵幇
+
+鏌ヨ鏉′欢锛�
+- `TaskStatus == (int)TaskOutStatusEnum.Line_OutExecuting`锛堢姸鎬� = 120锛�
+- `Roadway == roadway`
+- `TargetAddress == targetAddress`
+
+### 2.3 StackerCraneTaskSelector 璋冪敤
+
+鍦� `TrySelectOutboundTask` 鏂规硶涓紝涓や釜绔欏彴妫�鏌ラ�氳繃鍚庛�乄MS 绉诲簱妫�鏌ュ墠鎻掑叆锛�
+
+```csharp
+// 妫�鏌ユ槸鍚︽湁姝e湪鎵ц鐨勮緭閫佺嚎浠诲姟鍘诲線鍚屼竴 TargetAddress
+if (_taskService.HasExecutingTaskToTarget(outboundTask.Roadway, outboundTask.TargetAddress))
+{
+ return null;
+}
+```
+
+### 2.4 鏇存柊鍚庣殑妫�鏌ラ『搴�
+
+```
+1. TargetAddress 杈撻�佺嚎绔欏彴绌洪棽锛圥LC 璇诲彇锛�
+2. NextAddress 鍑哄簱绔欏彴鍙敤锛圥LC 璇诲彇锛�
+3. 鏃犳鍦ㄦ墽琛岀殑杈撻�佺嚎浠诲姟鍘诲悓涓� TargetAddress锛堟暟鎹簱鏌ヨ锛� 鈫� 鏂板
+4. WMS 绉诲簱妫�鏌ワ紙HTTP 璋冪敤锛�
+```
+
+## 3. 娑夊強鏂囦欢
+
+- 淇敼: `WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/ITaskService.cs`锛堟柊澧炴帴鍙f柟娉曪級
+- 淇敼: `WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService/TaskService.Query.cs`锛堟柊澧炲疄鐜帮級
+- 淇敼: `WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneTaskSelector.cs`锛堟柊澧炶皟鐢ㄧ偣锛�
--
Gitblit v1.9.3