TaskExtension.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. using ServiceCenter.Extensions;
  2. using ServiceCenter.Logs;
  3. using ServiceCenter.Redis;
  4. using ServiceCenter.SqlSugars;
  5. using SqlSugar;
  6. using WCS.Entity;
  7. using wms.sqlsugar.model.fj;
  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. /// 同步更新历史任务
  19. /// </summary>
  20. /// <param name="task">任务信息</param>
  21. /// <param name="db">数据库上下文</param>
  22. /// <param name="curPoint">当前地址</param>
  23. /// <param name="desc">描述</param>
  24. public static void AddWCS_TASK_DTL(this WCS_TaskInfo task, SqlSugarScopeProvider db, string curPoint, string desc) => task.AddWCS_TASK_DTL(db, curPoint, "", desc);
  25. /// <summary>
  26. /// 更新任务执行记录
  27. /// 同步更新历史任务
  28. /// </summary>
  29. /// <param name="task">任务信息</param>
  30. /// <param name="db">数据库上下文</param>
  31. /// <param name="curPoint">当前地址</param>
  32. /// <param name="nextPoint">下一个地址</param>
  33. /// <param name="desc">描述</param>
  34. public static void AddWCS_TASK_DTL(this WCS_TaskInfo task, SqlSugarScopeProvider db, string curPoint, string nextPoint, string desc)
  35. {
  36. db.Insertable(new WCS_TaskDtl
  37. {
  38. ID = Guid.NewGuid(),
  39. ParentTaskCode = task.ID,
  40. CurPoint = curPoint,
  41. NextPoint = nextPoint,
  42. Desc = desc,
  43. AddWho = "WCS"
  44. }).SplitTable().ExecuteCommand();
  45. task.UpdateableOldTask(db);
  46. }
  47. /// <summary>
  48. /// 完成或取消任务
  49. /// </summary>
  50. /// <param name="taskInfo"></param>
  51. /// <param name="db"></param>
  52. public static void CompleteOrCancelTasks(this WCS_TaskInfo taskInfo, SqlSugarScopeProvider db)
  53. {
  54. if (taskInfo.Status is not Entity.TaskStatus.Finish and not Entity.TaskStatus.Cancel) throw new KnownException("任务未完成或取消,无法执行WCS_TaskInfo与WCS_TaskOld同步动作", LogLevelEnum.Mid);
  55. // 任务完成或取消,进行相关同步动作
  56. var taskOld = db.Queryable<WCS_TaskOld>().SplitTable(tabs => tabs.Take(2)).Where(v => v.Id == taskInfo.ID).OrderByDescending(v => v.AddTime).First();
  57. if (taskOld is not null)
  58. {
  59. taskOld = taskInfo.Mapper<WCS_TaskOld, WCS_TaskInfo>();
  60. taskOld.Id = taskInfo.ID;
  61. //更新任务历史表,删除任务当前表
  62. db.Updateable(taskOld).SplitTable().ExecuteCommand();
  63. db.Deleteable(taskInfo).ExecuteCommand();
  64. }
  65. else
  66. {
  67. throw new KnownException($"WCS_TaskOld表中不存在任务:{taskInfo.ID},无法执行WCS_TaskInfo与WCS_TaskOld同步动作", LogLevelEnum.Mid);
  68. }
  69. }
  70. /// <summary>
  71. /// 更新历史表数据
  72. /// </summary>
  73. /// <param name="taskInfo"></param>
  74. /// <param name="db"></param>
  75. public static void UpdateableOldTask(this WCS_TaskInfo taskInfo, SqlSugarScopeProvider db)
  76. {
  77. // 同步任务信息
  78. var taskOld = db.Queryable<WCS_TaskOld>().SplitTable(tabs => tabs.Take(2)).Where(v => v.Id == taskInfo.ID).OrderByDescending(v => v.AddTime).First();
  79. if (taskOld is not null)
  80. {
  81. taskOld = taskInfo.Mapper<WCS_TaskOld, WCS_TaskInfo>();
  82. taskOld.Id = taskInfo.ID;
  83. db.Updateable(taskOld).Where(x => x.Id == taskOld.Id).SplitTable().ExecuteCommand();
  84. }
  85. else
  86. {
  87. throw new KnownException($"WCS_TaskOld表中不存在任务:{taskInfo.ID},无法执行WCS_TaskInfo与WCS_TaskOld同步动作", LogLevelEnum.Mid);
  88. }
  89. }
  90. /// <summary>
  91. /// 更新表数据
  92. /// </summary>
  93. /// <param name="taskInfo"></param>
  94. /// <param name="db"></param>
  95. public static void Updateable(this WCS_TaskInfo taskInfo, SqlSugarScopeProvider db)
  96. {
  97. taskInfo.EditTime = DateTime.Now;
  98. taskInfo.EditWho = "WCS";
  99. db.Updateable(taskInfo).ExecuteCommand();
  100. }
  101. ///// <summary>
  102. ///// 获取出库任务
  103. ///// </summary>
  104. ///// <param name="taskInfo">任务</param>
  105. ///// <param name="db">db</param>
  106. ///// <param name="allOutCode">可用出库站台</param>
  107. ///// <param name="floor">楼层</param>
  108. ///// <param name="obj">堆垛机</param>
  109. ///// <param name="index">递归次数</param>
  110. ///// <returns></returns>
  111. ///// <exception cref="KnownException"></exception>
  112. //public static WCS_TaskInfo GetOutTask(this WCS_TaskInfo taskInfo, SqlSugarHelper db, List<string> allOutCode, int floor, SRM obj, int index = 1)
  113. //{
  114. // return task;
  115. //}
  116. /// <summary>
  117. /// 获取AGV任务ID
  118. /// </summary>
  119. /// <param name="db">db</param>
  120. /// <returns></returns>
  121. public static int GetAgvTaskId(this SqlSugarHelper db)
  122. {
  123. var id = db.Default.Queryable<WCS_AgvTaskInfo>().SplitTable(v => v.Take(1)).Max(v => v.ID);
  124. return id + 1;
  125. }
  126. /// <summary>
  127. /// 更新任务执行记录
  128. /// </summary>
  129. /// <param name="task">任务信息</param>
  130. public static void UpdateRedisHash(this WCS_TaskInfo task)
  131. {
  132. var key = $"Hash:{task.ID}";
  133. if (task.Status >= TaskStatus.Finish)
  134. {
  135. RedisHub.WMS.Del(key);
  136. }
  137. else
  138. {
  139. RedisHub.WMS.HMSet(key, task.ToDic());
  140. }
  141. }
  142. #region 工字轮支线分流
  143. /// <summary>
  144. /// 初始化码垛信息
  145. /// </summary>
  146. /// <param name="task"></param>
  147. public static void InitStackStructure(this WCS_TaskInfo task, SqlSugarScopeProvider db)
  148. {
  149. var billDocsinfo = db.Queryable<BillDocsinfo>().Single(x => x.WorkOrder == task.WorkOrder);
  150. var billBomsetgrp = db.Queryable<BillBomsetgrp>().Single(x => x.Code == billDocsinfo.SetGrpCode);
  151. var billBomsetinfos = db.Queryable<BillBomsetinfo>().Where(x => x.BomSetHdrId == billBomsetgrp.Id).ToList();
  152. //开始构造垛形信息
  153. var palletizing = new WCS_Palletizing()
  154. {
  155. Code = billBomsetgrp.Code,
  156. ShortCode = billBomsetgrp.ShortCode,
  157. ProMaterCode = billBomsetgrp.ProMaterCode,
  158. TpTypeCode = billBomsetgrp.TpTypeCode,
  159. LayerCountQty = 2,
  160. StampType = billBomsetgrp.StampType,
  161. Finish = false,
  162. AddTime = DateTime.Now,
  163. TaskId = task.ID
  164. };
  165. palletizing = db.Insertable(palletizing).ExecuteReturnEntity();
  166. foreach (var item in billBomsetinfos.GroupBy(x => x.Row).OrderBy(x => x.Key))
  167. {
  168. var layerNo = item.Key <= 6 ? 1 : 2;
  169. //获取层信息
  170. var palletizingLayer = db.Queryable<WCS_PalletizingLayer>()
  171. .Single(x => x.PalletizingId == palletizing.Id && x.LayerNo == layerNo);
  172. if (palletizingLayer == null)
  173. {
  174. palletizingLayer = new WCS_PalletizingLayer()
  175. {
  176. LayerNo = layerNo,
  177. PalletizingId = palletizing.Id
  178. };
  179. palletizingLayer = db.Insertable(palletizingLayer).ExecuteReturnEntity();
  180. }
  181. //获取行信息
  182. var palletizingRow = db.Queryable<WCS_PalletizingRow>()
  183. .Single(x => x.PalletizingLayerId == palletizingLayer.Id && x.RowNo == item.Key);
  184. if (palletizingRow == null)
  185. {
  186. palletizingRow = new WCS_PalletizingRow()
  187. {
  188. RowNo = item.Key,
  189. PalletizingLayerId = palletizingLayer.Id
  190. };
  191. palletizingRow = db.Insertable(palletizingRow).ExecuteReturnEntity();
  192. }
  193. //重新查询最新的数据
  194. var layer = palletizingLayer;
  195. palletizingLayer = db.Queryable<WCS_PalletizingLayer>().Single(x => x.Id == layer.Id);
  196. var row = palletizingRow;
  197. palletizingRow = db.Queryable<WCS_PalletizingRow>().Single(x => x.Id == row.Id);
  198. //构造位信息
  199. foreach (var loc in item)
  200. {
  201. var palletizingLoc = db.Queryable<WCS_PalletizingLoc>()
  202. .Single(x => x.PalletizingRowId == palletizingRow.Id && x.XYNo == loc.XYNo);
  203. if (palletizingLoc == null)
  204. {
  205. palletizingLoc = new WCS_PalletizingLoc()
  206. {
  207. IsEmpty = loc.IsEmpty != 0,
  208. XYNo = loc.XYNo,
  209. MatCode = loc.MatCode,
  210. SideNum = loc.SideNum,
  211. SpoolType = loc.SpoolType,
  212. TaskId = task.ID,
  213. PalletizingRowId = palletizingRow.Id,
  214. Finish = false
  215. };
  216. palletizingLoc = db.Insertable(palletizingLoc).ExecuteReturnEntity();
  217. }
  218. //同步是否混合料行
  219. palletizingRow.IsMixRow = loc.IsMixRow != 0;
  220. db.Updateable(palletizingRow).ExecuteCommand();
  221. }
  222. //更新行信息
  223. palletizingRow = db.Queryable<WCS_PalletizingRow>().Includes(x => x.Locs).Single(x => x.Id == row.Id);
  224. palletizingRow.QtyMaxCount = palletizingRow.Locs.Count(x => !x.IsEmpty);
  225. palletizingRow.IsEmpty = palletizingRow.QtyMaxCount <= 0;
  226. palletizingRow.MatCodeList = palletizingRow.Locs.Select(x => x.MatCode).ToList().GetMatList();
  227. db.Updateable(palletizingRow).ExecuteCommand();
  228. //更新层信息
  229. palletizingLayer = db.Queryable<WCS_PalletizingLayer>().Includes(x => x.Rows, l => l.Locs).Single(x => x.Id == layer.Id);
  230. var count = palletizingLayer.Rows.Count(x => !x.IsEmpty); //计算所有不空数量
  231. palletizingLayer.IsEmpty = count <= 0;
  232. palletizingLayer.RowCountQty = palletizingLayer.Rows.Count;
  233. palletizingLayer.Finish = false;
  234. palletizingLayer.MatCodeList = palletizingLayer.Rows.SelectMany(x => x.Locs).Select(x => x.MatCode).ToList().GetMatList();
  235. db.Updateable(palletizingLayer).ExecuteCommand();
  236. }
  237. var palletizing1 = palletizing;
  238. palletizing = db.Queryable<WCS_Palletizing>().Includes(x => x.Layers, r => r.Rows, l => l.Locs).Single(x => x.Id == palletizing1.Id);
  239. //计算垛形信息
  240. var goods = palletizing.Layers.Select(x => x.Rows).SelectMany(x => x).Select(x => x.Locs).SelectMany(x => x).ToList();
  241. palletizing.CountQty = goods.Count(x => !x.IsEmpty);
  242. palletizing.MatCodeList = palletizing.Layers.SelectMany(x => x.Rows).SelectMany(x => x.Locs).Select(x => x.MatCode).ToList().GetMatList();
  243. db.Updateable(palletizing).ExecuteCommand();
  244. }
  245. public static string GetMatList(this List<string> matList)
  246. {
  247. return matList.Distinct().Aggregate("", (current, mat) => current + $"[{mat}]");
  248. }
  249. #endregion 工字轮支线分流
  250. }
  251. /// <summary>
  252. /// 垛形位信息
  253. /// </summary>
  254. public class StackPosInfo
  255. {
  256. /// <summary>
  257. /// 任务号
  258. /// </summary>
  259. public int TaskNumber { get; set; }
  260. /// <summary>
  261. /// 是否空置
  262. /// </summary>
  263. public bool IsEmpty { get; set; }
  264. /// <summary>
  265. /// 坐标号
  266. /// </summary>
  267. public string XYNo { get; set; }
  268. /// <summary>
  269. /// 物料编码
  270. /// </summary>
  271. public string MatCode { get; set; }
  272. /// <summary>
  273. /// 正反面
  274. /// </summary>
  275. public int SideNum { get; set; }
  276. /// <summary>
  277. /// 工字轮类型
  278. /// </summary>
  279. public string SpoolType { get; set; }
  280. /// <summary>
  281. /// 是否结束
  282. /// </summary>
  283. public bool Finish { get; set; }
  284. }
  285. }