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

265 lines
7.5 KiB
C#

using Aitex.Core.RT.Event;
using Aitex.Core.RT.SCCore;
using Aitex.Core.Util;
using DocumentFormat.OpenXml.EMMA;
using DocumentFormat.OpenXml.VariantTypes;
using DocumentFormat.OpenXml.Wordprocessing;
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel.PeerResolvers;
using System.Text;
using System.Threading.Tasks;
namespace MECF.Framework.Common.Aitex.Core.RT.EMS
{
public class Maintainer : IMaintainer
{
#region Variables
/// <summary>
/// 触发保养等级是否为Warning
/// </summary>
protected bool _isWarning = false;
/// <summary>
/// 确认监控部件消耗中
/// </summary>
protected Func<bool> _getProcessing = ()=> true;
/// <summary>
/// 保养触发器相关信息
/// </summary>
protected MaintainerInfo _info = new();
/// <summary>
/// 开始时间
/// </summary>
protected DateTime _startDate = DateTime.Now;
/// <summary>
/// 阈值到达时间
/// </summary>
protected DateTime? _trigDate = null;
/// <summary>
/// 记录值
/// </summary>
protected double _value = 0;
/// <summary>
/// 记录剩余值
/// </summary>
protected double _valueElapsed = 0;
/// <summary>
/// 记录超出值
/// </summary>
protected double _valueExceeded = 0;
/// <summary>
/// 触发标志
/// </summary>
protected bool _isTimeOut = false;
/// <summary>
/// 触发后超出时间
/// </summary>
protected double _timeExceeded = 0;
/// <summary>
/// 触发器上升沿
/// </summary>
protected readonly R_TRIG _trigTimeOut = new();
/// <summary>
/// 记录值门槛
/// </summary>
protected double _threshold = 1000000;
/// <summary>
/// 保养项集合
/// </summary>
protected MaintainerItemCollection _itemCollection = new();
/// <summary>
/// 未点检保养项个数
/// </summary>
protected int _unMaintainedCount => _itemCollection.UnMaintainCount;
protected int _totalCount => _itemCollection.Count;
protected bool _isProcessing = false;
#endregion
public delegate bool Save();
public event Save OnSave;
#region Constructors
public Maintainer()
{
SC.RegisterValueChangedCallback("System.IgnoreMaintainTimeOutWarning", (newValue) =>
{
bool.TryParse(newValue.ToString(), out _isWarning);
});
_itemCollection = new MaintainerItemCollection();
}
public Maintainer(MaintainerItemCollection item, string name, string module, int index, string description, bool enabled, DateTime startdate, double threshold, TimeUnit timedisplayunit)
{
SC.RegisterValueChangedCallback("System.IgnoreMaintainTimeOutWarning", (newValue) =>
{
bool.TryParse(newValue.ToString(), out _isWarning);
});
_itemCollection = item;
_threshold = threshold;
_startDate = startdate;
_info = new MaintainerInfo(_itemCollection.GetAllItemInfos(), name, module, index, description, enabled, startdate, threshold, timedisplayunit);
}
public Maintainer(MaintainerItemCollection item, MaintainerInfo info, DateTime startdate, double threshold)
{
SC.RegisterValueChangedCallback("System.IgnoreMaintainTimeOutWarning", (newValue) =>
{
bool.TryParse(newValue.ToString(), out _isWarning);
});
_itemCollection = item;
_threshold = threshold;
_startDate = startdate;
_info = new MaintainerInfo(_itemCollection.GetAllItemInfos(), info, startdate, threshold);
}
#endregion
#region Function
/// <summary>
/// 触发OnSave委托
/// </summary>
/// <returns></returns>
public virtual bool Reset()
{
OnSave?.Invoke();
return true;
}
/// <summary>
/// 阈值设置
/// </summary>
/// <param name="threshold"></param>
/// <param name="args"></param>
/// <returns></returns>
public virtual bool SetThreshold(double threshold ,params object[] args)
{
if (threshold <= 0)
{
EV.PostWarningLog("Maintenance", $"threshold must be greater than zero");
return false;
}
return true;
}
/// <summary>
/// 计算剩余时间和超时时间,不同类算法不同,需要重载
/// </summary>
public virtual void Monitor()
{
_isProcessing = _getProcessing?.Invoke() ?? false;
_trigTimeOut.CLK = _isTimeOut;
if (_trigTimeOut.Q)
{
if (_isWarning)
EV.PostWarningLog("Maintenance", $"Plan {_info.Name} reach the deadline, please check as soon as possible.");
else
EV.PostInfoLog("Maintenance", $"Plan {_info.Name} reach the deadline, please check as soon as possible.");
}
}
/// <summary>
/// 更新Info的数据
/// </summary>
public virtual void UpdateInfo()
{
_info.StartDate = _startDate;
_info.IsTrigger = _isTimeOut;
_info.IsProcessing = _isProcessing;
_info.TrigDate = _trigDate;
_info.UnMaintainedCount = _unMaintainedCount;
_info.TotalCount = _totalCount;
_info.TimeExceeded = DateTimeHelper.SecondsTransform(_timeExceeded, _info.TimeDisplayUnit);
}
/// <summary>
/// 更新Info的数据
/// </summary>
public void SortItemInfo()
{
_itemCollection.SortInfo();
_info.ReShapeItemHandShake = DateTime.Now;
}
public virtual bool SetStartDate(DateTime t)
{
return true;
}
public virtual bool CanReset()
{
return _unMaintainedCount == 0;
}
public List<MaintainerItem> GetAllMaintainerItems()
{
return _itemCollection.GetAllItems();
}
public bool SetMaintain(string itemuid, DateTime date)
{
if (_itemCollection.SetMaintain(itemuid, date))
{
return true;
}
return false;
}
public bool SetMaintainerItemEnable(string itemuid, bool enable)
{
if (_itemCollection.SetMaintainerItemEnable(itemuid, enable))
{
_info.ReShapeItemHandShake = DateTime.Now;
return true;
}
return false;
}
public void AddMaintainerItem(MaintainerItem item)
{
_itemCollection.AddMaintainerItem(item);
}
public void RemoveMaintainerItem(string uid)
{
if (_itemCollection.RemoveMaintainerItem(uid))
{
_info.ReShapeItemHandShake = DateTime.Now;
}
}
public MaintainerInfo GetInfo()
{
return _info;
}
public bool EqualsNameModule(string type, string name,string module)
{
return _info.EqualsTypeNameModule(type, name, module);
}
#endregion
}
}