´úÂë¹ÜÀí/WCS/WIDESEAWCS_Client/config/buttons.js
@@ -69,6 +69,33 @@ } }, { name: "äººå·¥å ¥åº", icon: '', class: '', value: 'ManualInbound', type: 'warning', onClick: function () { } }, { name: "人工åºåº", icon: '', class: '', value: 'ManualOutbound', type: 'warning', onClick: function () { } }, { name: "人工移åº", icon: '', class: '', value: 'ManualTransfer', type: 'warning', onClick: function () { } }, { name: "æ¥ç宿´è·¯ç±", icon: '', class: '', ´úÂë¹ÜÀí/WCS/WIDESEAWCS_Client/src/extension/taskinfo/extend/taskManual.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,414 @@ <template> <div> <!-- äººå·¥å ¥åº --> <vol-box :lazy="true" :width="400" :height="300" v-model="inbound.model" title="äººå·¥å ¥åº" :onModelClose="cancelIn" > <div style="padding: 10px 20px"> <vol-form ref="sendInTask" :formRules="inbound.data" :formFields="inbound.fields" ></vol-form> </div> <template #footer> <div> <el-button type="danger" size="big" icon="md-checkmark-circle" long @click="SendInTask" >ç¡®è®¤å ¥åº</el-button > <el-button type="primary" size="big" icon="md-checkmark-circle" long @click="cancelIn" >åæ¶</el-button > </div> </template> </vol-box> <!-- 人工åºåº --> <vol-box :lazy="true" :width="400" :height="300" v-model="outbound.model" title="人工åºåº" :onModelClose="cancelOut" > <div style="padding: 10px 20px"> <vol-form ref="sendInTask" :formRules="outbound.data" :formFields="outbound.fields" ></vol-form> </div> <template #footer> <div> <el-button type="danger" size="big" icon="md-checkmark-circle" long @click="SendOutTask" >ç¡®è®¤å ¥åº</el-button > <el-button type="primary" size="big" icon="md-checkmark-circle" long @click="cancelOut" >åæ¶</el-button > </div> </template> </vol-box> <!-- äººå·¥ç§»åº --> <vol-box :lazy="true" :width="400" :height="300" v-model="transfer.model" title="人工移åº" :onModelClose="cancelTransfer" > <div style="padding: 10px 20px"> <vol-form ref="sendInTask" :formRules="transfer.data" :formFields="transfer.fields" ></vol-form> </div> <template #footer> <div> <el-button type="danger" size="big" icon="md-checkmark-circle" long @click="SendTransfer" >ç¡®è®¤å ¥åº</el-button > <el-button type="primary" size="big" icon="md-checkmark-circle" long @click="cancelTransfer" >åæ¶</el-button > </div> </template> </vol-box> </div> </template> <script> import VolBox from "@/components/basic/VolBox.vue"; import VolForm from "@/components/basic/VolForm.vue"; //è¿é使ç¨çvue2è¯æ³ï¼ä¹å¯ä»¥åævue3è¯æ³ export default { components: { "vol-box": VolBox, "vol-form": VolForm }, methods: {}, data() { return { inbound: { model: false, fields: { cmd: 3001, src_station: 1001, dest_station: null, CarId: '', }, data: [ [ { type: "select", required: true, title: "å ¥åºç«ç¹", field: "src_station", data: [ { key: 1001, value: "å «å" }, { key: 1002, value: "ä¹å" }, ], }, ], [ { type: "number", required: true, title: "ç»ç¹åºä½", field: "dest_station" }, ], [ { type: "text", required: true, title: "æè½¦ç¼å·", field: "CarId", }, ], ], }, outbound: { model: false, fields: { cmd: 102, src_station: null, dest_station: 1001, CarId: '', }, data: [ [ { type: "number", required: true, title: "æ¥æºåºä½", field: "src_station" }, ], [ { type: "select", required: true, title: "åºåºç«ç¹", field: "dest_station", data: [ { key: 1001, value: "å «å" }, { key: 1002, value: "ä¹å" }, ], }, ], [ { type: "text", required: true, title: "æè½¦ç¼å·", field: "CarId", }, ], ], }, transfer: { model: false, fields: { cmd: 103, src_station: null, dest_station: null, CarId: '', }, data: [ [ { type: "number", required: true, title: "æ¥æºåºä½", field: "src_station" }, ], [ { type: "number", required: true, title: "ç»ç¹åºä½", field: "dest_station" }, ], [ { type: "text", required: true, title: "æè½¦ç¼å·", field: "CarId", }, ], ], }, }; }, computed: { isValidInDest() { const regex = /^[0-9]{1,5}$/; return regex.test(this.inbound.fields.dest_station); }, isValidoutSrc() { const regex = /^[0-9]{1,5}$/; return regex.test(this.outbound.fields.src_station); }, isValidTranSrc() { const regex = /^[0-9]{1,5}$/; return regex.test(this.transfer.fields.src_station); }, isValidTranDest() { const regex = /^[0-9]{1,5}$/; return regex.test(this.transfer.fields.dest_station); } }, methods: { //äººå·¥å ¥åº open(type) { switch (type) { case "inbound": this.inbound.model = true; break; case "outbound": this.outbound.model = true; break; case "transfer": this.transfer.model = true; break; default: break; } }, cancelIn(){ this.$refs.sendInTask.reset() this.inbound.model = false; let param = { cmd: this.inbound.fields.cmd, src_station: this.inbound.fields.src_station, dest_station: this.inbound.fields.dest_station, carId: this.inbound.fields.CarId, }; console.log(param); }, cancelOut(){ this.$refs.sendInTask.reset() this.outbound.model = false; let param = { cmd: this.outbound.fields.cmd, src_station: this.outbound.fields.src_station, dest_station: this.outbound.fields.dest_station, carId: this.inbound.fields.CarId, }; console.log(param); }, cancelTransfer(){ this.$refs.sendInTask.reset() this.transfer.model = false; let param = { cmd: this.transfer.fields.cmd, src_station: this.transfer.fields.src_station, dest_station: this.transfer.fields.dest_station, carId: this.transfer.fields.CarId, }; console.log(param); }, //äººå·¥å ¥åº SendInTask() { if (this.inbound.fields.src_station==''||this.inbound.fields.dest_station==0||this.inbound.fields.CarId=='') { return this.$Message.error( "请è¾å ¥ç¬¦åæ¡ä»¶çåæ°" ); } if (!this.isValidInDest) { return this.$Message.error( "ç»ç¹åºä½åªå 嫿°å䏿大é¿åº¦ä¸º5ä½" ); } let param = { cmd: this.inbound.fields.cmd, src_station: this.inbound.fields.src_station, dest_station: this.inbound.fields.dest_station, carId: this.inbound.fields.CarId, }; this.http .post("/api/Task/ReceiveWCSTask", param, "ä»»å¡å建ä¸...") .then((x) => { if (x.status == true) { this.$Message.success("æ°å»ºå ¥åºä»»å¡æå"); //å ³éå¼¹æ¡ this.inbound.model = false; //æ¸ ç©ºè¡¨å this.$refs.sendInTask.reset(); this.$parent.refresh(); } else { this.$Message.error(x.message); } }); }, //人工åºåº SendOutTask() { if (this.outbound.fields.src_station==0||this.outbound.fields.dest_station==''||this.outbound.fields.CarId=='') { return this.$Message.error( "请è¾å ¥ç¬¦åæ¡ä»¶çåæ°" ); } if (!this.isValidoutSrc) { return this.$Message.error( "æ¥æºåºä½åªå 嫿°å䏿大é¿åº¦ä¸º5ä½" ); } let param = { cmd: this.outbound.fields.cmd, src_station: this.outbound.fields.src_station, dest_station: this.outbound.fields.dest_station, carId: this.outbound.fields.CarId, }; this.http .post("/api/Task/ReceiveWCSTask", param, "ä»»å¡å建ä¸...") .then((x) => { if (x.status == true) { this.$Message.success("æ°å»ºåºåºä»»å¡æå"); //å ³éå¼¹æ¡ this.outbound.model = false; //æ¸ ç©ºè¡¨å this.$refs.sendInTask.reset(); this.$parent.refresh(); } else { this.$Message.error(x.message); } }); }, //人工移åºåº SendTransfer() { if (this.transfer.fields.src_station==0||this.transfer.fields.dest_station==0||this.transfer.fields.CarId=='') { return this.$Message.error( "请è¾å ¥ç¬¦åæ¡ä»¶çåæ°" ); } if (!this.isValidTranSrc) { return this.$Message.error( "æ¥æºåºä½åªå 嫿°å䏿大é¿åº¦ä¸º5ä½" ); } if (!this.isValidTranDest) { return this.$Message.error( "ç»ç¹åºä½åªå 嫿°å䏿大é¿åº¦ä¸º5ä½" ); } let param = { cmd: this.transfer.fields.cmd, src_station: this.transfer.fields.src_station, dest_station: this.transfer.fields.dest_station, carId: this.transfer.fields.CarId, }; this.http .post("/api/Task/ReceiveWCSTask", param, "ä»»å¡å建ä¸...") .then((x) => { if (x.status == true) { this.$Message.success("æ°å»ºç§»åºä»»å¡æå"); //å ³éå¼¹æ¡ this.transfer.model = false; //æ¸ ç©ºè¡¨å this.$refs.sendInTask.reset(); this.$parent.refresh(); } else { this.$Message.error(x.message); } }); }, }, }; </script> ´úÂë¹ÜÀí/WCS/WIDESEAWCS_Client/src/extension/taskinfo/task.js
@@ -1,10 +1,11 @@ //æ¤jsæä»¶æ¯ç¨æ¥èªå®ä¹æ©å±ä¸å¡ä»£ç ï¼å¯ä»¥æ©å±ä¸äºèªå®ä¹é¡µé¢æè éæ°é ç½®çæç代ç import gridBody from './extend/taskExecuteDetail.vue' import gridHeader from './extend/taskManual.vue' let extension = { components: { //æ¥è¯¢ç颿©å±ç»ä»¶ gridHeader: '', gridHeader: gridHeader, gridBody: gridBody, gridFooter: '', //æ°å»ºãç¼è¾å¼¹åºæ¡æ©å±ç»ä»¶ @@ -50,7 +51,27 @@ }); } } //äººå·¥å ¥åºæé® var ManualButton = this.buttons.find((x) => x.value == "ManualInbound"); if (ManualButton) { ManualButton.onClick = () => { this.$refs.gridHeader.open("inbound"); } } //人工åºåºæé® var ManualOutButton = this.buttons.find((x) => x.value == "ManualOutbound"); if (ManualOutButton) { ManualOutButton.onClick = () => { this.$refs.gridHeader.open("outbound"); } } //äººå·¥ç§»åºæé® var ManualTransferButton = this.buttons.find((x) => x.value == "ManualTransfer"); if (ManualTransferButton) { ManualTransferButton.onClick = () => { this.$refs.gridHeader.open("transfer"); } } var previousButton = this.buttons.find((x) => x.value == "Previous"); if (previousButton) previousButton.hidden = true; var nextButton = this.buttons.find((x) => x.value == "Next"); ´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/ITaskService.cs
@@ -63,6 +63,8 @@ /// <returns>è¿åå¤çç»æ</returns> WebResponseContent ReceiveMESTask([NotNull] MESTaskDTO taskDTO); WebResponseContent ReceiveWCSTask([NotNull] MESTaskDTO taskDTO); /// <summary> /// æ ¹æ®æçå·ãèµ·å§å°ååWMS请æ±ä»»å¡ /// </summary> @@ -138,6 +140,13 @@ /// <returns></returns> Dt_Task QueryStackerCraneTaskByAGVRequest(string deviceNo); /// <summary> /// æ¥è¯¢AGVè¿å ¥ä¸çå ¥åºä»»å¡æ°é /// </summary> /// <param name="deviceNo"></param> /// <returns></returns> Dt_Task QueryStackerCraneTaskByAGVIning(string deviceNo); /// <summary> /// 对åºWMSè¯·æ± 3001-AGVæ¾è´§å®æ @@ -176,6 +185,21 @@ /// <param name="taskNum">ä»»å¡å·</param> /// <param name="message">å¼å¸¸ä¿¡æ¯</param> WebResponseContent UpdateTaskExceptionMessage(int taskNum, string message); /// <summary> /// æ´æ°æ¯å¦è¿å ¥åéæºæ å¿ï¼0ï¼æªè¿å ¥ 1ï¼å·²è¿å ¥ï¼ /// </summary> /// <param name="taskNum"></param> /// <param name="Inflag"></param> /// <returns></returns> WebResponseContent UpdateTaskAllowIn(int taskNum, int Inflag); /// <summary> /// æ¯å¦å·²åä¼ MES2001æ å¿ï¼0ï¼æªåä¼ 1ï¼å·²åä¼ ï¼ /// </summary> /// <param name="taskNum"></param> /// <param name="Inflag"></param> /// <returns></returns> WebResponseContent UpdateTaskIsBack(int taskNum, int Inflag); /// <summary> /// æ´æ°ä»»å¡ç¶æä¿¡æ¯ï¼å¹¶åæ¥è³WMS ´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/TaskInfo/Dt_Task.cs
@@ -144,7 +144,7 @@ public DateTime? Dispatchertime { get; set; } /// <summary> /// 夿³¨ 䏿任塿¶ ç¨äºå䏿æè½¦çæ»å±æ°åå½å屿° æ ¼å¼ï¼æ»å±æ°-å½å屿° åºåºä»»å¡æ¶ï¼åæ»å±æ° /// 夿³¨ 䏿任塿¶ ç¨äºå䏿æè½¦çæ»å±æ°åå½å屿° æ ¼å¼ï¼æ»å±æ°-å½å屿°; åºåºä»»å¡æ¶:忻屿°; èªå¨å ¥åºæ¶åï¼æ¯å¦åä¼ å 计æ¶è¿å ¥ /// </summary> [ImporterHeader(Name = "夿³¨")] [ExporterHeader(DisplayName = "夿³¨")] ´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/Task/TaskController.cs
@@ -62,6 +62,17 @@ } /// <summary> /// æ¥æ¶WCS人工任å¡ä¿¡æ¯ /// </summary> /// <param name="taskDTO">WCSä»»å¡å¯¹è±¡</param> /// <returns>è¿åå¤çç»æ</returns> [HttpPost, Route("ReceiveWCSTask"), AllowAnonymous] public WebResponseContent ReceiveWCSTask([FromBody] MESTaskDTO taskDTO) { return Service.ReceiveWCSTask(taskDTO); } /// <summary> /// ä»»å¡åæ¶(å åæºåè§£å³ä¸äºçæ é鿏 é¤ä»»å¡ï¼æ¸ é¤ä»»å¡åï¼éå¨WCSä¸åæ¶ä»»å¡) /// </summary> /// <param name="key"></param> ´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs
@@ -24,6 +24,7 @@ using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Reflection; @@ -483,6 +484,253 @@ } /// <summary> /// wcsæå·¥çæä»»å¡ /// </summary> /// <param name="taskDTO">WCSä»»å¡å¯¹è±¡</param> /// <returns>è¿åå¤çç»æ</returns> public WebResponseContent ReceiveWCSTask([NotNull] MESTaskDTO taskDTO) { WebResponseContent content = new WebResponseContent(); try { taskDTO.task_id = GetTaskNo(); string inparam = JsonConvert.SerializeObject(taskDTO); ServiceLogger.WriteDebug("ReceiveWCSTask", $"ReceiveWCSTaskæ¹æ³å ¥å{inparam}"); Dt_Task task = new Dt_Task(); Dt_Task taskinfo = BaseDal.QueryFirst(x => x.TaskNum == taskDTO.task_id); if (taskDTO.cmd == 101)//妿æ¯101ææ§çä»»å¡å·å»æ¥ { taskinfo = BaseDal.QueryFirst(x => x.TaskNum == taskDTO.weight); } if (taskDTO.cmd != 3001 && taskDTO.cmd != 101 && taskinfo != null) { ServiceLogger.WriteDebug("ReceiveWCSTask", $"ä»»å¡å·éå¤ï¼ä»»å¡å·ï¼{taskDTO.task_id}"); return content = WebResponseContent.Instance.Error($"ä»»å¡å·éå¤ï¼ä»»å¡å·ï¼{taskDTO.task_id}"); } Dt_LocationInfo locationsrc = _locationInfoRepository.QueryFirst(x => x.Remark == taskDTO.src_station.ToString()); Dt_LocationInfo locationdsc = _locationInfoRepository.QueryFirst(x => x.Remark == taskDTO.dest_station.ToString()); switch (taskDTO.cmd) { case 3001://AGVæ¾è´§å®æ WMSå3001çåæ¶WCSéå¨jobä¸åæåä¿¡å· if (BaseDal.QueryFirst(x => x.TaskNum == taskDTO.task_id) == null)//æå¨å ¥åºç´æ¥å3001ï¼éè¦çæä»»å¡ï¼å 为没æ1001ç¯è { taskDTO.dest_rack =int.Parse(taskDTO.dest_station.ToString().Substring(0, 1)); taskDTO.dest_row = int.Parse(taskDTO.dest_station.ToString().Substring(1, 2).TrimStart('0')); taskDTO.dest_col = int.Parse(taskDTO.dest_station.ToString().Substring(3, 2).TrimStart('0')); task.TaskType = (int)TaskInboundTypeEnum.Inbound; task.TaskState = (int)TaskInStatusEnum.AGV_InExecuting; task.Roadway = "SC01"; task.Grade = 2; if (locationsrc != null) { task.SourceAddress = locationsrc.LocationCode; } else { ServiceLogger.WriteDebug("ReceiveWCSTask", $"WCSæªæ¥è¯¢å°æºç«ç¹å¯¹åºçåºä½ï¼æºç«ç¹ï¼{taskDTO.dest_station.ToString()}"); return content = WebResponseContent.Instance.Error($"WCSæªæ¥è¯¢å°æºç«ç¹å¯¹åºçåºä½ï¼æºç«ç¹ï¼{taskDTO.dest_station.ToString()}"); } } break; case 101://æåæºæå宿 if (taskinfo != null) { //æ´æ°ä»»å¡è¡¨ä¸NextAddressåæ®µä¸ºæ°çä»»å¡å· taskDTO.weight-æ§çä»»å¡å· taskDTO.task_id-æ°çä»»å¡å· UpdateTaskStatus(taskinfo.TaskId, taskDTO.task_id, (int)TaskInStatusEnum.AGV_InFinish); _taskExecuteDetailService.AddTaskExecuteDetail(taskinfo.TaskId, $"AGVæ¬è¿å®æ"); ServiceLogger.WriteDebug("ReceiveWCSTask", $"AGVæ¬è¿å®æï¼101ï¼æ´æ°ç¶ææåï¼ä»»å¡å·ï¼{taskinfo.TaskId}"); return content = WebResponseContent.Instance.OK($"AGVæ¬è¿å®æï¼101ï¼æ´æ°ç¶ææåï¼ä»»å¡å·ï¼{taskinfo.TaskId}"); } else { ServiceLogger.WriteDebug("ReceiveWCSTask", $"AGVæ¬è¿å®æï¼101ï¼æ´æ°ç¶ææ¶ï¼æ¥è¯¢ä¸å°ä»»å¡å·"); return content = WebResponseContent.Instance.Error($"AGVæ¬è¿å®æï¼101ï¼æ´æ°ç¶ææ¶ï¼æ¥è¯¢ä¸å°ä»»å¡å·"); } break; case 103://产åç§»åºï¼ç§»åºï¼åºåºï¼ taskDTO.src_rack = int.Parse(taskDTO.src_station.ToString().Substring(0, 1)); taskDTO.src_row = int.Parse(taskDTO.src_station.ToString().Substring(1, 2).TrimStart('0')); taskDTO.src_col = int.Parse(taskDTO.src_station.ToString().Substring(3, 2).TrimStart('0')); taskDTO.dest_rack = int.Parse(taskDTO.dest_station.ToString().Substring(0, 1)); taskDTO.dest_row = int.Parse(taskDTO.dest_station.ToString().Substring(1, 2).TrimStart('0')); taskDTO.dest_col = int.Parse(taskDTO.dest_station.ToString().Substring(3, 2).TrimStart('0')); taskDTO.total = 9; task.TaskType = (int)TaskRelocationTypeEnum.Relocation; task.TaskState = (int)TaskOutStatusEnum.OutNew; task.Roadway = "SC01"; if (taskDTO.total > 0) { task.Remark = taskDTO.total.ToString();//ååºåºçæ»å±æ° } task.Grade = 1; break; case 102: if (taskDTO.dest_station == 1001 || taskDTO.dest_station == 1002)//å¼å¸¸åºåº { taskDTO.src_rack = int.Parse(taskDTO.src_station.ToString().Substring(0, 1)); taskDTO.src_row = int.Parse(taskDTO.src_station.ToString().Substring(1, 2).TrimStart('0')); taskDTO.src_col = int.Parse(taskDTO.src_station.ToString().Substring(3, 2).TrimStart('0')); task.TaskType = (int)TaskOutboundTypeEnum.OutInventory; task.TaskState = (int)TaskOutStatusEnum.OutNew; task.Roadway = "SC01"; task.Grade = 1; } if (locationdsc != null) { task.TargetAddress = locationdsc.LocationCode; } else { ServiceLogger.WriteDebug("ReceiveWCSTask", $"WCSæªæ¥è¯¢å°ç®æ ç«ç¹å¯¹åºçåºä½ï¼ç®æ ç«ç¹ï¼{taskDTO.dest_station.ToString()}"); return content = WebResponseContent.Instance.Error($"WCSæªæ¥è¯¢å°ç®æ ç«ç¹å¯¹åºçåºä½ï¼ç®æ ç«ç¹ï¼{taskDTO.dest_station.ToString()}"); } break; default: break; } task.TaskNum = taskDTO.task_id; task.PalletCode = taskDTO.CarId; if (string.IsNullOrEmpty(task.SourceAddress))//妿䏿¯ç«ç¹ï¼ç´æ¥åè¡åå± { task.SourceAddress = $"SC01-{taskDTO.src_rack.ToString().PadLeft(3, '0')}-{taskDTO.src_col.ToString().PadLeft(3, '0')}-{taskDTO.src_row.ToString().PadLeft(3, '0')}"; } if (string.IsNullOrEmpty(task.TargetAddress))//妿䏿¯ç«ç¹ï¼ç´æ¥åè¡åå± { task.TargetAddress = $"SC01-{taskDTO.dest_rack.ToString().PadLeft(3, '0')}-{taskDTO.dest_col.ToString().PadLeft(3, '0')}-{taskDTO.dest_row.ToString().PadLeft(3, '0')}"; } task.Creater = "WCS"; task.WMSId = 3;//WCSäººå·¥å»ºä»»å¡ //å¤æè´§ä½ç¶æ Dt_LocationInfo srcLocation = _locationInfoRepository.QueryFirst(x => x.LocationCode == task.SourceAddress); Dt_LocationInfo tarLocation = _locationInfoRepository.QueryFirst(x => x.LocationCode == task.TargetAddress); if (srcLocation != null && tarLocation != null) { if (srcLocation.EnableStatus == (int)EnableStatusEnum.Disable) { ServiceLogger.WriteDebug("ReceiveWCSTask", $"æºå°åå·²ç¦ç¨ï¼{srcLocation.LocationCode}"); return content = WebResponseContent.Instance.Error($"æºå°åå·²ç¦ç¨ï¼{srcLocation.LocationCode}"); } if (tarLocation.EnableStatus == (int)EnableStatusEnum.Disable) { ServiceLogger.WriteDebug("ReceiveWCSTask", $"ç®æ å°åå·²ç¦ç¨ï¼{tarLocation.LocationCode}"); return content = WebResponseContent.Instance.Error($"ç®æ å°åå·²ç¦ç¨ï¼{tarLocation.LocationCode}"); } if (taskDTO.cmd != 101)//å ¥åºæ¶ä¸éè¦å¤ææ¯å¦éå®ï¼éå®ç¶ææ¯å¨çæä»»å¡æ¶éå® { if (taskinfo != null && taskDTO.cmd == 3001 && taskinfo.WMSId == 3)//å¦ææ¯æå¨å ¥åºï¼å3001ï¼ä¼çæä»»å¡ï¼éè¦å¤æåºä½æ¯å¦éå®;èªå¨æ¨¡å¼å1001çæ¶åå°±çæäºä»»å¡ï¼åå3001å°±ä¸éè¦å¤ææ¯å¦éå®äº { if (srcLocation.LocationStatus == (int)LocationStatusEnum.Lock) { ServiceLogger.WriteDebug("ReceiveWCSTask", $"æºå°åå·²éå®ï¼{srcLocation.LocationCode}"); return content = WebResponseContent.Instance.Error($"æºå°åå·²éå®ï¼{srcLocation.LocationCode}"); } if (tarLocation.LocationStatus == (int)LocationStatusEnum.Lock) { ServiceLogger.WriteDebug("ReceiveWCSTask", $"ç®æ å°åå·²éå®ï¼{tarLocation.LocationCode}"); return content = WebResponseContent.Instance.Error($"ç®æ å°åå·²éå®ï¼{tarLocation.LocationCode}"); } } } if (task.TaskType == (int)TaskInboundTypeEnum.Inbound)//å ¥åº è·¯å¾ï¼æåæºåºä½-->åºä½ { //WCSæ¥è¯¢åºä½ç¶ææ¯å¦ä¸ºâ空é²â并䏿ªç¦ç¨ï¼éå®åºä½ä¿®æ¹åºä½ç¶æä¸ºâéå®âï¼çæWCS产åå ¥åºä»»å¡ï¼å å ¥WCSä»»å¡éåä¸ã if (tarLocation.LocationStatus != (int)LocationStatusEnum.Free) { ServiceLogger.WriteDebug("ReceiveWCSTask", $"å ¥åº-ç®æ å°å䏿¯ç©ºé²ç¶æï¼{tarLocation.LocationCode}"); return content = WebResponseContent.Instance.Error($"å ¥åº-ç®æ å°å䏿¯ç©ºé²ç¶æï¼{tarLocation.LocationCode}"); } tarLocation.LocationStatus = (int)LocationStatusEnum.Lock; } else if (task.TaskType == (int)TaskRelocationTypeEnum.Relocation) //产åç§»åºï¼ç§»åºï¼åºåºå ±ç¨ï¼ è·¯å¾ï¼åºä½-->åºä½/æååºä½ { //WCSæ¥è¯¢åºä½ç¶ææ¯å¦ä¸ºâæè´§âï¼åºä½/æååºä½æ¯å¦â空é²â if (srcLocation.LocationStatus != (int)LocationStatusEnum.InStock) { ServiceLogger.WriteDebug("ReceiveWCSTask", $"ç§»åº-æºå°å䏿¯æè´§ç¶æï¼{srcLocation.LocationCode}"); return content = WebResponseContent.Instance.Error($"ç§»åº-æºå°å䏿¯æè´§ç¶æï¼{srcLocation.LocationCode}"); } if (tarLocation.LocationStatus != (int)LocationStatusEnum.Free) { ServiceLogger.WriteDebug("ReceiveWCSTask", $"ç§»åº-ç®æ å°å䏿¯ç©ºé²ç¶æï¼{srcLocation.LocationCode}"); return content = WebResponseContent.Instance.Error($"ç§»åº-ç®æ å°å䏿¯ç©ºé²ç¶æï¼{srcLocation.LocationCode}"); } srcLocation.LocationStatus = (int)LocationStatusEnum.Lock; tarLocation.LocationStatus = (int)LocationStatusEnum.Lock; } else if (task.TaskType == (int)TaskOutboundTypeEnum.OutInventory) //å¼å¸¸åºåºï¼éåºï¼ è·¯å¾ï¼åºä½-->æåæºåºä½ { //WCSæ¥è¯¢åºä½ç¶ææ¯å¦ä¸ºâæè´§â if (srcLocation.LocationStatus != (int)LocationStatusEnum.InStock) { ServiceLogger.WriteDebug("ReceiveWCSTask", $"å¼å¸¸åºåº-æºå°å䏿¯æè´§ç¶æï¼{srcLocation.LocationCode}"); return content = WebResponseContent.Instance.Error($"å¼å¸¸åºåº-æºå°å䏿¯æè´§ç¶æï¼{srcLocation.LocationCode}"); } srcLocation.LocationStatus = (int)LocationStatusEnum.Lock; } } else { ServiceLogger.WriteDebug("ReceiveWCSTask", $"åºä½å°åä¸åå¨ï¼ä»»å¡å·:{task.TaskNum}"); return content = WebResponseContent.Instance.Error($"åºä½å°åä¸åå¨ï¼ä»»å¡å·:{task.TaskNum}"); } try { //å¼å¯äºç© _unitOfWorkManage.BeginTran(); _locationInfoRepository.UpdateData(tarLocation); _locationInfoRepository.UpdateData(srcLocation); BaseDal.AddData(task); Dt_Task tasktemp = BaseDal.QueryFirst(x => x.TaskNum == task.TaskNum); _taskExecuteDetailService.AddTaskExecuteDetail(tasktemp.TaskId, "æ¥æ¶WCSä»»å¡"); //æäº¤äºå¡ _unitOfWorkManage.CommitTran(); } catch (Exception) { _unitOfWorkManage.RollbackTran(); throw; } ServiceLogger.WriteDebug("ReceiveWCSTask", $"æ¥æ¶ä»»å¡æåï¼ä»»å¡å·:{task.TaskNum}"); content = WebResponseContent.Instance.OK($"æ¥æ¶ä»»å¡æåï¼ä»»å¡å·:{task.TaskNum}", task); } catch (Exception ex) { ServiceLogger.WriteDebug("ReceiveWCSTask", $"任塿¥æ¶é误,é误信æ¯:{ex.StackTrace}"); content = WebResponseContent.Instance.Error($"任塿¥æ¶é误,é误信æ¯:{ex.Message}"); } return content; } /// <summary> /// è·åä»»å¡å· /// </summary> /// <returns></returns> public int GetTaskNo() { DataTable dt = BaseDal.QueryTable("SELECT FORMAT(NEXT VALUE FOR dbo.seqTaskNum, '0000000');"); return int.Parse("9"+ dt.Rows[0][0].ToString()); } /// <summary> /// æ ¹æ®æçå·ãèµ·å§å°ååWMS请æ±ä»»å¡ /// </summary> @@ -614,8 +862,19 @@ /// <param name="deviceNo"></param> /// <returns></returns> public Dt_Task QueryStackerCraneTaskByAGVRequest(string deviceNo) { { return BaseDal.QueryFirst(x => x.Roadway == deviceNo && (TaskInboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskInStatusEnum.InNew), TaskOrderBy); } /// <summary> /// æ¥è¯¢AGVè¿å ¥ä¸çå ¥åºä»»å¡ /// </summary> /// <param name="deviceNo"></param> /// <returns></returns> public Dt_Task QueryStackerCraneTaskByAGVIning(string deviceNo) { return BaseDal.QueryFirst(x => x.Roadway == deviceNo && (TaskInboundTypes.Contains(x.TaskType)&&x.CurrentAddress=="1"), TaskOrderBy); } /// <summary> /// 对åºWMSè¯·æ± 3001-AGVæ¾è´§å®æ @@ -702,6 +961,56 @@ content = WebResponseContent.Instance.Error(ex.Message); } return content; } /// <summary> /// èªå¨å ¥åºæ¶æ´æ°æ¯å¦è¿å ¥åéæºæ å¿ï¼0ï¼æªè¿å ¥ 1ï¼å·²è¿å ¥ï¼ /// </summary> /// <param name="taskNum"></param> /// <param name="Inflag"></param> /// <returns></returns> public WebResponseContent UpdateTaskAllowIn(int taskNum, int Inflag) { WebResponseContent content = new WebResponseContent(); try { Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum); if (task == null) return WebResponseContent.Instance.Error($"æªæ¾å°è¯¥ä»»å¡ä¿¡æ¯,ä»»å¡å·:ã{taskNum}ã"); task.CurrentAddress = Inflag.ToString(); task.ModifyDate = DateTime.Now; BaseDal.UpdateData(task); } catch (Exception ex) { content = WebResponseContent.Instance.Error(ex.Message); } return content; } /// <summary> /// æ¯å¦å·²åä¼ MES2001æ å¿ï¼0ï¼æªåä¼ 1ï¼å·²åä¼ ï¼ /// </summary> /// <param name="taskNum"></param> /// <param name="Inflag"></param> /// <returns></returns> public WebResponseContent UpdateTaskIsBack(int taskNum, int Inflag) { WebResponseContent content = new WebResponseContent(); try { Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum); if (task == null) return WebResponseContent.Instance.Error($"æªæ¾å°è¯¥ä»»å¡ä¿¡æ¯,ä»»å¡å·:ã{taskNum}ã"); task.Remark = Inflag.ToString(); task.ModifyDate = DateTime.Now; BaseDal.UpdateData(task); } catch (Exception ex) { content = WebResponseContent.Instance.Error(ex.Message); } return content; } /// <summary> @@ -1141,12 +1450,15 @@ } else { MESSendCMD sendcmd = new MESSendCMD { cmd = 201, task_id = task.TaskNum, status = 6 }; MESResponse res = ApiInvoke.SendTaskCMD(sendcmd); if (res != null && res.code != 0) if (task.WMSId != 3) { ServiceLogger.WriteDebug("StackCraneTaskCompleted", $"大å åæºå®æå¼å¸¸åºåºä»»å¡ååä¼ MES失败ï¼,ä»»å¡å·:ã{taskNum}ã,失败信æ¯:ã{res.message}ã"); content = WebResponseContent.Instance.Error($"大å åæºå®æå¼å¸¸åºåºä»»å¡ååä¼ MES失败ï¼,ä»»å¡å·:ã{taskNum}ã,失败信æ¯:ã{res.message}ã"); MESSendCMD sendcmd = new MESSendCMD { cmd = 201, task_id = task.TaskNum, status = 6 }; MESResponse res = ApiInvoke.SendTaskCMD(sendcmd); if (res != null && res.code != 0) { ServiceLogger.WriteDebug("StackCraneTaskCompleted", $"大å åæºå®æå¼å¸¸åºåºä»»å¡ååä¼ MES失败ï¼,ä»»å¡å·:ã{taskNum}ã,失败信æ¯:ã{res.message}ã"); content = WebResponseContent.Instance.Error($"大å åæºå®æå¼å¸¸åºåºä»»å¡ååä¼ MES失败ï¼,ä»»å¡å·:ã{taskNum}ã,失败信æ¯:ã{res.message}ã"); } } } @@ -1154,7 +1466,7 @@ catch (Exception ex) { _unitOfWorkManage.RollbackTran(); //任塿§è¡å¤±è´¥ï¼è´§ä½ç¶æè¿å ServiceLogger.WriteDebug("StackCraneTaskCompleted", $"大å åæºæ§è¡åºåºä»»å¡å¤±è´¥ï¼,ä»»å¡å·:ã{taskNum}ã,失败信æ¯:ã{ex.Message}ã"); content = WebResponseContent.Instance.Error($"大å åæºæ§è¡åºåºä»»å¡å¤±è´¥ï¼,ä»»å¡å·:ã{taskNum}ã,失败信æ¯:ã{ex.Message}ã"); } @@ -1187,16 +1499,19 @@ MESSendCMD sendcmd = new MESSendCMD { cmd = 201, task_id = int.Parse(task.NextAddress), status = 6 }; string inparam = JsonConvert.SerializeObject(sendcmd); ServiceLogger.WriteDebug("StackCraneTaskCompleted", $"大å åæºå®æå ¥åºä»»å¡ååä¼ MESå ¥å:{inparam}"); MESResponse res = ApiInvoke.SendTaskCMD(sendcmd); if (res != null && res.code != 0) if (task.WMSId != 3) { ServiceLogger.WriteDebug("StackCraneTaskCompleted", $"大å åæºå®æå ¥åºä»»å¡ååä¼ MES失败ï¼,ä»»å¡å·:ã{taskNum}ã,失败信æ¯:ã{res.message}ã"); content = WebResponseContent.Instance.Error($"大å åæºå®æå ¥åºä»»å¡ååä¼ MES失败ï¼,ä»»å¡å·:ã{taskNum}ã,失败信æ¯:ã{res.message}ã"); } else { ServiceLogger.WriteDebug("StackCraneTaskCompleted", $"大å åæºå®æå ¥åºä»»å¡ååä¼ MESæåï¼,ä»»å¡å·:ã{taskNum}ã"); MESResponse res = ApiInvoke.SendTaskCMD(sendcmd); if (res != null && res.code != 0) { ServiceLogger.WriteDebug("StackCraneTaskCompleted", $"大å åæºå®æå ¥åºä»»å¡ååä¼ MES失败ï¼,ä»»å¡å·:ã{taskNum}ã,失败信æ¯:ã{res.message}ã"); content = WebResponseContent.Instance.Error($"大å åæºå®æå ¥åºä»»å¡ååä¼ MES失败ï¼,ä»»å¡å·:ã{taskNum}ã,失败信æ¯:ã{res.message}ã"); } else { ServiceLogger.WriteDebug("StackCraneTaskCompleted", $"大å åæºå®æå ¥åºä»»å¡ååä¼ MESæåï¼,ä»»å¡å·:ã{taskNum}ã"); } } } @@ -1230,14 +1545,17 @@ _unitOfWorkManage.CommitTran(); //ç§»åºå®æï¼åä¼ MES //åä¼ å°WMS MESSendCMD sendcmd = new MESSendCMD { cmd = 201, task_id = task.TaskNum, status = 6 }; string inparam = JsonConvert.SerializeObject(sendcmd); ServiceLogger.WriteDebug("StackCraneTaskCompleted", $"大å åæºå®æåºåºä»»å¡ååä¼ MESå ¥å:{inparam}"); MESResponse res = ApiInvoke.SendTaskCMD(sendcmd); if (res != null && res.code != 0) if (task.WMSId != 3) { ServiceLogger.WriteDebug("StackCraneTaskCompleted", $"大å åæºå®æåºåºä»»å¡ååä¼ MES失败ï¼,ä»»å¡å·:ã{taskNum}ã,失败信æ¯:ã{res.message}ã"); content = WebResponseContent.Instance.Error($"大å åæºå®æåºåºä»»å¡ååä¼ MES失败ï¼,ä»»å¡å·:ã{taskNum}ã,失败信æ¯:ã{res.message}ã"); MESSendCMD sendcmd = new MESSendCMD { cmd = 201, task_id = task.TaskNum, status = 6 }; string inparam = JsonConvert.SerializeObject(sendcmd); ServiceLogger.WriteDebug("StackCraneTaskCompleted", $"大å åæºå®æåºåºä»»å¡ååä¼ MESå ¥å:{inparam}"); MESResponse res = ApiInvoke.SendTaskCMD(sendcmd); if (res != null && res.code != 0) { ServiceLogger.WriteDebug("StackCraneTaskCompleted", $"大å åæºå®æåºåºä»»å¡ååä¼ MES失败ï¼,ä»»å¡å·:ã{taskNum}ã,失败信æ¯:ã{res.message}ã"); content = WebResponseContent.Instance.Error($"大å åæºå®æåºåºä»»å¡ååä¼ MES失败ï¼,ä»»å¡å·:ã{taskNum}ã,失败信æ¯:ã{res.message}ã"); } } //if(task.TaskType== (int)TaskRelocationTypeEnum.Relocation&&!string.IsNullOrEmpty(task.Remark.Trim()))//åºåºä»»å¡åæ»å±æ°æ è¯ //{ ´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/CommonStackerCraneJob.cs
@@ -54,11 +54,12 @@ public Task Execute(IJobExecutionContext context) { WriteDebug("线ç¨ç»è®¡æ¥å¿", "çº¿ç¨æ°" + ThreadPool.ThreadCount); //WriteDebug("线ç¨ç»è®¡æ¥å¿", "çº¿ç¨æ°" + ThreadPool.ThreadCount); //CommonStackerCrane commonStackerCrane = (CommonStackerCrane)context.JobDetail.JobDataMap.Get("JobParams"); CommonStackerCrane commonStackerCrane = Storage.Devices.FirstOrDefault(x => x.DeviceCode == "SC01") as CommonStackerCrane; try { { if (commonStackerCrane != null) { //WriteDebug("大å åæºè¿è¡æ¥å¿", $"大å åæºä»»å¡æ§è¡ä¸..."); @@ -75,8 +76,7 @@ { Dt_Task? task = GetTask(commonStackerCrane); if (task != null) { { WriteDebug(nameof(CommonStackerCraneJob), $"大å åæºä»»å¡å·{task.TaskNum}"); StackerCraneTaskCommand? stackerCraneTaskCommand = ConvertToStackerCraneTaskCommand(task); if (stackerCraneTaskCommand != null) @@ -136,7 +136,7 @@ //读å大å åæºä»»å¡å·åä»»å¡å®æç¡®è®¤ç¶æï¼å 为å°è£ çäºä»¶ç»å¸¸ä¸è§¦åï¼æä»¥å ä¸ªç´æ¥è¯»çé»è¾ï¼ä»¥å åºç°å åæºä¸ç´æ¥å¤äºçå¾ wcsç¡®è®¤ï¼ byte IsOver = commonStackerCrane.Communicator.Read<byte>("DB106.22"); int tasknum = commonStackerCrane.Communicator.Read<int>("DB106.18"); WriteDebug(nameof(CommonStackerCraneJob), $"大å åæºSC01ä»»å¡å·å åæºä»»å¡å·ï¼{tasknum}ç¶æï¼{IsOver}"); //WriteDebug(nameof(CommonStackerCraneJob), $"大å åæºSC01ä»»å¡å·å åæºä»»å¡å·ï¼{tasknum}ç¶æï¼{IsOver}"); if (IsOver == 6) { if (commonStackerCrane.GetValue<StackerCraneDBName, short>(StackerCraneDBName.WorkType) != 5) @@ -191,10 +191,24 @@ { IsAllow = commonStackerCrane.Communicator.Read<short>("DB2.8.0"); } if (IsAllow == 1)//å¦æä¸º1ï¼åå 计AGVè¿å ¥ï¼åä¼ WMS //æ¥è¯¢ä»»å¡æ 记为1çä»»å¡ä¸ºç©ºæå 计åä¼ WriteDebug(nameof(CommonStackerCraneJob), $"ä»»å¡å·:{task1001.TaskNum}-æ¯å¦å 计:{IsAllow}"); Dt_Task? taskAgvIning = _taskService.QueryStackerCraneTaskByAGVIning("SC01"); if (IsAllow == 1&&taskAgvIning==null)//å¦æä¸º1ï¼åå 计AGVè¿å ¥ï¼åä¼ WMS { _taskService.UpdateTaskAllowIn(task1001.TaskNum, 1); WriteDebug(nameof(CommonStackerCraneJob), $"æ´æ°æ¯å¦è¿å ¥åéæºæ å¿å¼1ï¼ä»»å¡å·{task1001.TaskNum}"); IsAllow = 0;//æ´æ°æåï¼ç½®0ä¸å 许 MESSendCMD sendcmd = new MESSendCMD { cmd = 2001, task_id = task1001.TaskNum, status = 6 }; MESResponse res = ApiInvoke.SendTaskCMD(sendcmd); //if (res != null && res.code == 0)//åä¼ 2001æå //{ //WCS读å°å 许信å·å任塿 è®°1,表示AGVå·²è¿å ¥æåæº,Dt_Task ä¸çCurrentAddresså为æ è®°åæ®µ //_taskService.UpdateTaskAllowIn(task1001.TaskNum, 1); //WriteDebug(nameof(CommonStackerCraneJob), $"æ´æ°æ¯å¦è¿å ¥åéæºæ å¿å¼1ï¼ä»»å¡å·{task1001.TaskNum}"); //} } } Dt_Task? task3001 = _taskService.QueryStackerCraneTaskByAGVPutFinish("SC01"); @@ -206,26 +220,23 @@ if (task3001.SourceAddress == "SC01-002-000-001")//WMS 1001ç«ç¹ { //æåæºæ¯å¦å¤äºå°±ç»ªç¶æ int IsReady = commonStackerCrane.Communicator.Read<short>("DB2.0.0"); WriteDebug(nameof(CommonStackerCraneJob), $"æåæºç¶æï¼{IsReady}ä»»å¡å·ï¼{task3001.TaskNum}"); WriteDebug(nameof(CommonStackerCraneJob), $"æåæºæ¯å¦å°±ç»ªç¶æï¼{IsReady}ä»»å¡å·ï¼{task3001.TaskNum}"); //åå ¥æåä¿¡æ¯ IsWriteOne = commonStackerCrane.Communicator.Read<short>("DB1.0.0"); if (IsWriteOne == 0 && IsReady == 1) { commonStackerCrane.Communicator.Write<short>("DB1.0.0", 1); } } //读åæåæºä¿¡å·ï¼ç¡®å®æ¯å¦æå宿 IsFinish = commonStackerCrane.Communicator.Read<short>("DB2.2.0"); } else if (task3001.SourceAddress == "SC01-002-000-002")//WMS 1002ç«ç¹ { //æåæºæ¯å¦å¤äºå°±ç»ªç¶æ int IsReady = commonStackerCrane.Communicator.Read<short>("DB2.0.0"); WriteDebug(nameof(CommonStackerCraneJob), $"æåæºç¶æï¼{IsReady}ä»»å¡å·ï¼{task3001.TaskNum}"); WriteDebug(nameof(CommonStackerCraneJob), $"æåæºæ¯å¦å°±ç»ªç¶æï¼{IsReady}ä»»å¡å·ï¼{task3001.TaskNum}"); //åå ¥æåä¿¡æ¯ IsWriteTwo = commonStackerCrane.Communicator.Read<short>("DB1.6.0"); if (IsWriteTwo == 0 && IsReady == 1) @@ -235,17 +246,37 @@ //读åæåæºä¿¡å·ï¼ç¡®å®æ¯å¦æå宿 IsFinish = commonStackerCrane.Communicator.Read<short>("DB2.10.0"); } if (IsFinish == 1)//å¦æä¸º1ï¼å表示æå宿ï¼åä¼ WMS { MESSendCMD sendcmd = new MESSendCMD { cmd = 2002, task_id = task3001.TaskNum, status = 6 }; MESResponse res = ApiInvoke.SendTaskCMD(sendcmd); string inparam = JsonConvert.SerializeObject(sendcmd); WriteDebug(nameof(CommonStackerCraneJob), $"æåæºæå宿ï¼åä¼ WMS,å ¥åï¼{inparam}"); if (res != null && res.code != 0) if (task3001.WMSId == 3)// WCSäººå·¥å ¥åº { WriteDebug(nameof(CommonStackerCraneJob), $"æåæºæå宿ï¼åä¼ WMS失败ï¼ä»»å¡å·{task3001.TaskNum}"); MESTaskDTO taskDTO = new MESTaskDTO(); taskDTO.weight = task3001.TaskNum;//æ§ä»»å¡å· taskDTO.cmd = 101; _taskService.ReceiveWCSTask(taskDTO); } else { MESSendCMD sendcmd = new MESSendCMD { cmd = 2002, task_id = task3001.TaskNum, status = 6 }; MESResponse res = ApiInvoke.SendTaskCMD(sendcmd); string inparam = JsonConvert.SerializeObject(sendcmd); WriteDebug(nameof(CommonStackerCraneJob), $"æåæºæå宿ï¼åä¼ WMS,å ¥åï¼{inparam}"); if (res != null && res.code == 0) { _taskService.UpdateTaskAllowIn(task3001.TaskNum, 0); WriteDebug(nameof(CommonStackerCraneJob), $"æ´æ°æ¯å¦è¿å ¥åéæºæ å¿å¼0ï¼ä»»å¡å·{task3001.TaskNum}"); } else { WriteDebug(nameof(CommonStackerCraneJob), $"æåæºæå宿ï¼åä¼ WMS失败ï¼ä»»å¡å·{task3001.TaskNum}"); } } } ´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/DoubleStackerCraneJob.cs
@@ -66,7 +66,7 @@ CommonStackerCrane? StackerCrane = GetStrackerCrane(task, stackerCraneOne, stackerCraneTwo); if (StackerCrane != null) { WriteDebug(nameof(DoubleStackerCraneJob), $"å°å åæºä»»å¡å·{task.TaskNum}"); WriteDebug(nameof(DoubleStackerCraneJob), $"å°å åæºä»»å¡å·{task.TaskNum}--{StackerCrane.DeviceCode}"); StackerCraneTaskCommand? stackerCraneTaskCommand = ConvertToStackerCraneTaskCommand(task); if (stackerCraneTaskCommand != null) {