TaskExtension.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. using Newtonsoft.Json;
  2. using ServiceCenter.Extensions;
  3. using ServiceCenter.Logs;
  4. using ServiceCenter.Redis;
  5. using ServiceCenter.SqlSugars;
  6. using SqlSugar;
  7. using WCS.Entity;
  8. using TaskStatus = WCS.Entity.TaskStatus;
  9. namespace WCS.WorkEngineering.Extensions
  10. {
  11. /// <summary>
  12. /// 任务扩展
  13. /// </summary>
  14. public static class TaskExtension
  15. {
  16. /// <summary>
  17. /// 更新任务执行记录
  18. /// </summary>
  19. /// <param name="task">任务信息</param>
  20. /// <param name="db">数据库上下文</param>
  21. /// <param name="curPoint">当前地址</param>
  22. /// <param name="desc">描述</param>
  23. public static void AddWCS_TASK_DTL(this WCS_TaskInfo task, SqlSugarHelper db, string curPoint, string desc) => task.AddWCS_TASK_DTL(db, curPoint, "", desc);
  24. /// <summary>
  25. /// 更新任务执行记录
  26. /// </summary>
  27. /// <param name="task">任务信息</param>
  28. /// <param name="db">数据库上下文</param>
  29. /// <param name="curPoint">当前地址</param>
  30. /// <param name="NextPoint">下一个地址</param>
  31. /// <param name="desc">描述</param>
  32. public static void AddWCS_TASK_DTL(this WCS_TaskInfo task, SqlSugarHelper db, string curPoint, string NextPoint, string desc)
  33. {
  34. db.Default.Insertable(new WCS_TaskDtl
  35. {
  36. ID = Guid.NewGuid(),
  37. ParentTaskCode = task.ID,
  38. CurPoint = curPoint,
  39. NextPoint = NextPoint,
  40. Desc = desc,
  41. AddWho = "WCS"
  42. }).SplitTable().ExecuteCommand();
  43. }
  44. public static void AddWCS_TASK_DTL1(this WCS_TaskInfo task, SqlSugarHelper db, string curPoint, string NextPoint, string desc)
  45. {
  46. db.Default.Insertable(new WCS_TaskDtl
  47. {
  48. ID = Guid.NewGuid(),
  49. ParentTaskCode = task.ID,
  50. CurPoint = curPoint,
  51. NextPoint = NextPoint,
  52. Desc = desc,
  53. AddWho = "WCS"
  54. }).SplitTable().ExecuteCommand();
  55. task.UpdateableOldTask(db);
  56. }
  57. /// <summary>
  58. /// 更新历史表数据
  59. /// </summary>
  60. /// <param name="taskInfo"></param>
  61. /// <param name="db"></param>
  62. public static void UpdateableOldTask(this WCS_TaskInfo taskInfo, SqlSugarHelper db)
  63. {
  64. if (taskInfo.Status == TaskStatus.NewBuild) return;
  65. // 同步任务信息
  66. var taskOld = db.Default.Queryable<WCS_TaskOld>().Where(v => v.ID == taskInfo.ID).SplitTable(tabs => tabs.Take(2)).ToList().OrderByDescending(v => v.AddTime).First();
  67. if (taskOld is not null)
  68. {
  69. if (taskInfo.Status >= TaskStatus.Finish) taskInfo.CompleteOrCancelTasks(db);
  70. else
  71. {
  72. taskOld = taskInfo.Mapper<WCS_TaskOld, WCS_TaskInfo>();
  73. taskOld.ID = taskInfo.ID;
  74. db.Default.Updateable(taskOld).Where(x => x.ID == taskOld.ID).SplitTable(tabs => tabs.Take(2)).ExecuteCommand();
  75. }
  76. }
  77. else
  78. {
  79. throw new KnownException($"WCS_TaskOld表中不存在任务:{taskInfo.ID},无法执行WCS_TaskInfo与WCS_TaskOld同步动作", LogLevelEnum.Mid);
  80. }
  81. }
  82. /// <summary>
  83. /// 完成或取消任务
  84. /// </summary>
  85. /// <param name="taskInfo"></param>
  86. /// <param name="db"></param>
  87. /// <param name="world"></param>
  88. public static void CompleteOrCancelTasks(this WCS_TaskInfo taskInfo, SqlSugarHelper db)
  89. {
  90. if (taskInfo.Status is not Entity.TaskStatus.Finish and not Entity.TaskStatus.Cancel) throw new KnownException("任务未完成或取消,无法执行WCS_TaskInfo与WCS_TaskOld同步动作", LogLevelEnum.Mid);
  91. else // 任务完成或取消,进行相关同步动作
  92. {
  93. WCS_TaskOld taskOld = db.Default.Queryable<WCS_TaskOld>().SplitTable(tabs => tabs.Take(2)).Where(v => v.ID == taskInfo.ID).OrderByDescending(v => v.AddTime).First();
  94. if (taskOld is null) throw new KnownException($"WCS_TaskOld表中不存在任务:{taskInfo.ID},无法执行WCS_TaskInfo与WCS_TaskOld同步动作", LogLevelEnum.Mid);
  95. else
  96. {
  97. //状态
  98. taskOld.Status = taskInfo.Status;
  99. taskOld.Uploaded = taskInfo.Uploaded;
  100. //任务号
  101. taskOld.WmsTask = taskInfo.WmsTask;
  102. taskOld.AgvTaskID = taskInfo.AgvTaskID;
  103. taskOld.TaskGroupKey = taskInfo.TaskGroupKey;
  104. taskOld.Priority = taskInfo.Priority;
  105. //时间与用户
  106. taskOld.AddTime = taskInfo.AddTime;
  107. taskOld.AddWho = taskInfo.AddWho;
  108. taskOld.StartTime = taskInfo.StartTime;
  109. taskOld.EndTime = taskInfo.EedTime;
  110. taskOld.EditWho = taskInfo.EditWho;
  111. taskOld.EditTime = taskInfo.EditTime;
  112. //条码与地址
  113. taskOld.BarCode = taskInfo.BarCode;
  114. taskOld.MaterialCode = taskInfo.MaterialCode;
  115. taskOld.AddrFrom = taskInfo.AddrFrom;
  116. taskOld.AddrTo = taskInfo.AddrTo;
  117. taskOld.LastInteractionPoint = taskInfo.LastInteractionPoint;
  118. taskOld.AddrNext = taskInfo.AddrNext;
  119. taskOld.Tunnel = taskInfo.Tunnel;
  120. taskOld.Floor = taskInfo.Floor;
  121. taskOld.Device = taskInfo.Device;
  122. taskOld.SrmStation = taskInfo.SrmStation;
  123. //码垛信息
  124. taskOld.DocID = taskInfo.DocID;
  125. taskOld.PalletType = taskInfo.PalletType;
  126. taskOld.ProdLine = taskInfo.ProdLine;
  127. taskOld.FullQty = taskInfo.FullQty;
  128. //外形信息
  129. taskOld.Height = taskInfo.Height;
  130. taskOld.Length = taskInfo.Length;
  131. taskOld.Weight = taskInfo.Weight;
  132. //手动处理备注
  133. taskOld.ManualRemarks = taskInfo.ManualRemarks;
  134. //更新任务历史表,删除任务当前表
  135. db.Default.Updateable(taskOld).SplitTable(tas=>tas.Take(3)).ExecuteCommand();
  136. db.Default.Deleteable(taskInfo).ExecuteCommand();
  137. }
  138. }
  139. }
  140. public static void CompleteTasks(this WCS_TaskInfo taskInfo, SqlSugarHelper db)
  141. {
  142. if (taskInfo.Status is not Entity.TaskStatus.Finish and not Entity.TaskStatus.Cancel) throw new KnownException("任务未完成或取消,无法执行WCS_TaskInfo与WCS_TaskOld同步动作", LogLevelEnum.Mid);
  143. else // 任务完成或取消,进行相关同步动作
  144. {
  145. WCS_TaskOld taskOld = db.Default.Queryable<WCS_TaskOld>().SplitTable(tabs => tabs.Take(2)).Where(v => v.ID == taskInfo.ID).OrderByDescending(v => v.AddTime).First();
  146. if (taskOld is null) throw new KnownException($"WCS_TaskOld表中不存在任务:{taskInfo.ID},无法执行WCS_TaskInfo与WCS_TaskOld同步动作", LogLevelEnum.Mid);
  147. else
  148. {
  149. //状态
  150. taskOld.Status = taskInfo.Status;
  151. taskOld.Uploaded = taskInfo.Uploaded;
  152. //任务号
  153. taskOld.WmsTask = taskInfo.WmsTask;
  154. taskOld.AgvTaskID = taskInfo.AgvTaskID;
  155. taskOld.TaskGroupKey = taskInfo.TaskGroupKey;
  156. taskOld.Priority = taskInfo.Priority;
  157. //时间与用户
  158. taskOld.AddTime = taskInfo.AddTime;
  159. taskOld.AddWho = taskInfo.AddWho;
  160. taskOld.StartTime = taskInfo.StartTime;
  161. taskOld.EndTime = taskInfo.EedTime;
  162. taskOld.EditWho = taskInfo.EditWho;
  163. taskOld.EditTime = taskInfo.EditTime;
  164. //条码与地址
  165. taskOld.BarCode = taskInfo.BarCode;
  166. taskOld.MaterialCode = taskInfo.MaterialCode;
  167. taskOld.AddrFrom = taskInfo.AddrFrom;
  168. taskOld.AddrTo = taskInfo.AddrTo;
  169. taskOld.LastInteractionPoint = taskInfo.LastInteractionPoint;
  170. taskOld.AddrNext = taskInfo.AddrNext;
  171. taskOld.Tunnel = taskInfo.Tunnel;
  172. taskOld.Floor = taskInfo.Floor;
  173. taskOld.Device = taskInfo.Device;
  174. taskOld.SrmStation = taskInfo.SrmStation;
  175. //码垛信息
  176. taskOld.DocID = taskInfo.DocID;
  177. taskOld.PalletType = taskInfo.PalletType;
  178. taskOld.ProdLine = taskInfo.ProdLine;
  179. taskOld.FullQty = taskInfo.FullQty;
  180. //外形信息
  181. taskOld.Height = taskInfo.Height;
  182. taskOld.Length = taskInfo.Length;
  183. taskOld.Weight = taskInfo.Weight;
  184. //手动处理备注
  185. taskOld.ManualRemarks = taskInfo.ManualRemarks;
  186. //更新任务历史表,删除任务当前表
  187. db.Default.Updateable(taskOld).SplitTable(tas => tas.Take(3)).ExecuteCommand();
  188. }
  189. }
  190. }
  191. public static void CancelTasks(this WCS_TaskInfo taskInfo, SqlSugarHelper db)
  192. {
  193. db.Default.Deleteable(taskInfo).ExecuteCommand();
  194. }
  195. ///// <summary>
  196. ///// 获取出库任务
  197. ///// </summary>
  198. ///// <param name="taskInfo">任务</param>
  199. ///// <param name="db">db</param>
  200. ///// <param name="allOutCode">可用出库站台</param>
  201. ///// <param name="floor">楼层</param>
  202. ///// <param name="obj">堆垛机</param>
  203. ///// <param name="index">递归次数</param>
  204. ///// <returns></returns>
  205. ///// <exception cref="KnownException"></exception>
  206. //public static WCS_TaskInfo GetOutTask(this WCS_TaskInfo taskInfo, SqlSugarHelper db, List<string> allOutCode, int floor, SRM obj, int index = 1)
  207. //{
  208. // return task;
  209. //}
  210. /// <summary>
  211. /// 获取AGV任务ID
  212. /// </summary>
  213. /// <param name="db">db</param>
  214. /// <returns></returns>
  215. public static int GetAGVTaskId(this SqlSugarHelper db)
  216. {
  217. var id = db.Default.Queryable<WCS_AgvTaskInfo>().SplitTable(v => v.Take(1)).Max(v => v.ID);
  218. return id + 1;
  219. }
  220. /// <summary>
  221. /// 更新任务执行记录
  222. /// </summary>
  223. /// <param name="task">任务信息</param>
  224. public static void updateRedisHash(this WCS_TaskInfo task)
  225. {
  226. RedisHub.WMS.HMSet($"Hash:{task.ID}", task.ToDic());
  227. }
  228. }
  229. }