StatsDataManager.cs 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data;
  4. using Aitex.Core.RT.DBCore;
  5. using Aitex.Core.RT.Event;
  6. using Aitex.Core.RT.Log;
  7. using Aitex.Core.RT.OperationCenter;
  8. using Aitex.Core.Util;
  9. using MECF.Framework.Common.DBCore;
  10. namespace MECF.Framework.Common.DataCenter
  11. {
  12. public class StatsDataItem
  13. {
  14. public string Name { get; set; }
  15. public int Value { get; set; }
  16. public string Description { get; set; }
  17. public int Total { get; set; }
  18. public DateTime LastUpdateTime { get; set; }
  19. public DateTime LastResetTime { get; set; }
  20. public DateTime LastResetTotalTime { get; set; }
  21. public int WarningValue { get; set; }
  22. public bool WarningEnable { get; set; }
  23. public int AlarmValue { get; set; }
  24. public bool AlarmEnable { get; set; }
  25. public bool IsVisible { get; set; }
  26. }
  27. public class StatsDataItemRFAndPump
  28. {
  29. public string Name { get; set; }
  30. public string Description { get; set; }
  31. public DateTime LastPMTime { get; set; }
  32. public double fromLastPM { get; set; }
  33. public double Total { get; set; }
  34. public double PMInterval { get; set; }
  35. public bool AlarmEnable { get; set; }
  36. }
  37. public class StatsDataManager:Singleton<StatsDataManager>
  38. {
  39. private Dictionary<string, StatsDataItem> _items = new Dictionary<string, StatsDataItem>();
  40. private Dictionary<string, StatsDataItemRFAndPump> _itemsRFAndPump = new Dictionary<string, StatsDataItemRFAndPump>();
  41. private object _locker = new object();
  42. public StatsDataManager()
  43. {
  44. }
  45. public void Initialize()
  46. {
  47. try
  48. {
  49. OP.Subscribe("System.Stats.ResetValue", (method, args) =>
  50. {
  51. Reset((string)args[0]);
  52. return true;
  53. });
  54. OP.Subscribe("System.Stats.EnableAlarm", (method, args) =>
  55. {
  56. EnableAlarm((string)args[0], (bool)args[1]);
  57. return true;
  58. });
  59. OP.Subscribe("System.Stats.Alarm", (method, args) =>
  60. {
  61. Alarm((string)args[0]);
  62. return true;
  63. });
  64. OP.Subscribe("System.Stats.SetAlarmValue", (method, args) =>
  65. {
  66. SetAlarmValue((string)args[0], (int)args[1]);
  67. return true;
  68. });
  69. OP.Subscribe("System.Stats.EnableWarning", (method, args) =>
  70. {
  71. EnableWarning((string)args[0], (bool)args[1]);
  72. return true;
  73. });
  74. OP.Subscribe("System.Stats.Warning", (method, args) =>
  75. {
  76. Warning((string)args[0]);
  77. return true;
  78. });
  79. OP.Subscribe("System.Stats.SetWarningValue", (method, args) =>
  80. {
  81. SetWarningValue((string)args[0], (int)args[1]);
  82. return true;
  83. });
  84. OP.Subscribe("System.Stats.ResetTotalValue", (method, args) =>
  85. {
  86. ResetTotal((string)args[0]);
  87. return true;
  88. });
  89. OP.Subscribe("System.StatsRFAndPump.EnableAlarm", (method, args) =>
  90. {
  91. RFEnableAlarm((string)args[0], (bool)args[1]);
  92. return true;
  93. });
  94. OP.Subscribe("System.StatsRFAndPump.ResetValue", (method, args) =>
  95. {
  96. RFReset((string)args[0]);
  97. return true;
  98. });
  99. OP.Subscribe("System.StatsRFAndPump.SetPMIntervalValue", (method, args) =>
  100. {
  101. SetPMIntervalValue((string)args[0], (int)args[1]);
  102. return true;
  103. });
  104. DataTable dt = DataQuery.Query("select * from \"stats_data\"");
  105. for (int i = 0; i < dt.Rows.Count; i++)
  106. {
  107. StatsDataItem item = new StatsDataItem();
  108. item.Name = dt.Rows[i]["name"].ToString();
  109. item.Description = dt.Rows[i]["description"].ToString();
  110. if (int.TryParse(dt.Rows[i]["value"].ToString(), out int value))
  111. item.Value = value;
  112. if (int.TryParse(dt.Rows[i]["total"].ToString(), out int total))
  113. item.Total = total;
  114. if (int.TryParse(dt.Rows[i]["alarm_value"].ToString(), out int alarmValue))
  115. item.AlarmValue = alarmValue;
  116. if (!dt.Rows[i]["enable_alarm"].Equals(DBNull.Value))
  117. item.AlarmEnable = Convert.ToBoolean(dt.Rows[i]["enable_alarm"].ToString());
  118. if (int.TryParse(dt.Rows[i]["warning_value"].ToString(), out int WarningValue))
  119. item.WarningValue = WarningValue;
  120. if (!dt.Rows[i]["enable_warning"].Equals(DBNull.Value))
  121. item.WarningEnable = Convert.ToBoolean(dt.Rows[i]["enable_warning"].ToString());
  122. if (!dt.Rows[i]["is_visible"].Equals(DBNull.Value))
  123. item.IsVisible = Convert.ToBoolean(dt.Rows[i]["is_visible"].ToString());
  124. if (!dt.Rows[i]["last_update_time"].Equals(DBNull.Value))
  125. item.LastUpdateTime = (DateTime)dt.Rows[i]["last_update_time"] ;
  126. if (!dt.Rows[i]["last_reset_time"].Equals(DBNull.Value))
  127. item.LastResetTime = (DateTime)dt.Rows[i]["last_reset_time"];
  128. if (!dt.Rows[i]["last_total_reset_time"].Equals(DBNull.Value))
  129. item.LastResetTotalTime = (DateTime)dt.Rows[i]["last_total_reset_time"];
  130. _items[item.Name] = item;
  131. }
  132. DataTable dtRf = DataQuery.Query("select * from \"stats_data_rf_pump\"");
  133. for (int i = 0; i < dtRf.Rows.Count; i++)
  134. {
  135. StatsDataItemRFAndPump itemRf = new StatsDataItemRFAndPump();
  136. itemRf.Name = dtRf.Rows[i]["name"].ToString();
  137. itemRf.Description = dtRf.Rows[i]["description"].ToString();
  138. if (double.TryParse(dtRf.Rows[i]["total"].ToString(), out double total))
  139. itemRf.Total = total;
  140. if (double.TryParse(dtRf.Rows[i]["pm_interval"].ToString(), out double pmInterval))
  141. itemRf.PMInterval = pmInterval;
  142. if (double.TryParse(dtRf.Rows[i]["from_last_pm"].ToString(), out double fromLastPM))
  143. itemRf.fromLastPM = fromLastPM;
  144. if (!dtRf.Rows[i]["enable_alarm"].Equals(DBNull.Value))
  145. itemRf.AlarmEnable = Convert.ToBoolean(dtRf.Rows[i]["enable_alarm"].ToString());
  146. if (!dtRf.Rows[i]["last_pm_time"].Equals(DBNull.Value))
  147. itemRf.LastPMTime = (DateTime)dtRf.Rows[i]["last_pm_time"];
  148. _itemsRFAndPump[itemRf.Name] = itemRf;
  149. }
  150. }
  151. catch (Exception ex)
  152. {
  153. LOG.WriteExeption("init stats data manager failed", ex);
  154. }
  155. }
  156. private int SetAlarmValue(string name, int value)
  157. {
  158. lock (_locker)
  159. {
  160. if (!_items.ContainsKey(name))
  161. {
  162. //LOG.Error($"Can not set {name} alarm value, not defined item");
  163. return -1;
  164. }
  165. int preValue = _items[name].AlarmValue;
  166. _items[name].AlarmValue = value;
  167. string sql = string.Format(
  168. "UPDATE \"stats_data\" SET \"alarm_value\"='{0}'WHERE \"name\"='{1}';",_items[name].AlarmValue,
  169. name);
  170. DB.Insert(sql);
  171. EV.PostInfoLog("System", $"{name} stats alarm value changed from {preValue} to {value}");
  172. return preValue;
  173. }
  174. }
  175. private double SetPMIntervalValue(string name, int value)
  176. {
  177. lock (_locker)
  178. {
  179. if (!_itemsRFAndPump.ContainsKey(name))
  180. {
  181. //LOG.Error($"Can not set {name} alarm value, not defined item");
  182. return -1;
  183. }
  184. double preValue = _itemsRFAndPump[name].PMInterval;
  185. _itemsRFAndPump[name].PMInterval = value;
  186. string sql = string.Format(
  187. "UPDATE \"stats_data_rf_pump\" SET \"pm_interval\"='{0}'WHERE \"name\"='{1}';", _itemsRFAndPump[name].PMInterval,
  188. name);
  189. DB.Insert(sql);
  190. EV.PostInfoLog("System", $"{name} stats rf pump pm interval value changed from {preValue} to {value}");
  191. return preValue;
  192. }
  193. }
  194. private int SetWarningValue(string name, int value)
  195. {
  196. lock (_locker)
  197. {
  198. if (!_items.ContainsKey(name))
  199. {
  200. //LOG.Error($"Can not set {name} warning value, not defined item");
  201. return -1;
  202. }
  203. int preValue = _items[name].WarningValue;
  204. _items[name].WarningValue = value;
  205. string sql = string.Format(
  206. "UPDATE \"stats_data\" SET \"warning_value\"='{0}'WHERE \"name\"='{1}';", _items[name].WarningValue,
  207. name);
  208. DB.Insert(sql);
  209. EV.PostInfoLog("System", $"{name} stats warning value changed from {preValue} to {value}");
  210. return preValue;
  211. }
  212. }
  213. private void EnableAlarm(string name, bool enable)
  214. {
  215. lock (_locker)
  216. {
  217. if (!_items.ContainsKey(name))
  218. {
  219. //LOG.Error($"Can not set {name} alarm enable, not defined item");
  220. return;
  221. }
  222. bool preValue = _items[name].AlarmEnable;
  223. _items[name].AlarmEnable = enable;
  224. string sql = string.Format(
  225. "UPDATE \"stats_data\" SET \"enable_alarm\"='{0}'WHERE \"name\"='{1}';", _items[name].AlarmEnable,
  226. name);
  227. DB.Insert(sql);
  228. EV.PostInfoLog("System", $"{name} stats alarm enable changed from {preValue} to {enable}");
  229. return;
  230. }
  231. }
  232. private void RFEnableAlarm(string name, bool enable)
  233. {
  234. lock (_locker)
  235. {
  236. if (!_itemsRFAndPump.ContainsKey(name))
  237. {
  238. //LOG.Error($"Can not set {name} alarm enable, not defined item");
  239. return;
  240. }
  241. bool preValue = _itemsRFAndPump[name].AlarmEnable;
  242. _itemsRFAndPump[name].AlarmEnable = enable;
  243. string sql = string.Format(
  244. "UPDATE \"stats_data_rf_pump\" SET \"enable_alarm\"='{0}'WHERE \"name\"='{1}';", _itemsRFAndPump[name].AlarmEnable,
  245. name);
  246. DB.Insert(sql);
  247. EV.PostInfoLog("System", $"{name} stats data rf and pump alarm enable changed from {preValue} to {enable}");
  248. return;
  249. }
  250. }
  251. private void Alarm(string name)
  252. {
  253. lock (_locker)
  254. {
  255. if (!_items.ContainsKey(name))
  256. {
  257. //LOG.Error($"Can not set {name} alarm enable, not defined item");
  258. return;
  259. }
  260. EV.PostAlarmLog("System", $"{name} stats wafer value larger than wafer setting alarm value");
  261. return;
  262. }
  263. }
  264. private void EnableWarning(string name, bool enable)
  265. {
  266. lock (_locker)
  267. {
  268. if (!_items.ContainsKey(name))
  269. {
  270. //LOG.Error($"Can not set {name} warning enable, not defined item");
  271. return;
  272. }
  273. bool preValue = _items[name].WarningEnable;
  274. _items[name].WarningEnable = enable;
  275. string sql = string.Format(
  276. "UPDATE \"stats_data\" SET \"enable_warning\"='{0}'WHERE \"name\"='{1}';", _items[name].WarningEnable,
  277. name);
  278. DB.Insert(sql);
  279. EV.PostInfoLog("System", $"{name} stats warning enable changed from {preValue} to {enable}");
  280. return;
  281. }
  282. }
  283. private void Warning(string name)
  284. {
  285. lock (_locker)
  286. {
  287. if (!_items.ContainsKey(name))
  288. {
  289. //LOG.Error($"Can not set {name} warning enable, not defined item");
  290. return;
  291. }
  292. EV.PostWarningLog("System", $"{name} stats wafer value larger than wafer setting warning value");
  293. return;
  294. }
  295. }
  296. public void EnableVisible(string name, bool visible)
  297. {
  298. lock (_locker)
  299. {
  300. if (!_items.ContainsKey(name))
  301. {
  302. //LOG.Error($"Can not set {name} alarm enable, not defined item");
  303. return;
  304. }
  305. bool preValue = _items[name].IsVisible;
  306. _items[name].IsVisible = visible;
  307. string sql = string.Format(
  308. "UPDATE \"stats_data\" SET \"is_visible\"='{0}'WHERE \"name\"='{1}';", _items[name].IsVisible,
  309. name);
  310. DB.Insert(sql);
  311. EV.PostInfoLog("System", $"{name} stats visible changed from {preValue} to {visible}");
  312. return;
  313. }
  314. }
  315. public void Terminate()
  316. {
  317. }
  318. public void Subscribe(string name, string description, int initialValue, int warningValue = 0, bool warningEnable = false, int alarmValue = 0, bool alarmEnable = false, bool isVisible=true)
  319. {
  320. lock (_locker)
  321. {
  322. if (!_items.ContainsKey(name))
  323. {
  324. _items[name] = new StatsDataItem()
  325. {Description = description, Value = initialValue, Name = name, Total = 0};
  326. string executeInsert = string.Format(
  327. @"Insert into ""stats_data""(""name"",
  328. ""value"",
  329. ""total"",
  330. ""description"",
  331. ""last_update_time"",
  332. ""last_reset_time"",
  333. ""last_total_reset_time"",
  334. ""is_visible"",
  335. ""enable_warning"",
  336. ""warning_value"",
  337. ""enable_alarm"",
  338. ""alarm_value""
  339. ) values('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}','{10}','{11}')",
  340. name, initialValue, initialValue, description, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")
  341. , DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), isVisible, warningEnable, warningValue, alarmEnable, alarmValue);
  342. DB.Insert(executeInsert);
  343. }
  344. }
  345. }
  346. public void Subscribe(string name, string description, double fromLastPM = 0, double Total = 0, double PMInterval = 0, bool alarmEnable = false)
  347. {
  348. lock (_locker)
  349. {
  350. if (!_itemsRFAndPump.ContainsKey(name))
  351. {
  352. _itemsRFAndPump[name] = new StatsDataItemRFAndPump()
  353. { Description = description, Name = name, fromLastPM = 0, Total = 0, PMInterval = 0, AlarmEnable = false };
  354. string executeInsert = string.Format(
  355. @"Insert into ""stats_data_rf_pump""(""name"",
  356. ""description"",
  357. ""last_pm_time"",
  358. ""from_last_pm"",
  359. ""total"",
  360. ""pm_interval"",
  361. ""enable_alarm""
  362. ) values('{0}','{1}','{2}','{3}','{4}','{5}','{6}')",
  363. name, description, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), fromLastPM, Total, PMInterval, alarmEnable);
  364. DB.Insert(executeInsert);
  365. }
  366. }
  367. }
  368. public void SetValue(string name, int value)
  369. {
  370. lock (_locker)
  371. {
  372. if (!_items.ContainsKey(name))
  373. {
  374. //LOG.Error($"Can not set {name} value, not defined item");
  375. return;
  376. }
  377. _items[name].Value = value;
  378. _items[name].LastUpdateTime = DateTime.Now;
  379. string sql = string.Format(
  380. "UPDATE \"stats_data\" SET \"last_update_time\"='{0}',\"value\"='{1}' WHERE \"name\"='{2}';",
  381. _items[name].LastUpdateTime.ToString("yyyy/MM/dd HH:mm:ss.fff"),
  382. value,
  383. name);
  384. DB.Insert(sql);
  385. }
  386. }
  387. public int GetValue(string name)
  388. {
  389. lock (_locker)
  390. {
  391. if (_items.ContainsKey(name))
  392. {
  393. return _items[name].Value;
  394. }
  395. }
  396. //LOG.Error($"Can not get {name} value, not defined item");
  397. return 0;
  398. }
  399. public StatsDataItem GetItem(string name)
  400. {
  401. lock (_locker)
  402. {
  403. if (_items.ContainsKey(name))
  404. {
  405. return _items[name];
  406. }
  407. }
  408. //LOG.Error($"Can not get {name} value, not defined item");
  409. return null;
  410. }
  411. public StatsDataItemRFAndPump GetItemRFAndPump(string name)
  412. {
  413. lock (_locker)
  414. {
  415. if (_itemsRFAndPump.ContainsKey(name))
  416. {
  417. return _itemsRFAndPump[name];
  418. }
  419. }
  420. //LOG.Error($"Can not get {name} value, not defined item");
  421. return null;
  422. }
  423. public int Increase(string name, int additionValue=1)
  424. {
  425. lock (_locker)
  426. {
  427. if (!_items.ContainsKey(name))
  428. {
  429. //LOG.Error($"Can not increase {name} value, not defined item");
  430. return -1;
  431. }
  432. _items[name].Value += additionValue;
  433. _items[name].Total += additionValue;
  434. _items[name].LastUpdateTime = DateTime.Now;
  435. string sql = string.Format(
  436. "UPDATE \"stats_data\" SET \"last_update_time\"='{0}',\"value\"='{1}',\"total\"='{2}' WHERE \"name\"='{3}';",
  437. _items[name].LastUpdateTime.ToString("yyyy/MM/dd HH:mm:ss.fff"),
  438. _items[name].Value,
  439. _items[name].Total,
  440. name);
  441. DB.Insert(sql);
  442. return _items[name].Value;
  443. }
  444. }
  445. public int Increase(string name, string description, double fromLastPM = 0, double Total = 0, double PMInterval = 0, bool alarmEnable = false)
  446. {
  447. lock (_locker)
  448. {
  449. if (!_itemsRFAndPump.ContainsKey(name))
  450. {
  451. //LOG.Error($"Can not increase {name} value, not defined item");
  452. return -1;
  453. }
  454. _itemsRFAndPump[name].fromLastPM = fromLastPM;
  455. _itemsRFAndPump[name].Total = Total;
  456. string sql = string.Format(
  457. "UPDATE \"stats_data_rf_pump\" SET \"from_last_pm\"='{0}',\"total\"='{1}' WHERE \"name\"='{2}';",
  458. _itemsRFAndPump[name].fromLastPM, _itemsRFAndPump[name].Total, name);
  459. DB.Insert(sql);
  460. return 0;
  461. }
  462. }
  463. public int Reset(string name)
  464. {
  465. lock (_locker)
  466. {
  467. if (!_items.ContainsKey(name))
  468. {
  469. //LOG.Error($"Can not reset {name} value, not defined item");
  470. return -1;
  471. }
  472. int preValue = _items[name].Value;
  473. _items[name].Value = 0;
  474. _items[name].LastUpdateTime = DateTime.Now;
  475. _items[name].LastResetTime = DateTime.Now;
  476. string sql = string.Format(
  477. "UPDATE \"stats_data\" SET \"last_update_time\"='{0}',\"last_reset_time\"='{1}',\"value\"='{2}' WHERE \"name\"='{3}';",
  478. _items[name].LastUpdateTime.ToString("yyyy/MM/dd HH:mm:ss.fff"),
  479. _items[name].LastResetTime.ToString("yyyy/MM/dd HH:mm:ss.fff"),
  480. _items[name].Value,
  481. name);
  482. DB.Insert(sql);
  483. EV.PostInfoLog("System", $"{name} stats value reset to 0");
  484. return preValue;
  485. }
  486. }
  487. public int RFReset(string name)
  488. {
  489. lock (_locker)
  490. {
  491. if (!_itemsRFAndPump.ContainsKey(name))
  492. {
  493. //LOG.Error($"Can not reset {name} value, not defined item");
  494. return -1;
  495. }
  496. _itemsRFAndPump[name].fromLastPM = 0;
  497. _itemsRFAndPump[name].LastPMTime = DateTime.Now;
  498. string sql = string.Format(
  499. "UPDATE \"stats_data_rf_pump\" SET \"last_pm_time\"='{0}',\"from_last_pm\"='{1}' WHERE \"name\"='{2}';",
  500. _itemsRFAndPump[name].LastPMTime.ToString("yyyy/MM/dd HH:mm:ss.fff"),
  501. _itemsRFAndPump[name].fromLastPM,
  502. name);
  503. DB.Insert(sql);
  504. EV.PostInfoLog("System", $"{name} stats rf pump value reset to 0");
  505. return 0;
  506. }
  507. }
  508. public void ResetTotal(string name)
  509. {
  510. lock (_locker)
  511. {
  512. if (!_items.ContainsKey(name))
  513. {
  514. //LOG.Error($"Can not reset {name} value, not defined item");
  515. return;
  516. }
  517. //_items[name].Value = 0;
  518. _items[name].Total = 0;
  519. //_items[name].LastResetTime = DateTime.Now;
  520. _items[name].LastUpdateTime = DateTime.Now;
  521. _items[name].LastResetTotalTime = DateTime.Now;
  522. string sql = string.Format(
  523. "UPDATE \"stats_data\" SET \"last_update_time\"='{0}',\"last_total_reset_time\"='{1}',\"total\"='{2}' WHERE \"name\"='{3}';",
  524. _items[name].LastUpdateTime.ToString("yyyy/MM/dd HH:mm:ss.fff"),
  525. //_items[name].LastResetTime.ToString("yyyy/MM/dd HH:mm:ss.fff"),
  526. _items[name].LastResetTotalTime.ToString("yyyy/MM/dd HH:mm:ss.fff"),
  527. //_items[name].Value,
  528. _items[name].Total,
  529. name);
  530. EV.PostInfoLog("System", $"{name} stats total value reset to 0");
  531. DB.Insert(sql);
  532. }
  533. }
  534. }
  535. }