组盘位.cs 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. using DBHelper;
  2. using System;
  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. namespace WCS.Service.Works.Stations
  10. {
  11. [WorkTitle(typeof(ProductHandler), "组盘位", true)]
  12. internal class 组盘位 : DeviceWork<Device<IStation521, IStation520, IRobotStation>>
  13. {
  14. protected override bool SelectDevice(WCS_DEVICE obj)
  15. {
  16. return obj.Is(DF.组盘);
  17. }
  18. protected override void Do(Device<IStation521, IStation520, IRobotStation> dev)
  19. {
  20. var dev1 = Device.Find(dev.Entity.CODE).Device<IStation523>();
  21. if (dev.Data.RES4 && dev.Data3.Qty > 0)
  22. {
  23. GeneralHelper.DischargeOfTray(dev);
  24. LogHelper.AddWCS_EXCEPTION($"{dev.Entity.CODE}单号不符,托盘有货,自动排出26");
  25. return;
  26. }
  27. //断电复位校验
  28. if (dev.Data.TASKNUM > 10000 && dev.Data.PH_STATUS && !dev1.Data.Status.HasFlag(StationStatus.自动)) //有任务有光电,代表当前有货
  29. {
  30. if (dev.Data.GOODSCODE != dev.Data3.DocId)
  31. dev.Data3.DocId = dev.Data.GOODSCODE;
  32. if (dev.Data.GOODSTYPE != dev.Data3.PalletType)
  33. dev.Data3.PalletType = dev.Data.GOODSTYPE;
  34. if (dev.Data.GOODSSIZE != dev.Data3.MaxQty)
  35. dev.Data3.MaxQty = dev.Data.GOODSSIZE;
  36. }
  37. if (!dev1.Data.Status.HasFlag(StationStatus.自动)) return;
  38. if (Ltc.Do(dev, v => v.Data2.CONFIRM == true))
  39. return;
  40. if (Ltc.Do(dev, v => v.Data.REQUEST == true))
  41. return;//避免与RGVPut逻辑线程冲突
  42. var pline = dev.Entity.ProductLine();
  43. var task = DB.Do(db =>
  44. {
  45. return db.Default.Set<WCS_TASK>()
  46. .Where(v => v.TYPE == TaskType.组盘 && v.STATUS < WCS.Entity.TaskStatus.已完成)
  47. .Where(v => v.PRODLINE == pline)
  48. .Where(v => v.ADDRTO == "2153")
  49. .OrderBy(v => v.CREATETIME).FirstOrDefault();
  50. });
  51. if (Ltc.Do(dev, v => v.Data.TASKNUM == 0))
  52. {
  53. if (task == null)
  54. {
  55. if (dev.Data3.DocId != 0)
  56. dev.Data3.DocId = 0;
  57. if (dev.Data3.MaxQty != 0)
  58. dev.Data3.MaxQty = 0;
  59. if (dev.Data3.PalletType != 0)
  60. dev.Data3.PalletType = 0;
  61. }
  62. else
  63. {
  64. if (dev.Data3.DocId != task.DOCID)
  65. dev.Data3.DocId = task.DOCID;
  66. if (dev.Data3.MaxQty != task.FULLQTY)
  67. dev.Data3.MaxQty = task.FULLQTY;
  68. if (dev.Data3.PalletType != task.PALLETTYPE)
  69. dev.Data3.PalletType = task.PALLETTYPE;
  70. }
  71. }
  72. else if (Ltc.Do(dev, v => v.Data.GOODSCODE > 0))
  73. {
  74. if (Ltc.Do(dev, v => v.Data.GOODSSIZE == 0))
  75. return;
  76. if (Ltc.Do(dev, v => v.Data.GOODSTYPE == 0))
  77. return;
  78. if (Ltc.Do(dev, v => v.Data.GOODSEND != v.Entity.Code()))
  79. return;
  80. if (Ltc.Do(dev, v => v.Data3.Qty == v.Data.GOODSSIZE))
  81. { //入库
  82. //if (Ltc.Do(dev, v => !v.Entity.WakeupOn(5000,"组盘")))
  83. // return;
  84. bool move = false;
  85. //if (task == null)
  86. {
  87. if (Ltc.Do(dev, v => v.Data.RES))
  88. {
  89. move = true;
  90. }
  91. }
  92. if (move)
  93. {
  94. GeneralHelper.DischargeOfTray(dev);
  95. LogHelper.AddWCS_EXCEPTION($"{dev.Entity.CODE}强制排出175");
  96. return;
  97. }
  98. var taskid = dev.Data.TASKNUM;
  99. DB.Do(db =>
  100. {
  101. var task = db.Default.Set<WCS_TASK>().Find(taskid);
  102. if (task == null)
  103. throw new Exception("空托盘任务号" + taskid + "不存在");
  104. var qty = db.Default.Set<WCS_TASK>().Where(v => v.TYPE == TaskType.组盘 && v.GROUPTASK == taskid).Count();
  105. if (Ltc.Do(dev, v => qty < v.Data3.MaxQty))
  106. return;
  107. var res = WMS.InBound(task.BARCODE, dev.Entity.CODE);
  108. //if (Ltc.Do(res, v => v.ResType == false))
  109. // throw new Exception(res.ResMessage);
  110. //var target = res.TunnelNum.Split(',').Select(v => endStations.FirstOrDefault(d => d.Entity.Tunnel().ToString() == v))
  111. // .Where(v => v != null).FirstOrDefault();
  112. task = new WCS_TASK
  113. {
  114. TYPE = TaskType.入库,
  115. STATUS = WCS.Entity.TaskStatus.执行中,
  116. ADDRFROM = dev.Entity.CODE,
  117. ADDRTO = "2181",
  118. FLOOR = 2,
  119. FULLQTY = dev.Data3.MaxQty,
  120. BARCODE = task.BARCODE,
  121. PALLETTYPE = 99,
  122. UPDATETIME = DateTime.Now,
  123. UPDATEUSER = "WCS",
  124. WMSTASK = int.Parse(res.WMSTaskNum),
  125. HEIGHT = dev.Data3.MaxQty,
  126. DOCID = task.DOCID,
  127. //ADDRCURRENT = dev.Entity.CODE
  128. };
  129. switch (dev.Data3.MaxQty)
  130. {
  131. case 2:
  132. task.HEIGHT = 6;
  133. break;
  134. case 4:
  135. task.HEIGHT = 1;
  136. break;
  137. default:
  138. task.HEIGHT = 2;
  139. break;
  140. }
  141. db.Default.Set<WCS_TASK>().Add(task);
  142. db.Default.SaveChanges();
  143. dev.Data3.PalletType = 0;
  144. dev.Data3.MaxQty = 0;
  145. dev.Data3.DocId = 0;
  146. dev.Data2.TASKNUM = task.ID;
  147. dev.Data2.GOODSEND = 2187;
  148. dev.Data2.GOODSTYPE = 99;
  149. dev.Data2.CONFIRM = true;
  150. task.CreateStatusLog(db, $"任务下发输送机[{dev.Entity.CODE}]执行,起始地址[{dev.Entity.CODE}],目标地址[{2187}]");
  151. });
  152. }
  153. else
  154. {
  155. bool move = false;
  156. //if (task == null)
  157. {
  158. if (Ltc.Do(dev, v => v.Data.RES))
  159. {
  160. move = true;
  161. }
  162. }
  163. //else
  164. //if (!move && task != null)
  165. //{
  166. // if (Ltc.Do(dev, task, (v, task) => v.Data.GOODSCODE != task.DOCID))
  167. // {//托盘类型不匹配,挪走
  168. // move = true;
  169. // }
  170. //}
  171. if (move)
  172. {
  173. GeneralHelper.DischargeOfTray(dev);
  174. LogHelper.AddWCS_EXCEPTION($"{dev.Entity.CODE}强制排出175");
  175. }
  176. }
  177. }
  178. }
  179. }
  180. }