1055 lines
46 KiB
C#
1055 lines
46 KiB
C#
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
|
||
}
|
||
}
|