一楼出库.cs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. using DBHelper;
  2. using System.Linq;
  3. using WCS.Core;
  4. using WCS.Entity;
  5. using WCS.Entity.Protocol;
  6. using WCS.Service.Extensions;
  7. namespace WCS.Service.Works.Station
  8. {
  9. [WorkTitle(typeof(ProductHandler), "一楼出库堆垛机放货完成后分配下一个地址")]
  10. public class 一楼出库 : DeviceWork<StationDevice>
  11. {
  12. protected override void Do(StationDevice obj)
  13. {
  14. obj.EX(obj =>
  15. {
  16. //正在运行
  17. if (obj.Data3.Status.HasFlag(StationStatus.运行状态位)) throw new DoException("运行中");
  18. //上一次的任务还未执行
  19. if (obj.Data.VoucherNo != obj.Data2.VoucherNo) throw new WarnException($"等待任务[{obj.Data2.Tasknum}]执行");
  20. //没有光电
  21. if (!obj.Data2.Status.HasFlag(IstationStatus.光电状态)) throw new DoException("无光电"); ;
  22. //没有请求
  23. if (obj.Data2.Request != IstationRequest.堆垛机放货完成请求目标地址) throw new WarnException($"有光电无堆垛机放货完成请求");
  24. //找到当前站台为当前设备且任务为堆垛机完成的任务
  25. DB.Do(db =>
  26. {
  27. var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.TYPE == TaskType.出库 && v.SRMSTATION == obj.Entity.CODE && v.STATUS == TaskStatus.堆垛机完成) ?? throw new WarnException("无任务");
  28. var tasks = db.Default.Set<WCS_TASK>().Where(v => v.TaskGroupKey == task.TaskGroupKey);
  29. if (tasks.Any(v => v.STATUS != TaskStatus.堆垛机完成 && v.STATUS != TaskStatus.执行中))
  30. throw new WarnException("任务异常,同组任务状态不为堆垛机完成或执行中");
  31. if (task == null) throw new WarnException("WCS无该任务信息");
  32. if (task.SRMSTATION != obj.Entity.CODE && task.STATUS != TaskStatus.堆垛机完成) throw new WarnException("任务状态不是堆垛机完成");
  33. task.STATUS = TaskStatus.执行中;
  34. db.Default.SaveChanges();
  35. task.CreateStatusLog(db, $"状态由[{TaskStatus.堆垛机完成}]变更为[{task.STATUS}]-{obj.Entity.Code}", this.GetType());
  36. //开始写入目标地址
  37. obj.Data.Tasknum = task.ID;
  38. obj.Data.Goodsstart = obj.Entity.CODE.ToShort();
  39. obj.Data.Goodsend = task.ADDRNEXT.ToShort();
  40. obj.Data.Goodsnum = (short)tasks.Count();
  41. obj.Data.CmdType = IstationCmdType.堆垛机放货完成请求目标地址;
  42. obj.Data.VoucherNo++;
  43. });
  44. });
  45. }
  46. protected override bool SelectDevice(WCS_DEVICE dev)
  47. {
  48. return dev.Is(DF.SRM月台放货);
  49. }
  50. }
  51. [WorkTitle(typeof(ProductHandler), "月台出货口完成任务")]
  52. public class 月台完成任务 : Work<StationDeviceGroup>
  53. {
  54. protected override void Do(StationDeviceGroup obj)
  55. {
  56. obj.EX(obj =>
  57. {
  58. //找到当前站台为当前设备且任务为堆垛机完成的任务
  59. DB.Do(db =>
  60. {
  61. foreach (var dev in obj.Items)
  62. {
  63. //当前组有一个运行的设备就停止执行
  64. if (dev.Data3.Status.HasFlag(StationStatus.运行状态位)) continue;
  65. if (dev.Data2.Status.HasFlag(IstationStatus.光电状态)) continue;
  66. if (dev.Data2.Tasknum < 10000) continue;
  67. if (dev.Data2.Request != IstationRequest.月台出库口任务完成) continue;
  68. if (dev.Data2.Tasknum < 10000) continue;
  69. var task = db.Default.Set<WCS_TASK>().Where(v => v.ID == dev.Data2.Tasknum).FirstOrDefault();
  70. if (task.STATUS == TaskStatus.新建)
  71. throw new WarnException($"{task.ID}任务状态错误");
  72. task.STATUS = TaskStatus.已完成;
  73. task.ENDTIME = System.DateTime.Now;
  74. db.Default.SaveChanges();
  75. task.CreateStatusLog(db, $"状态由[{TaskStatus.执行中}]变更为[{task.STATUS}]-{dev.Entity.CODE}", this.GetType());
  76. dev.Data.CmdType = IstationCmdType.月台出库口任务完成;
  77. dev.Data.VoucherNo++;
  78. }
  79. });
  80. });
  81. }
  82. protected override bool SelectDevice(WCS_DEVICE dev)
  83. {
  84. return dev.Is(DF.月台);
  85. }
  86. }
  87. }