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