码垛缓存放行.cs 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. using ServiceCenter.SqlSugars;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.ComponentModel;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. using WCS.Core;
  9. using WCS.Entity;
  10. using WCS.Entity.Protocol.BCR;
  11. using WCS.Entity.Protocol.Station;
  12. using WCS.WorkEngineering.Worlds;
  13. using WCS.WorkEngineering.Extensions;
  14. using ServiceCenter.Redis;
  15. using WCS.WorkEngineering.WebApi.Models.WCS.Request;
  16. using Newtonsoft.Json;
  17. using ServiceCenter.Extensions;
  18. using TaskStatus = WCS.Entity.TaskStatus;
  19. using Autofac.Core;
  20. using SqlSugar;
  21. namespace WCS.WorkEngineering.Systems
  22. {
  23. [BelongTo(typeof(RobotBCRWorld))]
  24. [Description("码垛缓存放行")]
  25. public class 码垛缓存放行 : DeviceSystem<Device<IStation520, IStation521, IStation523>>
  26. {
  27. protected override bool ParallelDo => true;
  28. public override void Do(Device<IStation520, IStation521, IStation523> obj)
  29. {
  30. if (obj.Data.VoucherNo != obj.Data2.VoucherNo)
  31. {
  32. World.Log("PLC正在处理");
  33. return;
  34. }
  35. if (obj.Data2.Request == 0)
  36. {
  37. World.Log("无请求");
  38. return;
  39. }
  40. World.Log($"码垛放行{obj.Entity.Code}交互开始时间:任务号 {obj.Data2.TaskNumber} | " + DateTime.Now.ToString("yyyyMMddHHmmss"));
  41. SqlSugarHelper.Do(db =>
  42. {
  43. var task1 = db.Default.Queryable<WCS_TaskInfo>().Where(v => v.ID == obj.Data2.TaskNumber).First();
  44. var addrTo = obj.Entity.GetFlag("码垛工位");
  45. addrTo = task1.AddrTo;
  46. var addrScan = Device.All.Where(v => v.HasProtocol<IStation521>() && v.HasFlag("装箱码垛") && v.HasFlag("码垛工位", addrTo) && v.HasFlag("位置", "扫码")).First();
  47. var pallet = db.Default.Queryable<Palletizing>().With(SqlWith.NoLock).Where(v => v.PalletizState == 0 && v.Equip == addrTo).First();
  48. if (pallet.ID != task1.PalletizingID) //不是正在码垛的箱
  49. {
  50. if (db.Default.Queryable<WCS_TaskInfo>().Any(x => pallet.ID == x.PalletizingID && x.Status < TaskStatus.码垛抓取扫码))
  51. {
  52. var error = new BaseErrorinfoWcs()
  53. {
  54. ContBarCode = task1.BarCode,
  55. Message = $"码垛缓存放行|{obj.Entity.Code},条码{task1.BarCode}拒绝放行,上一箱码垛未结束,{DateTime.Now:yyyyMMddHH}",
  56. Count = 1,
  57. Memo = "WCS"
  58. };
  59. error.UpdataErrorinfo();
  60. //上一箱的任务没有全部过扫码器
  61. throw new Exception($"上一箱正在码垛中!!!");
  62. }
  63. }
  64. var devCodeList = Device.All.Where(x => x.Code is "5100" or "5086" or "5070" or "5056" or "5310" or "5295" or "5280" or "5265").Select(x => new Device<IStation521>(x, World)).Where(x => x.Data.Request == 1).Select(x => x.Entity.Code).ToList();
  65. //检查当前线体缓存是不是当前箱中最少的
  66. var addrNextGroup = db.Default.Queryable<WCS_TaskInfo>().With(SqlWith.NoLock).Where(x =>
  67. x.PalletizingID == task1.PalletizingID && x.Status == TaskStatus.码垛缓存扫码)
  68. .ToList().GroupBy(x => x.AddrNext).Where(x => devCodeList.Contains(x.Key)).MinBy(x => x.Count());
  69. if (addrNextGroup != null && obj.Entity.Code != addrNextGroup.Key)
  70. {
  71. var error = new BaseErrorinfoWcs()
  72. {
  73. ContBarCode = task1.BarCode,
  74. Message = $"码垛缓存放行|{obj.Entity.Code},条码{task1.BarCode}拒绝放行,等待{addrNextGroup.Key}放行结束,{DateTime.Now:yyyyMMddHH}",
  75. Count = 1,
  76. Memo = "WCS"
  77. };
  78. error.UpdataErrorinfo();
  79. return;// 不是当前任务箱中最少的
  80. }
  81. var qty = db.Default.Queryable<WCS_TaskInfo>()
  82. .Where(v => v.Type == TaskType.OutDepot && v.BusType == "装箱码垛")
  83. .Where(v => v.Status == Entity.TaskStatus.码垛抓取扫码 || v.Status == TaskStatus.码垛缓存放行)
  84. .Where(v => v.AddrTo == addrTo).Count();
  85. //找到同组的设备号
  86. var devCode = obj.Entity.Code.ToShort();
  87. var devCodes = new List<string>() { obj.Entity.Code, (devCode - 1).ToString(), (devCode - 2).ToString() };
  88. var devList = Device.All.Where(x => devCodes.Contains(x.Code)).Select(x => new Device<IStation520, IStation521, IStation523>(x, World));
  89. devList = devList.Where(x => x.Data2.TaskNumber > 0).OrderByDescending(x => x.Entity.Code.ToShort());
  90. var maxQ = 9;
  91. //if (addrTo == "8098") maxQ = 9;
  92. if (qty + devList.Count() <= maxQ)
  93. {
  94. if (qty + devList.Count() > maxQ)
  95. {
  96. var number = maxQ - qty;
  97. devList = devList.OrderByDescending(x => x.Entity.Code.ToShort()).Take(number).ToList();
  98. }
  99. var taskidlist = devList.Select(p => p.Data2.TaskNumber).ToList();
  100. if (db.Default.Queryable<WCS_TaskInfo>().Where(v => taskidlist.Contains(v.ID) && v.Status > TaskStatus.码垛缓存扫码).Any())
  101. {
  102. MainWorld.Redis.Set($"Sx:WCSErrorInfo:{obj.Entity.Code}", JsonConvert.SerializeObject(new RedisError() { Equip = obj.Entity.Code, Con = $"{obj.Entity.Code},521任务号{obj.Data2.TaskNumber}错误", Time = DateTime.Now }));
  103. World.Log("码垛缓存放行:任务状态存在已经大于缓存扫码的任务:" + JsonConvert.SerializeObject(taskidlist));
  104. throw new Exception("任务状态存在已经大于缓存扫码的任务:" + JsonConvert.SerializeObject(taskidlist));
  105. }
  106. if (db.Default.Queryable<WCS_TaskInfo>().Where(v => taskidlist.Contains(v.ID) && v.AddrTo != addrTo).Any())
  107. {
  108. MainWorld.Redis.Set($"Sx:WCSErrorInfo:{obj.Entity.Code}", JsonConvert.SerializeObject(new RedisError() { Equip = obj.Entity.Code, Con = $"{obj.Entity.Code},521任务号{obj.Data2.TaskNumber}错误", Time = DateTime.Now }));
  109. World.Log("码垛缓存放行:码垛工位错误:" + JsonConvert.SerializeObject(taskidlist));
  110. throw new Exception("码垛工位错误:" + JsonConvert.SerializeObject(taskidlist));
  111. }
  112. foreach (var device in devList)
  113. {
  114. var task = db.Default.Queryable<WCS_TaskInfo>().Where(v => v.ID == device.Data2.TaskNumber && v.Status == TaskStatus.码垛缓存扫码).First();
  115. if (task == null)
  116. {
  117. MainWorld.Redis.Set($"Sx:WCSErrorInfo:{obj.Entity.Code}", JsonConvert.SerializeObject(new RedisError() { Equip = obj.Entity.Code, Con = $"{obj.Entity.Code},521任务号{obj.Data2.TaskNumber}错误", Time = DateTime.Now }));
  118. throw new Exception("任务号错误");
  119. }
  120. if (task.AddrTo != addrTo)
  121. {
  122. MainWorld.Redis.Set($"Sx:WCSErrorInfo:{obj.Entity.Code}", JsonConvert.SerializeObject(new RedisError() { Equip = obj.Entity.Code, Con = $"{obj.Entity.Code}任务{task.ID}码垛工位错误", Time = DateTime.Now }));
  123. throw new Exception($"任务{task.ID}码垛工位错误");
  124. }
  125. if (device.Entity.Code == obj.Entity.Code)//默认不会出现一条缓存线种同时存在两层的任务,如果出现请检查缓存线分配部分的逻辑是否正确
  126. {
  127. //var flag = db.Default.Queryable<WCS_TaskInfo>().Where(v => v.AgvTaskID < task.AgvTaskID).Where(v => v.PalletizingID == task.PalletizingID)
  128. // .Where(v => v.AddrTo == addrTo)
  129. // .Where(v => v.Status < Entity.TaskStatus.码垛抓取扫码).Any();
  130. //if (flag)
  131. //{
  132. // World.Log("上一层码垛任务未全部抓取完成");
  133. // MainWorld.Redis.Set($"Sx:WCSErrorInfo:{obj.Entity.Code}", JsonConvert.SerializeObject(new RedisError() { Equip = obj.Entity.Code, Con = obj.Entity.Code + "上一层码垛任务未全部抓取完成", Time = DateTime.Now }));
  134. // return;
  135. //}
  136. }
  137. task.Status = Entity.TaskStatus.码垛缓存放行;
  138. task.EditTime = DateTime.Now;
  139. db.Default.Updateable(task).ExecuteCommand();
  140. task.AddWCS_TASK_DTL(db.Default, obj.Entity.Code, "码垛缓存放行");
  141. device.Data.TaskNumber = task.ID;
  142. device.Data.GoodsEnd = short.Parse(addrScan.Code);
  143. MainWorld.Redis.Decr($"stockOperateNum{task.AddrTo}");
  144. World.Log("码垛缓存放行:" + device.Data.TaskNumber + "," + device.Data.GoodsEnd+",之前凭证号:"+ obj.Data.VoucherNo);
  145. }
  146. obj.Data.VoucherNo++;
  147. }
  148. });
  149. World.Log($"码垛放行{obj.Entity.Code}交互结束时间:任务号 {obj.Data2.TaskNumber} | " + DateTime.Now.ToString("yyyyMMddHHmmss"));
  150. }
  151. public override bool Select(Device dev)
  152. {
  153. return dev.HasFlag("装箱码垛") && dev.HasFlag("位置", "缓存");
  154. }
  155. }
  156. }