DeviceExtentions.cs 5.4 KB

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