namespace Yw.Server
{
///
/// 设备健康评价任务
///
public class EquipmentEvaluateJob : IJob
{
internal const string Instance = "Instance";
///
///
///
public Task Execute(IJobExecutionContext context)
{
return Task.Run(() =>
{
try
{
#region 绑定关系
var dataMap = context.MergedJobDataMap;
var binding = (Model.HealthMultiEvaluationModelBinding)dataMap[Instance];
if (binding == null)
{
LogHelper.Info($"设备健康评价任务中,评价模型与设备绑定关系传输失败!");
return;
}
#endregion
#region 评价设备
var serviceEquipment = new Service.Equipment();
var equipment = serviceEquipment.GetByID(binding.EquipmentID);
if (equipment == null)
{
LogHelper.Info($"设备健康评价任务中,获取绑定设备失败!");
return;
}
#endregion
#region 评价模型
var serviceModel = new Service.HealthMultiEvaluationModel();
var model = serviceModel.GetByID(binding.ModelID);
if (model == null)
{
LogHelper.Info($"设备健康评价任务中,获取评价模型失败!");
return;
}
#endregion
#region 健康指数
var index = new Service.ChengHang().GetDefault();
if (index == null)
{
return;
}
#endregion
#region 服务准备
var serviceMonitor = new Lazy(() => new Service.MonitorPoint());//测点
var serviceMonitorMapping = new Lazy(() => new Service.EquipmentMonitorMapping());//测点映射
var serviceMonitorRecord = new Lazy(() => new Service.MonitorRealRecord());//测点记录
var serviceModelItem = new Lazy(() => new Service.HealthMultiEvaluationModelItem()); //模型评价项
var serviceQuotaRecord = new Lazy(() => new Service.HealthQuotaEvaluationRecord());//指标评价记录
#endregion
#region 评价条件
var serviceCondition = new Service.HealthMultiEvaluationModelCondition();
var conditionList = serviceCondition.GetByModelID(model.ID);
if (conditionList != null && conditionList.Count > 0)
{
//获取评价设备关联的所有测点列表
var conditionEquipmentList = serviceEquipment.GetChildAndSelfByID(equipment.ID);
var conditionEquipmentIds = conditionEquipmentList.Select(x => x.ID).Distinct().ToList();
var conditonMappingList = serviceMonitorMapping.Value.GetByEquipmentIds(conditionEquipmentIds);
var conditionMonitorIds = conditonMappingList?.Select(x => x.MonitorPointID).Distinct().ToList();
var conditionMonitorList = serviceMonitor.Value.GetExSignalWithSignalTypeByIds(conditionMonitorIds);
//遍历评价条件
foreach (var condition in conditionList)
{
string condtionValue = string.Empty;
var conditionMonitor = conditionMonitorList?.Find(x => x.Flags.EqualC(condition.Flags) && x.SignalList.Exists(t => t.SignalTypeID == condition.SignalTypeID));
if (conditionMonitor != null)
{
var conditionSignal = conditionMonitor.SignalList.Find(x => x.SignalTypeID == condition.SignalTypeID);
var conditionRecord = serviceMonitorRecord.Value.GetLastRecord(conditionSignal.ID);
if (conditionRecord != null)
{
condtionValue = conditionRecord.DataValue;
}
}
if (!condition.IsMeet(condtionValue))
{
return;
}
}
}
#endregion
#region 迭代评价
var dtNow = DateTime.Now;//评价时间
var multiEvaluateRecordList = new List();//综合评价记录
var multiItemEvaluateRecordList = new List();//综合评价项记录
//迭代算法
Model.HealthMultiEvaluationRecord Evaluate(Model.HealthMultiEvaluationModel evaluateModel, Model.Equipment evaluateEquipment)
{
#region 构建综合评价记录
var multiEvaluateRecord = new Model.HealthMultiEvaluationRecord();
multiEvaluateRecord.BindingID = binding.ID;
multiEvaluateRecord.ModelID = evaluateModel.ID;
if (evaluateEquipment != null)
{
multiEvaluateRecord.EvaluateEquipmentID = evaluateEquipment.ID;
}
multiEvaluateRecord.EvaluateTime = dtNow;
multiEvaluateRecord.EvaluateMode = eEvaluateMode.Default;
multiEvaluateRecord.EvaluateValue = evaluateModel.DefaultValue;
#endregion
#region 获取子评价模型列表
var childEvaluateModelList = serviceModel.GetByParentID(evaluateModel.ID);
#endregion
#region 拥有子评价模型
if (childEvaluateModelList != null && childEvaluateModelList.Count > 0)
{
#region 没有匹配到设备
if (evaluateEquipment == null)
{
foreach (var childEvaluateModel in childEvaluateModelList)
{
Evaluate(childEvaluateModel, null);
}
}
#endregion
#region 匹配到设备
else
{
var childEvaluateEquipmentList = serviceEquipment.GetByParentID(evaluateEquipment.ID);
var childEvaluateValueList = new List();
foreach (var childEvaluateModel in childEvaluateModelList)
{
var childEvaluateEquipment = childEvaluateEquipmentList?.Find(x => x.Flags.EqualC(childEvaluateModel.Flags));
var childEvaluateRecord = Evaluate(childEvaluateModel, childEvaluateEquipment);
var childEvaluateValue = childEvaluateRecord.EvaluateValue * childEvaluateModel.Weight + childEvaluateModel.Deduction;
if (index.ScoreType == eScoreType.Increase)
{
childEvaluateValue = (index.MaxValue - childEvaluateRecord.EvaluateValue) * childEvaluateModel.Weight + childEvaluateModel.Deduction;
}
childEvaluateValueList.Add(childEvaluateValue);
}
multiEvaluateRecord.EvaluateMode = eEvaluateMode.Evaluate;
switch (evaluateModel.Method)
{
case eEvaluateMethod.Most:
{
multiEvaluateRecord.EvaluateValue = childEvaluateValueList.Max();
}
break;
case eEvaluateMethod.Less:
{
multiEvaluateRecord.EvaluateValue = childEvaluateValueList.Min();
}
break;
case eEvaluateMethod.Avg:
{
multiEvaluateRecord.EvaluateValue = childEvaluateValueList.Average();
}
break;
default: break;
}
if (index.ScoreType == eScoreType.Increase)
{
multiEvaluateRecord.EvaluateValue = index.MaxValue - multiEvaluateRecord.EvaluateValue;
}
}
#endregion
}
#endregion
#region 没有子评价模型,需要判断有没有评价项
else
{
#region 获取所有评价项
var childEvaluateItemList = serviceModelItem.Value.GetByModelID(evaluateModel.ID);
#endregion
#region 拥有评价项
if (childEvaluateItemList != null && childEvaluateItemList.Count > 0)
{
#region 没有匹配到设备
if (evaluateEquipment == null)
{
foreach (var childEvaluateItem in childEvaluateItemList)
{
var multiItemEvaluateRecord = new Model.HealthMultiItemEvaluationRecord();
multiItemEvaluateRecord.BindingID = binding.ID;
multiItemEvaluateRecord.ItemID = childEvaluateItem.ID;
multiItemEvaluateRecord.EvaluateMode = eEvaluateMode.Default;
multiItemEvaluateRecord.EvaluateTime = dtNow;
multiItemEvaluateRecord.EvaluateValue = childEvaluateItem.DefaultValue;
if (multiItemEvaluateRecord.EvaluateValue < index.MinValue)
{
multiItemEvaluateRecord.EvaluateValue = index.MinValue;
}
if (multiItemEvaluateRecord.EvaluateValue > index.MaxValue)
{
multiItemEvaluateRecord.EvaluateValue = index.MaxValue;
}
multiItemEvaluateRecordList.Add(multiItemEvaluateRecord);
}
}
#endregion
#region 匹配到设备
else
{
var equipmentList = serviceEquipment.GetChildAndSelfByID(evaluateEquipment.ID);
var equipmentIds = equipmentList.Select(x => x.ID).Distinct().ToList();
var mappingList = serviceMonitorMapping.Value.GetByEquipmentIds(equipmentIds);
var monitorIds = mappingList?.Select(x => x.MonitorPointID).Distinct().ToList();
var monotorList = serviceMonitor.Value.GetExSignalWithSignalTypeByIds(monitorIds);
var childEvaluateValueList = new List();
foreach (var childEvaluateItem in childEvaluateItemList)
{
var multiItemEvaluateRecord = new Model.HealthMultiItemEvaluationRecord();
multiItemEvaluateRecord.BindingID = binding.ID;
multiItemEvaluateRecord.ItemID = childEvaluateItem.ID;
multiItemEvaluateRecord.EvaluateTime = dtNow;
multiItemEvaluateRecord.EvaluateMode = eEvaluateMode.Default;
multiItemEvaluateRecord.EvaluateValue = childEvaluateItem.DefaultValue;
var monitor = monotorList?.Find(x => x.Flags.EqualC(childEvaluateItem.Flags) && x.SignalList.Exists(t => t.SignalTypeID == childEvaluateItem.SignalTypeID));
if (monitor != null)
{
var signal = monitor.SignalList.Find(x => x.SignalTypeID == childEvaluateItem.SignalTypeID);
multiItemEvaluateRecord.EvaluateSignalID = signal.ID;
var signalEvaluateRecord = serviceQuotaRecord.Value.GetLastRecord(signal.ID);
if (signalEvaluateRecord != null)
{
multiItemEvaluateRecord.EvaluateModelID = signalEvaluateRecord.EvaluateModelID;
multiItemEvaluateRecord.EvaluateMode = eEvaluateMode.Evaluate;
multiItemEvaluateRecord.EvaluateValue = signalEvaluateRecord.EvaluateValue;
}
}
if (multiItemEvaluateRecord.EvaluateValue < index.MinValue)
{
multiItemEvaluateRecord.EvaluateValue = index.MinValue;
}
if (multiItemEvaluateRecord.EvaluateValue > index.MaxValue)
{
multiItemEvaluateRecord.EvaluateValue = index.MaxValue;
}
var evaluateValue = multiItemEvaluateRecord.EvaluateValue * childEvaluateItem.Weight + childEvaluateItem.Deduction;
if (index.ScoreType == eScoreType.Increase)
{
evaluateValue = (index.MaxValue - multiItemEvaluateRecord.EvaluateValue) * childEvaluateItem.Weight + childEvaluateItem.Deduction;
}
childEvaluateValueList.Add(evaluateValue);
multiItemEvaluateRecordList.Add(multiItemEvaluateRecord);
}
multiEvaluateRecord.EvaluateMode = eEvaluateMode.Evaluate;
switch (evaluateModel.Method)
{
case eEvaluateMethod.Most:
{
multiEvaluateRecord.EvaluateValue = childEvaluateValueList.Max();
}
break;
case eEvaluateMethod.Less:
{
multiEvaluateRecord.EvaluateValue = childEvaluateValueList.Min();
}
break;
case eEvaluateMethod.Avg:
{
multiEvaluateRecord.EvaluateValue = childEvaluateValueList.Average();
}
break;
default: break;
}
if (index.ScoreType == eScoreType.Increase)
{
multiEvaluateRecord.EvaluateMode = index.MaxValue - multiEvaluateRecord.EvaluateMode;
}
}
#endregion
}
#endregion
#region 没有评价项
else
{
}
#endregion
}
#endregion
#region 添加综合评价记录
if (multiEvaluateRecord.EvaluateValue < index.MinValue)
{
multiEvaluateRecord.EvaluateValue = index.MinValue;
}
if (multiEvaluateRecord.EvaluateValue > index.MaxValue)
{
multiEvaluateRecord.EvaluateValue = index.MaxValue;
}
multiEvaluateRecordList.Add(multiEvaluateRecord);
return multiEvaluateRecord;
#endregion
}
//迭代调用
Evaluate(model, equipment);
#endregion
#region 批量存储
if (multiEvaluateRecordList.Count > 0)
{
var bol = new Service.HealthMultiEvaluationRecord().InsertsLastRecord(multiEvaluateRecordList);
if (!bol)
{
LogHelper.Info($"设备健康评价任务中,保存综合评价记录失败!");
}
}
if (multiItemEvaluateRecordList.Count > 0)
{
var bol = new Service.HealthMultiItemEvaluationRecord().InsertsLastRecord(multiItemEvaluateRecordList);
if (!bol)
{
LogHelper.Info($"设备健康评价任务中,保存指标评价记录失败!");
}
}
#endregion
}
catch (Exception ex)
{
LogHelper.Error("设备健康评价任务中,执行出错", ex);
var e = new JobExecutionException(ex);
throw e;
}
});
}
}
}