using Quartz;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using IStation.Calculation;
namespace IStation.Server
{
///
/// 常规实时分析计划任务
///
public class GeneralRealAnalyCronJob : IJob
{
///
/// 时间步长
///
public int Frequency { get; set; }
///
///
///
public Task Execute(IJobExecutionContext context)
{
return Task.Run(() =>
{
try
{
#region 加载分析测点
var monitorList = GeneralRealMonitorPointCacheHelper.Get()
.Where(x => x.SourceType == Model.Monitor.eSourceType.Analyse && x.Slot.TimeStep == Frequency).ToList();
if (monitorList == null || monitorList.Count < 1)
{
LogHelper.Error($"常规实时分析计划任务中,频率:{Frequency},未检索到常规实时分析测点信息!");
return;
}
#endregion
#region 遍历分析
foreach (var monitor in monitorList)
{
#region 数据验证
if (string.IsNullOrEmpty(monitor.SourceParas))
{
LogHelper.Error($"常规实时分析计划任务中,客户标识:{monitor.CorpID},测点标识:{monitor.ID} 未配置分析参数!");
continue;
}
var analyModel = Model.Monitor.AnalyseParameters.ToModel(monitor.SourceParas);
if (analyModel == null)
{
LogHelper.Error($"常规实时分析计划任务中,客户标识:{monitor.CorpID},测点标识:{monitor.ID} 分析参数配置错误!");
continue;
}
if (string.IsNullOrEmpty(analyModel.FormulaType))
{
LogHelper.Error($"常规实时分析计划任务中,客户标识:{monitor.CorpID},测点标识:{monitor.ID} 未配置公式类型!");
continue;
}
if (string.IsNullOrEmpty(analyModel.FormulaParas))
{
LogHelper.Error($"常规实时分析计划任务中,客户标识:{monitor.CorpID},测点标识:{monitor.ID},未配置公式参数!");
continue;
}
var signal = new Service.Signal().GetFirstExSignalTypeByMonitorPointID(monitor.CorpID, monitor.ID);
if (signal == null)
{
LogHelper.Error($"常规实时分析计划任务中,客户标识:{monitor.CorpID},测点标识:{monitor.ID} 未检索到信号信息!");
continue;
}
#endregion
#region 委托
var getMonitorPoint = new Func(x => {
return GeneralRealMonitorPointCacheHelper.Get().Find(t => t.CorpID == monitor.CorpID && t.ID == x);
});
var getSignal = new Func(x => {
return new Service.Signal().GetFirstExSignalTypeByMonitorPointID(monitor.CorpID, x);
});
var getLastRecord = new Func((x,y) => {
return new Service.MonitorRealRecord().GetLastNormalRecord(monitor.CorpID,x,y);
});
var getCurrentLastRecord = new Func(() => {
return new Service.MonitorRealRecord().GetLastNormalRecord(monitor.CorpID, monitor.ID,signal.ID);
});
double srcValue = 0;
#endregion
switch (analyModel.FormulaType)
{
case Model.Monitor.FormulaType.Calculation_SingleMapping:
{
srcValue = MonitorFormulaCalcuHelper.CalcuSingleMapping(analyModel.FormulaParas, getMonitorPoint,getSignal, getLastRecord,out string msg);
if (!string.IsNullOrEmpty(msg))
{
LogHelper.Info($"常规实时分析计划任务中,客户标识:{monitor.CorpID},测点标识:{monitor.ID},{msg}!");
continue;
}
}
break;
case Model.Monitor.FormulaType.Calculation_CompareMapping:
{
srcValue = MonitorFormulaCalcuHelper.CalcuCompareMapping(analyModel.FormulaParas, getMonitorPoint, getSignal, getLastRecord, out string msg);
if (!string.IsNullOrEmpty(msg))
{
LogHelper.Info($"常规实时分析计划任务中,客户标识:{monitor.CorpID},测点标识:{monitor.ID},{msg}!");
continue;
}
}
break;
case Model.Monitor.FormulaType.Calculation_RangeMapping:
{
srcValue = MonitorFormulaCalcuHelper.CalcuRangeMapping(analyModel.FormulaParas, getMonitorPoint, getSignal, getLastRecord, out string msg);
if (!string.IsNullOrEmpty(msg))
{
LogHelper.Info($"常规实时分析计划任务中,客户标识:{monitor.CorpID},测点标识:{monitor.ID},{msg}!");
continue;
}
}
break;
case Model.Monitor.FormulaType.Calculation_OnceRatio:
{
srcValue = MonitorFormulaCalcuHelper.CalcuOnceRatio(analyModel.FormulaParas, getMonitorPoint, getSignal, getLastRecord, out string msg);
if (!string.IsNullOrEmpty(msg))
{
LogHelper.Info($"常规实时分析计划任务中,客户标识:{monitor.CorpID},测点标识:{monitor.ID},{msg}!");
continue;
}
}
break;
case Model.Monitor.FormulaType.Calculation_TwiceRatio:
{
srcValue = MonitorFormulaCalcuHelper.CalcuTwiceRatio(analyModel.FormulaParas, getMonitorPoint, getSignal, getLastRecord, out string msg);
if (!string.IsNullOrEmpty(msg))
{
LogHelper.Info($"常规实时分析计划任务中,客户标识:{monitor.CorpID},测点标识:{monitor.ID},{msg}!");
continue;
}
}
break;
case Model.Monitor.FormulaType.Calculation_RunStatus:
{
srcValue = MonitorFormulaCalcuHelper.CalcuRunStatus(analyModel.FormulaParas, getMonitorPoint, getSignal, getLastRecord, out string msg);
if (!string.IsNullOrEmpty(msg))
{
LogHelper.Info($"常规实时分析计划任务中,客户标识:{monitor.CorpID},测点标识:{monitor.ID},{msg}!");
}
}
break;
case Model.Monitor.FormulaType.Calculation_Sum:
{
srcValue = MonitorFormulaCalcuHelper.CalcuSum(analyModel.FormulaParas, getMonitorPoint, getSignal, getLastRecord, out string msg);
if (!string.IsNullOrEmpty(msg))
{
LogHelper.Info($"常规实时分析计划任务中,客户标识:{monitor.CorpID},测点标识:{monitor.ID},{msg}!");
continue;
}
}
break;
case Model.Monitor.FormulaType.Calculation_Diff:
{
srcValue = MonitorFormulaCalcuHelper.CalcuDiff(analyModel.FormulaParas, getMonitorPoint, getSignal, getLastRecord, out string msg);
if (!string.IsNullOrEmpty(msg))
{
LogHelper.Info($"常规实时分析计划任务中,客户标识:{monitor.CorpID},测点标识:{monitor.ID},{msg}!");
continue;
}
}
break;
case Model.Monitor.FormulaType.Calculation_NumericAccumulate:
{
srcValue = MonitorFormulaCalcuHelper.CalcuNumberAccumulate
(analyModel.FormulaParas, getMonitorPoint, getSignal,monitor.Slot.TimeStep, getLastRecord,getCurrentLastRecord, out string msg);
if (!string.IsNullOrEmpty(msg))
{
LogHelper.Info($"常规实时分析计划任务中,客户标识:{monitor.CorpID},测点标识:{monitor.ID},{msg}!");
continue;
}
}
break;
case Model.Monitor.FormulaType.Calculation_EnumAccumulate:
{
srcValue = MonitorFormulaCalcuHelper.CalcuEnumAccumulate
(analyModel.FormulaParas, getMonitorPoint, getSignal,monitor.Slot.TimeStep, getLastRecord,getCurrentLastRecord, out string msg);
if (!string.IsNullOrEmpty(msg))
{
LogHelper.Info($"常规实时分析计划任务中,客户标识:{monitor.CorpID},测点标识:{monitor.ID},{msg}!");
continue;
}
}
break;
case Model.Monitor.FormulaType.Calculation_E:
{
srcValue = MonitorFormulaCalcuHelper.CalcuE(analyModel.FormulaParas, getMonitorPoint, getSignal, getLastRecord, out string msg);
if (!string.IsNullOrEmpty(msg))
{
LogHelper.Info($"常规实时分析计划任务中,客户标识:{monitor.CorpID},测点标识:{monitor.ID},{msg}!");
continue;
}
}
break;
case Model.Monitor.FormulaType.Calculation_WP:
{
srcValue = MonitorFormulaCalcuHelper.CalcuWP(analyModel.FormulaParas, getMonitorPoint, getSignal, getLastRecord, out string msg);
if (!string.IsNullOrEmpty(msg))
{
LogHelper.Info($"常规实时分析计划任务中,客户标识:{monitor.CorpID},测点标识:{monitor.ID},{msg}!");
continue;
}
}
break;
case Model.Monitor.FormulaType.Calculation_UWP:
{
srcValue = MonitorFormulaCalcuHelper.CalcuUWP(analyModel.FormulaParas, getMonitorPoint, getSignal, getLastRecord, out string msg);
if (!string.IsNullOrEmpty(msg))
{
LogHelper.Info($"常规实时分析计划任务中,客户标识:{monitor.CorpID},测点标识:{monitor.ID},{msg}!");
continue;
}
}
break;
default:
{
LogHelper.Error($"常规实时分析计划任务中,分析方法:{analyModel.FormulaType} 暂不支持!");
continue;
}
}
var dataStatus = new List();
var dataValue = MonitorHandleHelper.Handle(monitor, signal, getCurrentLastRecord, DateTime.Now, srcValue.ToString(), dataStatus);
var analyRecord = MonitorHandleHelper.BuildLastRecord(monitor, signal, DateTime.Now, srcValue.ToString(), DateTime.Now, dataValue, dataStatus);
var result = new Service.MonitorRealRecord().InsertLastRecord(analyRecord as Model.MonitorRealRecordPure);
if (result)
{
result = new RabbitMqExChangeHelper().Push(ConfigHelper.RunExchangeName, new List() { analyRecord });
if (!result)
{
LogHelper.Info($"常规实时分析计划任务中,客户标识:{monitor.CorpID},测点标识:{monitor.ID} 数据分析记录推入运行监测通道失败!");
break;
}
LogHelper.Info($"常规实时分析计划任务中,客户标识:{monitor.CorpID},测点标识:{monitor.ID} 数据分析完成!");
}
else
{
LogHelper.Info($"常规实时分析计划任务中,客户标识:{monitor.CorpID},测点标识:{monitor.ID} 数据分析记录保存失败!");
break;
}
}
#endregion
}
catch (Exception ex)
{
LogHelper.Error("常规实时分析计划任务中,执行出错", ex);
var e = new JobExecutionException(ex);
throw e;
}
});
}
}
}