DataCentre.cs 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542
  1. using System;
  2. using System.Linq;
  3. using SHJX.Service.Dao;
  4. using SHJX.Service.Model.Dao;
  5. using SHJX.Service.Common.Model;
  6. using SHJX.Service.ServerClient;
  7. using System.Collections.Generic;
  8. using SHJX.Service.Common.Extend;
  9. using SHJX.Service.Common.Camera;
  10. using SHJX.Service.Common.ReadXML;
  11. using SHJX.Service.Control.Modules;
  12. using SHJX.Service.Control.ControlProxy;
  13. using SHJX.Service.Control.PortOperate.Content;
  14. using SHJX.Service.Common.Logging;
  15. using Microsoft.Extensions.Logging;
  16. namespace SHJX.Service.Control
  17. {
  18. public static class DataCentre
  19. {
  20. private static CreatGraber _graber;
  21. private static CreatGraber _graber2;
  22. private static OptClient _optClient;
  23. private static ReadConfigUtil _config;
  24. private static LiquidDropArgs _dropArgs;
  25. private static LiquidDropArgs _dropArgs2;
  26. public static OperateDataManager _dataManager;
  27. private static ProxyRouteContext _proxyContent;
  28. private static TimerController _timerController;
  29. private static PumpContent _pumpContent;
  30. private static StorageContent _storageContent;
  31. private static List<Routes> _routes;
  32. private static List<Step> _steps;
  33. private static List<RouteStep> _routeSteps;
  34. private readonly static object obj_area_lock = new();
  35. private static readonly ILogger logger = LogFactory.BuildLogger(typeof(DataCentre));
  36. /// <summary>
  37. /// 初始化
  38. /// </summary>
  39. /// <param name="config">配置</param>
  40. /// <param name="log">日志</param>
  41. public static void InitBaseData(ReadConfigUtil config,out int cameraNum)
  42. {
  43. try
  44. {
  45. _config = config;
  46. _dataManager = new(_config);
  47. _proxyContent = new(_config);
  48. _optClient = new( _config);
  49. _graber = new(_config.LogiCamera1, out int ret1);
  50. _graber2 = new(_config.LogiCamera2, out int ret2);
  51. _dropArgs = new(_graber.WebCam, _graber.Graber);
  52. _dropArgs2 = new(_graber2.WebCam, _graber2.Graber);
  53. cameraNum = ret1 + ret2;
  54. if (_config.LogiCamera1 == _config.LogiCamera2 && cameraNum==2)
  55. {
  56. cameraNum = 1;
  57. _graber2 = _graber;
  58. _dropArgs2 = _dropArgs;
  59. }
  60. _pumpContent = new(_optClient);
  61. _storageContent = new(_optClient);
  62. InitBasementData(_dataManager);
  63. _timerController = new( _config);
  64. }
  65. catch (Exception ex)
  66. {
  67. logger.LogError(ex.Message);
  68. cameraNum = 0;
  69. }
  70. }
  71. /// <summary>
  72. /// 初始化基础数据
  73. /// </summary>
  74. /// <param name="dataManager"></param>
  75. private static void InitBasementData(OperateDataManager dataManager)
  76. {
  77. _routes = dataManager.Query<Routes>().ToList();
  78. _routeSteps = dataManager.Query<RouteStep>().ToList();
  79. _steps = dataManager.Query<Step>().ToList();
  80. }
  81. public static int getDigestionPositionCount()
  82. {
  83. int rtn = _dataManager.Query<EquipmentArea>().Count(item => item.AreaName.Equals("DigestionPosition") && item.Status == true);
  84. return rtn;
  85. }
  86. public static ReadConfigUtil GetConfig => _config;
  87. public static OptClient GetClient => _optClient;
  88. public static TimerController GetTimer => _timerController;
  89. public static PumpContent GetPumpContent => _pumpContent;
  90. public static StorageContent GetStorageContent => _storageContent;
  91. public static List<EquipmentMotor> GetMotor => _dataManager.Query<EquipmentMotor>().ToList();
  92. public static List<EquipmentArea> GetAreas => _dataManager.Query<EquipmentArea>().ToList();
  93. public static List<EquipmentStatus> GetEquipmentStatuses => _dataManager.Query<EquipmentStatus>().ToList();
  94. public static List<HeatingSetting> GetLiquidHeatings => _dataManager.Query<HeatingSetting>().ToList();
  95. public static TitrationValue GetBalanceValue => _dataManager.Query<TitrationValue>().First();
  96. public static List<RouteStep> GetRouteSteps => _routeSteps;
  97. public static List<Routes> GetRoutes => _routes;
  98. public static List<Step> GetSteps => _steps;
  99. public static WebCamera GetCamera => _graber.WebCam;
  100. public static WebCamera GetCamera2 => _graber2.WebCam;
  101. public static CoolingSetting GetCoolingSetting(this string value) =>
  102. _dataManager.Query<CoolingSetting>().FirstOrDefault(item => item.TypeName.Equals(value));
  103. /// <summary>
  104. /// 根据任务获取下一段路由步骤
  105. /// </summary>
  106. /// <param name="task"></param>
  107. /// <returns></returns>
  108. private static int NextStepByTask(this EquipmentTask task)
  109. {
  110. var first = _routeSteps.FirstOrDefault(
  111. item => item.RouteOpKey.Equals(task.RouteType)
  112. && item.RouteId.Equals(task.RouteId)
  113. && item.RouteStepId.Equals(task.RouteStepId));
  114. if (first != null)
  115. return first.NextStep;
  116. throw new Exception();
  117. }
  118. /// <summary>
  119. /// 获取加热时间
  120. /// </summary>
  121. /// <param name="heatStep"></param>
  122. /// <returns></returns>
  123. public static HeatingSetting GetHeatingTime(this string heatStep) =>
  124. GetLiquidHeatings.FirstOrDefault(item => item.CurrentStep.Equals(heatStep));
  125. /// <summary>
  126. /// 获取加热总数
  127. /// </summary>
  128. /// <returns></returns>
  129. public static int GetHeatingTimeSum() => GetLiquidHeatings.Sum(item => item.HeatingTime);
  130. public static int MotorFinal(this string motorName)
  131. {
  132. var motor = GetMotor.FirstOrDefault(item => item.EquipmentName.Equals(motorName));
  133. return Math.Abs(Convert.ToInt32(Math.Round(motor.FinalPoint * motor.ConvertRatio)));
  134. }
  135. /// <summary>
  136. /// 获取移动距离
  137. /// </summary>
  138. /// <param name="location"></param>
  139. /// <param name="pointName"></param>
  140. /// <returns></returns>
  141. public static int CalculateAreaPoint(this string location, string pointName)
  142. {
  143. var motor = GetMotor.First(item => item.EquipmentName.Equals(pointName));
  144. var area = GetAreas.FirstOrDefault(item => item.PointName.Equals(location));
  145. if (motor is null) throw new ArgumentNullException(pointName);
  146. var value = 0.0;
  147. if (area is null)
  148. return 0;
  149. value = pointName switch
  150. {
  151. "MotorX" => area.LocationX - motor.FinalPoint,
  152. "MotorY" => area.LocationY - motor.FinalPoint,
  153. "MotorZ" => area.LocationZ,
  154. "MotorT" => area.LocationT - motor.FinalPoint,
  155. _ => throw new ArgumentNullException(pointName)
  156. };
  157. motor.FinalPoint += value;
  158. if (pointName== "MotorY")
  159. {
  160. return Convert.ToInt32(Math.Round(-value * motor.ConvertRatio));
  161. }
  162. var row = _dataManager.Update(motor);
  163. return Convert.ToInt32(Math.Round(-value * motor.ConvertRatio));
  164. }
  165. /// <summary>
  166. /// 获取设备对应状态
  167. /// </summary>
  168. /// <param name="equipmentName"></param>
  169. /// <returns></returns>
  170. public static EquipmentStatus GetEquipmentState(this string equipmentName) =>
  171. GetEquipmentStatuses.FirstOrDefault(item => item.EquipmentName.Equals(equipmentName));
  172. /// <summary>
  173. /// 获取路由步骤名称
  174. /// </summary>
  175. /// <param name="routeStepId"></param>
  176. /// <returns></returns>
  177. private static Step GetStepName(this int routeStepId) =>
  178. _steps.FirstOrDefault(step => step.RouteStepId.Equals(routeStepId));
  179. /// <summary>
  180. /// 组装下发任务数据参数
  181. /// </summary>
  182. /// <param name="task"></param>
  183. /// <returns></returns>
  184. public static DataEventArgs GetDataArgs(this EquipmentTask task)
  185. {
  186. return new DataEventArgs
  187. {
  188. Proxy = _proxyContent,
  189. DataManager = _dataManager,
  190. Client = _optClient,
  191. LiquidDrop = _dropArgs,
  192. Task = task,
  193. Motor = GetMotor,
  194. };
  195. }
  196. /// <summary>
  197. /// 将点位状态置为可用
  198. /// </summary>
  199. /// <param name="fromPoint"></param>
  200. public static void UpdateAreaPointState(this string fromPoint)
  201. {
  202. var area = GetAreas.FirstOrDefault(item => item.PointName.Equals(fromPoint));
  203. if (area is null) return;
  204. area.Status = true;
  205. _dataManager.Update(area);
  206. logger.LogInformation($"将点位{fromPoint}置为可用");
  207. }
  208. /// <summary>
  209. /// 改变设备的最后地址
  210. /// </summary>
  211. /// <param name="equipmentName"></param>
  212. public static void UpdateMotorPoint(this string equipmentName)
  213. {
  214. var area = GetMotor.FirstOrDefault(item => item.EquipmentName.Equals(equipmentName));
  215. if (area is null) return;
  216. area.FinalPoint = 0;
  217. _dataManager.Update(area);
  218. }
  219. /// <summary>
  220. /// 获取设备区域的点位
  221. /// </summary>
  222. /// <param name="outArea"></param>
  223. /// <param name="routeId"></param>
  224. public static bool GetEquipmentAreaPoint(this int routeId, out string outArea, string opKey,string HighOrLow)
  225. {
  226. lock (obj_area_lock)
  227. {
  228. outArea = null;
  229. var route = _routes.FirstOrDefault(item => item.RouteId.Equals(routeId) && item.OpKey.Equals(opKey));
  230. if (route != null && route.From.Equals(route.To))
  231. return true;
  232. if (route != null && route.To.In("SamplePosition", "LiquidWastePosition"))
  233. return true;
  234. //EquipmentArea area;
  235. //if (route.To == "TitrationPosition" && HighOrLow == "High")
  236. //{
  237. // area = GetAreas.Where(item => route != null && item.AreaName.Equals(route.To) && item.PointName.Equals("D1"))
  238. // .FirstOrDefault(item => item.Status.Equals(true));
  239. // if (area == null)
  240. // return false;
  241. // area = GetAreas.Where(item => route != null && item.AreaName.Equals(route.To) && item.PointName.Equals("D2"))
  242. // .FirstOrDefault(item => item.Status.Equals(true));
  243. // if (area == null)
  244. // return false;
  245. // area.Status = false;
  246. // _dataManager.Update(area);
  247. // outArea = "D2";
  248. // return true;
  249. //}
  250. //else if (route.To == "TitrationPosition" && HighOrLow == "Low")
  251. //{
  252. // area = GetAreas.Where(item => route != null && item.AreaName.Equals(route.To) && item.PointName.Equals("D2"))
  253. // .FirstOrDefault(item => item.Status.Equals(true));
  254. // if (area == null)
  255. // return false;
  256. // area = GetAreas.Where(item => route != null && item.AreaName.Equals(route.To) && item.PointName.Equals("D1"))
  257. // .FirstOrDefault(item => item.Status.Equals(true));
  258. // if (area == null)
  259. // return false;
  260. // area.Status = false;
  261. // _dataManager.Update(area);
  262. // outArea = "D1";
  263. // return true;
  264. //}
  265. //else
  266. //{
  267. // area = GetAreas.Where(item => route != null && item.AreaName.Equals(route.To))
  268. // .FirstOrDefault(item => item.Status.Equals(true));
  269. // if (area == null)
  270. // return false;
  271. // area.Status = false;
  272. // _dataManager.Update(area);
  273. // outArea = area.PointName;
  274. // return true;
  275. //}
  276. #region
  277. var area = GetAreas.Where(item => route != null && item.AreaName.Equals(route.To))
  278. .FirstOrDefault(item => item.Status.Equals(true));
  279. if (area == null)
  280. return false;
  281. area.Status = false;
  282. _dataManager.Update(area);
  283. outArea = area.PointName;
  284. return true;
  285. #endregion
  286. }
  287. }
  288. #region 路由更新
  289. /// <summary>
  290. /// 更新路由(集中更新)
  291. /// </summary>
  292. /// <param name="task"></param>
  293. public static void UpdateStepToTask(this EquipmentTask task)
  294. {
  295. try
  296. {
  297. var tasks = _dataManager.GetIsHaveEquipment(task);
  298. //做全部更新 更新到下一段路由
  299. //if (task.TaskType== "Clear_Out")
  300. //{
  301. // task.RouteId = 12;
  302. // task.RouteStepId = 1;
  303. // tasks = _dataManager.GetIsHaveEquipment(task);
  304. //}
  305. var firstTask = tasks?.FirstOrDefault();
  306. if (firstTask is null) return;
  307. var nextstep = firstTask.NextStepByTask();
  308. //当stepId相等时,检查路由ID
  309. if (firstTask.RouteStepId.Equals(nextstep))
  310. {
  311. var nextRoute = GetRoutes.FirstOrDefault(item =>
  312. item.OpKey.Equals(firstTask.RouteType) && item.RouteId.Equals(firstTask.RouteId));
  313. if (nextRoute is not null)
  314. {
  315. //查看路由Id是否相等,相等则置为完成
  316. if (nextRoute.NextRoute.Equals(nextRoute.RouteId))
  317. {
  318. tasks.ForEach(item => { item.Status = TaskState.Finished; });
  319. _dataManager.Update(tasks);
  320. return;
  321. }
  322. var nextRouteInitStep = GetRoutes.FirstOrDefault(item =>
  323. item.RouteId.Equals(nextRoute.NextRoute) && item.OpKey.Equals(firstTask.RouteType));
  324. if (nextRouteInitStep is null) return;
  325. var nextRouteInitStepName = nextRouteInitStep.InitStep.GetStepName();
  326. tasks.ForEach(item =>
  327. {
  328. if (nextRouteInitStep.From != nextRouteInitStep.To)
  329. {
  330. if (nextRouteInitStep.To.In("LiquidWastePosition", "SamplePosition"))
  331. {
  332. item.From = item.To;
  333. item.To = item.OriginLocalName;
  334. }
  335. if (nextRouteInitStep.From.In("LiquidWastePosition", "SamplePosition"))
  336. {
  337. item.From = item.OriginLocalName;
  338. }
  339. }
  340. if (nextRouteInitStep.From.Equals(nextRouteInitStep.To))
  341. item.From = item.To;
  342. item.Status = TaskState.New;
  343. item.RouteId = nextRoute.NextRoute;
  344. item.RouteStepId = nextRouteInitStep.InitStep;
  345. item.RouteStep = nextRouteInitStepName?.RouteStepName;
  346. item.RouteUpdateType = nextRouteInitStepName?.UpdateRange;
  347. });
  348. var initStep1 = nextstep.GetStepName();
  349. if (initStep1.RouteStepName== "Clear_Cooling")
  350. {
  351. var routeStepBB = GetRouteSteps.FirstOrDefault(item => item.RouteStepId.Equals(29) && item.RouteOpKey.Equals(task.RouteType));
  352. var nextStepBB = GetSteps.FirstOrDefault(item => item.RouteStepId.Equals(routeStepBB.RouteStepId));
  353. tasks.ForEach(item =>
  354. {
  355. if (item.TaskType == "补杯")
  356. {
  357. item.Status = TaskState.New;
  358. item.RouteStepId = routeStepBB.RouteStepId;
  359. item.RouteStep = nextStepBB?.RouteStepName;
  360. item.RouteUpdateType = nextStepBB?.UpdateRange;
  361. item.RouteId = 6;
  362. }
  363. });
  364. }
  365. _dataManager.Update(tasks);
  366. return;
  367. }
  368. }
  369. var initStep = nextstep.GetStepName();
  370. tasks.ForEach(item =>
  371. {
  372. item.Status = TaskState.New;
  373. item.RouteStepId = nextstep;
  374. item.RouteStep = initStep?.RouteStepName;
  375. item.RouteUpdateType = initStep?.UpdateRange;
  376. });
  377. if (initStep.RouteStepName == "CA_Down")
  378. {
  379. var routeStepBB = GetRouteSteps.FirstOrDefault(item => item.RouteStepId.Equals(10) && item.RouteOpKey.Equals(task.RouteType));
  380. var nextStep = GetSteps.FirstOrDefault(item => item.RouteStepId.Equals(routeStepBB.RouteStepId));
  381. tasks.ForEach(item =>
  382. {
  383. if (item.TaskType == "补杯")
  384. {
  385. item.Status = TaskState.New;
  386. item.RouteStepId = routeStepBB.RouteStepId;
  387. item.RouteStep = nextStep?.RouteStepName;
  388. item.RouteUpdateType = nextStep?.UpdateRange;
  389. item.RouteId = 4;
  390. }
  391. });
  392. }
  393. _dataManager.Update(tasks);
  394. }
  395. catch (Exception e)
  396. {
  397. Console.WriteLine(e);
  398. throw;
  399. }
  400. }
  401. /// <summary>
  402. /// 路由更新(单步更新)
  403. /// </summary>
  404. /// <param name="task"></param>
  405. public static void UpdateRouteStep(this EquipmentTask task)
  406. {
  407. try
  408. {
  409. var routeStep = GetRouteSteps.FirstOrDefault(item =>
  410. item.RouteId.Equals(task.RouteId) && item.RouteStepId.Equals(task.RouteStepId) &&
  411. item.RouteOpKey.Equals(task.RouteType));
  412. if (routeStep is null) return;
  413. if (task.TaskType == "补杯" && task.RouteId == 1 && task.RouteStepId == 1)
  414. {
  415. var routeStepBB = GetRouteSteps.FirstOrDefault(item => item.RouteStepId.Equals(1) && item.RouteOpKey.Equals(task.RouteType));
  416. var nextStep = GetSteps.FirstOrDefault(item => item.RouteStepId.Equals(routeStepBB.RouteStepId));
  417. task.RouteStepId = routeStepBB.RouteStepId;
  418. task.RouteStep = nextStep?.RouteStepName;
  419. task.RouteUpdateType = nextStep?.UpdateRange;
  420. task.Status = TaskState.New;
  421. task.RouteId = 2;
  422. _dataManager.Update(task);
  423. return;
  424. }
  425. if (task.TaskType == "补杯" && task.RouteId == 7 && task.RouteStepId == 1)
  426. {
  427. task.To = task.OriginLocalName;
  428. }
  429. //如果是RouteStepID与NextStep相等,则查找下一段路由
  430. if (routeStep.RouteStepId.Equals(routeStep.NextStep) || task.TaskType == "补杯" && task.RouteId == 7 && task.RouteStepId == 8)
  431. {
  432. //查找路由
  433. var route = GetRoutes.FirstOrDefault(item =>item.RouteId.Equals(routeStep.RouteId) && item.OpKey.Equals(task.RouteType));
  434. //如果下一段路由的RouteID与NextRoute相等,则代表没有后续步骤,完成任务
  435. if (route is not null && route.RouteId.Equals(route.NextRoute) || task.TaskType == "补杯" && task.RouteId == 7 && task.RouteStepId == 8)
  436. {
  437. if (task.TaskType == "补杯" && task.RouteId == 7 && task.RouteStepId == 8)
  438. {
  439. _dataManager.Delete(task);
  440. }
  441. else
  442. {
  443. task.Status = TaskState.Finished;
  444. _dataManager.Update(task);
  445. }
  446. }
  447. else
  448. {
  449. var initRoute = GetRoutes.FirstOrDefault(
  450. item => route is not null && item.OpKey.Equals(task.RouteType) &&
  451. item.RouteId.Equals(route.NextRoute));
  452. if (initRoute is not null && initRoute.From != initRoute.To)
  453. {
  454. if (initRoute.To.In("LiquidWastePosition", "SamplePosition"))
  455. {
  456. task.From = task.To;
  457. task.To = task.OriginLocalName;
  458. }
  459. if (initRoute.To.In( "TitrationPosition2"))
  460. {
  461. task.From = task.To;
  462. }
  463. if (initRoute.From.In("LiquidWastePosition", "SamplePosition"))
  464. {
  465. task.From = task.OriginLocalName;
  466. }
  467. }
  468. if (initRoute is not null && initRoute.From.Equals(initRoute.To))
  469. task.From = task.To;
  470. task.Status = TaskState.New;
  471. if (initRoute is not null)
  472. {
  473. var initStep = GetSteps.FirstOrDefault(item => item.RouteStepId.Equals(initRoute.InitStep));
  474. task.RouteId = initRoute.RouteId;
  475. task.RouteStepId = initRoute.InitStep;
  476. task.RouteStep = initStep?.RouteStepName;
  477. task.RouteUpdateType = initStep?.UpdateRange;
  478. }
  479. _dataManager.Update(task);
  480. }
  481. }
  482. else
  483. {
  484. var nextStep = GetSteps.FirstOrDefault(item => item.RouteStepId.Equals(routeStep.NextStep));
  485. task.RouteStepId = routeStep.NextStep;
  486. task.RouteStep = nextStep?.RouteStepName;
  487. task.RouteUpdateType = nextStep?.UpdateRange;
  488. _dataManager.Update(task);
  489. }
  490. }
  491. catch (Exception e)
  492. {
  493. Console.WriteLine(e.Message);
  494. throw;
  495. }
  496. }
  497. #endregion
  498. }
  499. }