巷道口放行.cs 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. using NPOI.SS.Formula.Functions;
  2. using NPOI.SS.Formula.PTG;
  3. using ServiceCenter.SqlSugars;
  4. using SqlSugar;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.ComponentModel;
  8. using System.Linq;
  9. using System.Text;
  10. using System.Threading.Tasks;
  11. using WCS.Core;
  12. using WCS.Entity;
  13. using WCS.Entity.Protocol.Station;
  14. using WCS.WorkEngineering.Extensions;
  15. using WCS.WorkEngineering.Worlds;
  16. namespace WCS.WorkEngineering.Systems
  17. {
  18. [Description("巷道口放行")]
  19. [BelongTo(typeof(LoopLineWorld))]
  20. public class 巷道口放行 : DeviceSystem<Device<IStation520, IStation521>>
  21. {
  22. protected override bool ParallelDo => false;
  23. protected override List<Device<IStation520, IStation521>> Sort(List<Device<IStation520, IStation521>> objs)
  24. {
  25. var tasks = SqlSugarHelper.Do(db => db.Default.Queryable<WCS_TaskInfo>().With(SqlWith.NoLock).Where(v => v.Type == TaskType.OutDepot)).ToArray();
  26. var arr = objs.Select(v => new { Obj = v, ChangedTime = (v.Data2 as ProtocolProxyBase).ChangedTime, Task = tasks.Where(d => d.ID == v.Data2.TaskNumber).FirstOrDefault() })
  27. .Select(v => new { Obj = v.Obj, ChangedTime = v.ChangedTime, Type = v.Task == null ? 999 : (v.Task.BusType == "装箱码垛" ? 1 : 2), Pallet = v.Task == null ? 0 : v.Task.PalletizingID, LayerID = v.Task == null ? 0 : v.Task.AgvTaskID }).ToArray();
  28. arr = arr.OrderBy(v => v.Type)//成品码垛优先
  29. .ThenBy(v => v.Pallet)//按装箱ID排序
  30. .ThenBy(v => v.LayerID)//按层配排序
  31. .ThenBy(v => v.ChangedTime)//按等待时间排序
  32. .ToArray();
  33. var res = arr.Select(v => v.Obj).ToList();
  34. return res;
  35. }
  36. private Dictionary<string, List<Device<IStation521>>> DeviceOfFloor = new Dictionary<string, List<Device<IStation521>>>();
  37. public 巷道口放行()
  38. {
  39. for (int i = 1; i <= 3; i++)
  40. {
  41. var convs = Device.All.Where(v => v.HasProtocol<IStation521>() && v.HasFlag("Floor", i.ToString()))
  42. .Select(v => new Device<IStation521>(v, this.World)).ToList();
  43. DeviceOfFloor[i.ToString()] = convs;
  44. }
  45. }
  46. public override void Do(Device<IStation520, IStation521> obj)
  47. {
  48. if (obj.Data.VoucherNo != obj.Data2.VoucherNo)
  49. return;
  50. if (obj.Data2.Request == 0)
  51. return;
  52. var code = short.Parse(obj.Entity.Code);
  53. string floor = obj.Entity.GetFlag("Floor");
  54. var devout = Device.All.Where(v => v.HasFlag("出库扫码") && v.HasFlag("Floor", floor)).First();
  55. var outdevCode = short.Parse(devout.Code);
  56. var convs = DeviceOfFloor[floor];
  57. if (obj.Data2.GoodsStart == 1)//成品码垛
  58. {
  59. var qty = convs.Where(v => v.Data.TaskNumber > 0 && v.Data.GoodsStart == 1 && v.Data.GoodsEnd >= outdevCode).Count();
  60. if (qty >= 15)
  61. {
  62. World.Log("环线成品码垛提升机缓存已满");
  63. return;
  64. }
  65. SqlSugarHelper.Do(db =>
  66. {
  67. var task = db.Default.Queryable<WCS_TaskInfo>().With(SqlWith.NoLock).Where(v => v.ID == obj.Data2.TaskNumber).First();
  68. if (task == null)
  69. {
  70. throw new Exception($"任务号{obj.Data2.TaskNumber}不存在");
  71. }
  72. // var sSql = @"select count(distinct DocID)
  73. //from WCS_TaskInfo a with(nolock)
  74. //where Type=2 and BusType='装箱码垛' and Status<50
  75. //and a.Robot='" + task.Robot + @"'
  76. //and (a.DocID<" + task.DocID + " or (a.DocID=" + task.DocID + " and a.AgvTaskID<" + task.AgvTaskID + " ))";
  77. // var rc = db.Default.Ado.SqlQuery<int>(sSql).First();
  78. // if (rc > 1)
  79. // {
  80. // World.Log($"{task.Robot}第三箱排队等待巷道放行{rc}");
  81. // return;
  82. // }
  83. // sSql = @"select count(*)
  84. //from WCS_TaskInfo a with(nolock)
  85. //where Type=2 and BusType='装箱码垛' and Status<50
  86. //and a.Robot='" + task.Robot + @"'
  87. //and (a.DocID<" + task.DocID + " or (a.DocID=" + task.DocID + " and a.AgvTaskID<" + task.AgvTaskID + " ))";
  88. // rc = db.Default.Ado.SqlQuery<int>(sSql).First();
  89. // if (rc > 10)
  90. // {
  91. // World.Log($"{task.Robot}排队等待巷道放行{rc}");
  92. // return;
  93. // }
  94. //var qty = db.Default.Queryable<WCS_TaskInfo>()
  95. //.Where(v => v.Type == TaskType.OutDepot && v.BusType == "装箱码垛" && v.AddrTo == task.AddrTo)
  96. //.Where(v => v.Status > Entity.TaskStatus.巷道口放行 && v.Status < Entity.TaskStatus.码垛抓取中).Count();
  97. //var max = 12;
  98. //if (qty >= max)
  99. //{
  100. // World.Log($"目的地为码垛位{task.AddrTo}的任务缓存数已达{max}");
  101. // return;
  102. //}
  103. db.Default.Updateable<WCS_TaskInfo>()
  104. .SetColumns(v => new WCS_TaskInfo { Status = Entity.TaskStatus.巷道口放行, EditTime = SqlFunc.GetDate() })
  105. .Where(v => v.ID == task.ID)
  106. .ExecuteCommand();
  107. obj.Data.GoodsStart = obj.Data2.GoodsStart;
  108. obj.Data.TaskNumber = obj.Data2.TaskNumber;
  109. obj.Data.GoodsEnd = short.Parse(devout.Code);
  110. obj.Data.VoucherNo++;
  111. });
  112. }
  113. else if (obj.Data2.GoodsStart == 2 || obj.Data2.GoodsStart == 3)//扭转检测
  114. {
  115. var qty = convs.Where(v => v.Data.TaskNumber > 0 && v.Data.GoodsEnd >= outdevCode)
  116. .Where(v => v.Data.GoodsStart == 2 || v.Data.GoodsStart == 3).Count();
  117. if (qty >= 11)
  118. {
  119. World.Log("环线扭转检车提升机缓存已满");
  120. return;
  121. }
  122. obj.Data.GoodsStart = obj.Data2.GoodsStart;
  123. obj.Data.TaskNumber = obj.Data2.TaskNumber;
  124. if (obj.Data2.GoodsStart == 2)
  125. {
  126. obj.Data.GoodsEnd = 4002;
  127. //if (floor == "1")
  128. // obj.Data.GoodsEnd = 3618;
  129. //else if (floor == "2")
  130. // obj.Data.GoodsEnd = 3318;
  131. //else if (floor == "3")
  132. // obj.Data.GoodsEnd = 3018;
  133. }
  134. else
  135. {
  136. obj.Data.GoodsEnd = 5186;
  137. }
  138. obj.Data.VoucherNo++;
  139. }
  140. else//
  141. {
  142. throw new Exception("GoodsStart值有误");
  143. }
  144. }
  145. public override bool Select(Device dev)
  146. {
  147. return dev.HasFlag("位置", "巷道口放行");
  148. }
  149. }
  150. }