EventManager.cs 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832
  1. using Aitex.Common.Util;
  2. using Aitex.Core.RT.DataCenter;
  3. using Aitex.Core.RT.Log;
  4. using Aitex.Core.RT.OperationCenter;
  5. using Aitex.Core.Util;
  6. using Aitex.Core.WCF;
  7. using MECF.Framework.Common.Event;
  8. using MECF.Framework.Common.FAServices;
  9. using System;
  10. using System.Collections.Generic;
  11. using System.IO;
  12. using System.Linq;
  13. using System.ServiceModel;
  14. using System.Xml;
  15. namespace Aitex.Core.RT.Event
  16. {
  17. public class EventManager : ICommonEvent
  18. {
  19. public EventService Service
  20. {
  21. get { return _eventService; }
  22. }
  23. public event Action<EventItem> FireEvent;
  24. public event Action<EventItem> OnAlarmEvent;
  25. public event Action<EventItem> OnEvent;
  26. FixSizeQueue<EventItem> _eventQueue;
  27. List<EventItem> _alarmList;
  28. PeriodicJob _eventJob;
  29. EventDBWriter _eventDB;
  30. EventLogWriter _writerToLog;
  31. EventMailWriter _writerToMail;
  32. EventService _eventService;
  33. ServiceHost _eventServiceHost;
  34. Dictionary<string, EventItem> _eventDic = new Dictionary<string, EventItem>();
  35. private const string INFORMATION_EVENT = "INFORMATION_EVENT";
  36. private const string WARNING_EVENT = "WARNING_EVENT";
  37. private const string ALARM_EVENT = "ALARM_EVENT";
  38. private object _locker = new object();
  39. private string _localAlarmEventConfigFile;
  40. private string _localAlarmEventDataFile = PathManager.GetCfgDir() + "_AlarmEventDefine.xml";
  41. private string _localAlarmEventDataBackupFile = PathManager.GetCfgDir() + "_AlarmEventDefine.xml.bak";
  42. public Dictionary<string, Dictionary<string, EventItem>> AlarmDic { get; private set; }//不同的表,每个表里面有相应的alarm项
  43. public string CurrentAlarmTable { get; set; } = "0";//default table 0
  44. private string _defaultAlarmTable = "0";
  45. private object _alarmDicLocker = new object();
  46. public List<VIDItem> VidEventList
  47. {
  48. get
  49. {
  50. List<VIDItem> result = new List<VIDItem>();
  51. foreach (var dataItem in _eventDic)
  52. {
  53. result.Add(new VIDItem()
  54. {
  55. DataType = "",
  56. Description = dataItem.Value.Description,
  57. Index = 0,
  58. Name = dataItem.Key,
  59. Unit = "",
  60. });
  61. }
  62. return result;
  63. }
  64. }
  65. public List<VIDItem> VidAlarmList
  66. {
  67. get
  68. {
  69. List<VIDItem> result = new List<VIDItem>();
  70. lock (_alarmDicLocker)
  71. {
  72. foreach (var dataItem in AlarmDic[_defaultAlarmTable].Values)
  73. {
  74. result.Add(new VIDItem()
  75. {
  76. DataType = "",
  77. Description = dataItem.Description,
  78. Index = 0,
  79. Name = dataItem.EventEnum,
  80. Unit = "",
  81. });
  82. }
  83. }
  84. return result;
  85. }
  86. }
  87. public EventManager()
  88. {
  89. }
  90. public void Initialize(string commonEventListXmlFile, string localEventListXmlFile, bool needCreateService = true, bool needSaveDB = true, bool needMailOut = false)
  91. {
  92. Initialize(commonEventListXmlFile, needCreateService, needSaveDB, needMailOut, localEventListXmlFile);
  93. }
  94. public void Initialize(string commonEventListXmlFile, bool needCreateService = true, bool needSaveDB = true, bool needMailOut = false, string localEventListXmlFile = null)
  95. {
  96. if (needSaveDB)
  97. {
  98. _eventDB = new EventDBWriter();
  99. try
  100. {
  101. _eventDB.Initialize();
  102. }
  103. catch (Exception ex)
  104. {
  105. LOG.Write(ex);
  106. }
  107. }
  108. _writerToLog = new EventLogWriter();
  109. if (needMailOut)
  110. {
  111. _writerToMail = new EventMailWriter();
  112. }
  113. _eventService = new EventService();
  114. if (needCreateService)
  115. {
  116. try
  117. {
  118. _eventServiceHost = new ServiceHost(_eventService);
  119. _eventServiceHost.Open();
  120. }
  121. catch (Exception ex)
  122. {
  123. throw new ApplicationException("创建Event服务失败," + ex.Message);
  124. }
  125. }
  126. _eventQueue = new FixSizeQueue<EventItem>(1000);
  127. _alarmList = new List<EventItem>(1000);
  128. AlarmDic = new Dictionary<string, Dictionary<string, EventItem>>();
  129. AlarmDic.Add(_defaultAlarmTable, new Dictionary<string, EventItem>());
  130. _eventJob = new PeriodicJob(100, this.PeriodicRun, "EventPeriodicJob", true);
  131. try
  132. {
  133. EventDefine eventList = CustomXmlSerializer.Deserialize<EventDefine>(new FileInfo(commonEventListXmlFile));
  134. foreach (var item in eventList.Items)
  135. _eventDic[item.EventEnum] = item;
  136. _localAlarmEventConfigFile = localEventListXmlFile;
  137. if (!string.IsNullOrEmpty(_localAlarmEventConfigFile))
  138. {
  139. lock (_alarmDicLocker)
  140. {
  141. BuildItems(_localAlarmEventConfigFile);
  142. }
  143. BackupAndRecoverDataFile();
  144. CustomData();
  145. GenerateDataFile();
  146. }
  147. }
  148. catch (ArgumentNullException)
  149. {
  150. throw new ApplicationException("初始化EventManager没有设置Event列表文件");
  151. }
  152. catch (FileNotFoundException ex)
  153. {
  154. throw new ApplicationException("没有找到Event列表文件," + ex.Message);
  155. }
  156. catch (Exception ex)
  157. {
  158. throw new ApplicationException("EventDefine文件格式不对," + commonEventListXmlFile + ",\r\n" + ex.Message);
  159. }
  160. Subscribe(new EventItem(INFORMATION_EVENT, EventType.EventUI_Notify, EventLevel.Information));
  161. Subscribe(new EventItem(WARNING_EVENT, EventType.EventUI_Notify, EventLevel.Warning));
  162. Subscribe(new EventItem(ALARM_EVENT, EventType.EventUI_Notify, EventLevel.Alarm));
  163. EV.InnerEventManager = this;
  164. }
  165. public void SubscribeOperationAndData()
  166. {
  167. OP.Subscribe("System.ResetAlarm", InvokeResetAlarm);
  168. DATA.Subscribe("System.ActiveAlarm", () =>
  169. {
  170. return AlarmDic[CurrentAlarmTable].Values.ToList().FindAll(x => !x.IsAcknowledged);
  171. });
  172. DATA.Subscribe("System.HasActiveAlarm", () =>
  173. {
  174. return AlarmDic[CurrentAlarmTable].Values.ToList().FirstOrDefault(x => !x.IsAcknowledged) != null;
  175. });
  176. DATA.Subscribe($"System.AlarmTableID", () => CurrentAlarmTable);
  177. OP.Subscribe($"System.UpdateAlarmTable", (string cmd, object[] args) =>
  178. {
  179. if (args != null && args.Length > 0 && args[0] is Dictionary<string, Dictionary<string, EventItem>>)
  180. {
  181. var updateAlarmTable = args[0] as Dictionary<string, Dictionary<string, EventItem>>;
  182. lock (_alarmDicLocker)
  183. {
  184. foreach (var table in updateAlarmTable.Keys)
  185. {
  186. foreach (var key in updateAlarmTable[table].Keys)
  187. {
  188. if (AlarmDic != null && AlarmDic.ContainsKey(table) && AlarmDic[table].ContainsKey(key))
  189. {
  190. if (updateAlarmTable[table][key] is EventItem)
  191. {
  192. AlarmDic[table][key] = (updateAlarmTable[table][key] as EventItem).Clone();
  193. }
  194. }
  195. }
  196. }
  197. }
  198. GenerateDataFile();
  199. }
  200. return true;
  201. });
  202. OP.Subscribe($"System.SetAlarmTableID", (out string reason, int time, object[] param) =>
  203. {
  204. reason = string.Empty;
  205. CurrentAlarmTable = param[0].ToString();
  206. return true;
  207. });
  208. }
  209. private void BuildItems(string xmlFile)
  210. {
  211. XmlDocument xml = new XmlDocument();
  212. try
  213. {
  214. xml.Load(xmlFile);
  215. XmlNodeList nodeAlarmTables = xml.SelectNodes("Alarms/AlarmTable");
  216. foreach (XmlElement AlarmTable in nodeAlarmTables)
  217. {
  218. BuildAlarmConfigs(string.IsNullOrEmpty(AlarmTable.GetAttribute("Name")) ? "0" : AlarmTable.GetAttribute("Name"), AlarmTable as XmlElement, true);
  219. }
  220. }
  221. catch (Exception ex)
  222. {
  223. LOG.Write(ex);
  224. }
  225. }
  226. private void BuildAlarmConfigs(string alarmTable, XmlElement configElement, bool isCheckDuplicated)
  227. {
  228. XmlNodeList nodeAlarmList = configElement.SelectNodes("AlarmCategory");
  229. if (!AlarmDic.ContainsKey(alarmTable))
  230. AlarmDic.Add(alarmTable, new Dictionary<string, EventItem>());
  231. foreach (XmlElement nodeCategory in nodeAlarmList)
  232. {
  233. XmlNodeList nodeAlarms = nodeCategory.SelectNodes("Alarm");
  234. foreach (XmlElement nodeAlarm in nodeAlarms)
  235. {
  236. EventItem item = new EventItem()
  237. {
  238. EventEnum = nodeAlarm.GetAttribute("Name"),
  239. DisplayName = string.IsNullOrEmpty(nodeAlarm.GetAttribute("DisplayName")) ? nodeAlarm.GetAttribute("Name") : nodeAlarm.GetAttribute("DisplayName"),
  240. Id = int.Parse(nodeAlarm.GetAttribute("Id")),
  241. Source = nodeAlarm.GetAttribute("Source"),
  242. Description = nodeAlarm.GetAttribute("Description"),
  243. Explaination = nodeAlarm.GetAttribute("Explaination"),
  244. Solution = nodeAlarm.GetAttribute("Solution"),
  245. Category = !string.IsNullOrEmpty(nodeCategory.GetAttribute("Name")) ? nodeCategory.GetAttribute("Name") : "",
  246. Bypass = !string.IsNullOrEmpty(nodeAlarm.GetAttribute("Bypass")) ? bool.Parse(nodeAlarm.GetAttribute("Bypass")) : false,
  247. Editable = !string.IsNullOrEmpty(nodeAlarm.GetAttribute("Editable")) ? bool.Parse(nodeAlarm.GetAttribute("Editable")) : true,
  248. AutoRecovery = !string.IsNullOrEmpty(nodeAlarm.GetAttribute("AutoRecovery")) ? bool.Parse(nodeAlarm.GetAttribute("AutoRecovery")) : false,
  249. Group = !string.IsNullOrEmpty(nodeAlarm.GetAttribute("Group")) ?
  250. (EventGroup)Enum.Parse(typeof(EventGroup), nodeAlarm.GetAttribute("Group")) : EventGroup.Group0,
  251. Type = !string.IsNullOrEmpty(nodeAlarm.GetAttribute("Type")) ?
  252. (EventType)Enum.Parse(typeof(EventType), nodeAlarm.GetAttribute("Type")) : EventType.EventUI_Notify,
  253. Level = !string.IsNullOrEmpty(nodeAlarm.GetAttribute("Level")) ?
  254. (EventLevel)Enum.Parse(typeof(EventLevel), nodeAlarm.GetAttribute("Level")) : EventLevel.Alarm,
  255. Action = !string.IsNullOrEmpty(nodeAlarm.GetAttribute("Action")) ?
  256. (EventAction)Enum.Parse(typeof(EventAction), nodeAlarm.GetAttribute("Action")) : EventAction.Clear,
  257. };
  258. if (isCheckDuplicated && AlarmDic[alarmTable].ContainsKey(item.EventEnum))
  259. {
  260. LOG.Error("Duplicated Alarm item, " + item.EventEnum);
  261. continue;
  262. }
  263. AlarmDic[alarmTable][item.EventEnum] = item;
  264. }
  265. }
  266. }
  267. private void BackupAndRecoverDataFile()
  268. {
  269. try
  270. {
  271. if (File.Exists(_localAlarmEventDataFile) && IsXmlFileLoadable(_localAlarmEventDataFile))
  272. {
  273. File.Copy(_localAlarmEventDataFile, _localAlarmEventDataBackupFile, true);
  274. }
  275. else if (File.Exists(_localAlarmEventDataBackupFile) && IsXmlFileLoadable(_localAlarmEventDataBackupFile))
  276. {
  277. File.Copy(_localAlarmEventDataBackupFile, _localAlarmEventDataFile, true);
  278. LOG.Write($"Restore alarm configs from {_localAlarmEventDataBackupFile} to {_localAlarmEventDataFile}");
  279. }
  280. }
  281. catch (Exception ex)
  282. {
  283. LOG.Write(ex);
  284. }
  285. }
  286. private void CustomData()
  287. {
  288. Dictionary<string, string> values = new Dictionary<string, string>();
  289. try
  290. {
  291. if (File.Exists(_localAlarmEventDataFile))
  292. {
  293. XmlDocument xmlData = new XmlDocument();
  294. xmlData.Load(_localAlarmEventDataFile);
  295. XmlNodeList nodeAlarmTables = xmlData.SelectNodes("Alarms/AlarmTable");
  296. foreach (XmlElement AlarmTable in nodeAlarmTables)
  297. {
  298. BuildAlarmConfigs(string.IsNullOrEmpty(AlarmTable.GetAttribute("Name")) ? "0" : AlarmTable.GetAttribute("Name"), AlarmTable as XmlElement, false);
  299. }
  300. }
  301. }
  302. catch (Exception ex)
  303. {
  304. LOG.Write(ex);
  305. }
  306. }
  307. private void GenerateDataFile()
  308. {
  309. try
  310. {
  311. lock (_alarmDicLocker)
  312. {
  313. Serialize(_localAlarmEventDataFile, AlarmDic.Keys.ToList());
  314. }
  315. if (File.Exists(_localAlarmEventDataFile) && IsXmlFileLoadable(_localAlarmEventDataFile))
  316. {
  317. File.Copy(_localAlarmEventDataFile, _localAlarmEventDataBackupFile, true);
  318. }
  319. }
  320. catch (Exception ex)
  321. {
  322. LOG.Write(ex);
  323. }
  324. }
  325. private bool IsXmlFileLoadable(string file)
  326. {
  327. try
  328. {
  329. XmlDocument xml = new XmlDocument();
  330. xml.Load(file);
  331. }
  332. catch (Exception ex)
  333. {
  334. LOG.Write(ex);
  335. return false;
  336. }
  337. return true;
  338. }
  339. private void Serialize(string pathFile, List<string> alarmTables)
  340. {
  341. XmlDocument xmldoc = new XmlDocument();
  342. if (!File.Exists(pathFile))
  343. {
  344. XmlDocument xml = new XmlDocument();
  345. XmlDeclaration dec = xml.CreateXmlDeclaration("1.0", "utf-8", null);
  346. xml.AppendChild(dec);
  347. XmlElement root = xml.CreateElement("Alarms");
  348. xml.AppendChild(root);
  349. xml.Save(pathFile);
  350. }
  351. xmldoc.Load(pathFile);
  352. XmlNode rootNode = xmldoc.SelectSingleNode("Alarms");
  353. rootNode.RemoveAll();
  354. foreach (var table in alarmTables)
  355. {
  356. XmlElement eventTable = xmldoc.CreateElement("AlarmTable");
  357. eventTable.SetAttribute("Name", table);
  358. rootNode.AppendChild(eventTable);
  359. }
  360. foreach (var table in alarmTables)
  361. {
  362. XmlNode table0Node = rootNode.SelectSingleNode($"./AlarmTable[@Name='{table}']");
  363. List<string> categorys = new List<string>();
  364. foreach (var dataItem in AlarmDic[table].Values)
  365. {
  366. if (!categorys.Contains(dataItem.Category))
  367. categorys.Add(dataItem.Category);
  368. }
  369. foreach (var category in categorys)
  370. {
  371. XmlElement cat = xmldoc.CreateElement("AlarmCategory");
  372. cat.SetAttribute("Name", category);
  373. table0Node.AppendChild(cat);
  374. }
  375. if (AlarmDic[table].Values != null)
  376. {
  377. foreach (var alarm in AlarmDic[table].Values)
  378. {
  379. XmlNode categoryNodes = table0Node.SelectSingleNode($"./AlarmCategory[@Name='{alarm.Category}']");
  380. XmlElement subNode = xmldoc.CreateElement("Alarm");
  381. subNode.SetAttribute("Name", alarm.EventEnum.ToString());
  382. subNode.SetAttribute("DisplayName", string.IsNullOrEmpty(alarm.DisplayName.ToString()) ? alarm.EventEnum.ToString() : alarm.DisplayName.ToString());
  383. subNode.SetAttribute("Id", alarm.Id.ToString());
  384. subNode.SetAttribute("Source", alarm.Source.ToString());
  385. subNode.SetAttribute("Description", alarm.Description.ToString());
  386. subNode.SetAttribute("Solution", alarm.Solution.ToString());
  387. subNode.SetAttribute("Explaination", alarm.Explaination.ToString());
  388. subNode.SetAttribute("Action", alarm.Action.ToString());
  389. subNode.SetAttribute("Bypass", alarm.Bypass.ToString());
  390. subNode.SetAttribute("Group", alarm.Group.ToString());
  391. subNode.SetAttribute("AutoRecovery", alarm.AutoRecovery.ToString());
  392. subNode.SetAttribute("Level", alarm.Level.ToString());
  393. subNode.SetAttribute("Editable", alarm.Editable.ToString());
  394. subNode.SetAttribute("Type", alarm.Type.ToString());
  395. subNode.SetAttribute("Category", alarm.Category.ToString());
  396. categoryNodes.AppendChild(subNode);
  397. }
  398. }
  399. }
  400. xmldoc.Save(pathFile);
  401. }
  402. //生成AlarmEventDefine.xml
  403. public void Serialize()
  404. {
  405. var alid = new VIDGenerator("ALID", $"{PathManager.GetCfgDir().Replace("\\bin\\Debug", "")}VIDs\\_ALID.xml");
  406. alid.Initialize();
  407. alid.GenerateId(VidAlarmList);
  408. foreach (var dataItem in AlarmDic[CurrentAlarmTable].Values)
  409. {
  410. var item = alid.VIDList.SingleOrDefault(x => x.Name == dataItem.EventEnum);
  411. if (item != null)
  412. dataItem.Id = item.Index;
  413. }
  414. string defaultPathFile = $"{PathManager.GetCfgDir().Replace("\\bin\\Debug", "")}AlarmEventDefine.xml";
  415. Serialize(defaultPathFile, new List<string>() { _defaultAlarmTable });
  416. }
  417. private bool InvokeResetAlarm(string arg1, object[] arg2)
  418. {
  419. ClearAlarmEvent();
  420. if (arg2 != null && arg2.Length >= 2)
  421. {
  422. var item = AlarmDic[CurrentAlarmTable].Values.ToList().FirstOrDefault(x => x.Source == (string)arg2[0] && x.EventEnum == (string)arg2[1]) as AlarmEventItem;
  423. if (item != null)
  424. {
  425. item.Reset();
  426. }
  427. }
  428. return true;
  429. }
  430. public void Terminate()
  431. {
  432. if (_eventJob != null)
  433. {
  434. _eventJob.Stop();
  435. _eventJob = null;
  436. }
  437. if (_eventServiceHost != null)
  438. {
  439. _eventServiceHost.Close();
  440. _eventServiceHost = null;
  441. }
  442. }
  443. public void WriteEvent(string eventName)
  444. {
  445. if (!_eventDic.ContainsKey(eventName))
  446. {
  447. LOG.Write("Event name not registered, " + eventName);
  448. return;
  449. }
  450. WriteEvent(_eventDic[eventName].Source, eventName);
  451. }
  452. public void WriteEvent(string module, string eventName, string message)
  453. {
  454. if (!_eventDic.ContainsKey(eventName))
  455. {
  456. LOG.Write("Event name not registered, " + eventName);
  457. return;
  458. }
  459. EventItem item = _eventDic[eventName].Clone();
  460. item.Source = module;
  461. item.Description = message;
  462. item.OccuringTime = DateTime.Now;
  463. _eventQueue.Enqueue(item);
  464. if (item.Level == EventLevel.Alarm || item.Level == EventLevel.Warning)
  465. {
  466. lock (_locker)
  467. {
  468. if (_alarmList.Count == _alarmList.Capacity)
  469. _alarmList.RemoveAt(0);
  470. _alarmList.Add(item);
  471. }
  472. if (OnAlarmEvent != null)
  473. OnAlarmEvent(item);
  474. }
  475. if (OnEvent != null)
  476. {
  477. OnEvent(item);
  478. }
  479. _writerToLog.WriteEvent(item);
  480. //WriteEvent(eventName);
  481. }
  482. public void WriteEvent(string eventName, SerializableDictionary<string, string> dvid)
  483. {
  484. if (!_eventDic.ContainsKey(eventName))
  485. {
  486. LOG.Write("Event name not registered, " + eventName);
  487. return;
  488. }
  489. WriteEvent(_eventDic[eventName].Source, eventName, dvid);
  490. }
  491. public void WriteEvent(string eventName, SerializableDictionary<string, object> dvid)
  492. {
  493. if (!_eventDic.ContainsKey(eventName))
  494. {
  495. LOG.Error("Event name not registered, " + eventName);
  496. return;
  497. }
  498. EventItem item = _eventDic[eventName].Clone(dvid);
  499. item.OccuringTime = DateTime.Now;
  500. ProceedReceivedEvent(item);
  501. }
  502. public void WriteEvent(string module, string eventName, params object[] args)
  503. {
  504. EventItem item = _eventDic[eventName].Clone();
  505. item.Source = module;
  506. if (_eventDic[eventName].Description == null)
  507. {
  508. return;
  509. }
  510. item.Description = string.Format(_eventDic[eventName].Description, args);
  511. if (!string.IsNullOrEmpty(_eventDic[eventName].GlobalDescription_en))
  512. item.GlobalDescription_en = string.Format(_eventDic[eventName].GlobalDescription_en, args);
  513. if (!string.IsNullOrEmpty(_eventDic[eventName].GlobalDescription_zh))
  514. item.GlobalDescription_zh = string.Format(_eventDic[eventName].GlobalDescription_zh, args);
  515. item.OccuringTime = DateTime.Now;
  516. _eventQueue.Enqueue(item);
  517. if (item.Level == EventLevel.Alarm || item.Level == EventLevel.Warning)
  518. {
  519. lock (_locker)
  520. {
  521. if (_alarmList.Count == _alarmList.Capacity)
  522. _alarmList.RemoveAt(0);
  523. _alarmList.Add(item);
  524. }
  525. if (OnAlarmEvent != null)
  526. OnAlarmEvent(item);
  527. }
  528. if (OnEvent != null)
  529. {
  530. OnEvent(item);
  531. }
  532. _writerToLog.WriteEvent(item);
  533. }
  534. public void WriteEvent(string module, string eventName, SerializableDictionary<string, string> dvid, params object[] args)
  535. {
  536. EventItem item = _eventDic[eventName].Clone();
  537. item.Source = module;
  538. item.Description = string.Format(_eventDic[eventName].Description, args);
  539. if (!string.IsNullOrEmpty(_eventDic[eventName].GlobalDescription_en))
  540. item.GlobalDescription_en = string.Format(_eventDic[eventName].GlobalDescription_en, args);
  541. if (!string.IsNullOrEmpty(_eventDic[eventName].GlobalDescription_zh))
  542. item.GlobalDescription_zh = string.Format(_eventDic[eventName].GlobalDescription_zh, args);
  543. item.OccuringTime = DateTime.Now;
  544. item.DVID = dvid;
  545. _eventQueue.Enqueue(item);
  546. if (item.Level == EventLevel.Alarm || item.Level == EventLevel.Warning)
  547. {
  548. lock (_locker)
  549. {
  550. if (_alarmList.Count == _alarmList.Capacity)
  551. _alarmList.RemoveAt(0);
  552. _alarmList.Add(item);
  553. }
  554. if (OnAlarmEvent != null)
  555. OnAlarmEvent(item);
  556. }
  557. if (OnEvent != null)
  558. {
  559. OnEvent(item);
  560. }
  561. _writerToLog.WriteEvent(item);
  562. }
  563. private void ProceedReceivedEvent(EventItem item)
  564. {
  565. _eventQueue.Enqueue(item);
  566. if (item.Level == EventLevel.Alarm || item.Level == EventLevel.Warning)
  567. {
  568. lock (_locker)
  569. {
  570. if (_alarmList.Count == _alarmList.Capacity)
  571. _alarmList.RemoveAt(0);
  572. _alarmList.Add(item);
  573. }
  574. if (OnAlarmEvent != null)
  575. OnAlarmEvent(item);
  576. }
  577. if (OnEvent != null)
  578. {
  579. OnEvent(item);
  580. }
  581. _writerToLog.WriteEvent(item);
  582. }
  583. public void PostNotificationMessage(string message)
  584. {
  585. var eventItem = new EventItem()
  586. {
  587. Type = EventType.UIMessage_Notify,
  588. Description = message,
  589. OccuringTime = DateTime.Now,
  590. };
  591. _eventQueue.Enqueue(eventItem);
  592. _writerToLog.WriteEvent(eventItem);
  593. }
  594. public void PostPopDialogMessage(EventLevel level, string title, string message)
  595. {
  596. var eventItem = new EventItem()
  597. {
  598. Type = EventType.Dialog_Nofity,
  599. Description = title,
  600. Explaination = message,
  601. OccuringTime = DateTime.Now,
  602. Level = level,
  603. };
  604. _eventQueue.Enqueue(eventItem);
  605. _writerToLog.WriteEvent(eventItem);
  606. }
  607. public void PostKickoutMessage(string message)
  608. {
  609. var eventItem = new EventItem()
  610. {
  611. Type = EventType.KickOut_Notify,
  612. Description = message,
  613. OccuringTime = DateTime.Now,
  614. Level = EventLevel.Information
  615. };
  616. _eventQueue.Enqueue(eventItem);
  617. _writerToLog.WriteEvent(eventItem);
  618. }
  619. public void PostSoundMessage(string message)
  620. {
  621. var eventItem = new EventItem()
  622. {
  623. Type = EventType.Sound_Notify,
  624. Description = message,
  625. OccuringTime = DateTime.Now,
  626. };
  627. _eventQueue.Enqueue(eventItem);
  628. _writerToLog.WriteEvent(eventItem);
  629. }
  630. bool PeriodicRun()
  631. {
  632. EventItem ev;
  633. while (_eventQueue.TryDequeue(out ev))
  634. {
  635. try
  636. {
  637. if (_eventDB != null)
  638. _eventDB.WriteEvent(ev);
  639. //_writerToLog.WriteEvent(ev);
  640. if (_writerToMail != null)
  641. _writerToMail.WriteEvent(ev);
  642. if (_eventService != null)
  643. _eventService.FireEvent(ev);
  644. if (FireEvent != null)
  645. FireEvent(ev);
  646. }
  647. catch (Exception ex)
  648. {
  649. LOG.Error("Failed to post event", ex);
  650. }
  651. }
  652. return true;
  653. }
  654. public List<EventItem> GetAlarmEvent()
  655. {
  656. return _alarmList.ToList();
  657. }
  658. public void ClearAlarmEvent()
  659. {
  660. _alarmList.Clear();
  661. }
  662. public List<EventItem> QueryDBEvent(string sql)
  663. {
  664. return _eventDB.QueryDBEvent(sql);
  665. }
  666. public void Subscribe(EventItem item)
  667. {
  668. if (_eventDic.ContainsKey(item.EventEnum))
  669. {
  670. return;
  671. }
  672. _eventDic[item.EventEnum] = item;
  673. if (item is AlarmEventItem && AlarmDic.ContainsKey(_defaultAlarmTable) && !AlarmDic[_defaultAlarmTable].ContainsKey(item.EventEnum))
  674. {
  675. AlarmDic[_defaultAlarmTable][item.EventEnum] = item;
  676. }
  677. }
  678. public void PostInfoLog(string module, string message)
  679. {
  680. WriteEvent(module, INFORMATION_EVENT, message);
  681. }
  682. public void PostWarningLog(string module, string message)
  683. {
  684. WriteEvent(module, WARNING_EVENT, message);
  685. }
  686. public void PostAlarmLog(string module, string message)
  687. {
  688. WriteEvent(module, ALARM_EVENT, message);
  689. }
  690. //只有通过AlarmEventDefine.xml定义的warning,alarm可以通过此方法抛出
  691. public void PostAlarmDefineLog(string module, string name, string additionalDescription)
  692. {
  693. if (!AlarmDic[_defaultAlarmTable].ContainsKey(name))
  694. {
  695. LOG.Write("Event name not registered, " + name);
  696. return;
  697. }
  698. var newItem = AlarmDic[_defaultAlarmTable][name].Clone();
  699. if (!string.IsNullOrEmpty(additionalDescription))
  700. newItem.Description += $" {additionalDescription}";
  701. newItem.OccuringTime = DateTime.Now;
  702. newItem.Source = module;
  703. if (newItem.Bypass)
  704. LOG.Write("Bypass event: " + name);
  705. else
  706. ProceedReceivedEvent(newItem);
  707. }
  708. public void ClearAlarmEvent(string name)
  709. {
  710. var alarm = _alarmList.ToList().FirstOrDefault(x => x.EventEnum == name);
  711. if (alarm != null)
  712. {
  713. lock (_locker)
  714. {
  715. _alarmList.Remove(alarm);
  716. }
  717. }
  718. }
  719. }
  720. }