TaskExtension.cs 5.8 KB

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