EventManager.cs 35 KB

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