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

1055 lines
46 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;
}
});
MaintainItemReSubscribe(parentname, oldname, olditemid, newname, newitemid);
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);
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<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;
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
/// <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.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);
});
}
}
}
/// <summary>
/// 删除Plan后取消订阅
/// </summary>
/// <param name="item"></param>
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);
});
}
}
}
/// <summary>
/// 删除维护项后取消订阅
/// </summary>
/// <param name="item"></param>
/// <param name="parentname"></param>
/// <param name="name"></param>
/// <param name="id"></param>
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);
});
}
/// <summary>
/// 变更Plan模组名称需要重新订阅取消后重新注册
/// </summary>
/// <param name="oldmodule"></param>
/// <param name="newitem"></param>
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);
});
}
}
}
/// <summary>
/// 变更维护项名称需要重新订阅(取消后重新注册)
/// </summary>
/// <param name="parentname"></param>
/// <param name="oldname"></param>
/// <param name="newname"></param>
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
}
}