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); } /// /// 阈值设置 /// /// 必须大于0 /// 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> 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 } }