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

193 lines
5.5 KiB
C#

using Aitex.Core.RT.Event;
using Aitex.Core.Util;
using DocumentFormat.OpenXml.Wordprocessing;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace MECF.Framework.Common.Aitex.Core.RT.EMS
{
[DataContract]
public class PlanMaintainer: TimeObserver
{
#region Variables
protected double _timeElapsed = 0;
[DataMember]
MaintainerItemCollection _itemcollection;
[Subscription("UnMaintainedCount")]
public int UnMaintainedCount => _itemcollection.UnMaintainCount;
public delegate bool Save();
public event Save OnSave;
[Subscription("TimeElapsed")]
public double TimeElapsed => _timeElapsed;
#endregion
#region Constructors
public PlanMaintainer()
{
}
public PlanMaintainer(MaintainerItemCollection item,
string name,
string module,
int index,
string description,
bool enabled,
DateTime startdate,
double threshold,
TimeUnit timeexceedunit) : base(name, module,index ,description, enabled, startdate, threshold, timeexceedunit)
{
_itemcollection = item;
CalculateEndDate();
}
#endregion
#region Methods
public override void Monitor()
{
////①确认未使能;没有维护项也不进行计算
if (!Enable || _itemcollection.Count == 0)
{
_isTimeOut = false;
_timeExceeded = 0;
_timeElapsed = 0;
_value = 0;
return;
}
else
{
////②计算时间
DateTime now = DateTime.Now;
_itemcollection.CheckAllItemMaintained(StartDate);
if (now.CompareTo((DateTime)TrigDate) > 0)
{
if (UnMaintainedCount != 0)
{
_isTimeOut = true;
_timeExceeded = DateTimeHelper.DateTimeSubtraction((DateTime)TrigDate, now, TimeDisplayUnit);
_timeElapsed = 0;
}
else
{
Reset(); //所有项都维护,翻转沙漏
}
}
else
{
if (UnMaintainedCount != 0)
{
_isTimeOut = false;
_timeExceeded = 0;
_timeElapsed = DateTimeHelper.DateTimeSubtraction(now, (DateTime)TrigDate, TimeDisplayUnit);
}
else
{
Reset(); //所有项都维护,翻转沙漏
}
}
_value = DateTimeHelper.DateTimeSubtraction(StartDate, now, TimeUnit.Seconds);
}
////④确认超时上升沿
base.Monitor();
}
public override bool Reset()
{
if (!base.Reset())
{
return false;
}
if (!CanReset())
{
return false;
}
_isTimeOut = false;
DateTime now = DateTime.Now;
_startDate = now;
CalculateEndDate();
OnSave?.Invoke();
_timeExceeded = 0;
_timeElapsed = DateTimeHelper.DateTimeSubtraction(now, (DateTime)TrigDate, TimeDisplayUnit);
_itemcollection.CheckAllItemMaintained(StartDate);
return true;
}
public override bool CanReset()
{
return UnMaintainedCount == 0;
}
protected void CalculateEndDate()
{
_trigDate = StartDate.AddSeconds(Threshold);
}
/// <summary>
/// 阈值设置
/// </summary>
/// <param name="threshold">必须大于0</param>
/// <returns></returns>
public override bool SetThreshold(double threshold)
{
if (!base.SetThreshold(threshold))
{
return false;
}
_threshold = threshold;
CalculateEndDate();
return true;
}
public override bool SetStartDate(DateTime t)
{
if (!base.SetStartDate(t))
{
return false;
}
_startDate = t;
CalculateEndDate();
return true;
}
public override Dictionary<string, List<MaintainerItem>> GetAllMaintainerItemsDic()
{
return _itemcollection.GetAllItemsDic();
}
public override bool SetMaintain(string parentname, string name, int itemid, DateTime date)
{
return _itemcollection.SetMaintain(parentname,name,itemid,date);
}
public override bool SetMaintainerItemEnable(string parentname, string name, int itemid, bool enable)
{
return _itemcollection.SetMaintainerItemEnable(parentname,name,itemid,enable);
}
public override void AddMaintainerItem(string parentname, MaintainerItem item)
{
_itemcollection.AddMaintainerItem(parentname,item);
}
public override void RemoveMaintainerItem(string parentname, string itemname, int id)
{
_itemcollection.RemoveMaintainerItem(parentname,itemname,id);
}
#endregion
}
}