SearchTaskSchedule.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446
  1. using SHJX.Service.Control.Extends;
  2. using SHJX.Service.Control.Common.Assets;
  3. using shjxCamera;
  4. namespace SHJX.Service.Control.Schedules
  5. {
  6. [EnableScheduling]
  7. public class SearchTaskSchedule : IScheduler
  8. {
  9. private static readonly ILogger logger = LogFactory.BuildLogger(typeof(SearchTaskSchedule));
  10. private static TaskExtend _extend;
  11. private static IDataManager _dataManager;
  12. private static ReadConfigUtil _readConfig;
  13. public SearchTaskSchedule(IDataManager dataManager, TaskExtend extend, ReadConfigUtil readConfig)
  14. {
  15. _extend = extend;
  16. _readConfig = readConfig;
  17. _dataManager = dataManager;
  18. }
  19. [Scheduled("SearchAddLiquidTask", 2000)]
  20. public void SearchAddLiquidTask()
  21. {
  22. EquipmentTask task = GetCanExecuteTask(1, PipeName.ADD_LIQUID, PipeName.ADD_LIQUID_GOBACK);
  23. if (task is null)
  24. {
  25. return;
  26. }
  27. if (task.RouteStep.Equals(PipeName.ADD_LIQUID))
  28. {
  29. CheckRegionPositionIsEnable(AreaName.ADD_LIQUID_POSITION, out EquipmentArea area);
  30. if (area is null)
  31. {
  32. return;
  33. }
  34. task.From = task.Source;
  35. task.To = area.PointName;
  36. task.Target = nameof(task.From);
  37. OccupyDisplay(task.Source, area.PointName);
  38. }
  39. if (task.RouteStep.Equals(PipeName.ADD_LIQUID_GOBACK))
  40. {
  41. task.From = task.To;
  42. task.To = task.Source;
  43. task.Target = nameof(task.From);
  44. }
  45. task.Status = TaskState.Waiting;
  46. int rows = _dataManager.Update(task);
  47. if (rows > 0)
  48. {
  49. WriteCache(task);
  50. }
  51. }
  52. [Scheduled("SearchDissolveTask", 1000)]
  53. public void SearchDissolveTask()
  54. {
  55. #region 判断消解温度
  56. if (Globals.FirstDissolve)
  57. {
  58. Dictionary<string, double> temperatureRes = EquipmentNames.DissolveHeating.HeatRead();
  59. if (temperatureRes is null)
  60. {
  61. logger.LogDebug($"当前为程序运行后的首次消解,未读取到温度,返回");
  62. return;
  63. }
  64. double settingTemperature = _readConfig.DissolveTemperatureValue;
  65. if (Convert.ToDouble(temperatureRes["pv"]) < settingTemperature)
  66. {
  67. logger.LogDebug($"当前为程序运行后的首次消解,温度未到达设定温度:{settingTemperature}度");
  68. return;
  69. }
  70. else
  71. {
  72. Globals.FirstDissolve = false;
  73. }
  74. }
  75. #endregion
  76. EquipmentTask task = GetCanExecuteTask(2, PipeName.DISSOLVE );
  77. if (task is null)
  78. {
  79. return;
  80. }
  81. if (task.RouteStep.Equals(PipeName.DISSOLVE))
  82. {
  83. if (_dataManager.Query<RouteCache>().Where(it => it.RouteStep.Equals(PipeName.DISSOLVE) && it.Source.Equals(task.Source)).Any())
  84. {
  85. logger.LogDebug($"SearchDissolveMove - RouteCache --> {task.Source}");
  86. return;
  87. }
  88. if (!_extend.SearchMoveCheckAheadFinishDissolveTask())
  89. {
  90. logger.LogInformation("在SearchDissolveMove中,检测到有提前完成的任务,跳出SearchDissolveMove");
  91. return;
  92. }
  93. if (!_extend.GetDissolveDateDifference(task.RouteStep, task.Source))
  94. {
  95. return;
  96. }
  97. if (!_extend.EstimatedDissolveInterval())
  98. {
  99. return;
  100. }
  101. CheckRegionPositionIsEnable(AreaName.DISSOLVE_POSITION, out EquipmentArea area);
  102. if (area is null)
  103. {
  104. return;
  105. }
  106. task.From = task.Source;
  107. task.To = area.PointName;
  108. task.Target = nameof(task.From);
  109. OccupyDisplay(task.Source, area.PointName);
  110. }
  111. task.Status = TaskState.Waiting;
  112. int rows = _dataManager.Update(task);
  113. if (rows > 0)
  114. {
  115. WriteCache(task);
  116. }
  117. }
  118. [Scheduled("SearchDissolveTask", 500)]
  119. public void SearchDissolveGoBackTask()
  120. {
  121. EquipmentTask task = GetCanExecuteTask(2, PipeName.DISSOLVE_GOBACK);
  122. if (task is null)
  123. {
  124. return;
  125. }
  126. if (task.RouteStep.Equals(PipeName.DISSOLVE_GOBACK))
  127. {
  128. CheckRegionPositionIsEnable(AreaName.TITRATION_POSITION, out EquipmentArea area);
  129. if (area is null)
  130. {
  131. CheckRegionPositionIsEnable(AreaName.TITRATION_POSITION2, out EquipmentArea area2);
  132. if (area2 is null)
  133. {
  134. return;
  135. }
  136. task.From = task.To;
  137. task.To = area2.PointName;
  138. task.Target = nameof(task.From);
  139. OccupyDisplay(task.Source, area2.PointName);
  140. }
  141. else
  142. {
  143. task.From = task.To;
  144. task.To = area.PointName;
  145. task.Target = nameof(task.From);
  146. OccupyDisplay(task.Source, area.PointName);
  147. }
  148. }
  149. task.Status = TaskState.Waiting;
  150. int rows = _dataManager.Update(task);
  151. if (rows > 0)
  152. {
  153. WriteCache(task);
  154. }
  155. }
  156. [Scheduled("SearchTitrationTask", 1000)]
  157. public void SearchTitrationTask()
  158. {
  159. EquipmentTask task = GetCanExecuteTaskTitration(3, "D1", PipeName.TITRATION, PipeName.TITRATION_GOBACK);
  160. if (task is null)
  161. {
  162. return;
  163. }
  164. if (task.RouteStep.Equals(PipeName.TITRATION))
  165. {
  166. EquipmentArea area = _dataManager.Query<EquipmentArea>().Where(it => it.AreaName.Equals(AreaName.TITRATION_POSITION)).First();
  167. if (area is null)
  168. {
  169. return;
  170. }
  171. area.Enable = false;
  172. _dataManager.Update(area);
  173. OccupyDisplay(task.Source, area.PointName);
  174. }
  175. else
  176. {
  177. task.From = task.To;
  178. task.To = task.Source;
  179. task.Target = nameof(task.From);
  180. }
  181. task.Status = TaskState.Waiting;
  182. int rows = _dataManager.Update(task);
  183. if (rows > 0)
  184. {
  185. WriteCache(task);
  186. }
  187. }
  188. [Scheduled("SetTitration1toTitration2Task", 1000)]
  189. public void SetTitration1toTitration2Task()
  190. {
  191. //CheckRegionPositionIsEnable("D1", out PositionHotlist area1);
  192. //CheckRegionPositionIsEnable("D2", out PositionHotlist area2);
  193. ////CheckRegionPositionIsEnable("L1", out PositionHotlist area);
  194. StringBuilder sqlBuilder = new();
  195. sqlBuilder.Append("SELECT * From equipment_task ");
  196. sqlBuilder.Append("WHERE RouteID=@RouteID AND Status=@Status AND RouteStep='Titration' AND `To`='D2'");// AND WaveKey =@WaveKey");
  197. sqlBuilder.Append("ORDER BY SerialKey ASC LIMIT 1");
  198. string queryStr = sqlBuilder.ToString();
  199. EquipmentTask task = _dataManager.Query<EquipmentTask>(queryStr, new { RouteID = 3, Status = TaskState.New }).FirstOrDefault();
  200. if (task is null)
  201. {
  202. return;
  203. }
  204. else
  205. {
  206. task.RouteStep = "Titration2";
  207. task.RouteID = 4;
  208. _dataManager.Update(task);
  209. }
  210. }
  211. [Scheduled("SearchTitration2Task", 1000)]
  212. public void SearchTitration2Task()
  213. {
  214. EquipmentTask task = GetCanExecuteTaskTitration(4, "D2", PipeName.TITRATION2, PipeName.TITRATION2_GOBACK);
  215. if (task is null)
  216. {
  217. return;
  218. }
  219. if (task.RouteStep.Equals(PipeName.TITRATION2))
  220. {
  221. EquipmentArea area = _dataManager.Query<EquipmentArea>().Where(it => it.AreaName.Equals(AreaName.TITRATION_POSITION2)).First();
  222. if (area is null)
  223. {
  224. return;
  225. }
  226. area.Enable = false;
  227. _dataManager.Update(area);
  228. OccupyDisplay(task.Source, area.PointName);
  229. }
  230. else
  231. {
  232. task.From = task.To;
  233. task.To = task.Source;
  234. task.Target = nameof(task.From);
  235. }
  236. task.Status = TaskState.Waiting;
  237. int rows = _dataManager.Update(task);
  238. if (rows > 0)
  239. {
  240. WriteCache(task);
  241. }
  242. }
  243. #region Common Method
  244. /// <summary>
  245. /// 检查区域位置是否可用
  246. /// </summary>
  247. /// <param name="name"></param>
  248. /// <param name="area"></param>
  249. private void CheckRegionPositionIsEnable(string name, out EquipmentArea area)
  250. {
  251. area = _dataManager.Query<EquipmentArea>().Where(it => it.AreaName.Equals(name) && it.Enable.Equals(true)).First();
  252. if (area is null)
  253. {
  254. return;
  255. }
  256. //if (name == "AddLiquidPosition")
  257. //{
  258. // PositionHotlist areaFree = _dataManager.Query<PositionHotlist>().Where(it => it.PositionName.Equals("D2") && it.Enable.Equals(true)).First();
  259. // if (areaFree is null)
  260. // {
  261. // return;
  262. // }
  263. //}
  264. //if (name == "TitrationPosition2")
  265. //{
  266. // PositionHotlist areaFree = _dataManager.Query<PositionHotlist>().Where(it => it.PositionName.Equals("L1") && it.Enable.Equals(true)).First();
  267. // if (areaFree is null)
  268. // {
  269. // return;
  270. // }
  271. //}
  272. area.Enable = false;
  273. _dataManager.Update(area);
  274. }
  275. //private void CheckRegionPositionIsNotEnable(string name, out EquipmentArea area)
  276. //{
  277. // area = _dataManager.Query<EquipmentArea>().Where(it => it.AreaName.Equals(name) && it.Enable.Equals(true)).First();
  278. // if (area is null)
  279. // {
  280. // return;
  281. // }
  282. // area.Enable = false;
  283. // _dataManager.Update(area);
  284. //}
  285. /// <summary>
  286. /// 位置表占用显示
  287. /// </summary>
  288. /// <param name="source"></param>
  289. /// <param name="pointName"></param>
  290. private static void OccupyDisplay(string source, string pointName)
  291. {
  292. PositionHotlist position = _dataManager.Query<PositionHotlist>().Where(it => it.PositionName.Equals(pointName)).First();
  293. position.CurrentOccupy = source;
  294. position.Enable = false;
  295. _dataManager.Update(position);
  296. }
  297. private void CheckRegionPositionIsEnable(string name, out PositionHotlist area)
  298. {
  299. area = _dataManager.Query<PositionHotlist>().Where(it => it.PositionName.Equals(name) && it.Enable.Equals(true) && it.CurrentOccupy.Equals(null)).First();
  300. if (area is null)
  301. {
  302. return;
  303. }
  304. }
  305. /// <summary>
  306. /// 写入缓存
  307. /// </summary>
  308. /// <param name="task"></param>
  309. private void WriteCache(EquipmentTask task)
  310. {
  311. TaskPriority priority = _dataManager.Query<TaskPriority>().Where(it => it.Step.Equals(task.RouteStep)).First();
  312. RouteCache route = new()
  313. {
  314. CreateTime = DateTime.Now,
  315. Source = task.Source,
  316. TaskKey= task.SerialKey,
  317. RouteID = task.RouteID,
  318. RouteStep = task.RouteStep,
  319. Priority= priority.Priority,
  320. Status = RouteCacheState.Waiting
  321. };
  322. _dataManager.Add(route);//写入缓存表
  323. }
  324. /// <summary>
  325. /// 获取可执行任务
  326. /// </summary>
  327. /// <![CDATA[
  328. /// SELECT TA.* From equipment_task AS TA,(
  329. /// SELECT SerialKey,
  330. /// CASE RouteStep
  331. /// WHEN props[0] THEN 1
  332. /// WHEN props[1] THEN 2
  333. /// WHEN ... THEN ...
  334. /// END as indexorder
  335. /// From equipment_task
  336. /// WHERE route=@Route AND Status =@Status AND RouteStep IN(props[0], props[1], ...)) AS TB
  337. /// WHERE TA.SerialKey=TB.SerialKey AND
  338. /// NOT EXISTS(
  339. /// SELECT 1 From equipment_task
  340. /// WHERE route = @Route AND Status NOT IN('1','4') AND RouteStep IN(props[0], props[1], ...))
  341. /// ORDER BY TB.indexorder DESC
  342. /// LIMIT 1
  343. /// ]]>
  344. /// <param name="RouteID"></param>
  345. /// <param name="props"></param>
  346. /// <returns></returns>
  347. private EquipmentTask GetCanExecuteTaskTitration(int id, string area,params string[] props)
  348. {
  349. StringBuilder sqlBuilder = new();
  350. sqlBuilder.Append("SELECT TA.* From equipment_task AS TA,(SELECT SerialKey,");
  351. sqlBuilder.Append("CASE RouteStep ");
  352. for (int i = 0; i < props.Length; i++)
  353. {
  354. sqlBuilder.Append($"WHEN '{props[i]}' THEN {i + 1} ");
  355. }
  356. sqlBuilder.Append("END as indexorder ");
  357. sqlBuilder.Append("From equipment_task ");
  358. sqlBuilder.Append("WHERE RouteID=@RouteID AND Status=@Status AND `To`=@ToWhere AND RouteStep IN ");
  359. StringBuilder inSql = new();
  360. inSql.Append("(");
  361. for (int i = 0; i < props.Length; i++)
  362. {
  363. inSql.Append($"'{props[i]}'");
  364. if (i + 1 < props.Length)
  365. {
  366. inSql.Append(",");
  367. }
  368. }
  369. inSql.Append(") ");
  370. sqlBuilder.Append(inSql);
  371. sqlBuilder.Append(") AS TB ");
  372. sqlBuilder.Append("WHERE TA.SerialKey=TB.SerialKey ");
  373. sqlBuilder.Append("AND NOT EXISTS(SELECT 1 From equipment_task WHERE RouteID=@RouteID AND `To`=@ToWhere AND Status NOT IN (");
  374. string notInStr = id switch
  375. {
  376. 2 => "'1','4','7','10'",
  377. _ => "'1','4','10'"
  378. };
  379. sqlBuilder.Append(notInStr);
  380. sqlBuilder.Append(") AND RouteStep IN ");
  381. sqlBuilder.Append(inSql);
  382. sqlBuilder.Append(") ");
  383. sqlBuilder.Append("ORDER BY TB.indexorder DESC LIMIT 1");
  384. string queryStr = sqlBuilder.ToString();
  385. return _dataManager.Query<EquipmentTask>(queryStr, new { RouteID = id, Status = TaskState.New, ToWhere= area }).FirstOrDefault();
  386. }
  387. private EquipmentTask GetCanExecuteTask(int id, params string[] props)
  388. {
  389. StringBuilder sqlBuilder = new();
  390. sqlBuilder.Append("SELECT TA.* From equipment_task AS TA,(SELECT SerialKey,");
  391. sqlBuilder.Append("CASE RouteStep ");
  392. for (int i = 0; i < props.Length; i++)
  393. {
  394. sqlBuilder.Append($"WHEN '{props[i]}' THEN {i + 1} ");
  395. }
  396. sqlBuilder.Append("END as indexorder ");
  397. sqlBuilder.Append("From equipment_task ");
  398. sqlBuilder.Append("WHERE RouteID=@RouteID AND Status=@Status AND RouteStep IN ");
  399. StringBuilder inSql = new();
  400. inSql.Append("(");
  401. for (int i = 0; i < props.Length; i++)
  402. {
  403. inSql.Append($"'{props[i]}'");
  404. if (i + 1 < props.Length)
  405. {
  406. inSql.Append(",");
  407. }
  408. }
  409. inSql.Append(") ");
  410. sqlBuilder.Append(inSql);
  411. sqlBuilder.Append(") AS TB ");
  412. sqlBuilder.Append("WHERE TA.SerialKey=TB.SerialKey ");
  413. sqlBuilder.Append("AND NOT EXISTS(SELECT 1 From equipment_task WHERE RouteID=@RouteID AND Status NOT IN (");
  414. string notInStr = id switch
  415. {
  416. 2 => "'1','4','7','10'",
  417. _ => "'1','4','10'"
  418. };
  419. sqlBuilder.Append(notInStr);
  420. sqlBuilder.Append(") AND RouteStep IN ");
  421. sqlBuilder.Append(inSql);
  422. sqlBuilder.Append(") ");
  423. sqlBuilder.Append("ORDER BY TB.indexorder DESC LIMIT 1");
  424. string queryStr = sqlBuilder.ToString();
  425. return _dataManager.Query<EquipmentTask>(queryStr, new { RouteID = id, Status = TaskState.New }).FirstOrDefault();
  426. }
  427. #endregion
  428. }
  429. }