StatsDataManager.cs 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451
  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 StatsData
  13. {
  14. private StatsDataItem _item;
  15. public StatsData(string name, string description, int initialValue, int alarmValue = 0, int warningValue = 0,
  16. bool alarmEnable = false, bool isVisible = true)
  17. {
  18. StatsDataManager.Instance.Subscribe(name, description, initialValue, alarmValue, warningValue, alarmEnable, isVisible);
  19. _item = StatsDataManager.Instance.GetItem(name);
  20. }
  21. public int SetAlarmValue(int value)
  22. {
  23. return StatsDataManager.Instance.SetAlarmValue(_item.Name, value);
  24. }
  25. public int SetWarningValue(int value)
  26. {
  27. return StatsDataManager.Instance.SetWarningValue(_item.Name, value);
  28. }
  29. public void EnableAlarm(bool enable)
  30. {
  31. StatsDataManager.Instance.EnableAlarm(_item.Name, enable);
  32. }
  33. public void EnableVisible( bool visible)
  34. {
  35. StatsDataManager.Instance.EnableVisible(_item.Name, visible);
  36. }
  37. public void SetValue( int value)
  38. {
  39. StatsDataManager.Instance.SetValue(_item.Name, value);
  40. }
  41. public int GetValue()
  42. {
  43. return StatsDataManager.Instance.GetValue(_item.Name);
  44. }
  45. public int Increase( int additionValue = 1)
  46. {
  47. return StatsDataManager.Instance.Increase(_item.Name, additionValue);
  48. }
  49. public int Reset()
  50. {
  51. return StatsDataManager.Instance.Reset(_item.Name);
  52. }
  53. public void ResetTotal()
  54. {
  55. StatsDataManager.Instance.ResetTotal(_item.Name);
  56. }
  57. }
  58. public class StatsDataItem
  59. {
  60. public string Module { get; set; }
  61. public string Unit { get; set; }
  62. public string Name { get; set; }
  63. public int Value { get; set; }
  64. public string Description { get; set; }
  65. public int Total { get; set; }
  66. public DateTime LastUpdateTime { get; set; }
  67. public DateTime LastResetTime { get; set; }
  68. public DateTime LastResetTotalTime { get; set; }
  69. public int AlarmValue { get; set; }
  70. public int WarningValue { get; set; }
  71. public bool AlarmEnable { get; set; }
  72. public bool IsVisible { get; set; }
  73. }
  74. public class StatsDataManager:Singleton<StatsDataManager>
  75. {
  76. private Dictionary<string, StatsDataItem> _items = new Dictionary<string, StatsDataItem>();
  77. public Dictionary<string, StatsDataItem> Item { get => _items; }
  78. private object _locker = new object();
  79. public StatsDataManager()
  80. {
  81. }
  82. public void Initialize()
  83. {
  84. try
  85. {
  86. OP.Subscribe("System.Stats.ResetValue", (method, args) =>
  87. {
  88. Reset((string)args[0]);
  89. return true;
  90. });
  91. OP.Subscribe("System.Stats.EnableAlarm", (method, args) =>
  92. {
  93. EnableAlarm((string)args[0], (bool)args[1]);
  94. return true;
  95. });
  96. OP.Subscribe("System.Stats.SetAlarmValue", (method, args) =>
  97. {
  98. SetAlarmValue((string)args[0], (int)args[1]);
  99. return true;
  100. });
  101. OP.Subscribe("System.Stats.SetWarningValue", (method, args) =>
  102. {
  103. SetWarningValue((string)args[0], (int)args[1]);
  104. return true;
  105. });
  106. OP.Subscribe("System.Stats.ResetTotalValue", (method, args) =>
  107. {
  108. ResetTotal((string)args[0]);
  109. return true;
  110. });
  111. DataTable dt = DataQuery.Query("select * from \"stats_data\"");
  112. for (int i = 0; i < dt.Rows.Count; i++)
  113. {
  114. StatsDataItem item = new StatsDataItem();
  115. item.Name = dt.Rows[i]["name"].ToString();
  116. item.Description = dt.Rows[i]["description"].ToString();
  117. if (int.TryParse(dt.Rows[i]["value"].ToString(), out int value))
  118. item.Value = value;
  119. if (int.TryParse(dt.Rows[i]["total"].ToString(), out int total))
  120. item.Total = total;
  121. if (int.TryParse(dt.Rows[i]["alarm_value"].ToString(), out int alarmValue))
  122. item.AlarmValue = alarmValue;
  123. if (int.TryParse(dt.Rows[i]["warning_value"].ToString(), out int warningValue))
  124. item.WarningValue = warningValue;
  125. if (!dt.Rows[i]["enable_alarm"].Equals(DBNull.Value))
  126. item.AlarmEnable = Convert.ToBoolean(dt.Rows[i]["enable_alarm"].ToString());
  127. if (!dt.Rows[i]["is_visible"].Equals(DBNull.Value))
  128. item.IsVisible = Convert.ToBoolean(dt.Rows[i]["is_visible"].ToString());
  129. if (!dt.Rows[i]["last_update_time"].Equals(DBNull.Value))
  130. item.LastUpdateTime = (DateTime)dt.Rows[i]["last_update_time"] ;
  131. if (!dt.Rows[i]["last_reset_time"].Equals(DBNull.Value))
  132. item.LastResetTime = (DateTime)dt.Rows[i]["last_reset_time"];
  133. if (!dt.Rows[i]["last_total_reset_time"].Equals(DBNull.Value))
  134. item.LastResetTotalTime = (DateTime)dt.Rows[i]["last_total_reset_time"];
  135. _items[item.Name] = item;
  136. }
  137. }
  138. catch (Exception ex)
  139. {
  140. LOG.Error("init stats data manager failed", ex);
  141. }
  142. }
  143. public int SetAlarmValue(string name, int value)
  144. {
  145. lock (_locker)
  146. {
  147. if (!_items.ContainsKey(name))
  148. {
  149. LOG.Error($"Can not set {name} alarm value, not defined item");
  150. return -1;
  151. }
  152. int preValue = _items[name].AlarmValue;
  153. _items[name].AlarmValue = value;
  154. string sql = string.Format(
  155. "UPDATE \"stats_data\" SET \"alarm_value\"='{0}'WHERE \"name\"='{1}';",_items[name].AlarmValue,
  156. name);
  157. DB.Insert(sql);
  158. EV.PostInfoLog("System", $"{name} stats alarm value changed from {preValue} to {value}");
  159. return preValue;
  160. }
  161. }
  162. public int SetWarningValue(string name, int value)
  163. {
  164. lock (_locker)
  165. {
  166. if (!_items.ContainsKey(name))
  167. {
  168. LOG.Error($"Can not set {name} warning value, not defined item");
  169. return -1;
  170. }
  171. int preValue = _items[name].WarningValue;
  172. _items[name].WarningValue = value;
  173. string sql = string.Format(
  174. "UPDATE \"stats_data\" SET \"warning_value\"='{0}'WHERE \"name\"='{1}';", _items[name].WarningValue,
  175. name);
  176. DB.Insert(sql);
  177. EV.PostInfoLog("System", $"{name} stats warning value changed from {preValue} to {value}");
  178. return preValue;
  179. }
  180. }
  181. public void EnableAlarm(string name, bool enable)
  182. {
  183. lock (_locker)
  184. {
  185. if (!_items.ContainsKey(name))
  186. {
  187. LOG.Error($"Can not set {name} alarm enable, not defined item");
  188. return;
  189. }
  190. bool preValue = _items[name].AlarmEnable;
  191. _items[name].AlarmEnable = enable;
  192. string sql = string.Format(
  193. "UPDATE \"stats_data\" SET \"enable_alarm\"='{0}'WHERE \"name\"='{1}';", _items[name].AlarmEnable,
  194. name);
  195. DB.Insert(sql);
  196. EV.PostInfoLog("System", $"{name} stats alarm enable changed from {preValue} to {enable}");
  197. return;
  198. }
  199. }
  200. public void EnableVisible(string name, bool visible)
  201. {
  202. lock (_locker)
  203. {
  204. if (!_items.ContainsKey(name))
  205. {
  206. LOG.Error($"Can not set {name} alarm enable, not defined item");
  207. return;
  208. }
  209. bool preValue = _items[name].IsVisible;
  210. _items[name].IsVisible = visible;
  211. string sql = string.Format(
  212. "UPDATE \"stats_data\" SET \"is_visible\"='{0}'WHERE \"name\"='{1}';", _items[name].IsVisible,
  213. name);
  214. DB.Insert(sql);
  215. EV.PostInfoLog("System", $"{name} stats visible changed from {preValue} to {visible}");
  216. return;
  217. }
  218. }
  219. public void Terminate()
  220. {
  221. }
  222. public void Subscribe(string name, string description, int initialValue, int alarmValue=0, int warningValue = 0, bool alarmEnable=false, bool isVisible=true)
  223. {
  224. lock (_locker)
  225. {
  226. if (!_items.ContainsKey(name))
  227. {
  228. _items[name] = new StatsDataItem()
  229. {Description = description, Value = initialValue, Name = name, Total = 0};
  230. string executeInsert = string.Format(
  231. @"Insert into ""stats_data""(""name"",
  232. ""value"",
  233. ""total"",
  234. ""description"",
  235. ""last_update_time"",
  236. ""last_reset_time"",
  237. ""last_total_reset_time"",
  238. ""is_visible"",
  239. ""enable_alarm"",
  240. ""alarm_value"",
  241. ""warning_value""
  242. ) values('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}','{9}','{10}')",
  243. name, initialValue, initialValue, description, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss.fff")
  244. , DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss.fff"), DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss.fff"), isVisible, alarmEnable, alarmValue, warningValue);
  245. DB.Insert(executeInsert);
  246. }
  247. }
  248. }
  249. public void SetValue(string name, int value)
  250. {
  251. lock (_locker)
  252. {
  253. if (!_items.ContainsKey(name))
  254. {
  255. LOG.Error($"Can not set {name} value, not defined item");
  256. return;
  257. }
  258. _items[name].Value = value;
  259. _items[name].LastUpdateTime = DateTime.Now;
  260. string sql = string.Format(
  261. "UPDATE \"stats_data\" SET \"last_update_time\"='{0}',\"value\"='{1}' WHERE \"name\"='{2}';",
  262. _items[name].LastUpdateTime.ToString("yyyy/MM/dd HH:mm:ss.fff"),
  263. value,
  264. name);
  265. DB.Insert(sql);
  266. }
  267. }
  268. public int GetValue(string name)
  269. {
  270. lock (_locker)
  271. {
  272. if (_items.ContainsKey(name))
  273. {
  274. return _items[name].Value;
  275. }
  276. }
  277. LOG.Error($"Can not get {name} value, not defined item");
  278. return 0;
  279. }
  280. public StatsDataItem GetItem(string name)
  281. {
  282. lock (_locker)
  283. {
  284. if (_items.ContainsKey(name))
  285. {
  286. return _items[name];
  287. }
  288. }
  289. LOG.Error($"Can not get {name} value, not defined item");
  290. return null;
  291. }
  292. public bool CheckHasItem(string name)
  293. {
  294. if (_items.ContainsKey(name))
  295. return true;
  296. else
  297. return false;
  298. }
  299. public int Increase(string name, int additionValue=1)
  300. {
  301. lock (_locker)
  302. {
  303. if (!_items.ContainsKey(name))
  304. {
  305. LOG.Error($"Can not increase {name} value, not defined item");
  306. return -1;
  307. }
  308. _items[name].Value += additionValue;
  309. _items[name].Total += additionValue;
  310. _items[name].LastUpdateTime = DateTime.Now;
  311. string sql = string.Format(
  312. "UPDATE \"stats_data\" SET \"last_update_time\"='{0}',\"value\"='{1}',\"total\"='{2}' WHERE \"name\"='{3}';",
  313. _items[name].LastUpdateTime.ToString("yyyy/MM/dd HH:mm:ss.fff"),
  314. _items[name].Value,
  315. _items[name].Total,
  316. name);
  317. DB.Insert(sql);
  318. return _items[name].Value;
  319. }
  320. }
  321. public int Reset(string name)
  322. {
  323. lock (_locker)
  324. {
  325. if (!_items.ContainsKey(name))
  326. {
  327. LOG.Error($"Can not reset {name} value, not defined item");
  328. return -1;
  329. }
  330. int preValue = _items[name].Value;
  331. _items[name].Value = 0;
  332. _items[name].LastUpdateTime = DateTime.Now;
  333. _items[name].LastResetTime = DateTime.Now;
  334. string sql = string.Format(
  335. "UPDATE \"stats_data\" SET \"last_update_time\"='{0}',\"last_reset_time\"='{1}',\"value\"='{2}' WHERE \"name\"='{3}';",
  336. _items[name].LastUpdateTime.ToString("yyyy/MM/dd HH:mm:ss.fff"),
  337. _items[name].LastResetTime.ToString("yyyy/MM/dd HH:mm:ss.fff"),
  338. _items[name].Value,
  339. name);
  340. DB.Insert(sql);
  341. EV.PostInfoLog("System", $"{name} stats value reset to 0");
  342. return preValue;
  343. }
  344. }
  345. public void ResetTotal(string name)
  346. {
  347. lock (_locker)
  348. {
  349. if (!_items.ContainsKey(name))
  350. {
  351. LOG.Error($"Can not reset {name} value, not defined item");
  352. return;
  353. }
  354. _items[name].Value = 0;
  355. _items[name].Total = 0;
  356. _items[name].LastResetTime = DateTime.Now;
  357. _items[name].LastUpdateTime = DateTime.Now;
  358. _items[name].LastResetTotalTime = DateTime.Now;
  359. string sql = string.Format(
  360. "UPDATE \"stats_data\" SET \"last_update_time\"='{0}',\"last_reset_time\"='{1}',\"last_total_reset_time\"='{2}',\"value\"='{3}',\"total\"='{4}' WHERE \"name\"='{5}';",
  361. _items[name].LastUpdateTime.ToString("yyyy/MM/dd HH:mm:ss.fff"),
  362. _items[name].LastResetTime.ToString("yyyy/MM/dd HH:mm:ss.fff"),
  363. _items[name].LastResetTotalTime.ToString("yyyy/MM/dd HH:mm:ss.fff"),
  364. _items[name].Value,
  365. _items[name].Total,
  366. name);
  367. EV.PostInfoLog("System", $"{name} stats total value reset to 0");
  368. DB.Insert(sql);
  369. }
  370. }
  371. }
  372. }