组盘位.cs 7.1 KB

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