拆子盘位.cs 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  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, IStation523>>
  11. {
  12. private Device<IRGV521> Rgv;
  13. public 拆子盘位()
  14. {
  15. Rgv = Device.Find("RGV3").Device<IRGV521>();
  16. }
  17. protected override bool SelectDevice(WCS_DEVICE obj)
  18. {
  19. return obj.Is(DF.拆盘) && obj.PalletType() != 4 && obj.CODE != "2198";
  20. }
  21. protected override void Do(Device<IStation521, IStation520, IStation523> dev)
  22. {
  23. if (!dev.Data3.Status.HasFlag(StationStatus.自动)) return;
  24. if (Ltc.Do(dev, v => v.Data2.RES == true))
  25. {
  26. return;
  27. }
  28. if (Ltc.Do(dev, v => v.Data.RES == true))//拆盘位RGV放货
  29. {
  30. DB.Do(db =>
  31. {
  32. var taskid = dev.Data.TASKNUM;
  33. var task = db.Default.Set<WCS_TASK>().Find(taskid);
  34. if (task != null)
  35. {
  36. if (task.STATUS < WCS.Entity.TaskStatus.已完成)
  37. {
  38. task.STATUS = WCS.Entity.TaskStatus.已完成;
  39. task.ENDTIME = DateTime.Now;
  40. //task.ADDRCURRENT = dev.Entity.CODE;
  41. db.Default.SaveChanges();
  42. }
  43. }
  44. dev.Data2.RES = true;
  45. });
  46. return;
  47. }
  48. if (Ltc.Do(dev, v => v.Data.PH_STATUS == false && v.Data.PH_STATUS2 == false && v.Data.REQUEST == false && v.Data.TASKNUM == 0))
  49. {//需要呼叫空托盘
  50. Ltc.Log("待呼叫托盘");
  51. if (Ltc.Do(Rgv, Rgv => Rgv.Data.WorkMode != RGVMode.自动))
  52. return;
  53. //if (Ltc.Do(dev, v => !v.Entity.WakeupOn(5000,"拆盘")))
  54. // return;
  55. var palletType = dev.Entity.PalletType();
  56. if (palletType == 0)
  57. throw new Exception("托盘类型有误");
  58. var ret = DB.Do(db =>
  59. {
  60. var task = db.Default.Set<WCS_TASK>().Where(v => v.STATUS < WCS.Entity.TaskStatus.已完成 && v.TYPE == TaskType.出库)
  61. .Where(v => v.ADDRTO == dev.Entity.CODE)
  62. .FirstOrDefault();
  63. if (task != null)
  64. return true;
  65. return false;
  66. });
  67. if (ret)
  68. return;
  69. var res = WMS.GetPalletOutTask(palletType, dev.Entity.CODE);
  70. DB.Do(db =>
  71. {
  72. //var task = db.Default.Set<WCS_TASK>().Where(v => v.STATUS < WCS.Entity.TaskStatus.已完成 && v.TYPE == TaskType.出库)
  73. //.Where(v => v.ADDRTO == dev.Entity.CODE)
  74. //.FirstOrDefault();
  75. //if (task != null)
  76. // return;
  77. var sc = Device.Find(res.TunnelNum).ROUTES.Where(v => v.NEXT.IsSC()).Select(v => v.NEXT).FirstOrDefault();
  78. var loc = string.Format("{0}-{1}-{2}", res.Row, res.Colomn, res.Layer);
  79. var task = new WCS_TASK
  80. {
  81. TYPE = TaskType.出库,
  82. STATUS = WCS.Entity.TaskStatus.新建,
  83. ADDRFROM = loc,
  84. ADDRTO = dev.Entity.CODE,
  85. BARCODE = res.ContainerBarCode,
  86. TUNNEL = res.TunnelNum,
  87. PALLETTYPE = palletType,
  88. WMSTASK = int.Parse(res.WMSTaskNum),
  89. FLOOR = 2,
  90. UPDATEUSER = "WCS",
  91. SCSTATION = res.Memo1,
  92. DEVICE = sc.CODE,
  93. //ADDRCURRENT = loc,
  94. ADDRNEXT = dev.Entity.CODE
  95. };
  96. db.Default.Set<WCS_TASK>().Add(task);
  97. db.Default.SaveChanges();
  98. dev.Data2.GOODSCODE = task.ID;//锁定
  99. });
  100. }
  101. else
  102. {
  103. Ltc.Log("已有托盘");
  104. if (Ltc.Do(dev, v => v.Data2.CONFIRM == true))
  105. {
  106. return;
  107. }
  108. if (Ltc.Do(dev, v => v.Data.REQUEST == true))
  109. {
  110. Ltc.Log("拆盘就绪");
  111. var arr = Device.Where(v => v.Is(DF.组盘)).Select(v => v.Device<IStation521, IStation520, IRobotStation>()).ToArray();
  112. arr = Ltc.Do(arr, arr => arr.Where(v => v.Data.PH_STATUS == false && v.Data.TASKNUM == 0).ToArray());
  113. if (arr.Length == 0)
  114. return;
  115. var palletType = dev.Entity.PalletType();
  116. var target = Ltc.Do(arr, arr => arr.Where(v => v.Data3.PalletType == palletType).FirstOrDefault());
  117. if (target == null)
  118. return;
  119. if (Ltc.Do(target, target => target.Data3.DocId == 0))
  120. return;
  121. if (Ltc.Do(dev, v => v.Data.TASKNUM == 0))
  122. return;
  123. var addrto = target.Entity.CODE;
  124. DB.Do(db =>
  125. {
  126. var hastask = db.Default.Set<WCS_TASK>().Where(v => v.ADDRTO == addrto && v.STATUS < WCS.Entity.TaskStatus.已完成 && v.TYPE == TaskType.输送).Any();
  127. if (Ltc.Do(() => hastask == true))
  128. return;
  129. var task = db.Default.Set<WCS_TASK>().Find(dev.Data.TASKNUM);
  130. task = new WCS_TASK
  131. {
  132. TYPE = TaskType.输送,
  133. STATUS = WCS.Entity.TaskStatus.执行中,
  134. BARCODE = task.BARCODE,
  135. FLOOR = 2,
  136. PALLETTYPE = (short)palletType,
  137. FULLQTY = target.Data3.MaxQty,
  138. ADDRFROM = dev.Entity.CODE,
  139. ADDRTO = target.Entity.CODE,
  140. UPDATETIME = DateTime.Now,
  141. UPDATEUSER = "WCS",
  142. DOCID = target.Data3.DocId,
  143. //ADDRCURRENT = dev.Entity.CODE
  144. };
  145. db.Default.Set<WCS_TASK>().Add(task);
  146. db.Default.SaveChanges();
  147. dev.Data2.TASKNUM = task.ID;
  148. dev.Data2.GOODSEND = target.Entity.Code();
  149. dev.Data2.CONFIRM = true;
  150. });
  151. }
  152. }
  153. }
  154. }
  155. }