using HH.WCS.Hexafluo.dispatch;
|
using HH.WCS.Hexafluo.process;
|
using HH.WCS.Hexafluo.util;
|
using HH.WCS.Hexafluo.wms;
|
using HH.WCS.SJML.Entitys;
|
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<StateTaskBLL>().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();
|
/// <summary>
|
/// 任务分发
|
/// </summary>
|
internal static void Dispatch()
|
{
|
//查询任务
|
//获取所有未执行的任务
|
lock (locko9)
|
{
|
var chi = new SqlHelper<object>().GetInstance();
|
var newDb = chi.CopyNew();
|
var Lo = newDb.Queryable<TaskLockEntitys>().Where(a => a.DeviceName == "AGV")?.First();
|
DateTime date = DateTime.Now;
|
if (Lo != null && Lo.IsEnable == "Y")
|
{
|
List<string> state = new List<string> { "未执行", "待推送" };
|
var list = TaskHelper.GetTaskListByState(state);
|
|
//查询是否有送满取空的 空入任务 有的话需要等待20分钟
|
var transportTask = newDb.Queryable<ConfigJsonEntitys>().Where(e => e.Autoindex == "送满取空对应的空托点位")?.First();
|
if (transportTask != null)
|
{
|
var ListString = JsonConvert.DeserializeObject<List<string>>(transportTask.TypeJson);
|
if (ListString.Count() > 0)
|
{
|
//剔除时间没到20分钟的空托入库--特制
|
var TiemTask = list.FindAll(e => ListString.Contains(e.S_START_LOC) && e.S_TYPE == "入库").ToList();
|
if (TiemTask.Count() > 0)
|
{
|
foreach (var item in TiemTask)
|
{
|
if (item.T_CREATE.AddMinutes(20) > date)//没超时20分钟
|
{
|
//排除
|
list.Remove(item);
|
LogHelper.Info("NDC", $"没超时20分钟 排除的任务有:{JsonConvert.SerializeObject(item)}");
|
}
|
}
|
}
|
}
|
}
|
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 = newDb.Queryable<WMSTask>().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<WMSTask>().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<string> States = new List<string>() { "已推送", "执行中", "开始取货" };
|
var taskList = newDb.Queryable<WMSTask>().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 = newDb.Queryable<WMSTask>().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 = newDb.Queryable<WMSTask>().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<WMSTask>().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<WMSTask>().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<string> state = new List<string> { "未执行", "待推送" };
|
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<string> state = new List<string> { "未执行", "待推送" };
|
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<string, int> SataeNameList = new Dictionary<string, int>()
|
{
|
{"tsOrder Started",1},//开始执行
|
{"Fetching",3},//开始取货
|
{"Fetched",4},//取货完成
|
{"Delivering",5},//开始卸货
|
{"Delivered",6},//卸货完成
|
{"tsOrder Finished",2},//完成
|
{"tsOrder Failed",7},//取消
|
{"RAW",8},
|
};
|
public static Dictionary<int, string> SataeList = new Dictionary<int, string>()
|
{
|
{1,"执行中"},//开始执行
|
{3 ,"开始取货"},//开始取货
|
{4 ,"取货完成"},//取货完成
|
{5 ,"开始卸货"},//开始卸货
|
{6 ,"卸货完成"},//卸货完成
|
//{1101 ,"开始与起点设备交互"},//开始与起点设备交互
|
//{1103 ,"开始与终点设备交互"},//开始与起点设备交互
|
{2 ,"完成"},//完成
|
{7 ,"取消"},//取消
|
};
|
public static List<string> StrList = new List<string>() { "已推送", "执行中", "开始取货", "取货完成", "开始卸货", "卸货完成", "完成" };
|
public static List<int> IncList = new List<int>() { 0, 1, 3, 4, 5, 6, 2 };
|
internal static void SeleTaskListTm()
|
{
|
List<string> state = new List<string> { "完成", "取消", "待推送" };
|
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
|
//{
|
|
//}
|
}
|