StatsDataManager.cs 15 KB

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