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;
using static MECF.Framework.Common.Aitex.Core.RT.EMS.Maintainer;
using System.Windows.Forms;
using DocumentFormat.OpenXml.Wordprocessing;
using System.Collections.ObjectModel;
namespace MECF.Framework.Common.Aitex.Core.RT.EMS
{
public class MaintainerEditor2 : XmlLoader
{
#region Variables
///
/// 维护项列表
///
private List _allMaintainerList = new();
private List _allMaintainerInfoList = new();
private Dictionary> _enabledmaintainerInfodic = new();
private Dictionary> _allmaintainerInfodic = new();
private List _allMaintainerItemConfigList = new();
Func _isSubscriptionAttribute;
Func _hasSubscriptionAttribute;
#endregion
public MaintainerEditor2(string fileName) : base(fileName)
{
_isSubscriptionAttribute = attribute => attribute is SubscriptionAttribute;
_hasSubscriptionAttribute = mi => mi.GetCustomAttributes(false).Any(_isSubscriptionAttribute);
}
#region Methods
protected override void AnalyzeXml()
{
if (XmlDoc == null)
{
return;
}
#region 获取MaintenanceItem配置
var ConfigX = XmlDoc.Element("root")?.Element("AllMaintainerItemConfigs");
if (ConfigX == null)
{
return;
}
var maintainnamceItemsconfigX = from r in ConfigX.Descendants("MaintainerItemConfig")
select (r);
foreach (var itemX in maintainnamceItemsconfigX)
{
string parentName = itemX.Attribute("ParentName")?.Value;
string name = itemX.Attribute("Name")?.Value;
string uidstring = itemX.Attribute("UID")?.Value;
string indexstring = itemX.Attribute("Index")?.Value;
string description = itemX.Attribute("Description")?.Value ?? "";
string defaultrecord = itemX.Attribute("DefaultRecord")?.Value ?? "";
string filepath = itemX.Attribute("FilePath")?.Value ?? "";
int index = 0;
if (string.IsNullOrEmpty(name) || string.IsNullOrEmpty(indexstring))
{
EV.PostWarningLog("Maintenance", $"XML failed:MaintainConfigSubItem Parameter Missing");
//log.error
continue;
}
if (!int.TryParse(indexstring, out index))
{
EV.PostWarningLog("Maintenance", $"XML failed:MaintainConfigSubItem({name}) Parameter (Index) Parse failed;");
//log.error
}
MaintainerItemConfigInfo mi2 = new MaintainerItemConfigInfo(parentName, name, uidstring, index, description, defaultrecord, filepath);
_allMaintainerItemConfigList.Add(mi2);
}
#endregion
#region 获取Maintainer
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("Maintenance", "XML failed:Plan Parameter Missing");
continue;
}
if (!bool.TryParse(maintainerenablestring, out maintainerenable))
{
EV.PostWarningLog("Maintenance", $"XML failed:Plan {maintainername} Parameter (enable) Parse failed;");
//log.error
}
if (!DateTime.TryParse(maintainerstartdatestring, out maintainerstartdate))
{
EV.PostWarningLog("Maintenance", $"XML failed:Plan {maintainername} Parameter (startdate) Parse failed;");
//log.error
}
if (!double.TryParse(maintainerthresholdstring, out maintainerthreshold))
{
EV.PostWarningLog("Maintenance", $"XML failed:Plan {maintainername} Parameter (threshold) Parse failed;");
//log.error
}
if (!Enum.TryParse(maintainertimedisplayunitstring, out maintainertimedisplayunit))
{
EV.PostWarningLog("Maintenance", $"XML failed:Plan {maintainername} Parameter (timedisplayunit) Parse failed;");
//log.error
}
if (!int.TryParse(maintainerindexstring, out maintainerindex))
{
EV.PostWarningLog("Maintenance", $"XML failed:Plan {maintainername} Parameter (Index) Parse failed;");
//log.error
}
MaintainerItemCollection collection = new MaintainerItemCollection();
var itemsX = from r in maintainerX.Descendants("MaintainerItem") select (r);
foreach (var itemX in itemsX)
{
string itemuidstring = itemX.Attribute("UID")?.Value ?? "";
string itemenablestring = itemX.Attribute("Enable")?.Value ?? "";
string itemdatetimestring = itemX.Attribute("MaintainedDateLatest")?.Value ?? "2000-1-1 0:0:0";
bool enable2 = false;
DateTime date2 = new DateTime(2000, 1, 1);
if (string.IsNullOrEmpty(itemuidstring))
{
EV.PostWarningLog("Maintenance", $"XML failed:Plan UID Parameter Missing");
//log.error
continue;
}
if (!bool.TryParse(itemenablestring, out enable2))
{
EV.PostWarningLog("Maintenance", $"XML failed:Plan {maintainername}:MaintainItem Parameter (enable) Parse failed;");
//log.error
}
DateTime.TryParse(itemdatetimestring, out date2);
var cinfo = _allMaintainerItemConfigList.Find(i => i.UID == itemuidstring);
if (cinfo != null)
{
MaintainerItem mi = new MaintainerItem(itemuidstring, enable2, date2, cinfo);
collection.AddMaintainerItem(mi);
}
else
{
EV.PostWarningLog("Maintenance", $"XML failed:Plan {maintainername}:MaintainItem{itemuidstring} Config Missing;");
}
}
if (maintainertype == nameof(PlanMaintainer))
{
PlanMaintainer pm = new PlanMaintainer(collection,
maintainername,
maintainermodule,
maintainerindex,
maintainerdescription,
maintainerenable,
maintainerstartdate,
maintainerthreshold,
maintainertimedisplayunit);
pm.OnSave += SaveXml;
_allMaintainerList.Add(pm);
}
else if (maintainertype == nameof(PMMaintainer))
{
PMMaintainer pm = new PMMaintainer(collection,
maintainername,
maintainermodule,
maintainerindex,
maintainerdescription,
maintainerenable,
maintainerstartdate,
maintainerthreshold,
maintainertimedisplayunit);
pm.OnSave += SaveXml;
_allMaintainerList.Add(pm);
}
else if (maintainertype == nameof(CoatingMaintainer))
{
CoatingMaintainer pm = new CoatingMaintainer(collection,
maintainername,
maintainermodule,
maintainerindex,
maintainerdescription,
maintainerenable,
maintainerstartdate,
maintainerthreshold,
maintainertimedisplayunit);
pm.OnSave += SaveXml;
_allMaintainerList.Add(pm);
}
}
#endregion
#region 配置初始化
foreach (var item in _allMaintainerList)
{
_allMaintainerInfoList.Add(item.GetInfo());
}
foreach (var m in _allMaintainerInfoList)
{
//重新赋值config
foreach (var item in m.MaintainerItemInfos)
{
var c = _allMaintainerItemConfigList.Find(i => i.UID == item.UID);
if (c != null)
{
item.Config = c;
}
}
if (!_enabledmaintainerInfodic.ContainsKey(m.Name))
{
_enabledmaintainerInfodic.Add(m.Name, new());
_allmaintainerInfodic.Add(m.Name, new List());
//_obmaintainerconfigenableinfodic.Add(m.Name, new());
}
_allmaintainerInfodic[m.Name].Add(m);
if (m.Enable)
{
_enabledmaintainerInfodic[m.Name].Add(m);
}
}
OrderMaintainer();
#endregion
#region 检查后保存配置
SaveXml();
#endregion
}
protected bool SaveXml()
{
if (XmlDoc == null)
{
return false;
}
try
{
XmlDocument doc = new XmlDocument();
doc.LoadXml(" ");
var root = doc.SelectSingleNode("root") as XmlElement;
#region 保存_maintenancelist
var groups = root.GetElementsByTagName("MaintenanceGroup")[0];
foreach (var maintainer in _allMaintainerList)
{
var xmlElement2 = doc.CreateElement("Maintainer"); //一级列表
var info = maintainer.GetInfo();
xmlElement2.SetAttribute("Type", info.Type);
xmlElement2.SetAttribute("Name", info.Name);
xmlElement2.SetAttribute("Description", info.Description);
xmlElement2.SetAttribute("Index", info.Index.ToString());
if (!string.IsNullOrEmpty(info.Module))
{
xmlElement2.SetAttribute("Module", info.Module);
}
xmlElement2.SetAttribute("Enable", info.Enable.ToString());
xmlElement2.SetAttribute("StartDate", info.StartDate.ToString());
xmlElement2.SetAttribute("Threshold", info.Threshold.ToString());
xmlElement2.SetAttribute("TimeDisplayUnit", info.TimeDisplayUnit.ToString());
var ilist = maintainer.GetAllMaintainerItems();
foreach (var item2 in ilist)
{
var xmlElement3 = doc.CreateElement("MaintainerItem"); //三级列表
xmlElement3.SetAttribute("UID", item2.UID.ToString());
//xmlElement3.SetAttribute("Name", item2.Name);
xmlElement3.SetAttribute("MaintainedDateLatest", item2.MaintainedDate.ToString());
xmlElement3.SetAttribute("Enable", item2.Enable.ToString());
xmlElement2.AppendChild(xmlElement3);
}
groups.AppendChild(xmlElement2);
}
#endregion
#region 保存_maintenanceitemconfiglist
var configgroups = root.GetElementsByTagName("AllMaintainerItemConfigs")[0];
foreach (var item in _allMaintainerItemConfigList)
{
var xmlElement = doc.CreateElement("MaintainerItemConfig"); //二级列表
xmlElement.SetAttribute("UID", item.UID);
xmlElement.SetAttribute("ParentName", item.ParentName);
xmlElement.SetAttribute("Name", item.Name);
xmlElement.SetAttribute("Index", item.Index.ToString());
xmlElement.SetAttribute("Description", item.Description);
xmlElement.SetAttribute("DefaultRecord", item.DefaultRecord);
xmlElement.SetAttribute("FilePath", item.FilePath);
configgroups.AppendChild(xmlElement);
}
#endregion
doc.Save(FileName);
XmlDoc = XDocument.Load(FileName);
}
catch (Exception ex)
{
LOG.Write(ex);
return false;
}
return true;
}
private void OrderMaintainer()
{
_enabledmaintainerInfodic.ForEachDo(i =>
{
var temp = i.Value.OrderBy(i => i.Index).ToList();
i.Value.Clear();
foreach (var item in temp)
{
i.Value.Add(item);
}
});
_allmaintainerInfodic.ForEachDo(i => {
var temp = i.Value.OrderBy(i => i.Index).ToList();
i.Value.Clear();
i.Value.AddRange(temp);
});
}
public List GetAllMaintainerList()
{
return _allMaintainerList;
}
public List GetAllMaintainerConfigItemList()
{
return _allMaintainerItemConfigList;
}
public bool SetMaintain(string type,string name, string module, string parent, string itemname, string itemuid, DateTime date, string role, string detial)
{
int index = _allMaintainerList.FindIndex(i =>i.EqualsNameModule(type,name,module));
if (index == -1)
return false;
if(_allMaintainerList[index].SetMaintain(itemuid,date))
{
string s = name + (module == "" ? "" : ("." + module));
EV.PostInfoLog("Maintenance", $"Item {parent}-{itemname}({itemuid}) in Plan {s} is Maintained");
#region DATABASE
string cmd = string.Format("Insert into \"maintenance_event_data\"" +
"(\"planname\",\"planmodule\",\"itemparentname\",\"itemname\",\"uid\",\"createtime\",\"role\",\"detial\")" +
" values('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}')", name, module, parent, itemname, itemuid, date.ToString("yyyy/MM/dd HH:mm:ss.fff"), role, detial);
int result = DB.ExecuteNonQuery(cmd);
if (result <= 0)
{
EV.PostWarningLog("Maintenance", $"database execution faile => code: {cmd}");
}
#endregion
return SaveXml();
}
else return false;
}
#region 维护项增删改
public bool ExchangeMaintainItemIndex(string uid1, string uid2)
{
var item1 = _allMaintainerItemConfigList.Find(i => i.UID == uid1);
var item2 = _allMaintainerItemConfigList.Find(i => i.UID == uid2);
if (item1!=null && item2 !=null)
{
int tempindex = item1.Index;
item1.Index = item2.Index;
item2.Index = tempindex;
_allMaintainerList.ForEachDo(i => i.SortItemInfo());
}
EV.PostInfoLog("Maintenance", $"Maintainer {uid1} & {uid2} Index is exchanged ");
return SaveXml();
}
///
/// 二级维护项enable设置,根据名称和id确认唯一性
///
///
///
///
///
///
///
public bool SetMaintainItemEnable(string type,string name, string module, string itemuid, bool enable)
{
int index = _allMaintainerList.FindIndex(i => i.EqualsNameModule(type, name, module));
if (index == -1)
return false;
if (!_allMaintainerList[index].SetMaintainerItemEnable(itemuid, enable))
{
return false;
}
string s = name + (module == "" ? "" : ("." + module));
string result = enable ? "Enable" : "Disable";
EV.PostInfoLog("Maintenance", $"Item {itemuid} in Plan {s} is {result}");
return SaveXml();
}
///
/// 修改Item参数
///
///
///
///
///
///
///
///
///
public bool SetMaintainItemParas(string parentname, string name, string itemuid, int itemindex, string description, string defaultrecord, string filepath)
{
int index = _allMaintainerItemConfigList.FindIndex(i => i.UID == itemuid);
if (index == -1)
return false;
_allMaintainerItemConfigList[index].ParentName = parentname;
_allMaintainerItemConfigList[index].Name = name;
if (_allMaintainerItemConfigList[index].Index != itemindex)
{
_allMaintainerList.ForEachDo(i=>i.SortItemInfo());
_allMaintainerItemConfigList[index].Index = itemindex;
}
_allMaintainerItemConfigList[index].Description = description;
_allMaintainerItemConfigList[index].DefaultRecord = defaultrecord;
_allMaintainerItemConfigList[index].FilePath = filepath;
EV.PostInfoLog("Maintenance", $"Item {itemuid} Parameters is changed ");
return SaveXml();
}
///
/// 新增Item
///
///
///
///
///
///
///
///
///
public bool AddMaintainItem(string parentname ,string name, string itemuid, int itemindex, string description, string defaultrecord, string filepath)
{
MaintainerItemConfigInfo newconfigitem = new MaintainerItemConfigInfo(parentname, name,itemuid, itemindex, description, defaultrecord,filepath);
_allMaintainerItemConfigList.Add(newconfigitem);
foreach (var item in _allMaintainerList)
{
item.AddMaintainerItem(new MaintainerItem(itemuid,false,new DateTime(2000,1,1),newconfigitem));
}
return SaveXml();
}
///
/// 删除Item
///
///
///
public bool DeleteMaintainItem(string itemuid)
{
foreach (var ma in _allMaintainerList)
{
ma.RemoveMaintainerItem(itemuid);
}
int index = _allMaintainerItemConfigList.FindIndex(i => i.UID == itemuid);
if (index == -1)
return false;
_allMaintainerItemConfigList.RemoveAt(index);
EV.PostInfoLog("Maintenance", $"Maintenance Item {itemuid} deleted.");
return SaveXml();
}
#endregion
#region Plan增删改
public bool SetMaintainerParas(string type,string name, string oldmodule, string newmodule, int _index, bool enable, string description, DateTime date, double threshold, TimeUnit timeunit)
{
int index = _allMaintainerList.FindIndex(i => i.EqualsNameModule(type, name, oldmodule));
if (index == -1)
return false;
var info = _allMaintainerList[index].GetInfo();
info.Module = newmodule;
info.Description = description;
info.Enable = enable;
info.Index = _index;
info.TimeDisplayUnit = timeunit;
if (info.Threshold != threshold)
{
_allMaintainerList[index].SetThreshold(threshold, timeunit);
}
if (info.StartDate != date)
{
_allMaintainerList[index].SetStartDate(date);
}
_allMaintainerList[index].UpdateInfo();
//if (_allMaintainerList[index] is PlanMaintainer pm1)
// pm1.UpdateInfo();
//else if (_allMaintainerList[index] is PMMaintainer pm2)
// pm2.UpdateInfo();
//else if (_allMaintainerList[index] is CoatingMaintainer pm3)
// pm3.UpdateInfo();
EV.PostInfoLog("Maintenance", $"{info.DisplayName} Parameters is changed ");
return SaveXml();
}
public bool AddMaintainer(string type,string name, string module, int _index ,bool enable, string description, DateTime date, double threshold, TimeUnit timeunit)
{
//ui 调用此函数前已判断重复性
var mc = new MaintainerItemCollection();
foreach (var maintainercitem in _allMaintainerItemConfigList)
{
mc.AddMaintainerItem(new MaintainerItem(maintainercitem.UID, false, new DateTime(2020, 1, 1), maintainercitem));
}
if (type == nameof(PlanMaintainer))
{
var plan = new PlanMaintainer(mc, name, module, _index, description, enable, date, threshold, timeunit);
plan.OnSave += SaveXml;
plan.UpdateInfo();
_allMaintainerList.Add(plan);
}
else if (type == nameof(PMMaintainer))
{
var pm = new PMMaintainer(mc, name, module, _index, description, enable, date, threshold, timeunit);
pm.OnSave += SaveXml;
pm.UpdateInfo();
_allMaintainerList.Add(pm);
}
else if (type == nameof(CoatingMaintainer))
{
var pm = new CoatingMaintainer(mc, name, module, _index, description, enable, date, threshold, timeunit);
pm.OnSave += SaveXml;
pm.UpdateInfo();
_allMaintainerList.Add(pm);
}
string s = name + (module == "" ? "" : ("." + module));
EV.PostInfoLog("Maintenance", $"Plan {s} created");
return SaveXml();
}
public bool DeleteMaintainer(string type,string name, string module)
{
int index = _allMaintainerList.FindIndex(i => i.EqualsNameModule(type, name, module));
if (index == -1)
return false;
if (_allMaintainerList.Remove(_allMaintainerList[index]))
{
string s = name + (module == "" ? "" : ("." + module));
EV.PostInfoLog("Maintenance", $"Plan {s} Delete");
return SaveXml();
}
else return false;
}
#endregion
#endregion
}
}