Sic.Framework-Nanjing-Baishi/MECF.Framework.Common/Aitex/Core/RT/EMS/MaintainerEditor2.cs

922 lines
38 KiB
C#
Raw Normal View History

2024-01-29 11:12:21 +08:00
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
/// <summary>
/// 维护项列表
/// </summary>
private List<IObserver> _allmaintainerlist = new();
private List<MaintainanceItem> _maintainanceitemconfiglist = new();
Func<object, bool> _isSubscriptionAttribute;
Func<PropertyInfo, bool> _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<MaintainerItem>();
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<bool>(() =>{
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<bool>(() => {
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<MaintainanceItem>();
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("<?xml version=\"1.0\" encoding=\"utf-8\"?><root><MaintainanceGroup></MaintainanceGroup><AllMaintainItemConfigs></AllMaintainItemConfigs></root>");
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<IObserver> GetAllMaintainerList()
{
return _allmaintainerlist;
}
public List<MaintainanceItem> 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<MaintainanceItem> 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();
}
/// <summary>
/// 二级维护项enable设置根据名称和id确认唯一性
/// </summary>
/// <param name="name"></param>
/// <param name="module"></param>
/// <param name="parentname"></param>
/// <param name="itemname"></param>
/// <param name="itemid"></param>
/// <param name="enable"></param>
/// <returns></returns>
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();
}
/// <summary>
/// 修改Item名称
/// </summary>
/// <param name="parentname"></param>
/// <param name="oldname"></param>
/// <param name="olditemid"></param>
/// <param name="newname"></param>
/// <param name="newitemid"></param>
/// <returns></returns>
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;
}
});
//重新进行注册
DATA.MaintainClearSubscribe();
DataSubscribe();
2024-01-29 11:12:21 +08:00
EV.PostInfoLog("Maintainance", $"Item {parentname}-{oldname}({olditemid}) is changed to {parentname}-{newname}({newitemid})");
return SaveXml();
}
/// <summary>
/// 修改Item参数
/// </summary>
/// <param name="parentname"></param>
/// <param name="name"></param>
/// <param name="itemid"></param>
/// <param name="description"></param>
/// <param name="defaultrecord"></param>
/// <param name="filepath"></param>
/// <returns></returns>
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();
}
/// <summary>
/// 新增Item
/// </summary>
/// <param name="parentname"></param>
/// <param name="parentindex"></param>
/// <param name="name"></param>
/// <param name="itemid"></param>
/// <param name="itemindex"></param>
/// <param name="description"></param>
/// <param name="defaultrecord"></param>
/// <param name="filepath"></param>
/// <returns></returns>
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<MaintainanceItem>(), "");
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();
}
/// <summary>
/// 删除Item
/// </summary>
/// <param name="parentname"></param>
/// <param name="itemname"></param>
/// <param name="itemid"></param>
/// <returns></returns>
public bool DeleteMaintainItem(string parentname, string itemname, int itemid)
{
foreach (IObserver ma in _allmaintainerlist)
{
ma.RemoveMaintainerItem(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++;
}
}
}
//重新进行注册
DATA.MaintainClearSubscribe();
DataSubscribe();
2024-01-29 11:12:21 +08:00
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.MaintainClearSubscribe();
DataSubscribe();
2024-01-29 11:12:21 +08:00
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<MaintainerItem>();
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;
//重新进行注册
DATA.MaintainClearSubscribe();
DataSubscribe();
2024-01-29 11:12:21 +08:00
if (_allmaintainerlist.Remove(_allmaintainerlist[index]))
{
string s = name + (module == "" ? "" : ("." + module));
EV.PostInfoLog("Maintainance", $"Plan {s} Delete");
return SaveXml();
}
else return false;
}
#endregion
#region DataSubscribe
/// <summary>
/// data注册只使用一次不要重复注册类里面有重复注册异常
/// </summary>
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.MaintainSubscribe(key, new DataItem<object>(() => property.GetValue(item)));
2024-01-29 11:12:21 +08:00
});
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.MaintainSubscribe(key, new DataItem<object>(() => property.GetValue(i2)));
2024-01-29 11:12:21 +08:00
});
}
}
}
#endregion
#endregion
}
}