拆母盘位.cs 12 KB

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