RobotWork.cs 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  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. using WCS.Service.Helpers;
  9. namespace WCS.Service.Works.Robots
  10. {
  11. [WorkTitle(typeof(ProductHandler), "机器人")]
  12. public class RobotWork : DeviceWork<Device<IRobot>>
  13. {
  14. private Device<IStation521, IStation520> C2153;
  15. public RobotWork()
  16. {
  17. C2153 = Device.Find("2153").Device<IStation521, IStation520>();
  18. }
  19. protected override bool SelectDevice(WCS_DEVICE dev)
  20. {
  21. return true;
  22. }
  23. protected override void Do(Device<IRobot> dev)
  24. {
  25. //dev.Data.Trigger = 0;
  26. //dev.Data.TaskID = 0;
  27. //dev.Data.Target = 0;
  28. if (Ltc.Do(dev, v => v.Data.Trigger != 0))
  29. {
  30. return;
  31. }
  32. if (Ltc.Do(dev, v => v.Data.FinishedTask != 0))
  33. {
  34. var fTaskId = dev.Data.FinishedTask;
  35. var fTarget = dev.Entity.ROUTES.Where(v => v.NEXT.ProductLine() == dev.Data.Target).Select(v => v.NEXT.Device<IStation521>()).FirstOrDefault();
  36. var fTarget1 = dev.Entity.ROUTES.Where(v => v.NEXT.ProductLine() == dev.Data.Target).Select(v => v.NEXT.Device<IStation521,IStation520,IRobotStation>()).FirstOrDefault();
  37. if (fTarget == null)
  38. {
  39. var msg = "目标位置" + dev.Data.Target + "有误";
  40. throw new Exception(msg);
  41. }
  42. DB.Do(db =>
  43. {
  44. var task = db.Default.Set<WCS_TASK>().Find(fTaskId);
  45. if (task == null)
  46. throw new Exception("已完成任务号" + fTaskId + "不存在");
  47. var taskPallet = db.Default.Set<WCS_TASK>().Find(fTarget.Data.TASKNUM);
  48. if (taskPallet == null)
  49. throw new Exception("空托盘任务号" + fTarget.Data.TASKNUM + "不存在");
  50. var container = taskPallet.BARCODE;
  51. task.STATUS = WCS.Entity.TaskStatus.已完成;
  52. task.ENDTIME = DateTime.Now;
  53. task.UPDATETIME = DateTime.Now;
  54. task.UPDATEUSER = "WCS";
  55. task.GROUPTASK = taskPallet.ID;
  56. task.CreateStatusLog(db, $"任务完成");
  57. //task.ADDRCURRENT = fTarget.Entity.CODE;
  58. db.Default.SaveChanges();
  59. var res = WMS.AutoBuildUpGroupStock(container, task.BARCODE, dev.Entity.CODE);
  60. if (Ltc.Do(res, v => v.ResType == false))
  61. {
  62. //throw new Exception(res.ResMessage);
  63. WMS.TaskException(dev.Entity.CODE, res.ResMessage);
  64. LogHelper.AddWCS_EXCEPTION($"{dev.Entity.CODE}强制排出,原因:{res.ResMessage}");
  65. GeneralHelper.DischargeOfTray(fTarget1,false);
  66. LogHelper.AddWCS_EXCEPTION($"{dev.Entity.CODE}强制排出 ,原因:{res.ResMessage}");
  67. }
  68. dev.Data.FinishedTask = 0;
  69. });
  70. return;
  71. }
  72. //if (Ltc.Do(dev, v => v.Data.Mode != RobotMode.自动))
  73. // return;
  74. if (Ltc.Do(dev, v => v.Data.Status != RobotStatus.空闲))
  75. return;
  76. if (Ltc.Do(C2153, C2153 => C2153.Data.TASKNUM == 0))
  77. return;
  78. if (Ltc.Do(C2153, C2153 => C2153.Data.GOODSEND == 2153))
  79. return;
  80. if (Ltc.Do(C2153, C2153 => C2153.Data.GOODSEND == 0))
  81. return;
  82. if (Ltc.Do(C2153, C2153 => C2153.Data.GOODSCODE == 0))
  83. return;
  84. if (Ltc.Do(C2153, C2153 => C2153.Data.PH_STATUS == false))
  85. {
  86. throw new Exception("有任务但无光电信号");
  87. }
  88. var workShop = C2153.Data.GOODSEND;
  89. var target = dev.Entity.ROUTES.Where(v => v.NEXT.ProductLine() == workShop).Select(v => v.NEXT.Device<IStation521, IStation520, IRobotStation>()).FirstOrDefault();
  90. if (target == null) throw new Exception("机器人目标位置" + workShop + "不存在");
  91. string tType = "";
  92. if (C2153.Data.GOODSTYPE == 4)
  93. {
  94. tType = "母";
  95. }
  96. else if (C2153.Data.GOODSTYPE == 3)
  97. {
  98. tType = "T2";
  99. }
  100. else if (C2153.Data.GOODSTYPE == 1)
  101. {
  102. tType = "T9";
  103. }
  104. if (Ltc.Do(target, target => target.Data.PH_STATUS == false)) throw new Exception($"目标位置[{target}]{tType}托盘未到位");
  105. if (Ltc.Do(target, C2153, (target, C2153) => target.Data.GOODSCODE != C2153.Data.GOODSCODE) && target.Data3.Qty != target.Data.GOODSSIZE) //单号不符
  106. {
  107. if (Ltc.Do(target, target => target.Data2.CONFIRM == true)) return;
  108. if (Ltc.Do(target, target => target.Data.GOODSEND == 2202)) return;
  109. if ((Ltc.Do(target, C2153, (target, C2153) => target.Data.GOODSTYPE != 0 && C2153.Data.GOODSTYPE != 0 && target.Data.GOODSTYPE != C2153.Data.GOODSTYPE && target.Data3.Qty!=0))) //托盘类型不符
  110. {
  111. GeneralHelper.DischargeOfTray(target);
  112. LogHelper.AddWCS_EXCEPTION($"2153:{C2153.Data.TASKNUM}与{target.Entity.CODE}单号不符,托盘有货,自动排出106");
  113. return;
  114. }
  115. if (target.Data3.Qty > 0) //有托盘
  116. {
  117. GeneralHelper.DischargeOfTray(target);
  118. LogHelper.AddWCS_EXCEPTION($"2153:{C2153.Data.TASKNUM}与{target.Entity.CODE}单号不符,托盘有货,自动排出112");
  119. return;
  120. }
  121. if (target.Data3.Qty == 0) //无托盘
  122. {
  123. target.Data.RES4 = true;
  124. LogHelper.AddWCS_EXCEPTION($"2153:{C2153.Data.TASKNUM}与{target.Entity.CODE}单号不符,托盘为空,允许组盘");
  125. }
  126. }
  127. if (Ltc.Do(target, C2153, (target, C2153) => target.Data.GOODSTYPE != C2153.Data.GOODSTYPE))
  128. return;
  129. if (Ltc.Do(target, target => target.Data3.MaxQty == 0 || target.Data3.PalletType == 0))
  130. return;
  131. if (Ltc.Do(target, target => target.Data3.Qty >= target.Data.GOODSSIZE))
  132. return;
  133. DB.Do(db =>
  134. {
  135. var taskid = C2153.Data.TASKNUM;
  136. var task = db.Default.Set<WCS_TASK>().Find(taskid);
  137. if (task == null)
  138. return;
  139. //task.ADDRCURRENT = dev.Entity.CODE;
  140. db.Default.SaveChanges();
  141. dev.Data.TaskID = taskid;
  142. dev.Data.Target = workShop;
  143. dev.Data.Trigger = 1;
  144. });
  145. }
  146. }
  147. }