TaskExtension.cs 7.1 KB

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