using HH.WCS.Mobox3.DoubleCoin.models; using HH.WCS.Mobox3.DoubleCoin.process; using HH.WCS.Mobox3.DoubleCoin.util; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace HH.WCS.Mobox3.DoubleCoin.wms { internal class WCSHelper { internal static string GenerateTaskNo() { var id = SYSHelper.GetSerialNumber("任务号", "TN"); var date = DateTime.Now.ToString("yyMMdd"); return $"TN{date}{id.ToString().PadLeft(4, '0')}"; } internal static bool UpdateStatus(TN_Task task, string status) { var res = false; var db = new SqlHelper().GetInstance(); task.S_B_STATE = status; res = db.Updateable(task).UpdateColumns(it => new { it.S_B_STATE }).ExecuteCommand() > 0; return res; } internal static bool UpdateStatus(TN_Task task) { var res = false; var db = new SqlHelper().GetInstance(); task.S_B_STATE = TN_Task.GetStateStr(task.N_B_STATE); task.T_MODIFY = DateTime.Now; db.Updateable(task).UpdateColumns(it => new { it.N_B_STATE, it.S_B_STATE, it.T_MODIFY }).ExecuteCommand(); return res; } internal static bool UpdateEQNo(TN_Task task) { var res = false; var db = new SqlHelper().GetInstance(); task.T_MODIFY = DateTime.Now; db.Updateable(task).UpdateColumns(it => new { it.S_EQ_TASK_CODE, it.T_MODIFY }).ExecuteCommand(); return res; } internal static TN_Task GetTask(string no) { var db = new SqlHelper().GetInstance(); var task = db.Queryable().Where(a => a.S_CODE == no).First(); return task; } /// /// 创建搬送任务 /// /// 编号 /// 起点 /// 终点 /// 任务类型 /// 优先级 /// 容器编码 /// 物料规格 /// internal static bool CreateTask(string from, string to, string taskType, int pri, string cntrInfo, string spec = "") { var fromLoc = LocationHelper.GetLocation(from); var endLoc = LocationHelper.GetLocation(to); TN_Task TN_Task = new TN_Task() { S_CODE = GenerateTaskNo(), S_START_AREA = fromLoc.S_AREA_CODE, S_END_AREA = endLoc.S_AREA_CODE, S_START_LOC = from, S_END_LOC = to, S_TYPE = taskType, N_PRIORITY = pri, N_SCHEDULE_TYPE = 1, N_B_STATE = 0, S_CNTR_CODE = cntrInfo, }; var log = JsonConvert.SerializeObject(TN_Task); var db = new SqlHelper().GetInstance(); if (!string.IsNullOrEmpty(spec)) { TN_Task.S_SPEC = spec; } var res = db.Insertable(TN_Task).ExecuteCommand() > 0; if (res) { LogHelper.Info($"插入任务成功,{log}"); } else { LogHelper.Info($"插入任务失败,{log}"); } return res; } internal static bool CreateTask(string from, string to, string taskType, int pri, string cntrInfo, out string taskNo, string spec = "") { var fromLoc = LocationHelper.GetLocation(from); var endLoc = LocationHelper.GetLocation(to); TN_Task TN_Task = new TN_Task() { S_CODE = GenerateTaskNo(), S_START_AREA = fromLoc.S_AREA_CODE, S_END_AREA = endLoc.S_AREA_CODE, S_START_LOC = from, S_END_LOC = to, S_TYPE = taskType, N_PRIORITY = pri, N_SCHEDULE_TYPE = 1, N_B_STATE = 0, S_CNTR_CODE = cntrInfo, }; taskNo = TN_Task.S_CODE; var log = JsonConvert.SerializeObject(TN_Task); var db = new SqlHelper().GetInstance(); if (!string.IsNullOrEmpty(spec)) { TN_Task.S_SPEC = spec; } var res = db.Insertable(TN_Task).ExecuteCommand() > 0; if (res) { LogHelper.Info($"插入任务成功,{log}"); } else { LogHelper.Info($"插入任务失败,{log}"); } return res; } public static bool CreateTask(List modes) { if (modes != null && modes.Count > 0) { List tN_Tasks = new List(); foreach (var item in modes) { tN_Tasks.Add(new TN_Task() { S_CODE = item.taskNo, S_START_AREA = item.fromArea, S_END_AREA = item.toArea, S_START_LOC = item.from, S_END_LOC = item.to, S_TYPE = item.taskType, N_PRIORITY = item.pri, N_SCHEDULE_TYPE = 1, N_B_STATE = 0, S_CNTR_CODE = item.cntrInfo, S_SPEC = item.spec }); } var log = JsonConvert.SerializeObject(tN_Tasks); var db = new SqlHelper().GetInstance(); var res = db.Insertable(tN_Tasks).ExecuteCommand() > 0; if (res) { LogHelper.Info($"插入任务成功,{log}"); } else { LogHelper.Info($"插入任务失败,{log}"); } return res; } return false; } internal static bool CheckActionRecordExist(string no, int code) { var db = new SqlHelper().GetInstance(); return db.Queryable().Count(a => a.S_TASK_CODE == no && a.N_ACTION_CODE == code) > 0; } internal static void Begin(TN_Task task, string forklift_no) { var db = new SqlHelper().GetInstance(); if (task != null) { task.N_B_STATE = 2; task.S_B_STATE = TN_Task.GetStateStr(task.N_B_STATE); task.T_START_TIME = System.DateTime.Now; task.S_EQ_NO = forklift_no; db.Updateable(task).UpdateColumns(it => new { it.N_B_STATE, it.S_B_STATE, it.T_START_TIME, it.S_EQ_NO }).ExecuteCommand(); } } internal static void End(TN_Task task) { var db = new SqlHelper().GetInstance(); if (task != null) { task.N_B_STATE = 3; task.S_B_STATE = TN_Task.GetStateStr(task.N_B_STATE); task.T_END_TIME = DateTime.Now; db.Updateable(task).UpdateColumns(it => new { it.N_B_STATE, it.S_B_STATE, it.T_END_TIME }).ExecuteCommand(); } } internal static void Fail(TN_Task task) { var db = new SqlHelper().GetInstance(); if (task != null) { //判断有没有取货完成,没有就变成失败。有取货完成默认完成了(跟据项目而定,有些项目人工拉走了也没有放到终点)。 task.N_B_STATE = 4; task.S_B_STATE = TN_Task.GetStateStr(task.N_B_STATE); db.Updateable(task).UpdateColumns(it => new { it.N_B_STATE, it.S_B_STATE }).ExecuteCommand(); } } internal static bool AddActionRecord(string no, int state, string forkliftNo, string extData) { var db = new SqlHelper().GetInstance(); var action = new TN_Task_Action() { N_ACTION_CODE = state, S_TASK_CODE = no, S_EQ_CODE = forkliftNo, S_EQ_TYPE = "agv", S_DATA = extData }; return db.Insertable(action).ExecuteCommand() > 0; } internal static List GetWaitingTaskList() { var db = new SqlHelper().GetInstance(); return db.Queryable().Where(a => a.N_B_STATE == 0 && (a.S_B_STATE == "等待" || a.S_B_STATE == "待推送")).ToList(); } public static void CancleTaskInfo(TN_Task tN_Task) { var HJ = Settings.Areas[1]; if (tN_Task.S_END_AREA == HJ || tN_Task.S_TYPE.Contains("满托下线入库"))//终点是满托缓存库区 { LogHelper.Info($"取消任务: {tN_Task.S_CODE} 终点是满托缓存库区: {tN_Task.S_END_AREA}"); TaskProcess.CacheBitCancelUpdate(tN_Task);//异常处理 } else if (tN_Task.S_START_AREA == HJ || tN_Task.S_TYPE.Contains("满托出库上线"))//起点是满托缓存库区 { LogHelper.Info($"取消任务: {tN_Task.S_CODE} 起点是满托缓存库区: {tN_Task.S_START_AREA}"); if (!WCSHelper.CheckActionRecordExist(tN_Task.S_CODE, 4))//未取货完成 { WCSHelper.Fail(tN_Task);//任务状态改成错误 LogHelper.Info($"取消任务: {tN_Task.S_CODE} 未取货完成,任务状态改成错误"); } else { WCSHelper.End(tN_Task);//任务状态改成结束 if (tN_Task.S_END_AREA != Settings.Areas[2])//去线边的不绑定终点 { LocationHelper.BindingLoc(tN_Task.S_END_LOC, tN_Task.S_CNTR_CODE.Split(',').ToList());// 绑定终点容器货位 } LogHelper.Info($"取消任务: {tN_Task.S_CODE} 取货完成,任务状态改成结束,绑定终点容器货位"); } LocationHelper.UnLockLoc(tN_Task.S_END_LOC); LocationHelper.UnLockLoc(tN_Task.S_START_LOC);//解锁起点终点 } else { LogHelper.Info($"取消任务: {tN_Task.S_CODE} 起点终点都不是满托缓存库区: {tN_Task.S_START_AREA} {tN_Task.S_END_AREA}"); if (!WCSHelper.CheckActionRecordExist(tN_Task.S_CODE, 4))//未取货完成 { WCSHelper.Fail(tN_Task);//任务状态改成错误 var db = new SqlHelper().GetInstance(); var cginfo = db.Queryable().First(a => a.S_CNTR_CODE == tN_Task.S_CNTR_CODE); if (cginfo != null) { db.Deleteable().Where(it => it.S_ID == cginfo.S_ID || it.RFID == tN_Task.S_CNTR_CODE).ExecuteCommand(); } else { db.Deleteable().Where(it => it.RFID == tN_Task.S_CNTR_CODE).ExecuteCommand(); } LogHelper.Info($"取消任务: {tN_Task.S_CODE} 未取货完成,任务状态改成错误,删除改容器号的所有库存{tN_Task.S_CNTR_CODE}"); } else { WCSHelper.End(tN_Task);//任务状态改成结束 LocationHelper.BindingLoc(tN_Task.S_END_LOC, tN_Task.S_CNTR_CODE.Split(',').ToList()); LogHelper.Info($"取消任务: {tN_Task.S_CODE} 未取货完成,任务状态改成结束,绑定终点容器货位"); } LocationHelper.UnLockLoc(tN_Task.S_END_LOC); LocationHelper.UnLockLoc(tN_Task.S_START_LOC);//解锁起点终点 } } } public class CreateTasks { public string taskNo { set; get; } public string from { set; get; } public string fromArea { set; get; } public string to { set; get; } public string toArea { set; get; } public string taskType { set; get; } public int pri { set; get; } public string cntrInfo { set; get; } public string spec { set; get; } } }