组盘位.cs 7.8 KB

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