分线计算09.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. using System.ComponentModel;
  2. using WCS.Core;
  3. using WCS.Entity.Protocol.Station;
  4. namespace WCS.WorkEngineering.Systems
  5. {
  6. /// <summary>
  7. /// 分线计算09
  8. /// </summary>
  9. //[BelongTo(typeof(NoInteractionWorld))]
  10. [Description("分线计算09")]
  11. public class 分线计算09 : DeviceSystem<Device<IStation520>>
  12. {
  13. protected override bool ParallelDo => true;
  14. protected override bool SaveLogsToFile => true;
  15. public override void Do(Device<IStation520> obj)
  16. {
  17. //SqlSugarHelper.Do(_db =>
  18. //{
  19. // //获取所有待执行的任务
  20. // var db = _db.Default;
  21. // var taskList = db.Queryable<WCS_TaskInfo>().Where(x => x.Status == TaskStatus.WaitingToExecute && x.Type == TaskType.SetPlate && x.AddrFrom == "Robot").Take(1).ToList();
  22. // //开始对任务进行处理
  23. // foreach (var taskInfo in taskList)
  24. // {
  25. // //TODO:暂时不来考虑动态计算可前往的目标
  26. // var nextAdd = taskInfo.WarehouseCode switch
  27. // {
  28. // "1N" => "455",
  29. // "1S" => "455",
  30. // "2N" => "455",
  31. // "2S" => "455",
  32. // "3N" => "455",
  33. // "3S" => "455",
  34. // _ => "0"
  35. // };
  36. // //获取这个地址的下一个地址集合
  37. // var cacheLineDevList = Device.All.First(x => x.Code == nextAdd).Targets.Where(x => x.HasFlag(DeviceFlags.桁架缓存放行点));
  38. // var cacheLineCodes = cacheLineDevList.Select(x => x.Code.ToShort());
  39. // var cacheLineList = db.Queryable<WCS_CacheLine>().Includes(x => x.Locations).ToList();
  40. // #region 跟据缓存信息寻找可以到达的缓存点
  41. // //找到当前任务可用的缓存线信息
  42. // var cacheLine = cacheLineList.Where(x => x.Locations.Any(l => l is { InStock: false, IsEmpty: false })).FirstOrDefault(x => cacheLineCodes.Contains(x.LocationNo) && x.MatCodeList.Contains(taskInfo.MatCode) && !x.InStock);
  43. // if (cacheLine != null)//这个任务可以直接去一条线体,不需要新建缓存信息
  44. // {
  45. // //找到这条线体中序号最小的一条位信息 非空置且无货
  46. // var cacheLoc = cacheLine.Locations.Where(x => x is { InStock: false, IsEmpty: false }).MinBy(x => x.XYNo);
  47. // if (cacheLoc != null)
  48. // {
  49. // cacheLoc = db.Queryable<WCS_CacheLineLoc>().Single(x => x.Id == cacheLoc.Id);
  50. // cacheLoc.InStock = true;
  51. // cacheLoc.TaskId = taskInfo.ID;
  52. // cacheLoc.EditTime = DateTime.Now;
  53. // db.Updateable(cacheLoc).ExecuteCommand();
  54. // //WCS任务相关信息
  55. // taskInfo.Status = TaskStatus.FinishOfShunt;
  56. // taskInfo.AddrNext = cacheLine.LocationNo.ToString();
  57. // taskInfo.EditWho = "WCS";
  58. // taskInfo.EditTime = DateTime.Now;
  59. // taskInfo.AddWCS_TASK_DTL(_db, obj.Entity.Code, taskInfo.AddrNext, $"完成分库计算,目标地址:{cacheLine.LocationNo}");
  60. // db.Updateable(taskInfo).ExecuteCommand();
  61. // taskInfo.UpdateRedisHash();
  62. // return;
  63. // }
  64. // }
  65. // #endregion 跟据缓存信息寻找可以到达的缓存点
  66. // #region 初始化一个信息的缓存信息
  67. // //找到所有当前轮子可以去的垛形
  68. // var palletizingList = db.Queryable<WCS_Palletizing>()
  69. // .Includes(x => x.Layers, r => r.Rows, l => l.Locs)
  70. // .Where(x => x.MatCodeList.Contains(taskInfo.MatCode) && !x.Finish).ToList().Where(x => x.Layers.SelectMany(x => x.Rows).Any(r => r.LineCode == null)).OrderBy(x => x.AddTime).ToList();
  71. // //如果没有对应的垛形信息就初始化一个垛形信息
  72. // if (palletizingList.Count <= 0)
  73. // {
  74. // taskInfo.InitStackStructure();
  75. // return;
  76. // }
  77. // foreach (var palletizing in palletizingList)
  78. // {
  79. // //TODO:当前不考虑不按顺序码垛的情况
  80. // //按码垛顺序找到一个最近的没有码垛成功的行,
  81. // //先找层:未空置、未结束 TODO:暂不考虑所有层全部结束,但是垛形信息未清除的情况
  82. // var palletizingLayer = palletizing.Layers
  83. // .Where(x => !x.IsEmpty)
  84. // .Where(x => !x.Finish)
  85. // .Where(x => x.MatCodeList.Contains(taskInfo.MatCode))
  86. // .Where(x => x.Rows.Any(r => r.CacheLineId == 0))
  87. // .MinBy(x => x.LayerNo);
  88. // //如果没有哪一层需要这个物料号,就初始化一个新的垛形信息
  89. // if (palletizingLayer == null)
  90. // {
  91. // taskInfo.InitStackStructure();
  92. // return;
  93. // }
  94. // //再找行:未空置、未结束
  95. // var palletizingRow = palletizingLayer.Rows.Where(x => x is { IsEmpty: false, Finish: false } && x.MatCodeList.Contains(taskInfo.MatCode) && x.CacheLineId == 0)
  96. // .MinBy(x => x.RowNo);
  97. // //如果没有哪一行需要这个物料号,就初始化一个新的垛形信息
  98. // if (palletizingRow == null)
  99. // {
  100. // taskInfo.InitStackStructure();
  101. // return;
  102. // }
  103. // //走到这一步就表示没有哪一段线体缓存了当前物料,需要选一段新的线体进行缓存
  104. // //TODO:暂时不处理就近分线的逻辑
  105. // //获取一个当前可以使用的分配锁
  106. // var devCode = cacheLineDevList.Select(x => x.Code.ToShort()).FirstOrDefault(x => !cacheLineList.Select(s => s.LocationNo).Contains(x));
  107. // if (devCode == 0)
  108. // {
  109. // World.Log($"无可用线体:{taskInfo.ID}");
  110. // return;
  111. // }
  112. // //开始初始化缓存位信息
  113. // cacheLine = new WCS_CacheLine()
  114. // {
  115. // LocationNo = devCode,
  116. // AddTime = DateTime.Now,
  117. // PalletizingRowId = palletizingRow.Id,
  118. // InStock = false,
  119. // Put = false,
  120. // MatCodeList = palletizingRow.MatCodeList
  121. // };
  122. // var res = db.Insertable(cacheLine).ExecuteReturnEntity();
  123. // palletizingRow = db.Queryable<WCS_PalletizingRow>().Includes(x => x.Locs).Single(x => x.Id == palletizingRow.Id);
  124. // palletizingRow.Locs = palletizingRow.Locs.OrderBy(x => x.XYNo).ToList();
  125. // palletizingRow.CacheLineId = res.Id;
  126. // palletizingRow.EditTime = DateTime.Now;
  127. // db.Updateable(palletizingRow).ExecuteCommand();
  128. // for (var i = 0; i < palletizingRow.Locs.Count; i++)
  129. // {
  130. // var loc = new WCS_CacheLineLoc()
  131. // {
  132. // XYNo = palletizingRow.Locs[i].XYNo,
  133. // InStock = i == 0,
  134. // IsEmpty = palletizingRow.Locs[i].IsEmpty,
  135. // MatCode = palletizingRow.Locs[i].MatCode,
  136. // TaskId = i == 0 ? taskInfo.ID : 0,
  137. // CacheLineId = res.Id
  138. // };
  139. // db.Insertable(loc).ExecuteCommand();
  140. // }
  141. // taskInfo.Status = TaskStatus.FinishOfShunt;
  142. // taskInfo.AddrNext = devCode.ToString();
  143. // taskInfo.EditWho = "WCS";
  144. // taskInfo.EditTime = DateTime.Now;
  145. // taskInfo.AddWCS_TASK_DTL(_db, obj.Entity.Code, taskInfo.AddrNext, $"完成分库计算,目标地址:{cacheLine.LocationNo}");
  146. // db.Updateable(taskInfo).ExecuteCommand();
  147. // taskInfo.UpdateRedisHash();
  148. // return;
  149. // }
  150. // #endregion 初始化一个信息的缓存信息
  151. // }
  152. //});
  153. }
  154. public override bool Select(Device dev)
  155. {
  156. return dev.Code == nameof(分线计算09);
  157. }
  158. }
  159. public class LineCache
  160. {
  161. /// <summary>
  162. /// 位置
  163. /// </summary>
  164. public string Location { get; set; }
  165. /// <summary>
  166. /// 是否放行
  167. /// </summary>
  168. public bool IsPut { get; set; }
  169. /// <summary>
  170. /// 具体缓存信息
  171. /// </summary>
  172. public List<LineCacheInfo> LineInfos { get; set; }
  173. }
  174. /// <summary>
  175. /// 线体缓存组员
  176. /// </summary>
  177. public class LineCacheInfo
  178. {
  179. /// <summary>
  180. /// 序号
  181. /// </summary>
  182. public string Index { get; set; }
  183. /// <summary>
  184. /// 物料号
  185. /// </summary>
  186. public string MatCode { get; set; }
  187. /// <summary>
  188. /// 任务号
  189. /// </summary>
  190. public int TaskNumber { get; set; }
  191. /// <summary>
  192. /// 是否有货
  193. /// </summary>
  194. public bool InStock { get; set; }
  195. /// <summary>
  196. /// 是否空置
  197. /// </summary>
  198. public bool IsEmpty { get; set; }
  199. }
  200. }