组盘位.cs 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  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. var taskid = dev.Data.TASKNUM;
  84. DB.Do(db =>
  85. {
  86. var task = db.Default.Set<WCS_TASK>().Find(taskid);
  87. if (task == null)
  88. throw new Exception("空托盘任务号" + taskid + "不存在");
  89. var qty = db.Default.Set<WCS_TASK>().Where(v => v.TYPE == TaskType.组盘 && v.GROUPTASK == taskid).Count();
  90. if (Ltc.Do(dev, v => qty < v.Data3.MaxQty))
  91. return;
  92. var res = WMS.InBound(task.BARCODE, dev.Entity.CODE);
  93. //if (Ltc.Do(res, v => v.ResType == false))
  94. // throw new Exception(res.ResMessage);
  95. //var target = res.TunnelNum.Split(',').Select(v => endStations.FirstOrDefault(d => d.Entity.Tunnel().ToString() == v))
  96. // .Where(v => v != null).FirstOrDefault();
  97. task = new WCS_TASK
  98. {
  99. TYPE = TaskType.入库,
  100. STATUS = WCS.Entity.TaskStatus.执行中,
  101. ADDRFROM = dev.Entity.CODE,
  102. ADDRTO = "2181",
  103. FLOOR = 2,
  104. FULLQTY = dev.Data3.MaxQty,
  105. BARCODE = task.BARCODE,
  106. PALLETTYPE = 99,
  107. UPDATETIME = DateTime.Now,
  108. UPDATEUSER = "WCS",
  109. WMSTASK = int.Parse(res.WMSTaskNum),
  110. HEIGHT = dev.Data3.MaxQty,
  111. DOCID = task.DOCID,
  112. //ADDRCURRENT = dev.Entity.CODE
  113. };
  114. switch (dev.Data3.MaxQty)
  115. {
  116. case 2:
  117. task.HEIGHT = 6;
  118. break;
  119. case 4:
  120. task.HEIGHT = 1;
  121. break;
  122. default:
  123. task.HEIGHT = 2;
  124. break;
  125. }
  126. db.Default.Set<WCS_TASK>().Add(task);
  127. db.Default.SaveChanges();
  128. dev.Data3.PalletType = 0;
  129. dev.Data3.MaxQty = 0;
  130. dev.Data3.DocId = 0;
  131. dev.Data2.TASKNUM = task.ID;
  132. dev.Data2.GOODSEND = 2187;
  133. dev.Data2.GOODSTYPE = 99;
  134. dev.Data2.CONFIRM = true;
  135. });
  136. }
  137. else
  138. {
  139. bool move = false;
  140. //if (task == null)
  141. {
  142. if (Ltc.Do(dev, v => v.Data.RES))
  143. {
  144. move = true;
  145. }
  146. }
  147. //else
  148. //if (!move && task != null)
  149. //{
  150. // if (Ltc.Do(dev, task, (v, task) => v.Data.GOODSCODE != task.DOCID))
  151. // {//托盘类型不匹配,挪走
  152. // move = true;
  153. // }
  154. //}
  155. if (move)
  156. {
  157. GeneralHelper.DischargeOfTray(dev);
  158. LogHelper.AddWCS_EXCEPTION($"{dev.Entity.CODE}强制排出175");
  159. }
  160. }
  161. }
  162. }
  163. }
  164. }