TaskExtension.cs 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. using ServiceCenter.SqlSugars;
  2. using WCS.Entity;
  3. using WCS.WorkEngineering.WebApi.Controllers;
  4. using WCS.WorkEngineering.WebApi.Models.AGV.Response;
  5. using WCS.WorkEngineering.Worlds.Logs;
  6. using TaskStatus = WCS.Entity.TaskStatus;
  7. namespace WCS.WorkEngineering.Extensions
  8. {
  9. /// <summary>
  10. /// 任务扩展
  11. /// </summary>
  12. public static class TaskExtension
  13. {
  14. /// <summary>
  15. /// 更新任务执行记录
  16. /// </summary>
  17. /// <param name="task">任务信息</param>
  18. /// <param name="db">数据库上下文</param>
  19. /// <param name="curPoint">当前地址</param>
  20. /// <param name="desc">描述</param>
  21. public static void AddWCS_TASK_DTL(this WCS_TaskInfo task, SqlSugarHelper db, string curPoint, string desc) => task.AddWCS_TASK_DTL(db, curPoint, "", desc);
  22. /// <summary>
  23. /// 更新任务执行记录
  24. /// </summary>
  25. /// <param name="task">任务信息</param>
  26. /// <param name="db">数据库上下文</param>
  27. /// <param name="curPoint">当前地址</param>
  28. /// <param name="NextPoint">下一个地址</param>
  29. /// <param name="desc">描述</param>
  30. public static void AddWCS_TASK_DTL(this WCS_TaskInfo task, SqlSugarHelper db, string curPoint, string NextPoint, string desc)
  31. {
  32. db.Default.Insertable(new WCS_TaskDtl
  33. {
  34. ID = Guid.NewGuid(),
  35. ParentTaskCode = task.ID,
  36. CurPoint = curPoint,
  37. NextPoint = NextPoint,
  38. Desc = desc,
  39. AddWho = "WCS"
  40. }).SplitTable().ExecuteCommand();
  41. }
  42. /// <summary>
  43. /// 完成或取消任务
  44. /// </summary>
  45. /// <param name="taskInfo"></param>
  46. /// <param name="db"></param>
  47. /// <param name="world"></param>
  48. public static void CompleteOrCancelTasks(this WCS_TaskInfo taskInfo, SqlSugarHelper db)
  49. {
  50. if (taskInfo.Status is not Entity.TaskStatus.Finish and not Entity.TaskStatus.Cancel) throw new KnownException("任务未完成或取消,无法执行WCS_TaskInfo与WCS_TaskOld同步动作", LogLevelEnum.Mid);
  51. else // 任务完成或取消,进行相关同步动作
  52. {
  53. WCS_TaskOld taskOld = db.Default.Queryable<WCS_TaskOld>().SplitTable(tabs => tabs.Take(2)).Where(v => v.ID == taskInfo.ID).OrderByDescending(v => v.AddTime).First();
  54. if (taskOld is null) throw new KnownException($"WCS_TaskOld表中不存在任务:{taskInfo.ID},无法执行WCS_TaskInfo与WCS_TaskOld同步动作", LogLevelEnum.Mid);
  55. else
  56. {
  57. //状态
  58. taskOld.Status = taskInfo.Status;
  59. taskOld.Uploaded = taskInfo.Uploaded;
  60. //任务号
  61. taskOld.WmsTask = taskInfo.WmsTask;
  62. taskOld.AgvTaskID = taskInfo.AgvTaskID;
  63. taskOld.TaskGroupKey = taskInfo.TaskGroupKey;
  64. taskOld.Priority = taskInfo.Priority;
  65. //时间与用户
  66. taskOld.AddTime = taskInfo.AddTime;
  67. taskOld.AddWho = taskInfo.AddWho;
  68. taskOld.StartTime = taskInfo.StartTime;
  69. taskOld.EndTime = taskInfo.EedTime;
  70. taskOld.EditWho = taskInfo.EditWho;
  71. taskOld.EditTime = taskInfo.EditTime;
  72. //条码与地址
  73. taskOld.BarCode = taskInfo.BarCode;
  74. taskOld.MaterialCode = taskInfo.MaterialCode;
  75. taskOld.AddrFrom = taskInfo.AddrFrom;
  76. taskOld.AddrTo = taskInfo.AddrTo;
  77. taskOld.LastInteractionPoint = taskInfo.LastInteractionPoint;
  78. taskOld.AddrNext = taskInfo.AddrNext;
  79. taskOld.Tunnel = taskInfo.Tunnel;
  80. taskOld.Floor = taskInfo.Floor;
  81. taskOld.Device = taskInfo.Device;
  82. taskOld.SrmStation = taskInfo.SrmStation;
  83. //码垛信息
  84. taskOld.DocID = taskInfo.DocID;
  85. taskOld.PalletType = taskInfo.PalletType;
  86. taskOld.ProdLine = taskInfo.ProdLine;
  87. taskOld.FullQty = taskInfo.FullQty;
  88. //外形信息
  89. taskOld.Height = taskInfo.Height;
  90. taskOld.Length = taskInfo.Length;
  91. taskOld.Weight = taskInfo.Weight;
  92. //手动处理备注
  93. taskOld.ManualRemarks = taskInfo.ManualRemarks;
  94. //更新任务历史表,删除任务当前表
  95. db.Default.Updateable(taskOld).SplitTable().ExecuteCommand();
  96. db.Default.Deleteable(taskInfo).ExecuteCommand();
  97. }
  98. }
  99. }
  100. /// <summary>
  101. /// 获取出库任务
  102. /// </summary>
  103. /// <param name="taskInfo">任务</param>
  104. /// <param name="db">db</param>
  105. /// <param name="allOutCode">可用出库站台</param>
  106. /// <param name="floor">楼层</param>
  107. /// <param name="obj">堆垛机</param>
  108. /// <param name="index">递归次数</param>
  109. /// <returns></returns>
  110. /// <exception cref="KnownException"></exception>
  111. public static WCS_TaskInfo GetOutTask(this WCS_TaskInfo taskInfo, SqlSugarHelper db, List<string> allOutCode, int floor, SRM obj, int index = 1)
  112. {
  113. //按条件先后排序获取一条排序后第一条结果1.优先级2.所在楼层与本次优先执行楼层
  114. var tasks = db.Default.Queryable<WCS_TaskInfo>().Where(v => v.Type == TaskType.OutDepot && v.Status == TaskStatus.WaitingToExecute)
  115. .Where(v => allOutCode.Contains(v.SrmStation))
  116. .OrderByDescending(v => v.Priority)
  117. .OrderByDescending(v => v.Floor == floor ? 1 : 0)
  118. .Take(index).ToList();
  119. if (!tasks.Any()) throw new KnownException($"{obj.Entity.Code}未找到出库任务", LogLevelEnum.High);
  120. var task = tasks.ToArray()[tasks.Count - 1];
  121. //判断是否是二深位任务
  122. var addrFrom = task.AddrFrom.Split("-");
  123. if (addrFrom[4] == "02")
  124. {
  125. var res = WmsApi.AddWcsMoveTask(task.ID);
  126. switch (res.ResData.ResType)
  127. {
  128. case WmsApiMoveTask.允许2升位执行:
  129. break;
  130. case WmsApiMoveTask.执行移库任务:
  131. throw new KnownException($"堆垛机{obj.Entity.Code}需要先执行移库任务", LogLevelEnum.Mid);
  132. case WmsApiMoveTask.一深位有出库任务:
  133. task = db.Default.Queryable<WCS_TaskInfo>()
  134. .Where(v => v.Type == TaskType.OutDepot && v.Status == TaskStatus.WaitingToExecute)
  135. .Where(v => allOutCode.Contains(v.SrmStation) && v.AddrFrom == res.ResData.CellNo)
  136. .First();
  137. if (task == null) task.GetOutTask(db, allOutCode, floor, obj, index + 1);
  138. break;
  139. };
  140. }
  141. return task;
  142. }
  143. /// <summary>
  144. /// 获取AGV任务ID
  145. /// </summary>
  146. /// <param name="db">db</param>
  147. /// <returns></returns>
  148. public static int GetAGVTaskId(this SqlSugarHelper db)
  149. {
  150. var id = db.Default.Queryable<WCS_AgvTaskInfo>().SplitTable(v => v.Take(1)).Max(v => v.ID);
  151. return id + 1;
  152. }
  153. }
  154. }