using HH.WCS.DaYang.dispatch; using HH.WCS.DaYang.process; using HH.WCS.DaYang.util; using HH.WCS.DaYang.wms; using System; using System.Collections.Generic; using System.Linq; using static HH.WCS.DaYang.api.ApiModel; namespace HH.WCS.DaYang.core { internal class WCSCore { public static void OperateAgvTaskStatus(AgvTaskState model) { if (string.IsNullOrEmpty(model.No)) { //无任务号请求(交管) DeviceProcess.Traffic(model.ForkliftNo, model.LockNo, model.State == 1023); } else { var TN_Task = WCSHelper.GetTask(model.No); if (TN_Task != null) { if (WCSHelper.CheckActionRecordExist(TN_Task.S_CODE, 2)) { LogHelper.Info($"任务{TN_Task.S_CODE}已经完成,不接受状态处理"); return; } if (model.State <= 7) { //有任务号请求 switch (model.State) { case 1: WCSHelper.Begin(TN_Task); break; #region MyRegion case 3: WCSHelper.UpdateStatus(TN_Task, "开始取货"); break; case 4: WCSHelper.UpdateStatus(TN_Task, "取货完成"); TaskProcess.OperateStatus(TN_Task, 4); //if (TN_Task.S_TYPE == "出库") //{ // WMSHelper.DeletetWHInventory(TN_Task); //} // WMSHelper.DeleteAZLInventory(TN_Task); break; case 5: WCSHelper.UpdateStatus(TN_Task, "开始卸货"); break; case 6: WCSHelper.UpdateStatus(TN_Task, "卸货完成"); TaskProcess.OperateStatus(TN_Task, 6); if (TN_Task.S_TYPE == "物料入库") { //入库完成 修改入库时间 var cntrItme = ContainerHelper.FindCntrItemByCntr(TN_Task.S_CNTR_CODE); if (cntrItme != null) { ContainerHelper.UpdateInTime(cntrItme); } else { LogHelper.Info($"任务{TN_Task.S_CODE},卸货完成,并无托盘物料绑定关系"); } } break; #endregion case 2: WCSHelper.End(TN_Task); //查询当前任务是否存在作业,如果有作业则完成作业 if (!string.IsNullOrEmpty(TN_Task.S_OP_CODE)) { var NowmsTask = WCSHelper.GetWcsTaskByState(TN_Task.S_OP_CODE, new int[] { 1, 2 }); if (NowmsTask == null) { var WmsTask = WMSHelper.GetWmsTask(TN_Task.S_OP_CODE); if (WmsTask == null) { WmsTask.N_B_STATE = 3; WMSHelper.UpdateTaskState(WmsTask); } } } break; case 7: TaskProcess.OperateStatus(TN_Task, 7); WCSHelper.Fail(TN_Task); break; } WCSHelper.AddActionRecord(model.No, model.State, model.ForkliftNo, model.ExtData, "agv"); //调用第三方接口(如果有)TaskProcess.ReportStatus } else { //安全请求等 TaskProcess.OperateReq(model.No, model.State, model.ForkliftNo, model.ExtData); } } } } public static Result NotifyTaskStatus(NotifyTaskStatusModel model) { Result result = new Result() { Code = 1, Msg = "反馈成功" }; try { var TN_Task = WCSHelper.GetTask(model.TaskNo); if (TN_Task != null) { if (WCSHelper.CheckActionRecordExist(TN_Task.S_CODE, 2)) { result.Code = 2; result.Msg = $"任务{TN_Task.S_CODE}已经完成,不接受状态处理"; LogHelper.Info($"NotifyTaskStatus:{result.Msg}"); return result; } if (model.Status <= 7) { //有任务号请求 switch (model.Status) { case 1: WCSHelper.Begin(TN_Task); break; #region MyRegion case 3: WCSHelper.UpdateStatus(TN_Task, "开始取货"); break; case 4: WCSHelper.UpdateStatus(TN_Task, "取货完成"); TaskProcess.OperateStatus(TN_Task, 4); if (TN_Task.S_START_AREA== "YCLLKQ") { WMSHelper.OnShelves(TN_Task,2); } break; case 5: WCSHelper.UpdateStatus(TN_Task, "开始卸货"); break; case 6: WCSHelper.UpdateStatus(TN_Task, "卸货完成"); TaskProcess.OperateStatus(TN_Task, 6); if (TN_Task.S_TYPE== "叠盘机呼叫空托") { var db = new SqlHelper().GetInstance(); var containern = db.Queryable().Where(a => a.S_CODE.Trim() == TN_Task.S_CNTR_CODE).First(); if (containern != null) { containern.S_SOURCE = "1"; db.Updateable(containern).UpdateColumns(a => new { a.S_SOURCE }).ExecuteCommand(); } } if (TN_Task.S_END_AREA == "YCLLKQ") { //上下架记录 WMSHelper.OnShelves(TN_Task, 1); //入库完成 修改入库时间 var cntrItme = ContainerHelper.FindCntrItemByCntr(TN_Task.S_CNTR_CODE); if (cntrItme != null) { ContainerHelper.UpdateInTime(cntrItme); } else { LogHelper.Info($"任务{TN_Task.S_CODE},卸货完成,并无托盘物料绑定关系"); } } break; #endregion case 2: WCSHelper.End(TN_Task); //查询当前任务是否存在作业,如果有作业则完成作业 if (!string.IsNullOrEmpty(TN_Task.S_OP_CODE)) { var NowmsTask = WCSHelper.GetWcsTaskByState(TN_Task.S_OP_CODE, new int[] { 0, 1, 2 }); if (NowmsTask == null) { var WmsTask = WMSHelper.GetWmsTask(TN_Task.S_OP_CODE); if (WmsTask != null) { WmsTask.N_B_STATE = 3; WMSHelper.UpdateTaskState(WmsTask); } } } if (TN_Task.S_TYPE == "指定出库") { var db = new SqlHelper().GetInstance(); LocationHelper.BindingLoc(TN_Task.S_END_LOC, TN_Task.S_CNTR_CODE.Split(',').ToList()); var itemcntr = db.Queryable().Where(a => a.S_CNTR_CODE.Trim() == TN_Task.S_CNTR_CODE).First(); if (itemcntr != null) { db.Deleteable().Where(a => a.S_CNTR_CODE.Trim() == TN_Task.S_CNTR_CODE).ExecuteCommand(); } } break; case 7: TaskProcess.OperateStatus(TN_Task, 7); WCSHelper.Fail(TN_Task); break; } WCSHelper.AddActionRecord(model.TaskNo, model.Status, "", "", "wcs"); } } else { result.Code = -1; result.Msg = $"根据任务号:{model.TaskNo}未获取到任务"; LogHelper.Info($"EquipmentInfo:{result.Msg}"); return result; } return result; } catch (Exception ex) { result.Code = -1; result.Msg = $"Error:ex"; LogHelper.Info($"EquipmentInfo:{result.Msg}"); return result; } } /// /// 任务分发,根据调度类型发给不同的调度系统 /// internal static void Dispatch() { //查询任务 //获取所有等待的任务 var list = WCSHelper.GetTaskListByState("等待"); if (list.Count > 0) { list.ForEach(task => { if (!TaskProcess.Intercept(task)) { //使用自定义任务推送 TaskProcess.SendTask(task); } }); } } /// /// 杭奥堆垛机信号反馈 /// /// internal static void OperateHATaskStatus(HanAo.TaskStateInfoModel model) { var wcsTask = WCSHelper.GetTask(model.requestPk); if (wcsTask != null) { if (model.code == "0") { // if (wcsTask.S_TYPE == "堆垛机入库") { //终点托盘绑定 if (LocationHelper.BindingLoc(wcsTask.S_END_LOC, new List { wcsTask.S_CNTR_CODE })) { //修改托盘状态为可用,增加库存量表,后面分拣出可以计算到 ContainerHelper.Enable(wcsTask.S_CNTR_CODE, wcsTask.S_END_LOC); } } else if (wcsTask.S_TYPE == "堆垛机出库") { //起点托盘解绑 LocationHelper.UnBindingLoc(wcsTask.S_START_LOC, new List { wcsTask.S_CNTR_CODE }); } //标记任务完成 //标记作业完成 wcsTask.N_B_STATE = 3; WCSHelper.UpdateStatus(wcsTask); var wmsTask = WMSHelper.GetWmsTask(wcsTask.S_OP_CODE); if (wmsTask != null) { wmsTask.N_B_STATE = 2; WMSHelper.UpdateTaskState(wmsTask); } } } } } }