TaskExtend.cs 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. using SHJX.Service.Control.MoveTime;
  2. namespace SHJX.Service.Control.Extends
  3. {
  4. public class TaskExtend
  5. {
  6. private static readonly ILogger logger = LogFactory.BuildLogger(typeof(TaskExtend));
  7. private static IDataManager _dataManager;
  8. private static ReadConfigUtil _readConfig;
  9. public TaskExtend(IDataManager dataManager, ReadConfigUtil readConfig)
  10. {
  11. _readConfig = readConfig;
  12. _dataManager = dataManager;
  13. }
  14. /// <summary>
  15. /// 计算消解时间的差值
  16. /// </summary>
  17. /// <param name="move"></param>
  18. /// <returns></returns>
  19. public bool GetDissolveDateDifference(RouteCache cache)
  20. {
  21. return GetDissolveDateDifference(cache.RouteStep, cache.Source);
  22. }
  23. /// <summary>
  24. /// 计算消解时间的差值
  25. /// </summary>
  26. /// <param name="step"></param>
  27. /// <param name="movePoint"></param>
  28. /// <returns></returns>
  29. /// 判断是否有已到时间的任务
  30. public bool GetDissolveDateDifference(string step, string movePoint = null)
  31. {
  32. if (movePoint is null)
  33. {
  34. return true;
  35. }
  36. DissolveDate dissolveDates = _dataManager.Query<DissolveDate>().Where(it => it.Start.Equals(true)).OrderBy(it => it.LastTryTime).First();
  37. if (dissolveDates is null)
  38. {
  39. return true;
  40. }
  41. ExecuteTime dissolveExecuteTime = _dataManager.Query<ExecuteTime>().Where(it => it.TypeName.Equals(ExecuteTimeName.DISSOLVE_TIME)).First();
  42. double taskMinDate = dissolveDates.LastTryTime.GetMinDifferenceValue();
  43. return (dissolveExecuteTime.Value - taskMinDate) * 60 > CalculatorContent.Instance.Factory(step).Calculate(movePoint);
  44. }
  45. public bool SearchMoveCheckAheadFinishDissolveTask()
  46. {
  47. return AheadFinishDissolveTask();
  48. }
  49. public bool ChangeMoveStateCheckAheadFinishDissolveTask()
  50. {
  51. return AheadFinishDissolveTask((dissolveDates) =>
  52. {
  53. DataCache.Instance.Set(CacheState.Early, dissolveDates.SampleSource);
  54. logger.LogInformation($"找到需提前结束的消解任务,任务地址 --> {dissolveDates.SampleSource},{dissolveDates.PositionName}");
  55. });
  56. }
  57. public bool AheadFinishDissolveTask(Action<DissolveDate> action = null)
  58. {
  59. DissolveDate dissolveDates = _dataManager.Query<DissolveDate>().Where(it => it.Start.Equals(true)).OrderBy(it => it.LastTryTime).First();
  60. if (dissolveDates is null)
  61. {
  62. return true;
  63. }
  64. ExecuteTime dissolveExecuteTime = _dataManager.Query<ExecuteTime>().Where(it => it.TypeName.Equals(ExecuteTimeName.DISSOLVE_TIME)).First();
  65. #region 判断优先级
  66. int taskSecondDate = dissolveDates.LastTryTime.GetSecondDifferenceValue();
  67. TaskRuntime.Calculate(dissolveDates.PositionName, out double xNeedTime, out double yNeedTime, out double zNeedTime, out double zfNeedTime);
  68. double needTime = Math.Abs(xNeedTime) + Math.Abs(yNeedTime) + Math.Abs(zNeedTime) + Math.Abs(zfNeedTime);
  69. if (dissolveExecuteTime.Value * 60 - taskSecondDate <= needTime)
  70. {
  71. if (CheckRegionPositionIsEnable(AreaName.TITRATION_POSITION) && CheckRegionPositionIsEnable(AreaName.TITRATION_POSITION2))
  72. {
  73. return false;
  74. }
  75. action?.Invoke(dissolveDates);
  76. return false;
  77. }
  78. return true;
  79. #endregion
  80. }
  81. private bool CheckRegionPositionIsEnable(string name)
  82. {
  83. EquipmentArea area = _dataManager.Query<EquipmentArea>().Where(it => it.AreaName.Equals(name) && it.Enable.Equals(true)).First();
  84. if (area is null)
  85. {
  86. return false;
  87. }
  88. return true;
  89. }
  90. /// <summary>
  91. /// 判断消解间隔
  92. /// </summary>
  93. /// <returns></returns>
  94. public bool EstimatedDissolveInterval()
  95. {
  96. double currentIntervalValue = _dataManager.Query<DissolveInterval>().First().LastTryTime.GetMinDifferenceValue();
  97. ExecuteTime executeTime = _dataManager.Query<ExecuteTime>().Where(it => it.TypeName.Equals(ExecuteTimeName.DISSOLVE_INYERVAL)).First();
  98. return currentIntervalValue >= (executeTime?.Value);//查找间隔时间是否已经达到两分钟
  99. }
  100. /// <summary>
  101. /// 路由更新
  102. /// </summary>
  103. /// <param name="task"></param>
  104. public async void UpdateRoute(EquipmentTask task)
  105. {
  106. List<Route> routes = _dataManager.Query<Route>().Where(it => it.TaskType.Equals(task.RouteType)).ToList();
  107. Route currentRoute = routes.FirstOrDefault(it => it.RouteID.Equals(task.RouteID));
  108. int nextId = currentRoute.RouteID + 1;
  109. //if (currentRoute.RouteID == 2)
  110. //{
  111. // CheckRegionPositionIsEnable(AreaName.TITRATION_POSITION, out EquipmentArea area);
  112. // CheckRegionPositionIsEnable(AreaName.ADD_LIQUID_POSITION, out EquipmentArea area2);
  113. // if (area?.PointName == null && area2==null)
  114. // {
  115. // nextId = currentRoute.RouteID + 2;
  116. // }
  117. //}
  118. Route nextRoute = routes.FirstOrDefault(it => it.RouteID.Equals(nextId));
  119. if ((currentRoute.RouteID == 4 ) || (currentRoute.RouteID == 3))
  120. {
  121. task.Status = TaskState.Finished;
  122. _dataManager.Update(task);
  123. SampleDetail sampleDetail = _dataManager.Query<SampleDetail>().Where(it => it.NodeName.Equals(task.Source)).First();
  124. if (sampleDetail is not null)
  125. {
  126. sampleDetail.TaskStatus = DetailState.Init;
  127. _dataManager.Update(sampleDetail);
  128. }
  129. Messager<string>.Send("TaskFinish", task.Source);
  130. List<EquipmentTask> residueTask = _dataManager.Query<EquipmentTask>().Where(it => it.Status.In
  131. (
  132. TaskState.New, TaskState.Waiting, TaskState.Doing, TaskState.Hit,
  133. TaskState.AddLiquid, TaskState.Dissolve, TaskState.Titration, TaskState.Titration2, TaskState.Execute
  134. )).ToList();
  135. if (!residueTask.Any())
  136. {
  137. var temp = _readConfig.TaskFinishTemperatureSetting;
  138. bool tempRes = EquipmentNames.DissolveHeating.WriteTemperature(temp);
  139. tempRes = tempRes && EquipmentNames.TitrationHeating.WriteTemperature(temp);
  140. logger.LogDebug($"任务结束,自动设置降温{(tempRes ? "成功" : "失败")}");
  141. bool res = true;
  142. foreach (string item in new string[] { EquipmentNames.AxisZ, EquipmentNames.AxisX, EquipmentNames.AxisY, EquipmentNames.AxisD})
  143. {
  144. res = res && await Task.Run(() => ExecuteCommand.MotorGoBackExecute(item));
  145. }
  146. logger.LogDebug($"任务结束,没有后续任务,自动返回原点{(res ? "成功" : "失败")}");
  147. Messager<TaskResultArgs>.Send("AllTaskFinish");
  148. }
  149. return;
  150. }
  151. RouteStep executeStep = _dataManager.Query<RouteStep>().Where(it => it.RouteID.Equals(nextRoute.RouteID)).OrderBy(it => it.Order).First();
  152. task.RouteID = nextRoute.RouteID;
  153. task.Status = TaskState.New;
  154. task.RouteStep = executeStep.Step;
  155. _dataManager.Update(task);
  156. }
  157. /// <summary>
  158. /// 步骤更新
  159. /// </summary>
  160. /// <param name="task"></param>
  161. public void UpdateStep(EquipmentTask task)
  162. {
  163. try
  164. {
  165. List<RouteStep> steps = _dataManager.Query<RouteStep>().Where(it => it.RouteID.Equals(task.RouteID)).ToList();
  166. RouteStep currentStep = steps.FirstOrDefault(it => it.Step.Equals(task.RouteStep));
  167. int nextOrder = currentStep.Order + 1;
  168. RouteStep nextStep = steps.FirstOrDefault(it => it.Order.Equals(nextOrder));
  169. if (nextStep is null)
  170. {
  171. UpdateRoute(task);
  172. return;
  173. }
  174. task.Status = TaskState.New;
  175. task.RouteStep = nextStep.Step;
  176. _dataManager.Update(task);
  177. }
  178. catch (Exception ex)
  179. {
  180. logger.LogError(ex.ToString());
  181. }
  182. }
  183. }
  184. }