StatsDataManager.cs 12 KB

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