DeviceExtentions.cs 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  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;
  8. using WCS.Entity.Protocol.Station;
  9. namespace WCS.Service
  10. {
  11. public static class DeviceExtentions
  12. {
  13. public static IBCR80 BCR(this WCS_DEVICE source)
  14. {
  15. var dev = Device.Find("BCR" + source.CODE);
  16. return dev.PROTOCOLS.First().Data<IBCR80>();
  17. }
  18. public static short PalletType(this WCS_DEVICE source)
  19. {
  20. return (short)source.Get<int>("PalletType");
  21. }
  22. public static short ProductLine(this WCS_DEVICE source)
  23. {
  24. return (short)source.Get<int>("ProductLine");
  25. }
  26. public static short WorkShop(this WCS_DEVICE source)
  27. {
  28. return (short)source.Get<int>("WorkShop");
  29. }
  30. /// <summary>
  31. /// 获取从source到endaddr的路径中的所有位置
  32. /// </summary>
  33. /// <param name="source">起始位置</param>
  34. /// <param name="endAddr">目标位置</param>
  35. /// <param name="condition">路径筛选条件</param>
  36. /// <returns></returns>
  37. public static List<WCS_DEVICE> GetPath(this WCS_DEVICE source, string endAddr, Func<List<WCS_DEVICE>, bool> condition = null)
  38. {
  39. var q = source.PATHS.Where(v => v.START == source & v.END.CODE.Contains(endAddr.ToUpper()))
  40. .Select(v => v.PATH.Split('-').Select(v => Device.Find(v)).ToList());
  41. if (condition != null)
  42. q = q.Where(condition);
  43. return q.FirstOrDefault();
  44. }
  45. /// <summary>
  46. /// 获取从source到endaddr的路径中的第一个位置
  47. /// </summary>
  48. /// <param name="source">起始位置</param>
  49. /// <param name="endAddr">目标位置</param>
  50. /// <param name="condition">路径筛选条件</param>
  51. /// <returns></returns>
  52. public static WCS_DEVICE GetPath(this WCS_DEVICE source, string endAddr)
  53. {
  54. if (source.CODE == "TY7" && endAddr == "1340")
  55. {
  56. var c = 0;
  57. }
  58. var q = source.PATHS.Where(v => v.START == source && v.END.CODE.Contains(endAddr.ToUpper()))
  59. .Select(v => v.PATH.Split('-').Select(v => Device.Find(v)).ToList());
  60. var a = source.PATHS.Where(v => v != null && v.START != null && v.END != null && v.START == source && v.END.CODE.Contains(endAddr.ToUpper()));
  61. var b = a.Select(v => v.PATH.Split('-').Select(v => Device.Find(v)).ToList());
  62. return q.FirstOrDefault().FirstOrDefault();
  63. }
  64. public static WCS_DEVICE GetNext(this WCS_DEVICE source, string endAddr)
  65. {
  66. return source.GetNext(endAddr, null);
  67. }
  68. /// <summary>
  69. /// 获取从source到endaddr的路径中的下一个位置
  70. /// </summary>
  71. /// <param name="source">起始位置</param>
  72. /// <param name="endAddr">目标位置</param>
  73. /// <param name="condition">路径筛选条件</param>
  74. /// <returns></returns>
  75. public static WCS_DEVICE GetNext(this WCS_DEVICE source, string endAddr, Func<List<WCS_DEVICE>, bool> condition)
  76. {
  77. var path = source.GetPath(endAddr, condition);
  78. if (Ltc.Do(path, v => v == null || v.Count == 0))
  79. return null;
  80. if (source.IsConv())
  81. {
  82. var obj = path.FirstOrDefault(v => !v.IsConv());
  83. if (obj == null)
  84. {
  85. return path.Last();
  86. }
  87. //else if (obj.IsSC() || obj.IsTunnel())
  88. //{
  89. // var lastConv = path.TakeWhile(v => v.IsConv()).LastOrDefault();
  90. // return lastConv;
  91. //}
  92. else if (obj.IsRGV())
  93. {
  94. var target = path.Skip(path.IndexOf(obj) + 1).FirstOrDefault();
  95. return target;
  96. }
  97. else
  98. return null;
  99. }
  100. else
  101. {
  102. return path.First();
  103. }
  104. }
  105. public static bool IsRGV(this WCS_DEVICE source)
  106. {
  107. return source.PROTOCOLS.Any(v => v.DB.PROTOCOL == typeof(IRGV520).AssemblyQualifiedName);
  108. }
  109. public static bool IsConv(this WCS_DEVICE source)
  110. {
  111. return source.PROTOCOLS.Any(v => v.DB.PROTOCOL == typeof(IStation521).AssemblyQualifiedName);
  112. }
  113. /// <summary>
  114. /// 是否堆垛机
  115. /// </summary>
  116. /// <param name="source"></param>
  117. /// <returns></returns>
  118. public static bool IsSC(this WCS_DEVICE source)
  119. {
  120. return source.PROTOCOLS.Any(v => v.DB.PROTOCOL == typeof(ISRM520).AssemblyQualifiedName);
  121. }
  122. //public static bool IsRobot(this WCS_DEVICE source)
  123. //{
  124. // return source.PROTOCOLS.Any(v => v.DB.PROTOCOL == typeof(IRobot).AssemblyQualifiedName);
  125. //}
  126. //public static bool IsRobotStation(this WCS_DEVICE source)
  127. //{
  128. // return source.PROTOCOLS.Any(v => v.DB.PROTOCOL == typeof(IRobotStation).AssemblyQualifiedName);
  129. //}
  130. public static bool IsTunnel(this WCS_DEVICE source)
  131. {
  132. return source.PROTOCOLS.Count == 0 && source.CODE.StartsWith("T");
  133. }
  134. }
  135. public static class TaskExtentions
  136. {
  137. public static string AddrCurrent(this WCS_TASK source, DB db)
  138. {
  139. var q = db.Default.Set<WCS_Station520>().Where(v => v.ISLAST && v.Tasknum == source.ID).Select(v => new { type = 1, v.DEVICE.CODE });
  140. q = q.Union(db.Default.Set<WCS_RGV521>().Where(v => v.ISLAST && (v.TaskID_1 == source.ID || v.TaskID_2 == source.ID)).Select(v => new { type = 2, v.DEVICE.CODE }));
  141. //q = q.Union(db.Default.Set<WCS_SC521>().Where(v => v.ISLAST && v.TaskID == source.ID).Select(v => new { type = 2, v.DEVICE.CODE }));
  142. //q = q.Union(db.Default.Set<WCS_Robot>().Where(v => v.ISLAST && v.TaskID == source.ID).Select(v => new { type = 2, v.DEVICE.CODE }));
  143. var res = q.OrderBy(v => v.type).FirstOrDefault();
  144. if (res == null)
  145. return "";
  146. return res.CODE;
  147. }
  148. }
  149. }