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; } }); } } }