货架调度处理系统.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. using ServiceCenter.Extensions;
  2. using ServiceCenter.Logs;
  3. using ServiceCenter.SqlSugars;
  4. using System.ComponentModel;
  5. using System.Threading.Tasks;
  6. using WCS.Core;
  7. using WCS.Entity;
  8. using WCS.WorkEngineering.Extensions;
  9. using WCS.WorkEngineering.Protocol.Station;
  10. using WCS.WorkEngineering.WebApi.Controllers;
  11. using WCS.WorkEngineering.Worlds;
  12. using static System.Runtime.InteropServices.JavaScript.JSType;
  13. using DeviceFlags = WCS.WorkEngineering.Extensions.DeviceFlags;
  14. namespace WCS.WorkEngineering.Systems
  15. {
  16. /// <summary>
  17. /// 货架调度处理系统
  18. /// </summary>
  19. [BelongTo(typeof(MainWorld))]
  20. [Description("货架调度处理系统")]
  21. public class 货架调度处理系统 : DeviceSystem<Station>
  22. {
  23. protected override bool ParallelDo => true;
  24. protected override bool SaveLogsToFile => true;
  25. private List<Station> devsIn = new List<Station>();
  26. private List<Station> devsOut = new List<Station>();
  27. private List<Station> devsCallOut = new List<Station>();
  28. public 货架调度处理系统()
  29. {
  30. devsIn = Device.All.Where(v => v.HasFlag(DeviceFlags.一楼入库口)).Select(v => new Station(v, this.World)).ToList();
  31. devsOut = Device.All.Where(v => v.HasFlag(DeviceFlags.一楼出库口)).Select(v => new Station(v, this.World)).ToList();
  32. devsCallOut = Device.All.Where(v => v.HasFlag(DeviceFlags.叫料站台)).Select(v => new Station(v, this.World)).ToList();
  33. }
  34. public override void Do(Station obj)
  35. {
  36. //WCS_TaskInfo task = null;//处理完成的任务
  37. try
  38. {
  39. //入库口货架调度
  40. //if (obj.Entity.Code == "1001")
  41. if (obj.Entity.HasFlag(DeviceFlags.入库))
  42. {
  43. if (devsIn.Count(v => v.Data3.Status.HasFlag(StationStatus.PH_Status) && !v.Data3.Status.HasFlag(StationStatus.OT_Status)) == 0)
  44. return;
  45. if (devsIn.Count(v => v.Data3.Status.HasFlag(StationStatus.PH_Status) && !v.Data3.Status.HasFlag(StationStatus.OT_Status)) == 2 &&
  46. devsOut.Count(v => v.Data3.Status.HasFlag(StationStatus.PH_Status)) == 6)
  47. return;
  48. SqlSugarHelper.Do(_db =>
  49. {
  50. var db = _db.Default;
  51. ShelfScheduling(1,db);
  52. #region 1
  53. //foreach (var item in devsIn)
  54. //{
  55. // //入库口有空架子需搬走
  56. // if (item.Data3.Status.HasFlag(StationStatus.PH_Status) && !item.Data3.Status.HasFlag(StationStatus.PH_Status) && !db.Queryable<WCS_AgvTaskInfo>().SplitTable().Any(v => v.Status < AGVTaskStatus.MissionCompleted && v.Position == item.Entity.Code))
  57. // {
  58. // if (item.Data.TaskNumber > 0)
  59. // {
  60. // task = db.Queryable<WCS_TaskInfo>().First(v => v.ID == item.Data.TaskNumber && v.Status < Entity.TaskStatus.Finish);
  61. // if (task != null) throw new KnownException($"{item.Entity.Code}上有任务{item.Data.TaskNumber}未完成", LogLevelEnum.High);
  62. // }
  63. // //出库口不需要空架子,通知wms创建搬运任务
  64. // if (devsOut.Count(v => !v.Data3.Status.HasFlag(StationStatus.PH_Status)) == 0)
  65. // {
  66. // var res = WmsApi.PinKuCarryInTask(item.Entity.Code);
  67. // continue;
  68. // }
  69. // else
  70. // {
  71. // //判断需要架子的出库口
  72. // foreach (var i in devsOut)
  73. // {
  74. // //出库口没有货架且没有到此处的搬运任务
  75. // if (!i.Data3.Status.HasFlag(StationStatus.PH_Status) && !db.Queryable<WCS_AgvTaskInfo>().SplitTable().Any(v => v.Status < AGVTaskStatus.MissionCompleted && v.Position == item.Entity.Code))
  76. // {
  77. // //创建agv搬运任务
  78. // SqlSugarHelper.Do(db =>
  79. // {
  80. // var agvTask = new WCS_AgvTaskInfo()
  81. // {
  82. // ID = db.GetAGVTaskId(),
  83. // TaskType = AGVTaskType.ForkliftFilling,
  84. // Status = AGVTaskStatus.NewBuild,
  85. // Station = i.Entity.Code,
  86. // AddWho = "WCS",
  87. // };
  88. // db.Default.Insertable(agvTask).SplitTable().ExecuteCommand();
  89. // });
  90. // }
  91. // }
  92. // }
  93. // }
  94. //}
  95. #endregion
  96. });
  97. }
  98. //if (obj.Entity.Code == "1002")//叫料口货架调度
  99. else if (obj.Entity.HasFlag(DeviceFlags.出库))
  100. {
  101. ////叫料
  102. //if (!devsCallOut.Any(v => v.Data3.Status.HasFlag(StationStatus.PH_Status) && !v.Data3.Status.HasFlag(StationStatus.PH_Status)))
  103. // return;
  104. //if (devsCallOut.Count(v => v.Data3.Status.HasFlag(StationStatus.PH_Status) && !v.Data3.Status.HasFlag(StationStatus.PH_Status)) == 0)
  105. // return;
  106. //出库口补空货架
  107. SqlSugarHelper.Do(_db =>
  108. {
  109. var db = _db.Default;
  110. //ShelfScheduling(2, db);
  111. //有出库任务待执行
  112. if (db.Queryable<WCS_TaskInfo>().Any(v => v.Status == Entity.TaskStatus.WaitingToExecute))
  113. {
  114. foreach (var item in devsOut)
  115. {
  116. if (db.Queryable<WCS_TaskInfo>().Any(v => v.Status == Entity.TaskStatus.WaitingToExecute && v.SrmStation == item.Entity.Code) && !item.Data3.Status.HasFlag(StationStatus.PH_Status)
  117. && !item.Data3.Status.HasFlag(StationStatus.OT_Status) && !db.Queryable<WCS_AgvTaskInfo>().SplitTable().Any(v => v.Status < AGVTaskStatus.MissionCompleted && v.Position == item.Entity.Code))
  118. {
  119. //入库口没有空货架可用,通知WMS生成搬运任务
  120. //if (devsIn.Count(v => !v.Data3.Status.HasFlag(StationStatus.PH_Status) && !v.Data3.Status.HasFlag(StationStatus.OT_Status)) == 0)
  121. //{
  122. var res = WmsApi.PinKuCarryOutTask(item.Entity.Code);
  123. continue;
  124. //}
  125. }
  126. //if (!(db.Queryable<WCS_TaskInfo>().Any(v => v.Status == Entity.TaskStatus.WaitingToExecute && v.SrmStation == item.Entity.Code) && !item.Data3.Status.HasFlag(StationStatus.PH_Status)
  127. // && !item.Data3.Status.HasFlag(StationStatus.OT_Status)
  128. // && !db.Queryable<WCS_AgvTaskInfo>().SplitTable().Any(v => v.Status < AGVTaskStatus.MissionCompleted && v.Position == item.Entity.Code)))
  129. //{
  130. // throw new KnownException($"{item.Entity.Code}上不满足搬运条件申请", LogLevelEnum.High);
  131. //}
  132. //else
  133. //{
  134. // //入库口没有空货架可用,通知WMS生成搬运任务
  135. // if (devsIn.Count(v => !v.Data3.Status.HasFlag(StationStatus.PH_Status) && !v.Data3.Status.HasFlag(StationStatus.OT_Status)) == 0)
  136. // {
  137. // var res = WmsApi.PinKuCarryOutTask(item.Entity.Code);
  138. // continue;
  139. // }
  140. //}
  141. }
  142. }
  143. });
  144. }
  145. }
  146. catch (Exception ex)
  147. {
  148. throw new KnownException(ex.Message, LogLevelEnum.High);
  149. }
  150. }
  151. private void ShelfScheduling(int type,SqlSugar.SqlSugarScopeProvider db)
  152. {
  153. List<Station> items = null;
  154. items = type == 1 ? devsIn : devsCallOut;
  155. foreach (var item in items)
  156. {
  157. //有空架子需搬走
  158. if (item.Data3.Status.HasFlag(StationStatus.PH_Status) && !item.Data3.Status.HasFlag(StationStatus.OT_Status) && !db.Queryable<WCS_AgvTaskInfo>().SplitTable().Any(v => v.Status < AGVTaskStatus.MissionCompleted && v.Station == item.Entity.Code) && item.Data.GoodsStart == item.Entity.Code.ToShort())
  159. {
  160. var task = db.Queryable<WCS_TaskInfo>().First(v => v.Status < Entity.TaskStatus.Finish && v.SrmStation == item.Entity.Code);
  161. if (task != null) throw new KnownException($"{item.Entity.Code}上有任务{task.ID}未完成,搬运任务稍后申请", LogLevelEnum.High);
  162. //出库口不需要空架子,通知wms创建搬运任务
  163. if (devsOut.Count(v => !v.Data3.Status.HasFlag(StationStatus.PH_Status) && !v.Data3.Status.HasFlag(StationStatus.OT_Status)) == 0)
  164. {
  165. var res = WmsApi.PinKuCarryInTask(item.Entity.Code);
  166. continue;
  167. }
  168. else
  169. {
  170. //判断需要架子的出库口
  171. foreach (var i in devsOut)
  172. {
  173. //出库口没有货架且没有到此处的搬运任务
  174. if (!i.Data3.Status.HasFlag(StationStatus.PH_Status) && !i.Data3.Status.HasFlag(StationStatus.OT_Status) && !db.Queryable<WCS_AgvTaskInfo>().SplitTable().Any(v => v.Status < AGVTaskStatus.MissionCompleted && v.Position == i.Entity.Code)
  175. && !db.Queryable<WCS_AgvTaskInfo>().SplitTable().Any(v => v.Status < AGVTaskStatus.MissionCompleted && v.Station == item.Entity.Code))
  176. {
  177. //创建agv搬运任务
  178. SqlSugarHelper.Do(db =>
  179. {
  180. var agvTask = new WCS_AgvTaskInfo()
  181. {
  182. ID = db.GetAGVTaskId(),
  183. TaskType = AGVTaskType.Transport,
  184. Status = AGVTaskStatus.NewBuild,
  185. Station = item.Entity.Code,
  186. Position = i.Entity.Code,
  187. WorkShop = 222,
  188. AddWho = "WCS",
  189. };
  190. db.Default.Insertable(agvTask).SplitTable().ExecuteCommand();
  191. });
  192. }
  193. }
  194. }
  195. }
  196. }
  197. }
  198. public override bool Select(Device dev)
  199. {
  200. //return dev.HasFlag(DeviceFlags.货架调度);
  201. return dev.Code is "1001" or "1002";
  202. }
  203. }
  204. }