Merge branch 'xiaoyang' into dev
| | |
| | | { |
| | | "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 æ£å¨ç¡®å®è¦è¿åç项ç®â¦\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 |
| | | } |
| | |
| | | { |
| | | "updatedAt": "2026-04-21T11:39:09.598Z", |
| | | "updatedAt": "2026-04-22T08:00:38.578Z", |
| | | "missions": [ |
| | | { |
| | | "id": "session:9007b9ea-1eb6-4d24-8fe7-2c3a949eac88:none", |
| | |
| | | "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": [ |
| | |
| | | "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" |
| | | } |
| | | ] |
| | | } |
| | |
| | | "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" |
| | | } |
| | |
| | | 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; |
| | |
| | | tableAction: "", |
| | | buttons: { view: [], box: [], detail: [] }, |
| | | methods: { |
| | | // æ¹æ³ç®çï¼é¡µé¢åå§åæ¶æ§è¡èªå®ä¹é»è¾ã |
| | | // åæ°ï¼æ ã |
| | | // è¿åå¼ï¼æ ã |
| | | onInit() {}, |
| | | |
| | | // æ¹æ³ç®çï¼é¡µé¢åå§å宿忧è¡èªå®ä¹é»è¾ã |
| | | // åæ°ï¼æ ã |
| | | // è¿åå¼ï¼æ ã |
| | | onInited() {}, |
| | | |
| | | // æ¹æ³ç®çï¼æ¥è¯¢åå¤çæ¥è¯¢æ¡ä»¶ã |
| | | // åæ°ï¼param æ¥è¯¢åæ°å¯¹è±¡ã |
| | | // è¿åå¼ï¼true ç»§ç»æ¥è¯¢ï¼false ç»æ¢æ¥è¯¢ã |
| | | searchBefore(param) { |
| | | return true; |
| | | }, |
| | | |
| | | // æ¹æ³ç®çï¼æ¥è¯¢åå¤çè¿åç»æã |
| | | // åæ°ï¼result å端è¿åæ°æ®ã |
| | | // è¿åå¼ï¼true ç»§ç»æ¸²æï¼false ç»æ¢åç»å¤çã |
| | | searchAfter(result) { |
| | | return true; |
| | | }, |
| | | |
| | | // æ¹æ³ç®çï¼æ°å¢åæ ¡éªæè¡¥å
æäº¤å段ã |
| | | // åæ°ï¼formData 表åæäº¤å¯¹è±¡ã |
| | | // è¿åå¼ï¼true ç»§ç»æäº¤ï¼false ç»æ¢æäº¤ã |
| | | addBefore(formData) { |
| | | return true; |
| | | }, |
| | | |
| | | addAfter(result) { |
| | | return true; |
| | | }, |
| | | |
| | | // æ¹æ³ç®çï¼ç¼è¾åæ ¡éªæè¡¥å
æäº¤å段ã |
| | | // åæ°ï¼formData 表åæäº¤å¯¹è±¡ã |
| | | // è¿åå¼ï¼true ç»§ç»æäº¤ï¼false ç»æ¢æäº¤ã |
| | | updateBefore(formData) { |
| | | return true; |
| | | }, |
| | | |
| | | updateAfter(result) { |
| | | return true; |
| | | }, |
| | | // æ¹æ³ç®çï¼ç¹å»è¡æ¶æ©å±å¤çã |
| | | // åæ°ï¼row è¡æ°æ®ï¼column åé
ç½®ï¼event åå§äºä»¶ã |
| | | // è¿åå¼ï¼æ ã |
| | | rowClick({ row, column, event }) {}, |
| | | |
| | | deleteBefore(ids) { |
| | | return true; |
| | | }, |
| | | |
| | | deleteAfter(ids) { |
| | | return true; |
| | | }, |
| | | |
| | | // æ¹æ³ç®çï¼ç¼è¾å¼¹çªæå¼åæ§è¡æ©å±é»è¾ã |
| | | // åæ°ï¼row å½åè¡æ°æ®ã |
| | | // è¿åå¼ï¼æ ã |
| | | modelOpenAfter(row) {}, |
| | | }, |
| | | }; |
| | |
| | | <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> |
| | | |
| | |
| | | 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: "æ£å¨åè´§" }, { key: "Putting", value: "æ£å¨æ¾è´§" }, { 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, |
| | |
| | | /// <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); |
| | | } |
| | | } |
| | |
| | | "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" |
| | | } |
| | | } |
| | | }, |
| | |
| | | /// <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}ã"); |
| | | |
| | |
| | | |
| | | 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; |
| | |
| | | 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> |
| | |
| | | } |
| | | |
| | | /// <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> |
| | |
| | | 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)) |
| | | { |
| | |
| | | // ç®åå½ä»¤å
æ¬ï¼homingãhomedãrunningãpausingãrunmodeãcontrolmode ç |
| | | 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); |
| | |
| | | // æºå¨äººå·²å®æåé¶ |
| | | case "homed": |
| | | state.Homed = "Homed"; |
| | | |
| | | await _socketClientGateway.SendToClientAsync(state.IPAddress, "Homed"); |
| | | return true; |
| | | |
| | | // æºå¨äººæ£å¨è¿è¡ |
| | |
| | | // æ¯å¦çµè¯å°ä½ |
| | | case "batteryarrivedno": |
| | | state.BatteryArrived = false; |
| | | |
| | | await _socketClientGateway.SendToClientAsync(state.IPAddress, "batteryarrivedno"); |
| | | return true; |
| | | |
| | | // ==================== å
¨é¨å®æå½ä»¤ ==================== |
| | |
| | | // æ£æ¥çµæ± æ¯å¦å·²å°ä½ |
| | | 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)) |
| | |
| | | return null; |
| | | } |
| | | |
| | | // æ£æ¥æ¯å¦ææ£å¨æ§è¡çè¾é线任å¡å»å¾åä¸ TargetAddress |
| | | if (_taskService.HasExecutingTaskToTarget(outboundTask.Roadway, outboundTask.TargetAddress)) |
| | | { |
| | | QuartzLogHelper.LogInfo(_logger, "TrySelectOutboundTaskï¼TargetAddress: {TargetAddress} å·²ææ£å¨æ§è¡çè¾é线任å¡ï¼ä»»å¡å·: {TaskNum}", |
| | | $"TrySelectOutboundTaskï¼TargetAddress: {outboundTask.TargetAddress} å·²ææ£å¨æ§è¡çè¾é线任å¡", outboundTask.Roadway, outboundTask.TargetAddress, outboundTask.TaskNum); |
| | | return null; |
| | | } |
| | | |
| | | // ç«å°æ£æ¥éè¿åï¼è°ç¨ WMS 夿æ¯å¦éè¦ç§»åº |
| | | var taskAfterTransferCheck = _transferCheck(outboundTask.TaskNum) ?? outboundTask; |
| | | var taskGroup = taskAfterTransferCheck.TaskType.GetTaskTypeGroup(); |
| | |
| | | //æ¤jsæä»¶æ¯ç¨æ¥èªå®ä¹æ©å±ä¸å¡ä»£ç ï¼å¯ä»¥æ©å±ä¸äºèªå®ä¹é¡µé¢æè
éæ°é
ç½®çæç代ç
|
| | | import RobotSelect from './extend/RobotSelect.vue';
|
| | |
|
| | | let extension = {
|
| | | components: {
|
| | | //æ¥è¯¢ç颿©å±ç»ä»¶
|
| | | gridHeader: '',
|
| | | gridBody: '',
|
| | | gridBody: RobotSelect,
|
| | | gridFooter: '',
|
| | | //æ°å»ºãç¼è¾å¼¹åºæ¡æ©å±ç»ä»¶
|
| | | modelHeader: '',
|
| | |
| | | <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); }}
|
| | | >è§£ç»</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
|
| | | }, "æ£å¨è°ç¨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
|
| | | }, "æ£å¨è°ç¨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() {
|
| | |
| | | //æ¤jsæä»¶æ¯ç¨æ¥èªå®ä¹æ©å±ä¸å¡ä»£ç ï¼å¯ä»¥æ©å±ä¸äºèªå®ä¹é¡µé¢æè
éæ°é
ç½®çæç代ç |
| | | import RobotSelect from './extend/RobotSelect.vue'; |
| | | |
| | | let extension = { |
| | | components: { |
| | | //æ¥è¯¢ç颿©å±ç»ä»¶ |
| | | gridHeader: '', |
| | | gridBody: RobotSelect, |
| | | gridBody: '', |
| | | gridFooter: '', |
| | | //æ°å»ºãç¼è¾å¼¹åºæ¡æ©å±ç»ä»¶ |
| | | modelHeader: "", |
| | |
| | | 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" |
| | |
| | | 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); }} |
| | | >è§£ç»</el-button> |
| | | </div> |
| | | ); |
| | | }, |
| | | }); |
| | | }, |
| | | |
| | | // æçç»çæä½ |
| | | handleBind(row) { |
| | | this.$refs.gridBody.open('bind', row); |
| | | }, |
| | | |
| | | // æçè¿ç«æä½ |
| | | async handleInbound(row) { |
| | |
| | | } |
| | | }, |
| | | |
| | | // æçæçæä½ |
| | | handleUnbind(row) { |
| | | this.$refs.gridBody.open('unbind', row); |
| | | }, |
| | | |
| | | onInited() { |
| | | // æ¡æ¶åå§åé
ç½®å |
| | |
| | | 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,
|
| | |
| | | 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å°æ¶ï¼ |
| | |
| | | EquipmentCode = equipmentCode, |
| | | ResourceCode = resourceCode, |
| | | LocalTime = DateTime.Now, |
| | | ContainerCode = taskDto.PalletCode |
| | | ContainerCode = taskDto.PalletCode, |
| | | }; |
| | | string requestJson = inboundRequest.ToJson(); |
| | | var palletCode = taskDto.PalletCode; |
| | |
| | | { |
| | | 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); |
| | |
| | | |
| | | 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("ä»»å¡å®æ"); |
| | | }); |
| | |
| | | "MainDB": "DB_WIDESEA", //å½å项ç®ç主åºï¼æå¯¹åºçè¿æ¥å符串çEnabledå¿
须为true |
| | | //è¿æ¥å符串 |
| | | //"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", |
| | | //æ§WMSæ°æ®åºè¿æ¥ |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # åºåºä»»å¡ 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:** å¨åºåºä»»å¡éæ©æ¶ï¼æ£æ¥æ¯å¦ææ£å¨æ§è¡çè¾é线任å¡å»å¾åä¸ TargetAddressï¼é¿å
å²çªã |
| | | |
| | | **Architecture:** å¨ `ITaskService` æ°å¢ `HasExecutingTaskToTarget` æ¹æ³ï¼å¨ `TaskService` ä¸å®ç°æ°æ®åºæ¥è¯¢ï¼å¨ `StackerCraneTaskSelector.TrySelectOutboundTask` ä¸è°ç¨ã |
| | | |
| | | **Tech Stack:** C# / .NET 8ï¼SqlSugar ORMï¼Serilog |
| | | |
| | | --- |
| | | |
| | | ## æ¶åæä»¶ |
| | | |
| | | - ä¿®æ¹: `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: 卿¥å£æ«å°¾ï¼`public Dt_Task QueryByTaskNum(int taskNum);` ä¹åï¼`}` ä¹åï¼æ·»å æ¹æ³å£°æ** |
| | | |
| | | ```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 æ£æ¥éè¿ä¹åãWMS ç§»åºæ£æ¥ä¹åæå
¥** |
| | | |
| | | å½å代ç ï¼çº¦ line 203-235ï¼ï¼ |
| | | |
| | | ```csharp |
| | | // 夿 NextAddress åºåºç«å°æ¯å¦å¯ç¨ |
| | | if (!IsOutTaskStationAvailable(outboundTask)) |
| | | { |
| | | return null; |
| | | } |
| | | |
| | | // ç«å°æ£æ¥éè¿åï¼è°ç¨ WMS 夿æ¯å¦éè¦ç§»åº |
| | | ``` |
| | | |
| | | å¨ `// ç«å°æ£æ¥éè¿å` 注éä¹åæå
¥ï¼ |
| | | |
| | | ```csharp |
| | | // æ£æ¥æ¯å¦ææ£å¨æ§è¡çè¾é线任å¡å»å¾åä¸ TargetAddress |
| | | if (_taskService.HasExecutingTaskToTarget(outboundTask.Roadway, outboundTask.TargetAddress)) |
| | | { |
| | | QuartzLogHelper.LogInfo(_logger, "TrySelectOutboundTaskï¼TargetAddress: {TargetAddress} å·²ææ£å¨æ§è¡çè¾é线任å¡ï¼ä»»å¡å·: {TaskNum}", |
| | | $"TrySelectOutboundTaskï¼TargetAddress: {outboundTask.TargetAddress} å·²ææ£å¨æ§è¡çè¾é线任å¡", 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 è¾é线任å¡å²çª |
| | | |
| | | ç«å°å¯ç¨åãWMS ç§»åºæ£æ¥åï¼æ¥è¯¢æ¯å¦æ 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: 妿é误ï¼åæå¹¶ä¿®å¤** |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # åºåºä»»å¡ 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` æ¹æ³ä¸ï¼ä¸¤ä¸ªç«å°æ£æ¥éè¿åãWMS ç§»åºæ£æ¥åæå
¥ï¼ |
| | | |
| | | ```csharp |
| | | // æ£æ¥æ¯å¦ææ£å¨æ§è¡çè¾é线任å¡å»å¾åä¸ TargetAddress |
| | | if (_taskService.HasExecutingTaskToTarget(outboundTask.Roadway, outboundTask.TargetAddress)) |
| | | { |
| | | return null; |
| | | } |
| | | ``` |
| | | |
| | | ### 2.4 æ´æ°åçæ£æ¥é¡ºåº |
| | | |
| | | ``` |
| | | 1. TargetAddress è¾é线ç«å°ç©ºé²ï¼PLC 读åï¼ |
| | | 2. NextAddress åºåºç«å°å¯ç¨ï¼PLC 读åï¼ |
| | | 3. æ æ£å¨æ§è¡çè¾é线任å¡å»åä¸ TargetAddressï¼æ°æ®åºæ¥è¯¢ï¼ â æ°å¢ |
| | | 4. WMS ç§»åºæ£æ¥ï¼HTTP è°ç¨ï¼ |
| | | ``` |
| | | |
| | | ## 3. æ¶åæä»¶ |
| | | |
| | | - ä¿®æ¹: `WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/ITaskService.cs`ï¼æ°å¢æ¥å£æ¹æ³ï¼ |
| | | - ä¿®æ¹: `WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService/TaskService.Query.cs`ï¼æ°å¢å®ç°ï¼ |
| | | - ä¿®æ¹: `WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneTaskSelector.cs`ï¼æ°å¢è°ç¨ç¹ï¼ |