月台扫码.cs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. using DBHelper;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using WCS.Core;
  8. using WCS.Entity;
  9. using WCS.Entity.Protocol;
  10. namespace WCS.Service.Works.Stations
  11. {
  12. [WorkTitle(typeof(ProductHandler), "月台扫码")]
  13. class 月台扫码:DeviceWork<Device<IStation521, IStation520>>
  14. {
  15. protected override bool SelectDevice(WCS.Entity.WCS_DEVICE dev)
  16. {
  17. return dev.Is(DF.扫码) && dev.CODE == "2265";
  18. }
  19. protected override void Do(Device<IStation521, IStation520> dev)
  20. {
  21. if (Ltc.Do(dev, v => v.Data2.CONFIRM == true))
  22. {
  23. return;
  24. }
  25. if (Ltc.Do(dev, v => !v.Data.REQUEST))
  26. return;
  27. var bcrDev = Device.Find("BCR" + dev.Entity.CODE);
  28. var bcr = bcrDev.PROTOCOLS.First().Data<IBCR80>();
  29. var barcode = bcr.CONTENT.Trim('\r');
  30. if (Ltc.Do(barcode, barcode => string.IsNullOrEmpty(barcode)))
  31. {//扫码失败,退回
  32. dev.Data2.TASKNUM = dev.Data.TASKNUM;
  33. dev.Data2.GOODSEND = -1;
  34. dev.Data2.CONFIRM = true;
  35. return;
  36. }
  37. var rgv = dev.Entity.ROUTES.Select(v => v.NEXT).Where(v => v.IsRGV()).FirstOrDefault();
  38. var arr = rgv.ROUTES.Select(v => v.NEXT).Where(v => v.ROUTES.Any(d => d.NEXT.IsTunnel())).ToArray();
  39. var endStations = arr.Select(v => v.Device<IStation521, IStation520>()).ToArray();
  40. endStations = Ltc.Do(endStations, arr => arr.Where(v => v.Data.TASKNUM == 0 && v.Data.PH_STATUS == false).ToArray());
  41. endStations = endStations.Where(v => v.Data.TASKNUM == 0 && !v.Data.PH_STATUS).ToArray();
  42. if (endStations.Length == 0)
  43. {
  44. return;
  45. }
  46. //if (Ltc.Do(dev, v => !v.Entity.WakeupOn(10000, "月台扫码")))
  47. // return;
  48. var resp = WMS.InBound(barcode, dev.Entity.CODE, true);
  49. var target = resp.TunnelNum.Split(',').Select(v => endStations.FirstOrDefault(d => d.Entity.TunnelNum().ToString() == v))
  50. .Where(v => v != null)
  51. .Select(v => new { Conv = v, SC = v.Entity.ROUTES.First().NEXT.ROUTES.Where(v => v.NEXT.IsSC()).First().NEXT.Device<ISC521>() })
  52. .OrderBy(v => v.Conv.Entity.TunnelNum() == 2 ? 0 : 1)
  53. .ThenBy(v=> {
  54. try
  55. {
  56. return v.SC.Data.Tunnel == v.Conv.Entity.TunnelNum() ? 0 : 1;
  57. }
  58. catch
  59. {
  60. return 99;
  61. }
  62. })
  63. .Select(v => v.Conv)
  64. .FirstOrDefault();
  65. if (target == null)
  66. {
  67. throw new Exception("路径计算失败");
  68. }
  69. DB.Do(db =>
  70. {
  71. var task = new WCS_TASK
  72. {
  73. TYPE = TaskType.入库,
  74. STATUS = WCS.Entity.TaskStatus.执行中,
  75. BARCODE = barcode,
  76. TUNNEL = target.Entity.Tunnel(),
  77. ADDRFROM = dev.Entity.CODE,
  78. WMSTASK = int.Parse(resp.WMSTaskNum),
  79. UPDATETIME = DateTime.Now,
  80. UPDATEUSER = "WCS",
  81. ADDRTO = target.Entity.CODE,
  82. FLOOR = 1,
  83. //ADDRCURRENT = dev.Entity.CODE
  84. };
  85. db.Default.Set<WCS_TASK>().Add(task);
  86. db.Default.SaveChanges();
  87. dev.Data2.GOODSEND = target.Entity.Code();
  88. dev.Data2.TASKNUM = task.ID;
  89. dev.Data2.CONFIRM = true;
  90. });
  91. }
  92. }
  93. }