using HH.WCS.QingXigongchang.device; using HH.WCS.QingXigongchang.dispatch; using HH.WCS.QingXigongchang.process; using HH.WCS.QingXigongchang.util; using HH.WCS.QingXigongchang.wms; using System; using System.Collections.Generic; using System.Linq; using System.Xml.Schema; using static HH.WCS.QingXigongchang.api.ApiModel; namespace HH.WCS.QingXigongchang.core { internal class TaskCore { public static ReturnResult OperateTaskStatus(AgvTaskState model) { var r = new ReturnResult(); if (string.IsNullOrEmpty(model.No)) { //无任务号请求(交管) //DeviceProcess.Traffic(model.ForkliftNo, model.LockNo, model.State == 1023); DeviceProcess.Traffic(model.ForkliftNo, model.LockNo, model.State); } else { var wmsTask = TaskHelper.GetTask(model.No); if (wmsTask != null && wmsTask.S_B_STATE.Trim() != "失败" && wmsTask.S_B_STATE.Trim() != "推送异常" && wmsTask.S_B_STATE.Trim() != "完成" && wmsTask.S_B_STATE.Trim() != "强制完成" && wmsTask.S_B_STATE.Trim() != "取消") { if (model.State < 8 || model.State > 1000) { if (model.State < 7 && string.IsNullOrEmpty(model.ForkliftNo)) { LogHelper.Info($"{model.No} 没有车号,忽略"); r.ResultMsg = $"{model.No} 没有车号,忽略"; return r; } if (model.State < 7 && model.State > 1) { var aLER = TaskHelper.CheckActionRecordExist(wmsTask.S_TASK_NO, model.State + ""); if (aLER) { LogHelper.Info($"{wmsTask.S_TASK_NO}-{model.State} 已经报过了,忽略"); return r; } } //有任务号请求 switch (model.State) { case -1: TaskProcess.OperateStatus(wmsTask, 7); TaskHelper.SetTaskState(wmsTask, "推送异常"); break; case 1: TaskHelper.Begin(wmsTask); break; #region MyRegion case 3: TaskHelper.UpdateStatus(wmsTask, "开始取货"); break; case 4: TaskHelper.UpdateStatus(wmsTask, "取货完成"); TaskProcess.OperateStatus(wmsTask, 4); var plcTSJ = Settings.GetDeviceInfoList().Find(x => x.deviceType == 13 && (x.deviceName.Contains("T1") || x.deviceName.Contains("T2")) && x.location.Contains(wmsTask.S_END_LOC)); if (plcTSJ != null) { PlcHelper.SendHex(plcTSJ.address, "3F00" + "31" + "0d0a"); } break; case 5: TaskHelper.UpdateStatus(wmsTask, "开始卸货"); TaskProcess.OperateStatus(wmsTask, 5); break; case 6: TaskHelper.UpdateStatus(wmsTask, "卸货完成"); TaskProcess.OperateStatus(wmsTask, 6); break; #endregion case 2: TaskHelper.End(wmsTask); break; case 7: TaskProcess.OperateStatus(wmsTask, 7); wmsTask.T_END_TIME = DateTime.Now; TaskHelper.UpdateStatus(wmsTask, "取消"); break; case 8://强制完成 - 未使用 r = TaskProcess.OperateStatus(wmsTask, 8); if (r.ResultCode != -1) TaskHelper.BeEnd(wmsTask); break; case 1101://取货申请 - { NDCHelper.ChangeParam(wmsTask.S_TASK_NO, 1101, 18); var plc = Settings.GetDeviceInfoList().Where(a => a.location.Contains(wmsTask.S_START_LOC.Trim()) && a.enable == 1).FirstOrDefault(); if (plc != null && plc.deviceType == 9) { PlcHelper.SendHex(plc.address, "3F00" + "11" + "0d0a"); } } break; case 1103://卸货申请 - 未使用 { NDCHelper.ChangeParam(wmsTask.S_TASK_NO, 1103, 18); var plc = Settings.GetDeviceInfoList().Where(a => a.location.Contains(wmsTask.S_END_LOC.Trim()) && a.enable == 1).FirstOrDefault(); if (plc != null && plc.deviceType == 9) { PlcHelper.SendHex(plc.address, "3F00" + "21" + "0d0a"); } } break; case 1102://取货完成 - 未使用 case 1104://取货完成 - 未使用 { string loc__ = wmsTask.S_START_LOC.Trim(); if (model.State == 1104) loc__ = wmsTask.S_END_LOC.Trim(); var plc = Settings.GetDeviceInfoList().Where(a => a.location.Contains(loc__) && a.enable == 1).FirstOrDefault(); if (plc != null) { if (plc.deviceType == 9) for (int i = 0; i < plc.location.Length; i++) { if (plc.location[i] == loc__) { PlcHelper.SendHex(plc.address, "3F00" + (i + 1) + "0" + "0d0a"); break; } } } } break; } //if (r.ResultCode != -1) { TaskHelper.AddActionRecord(model.No, model.State, model.ForkliftNo, model.ExtData); //调用第三方接口(如果有)TaskProcess.ReportStatus TaskHelper.lOCReSetValue((WMSTask x) => x.S_TASK_NO.Trim() == model.No.Trim(), delegate (WMSTask x) { x.S_EQ_NO = model.ForkliftNo; }); } wmsTask.S_EQ_NO = model.ForkliftNo; if (model.State < 8) { TaskProcess.GeneralInterFaceFunc(wmsTask, model.State.ToString()); } } else { //安全请求等 TaskProcess.OperateReq(model.No, model.State, model.ForkliftNo, model.ExtData); } } else { if (wmsTask == null) { r = new ReturnResult() { ResultCode = -1, ResultMsg = "任务号不存在。" }; } else { r = new ReturnResult() { ResultCode = -1, ResultMsg = $"任务状态:{wmsTask.S_B_STATE},无法操作 " }; } } } return r; } /// /// 任务分发 /// internal static void Dispatch() { //查询任务 //获取所有未执行的任务 var list = TaskHelper.GetTaskListByState("未执行"); if (list.Count > 0) { list.ForEach(task => { if (!TaskProcess.Intercept(task)) { //使用自定义任务推送 TaskProcess.SendTask(task); } }); } } internal static void ChargeHostAgv() { //查询任务 //获取所有未执行的任务 var list = TaskHelper.GetTaskListByState2("已推送"); if (list.Count > 0) { if (!string.IsNullOrEmpty(Settings.AgvSqlServer)) list.ForEach(task => { var _agvtask = TaskHelper.GetAgvTask(task); if (_agvtask != null) { if (!String.IsNullOrEmpty(_agvtask.CN_S_ERR) && _agvtask.CN_S_ERR.Contains("指令多次发送未成功")) { if (DateTime.Now.Subtract(_agvtask.CN_DT_CREATE).TotalMinutes < 10) TaskProcess.OperateStatus(task, 7); TaskHelper.SetTaskState(task, "推送异常"); } } else { LogHelper.Info($"hostAGV 数据库中找不到该任务。"); } }); } } } }