using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using HH.WCS.Mobox3.DSZSH.device; using HH.WCS.Mobox3.DSZSH.models; using HH.WCS.Mobox3.DSZSH.process; using HH.WCS.Mobox3.DSZSH.util; using HH.WCS.Mobox3.DSZSH.wms; using Newtonsoft.Json; using static HH.WCS.Mobox3.DSZSH.api.ApiModel; namespace HH.WCS.Mobox3.DSZSH.core { public class WCSCore { public static ReturnResult OperateAgvTaskStatus(AgvTaskState model) { var result = new ReturnResult(); try { switch (model.state) { case 1023: break; case 1025: break; case 1012: break; case 1004: break; case 1103: break; default: // AGV 执行任务的逻辑处理 if (!AgvTaskProcessOk(model)) { // 执行不OK,说明没有找到任务 result.ResultCode = 1; result.ResultMsg = $"根据Model.No未找到对应的任务,{model.task_no}"; LogHelper.Info(result.ResultMsg, "API"); return result; } break; } result.ResultCode = 0; result.ResultMsg = "success"; LogHelper.Info(result.ResultMsg, "API"); return result; } catch (Exception ex) { result.ResultCode = -1; result.ResultMsg = $"发生了异常:+{ex.Message}"; LogHelper.Info(result.ResultMsg, "Error"); return result; } } /// /// 执行 AGV 任务,查询不到任务返回 /// /// /// private static bool AgvTaskProcessOk(AgvTaskState model) { var TN_Task = WCSHelper.GetTask(model.task_no); // 根据当前model编号查询任务 if (TN_Task == null) { return false; } if (model.state > 7) { //安全请求等 TaskProcess.OperateReq(model.task_no, model.state, model.forklift_no, model.ext_data); return true; } // AGV 任务 134562(7) 状态处理 switch (model.state) { case 1: // 执行 WCSHelper.Begin(TN_Task, model.forklift_no); // 已推送的任务的状态改成执行 break; case 3: // 开始取货 WCSHelper.UpdateStatus(TN_Task, "开始取货"); // 任务状态改成开始取货 break; case 4: // 取货完成 WCSHelper.UpdateStatus(TN_Task, "取货完成"); // 任务状态改成取货完成 TaskProcess.OperateStatus(TN_Task, 4); // 起点容器货位解绑,解锁起点 if (TN_Task.S_TYPE == TaskName.成品胶出库) { var nextOutboundTask = Task.Run(() => { UpdateOutboundTaskState(3); }); } break; case 5: // 开始卸货 WCSHelper.UpdateStatus(TN_Task, "开始卸货"); // 任务状态改成开始卸货 break; case 6: // 卸货完成 WCSHelper.UpdateStatus(TN_Task, "卸货完成"); // 任务状态改成卸货完成 TaskProcess.OperateStatus(TN_Task, 6); // 终点容器货位绑定,解锁终点 break; case 2: // 完成 WCSHelper.End(TN_Task); // 任务状态改成结束 if (TN_Task.S_TYPE == TaskName.抽检_出库) { var checkCompleteTask = Task.Run(() => { UpdateCheckTaskState(3); }); } break; case 7: // 异常 TaskProcess.OperateStatus(TN_Task, 7); // 异常处理 WCSHelper.Fail(TN_Task); // 任务状态改成错误 break; } // 将AGV执行状态,加入TN_Task_Action表中 WCSHelper.AddActionRecord(model.task_no, model.state, model.forklift_no, model.ext_data); //调用第三方接口(如果有)TaskProcess.ReportStatus,添加任务动作关系表 return true; } public static ReturnResult SafetyInteraction(SafetyInteractionInfo model) { var gzResult = new ReturnResult(); var db = new SqlHelper().GetInstance(); ModbusHelper.Relink(); try { var prodLineInfo = Settings.ProductionLines[0]; var prodLineDevice = new ProductionLineDevice(prodLineInfo.PlcIp, prodLineInfo.PlcPort); if (!prodLineDevice.LoadDeviceStateOk()) { LogHelper.Info("加载设备信息失败"); } var tn_task = db.Queryable().First(a => a.S_CODE == model.task_no); if (tn_task == null) { LogHelper.Info($"任务号 '{model.task_no}' 不存在"); } // 待修改:补充不同分支AGV判断 if (prodLineDevice.SystemState == 1) { if (prodLineDevice.FullOffline == 1 && tn_task.S_TYPE == TaskName.托盘_满托下线入库) { prodLineDevice.AgvPicking = 1; } if (prodLineDevice.AllowAgvPlacePallet == 1 && tn_task.S_TYPE == TaskName.托盘_空托上线) { prodLineDevice.AgvPlacingPallet = 1; } } LogHelper.Info(JsonConvert.SerializeObject(prodLineDevice, Formatting.Indented)); return gzResult; } catch (Exception ex) { LogHelper.Info($"发生了异常:{ex.Message}"); return gzResult; } } public static void UpdateOutboundTaskState(int spotStateCode) { var db = new SqlHelper().GetInstance(); var detail = db.Queryable() .First(d => d.N_B_STATE == 2); if (detail == null) { LogHelper.Info("出库--AGV取货--查询Detail:当前没有 执行中 的Detail表!"); return; } using (var tran = db.Ado.UseTran()) { detail.N_B_STATE = spotStateCode; if (db.Updateable(detail).UpdateColumns(it => it.N_B_STATE).ExecuteCommand() <= 0) { tran.RollbackTran(); LogHelper.Info("出库--AGV取货:修改Detail状态 N_B_STATE 为 3任务执行完成 失败!"); return; } var finishedCount = db.Queryable().Count(d => d.S_OO_NO == detail.S_OO_NO && d.N_B_STATE == 3); var allCount = db.Queryable().Count(d => d.S_OO_NO == detail.S_OO_NO); LogHelper.Info($"出库--AGV取货--统计任务已完成:{finishedCount} / {allCount}"); if (finishedCount == allCount) { // 当前出库单下的所有明细单,任务都已经完成 if (db.Updateable().SetColumns(it => it.N_B_STATE == 3) .Where(it => it.S_NO == detail.S_OO_NO) .ExecuteCommand() <= 0) { tran.RollbackTran(); LogHelper.Info("出库--AGV取货--所有任务完成时:修改Order状态 N_B_STATE 为 3任务执行完成 失败!"); return; } } tran.CommitTran(); } } public static void UpdateCheckTaskState(int spotStateCode) { var db = new SqlHelper().GetInstance(); var detail = db.Queryable() .First(d => d.N_B_STATE == 2); if (detail == null) { LogHelper.Info("抽检--AGV任务完成--查询Detail:当前没有 执行中 的Detail表!"); return; } using (var tran = db.Ado.UseTran()) { detail.N_B_STATE = spotStateCode; if (db.Updateable(detail).UpdateColumns(it => it.N_B_STATE).ExecuteCommand() <= 0) { tran.RollbackTran(); LogHelper.Info("抽检--AGV任务完成:修改Detail状态 N_B_STATE 为 3任务执行完成 失败!"); return; } var finishedCount = db.Queryable().Count(d => d.S_NO == detail.S_NO && d.N_B_STATE == 3); var allCount = db.Queryable().Count(d => d.S_NO == detail.S_NO); LogHelper.Info($"抽检--AGV任务完成:统计任务已完成:{finishedCount} / {allCount}"); if (finishedCount == allCount) { // 当前order下的detail,任务都已经完成 if (db.Updateable().SetColumns(it => it.N_B_STATE == 3) .Where(it => it.S_NO == detail.S_NO) .ExecuteCommand() <= 0) { tran.RollbackTran(); LogHelper.Info("抽检--AGV任务完成--所有任务完成时:修改Order状态 N_B_STATE 为 3任务执行完成 失败!"); return; } } tran.CommitTran(); } } public static void UpdateShiftTaskState(int spotStateCode) { var db = new SqlHelper().GetInstance(); var detail = db.Queryable() .First(d => d.N_B_STATE == 2); if (detail == null) { LogHelper.Info("移库--AGV任务完成--查询Detail:当前没有 执行中 的Detail表!"); return; } detail.N_B_STATE = spotStateCode; var finishedCount = db.Queryable().Count(d => d.S_NO == detail.S_NO && d.N_B_STATE == 3); var allCount = db.Queryable().Count(d => d.S_NO == detail.S_NO); LogHelper.Info($"移库--AGV任务完成:统计任务已完成:{finishedCount} / {allCount}"); using (var tran = db.Ado.UseTran()) { if (db.Updateable(detail).UpdateColumns(it => it.N_B_STATE).ExecuteCommand() <= 0) { tran.RollbackTran(); LogHelper.Info("移库--AGV任务完成:修改Detail状态 N_B_STATE 为 3任务执行完成 失败!"); return; } if (finishedCount == allCount) { // 当前order下的detail,任务都已经完成 if (db.Updateable().SetColumns(it => it.N_B_STATE == 3) .Where(it => it.S_NO == detail.S_NO) .ExecuteCommand() <= 0) { tran.RollbackTran(); LogHelper.Info("移库--AGV任务完成--所有任务完成时:修改Order状态 N_B_STATE 为 3任务执行完成 失败!"); return; } } tran.CommitTran(); } } } }