堆垛机.cs 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. using Newtonsoft.Json;
  2. using ServiceCenter.Logs;
  3. using ServiceCenter.SqlSugars;
  4. using SqlSugar;
  5. using System.ComponentModel;
  6. using WCS.Core;
  7. using WCS.Entity;
  8. using WCS.Entity.Protocol.BCR;
  9. using WCS.Entity.Protocol.SRM;
  10. using WCS.Entity.Protocol.Station;
  11. using WCS.WorkEngineering.Extensions;
  12. using WCS.WorkEngineering.WebApi.Models.WCS.Request;
  13. //using WCS.WorkEngineering.WebApi.Controllers;
  14. //using WCS.WorkEngineering.WebApi.Models.WMS.Request;
  15. using WCS.WorkEngineering.Worlds;
  16. using DeviceFlags = WCS.WorkEngineering.Extensions.DeviceFlags;
  17. namespace WCS.WorkEngineering.Systems
  18. {
  19. [BelongTo(typeof(MainWorld))]
  20. [Description("堆垛机")]
  21. public class 堆垛机 : DeviceSystem<SRM>
  22. {
  23. protected override bool ParallelDo => true;
  24. public 堆垛机()
  25. {
  26. }
  27. public override void Do(SRM obj)
  28. {
  29. obj.Data.HB = (short)(obj.Data.HB == 0 ? 1 : 0);
  30. if (obj.Data.VoucherNo != obj.Data2.VoucherNo)
  31. return;
  32. if (obj.Data2.Alarm != 0)
  33. {
  34. MainWorld.Redis.Set($"Sx:WCSInfo:{obj.Entity.Code}", JsonConvert.SerializeObject(new RedisError() { Equip = obj.Entity.Code, Con = $"{obj.Entity.Code}" + obj.Data3.Alarm.Description() + obj.Data3.Alarm1.Description(), Time = DateTime.Now }));
  35. return;
  36. }
  37. if (obj.Data2.Mode != SrmMode.自动)
  38. return;
  39. if (obj.Data.OkAck1 == 1)
  40. {
  41. if (obj.Data2.FinishedTaskID1 == 0)
  42. obj.Data.OkAck1 = 0;
  43. return;
  44. }
  45. if (obj.Data.OkAck2 == 1)
  46. {
  47. if (obj.Data2.FinishedTaskID2 == 0)
  48. obj.Data.OkAck2 = 0;
  49. return;
  50. }
  51. if(obj.Data.CancelAck1 == 1)
  52. {
  53. if (obj.Data2.Cancel1 == 0)
  54. obj.Data.CancelAck1 = 0;
  55. return;
  56. }
  57. if (obj.Data.CancelAck2 == 1)
  58. {
  59. if (obj.Data2.Cancel2 == 0)
  60. obj.Data.CancelAck2 = 0;
  61. return;
  62. }
  63. //同时完成的情况一起处理
  64. if (obj.Data2.FinishedTaskID1 != 0 && obj.Data2.FinishedTaskID2 != 0)
  65. {
  66. if (obj.Data2.FinishedTaskID1 != obj.Data.TaskID1)
  67. {
  68. MainWorld.Redis.Set($"Sx:WCSErrorInfo:{obj.Entity.Code}", JsonConvert.SerializeObject(new RedisError() { Equip = obj.Entity.Code, Con = $"{obj.Entity.Code}完成任务号{obj.Data2.FinishedTaskID1}有误", Time = DateTime.Now }));
  69. throw new Exception($"完成任务号{obj.Data2.FinishedTaskID1}有误");
  70. }
  71. if (obj.Data2.FinishedTaskID2 != obj.Data.TaskID2)
  72. {
  73. MainWorld.Redis.Set($"Sx:WCSErrorInfo:{obj.Entity.Code}", JsonConvert.SerializeObject(new RedisError() { Equip = obj.Entity.Code, Con = $"{obj.Entity.Code}完成任务号{obj.Data2.FinishedTaskID2}有误", Time = DateTime.Now }));
  74. throw new Exception($"完成任务号{obj.Data2.FinishedTaskID2}有误");
  75. }
  76. World.Log("开始处理堆垛机完成任务1和2");
  77. WMS.堆垛机完成(obj.Data2.FinishedTaskID1);
  78. WMS.堆垛机完成(obj.Data2.FinishedTaskID2);
  79. SqlSugarHelper.Do(db =>
  80. {
  81. obj.FinishTask(db, obj.Data2.FinishedTaskID1, obj.Entity.Code);
  82. obj.Data.OkAck1 = 1;
  83. obj.FinishTask(db, obj.Data2.FinishedTaskID2, obj.Entity.Code);
  84. obj.Data.OkAck2 = 1;
  85. World.Log("结束堆垛机完成任务1和2");
  86. });
  87. return;
  88. }
  89. if (obj.Data2.FinishedTaskID1 != 0)
  90. {
  91. if (obj.Data2.FinishedTaskID1 != obj.Data.TaskID1)
  92. {
  93. MainWorld.Redis.Set($"Sx:WCSErrorInfo:{obj.Entity.Code}", JsonConvert.SerializeObject(new RedisError() { Equip = obj.Entity.Code, Con = $"{obj.Entity.Code}完成任务号{obj.Data2.FinishedTaskID1}有误", Time = DateTime.Now }));
  94. throw new Exception($"完成任务号{obj.Data2.FinishedTaskID1}有误");
  95. }
  96. World.Log("开始处理堆垛机完成任务1");
  97. WMS.堆垛机完成(obj.Data2.FinishedTaskID1);
  98. SqlSugarHelper.Do(db =>
  99. {
  100. obj.FinishTask(db, obj.Data2.FinishedTaskID1, obj.Entity.Code);
  101. obj.Data.OkAck1 = 1;
  102. World.Log("结束堆垛机完成任务1");
  103. });
  104. return;
  105. }
  106. if (obj.Data2.FinishedTaskID2 != 0)
  107. {
  108. if (obj.Data2.FinishedTaskID2 != obj.Data.TaskID2)
  109. {
  110. MainWorld.Redis.Set($"Sx:WCSErrorInfo:{obj.Entity.Code}", JsonConvert.SerializeObject(new RedisError() { Equip = obj.Entity.Code, Con = $"{obj.Entity.Code}完成任务号{obj.Data2.FinishedTaskID2}有误", Time = DateTime.Now }));
  111. throw new Exception($"完成任务号{obj.Data2.FinishedTaskID2}有误");
  112. }
  113. World.Log("开始处理堆垛机完成任务2");
  114. WMS.堆垛机完成(obj.Data2.FinishedTaskID2);
  115. SqlSugarHelper.Do(db =>
  116. {
  117. obj.FinishTask(db, obj.Data2.FinishedTaskID2, obj.Entity.Code);
  118. obj.Data.OkAck2 = 1;
  119. World.Log("结束堆垛机完成任务2");
  120. });
  121. return;
  122. }
  123. if (obj.Data2.Cancel1 == 1)
  124. {
  125. //取消任务
  126. SqlSugarHelper.Do(db =>
  127. {
  128. var task = db.Default.Queryable<WCS_TaskInfo>().Where(v => v.ID == obj.Data2.TaskID1).First();
  129. if (task == null)
  130. {
  131. MainWorld.Redis.Set($"Sx:WCSErrorInfo:{obj.Entity.Code}", JsonConvert.SerializeObject(new RedisError() { Equip = obj.Entity.Code, Con = $"{obj.Entity.Code}取消任务时,任务号有误{obj.Data2.TaskID1}", Time = DateTime.Now }));
  132. throw new Exception("取消任务时,任务号有误");
  133. }
  134. if (task != null)
  135. {
  136. if (task.Type == TaskType.EnterDepot)
  137. {
  138. task.Status = Entity.TaskStatus.巷道分配;
  139. task.EditTime = DateTime.Now;
  140. task.ManualRemarks = "堆垛机取消任务";
  141. db.Default.Updateable(task).ExecuteCommand();
  142. task.AddWCS_TASK_DTL(db.Default, obj.Entity.Code, "堆垛机取消任务");
  143. }
  144. else if (task.Type == TaskType.OutDepot || task.Type == TaskType.TransferDepot)
  145. {
  146. task.Status = Entity.TaskStatus.NewBuild;
  147. task.EditTime = DateTime.Now;
  148. task.ManualRemarks = "堆垛机取消任务";
  149. db.Default.Updateable(task).ExecuteCommand();
  150. task.AddWCS_TASK_DTL(db.Default, obj.Entity.Code, "堆垛机取消任务");
  151. }
  152. else
  153. {
  154. throw new Exception($"取消任务功能不支持任务类型{task.Type}");
  155. }
  156. }
  157. obj.Data.CancelAck1 = 1;
  158. });
  159. }
  160. if (obj.Data2.Cancel2 == 1)
  161. {
  162. //取消任务
  163. SqlSugarHelper.Do(db =>
  164. {
  165. var task = db.Default.Queryable<WCS_TaskInfo>().Where(v => v.ID == obj.Data2.TaskID2).First();
  166. if (task == null)
  167. {
  168. MainWorld.Redis.Set($"Sx:WCSErrorInfo:{obj.Entity.Code}", JsonConvert.SerializeObject(new RedisError() { Equip = obj.Entity.Code, Con = $"{obj.Entity.Code}取消任务时,任务号有误{obj.Data2.TaskID2}", Time = DateTime.Now }));
  169. throw new Exception("取消任务时,任务号有误");
  170. }
  171. if (task.Type == TaskType.EnterDepot)
  172. {
  173. task.Status = Entity.TaskStatus.巷道分配;
  174. task.EditTime = DateTime.Now;
  175. task.ManualRemarks = "堆垛机取消任务";
  176. db.Default.Updateable(task).ExecuteCommand();
  177. task.AddWCS_TASK_DTL(db.Default, obj.Entity.Code, "堆垛机取消任务");
  178. }
  179. else if (task.Type == TaskType.OutDepot || task.Type == TaskType.TransferDepot)
  180. {
  181. task.Status = Entity.TaskStatus.NewBuild;
  182. task.EditTime = DateTime.Now;
  183. task.ManualRemarks = "堆垛机取消任务";
  184. db.Default.Updateable(task).ExecuteCommand();
  185. task.AddWCS_TASK_DTL(db.Default, obj.Entity.Code, "堆垛机取消任务");
  186. }
  187. else
  188. {
  189. throw new Exception($"取消任务功能不支持任务类型{task.Type}");
  190. }
  191. obj.Data.CancelAck2 = 1;
  192. });
  193. }
  194. if (obj.Data2.Status != SrmRunStatus.空闲)
  195. return;
  196. obj.Do();
  197. }
  198. public override bool Select(Device dev)
  199. {
  200. return "1,2,3".Split(',').Contains(dev.GetFlag("Floor"));
  201. }
  202. }
  203. }