using NetTaste; using ServiceCenter.Extensions; using ServiceCenter.Logs; using ServiceCenter.Redis; using ServiceCenter.SqlSugars; using SqlSugar; using WCS.Entity; using TaskStatus = WCS.Entity.TaskStatus; namespace WCS.WorkEngineering.Extensions { /// /// 任务扩展 /// public static class TaskExtension { /// /// 更新任务执行记录 /// 同步更新历史任务 /// /// 任务信息 /// 数据库上下文 /// 当前地址 /// 描述 public static void AddWCS_TASK_DTL(this WCS_TaskInfo task, SqlSugarScopeProvider db, string curPoint, string desc) => task.AddWCS_TASK_DTL(db, curPoint, "", desc); /// /// 更新任务执行记录 /// 同步更新历史任务 /// /// 任务信息 /// 数据库上下文 /// 当前地址 /// 下一个地址 /// 描述 public static void AddWCS_TASK_DTL(this WCS_TaskInfo task, SqlSugarScopeProvider db, string curPoint, string nextPoint, string desc) { db.Insertable(new WCS_TaskDtl { ID = Guid.NewGuid(), ParentTaskCode = task.ID, CurPoint = curPoint, NextPoint = nextPoint, Desc = desc, AddWho = "WCS" }).SplitTable().ExecuteCommand(); task.UpdateableOldTask(db); } /// /// 更新历史表数据 /// /// /// public static void UpdateableOldTask(this WCS_TaskInfo taskInfo, SqlSugarScopeProvider db) { if (taskInfo.Status == TaskStatus.NewBuild) return; // 同步任务信息 var taskOld = db.Queryable().SplitTable(tabs => tabs.Take(2)).Where(v => v.Id == taskInfo.ID).OrderByDescending(v => v.AddTime).First(); if (taskOld is not null) { if (taskInfo.Status >= TaskStatus.Finish) taskInfo.CompleteOrCancelTasks(db); else { taskOld = taskInfo.Mapper(); taskOld.Id = taskInfo.ID; db.Updateable(taskOld).Where(x => x.Id == taskOld.Id).SplitTable(x => x.Take(2)).ExecuteCommand(); } } else { throw new KnownException($"WCS_TaskOld表中不存在任务:{taskInfo.ID},无法执行WCS_TaskInfo与WCS_TaskOld同步动作", LogLevelEnum.Mid); } } /// /// 完成或取消任务 /// /// /// public static void CompleteOrCancelTasks(this WCS_TaskInfo taskInfo, SqlSugarScopeProvider db) { if (taskInfo.Status < Entity.TaskStatus.Finish) throw new KnownException("任务未完成或取消,无法执行WCS_TaskInfo与WCS_TaskOld同步动作", LogLevelEnum.Mid); // 任务完成或取消,进行相关同步动作 var taskOld = db.Queryable().SplitTable(tabs => tabs.Take(2)).Where(v => v.Id == taskInfo.ID).OrderByDescending(v => v.AddTime).First(); if (taskOld is not null) { taskOld = taskInfo.Mapper(); taskOld.Id = taskInfo.ID; //更新任务历史表,删除任务当前表 db.Updateable(taskOld).SplitTable(x => x.Take(2)).ExecuteCommand(); db.Deleteable(taskInfo).ExecuteCommand(); } else { throw new KnownException($"WCS_TaskOld表中不存在任务:{taskInfo.ID},无法执行WCS_TaskInfo与WCS_TaskOld同步动作", LogLevelEnum.Mid); } } /// /// 更新表数据 /// /// /// public static void Updateable(this WCS_TaskInfo taskInfo, SqlSugarScopeProvider db) { taskInfo.EditTime = DateTime.Now; taskInfo.EditWho = "WCS"; db.Updateable(taskInfo).ExecuteCommand(); } ///// ///// 获取出库任务 ///// ///// 任务 ///// db ///// 可用出库站台 ///// 楼层 ///// 堆垛机 ///// 递归次数 ///// ///// //public static WCS_TaskInfo GetOutTask(this WCS_TaskInfo taskInfo, SqlSugarHelper db, List allOutCode, int floor, SRM obj, int index = 1) //{ // return task; //} /// /// 获取AGV任务ID /// /// db /// public static int GetAgvTaskId(this SqlSugarHelper db) { var id = db.Default.Queryable().SplitTable(v => v.Take(1)).Max(v => v.ID); return id + 1; } /// /// 更新任务执行记录 /// /// 任务信息 public static void UpdateRedisHash(this WCS_TaskInfo task) { var key = $"Hash:{task.ID}"; if (task.Status >= TaskStatus.Finish) { RedisHub.WMS.Del(key); } else { RedisHub.WMS.HMSet(key, task.ToDic()); } } #region 工字轮支线分流 public static string GetMatList(this List matList) { return matList.Distinct().Aggregate("", (current, mat) => current + $"[{mat}]"); } #endregion 工字轮支线分流 /// /// 去除转义字符 /// /// /// public static string RemoveEscapeCharacters(this string? value) { return value.Trim('\0', '\a', '\b', '\f', '\n', '\r', '\t', '\v').Replace("�\u0012", "").Replace("\\0", "").Replace("\\r", "").Replace("\0", "").Trim(); } public static void UpdataErrorinfo(this BaseErrorinfoWcs error) { SqlSugarHelper.Do(db => { var errorinfoWcs = db.Default.Queryable().With(SqlWith.NoLock).Where(v => v.ContBarCode == error.ContBarCode && v.Message == error.Message).First(); if (errorinfoWcs != null) { errorinfoWcs.Count = errorinfoWcs.Count+1; db.Default.Updateable(errorinfoWcs).ExecuteCommand(); } else { db.Default.Insertable(error).ExecuteCommand(); } }); } } /// /// 垛形位信息 /// public class StackPosInfo { /// /// 任务号 /// public int TaskNumber { get; set; } /// /// 是否空置 /// public bool IsEmpty { get; set; } /// /// 坐标号 /// public string XYNo { get; set; } /// /// 物料编码 /// public string MatCode { get; set; } /// /// 正反面 /// public int SideNum { get; set; } /// /// 工字轮类型 /// public string SpoolType { get; set; } /// /// 是否结束 /// public bool Finish { get; set; } } }