拆母盘位.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. using DBHelper;
  2. using Microsoft.EntityFrameworkCore;
  3. using System;
  4. using System.Linq;
  5. using WCS.Core;
  6. using WCS.Entity;
  7. using WCS.Entity.Protocol;
  8. namespace WCS.Service.Works.Stations
  9. {
  10. [WorkTitle(typeof(ProductHandler), "拆母盘位")]
  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;
  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))
  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.ADDRCURRENT = dev.Entity.CODE;
  42. // db.Default.SaveChanges();
  43. // }
  44. // }
  45. // dev.Data2.RES = true;
  46. //});
  47. dev.Data2.RES = true;
  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. return;
  53. Ltc.Log("待呼叫托盘");
  54. if (Ltc.Do(Rgv, Rgv => Rgv.Data.WorkMode != RGVMode.自动))
  55. return;
  56. //if (Ltc.Do(dev, v => !v.Entity.WakeupOn(5000,"拆盘")))
  57. // return;
  58. var palletType = dev.Entity.PalletType();
  59. DB.Do(db =>
  60. {
  61. var task = db.Default.Set<WCS_TASK>().Where(v => v.STATUS < WCS.Entity.TaskStatus.已完成 && v.TYPE == TaskType.出库)
  62. .Where(v => v.ADDRTO == dev.Entity.CODE)
  63. .FirstOrDefault();
  64. if (task != null)
  65. return;
  66. var res = WMS.GetPalletOutTask(palletType, dev.Entity.CODE);
  67. var sc = Device.Find(res.TunnelNum).ROUTES.Where(v => v.NEXT.IsSC()).Select(v => v.NEXT).FirstOrDefault();
  68. var loc = string.Format("{0}-{1}-{2}", res.Row, res.Colomn, res.Layer);
  69. task = new WCS_TASK
  70. {
  71. TYPE = TaskType.出库,
  72. STATUS = WCS.Entity.TaskStatus.新建,
  73. ADDRFROM = loc,
  74. ADDRTO = dev.Entity.CODE,
  75. BARCODE = res.ContainerBarCode,
  76. TUNNEL = res.TunnelNum,
  77. PALLETTYPE = palletType,
  78. WMSTASK = int.Parse(res.WMSTaskNum),
  79. FLOOR = 2,
  80. UPDATEUSER = "WCS",
  81. SCSTATION = res.Memo1,
  82. DEVICE = sc.CODE,
  83. //ADDRCURRENT = loc,
  84. ADDRNEXT = dev.Entity.CODE
  85. };
  86. db.Default.Set<WCS_TASK>().Add(task);
  87. db.Default.SaveChanges();
  88. dev.Data2.GOODSCODE = task.ID;//锁定
  89. });
  90. }
  91. else
  92. {
  93. Ltc.Log("已有托盘");
  94. if (Ltc.Do(dev, v => v.Data2.CONFIRM == true))
  95. {
  96. return;
  97. }
  98. if (Ltc.Do(dev, v => v.Data.REQUEST == true))
  99. {
  100. Ltc.Log("拆盘就绪");
  101. var arr = Device.Where(v => (v.Is(DF.拆盘) && v.PalletType() != 4))
  102. .Select(v => v.Device<IStation521, IStation520>()).ToArray();
  103. arr = Ltc.Do(arr, arr => arr.Where(v => v.Data.PH_STATUS == false && v.Data.PH_STATUS2 == true && v.Data.TASKNUM == 0).ToArray());
  104. var target = arr.OrderBy(v => v.UpdateTime).FirstOrDefault();
  105. short maxqty = 0;
  106. int docId = 0;
  107. if (target == null)
  108. {
  109. arr = Device.Where(v => v.Is(DF.组盘)).Select(v => v.Device<IStation521, IStation520>()).ToArray();
  110. arr = Ltc.Do(arr, arr => arr.Where(v => v.Data.PH_STATUS == false && v.Data.TASKNUM == 0).ToArray());
  111. if (arr.Length == 0)
  112. return;
  113. var palletType = dev.Entity.PalletType();
  114. target = Ltc.Do(arr, arr => arr.Where(v => v.Entity.Device<IRobotStation>().Data.PalletType == palletType).FirstOrDefault());
  115. if (target == null)
  116. return;
  117. var rs = target.Entity.Device<IRobotStation>();
  118. if (rs.Data.DocId == 0)
  119. return;
  120. maxqty = rs.Data.MaxQty;
  121. docId = rs.Data.DocId;
  122. }
  123. var bcr = dev.Entity.BCR();
  124. var barcode = bcr.CONTENT.Trim('\r');
  125. if (string.IsNullOrEmpty(barcode) || !barcode.StartsWith("TPB") || barcode.Length != 8)
  126. throw new Exception($"托盘条码读取异常【{barcode}】");
  127. DB.Do(db =>
  128. {
  129. #region 检查是否有相同的正在使用的托盘
  130. var dd = DateTime.Now;
  131. //找出所有组盘站台信息
  132. var 组盘站台 = Device.Where(v => v.Is(DF.组盘) && v.PalletType() != 4)
  133. .Select(v => v.Device<IStation521, IStation520>()).ToList();
  134. //找出所有有光电信号站台中的任务号
  135. var taskNumbers = 组盘站台.Where(p => p.Data.TASKNUM != 0 && p.Data.PH_STATUS).Select(p => p.Data.TASKNUM);
  136. //找到taskNumbers对应任务,和所有未结束的输送任务,并获取对应的托盘号
  137. var barCodes = db.Default.Set<WCS_TASK>().AsNoTracking()
  138. .Where(p => taskNumbers.Any(x => p.ID == x) || (p.TYPE == TaskType.输送 && p.STATUS < WCS.Entity.TaskStatus.已完成))
  139. .Select(p => p.BARCODE);
  140. if (barCodes.Any(p => p == barcode))
  141. {
  142. Ltc.Log($"【{barcode}】对应托盘已在工位或输送中");
  143. throw new Exception($"【{barcode}】对应托盘已在工位或输送中");
  144. }
  145. var dbTimes = (DateTime.Now - dd).TotalMilliseconds;
  146. Console.ForegroundColor = ConsoleColor.Blue;
  147. Console.WriteLine("------托盘检查耗时:" + ((int)dbTimes).ToString().PadRight(4, ' ') + "");
  148. Console.ResetColor();
  149. #endregion 检查是否有相同的正在使用的托盘
  150. var task = db.Default.Set<WCS_TASK>().Where(v => v.STATUS < WCS.Entity.TaskStatus.已完成 && v.ADDRTO == target.Entity.CODE).FirstOrDefault();
  151. if (task != null)
  152. {
  153. Ltc.Log("已存在目的地为" + target.Entity.CODE + "的输送任务");
  154. return;
  155. }
  156. task = new WCS_TASK
  157. {
  158. TYPE = TaskType.输送,
  159. STATUS = WCS.Entity.TaskStatus.执行中,
  160. BARCODE = barcode,
  161. FLOOR = 2,
  162. PALLETTYPE = target.Entity.Is(DF.拆盘) ? target.Entity.PalletType() : (short)4,
  163. FULLQTY = maxqty,
  164. ADDRFROM = dev.Entity.CODE,
  165. ADDRTO = target.Entity.CODE,
  166. UPDATETIME = DateTime.Now,
  167. UPDATEUSER = "WCS",
  168. DOCID = docId,
  169. //ADDRCURRENT = dev.Entity.CODE
  170. };
  171. db.Default.Set<WCS_TASK>().Add(task);
  172. db.Default.SaveChanges();
  173. dev.Data2.TASKNUM = task.ID;
  174. dev.Data2.GOODSEND = target.Entity.Code();
  175. dev.Data2.CONFIRM = true;
  176. });
  177. }
  178. }
  179. }
  180. }
  181. [WorkTitle(typeof(ProductHandler), "母盘缓存")]
  182. internal class 母盘缓存 : DeviceWork<Device<IStation521, IStation520, IStation523>>
  183. {
  184. public 母盘缓存()
  185. {
  186. }
  187. protected override bool SelectDevice(WCS_DEVICE obj)
  188. {
  189. return obj.CODE == "2198";
  190. }
  191. protected override void Do(Device<IStation521, IStation520, IStation523> dev)
  192. {
  193. if (!dev.Data3.Status.HasFlag(StationStatus.自动)) return;
  194. if (dev.Data.TASKNUM == 0)
  195. {//呼叫空托盘
  196. DB.Do(db =>
  197. {
  198. var flag = db.Default.Set<WCS_TASK>().Where(v => v.ADDRTO == "2198" && v.STATUS < WCS.Entity.TaskStatus.已完成).Any();
  199. if (flag)
  200. {
  201. Ltc.Log("已有呼叫空托盘任务");
  202. return;
  203. }
  204. var res = WMS.GetPalletOutTask(4, dev.Entity.CODE);
  205. var sc = Device.Find(res.TunnelNum).ROUTES.Where(v => v.NEXT.IsSC()).Select(v => v.NEXT).FirstOrDefault();
  206. var loc = string.Format("{0}-{1}-{2}", res.Row, res.Colomn, res.Layer);
  207. var task = new WCS_TASK
  208. {
  209. TYPE = TaskType.出库,
  210. STATUS = WCS.Entity.TaskStatus.新建,
  211. ADDRFROM = loc,
  212. ADDRTO = dev.Entity.CODE,
  213. BARCODE = res.ContainerBarCode,
  214. TUNNEL = res.TunnelNum,
  215. PALLETTYPE = 4,
  216. WMSTASK = int.Parse(res.WMSTaskNum),
  217. FLOOR = 2,
  218. UPDATEUSER = "WCS",
  219. SCSTATION = res.Memo1,
  220. DEVICE = sc.CODE,
  221. //ADDRCURRENT = loc,
  222. ADDRNEXT = dev.Entity.CODE
  223. };
  224. db.Default.Set<WCS_TASK>().Add(task);
  225. db.Default.SaveChanges();
  226. });
  227. }
  228. else if (dev.Data.REQUEST)
  229. {
  230. if (dev.Data2.CONFIRM)
  231. return;
  232. DB.Do(db =>
  233. {
  234. var task = db.Default.Set<WCS_TASK>().Find(dev.Data.TASKNUM);
  235. if (task.STATUS < WCS.Entity.TaskStatus.已完成)
  236. {
  237. task.STATUS = WCS.Entity.TaskStatus.已完成;
  238. task.UPDATETIME = DateTime.Now;
  239. db.Default.SaveChanges();
  240. }
  241. });
  242. var obj = Device.Find("2192").Device<IStation521>();
  243. if (obj.Data.TASKNUM == 0 && obj.Data.PH_STATUS == false && obj.Data.PH_STATUS2 == false)
  244. {
  245. dev.Data2.TASKNUM = dev.Data.TASKNUM;
  246. dev.Data2.GOODSEND = 2192;
  247. dev.Data2.CONFIRM = true;
  248. }
  249. }
  250. }
  251. }
  252. }