using HH.WCS.Hexafluo.dispatch; using HH.WCS.Hexafluo.process; using HH.WCS.Hexafluo.util; using HH.WCS.Hexafluo.wms; using HH.WCS.SJML.util; using HH.WCS.ZCQTJ.Entitys; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using static HH.WCS.SJML.api.ApiModel; namespace HH.WCS.Hexafluo.core { internal class TaskCore { public static void OperateTaskStatus(AgvTaskState model) { var logPara = LogType.LogPara("完工回报"); LogHelper.TaskDetail(logPara, "完工回报参数:" + JsonConvert.SerializeObject(model)); LogHelper.CompInfo("完工回报参数:" + JsonConvert.SerializeObject(model)); if (string.IsNullOrEmpty(model.No)) { //无任务号请求(交管) //DeviceProcess.Traffic(model.ForkliftNo, model.LockNo, model.State==1023); } else { // var task = BLLCreator.CreateSingleton().ExecuteStateHandlePara(model.No, SataeList[model.State]); var wmsTask = TaskHelper.GetTask(model.No); if (wmsTask != null) { if (model.State <= 7) { //有任务号请求 switch (model.State) { case 1: TaskHelper.Begin(wmsTask); break; #region MyRegion case 3: // TaskHelper.UpdateStatus(wmsTask, "开始取货"); break; case 4: TaskHelper.UpdateStatus(wmsTask, "取货完成"); TaskProcess.OperateStatus(wmsTask, 4); break; case 5: // TaskHelper.UpdateStatus(wmsTask, "开始卸货"); break; case 6: TaskHelper.UpdateStatus(wmsTask, "卸货完成"); TaskProcess.OperateStatus(wmsTask, 6); break; #endregion case 2: TaskHelper.End(wmsTask); break; case 7: TaskProcess.OperateStatus(wmsTask, 7); var ta = TmToAGV.DeleAgv(wmsTask.S_SRC_NO); TaskHelper.Fail(wmsTask); break; } TaskHelper.AddActionRecord(model.No, model.State, model.ForkliftNo, model.ExtData, wmsTask); //调用第三方接口(如果有)TaskProcess.ReportStatus } else { //安全请求等 TaskProcess.OperateReq(model.No, model.State, model.ForkliftNo, model.ExtData); } } } } private static object locko9 = new object(); private static object locko10 = new object(); /// /// 任务分发 /// internal static void Dispatch() { //查询任务 //获取所有未执行的任务 lock (locko9) { var Lo = SqlSugarHelper.Db.Queryable().Where(a => a.DeviceName == "AGV")?.First(); if (Lo != null && Lo.IsEnable == "Y") { List state = new List { "未执行", "待推送" }; var list = TaskHelper.GetTaskListByState(state); var RkTask = list.FindAll(e => e.S_TYPE == "入库").ToList(); // var CkTask = list.FindAll(e => e.S_TYPE == "出库").ToList(); if (RkTask.Count > 0) { RkTask = RkTask.OrderByDescending(e => e.N_PRIORITY).ThenBy(e => e.T_CREATE).ToList();//入库 foreach (var item in RkTask) { TaskProcess.SendTask(item); } } var CkTaskList = SqlSugarHelper.Db.Queryable().Where(a => state.Contains(a.S_B_STATE.Trim()) && a.S_NOTE == "agv任务" && a.S_TYPE == "出库" && a.S_START_LAREA != "TMCKJBW").ToList(); if (CkTaskList.Count > 0) { CkTaskList = CkTaskList.OrderByDescending(e => e.N_PRIORITY).ThenBy(e => e.T_CREATE).ToList(); } LogHelper.Info("NDC", $"分组前{JsonConvert.SerializeObject(CkTaskList)}"); if (CkTaskList.Count() > 0) { CkTaskList = CkTaskList.GroupBy(e => e.S_START_LOC).Select(c => c.First()).ToList(); LogHelper.Info("NDC", $"分组后{JsonConvert.SerializeObject(CkTaskList)}"); //CkTask = CkTask.OrderBy(e => e.T_CREATE).ToList();//出库 //var OutTask = CkTask.GroupBy(e => e.S_START_LOC).Select(d => d.First()).ToList(); foreach (var item in CkTaskList) { //LogHelper.Info("NDC", $"出库正在判断是否可以下发的 agv任务号:{item.S_TASK_NO}"); ////查询主任务的起点库区 //var ZhuTask = SqlSugarHelper.Db.Queryable().Where(e => e.S_SRC_NO == item.S_SRC_NO).ToList(); //LogHelper.Info("NDC", $"出库正在判断是否可以下发的 agv任务 所对应的所有相关任务:{JsonConvert.SerializeObject(ZhuTask)}"); //var hh = ZhuTask.FindAll(e => e.S_START_LAREA == "LC11M").ToList(); //if (hh.Any()) //{ // var ggh = ZhuTask.Find(e => e.S_NOTE == "立库任务"); // if (ggh != null && ggh.S_B_STATE == "完成") // { // TaskProcess.SendTask(item); // } // else // { // continue; // } //} //else //{ List States = new List() { "已推送", "执行中", "开始取货" }; var taskList = SqlSugarHelper.Db.Queryable().Where(e => e.S_START_LOC == item.S_START_LOC && States.Contains(e.S_B_STATE.Trim()) && e.S_NOTE == "agv任务").ToList(); LogHelper.Info("NDC", $"出库正在判断是否可以下发的 agv任务 起点库区不是LC11M的agv任务(判断是否有相同起点的别的agv任务):{JsonConvert.SerializeObject(taskList)}"); if (taskList.Count > 0) { continue; } TaskProcess.SendTask(item); // } } } var CkTaskList1 = SqlSugarHelper.Db.Queryable().Where(a => state.Contains(a.S_B_STATE.Trim()) && a.S_NOTE == "agv任务" && a.S_TYPE == "出库" && a.S_START_LAREA == "TMCKJBW").OrderBy(e => e.T_CREATE).ToList(); if (CkTaskList1.Count() > 0) { //CkTask = CkTask.OrderBy(e => e.T_CREATE).ToList();//出库 //var OutTask = CkTask.GroupBy(e => e.S_START_LOC).Select(d => d.First()).ToList(); foreach (var item in CkTaskList1) { LogHelper.Info("NDC", $"出库正在判断是否可以下发的 agv任务号:{item.S_TASK_NO}"); //查询主任务的起点库区 var ZhuTask = SqlSugarHelper.Db.Queryable().Where(e => e.S_SRC_NO == item.S_SRC_NO).ToList(); LogHelper.Info("NDC", $"出库正在判断是否可以下发的 agv任务 所对应的所有相关任务:{JsonConvert.SerializeObject(ZhuTask)}"); var hh = ZhuTask.FindAll(e => e.S_START_LAREA == "LC11M").ToList(); if (hh.Any()) { var ggh = ZhuTask.Find(e => e.S_NOTE == "立库任务"); if (ggh != null && ggh.S_B_STATE == "完成") { TaskProcess.SendTask(item); } else { continue; } } if (!item.S_TASK_NO.Contains("_") && ZhuTask.Count == 1) { TaskProcess.SendTask(item); } } } //var CkTaskListTm = SqlSugarHelper.Db.Queryable().Where(a => state.Contains(a.S_B_STATE.Trim()) && a.S_NOTE == "agv任务" && a.S_TYPE == "出库" && a.S_START_LAREA == "LC11M").OrderBy(e => e.T_CREATE).Take(1).PartitionBy(d => d.S_START_LOC).ToList(); //if (CkTaskListTm.Any()) //{ // foreach (var item in CkTaskList) // { // var taskList = SqlSugarHelper.Db.Queryable().Where(e => e.S_SRC_NO == item.S_SRC_NO // && e.S_B_STATE == "完成" && e.S_NOTE == "立库任务").ToList(); // if (taskList.Count > 0) // { // TaskProcess.SendTask(item); // } // } //} } } } internal static void agvce() { lock (locko10) { List state = new List { "未执行", "待推送" }; var list = TaskHelper.GetTaskListByState(state); if (list.Any()) { list = list.OrderBy(e => e.T_CREATE).ToList(); } foreach (var item in list) { DateTime datt = DateTime.Now; TimeSpan time1 = new TimeSpan(datt.Hour, datt.Minute, datt.Second); LogHelper.Info("INFO", $"服务器时间{JsonConvert.SerializeObject(time1)}"); TimeSpan time2 = new TimeSpan(item.T_CREATE.Hour, item.T_CREATE.Minute, item.T_CREATE.Second); LogHelper.Info("INFO", $"任务时间{JsonConvert.SerializeObject(time2)}"); int totalSeconds1 = time1.Hours * 3600 + time1.Minutes * 60 + time1.Seconds; LogHelper.Info("INFO", $"服务器时间 秒数{totalSeconds1}"); int totalSeconds2 = time2.Hours * 3600 + time2.Minutes * 60 + time2.Seconds; LogHelper.Info("INFO", $"任务时间 秒数{totalSeconds2}"); // 计算绝对差值并处理跨天情况 int difference = Math.Abs(totalSeconds1 - totalSeconds2); LogHelper.Info("INFO", $"两个时间相差的绝对值 秒数{difference}"); if (Math.Abs(difference) <= 20) { TaskProcess.SendTask(list?.FirstOrDefault()); } } } } internal static void Dispatchbc() { //查询任务 //获取所有未执行的任务 List state = new List { "未执行", "待推送" }; var list = TaskHelper.GetTaskListByState(state); if (list.Count > 0) { list = list.OrderBy(e => e.T_CREATE).ToList(); var task = list.FirstOrDefault(); if (!TaskProcess.Intercept(task)) { //使用自定义任务推送 TaskProcess.TMSendTask(task); } } } //public int SataeNameList(string Value) //{ // switch (Value) // { // case "tsOrder Started": return 1; // case "Fetching": // return 3; // case "tsOrder Started": // return 1; // break; // } //} public static Dictionary SataeNameList = new Dictionary() { {"tsOrder Started",1},//开始执行 {"Fetching",3},//开始取货 {"Fetched",4},//取货完成 {"Delivering",5},//开始卸货 {"Delivered",6},//卸货完成 {"tsOrder Finished",2},//完成 {"tsOrder Failed",7},//取消 {"RAW",8}, }; public static Dictionary SataeList = new Dictionary() { {1,"执行中"},//开始执行 {3 ,"开始取货"},//开始取货 {4 ,"取货完成"},//取货完成 {5 ,"开始卸货"},//开始卸货 {6 ,"卸货完成"},//卸货完成 //{1101 ,"开始与起点设备交互"},//开始与起点设备交互 //{1103 ,"开始与终点设备交互"},//开始与起点设备交互 {2 ,"完成"},//完成 {7 ,"取消"},//取消 }; public static List StrList = new List() { "已推送", "执行中", "开始取货", "取货完成", "开始卸货", "卸货完成", "完成" }; public static List IncList = new List() { 0, 1, 3, 4, 5, 6, 2 }; internal static void SeleTaskListTm() { List state = new List { "完成", "取消", "待推送" }; var li = TaskHelper.GetTaskListByStateNot(state); if (li.Count > 0) { li.ForEach(task => { var Tm = TaskProcess.SeTaskTm(task.S_SRC_NO); if (Tm.success == false) { LogHelper.Info(Tm.msg); } else { var a = SataeNameList[Tm.data.tsOrderState]; if (a == 8) { return; } LogHelper.Info(a.ToString()); if (a < 7) { // 1:先将小车当前任务的状态比对成中文状态 var StaName = SataeList[a]; System.Console.WriteLine(StaName); // 2:获取这个状态在集合里的下标 var TmSto = StrList.FindIndex(e => e == StaName); var RwSto = StrList.FindIndex(e => e == task.S_B_STATE.Trim()); if (TmSto == -1) { LogHelper.Info("小车当前状态获取索引失败:" + StaName); return; } if (RwSto == -1) { LogHelper.Info("当前任务:" + task.S_TASK_NO + "状态获取索引失败:" + task.S_B_STATE); return; } if (RwSto < TmSto) { for (int i = RwSto + 1; i <= TmSto; i++) { AgvTaskState agv = new AgvTaskState(); agv.No = task.S_TASK_NO; agv.State = IncList[i]; LogHelper.Info("修改任务状态为:" + StrList[i]); OperateTaskStatus(agv); } } } else if (a == 7) { if (task.S_B_STATE.Trim() == "取消" || task.S_B_STATE.Trim() == "完成") { } else { var RwSto = StrList.FindIndex(e => e == task.S_B_STATE.Trim()); if (RwSto < 3) { AgvTaskState agv = new AgvTaskState(); agv.No = task.S_TASK_NO; agv.State = 7; LogHelper.Info("修改任务状态为: 取消"); OperateTaskStatus(agv); } if (3 <= RwSto) { for (int i = RwSto + 1; i <= IncList.Count - 1; i++) { AgvTaskState agv = new AgvTaskState(); agv.No = task.S_TASK_NO; agv.State = IncList[i]; LogHelper.Info("修改任务状态为:" + StrList[i]); OperateTaskStatus(agv); } } } } } }); } } } //public class WorkSatae //{ //} }