一楼出库.cs 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  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(obj =>
  18. {
  19. if (obj.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new DoException("运行中");
  20. if (obj.Items.Any(v => v.Data.VoucherNo != v.Data2.VoucherNo)) throw new WarnException($"等待任务执行--凭证号不一致");
  21. //成功处理的任务
  22. var finishTaskList = new List<FinishTaskList<int>>();
  23. DB.Do(db =>
  24. {
  25. var devs = new List<FinishTaskList<string>>();
  26. foreach (var dev in obj.Items)
  27. {
  28. //没有请求
  29. if (dev.Data2.Request != IstationRequest.堆垛机放货完成请求目标地址)
  30. {
  31. InfoLog.INFO_INFO($"{obj.Entity.CODE}无请求-堆垛机放货完成请求--4");
  32. continue;
  33. }
  34. //没有光电
  35. if (!dev.Data2.Status.HasFlag(IstationStatus.光电状态))
  36. {
  37. InfoLog.INFO_WarnDb($"{dev.Entity.CODE}有请求无光电", obj.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
  38. continue;
  39. };
  40. devs.Add(new FinishTaskList<string>(dev.Entity.CODE, dev.Entity.Create<StationDevice>()));
  41. }
  42. foreach (var dev in devs)
  43. {
  44. var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.TYPE == TaskType.出库 && v.SRMSTATION == dev.FinishCode && v.STATUS == TaskStatus.堆垛机完成) ?? throw new WarnException("无任务");
  45. var tasks = db.Default.Set<WCS_TASK>().Where(v => v.TaskGroupKey == task.TaskGroupKey);
  46. if (tasks.Any(v => v.STATUS != TaskStatus.堆垛机完成 && v.STATUS != TaskStatus.执行中)) throw new WarnException("任务异常,同组任务状态不为堆垛机完成或执行中");
  47. task.STATUS = TaskStatus.执行中;
  48. task.CreateStatusLog(db, $"状态由[{TaskStatus.堆垛机完成}]变更为[{task.STATUS}]-{obj.Entity.Code}", this.GetType());
  49. finishTaskList.Add(new FinishTaskList<int>(task.ID, dev.Station));
  50. }
  51. db.Default.SaveChanges();
  52. });
  53. DB.Do(db =>
  54. {
  55. foreach (var finish in finishTaskList)
  56. {
  57. var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.ID == finish.FinishCode);
  58. if (task == null) continue;
  59. finish.Station.Data.Tasknum = task.ID;
  60. finish.Station.Data.Goodsstart = obj.Entity.CODE.ToShort();
  61. finish.Station.Data.Goodsend = task.ADDRNEXT.ToShort();
  62. finish.Station.Data.Goodsnum = finishTaskList.Count.ToShort();
  63. finish.Station.Data.CmdType = IstationCmdType.堆垛机放货完成请求目标地址;
  64. finish.Station.Data.VoucherNo++;
  65. }
  66. });
  67. });
  68. }
  69. protected override bool SelectDevice(WCS_DEVICE dev)
  70. {
  71. return devCodes.Contains(dev.CODE);
  72. }
  73. //月台堆垛机放货设备组
  74. private List<string> devCodes = new List<string>() { "G1473", "G1474", "G1493", "G1491", "G1520", "G1522", "G1545", "G1451" };
  75. }
  76. [WorkTitle(typeof(ProductHandler), "月台出货口完成任务")]
  77. public class 月台完成任务 : Work<StationDeviceGroup>
  78. {
  79. protected override void Do(StationDeviceGroup obj)
  80. {
  81. obj.EX(obj =>
  82. {
  83. //当前组有一个运行的设备就停止执行
  84. if (obj.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new DoException("设备运行中");
  85. if (obj.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.光电状态))) throw new DoException("设备停止运行,但有光电"); //此处逻辑为货物离开后报完成
  86. //成功处理的任务
  87. var finishTaskList = new List<FinishTaskList<int>>();
  88. DB.Do(db =>
  89. {
  90. var devs = new List<FinishTaskList<string>>();
  91. foreach (var dev in obj.Items)
  92. {
  93. if (dev.Data2.Request != IstationRequest.月台出库口任务完成)
  94. {
  95. InfoLog.INFO_INFO($"{obj.Entity.CODE}无请求-月台出库口任务完成--3");
  96. continue;
  97. }
  98. if (dev.Data2.Tasknum < 10000)
  99. {
  100. InfoLog.INFO_WarnDb($"{dev.Entity.CODE}有请求无任务号", obj.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
  101. continue;
  102. };
  103. devs.Add(new FinishTaskList<string>(dev.Entity.CODE, dev.Entity.Create<StationDevice>()));
  104. }
  105. foreach (var dev in devs)
  106. {
  107. var task = db.Default.Set<WCS_TASK>().Where(v => v.ID == dev.Station.Data2.Tasknum).FirstOrDefault();
  108. if (task.STATUS == TaskStatus.新建) throw new WarnException($"{task.ID}任务状态错误");
  109. task.STATUS = TaskStatus.已完成;
  110. task.ENDTIME = System.DateTime.Now;
  111. task.UPDATEUSER = "WCS";
  112. task.CreateStatusLog(db, $"状态由[{TaskStatus.执行中}]变更为[{task.STATUS}]-{dev.FinishCode}", this.GetType());
  113. finishTaskList.Add(new FinishTaskList<int>(task.ID, dev.Station));
  114. }
  115. db.Default.SaveChanges();
  116. });
  117. DB.Do(db =>
  118. {
  119. foreach (var finish in finishTaskList)
  120. {
  121. var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.ID == finish.FinishCode);
  122. finish.Station.Data.CmdType = IstationCmdType.月台出库口任务完成;
  123. finish.Station.Data.VoucherNo++;
  124. }
  125. });
  126. });
  127. }
  128. protected override bool SelectDevice(WCS_DEVICE dev)
  129. {
  130. return devCodes.Contains(dev.CODE);
  131. }
  132. private List<string> devCodes = new List<string>() { "G1469", "G1561", "G1538", "G1574", "G1509" };
  133. }
  134. }