原膜巷道分配.cs 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  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. Device<IStation521>[] DevArr;
  16. TunnelInfo[] TunnelArr;
  17. class TunnelInfo
  18. {
  19. public WCS_DEVICE Tunnel;
  20. public Device<IStation521> DockIn;
  21. public Device<IStation521> DockWating;
  22. public Device<ISC521> SC;
  23. }
  24. public 原膜巷道分配()
  25. {
  26. DevArr = Device.Where(v => new string[]{ "2017", "2029", "2044", "2058" }
  27. .Contains(v.CODE))
  28. .Select(v => v.Device<IStation521>())
  29. .OrderBy(v => v.Entity.CODE)
  30. .ToArray();
  31. TunnelArr = Device.Where(v => v.IsTunnel() && v.CODE.StartsWith("TY")).Select(t =>
  32. {
  33. var inbound = Device.Where(v => v.IsConv() && v.ROUTES.Any(d => d.NEXT.CODE == t.CODE)).Select(v => v.Device<IStation521>()).FirstOrDefault();
  34. return new TunnelInfo
  35. {
  36. Tunnel = t,
  37. DockIn = inbound,
  38. DockWating = Device.Where(v => v.IsConv() && v.ROUTES.Any(d => d.NEXT.CODE == inbound.Entity.CODE)).Select(v => v.Device<IStation521>()).FirstOrDefault(),
  39. SC = t.ROUTES.Where(d => d.NEXT.IsSC()).Select(d => d.NEXT.Device<ISC521>()).FirstOrDefault()
  40. };
  41. }).ToArray();
  42. }
  43. protected override bool SelectDevice(WCS_DEVICE dev)
  44. {
  45. return DevArr.Any(d=>d.Entity.CODE==dev.CODE);
  46. }
  47. protected override void Do(Device<IStation521, IStation520> obj)
  48. {
  49. if (Ltc.Do(obj, v => v.Data2.CONFIRM == true))
  50. return;
  51. if (Ltc.Do(obj, v => v.Data.TASKNUM == 0))
  52. return;
  53. if (Ltc.Do(obj, v => v.Data.PH_STATUS == false))
  54. return;
  55. if (Ltc.Do(obj, v => v.Data.GOODSEND != v.Entity.Code()))
  56. return;
  57. DB.Do(db =>
  58. {
  59. var task = db.Default.Find<WCS_TASK>(obj.Data.TASKNUM);
  60. if (task.STATUS >= WCS.Entity.TaskStatus.已完成)
  61. {
  62. Ltc.Log($"任务[{task.ID}][{task.STATUS}],请速至【{obj.Entity.CODE}】处理,避免入库通道堵塞!");
  63. throw new Exception($"任务[{task.ID}][{task.STATUS}],请速至【{obj.Entity.CODE}】处理,避免入库通道堵塞!");
  64. }
  65. var res = WMS.GetTunnelList(task.WMSTASK, obj.Entity.CODE);
  66. try
  67. {
  68. if (!res.ResType)
  69. {
  70. throw new Exception($"分配巷道失败:{res.ResMessage}");
  71. }
  72. var tArr = TunnelArr;
  73. if (obj.Entity.CODE == "2029")
  74. tArr = TunnelArr.Skip(1).ToArray();
  75. else if (obj.Entity.CODE == "2044")
  76. tArr = TunnelArr.Skip(3).ToArray();
  77. else if (obj.Entity.CODE == "2058")
  78. tArr = TunnelArr.Skip(5).ToArray();
  79. var grp = tArr.GroupBy(v => v.DockWating.Entity).ToArray();
  80. var tsstr = res.TunnelNum.Split(',').Select(v => "TY" + v).ToList();
  81. //grp = grp.Where(v => v.Any(d => tsstr.Contains(d.Tunnel.CODE))).ToArray();
  82. if (grp.Length == 0)
  83. throw new Exception($"入口分配无可用巷道{res.TunnelNum}");
  84. Ltc.Log($"入口分配,可用入口数{grp.Length}");
  85. //grp = grp.Where(v => v.Any(d =>
  86. //{
  87. // try
  88. // {
  89. // return d.SC.Data.Alarm == false && d.SC.Data.Mode == SCMode.远程;
  90. // }
  91. // catch
  92. // {
  93. // return false;
  94. // }
  95. //}
  96. //)).ToArray();
  97. if (grp.Length == 0)
  98. throw new Exception($"堆垛机全不可用");
  99. Ltc.Log($"堆垛机状态正常的入口数{grp.Length}");
  100. Device<IStation521> next = null;
  101. var g = grp.Where(v => v.Key.CODE == obj.Entity.CODE).FirstOrDefault();
  102. if (g != null)
  103. {
  104. if (g.Select(v => Locked(v.DockIn.Entity)).Sum() == 0)
  105. {
  106. next = g.Select(v => v)
  107. .Where(v =>
  108. {
  109. try
  110. {
  111. return v.SC.Data.Alarm == false && v.SC.Data.Mode == SCMode.远程;
  112. }
  113. catch
  114. {
  115. return false;
  116. }
  117. })
  118. .Where(v => tsstr.Contains(v.Tunnel.CODE))
  119. .OrderBy(v => v.SC.Data.Status == SCRunStatus.空闲 ? 0 : 1)
  120. .ThenBy(v => tsstr.IndexOf(v.Tunnel.CODE))
  121. .Select(v => v.DockIn)
  122. .FirstOrDefault();
  123. }
  124. }
  125. if (next == null)
  126. {
  127. var arr = grp.Where(v => v.Key.CODE != obj.Entity.CODE)
  128. //.Where(v => v.Sum(d => Locked(d.DockIn.Entity)) == 0)//干道不缓存
  129. .Select(v => v.Key.Device<IStation521>()).ToArray();
  130. if (arr.Length == 0)
  131. {
  132. throw new Exception($"无巷道可用{res.TunnelNum}");
  133. }
  134. next = arr.OrderBy(v => v.Entity.CODE).FirstOrDefault();
  135. if (next == null || Locked(next.Entity) > 0)
  136. throw new Exception($"排队中{res.TunnelNum}");
  137. }
  138. task.ADDRNEXT = next.Entity.CODE;
  139. task.UPDATETIME = DateTime.Now;
  140. task.ADDRTO = next.Entity.CODE;
  141. db.Default.SaveChanges();
  142. obj.Data2.TASKNUM = obj.Data.TASKNUM;
  143. obj.Data2.GOODSEND = next.Entity.Code();
  144. obj.Data2.CONFIRM = true;
  145. }
  146. catch(Exception ex)
  147. {
  148. var devs = Device.Where(v=>v.IsConv()).Where(v => v.Code() > 2017 && v.Code() < 2062).Select(v => v.Device<IStation521>()).ToArray();
  149. var arr = devs.Where(v => v.Entity.Code() < obj.Entity.Code() && v.Data.GOODSEND > obj.Entity.Code()).ToArray();
  150. if (arr.Length > 0)
  151. {
  152. if (obj.Entity.CODE == "2058")
  153. {
  154. var flag = Device.Find("2071", "2060").Select(v => v.Device<IStation521>()).All(v => v.Data.PH_STATUS == false && v.Data.TASKNUM == 0);
  155. if (flag)
  156. {
  157. obj.Data2.TASKNUM = obj.Data.TASKNUM;
  158. obj.Data2.GOODSEND = 2017;
  159. obj.Data2.CONFIRM = true;
  160. }
  161. }
  162. else if (obj.Entity.CODE == "2044")
  163. {
  164. var emp = obj.Entity.GetPath("2058").Select(v => v.Device<IStation521>()).Where(v => v.Data.PH_STATUS == false && v.Data.TASKNUM == 0).Count();
  165. if (emp > 0)
  166. {
  167. obj.Data2.TASKNUM = obj.Data.TASKNUM;
  168. obj.Data2.GOODSEND = 2058;
  169. obj.Data2.CONFIRM = true;
  170. }
  171. }
  172. }
  173. //throw;
  174. Configs.UploadException(obj.Entity.CODE, ex.GetBaseException().Message);
  175. }
  176. });
  177. }
  178. int Locked(WCS_DEVICE dev)
  179. {
  180. return Device.Where(v => v.IsConv()).Select(v => v.Device<IStation521>()).Where(v => v.Data.TASKNUM > 0)
  181. .Where(v => v.Data.GOODSEND == dev.Code() || v.Entity.CODE == dev.CODE)
  182. .Count();
  183. }
  184. }
  185. }