一楼出库.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. using DBHelper;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using WCS.Core;
  5. using WCS.Entity;
  6. using WCS.Entity.Protocol;
  7. using WCS.Service.Extensions;
  8. using WCS.Service.Helpers;
  9. using WCS.Service.Log;
  10. namespace WCS.Service.Works.Station
  11. {
  12. [WorkTitle(typeof(ProductHandler), "一楼出库堆垛机放货完成后分配下一个地址")]
  13. public class 一楼出库 : Work<StationDeviceGroup>
  14. {
  15. protected override void Do(StationDeviceGroup obj)
  16. {
  17. obj.EX(stationDeviceGroup =>
  18. {
  19. if (stationDeviceGroup.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new DoException("运行中");
  20. if (stationDeviceGroup.Items.Any(v => v.Data.VoucherNo != v.Data2.VoucherNo)) throw new WarnException($"等待任务执行--凭证号不一致");
  21. //成功处理的任务
  22. var finishTaskList = new List<FinishTaskList<int>>();
  23. var devise = new List<FinishTaskList<string>>();
  24. foreach (var dev in stationDeviceGroup.Items)
  25. {
  26. //没有请求
  27. if (dev.Data2.Request != IstationRequest.堆垛机放货完成请求目标地址)
  28. {
  29. InfoLog.INFO_INFO($"{stationDeviceGroup.Entity.CODE}无请求-堆垛机放货完成请求--4");
  30. continue;
  31. }
  32. //没有光电
  33. if (!dev.Data2.Status.HasFlag(IstationStatus.光电状态))
  34. {
  35. InfoLog.INFO_WarnDb($"{dev.Entity.CODE}有请求无光电", stationDeviceGroup.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
  36. continue;
  37. }
  38. devise.Add(new FinishTaskList<string>(dev.Entity.CODE, dev.Entity.Create<StationDevice>()));
  39. }
  40. if (!devise.Any()) return;
  41. DB.Do(db =>
  42. {
  43. foreach (var dev in devise)
  44. {
  45. var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.TYPE == TaskType.出库 && v.SRMSTATION == dev.FinishCode && v.STATUS == TaskStatus.堆垛机完成) ?? throw new WarnException("无任务");
  46. var tasks = db.Default.Set<WCS_TASK>().Where(v => v.TaskGroupKey == task.TaskGroupKey);
  47. if (tasks.Count() != devise.Count) throw new WarnException($"可执行任务数{devise.Count},实际任务数{tasks.Count()}");
  48. if (tasks.Any(v => v.STATUS != TaskStatus.堆垛机完成 && v.STATUS != TaskStatus.执行中)) throw new WarnException("任务异常,同组任务状态不为堆垛机完成或执行中");
  49. task.STATUS = TaskStatus.执行中;
  50. task.CreateStatusLog(db,$"堆垛机放货点分配目标地址{task.ADDRNEXT}", GetType());
  51. finishTaskList.Add(new FinishTaskList<int>(task.ID, dev.Station));
  52. }
  53. db.Default.SaveChanges();
  54. });
  55. DB.Do(db =>
  56. {
  57. foreach (var finish in finishTaskList)
  58. {
  59. var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.ID == finish.FinishCode);
  60. if (task == null) continue;
  61. finish.Station.Data.Tasknum = task.ID;
  62. finish.Station.Data.Goodsstart = finish.Station.Entity.CODE.ToShort();
  63. finish.Station.Data.Goodsend = task.ADDRNEXT.ToShort();
  64. finish.Station.Data.Goodsnum = finishTaskList.Count.ToShort();
  65. finish.Station.Data.CmdType = IstationCmdType.堆垛机放货完成请求目标地址;
  66. finish.Station.Data.VoucherNo++;
  67. }
  68. });
  69. });
  70. }
  71. protected override bool SelectDevice(WCS_DEVICE dev)
  72. {
  73. return _devCodes.Contains(dev.CODE);
  74. }
  75. //月台堆垛机放货设备组
  76. private readonly List<string> _devCodes = new() { "G1473", "G1474", "G1493", "G1491", "G1520", "G1522", "G1545", "G1451" };
  77. }
  78. [WorkTitle(typeof(ProductHandler), "月台出货口完成任务")]
  79. public class 月台完成任务 : Work<StationDeviceGroup>
  80. {
  81. protected override void Do(StationDeviceGroup obj)
  82. {
  83. obj.EX(stationDeviceGroup =>
  84. {
  85. //当前组有一个运行的设备就停止执行
  86. if (stationDeviceGroup.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new DoException("设备运行中");
  87. if (stationDeviceGroup.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.光电状态))) throw new DoException("设备停止运行,但有光电");
  88. //此处逻辑为货物离开后报完成
  89. var devise = new List<FinishTaskList<string>>();
  90. foreach (var dev in stationDeviceGroup.Items)
  91. {
  92. if (dev.Data2.Request != IstationRequest.月台出库口任务完成)
  93. {
  94. InfoLog.INFO_INFO($"{stationDeviceGroup.Entity.CODE}无请求-月台出库口任务完成--3");
  95. continue;
  96. }
  97. if (dev.Data2.Tasknum < 10000)
  98. {
  99. InfoLog.INFO_WarnDb($"{dev.Entity.CODE}有请求无任务号", stationDeviceGroup.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
  100. continue;
  101. };
  102. devise.Add(new FinishTaskList<string>(dev.Entity.CODE, dev.Entity.Create<StationDevice>()));
  103. }
  104. //成功处理的任务
  105. var finishTaskList = new List<FinishTaskList<int>>();
  106. DB.Do(db =>
  107. {
  108. foreach (var dev in devise)
  109. {
  110. var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.ID == dev.Station.Data2.Tasknum);
  111. if (task?.STATUS == TaskStatus.新建) throw new WarnException($"{task.ID}任务状态错误");
  112. task!.STATUS = TaskStatus.已完成;
  113. task.ENDTIME = System.DateTime.Now;
  114. task.UPDATEUSER = "WCS";
  115. task.CreateStatusLog(db,$"任务完成", this.GetType());
  116. finishTaskList.Add(new FinishTaskList<int>(task.ID, dev.Station));
  117. }
  118. db.Default.SaveChanges();
  119. });
  120. DB.Do(db =>
  121. {
  122. foreach (var finish in from finish in finishTaskList let task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.ID == finish.FinishCode) select finish)
  123. {
  124. finish.Station.Data.CmdType = IstationCmdType.月台出库口任务完成;
  125. finish.Station.Data.VoucherNo++;
  126. }
  127. });
  128. });
  129. }
  130. protected override bool SelectDevice(WCS_DEVICE dev)
  131. {
  132. return _devCodes.Contains(dev.CODE);
  133. }
  134. private readonly List<string> _devCodes = new() { "G1469", "G1561", "G1538", "G1574", "G1509" };
  135. }
  136. [WorkTitle(typeof(ProductHandler), "转圈交互点分配目标地址")]
  137. public class 转圈交互点分配目标地址 : Work<StationDeviceGroup>
  138. {
  139. protected override void Do(StationDeviceGroup obj)
  140. {
  141. obj.EX(stationDeviceGroup =>
  142. {
  143. if (stationDeviceGroup.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new DoException("运行中");
  144. if (stationDeviceGroup.Items.Any(v => v.Data.VoucherNo != v.Data2.VoucherNo)) throw new WarnException($"等待任务执行--凭证号不一致");
  145. var devise = new List<FinishTaskList<string>>();
  146. foreach (var dev in stationDeviceGroup.Items)
  147. {
  148. //没有请求
  149. if (dev.Data2.Request != IstationRequest.请求分配目标地址)
  150. {
  151. InfoLog.INFO_INFO($"{stationDeviceGroup.Entity.CODE}无请求-分配目标地址--2");
  152. continue;
  153. }
  154. //没有光电
  155. if (!dev.Data2.Status.HasFlag(IstationStatus.光电状态))
  156. {
  157. InfoLog.INFO_WarnDb($"{dev.Entity.CODE}有请求无光电", stationDeviceGroup.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
  158. continue;
  159. };
  160. if (dev.Data2.Tasknum < 10000)
  161. {
  162. InfoLog.INFO_WarnDb($"{dev.Entity.CODE}有请求有光电无任务", stationDeviceGroup.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
  163. continue;
  164. }
  165. devise.Add(new FinishTaskList<string>(dev.Entity.CODE, dev.Entity.Create<StationDevice>()));
  166. }
  167. DB.Do(db =>
  168. {
  169. foreach (var dev in devise)
  170. {
  171. var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.ID == dev.Station.Data2.Tasknum) ?? throw new WarnException("无任务");
  172. var tasks = db.Default.Set<WCS_TASK>().Where(v => v.TaskGroupKey == task.TaskGroupKey);
  173. if (devise.Count != tasks.Count()) throw new WarnException($"可执行任务数{devise.Count},实际任务数{tasks.Count()}");
  174. dev.Station.Data.Tasknum = task.ID;
  175. dev.Station.Data.Goodsstart = dev.Station.Entity.CODE.ToShort();
  176. dev.Station.Data.Goodsend = task.ADDRNEXT.ToShort();
  177. dev.Station.Data.Goodsnum = devise.Count.ToShort();
  178. dev.Station.Data.CmdType = IstationCmdType.分配目标地址;
  179. dev.Station.Data.VoucherNo++;
  180. }
  181. });
  182. });
  183. }
  184. protected override bool SelectDevice(WCS_DEVICE dev)
  185. {
  186. return dev.CODE == "G1589";
  187. }
  188. }
  189. }