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 is not Entity.TaskStatus.Finish and not Entity.TaskStatus.Cancel) 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 void InitStackStructure(this WCS_TaskInfo task, SqlSugarScopeProvider db) { var billBomsetinfo = db.Queryable().First(x => x.MatCode == task.MatCode); var billBomsetinfos = db.Queryable().Where(x => x.BomSetHdrId == billBomsetinfo.BomSetHdrId).ToList(); var billBomsetgrp = db.Queryable().Single(x => x.Id == billBomsetinfo.BomSetHdrId); //开始构造垛形信息 var palletizing = new WCS_Palletizing() { Code = billBomsetgrp.Code, ShortCode = billBomsetgrp.ShortCode, ProMaterCode = billBomsetgrp.ProMaterCode, TpTypeCode = billBomsetgrp.TpTypeCode, LayerCountQty = 2, StampType = billBomsetgrp.StampType, Finish = false, AddTime = DateTime.Now, TaskId = task.ID }; palletizing = db.Insertable(palletizing).ExecuteReturnEntity(); foreach (var item in billBomsetinfos.GroupBy(x => x.Row).OrderBy(x => x.Key)) { var layerNo = item.Key <= 6 ? 1 : 2; //获取层信息 var palletizingLayer = db.Queryable() .Single(x => x.PalletizingId == palletizing.Id && x.LayerNo == layerNo); if (palletizingLayer == null) { palletizingLayer = new WCS_PalletizingLayer() { LayerNo = layerNo, PalletizingId = palletizing.Id }; palletizingLayer = db.Insertable(palletizingLayer).ExecuteReturnEntity(); } //获取行信息 var palletizingRow = db.Queryable() .Single(x => x.PalletizingLayerId == palletizingLayer.Id && x.RowNo == item.Key); if (palletizingRow == null) { palletizingRow = new WCS_PalletizingRow() { RowNo = item.Key, PalletizingLayerId = palletizingLayer.Id }; palletizingRow = db.Insertable(palletizingRow).ExecuteReturnEntity(); } //重新查询最新的数据 var layer = palletizingLayer; palletizingLayer = db.Queryable().Single(x => x.Id == layer.Id); var row = palletizingRow; palletizingRow = db.Queryable().Single(x => x.Id == row.Id); //构造位信息 foreach (var loc in item) { var palletizingLoc = db.Queryable() .Single(x => x.PalletizingRowId == palletizingRow.Id && x.XYNo == loc.XYNo); if (palletizingLoc == null) { palletizingLoc = new WCS_PalletizingLoc() { IsEmpty = loc.IsEmpty != 0, XYNo = loc.XYNo, MatCode = loc.MatCode, SideNum = loc.SideNum, SpoolType = loc.SpoolType, TaskId = task.ID, PalletizingRowId = palletizingRow.Id, Finish = false }; palletizingLoc = db.Insertable(palletizingLoc).ExecuteReturnEntity(); } //同步是否混合料行 palletizingRow.IsMixRow = loc.IsMixRow != 0; db.Updateable(palletizingRow).ExecuteCommand(); } //更新行信息 palletizingRow = db.Queryable().Includes(x => x.Locs).Single(x => x.Id == row.Id); palletizingRow.QtyMaxCount = palletizingRow.Locs.Count(x => !x.IsEmpty); palletizingRow.IsEmpty = palletizingRow.QtyMaxCount <= 0; palletizingRow.MatCodeList = palletizingRow.Locs.Select(x => x.MatCode).ToList().GetMatList(); db.Updateable(palletizingRow).ExecuteCommand(); //更新层信息 palletizingLayer = db.Queryable().Includes(x => x.Rows, l => l.Locs).Single(x => x.Id == layer.Id); var count = palletizingLayer.Rows.Count(x => !x.IsEmpty); //计算所有不空数量 palletizingLayer.IsEmpty = count <= 0; palletizingLayer.RowCountQty = palletizingLayer.Rows.Count; palletizingLayer.Finish = false; palletizingLayer.MatCodeList = palletizingLayer.Rows.SelectMany(x => x.Locs).Select(x => x.MatCode).ToList().GetMatList(); db.Updateable(palletizingLayer).ExecuteCommand(); } var palletizing1 = palletizing; palletizing = db.Queryable().Includes(x => x.Layers, r => r.Rows, l => l.Locs).Single(x => x.Id == palletizing1.Id); //计算垛形信息 var goods = palletizing.Layers.Select(x => x.Rows).SelectMany(x => x).Select(x => x.Locs).SelectMany(x => x).ToList(); palletizing.CountQty = goods.Count(x => !x.IsEmpty); palletizing.MatCodeList = palletizing.Layers.SelectMany(x => x.Rows).SelectMany(x => x.Locs).Select(x => x.MatCode).ToList().GetMatList(); db.Updateable(palletizing).ExecuteCommand(); } public static string GetMatList(this List matList) { return matList.Distinct().Aggregate("", (current, mat) => current + $"[{mat}]"); } #endregion 工字轮支线分流 } /// /// 垛形位信息 /// 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; } } }