NoInteractionSystems.cs 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. using PlcSiemens.Core.Extension;
  2. using ServiceCenter.Logs;
  3. using ServiceCenter.Redis;
  4. using ServiceCenter.SqlSugars;
  5. using System.ComponentModel;
  6. using WCS.Core;
  7. using WCS.Entity;
  8. using WCS.WorkEngineering.Extensions;
  9. using WCS.WorkEngineering.WebApi.Controllers;
  10. using WCS.WorkEngineering.WebApi.Models.AGV.Response;
  11. using WCS.WorkEngineering.Worlds;
  12. namespace WCS.WorkEngineering.Systems
  13. {
  14. /// <summary>
  15. /// 无交互系统
  16. /// </summary>
  17. [BelongTo(typeof(MainWorldd))]
  18. [Description("无交互系统")]
  19. public class NoInteractionSystems : DeviceSystem<Station>
  20. {
  21. public NoInteractionSystems()
  22. {
  23. }
  24. protected override bool ParallelDo => true;
  25. protected override bool SaveLogsToFile => true;
  26. public override void Do(Station obj)
  27. {
  28. var key = $"WCS:Lock:无交互系统{obj.Entity.Code}";
  29. try
  30. {
  31. if (RedisHub.Default.Get(key) != null)
  32. {
  33. throw new KnownException($"[{obj.Entity.Code}]--触发并发管控", LogLevelEnum.High);
  34. }
  35. RedisHub.Default.Set(key, obj.Entity.Code);
  36. #region 处理所有的新增任务
  37. try
  38. {
  39. List<WCS_TaskInfo> taskInfos = new List<WCS_TaskInfo>();
  40. SqlSugarHelper.Do(db =>
  41. {
  42. taskInfos = db.Default.Queryable<WCS_TaskInfo>().Where(t => t.Status == Entity.TaskStatus.NewBuild).ToList();
  43. });
  44. if (taskInfos.Any())
  45. {
  46. foreach (var item in taskInfos)
  47. {
  48. try
  49. {
  50. SqlSugarHelper.Do(db =>
  51. {
  52. var task = db.Default.Queryable<WCS_TaskInfo>().Where(t => t.ID == item.ID).First() ?? throw new Exception($"未找到对应的WCS任务[{item.ID}]");
  53. if (task.Type == TaskType.EnterDepot)
  54. {
  55. //创建AGV任务
  56. var agvTask = new WCS_AgvTaskInfo()
  57. {
  58. ID = db.GetAGVTaskId(),
  59. TaskType = AGVTaskType.EnterDepot,
  60. Status = AGVTaskStatus.NewBuild,
  61. Station = task.WorkBench,
  62. AddWho = "WCS",
  63. //Position = task.SrmStation
  64. };
  65. db.Default.Insertable(agvTask).SplitTable().ExecuteCommand();
  66. //更新任务状态
  67. task.Status = Entity.TaskStatus.WaitingToExecute;
  68. task.AgvTaskID = agvTask.ID;
  69. db.Default.Updateable(task).ExecuteCommand();
  70. task.AddWCS_TASK_DTL(db, task.Device, $"初始化入库任务信息,并创建AGV任务中间表,AGV任务目标地址:{agvTask.Station}");
  71. }
  72. else if (task.Type == TaskType.OutDepot)
  73. {
  74. //创建AGV任务
  75. var agvTask = new WCS_AgvTaskInfo()
  76. {
  77. ID = db.GetAGVTaskId(),
  78. TaskType = AGVTaskType.CallMaterial,
  79. Status = AGVTaskStatus.NewBuild,
  80. Station = task.SrmStation,
  81. AddWho = "WCS",
  82. };
  83. db.Default.Insertable(agvTask).SplitTable().ExecuteCommand();
  84. //更新任务状态
  85. task.Status = Entity.TaskStatus.WaitingToExecute;
  86. task.AgvTaskID = agvTask.ID;
  87. db.Default.Updateable(task).ExecuteCommand();
  88. task.AddWCS_TASK_DTL(db, task.Device, $"初始化叫料任务信息,并创建AGV任务中间表,AGV任务目标地址:{agvTask.Position}");
  89. }
  90. });
  91. }
  92. catch (Exception ex)
  93. {
  94. World.Log(ex.Message, LogLevelEnum.Mid);
  95. continue;
  96. }
  97. }
  98. }
  99. }
  100. catch (Exception ex)
  101. {
  102. World.Log(ex.Message, LogLevelEnum.Mid);
  103. }
  104. #endregion 处理所有的新增任务
  105. #region 下发agv任务
  106. SqlSugarHelper.Do(db =>
  107. {
  108. var agvTasks = db.Default.Queryable<WCS_AgvTaskInfo>().Where(t => t.Status == AGVTaskStatus.NewBuild && t.TaskType == AGVTaskType.EnterDepot).SplitTable(v => v.Take(2)).ToList();
  109. if (agvTasks.Count > 0)
  110. {
  111. foreach (var agv in agvTasks)
  112. {
  113. //开始处理
  114. try
  115. {
  116. //获取对应wcs任务
  117. var wcs = db.Default.Queryable<WCS_TaskInfo>().Where(t => t.AgvTaskID == agv.ID && t.Status == Entity.TaskStatus.WaitingToExecute).First();
  118. if (wcs == null) throw new Exception($"未找到对应的WCS任务");
  119. var res = AgvApi.盘条入库(wcs.BarCode, agv.Station, Guid.NewGuid().ToString().Replace("-", ""), "1");
  120. agv.Status = AGVTaskStatus.Confirm;
  121. agv.AgvID = res.data;
  122. db.Default.Updateable(agv).SplitTable().ExecuteCommand();
  123. //更新WCS数据
  124. wcs.Status = Entity.TaskStatus.AGVExecution;
  125. db.Default.Updateable(wcs).ExecuteCommand();
  126. wcs.AddWCS_TASK_DTL(db, wcs.Device, $"任务下发至AGV-AGV任务ID{agv.AgvID}");
  127. }
  128. catch (Exception ex)
  129. {
  130. World.Log(ex.Message, LogLevelEnum.Mid);
  131. continue;
  132. }
  133. }
  134. }
  135. });
  136. #endregion
  137. }
  138. finally
  139. {
  140. RedisHub.Default.Del(key);
  141. }
  142. }
  143. public override bool Select(Device dev)
  144. {
  145. return dev.Code == "1001";
  146. }
  147. }
  148. }