TaskExtension.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. using DBHelper;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using WCS.Core;
  6. using WCS.Entity;
  7. namespace WCS.Service.Extensions
  8. {
  9. /// <summary>
  10. /// 任务扩展
  11. /// </summary>
  12. public static class TaskExtension
  13. {
  14. public static T Create<T>(this WCS_TASK source)
  15. {
  16. return (T)Activator.CreateInstance(typeof(T), source);
  17. }
  18. /// <summary>
  19. /// 获取可用的出库任务
  20. /// </summary>
  21. /// <param name="tasks"></param>
  22. /// <returns></returns>
  23. public static Task[] GetOutTask(this List<WCS_TASK> tasks)
  24. {
  25. var tasklist = tasks.Select(v => v.Create<Task>());
  26. var task = tasklist.FirstOrDefault() ?? throw new WarnException("无可用出库任务--GetOutTask");
  27. //AGV任务ID不为零表示为车间叫料任务
  28. if (task.AgvTask != 0)
  29. {
  30. //按照AGV任务ID分一次组
  31. tasklist = tasklist.OrderByDescending(v => v.Priority)
  32. .ThenBy(v => v.CREATETIME)
  33. .GroupBy(v => v.AgvTask)
  34. .FirstOrDefault() ?? throw new WarnException("无可用叫料任务--GetOutTask");
  35. //无论这个AGV任务绑定的货物相隔多远都必须要一起出出去
  36. return tasklist.OrderBy(v => v.Col).ToArray();
  37. }
  38. return tasks.Select(v => v.Create<Task>())
  39. .OrderByDescending(v => v.Priority)
  40. .ThenBy(v => v.Line)
  41. .ThenBy(v => v.Layer)
  42. .ThenBy(v => v.Col)
  43. .Take(2)
  44. .DistinctBy(v => v.Col)
  45. .OrderBy(v => v.Col)
  46. .ToArray();
  47. }
  48. /// <summary>
  49. /// 获取出库任务的站台号及下一个地址
  50. /// </summary>
  51. /// <param name="task">任务</param>
  52. /// <param name="srmFork">货叉</param>
  53. public static void GetSrmStationAndaddNext(this WCS_TASK task, SrmFork srmFork)
  54. {
  55. //取任务巷道到达目标地址的下一个地址,即任务堆垛机的站台对应的设备组
  56. var stations = Device.Where(v => v.DEVICEGROUP.Any(p => p.MEMBER == Device.Find(task.TUNNEL).GetPath(task.ADDRTO.Replace("G", ""))))
  57. .Select(v => v.Create<StationDeviceGroup>())
  58. .FirstOrDefault().Items
  59. .OrderByDescending(v => v.Entity.CODE)
  60. .ToArray();
  61. //一工位放较大的站台号
  62. switch (srmFork)
  63. {
  64. case SrmFork.货叉1:
  65. task.SRMSTATION = stations[0].Entity.CODE;
  66. task.ADDRNEXT = stations[0].Entity.GetPath(task.ADDRTO).CODE;
  67. break;
  68. case SrmFork.货叉2:
  69. task.SRMSTATION = stations[1].Entity.CODE;
  70. task.ADDRNEXT = stations[1].Entity.GetPath(task.ADDRTO).CODE;
  71. break;
  72. }
  73. }
  74. /// <summary>
  75. /// 有效任务数是否符合任务组任务数
  76. /// </summary>
  77. /// <param name="tasks"></param>
  78. /// <param name="executable"></param>
  79. /// <param name="db"></param>
  80. public static void ValidTaskCheck(this List<WCS_TASK> tasks, int executable, DB db)
  81. {
  82. var task = tasks.FirstOrDefault();
  83. var taskCount = db.Default.Set<WCS_TASK>().Count(v => v.TaskGroupKey == task.TaskGroupKey && v.TYPE == TaskType.入库);
  84. //开始检查任务数是否匹配
  85. if (executable != taskCount) throw new WarnException($"可执行数{executable},任务组任务数{taskCount},数量不匹配,{task.ID}-{task.TaskGroupKey}");
  86. }
  87. }
  88. public enum SrmIndex
  89. {
  90. 工位一 = 0,
  91. 工位二 = 1,
  92. }
  93. public class Task : WCS_TASK
  94. {
  95. /// <summary>
  96. /// 行
  97. /// </summary>
  98. public short Line { get; set; }
  99. /// <summary>
  100. /// 列
  101. /// </summary>
  102. public short Col { get; set; }
  103. /// <summary>
  104. /// 层
  105. /// </summary>
  106. public short Layer { get; set; }
  107. public Task(WCS_TASK task)
  108. {
  109. var addrFrom = task.ADDRFROM.Split("-");
  110. ADDRTO = task.ADDRTO;
  111. TUNNEL = task.TUNNEL;
  112. DEVICE = task.DEVICE;
  113. Priority = task.Priority;
  114. AgvTask = task.AgvTask;
  115. CREATETIME = task.CREATETIME; ;
  116. ID = task.ID;
  117. Line = addrFrom[0].ToShort();
  118. Col = addrFrom[1].ToShort();
  119. Layer = addrFrom[2].ToShort();
  120. }
  121. }
  122. }