出库交通管制.cs 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. using DBHelper;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using WCS.Core;
  8. using WCS.Entity;
  9. using WCS.Entity.Protocol;
  10. namespace WCS.Service.Works.Stations
  11. {
  12. //[WorkTitle(typeof(ProductHandler), "出库交通管制", true)]
  13. public class 出库交通管制 : DeviceWork<Device<IStation521, IStation520>>
  14. {
  15. protected override void Do(Device<IStation521, IStation520> obj)
  16. {
  17. if (Ltc.Do(obj, v => v.Data2.CONFIRM == true))
  18. return;
  19. if (Ltc.Do(obj, v => v.Data.TASKNUM == 0))
  20. return;
  21. if (Ltc.Do(obj, v => v.Data.PH_STATUS == false))
  22. return;
  23. if (Ltc.Do(obj, v => v.Data.GOODSEND != v.Entity.Code()))
  24. return;
  25. DB.Do(db =>
  26. {
  27. var task = db.Default.Set<WCS_TASK>().Find(obj.Data.TASKNUM);
  28. if (task.TYPE == TaskType.出库)
  29. {
  30. //var outPath = obj.Entity.GetPath(task.ADDRTO);
  31. //var tasks = db.Default.Set<WCS_TASK>().Where(v => v.TYPE == TaskType.入库 || v.TYPE == TaskType.组盘)
  32. //.Where(v => v.STATUS < WCS.Entity.TaskStatus.堆垛机执行 && v.STATUS > WCS.Entity.TaskStatus.新建)
  33. //.Where(v => v.ADDRFROM == task.ADDRTO).ToArray();
  34. ////tasks = tasks.Where(v => v.ID == 17328).ToArray();
  35. //var arr = tasks.Select(v =>
  36. //{
  37. // var current = v.AddrCurrent(db);
  38. // var path = Device.Find(current).GetPath(v.ADDRNEXT);
  39. // if (path == null)
  40. // path = new List<WCS_DEVICE>();
  41. // return new
  42. // {
  43. // Task = v,
  44. // Path = path.Concat(new List<WCS_DEVICE> { Device.Find(current) })
  45. // };
  46. //}).ToArray();
  47. //var t = arr.Where(v => v.Path.Intersect(outPath).Where(v => v.IsConv()).Count() > 0).FirstOrDefault();
  48. //if (t != null)
  49. //{
  50. // throw new Exception("交通管制,与任务" + t.Task.ID + "路径冲突");
  51. //}
  52. var any = false;
  53. if (obj.Entity.CODE == "2366")
  54. any = Device.Find("2123", "2125", "2126", "2327", "2128", "2131").Select(v => v.Device<IStation521>()).Where(v => v.Data.GOODSEND == 2153 || v.Data.GOODSEND == 2161).Any();
  55. else
  56. any = Device.Find("2114", "2116", "2117", "2328", "2119", "2122").Select(v => v.Device<IStation521>()).Where(v => v.Data.GOODSEND == 2359).Any();
  57. if (any)
  58. throw new Exception($"交通管制,有正在执行的入库任务");
  59. var q = db.Default.Set<WCS_AGVTask>().Where(v => v.TaskType == AGVTaskType.入库 && v.Status < AGVTaskStatus.完成扫码 && v.Status > AGVTaskStatus.新建);
  60. if (task.ADDRTO == "2086")
  61. {
  62. q = q.Where(v => v.Station == "2088");
  63. }
  64. else
  65. {
  66. q = q.Where(v => v.Station == task.ADDRTO);
  67. }
  68. var agvtask = q.FirstOrDefault();
  69. if (agvtask != null)
  70. {
  71. throw new Exception("交通管制,与AGV任务" + agvtask.ID + "冲突");
  72. }
  73. task.ADDRNEXT = task.ADDRTO;
  74. task.UPDATETIME = DateTime.Now;
  75. db.Default.SaveChanges();
  76. obj.Data2.GOODSEND = short.Parse(task.ADDRNEXT);
  77. obj.Data2.TASKNUM = task.ID;
  78. obj.Data2.GOODSCODE = obj.Data.GOODSCODE;
  79. obj.Data2.GOODSSIZE = obj.Data.GOODSSIZE;
  80. obj.Data2.GOODSTYPE = obj.Data.GOODSTYPE;
  81. obj.Data2.HEIGHT = obj.Data.HEIGHT;
  82. obj.Data2.CONFIRM = true;
  83. }
  84. });
  85. }
  86. protected override bool SelectDevice(WCS_DEVICE dev)
  87. {
  88. return false;// new string[] { "2108" }.Contains(dev.CODE);
  89. }
  90. }
  91. [WorkTitle(typeof(ProductHandler), "交管2325", true)]
  92. public class 交管2325 : DeviceWork<Device<IStation521, IStation520>>
  93. {
  94. protected override void Do(Device<IStation521, IStation520> obj)
  95. {
  96. if (Ltc.Do(obj, v => v.Data2.CONFIRM == true))
  97. return;
  98. if (Ltc.Do(obj, v => v.Data.TASKNUM == 0))
  99. return;
  100. if (Ltc.Do(obj, v => v.Data.PH_STATUS == false))
  101. return;
  102. if (Ltc.Do(obj, v => v.Data.GOODSEND != v.Entity.Code()))
  103. return;
  104. //if (Ltc.Do(obj, v => !v.Entity.WakeupOn(5000, "交通管制")))
  105. // return;
  106. DB.Do(db =>
  107. {
  108. var task = db.Default.Set<WCS_TASK>().Find(obj.Data.TASKNUM);
  109. if (task.TYPE == TaskType.出库)
  110. {
  111. var rgv = Device.Find("RGV5").Device<IRGV521, IRGV520>();
  112. if (rgv.Data2.Trigger == 1)
  113. throw new Exception("等待WCS与RGV5交互完成");
  114. var outqty = (rgv.Data.DestPosition == 2081 && rgv.Data.SystemStatus != RGVRunStatus.空闲) ? 1 : 0;
  115. outqty += Device.Where(v => "2325,2081,2083,2084,2086".Split(',').Contains(v.CODE)).Select(v => v.Device<IStation521, IStation520>())
  116. .Where(v => v.Data.GOODSEND == 2086 || (v.Data2.GOODSEND == 2086 && v.Data2.CONFIRM))
  117. .Count();
  118. if (outqty >= 2)
  119. {
  120. throw new Exception($"流量控制,放行任务数已达{outqty}");
  121. }
  122. var inqty = Device.Where(v => "2081,2083,2088".Split(',').Contains(v.CODE)).Select(v => v.Device<IStation521,IStation520>())
  123. .Where(v => v.Data.GOODSEND == 2324||(v.Data2.GOODSEND==2324&&v.Data2.CONFIRM))
  124. .Count();
  125. if (inqty > 0)
  126. {
  127. throw new Exception($"交通管制,正在入库的任务数{inqty}");
  128. }
  129. //var outPath = obj.Entity.GetPath(task.ADDRTO);
  130. //var tasks = db.Default.Set<WCS_TASK>().Where(v => v.TYPE == TaskType.入库).Where(v => v.ADDRFROM == "2088")
  131. //.Where(v => v.STATUS < WCS.Entity.TaskStatus.堆垛机执行 && v.STATUS > WCS.Entity.TaskStatus.新建).ToArray();
  132. //var arr = tasks.Select(v =>
  133. //{
  134. // var current = v.AddrCurrent(db);
  135. // var path = Device.Find(current).GetPath(v.ADDRNEXT);
  136. // if (path == null)
  137. // path = new List<WCS_DEVICE>();
  138. // return new
  139. // {
  140. // Task = v,
  141. // Path = path.Concat(new List<WCS_DEVICE> { Device.Find(current) })
  142. // };
  143. //}).ToArray();
  144. //var t = arr.Where(v => v.Path.Intersect(outPath).Where(v => v.IsConv()).Count() > 0).FirstOrDefault();
  145. //if (t != null)
  146. //{
  147. // throw new Exception("交通管制,与任务" + t.Task.ID + "路径冲突");
  148. //}
  149. task.ADDRNEXT = task.ADDRTO;
  150. task.UPDATETIME = DateTime.Now;
  151. db.Default.SaveChanges();
  152. obj.Data2.GOODSEND = short.Parse(task.ADDRNEXT);
  153. obj.Data2.TASKNUM = task.ID;
  154. obj.Data2.GOODSCODE = obj.Data.GOODSCODE;
  155. obj.Data2.GOODSSIZE = obj.Data.GOODSSIZE;
  156. obj.Data2.GOODSTYPE = obj.Data.GOODSTYPE;
  157. obj.Data2.HEIGHT = obj.Data.HEIGHT;
  158. obj.Data2.CONFIRM = true;
  159. }
  160. });
  161. }
  162. protected override bool SelectDevice(WCS_DEVICE dev)
  163. {
  164. return new string[] { "2325" }.Contains(dev.CODE);
  165. }
  166. }
  167. }