using Aitex.Core.RT.DBCore; using Aitex.Core.RT.Event; using Aitex.Core.RT.Log; using Aitex.Core.Util; using MECF.Framework.Common.Account.Extends; using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using System.Xml.Linq; using System.Xml; using SciChart.Charting.Visuals.TradeChart.MultiPane; using Aitex.Core.RT.DataCenter; using DocumentFormat.OpenXml.Office2010.Excel; using SciChart.Core.Extensions; namespace MECF.Framework.Common.Aitex.Core.RT.EMS { public class MaintainerEditor2 : XmlLoader { #region Variables /// /// 维护项列表 /// private List _allmaintainerlist = new(); private List _maintainanceitemconfiglist = new(); Func _isSubscriptionAttribute; Func _hasSubscriptionAttribute; #endregion public MaintainerEditor2(string fileName) : base(fileName) { _isSubscriptionAttribute = attribute => attribute is SubscriptionAttribute; _hasSubscriptionAttribute = mi => mi.GetCustomAttributes(false).Any(_isSubscriptionAttribute); } #region Methods protected override void AnalyzeXml() { if (XmlDoc == null) { return; } #region 获取PlanMaintainance var maintainersX = from r in XmlDoc.Descendants("Maintainer") select (r); foreach (var maintainerX in maintainersX) { string maintainertype = maintainerX.Attribute("Type")?.Value??""; string maintainername = maintainerX.Attribute("Name")?.Value; string maintainerdescription = maintainerX.Attribute("Description")?.Value ?? ""; string maintainermodule = maintainerX.Attribute("Module")?.Value ?? ""; string maintainerindexstring = maintainerX.Attribute("Index")?.Value ?? ""; string maintainerenablestring = maintainerX.Attribute("Enable")?.Value ?? "True"; string maintainerstartdatestring = maintainerX.Attribute("StartDate")?.Value; string maintainerthresholdstring = maintainerX.Attribute("Threshold")?.Value; string maintainertimedisplayunitstring = maintainerX.Attribute("TimeDisplayUnit")?.Value; int maintainerindex = 0; bool maintainerenable = false; DateTime maintainerstartdate = DateTime.Now; double maintainerthreshold = 100; TimeUnit maintainertimedisplayunit = TimeUnit.Hours; if (string.IsNullOrEmpty(maintainertype) || string.IsNullOrEmpty(maintainername) || string.IsNullOrEmpty(maintainerstartdatestring) || string.IsNullOrEmpty(maintainerthresholdstring)) { EV.PostWarningLog("Maintainance", "XML failed:Plan Parameter Missing"); continue; } if (!bool.TryParse(maintainerenablestring, out maintainerenable)) { EV.PostWarningLog("Maintainance", $"XML failed:Plan {maintainername} Parameter (enable) Parse failed;"); //log.error } if (!DateTime.TryParse(maintainerstartdatestring, out maintainerstartdate)) { EV.PostWarningLog("Maintainance", $"XML failed:Plan {maintainername} Parameter (startdate) Parse failed;"); //log.error } if (!double.TryParse(maintainerthresholdstring, out maintainerthreshold)) { EV.PostWarningLog("Maintainance", $"XML failed:Plan {maintainername} Parameter (threshold) Parse failed;"); //log.error } if (!Enum.TryParse(maintainertimedisplayunitstring, out maintainertimedisplayunit)) { EV.PostWarningLog("Maintainance", $"XML failed:Plan {maintainername} Parameter (timedisplayunit) Parse failed;"); //log.error } if (!int.TryParse(maintainerindexstring, out maintainerindex)) { EV.PostWarningLog("Maintainance", $"XML failed:Plan {maintainername} Parameter (Index) Parse failed;"); //log.error } //二级子项列表 var maintainerparentsX = from r in maintainerX.Descendants("MaintainerParent") select (r); MaintainerItemCollection collection = new MaintainerItemCollection(); foreach (var parentX in maintainerparentsX) { string parentname = parentX.Attribute("Name")?.Value; if (string.IsNullOrEmpty(parentname)) { EV.PostWarningLog("Maintainance", $"XML failed:Plan {maintainername}:Parameter (MaintainerParent) Name Missing"); //log.error continue; } var itemsX = from r in parentX.Descendants("MaintainerItem") select (r); var items = new List(); foreach (var itemX in itemsX) { string itemname = itemX.Attribute("Name")?.Value; string itemidstring = itemX.Attribute("Id")?.Value ?? ""; string itemenablestring = itemX.Attribute("Enable")?.Value ?? ""; string itemdatetimestring = itemX.Attribute("MaintainedDateLatest")?.Value ?? "2000-1-1 0:0:0"; bool enable2 = false; int id2 = 0; DateTime date2 = new DateTime(2000, 1, 1); if (string.IsNullOrEmpty(itemname) || string.IsNullOrEmpty(itemidstring)) { EV.PostWarningLog("Maintainance", $"XML failed:Plan {maintainername}:MaintainSubItem Parameter Missing"); //log.error continue; } if (!int.TryParse(itemidstring, out id2)) { EV.PostWarningLog("Maintainance", $"XML failed:Plan {maintainername}:MaintainSubItem {itemname} Parameter (Id) Parse failed;"); //log.error continue; } if (!bool.TryParse(itemenablestring, out enable2)) { EV.PostWarningLog("Maintainance", $"XML failed:Plan {maintainername}:MaintainSubItem {itemname} Parameter (enable) Parse failed;"); //log.error } DateTime.TryParse(itemdatetimestring, out date2); MaintainerItem mi = new MaintainerItem(itemname, id2, enable2, date2); items.Add(mi); } collection.AddMaintainerItemList(parentname, items); } if (maintainertype == "Plan") { PlanMaintainer pm = new PlanMaintainer(collection, maintainername, maintainermodule, maintainerindex, maintainerdescription, maintainerenable, maintainerstartdate, maintainerthreshold, maintainertimedisplayunit); pm.OnSave += SaveXml; _allmaintainerlist.Add(pm); } else if (maintainertype == "Process") { PMMaintainer pm = new PMMaintainer(collection, maintainername, maintainermodule, maintainerindex, maintainerdescription, maintainerenable, maintainerstartdate, maintainerthreshold, maintainertimedisplayunit); pm.OnSave += SaveXml; if (pm.Module == "PM1" || pm.Module == "PM2") { pm.GetProcessing = new Func(() =>{ var r = DATA.Poll(pm.Module+".IsProcessing"); if (r != null) { return (bool)r; } return false; } ); } _allmaintainerlist.Add(pm); } else if (maintainertype == "Thickness") { PMThicknessMaintainer pm = new PMThicknessMaintainer(collection, maintainername, maintainermodule, maintainerindex, maintainerdescription, maintainerenable, maintainerstartdate, maintainerthreshold, maintainertimedisplayunit); pm.OnSave += SaveXml; if (pm.Module == "PM1" || pm.Module == "PM2") { pm.GetProcessing = new Func(() => { var r = DATA.Poll(pm.Module + ".IsProcessing"); if (r != null) { return (bool)r; } return false; } ); } _allmaintainerlist.Add(pm); } } #endregion #region 获取MaintainanceItem配置 var ConfigX = XmlDoc.Element("root")?.Element("AllMaintainItemConfigs"); if (ConfigX == null) { return; } var maintainnamceItemsconfigX = from r in ConfigX.Descendants("MaintainItems") select (r); foreach (var itemX in maintainnamceItemsconfigX) { string itemname = itemX.Attribute("Name")?.Value; string description = itemX.Attribute("Description")?.Value ?? ""; string itemindexstring = itemX.Attribute("Index")?.Value ?? ""; int itemindex = 0; if (!int.TryParse(itemindexstring, out itemindex)) { EV.PostWarningLog("Maintainance", $"XML failed:MaintainConfigItem Parameter Parse Failed;"); continue; } if (string.IsNullOrEmpty(itemname)) { EV.PostWarningLog("Maintainance", $"XML failed:MaintainConfigItem Parameter Missing"); //log.error continue; } var subitemsX = from r in itemX.Descendants("MaintainItem") select (r); var subitems = new List(); foreach (var subitemX in subitemsX) { string itemname2 = subitemX.Attribute("Name")?.Value; string idstring2 = subitemX.Attribute("Id")?.Value; string indexstring2 = subitemX.Attribute("Index")?.Value; string description2 = subitemX.Attribute("Description")?.Value ?? ""; string defaultrecord2 = subitemX.Attribute("DefaultRecord")?.Value ?? ""; string filepath2 = subitemX.Attribute("FilePath")?.Value ?? ""; int index2 = 0; int id2 = 0; if (string.IsNullOrEmpty(itemname2) || string.IsNullOrEmpty(indexstring2)) { EV.PostWarningLog("Maintainance", $"XML failed:MaintainConfigSubItem Parameter Missing"); //log.error continue; } if (!int.TryParse(idstring2, out id2)) { EV.PostWarningLog("Maintainance", $"XML failed:MaintainConfigSubItem({itemname2}) Parameter (id) Parse failed;"); //log.error continue; } if (!int.TryParse(indexstring2, out index2)) { EV.PostWarningLog("Maintainance", $"XML failed:MaintainConfigSubItem({itemname2}) Parameter (Index) Parse failed;"); //log.error } MaintainanceItem mi2 = new MaintainanceItem(itemname2,id2, index2, description2, defaultrecord2, false, new DateTime(2000, 1, 1), null, filepath2); if (subitems.FindIndex(m => m.Name == itemname2 && m.Index == index2) == -1) //唯一性 subitems.Add(mi2); } MaintainanceItem mi = new MaintainanceItem(itemname, 0 ,itemindex, description, "", false, new DateTime(2000, 1, 1), subitems, ""); _maintainanceitemconfiglist.Add(mi); } #endregion #region 检查后保存配置 SaveXml(); #endregion } protected bool SaveXml() { if (XmlDoc == null) { return false; } try { XmlDocument doc = new XmlDocument(); doc.LoadXml(""); var root = doc.SelectSingleNode("root") as XmlElement; #region 保存_maintainancelist var groups = root.GetElementsByTagName("MaintainanceGroup")[0]; foreach (var maintainer in _allmaintainerlist.OrderBy(i=>i.Index)) { var xmlElement2 = doc.CreateElement("Maintainer"); //一级列表 if (maintainer is PlanMaintainer) { xmlElement2.SetAttribute("Type", "Plan"); } else if (maintainer is PMMaintainer) { xmlElement2.SetAttribute("Type", "Process"); } else if (maintainer is PMThicknessMaintainer) { xmlElement2.SetAttribute("Type", "Thickness"); } xmlElement2.SetAttribute("Name", maintainer.Name); xmlElement2.SetAttribute("Description", maintainer.Description); xmlElement2.SetAttribute("Index", maintainer.Index.ToString()); if (!string.IsNullOrEmpty(maintainer.Module)) { xmlElement2.SetAttribute("Module", maintainer.Module); } xmlElement2.SetAttribute("Enable", maintainer.Enable.ToString()); xmlElement2.SetAttribute("StartDate", maintainer.StartDate.ToString()); xmlElement2.SetAttribute("Threshold", maintainer.Threshold.ToString()); xmlElement2.SetAttribute("TimeDisplayUnit", maintainer.TimeDisplayUnit.ToString()); var dic = maintainer.GetAllMaintainerItemsDic(); foreach (var parentkv in dic) { var xmlElement3 = doc.CreateElement("MaintainerParent"); //二级列表 xmlElement3.SetAttribute("Name", parentkv.Key); var list2 = parentkv.Value; if (list2 != null && list2.Count != 0) { foreach (var item2 in list2) { var xmlElement4 = doc.CreateElement("MaintainerItem"); //三级列表 xmlElement4.SetAttribute("Name", item2.Name); xmlElement4.SetAttribute("Id", item2.Id.ToString()); xmlElement4.SetAttribute("MaintainedDateLatest", item2.MaintainedDate.ToString()); xmlElement4.SetAttribute("Enable", item2.Enable.ToString()); xmlElement3.AppendChild(xmlElement4); } } xmlElement2.AppendChild(xmlElement3); } groups.AppendChild(xmlElement2); } #endregion #region 保存_maintainanceitemconfiglist var configgroups = root.GetElementsByTagName("AllMaintainItemConfigs")[0]; foreach (var item in _maintainanceitemconfiglist.OrderBy(i=>i.Index)) { var xmlElement = doc.CreateElement("MaintainItems"); //一级列表 xmlElement.SetAttribute("Name", item.Name); xmlElement.SetAttribute("Description", item.Description); xmlElement.SetAttribute("Index", item.Index.ToString()); var list2 = item.GetAllMaintainanceItems(); if (list2 != null && list2.Count != 0) { foreach (var item2 in list2.OrderBy(i=>i.Index)) { var xmlElement2 = doc.CreateElement("MaintainItem"); //二级列表 xmlElement2.SetAttribute("Name", item2.Name); xmlElement2.SetAttribute("Id", item2.Id.ToString()); xmlElement2.SetAttribute("Index", item2.Index.ToString()); xmlElement2.SetAttribute("Description", item2.Description); xmlElement2.SetAttribute("DefaultRecord", item2.DefaultRecord); xmlElement2.SetAttribute("FilePath", item2.FilePath); xmlElement.AppendChild(xmlElement2); } } configgroups.AppendChild(xmlElement); } #endregion doc.Save(FileName); XmlDoc = XDocument.Load(FileName); } catch (Exception ex) { LOG.Write(ex); return false; } return true; } public List GetAllMaintainerList() { return _allmaintainerlist; } public List GetMaintainanceItemConfigList() { return _maintainanceitemconfiglist; } public bool SetMaintain(string type,string name, string module, string parent, string itemname, int itemindex, DateTime date, string role, string detial) { Type t = typeof(PlanMaintainer); if (type == "Plan") t = typeof(PlanMaintainer); else if (type == "Process") t = typeof(PMMaintainer); else if (type == "Thickness") t = typeof(PMThicknessMaintainer); int index = _allmaintainerlist.FindIndex(i => i.GetType() == t && i.Name == name && i.Module == module); if (index == -1) return false; if(_allmaintainerlist[index].SetMaintain(parent,itemname,itemindex,date)) { string s = name + (module == "" ? "" : ("." + module)); EV.PostInfoLog("Maintainance", $"Item {parent}-{itemname}({itemindex}) in Plan {s} is Maintained"); #region DATABASE string cmd = string.Format("Insert into \"maintainance_event_data\"" + "(\"planname\",\"planmodule\",\"itemparentname\",\"itemname\",\"index\",\"createtime\",\"role\",\"detial\")" + " values('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}')", name, module, parent, itemname, itemindex.ToString(), date.ToString("yyyy/MM/dd HH:mm:ss.fff"), role, detial); int result = DB.ExecuteNonQuery(cmd); if (result <= 0) { EV.PostWarningLog("Maintainance", $"database execution failed"); } #endregion return SaveXml(); } else return false; } #region 维护项增删改 private void ItemIndexReset(List list) { int i = 0; foreach (var item in list.OrderBy(j=>j.Index)) { item.Index = i++; } } public bool SetMaintainItemUp(string parentname, string itemname, int itemid) { int index = _maintainanceitemconfiglist.FindIndex(i => i.Name == parentname); if (index == -1) return false; var list2 = _maintainanceitemconfiglist[index].GetAllMaintainanceItems(); var item = list2.Find(i => i.Name == itemname && i.Id == itemid); if (item == null || item.Index == 0) return false; var item2 = list2.Find(i => i.Index == item.Index - 1); if (item2 == null) return false; item.Index = item.Index - 1; item2.Index = item2.Index + 1; ItemIndexReset(list2); return SaveXml(); } public bool SetMaintainItemDown(string parentname, string itemname, int itemid) { int index = _maintainanceitemconfiglist.FindIndex(i => i.Name == parentname); if (index == -1) return false; var list2 = _maintainanceitemconfiglist[index].GetAllMaintainanceItems(); var item = list2.Find(i => i.Name == itemname && i.Id == itemid); if (item == null || item.Index == list2.Count - 1) return false; var item2 = list2.Find(i => i.Index == item.Index + 1); if (item2 == null) return false; item.Index = item.Index + 1; item2.Index = item2.Index - 1; ItemIndexReset(list2); return SaveXml(); } /// /// 二级维护项enable设置,根据名称和id确认唯一性 /// /// /// /// /// /// /// /// public bool SetMaintainItemEnable(string type,string name, string module, string parentname, string itemname, int itemid, bool enable) { Type t = typeof(PlanMaintainer); if (type == "Plan") t = typeof(PlanMaintainer); else if (type == "Process") t = typeof(PMMaintainer); else if (type == "Thickness") t = typeof(PMThicknessMaintainer); int index = _allmaintainerlist.FindIndex(i => i.GetType() == t && i.Name == name && i.Module == module); if (index == -1) return false; if (!_allmaintainerlist[index].SetMaintainerItemEnable(parentname, itemname, itemid, enable)) { return false; } string s = name + (module == "" ? "" : ("." + module)); string result = enable ? "Enable" : "Disable"; EV.PostInfoLog("Maintainance", $"Item {parentname}-{itemname}({itemid}) in Plan {s} is {result}"); return SaveXml(); } /// /// 修改Item名称 /// /// /// /// /// /// /// public bool SetMaintainItemName(string parentname, string oldname, int olditemid, string newname, int newitemid) { int index = _maintainanceitemconfiglist.FindIndex(i => i.Name == parentname); if (index == -1) return false; var list2 = _maintainanceitemconfiglist[index].GetAllMaintainanceItems(); int index2 = list2.FindIndex(i => i.Name == oldname && i.Id == olditemid); if (index2 == -1) return false; list2[index2].Name = newname; list2[index2].Id = newitemid; _allmaintainerlist.ForEach(i => { var dic = i.GetAllMaintainerItemsDic(); if (dic.ContainsKey(parentname)) { var item = dic[parentname].Find(j => j.Name == oldname && j.Id == olditemid); item.Name = newname; item.Id = newitemid; } }); MaintainItemReSubscribe(parentname, oldname, olditemid, newname, newitemid); EV.PostInfoLog("Maintainance", $"Item {parentname}-{oldname}({olditemid}) is changed to {parentname}-{newname}({newitemid})"); return SaveXml(); } /// /// 修改Item参数 /// /// /// /// /// /// /// /// public bool SetMaintainItemParas(string parentname, string name, int itemid, string description, string defaultrecord, string filepath) { int index = _maintainanceitemconfiglist.FindIndex(i => i.Name == parentname); if (index == -1) return false; var list2 = _maintainanceitemconfiglist[index].GetAllMaintainanceItems(); int index2 = list2.FindIndex(i => i.Name == name && i.Id == itemid); if (index2 == -1) return false; list2[index2].Description = description; list2[index2].DefaultRecord = defaultrecord; list2[index2].FilePath = filepath; EV.PostInfoLog("Maintainance", $"Item {parentname}-{name}({itemid}) Parameters is changed "); return SaveXml(); } /// /// 新增Item /// /// /// /// /// /// /// /// /// /// public bool AddMaintainItem(string parentname ,int parentindex,string name, int itemid, int itemindex, string description, string defaultrecord, string filepath) { MaintainanceItem newsubitem = new MaintainanceItem(name, itemid, itemindex, description, defaultrecord, false, new DateTime(2000, 1, 1), null, filepath); int index = _maintainanceitemconfiglist.FindIndex(i => i.Name == parentname); if (index == -1)//parentname不存在 { MaintainanceItem newitem = new MaintainanceItem(parentname, 0, parentindex, parentname, "", false, new DateTime(2000, 1, 1), new List(), ""); newitem.Add(newsubitem); _maintainanceitemconfiglist.Add(newitem); } else { if (_maintainanceitemconfiglist[index].GetAllMaintainanceItems().FindIndex(i => i.Name == name && i.Id == itemid) != -1) { return false;//id重复 } _maintainanceitemconfiglist[index].Add(newsubitem); } _allmaintainerlist.ForEach(i => { MaintainerItem mi = new MaintainerItem(name,itemid, false, new DateTime(2000, 1, 1)); i.AddMaintainerItem(parentname, mi); string key1 = i.GetType().Name +"." + i.Name + (i.Module == "" ? "" : ("." + i.Module)) + "." + parentname + "." + name + "." + itemid; Parallel.ForEach(mi.GetType().GetProperties().Where(_hasSubscriptionAttribute), property => { SubscriptionAttribute subscription = Attribute.GetCustomAttributes(property).First(_isSubscriptionAttribute) as SubscriptionAttribute; string key2 = subscription.Key; string key = key1 + "." + key2; //object test = property.GetValue(item); DATA.Subscribe(key, () => property.GetValue(mi), SubscriptionAttribute.FLAG.IgnoreSaveDB); }); }); EV.PostInfoLog("Maintainance", $"New Maintainance Item {parentname}-{name}({itemid}) created."); return SaveXml(); } /// /// 删除Item /// /// /// /// /// public bool DeleteMaintainItem(string parentname, string itemname, int itemid) { foreach (IObserver ma in _allmaintainerlist) { ma.RemoveMaintainerItem(parentname, itemname, itemid); MaintainanceItemCancelSubscribe(ma, parentname, itemname, itemid); } MaintainanceItem temp = null; foreach (var item in _maintainanceitemconfiglist) { if (item.Name == parentname) { var list = item.GetAllMaintainanceItems(); int index = list.FindIndex(i => i.Name == itemname && i.Id == itemid); if (index == -1) continue; list.RemoveAt(index); if (list.Count == 0) temp = item; break; } } if (temp !=null) { _maintainanceitemconfiglist.Remove(temp); var list = _maintainanceitemconfiglist.OrderBy(i=>i.Index); int _i = 0; foreach (var item in list) { item.Index = _i++; } } else { var i = _maintainanceitemconfiglist.Find(j => j.Name == parentname); if (i != null) { var j = i.GetAllMaintainanceItems().OrderBy(k => k.Index); int _i = 0; foreach (var item in j) { item.Index = _i++; } } } EV.PostInfoLog("Maintainance", $"Maintainance Item {parentname}-{itemname}({itemid}) deleted."); return SaveXml(); } #endregion #region Plan增删改 public bool SetMaintainerModule(string type,string name, string oldmodule, string newmodule) { Type t = typeof(PlanMaintainer); if (type == "Plan") t = typeof(PlanMaintainer); else if (type == "Process") t = typeof(PMMaintainer); else if (type == "Thickness") t = typeof(PMThicknessMaintainer); int index = _allmaintainerlist.FindIndex(i =>i.GetType() == t && i.Name == name && i.Module == oldmodule); if (index == -1) return false; _allmaintainerlist[index].Module = newmodule; //Data需要重新注册 MaintainerReSubscribe(oldmodule, _allmaintainerlist[index]); string s = name + (oldmodule == "" ? "" : ("." + oldmodule)); string s1 = name + (newmodule == "" ? "" : ("." + newmodule)); EV.PostInfoLog("Maintainance", $"Maintainer {s} is changed to {s1}"); return SaveXml(); } public bool SetMaintainerParas(string type,string name, string module,int _index, bool enable, string description, DateTime date, double threshold, TimeUnit timeunit) { Type t = typeof(PlanMaintainer); if (type == "Plan") t = typeof(PlanMaintainer); else if (type == "Process") t = typeof(PMMaintainer); else if (type == "Thickness") t = typeof(PMThicknessMaintainer); int index = _allmaintainerlist.FindIndex(i => i.GetType() == t && i.Name == name && i.Module == module); if (index == -1) return false; _allmaintainerlist[index].Description = description; _allmaintainerlist[index].Enable = enable; _allmaintainerlist[index].Index = _index; _allmaintainerlist[index].TimeDisplayUnit = timeunit; if (_allmaintainerlist[index].Threshold != threshold) { _allmaintainerlist[index].SetThreshold(threshold); } if (_allmaintainerlist[index].StartDate != date) { _allmaintainerlist[index].SetStartDate(date); } EV.PostInfoLog("Maintainance", $"Maintainer {name}-{module} Parameters is changed "); return SaveXml(); } public bool AddMaintainer(string type,string name, string module, bool enable, string description, DateTime date, double threshold, TimeUnit calunit) { //ui 调用此函数前已判断重复性 var mc = new MaintainerItemCollection(); _maintainanceitemconfiglist.ForEach(i => { var list = new List(); foreach (var i2 in i.GetAllMaintainanceItems()) { list.Add(new MaintainerItem(i2.Name,i2.Id,false,new DateTime(2000,1,1))); } mc.AddMaintainerItemList(i.Name,list); }); var index = 0; if (type == "Plan") { var plan = new PlanMaintainer(mc, name, module, index, description, enable, date, threshold, calunit); DataSubscribe(plan); _allmaintainerlist.Add(plan); } else if(type == "Process") { var pm = new PMMaintainer(mc, name, module, index, description, enable, date, threshold, calunit); DataSubscribe(pm); _allmaintainerlist.Add(pm); } else if (type == "Thickness") { var pm = new PMThicknessMaintainer(mc, name, module, index, description, enable, date, threshold, calunit); DataSubscribe(pm); _allmaintainerlist.Add(pm); } string s = name + (module == "" ? "" : ("." + module)); EV.PostInfoLog("Maintainance", $"Plan {s} created"); return SaveXml(); } public bool DeleteMaintainer(string type,string name, string module) { Type t = typeof(PlanMaintainer); if (type == "Plan") t = typeof(PlanMaintainer); else if (type == "Process") t = typeof(PMMaintainer); else if (type == "Thickness") t = typeof(PMThicknessMaintainer); int index = _allmaintainerlist.FindIndex(i => i.GetType() == t && i.Name == name && i.Module == module); if (index == -1) return false; PlanCancelSubscribe(_allmaintainerlist[index]); if (_allmaintainerlist.Remove(_allmaintainerlist[index])) { string s = name + (module == "" ? "" : ("." + module)); EV.PostInfoLog("Maintainance", $"Plan {s} Delete"); return SaveXml(); } else return false; } #endregion #region DataSubscribe /// /// data注册只使用一次,不要重复注册,类里面有重复注册异常 /// public void DataSubscribe() { foreach (var item in _allmaintainerlist) { DataSubscribe(item); } } public void DataSubscribe(IObserver item) { string key1 = item.GetType().Name + "." + item.Name + (item.Module == "" ? "" : ("." + item.Module)); Parallel.ForEach(item.GetType().GetProperties().Where(_hasSubscriptionAttribute), property => { SubscriptionAttribute subscription = Attribute.GetCustomAttributes(property).First(_isSubscriptionAttribute) as SubscriptionAttribute; string key2 = subscription.Key; string key = key1 + "." + key2; //object test = property.GetValue(item); DATA.Subscribe(key, () => property.GetValue(item), SubscriptionAttribute.FLAG.IgnoreSaveDB); }); foreach (var i in item.GetAllMaintainerItemsDic()) { string key2 = i.Key; foreach (var i2 in i.Value) { string key3 = i2.Name + "." + i2.Id; Parallel.ForEach(i2.GetType().GetProperties().Where(_hasSubscriptionAttribute), property => { SubscriptionAttribute subscription = Attribute.GetCustomAttributes(property).First(_isSubscriptionAttribute) as SubscriptionAttribute; string key4 = subscription.Key; string key = key1 + "." + key2 + "." + key3 + "." + key4; //object test = property.GetValue(item); DATA.Subscribe(key, () => property.GetValue(i2), SubscriptionAttribute.FLAG.IgnoreSaveDB); }); } } } /// /// 删除Plan后取消订阅 /// /// private void PlanCancelSubscribe(IObserver item) { string key1 = item.GetType().Name + "." + item.Name + (item.Module == "" ? "" : ("." + item.Module)); Parallel.ForEach(item.GetType().GetProperties().Where(_hasSubscriptionAttribute), property => { SubscriptionAttribute subscription = Attribute.GetCustomAttributes(property).First(_isSubscriptionAttribute) as SubscriptionAttribute; string key2 = subscription.Key; string key = key1 + "." + key2; //object test = property.GetValue(item); DATA.CancelSubscribe(key); }); foreach (var i in item.GetAllMaintainerItemsDic()) { string key2 = i.Key; foreach (var i2 in i.Value) { string key3 = i2.Name + "." + i2.Id; Parallel.ForEach(i2.GetType().GetProperties().Where(_hasSubscriptionAttribute), property => { SubscriptionAttribute subscription = Attribute.GetCustomAttributes(property).First(_isSubscriptionAttribute) as SubscriptionAttribute; string key4 = subscription.Key; string key = key1 + "." + key2 + "." + key3 + "." + key4; DATA.CancelSubscribe(key); }); } } } /// /// 删除维护项后取消订阅 /// /// /// /// /// private void MaintainanceItemCancelSubscribe(IObserver item, string parentname, string name, int id) { string key1 = item.GetType().Name + "." + item.Name + (item.Module == "" ? "" : ("." + item.Module)); string key2 = parentname + "." + name + "." + id; Parallel.ForEach(typeof(MaintainerItem).GetProperties().Where(_hasSubscriptionAttribute), property => { SubscriptionAttribute subscription = Attribute.GetCustomAttributes(property).First(_isSubscriptionAttribute) as SubscriptionAttribute; string key3 = subscription.Key; string key = key1 + "." + key2 + "." + key3; DATA.CancelSubscribe(key); }); } /// /// 变更Plan模组名称需要重新订阅(取消后重新注册) /// /// /// private void MaintainerReSubscribe(string oldmodule, IObserver newitem) { string keyold = newitem.GetType().Name + "." + newitem.Name + (oldmodule == "" ? "" : ("." + oldmodule)); string keynew = newitem.GetType().Name + "." + newitem.Name + (newitem.Module == "" ? "" : ("." + newitem.Module)); Parallel.ForEach(newitem.GetType().GetProperties().Where(_hasSubscriptionAttribute), property => { SubscriptionAttribute subscription = Attribute.GetCustomAttributes(property).First(_isSubscriptionAttribute) as SubscriptionAttribute; string key2 = subscription.Key; string key_old = keyold + "." + key2; string key_new = keynew + "." + key2; //object test = property.GetValue(item); DATA.CancelSubscribe(key_old); DATA.Subscribe(key_new, () => property.GetValue(newitem), SubscriptionAttribute.FLAG.IgnoreSaveDB); }); foreach (var i in newitem.GetAllMaintainerItemsDic()) { string key2 = i.Key; foreach (var i2 in i.Value) { string key3 = i2.Name + "." + i2.Id; Parallel.ForEach(i2.GetType().GetProperties().Where(_hasSubscriptionAttribute), property => { SubscriptionAttribute subscription = Attribute.GetCustomAttributes(property).First(_isSubscriptionAttribute) as SubscriptionAttribute; string key4 = subscription.Key; string key_old = keyold + "." + key2 + "." + key3 + "." + key4; string key_new = keynew + "." + key2 + "." + key3 + "." + key4; DATA.CancelSubscribe(key_old); DATA.Subscribe(key_new, () => property.GetValue(i2), SubscriptionAttribute.FLAG.IgnoreSaveDB); }); } } } /// /// 变更维护项名称需要重新订阅(取消后重新注册) /// /// /// /// private void MaintainItemReSubscribe(string parentname, string oldname, int oldsubitemid, string newname, int newsubitemid) { foreach (var item in _allmaintainerlist) { string keyold = item.GetType().Name + "." + item.Name + (item.Module == "" ? "" : ("." + item.Module)) + "." + parentname + "." + oldname + "." + oldsubitemid; string keynew = item.GetType().Name + "." + item.Name + (item.Module == "" ? "" : ("." + item.Module)) + "." + parentname + "." + newname + "." + newsubitemid; var dic = item.GetAllMaintainerItemsDic(); if (dic.ContainsKey(parentname)) { var mi = dic[parentname].Find(i => i.Name == newname && i.Id == newsubitemid); Parallel.ForEach(mi.GetType().GetProperties().Where(_hasSubscriptionAttribute), property => { SubscriptionAttribute subscription = Attribute.GetCustomAttributes(property).First(_isSubscriptionAttribute) as SubscriptionAttribute; string key2 = subscription.Key; string key3 = keyold + key2; string key4 = keynew + key2; DATA.CancelSubscribe(key3); DATA.Subscribe(key4, () => property.GetValue(mi), SubscriptionAttribute.FLAG.IgnoreSaveDB); }); } } } #endregion #endregion } }