一楼出库.cs 7.5 KB

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