using IStation.Calculation; using Quartz; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace IStation.Server { /// /// 常规周分析计划任务 /// [DisallowConcurrentExecution]//此特性标识 必须等待这次任务执行完成后,才能执行下次任务 public class GeneralWeekAnalyCronJob : IJob { /// /// /// public Task Execute(IJobExecutionContext context) { return Task.Run(() => { try { #region 当前时间 var dtNow = DateTime.Now; #endregion #region 加载目标客户 var corpIds = CorpHelper.GetCorpIds(); if (corpIds == null || corpIds.Count < 1) { LogHelper.Error("常规周分析计划任务中,未检索到目标客户信息"); return; } #endregion #region 加载周分析测点 var monitorList = new Service.MonitorPoint().GetByMonitorTypeAndCronTypeAndSourceType (corpIds, Model.eMonitorType.General, Model.Monitor.eCronType.EachWeek, Model.Monitor.eSourceType.Analyse); if (monitorList == null || monitorList.Count < 1) { LogHelper.Info($"常规周分析计划任务中,未检索到常规周分析测点信息"); return; } monitorList = monitorList.Where(x => x.UseStatus == Model.eUseStatus.Enable).ToList(); if (monitorList.Count < 1) { LogHelper.Info($"常规周分析计划任务中,未检索到有效常规周分析测点信息"); return; } #endregion #region 遍历分析 foreach (var monitor in monitorList) { var signal = new Service.Signal().GetFirstExSignalTypeByMonitorPointID(monitor.CorpID, monitor.ID); if (signal == null) { LogHelper.Error($"常规周分析计划任务中,客户标识:{monitor.CorpID},测点标识:{monitor.ID} 未检索到信号信息!"); continue; } var cronModel = Model.Monitor.WeekSlot.ToModel(monitor.CronParas); if (cronModel == null) { cronModel = new Model.Monitor.WeekSlot(); } var startTime = cronModel.GetStartTime(dtNow); var endTime = cronModel.GetEndTime(dtNow); #region 计算原始值 var getMonitorPoint = new Func(x => new Service.MonitorPoint().GetByID(monitor.CorpID, x)); var getSignal = new Func(x => new Service.Signal().GetFirstExSignalTypeByMonitorPointID(monitor.CorpID, x)); var getRecordList = new Func>((x, y, z) =>{ switch (z) { case Model.Monitor.eCronType.Real: return new Service.MonitorRealRecord().GetFixedBasicContentBySignalIDOfTimeRange(monitor.CorpID, x, y,10000, startTime, endTime); case Model.Monitor.eCronType.EachDay: return new Service.MonitorDayRecord().GetBasicContentBySignalIDOfDayRange(monitor.CorpID,x,y,startTime.Date,endTime.Date.AddDays(-1)); default: return default; } }); var srcValue = MonitorFormulaCalcuHelper.Statistical(monitor.SourceParas, getMonitorPoint, getSignal, getRecordList, out string msg); if (!string.IsNullOrEmpty(msg)) { LogHelper.Error($"常规周分析计划任务中,客户标识:{monitor.CorpID},测点标识:{monitor.ID}, {msg}!"); continue; } #endregion #region 数据处理 var dataStatus = new List(); var dataValue = MonitorHandleHelper.Handle( monitor, signal, () => new Service.MonitorWeekRecord().GetLastNormalRecord(monitor.CorpID, monitor.ID, signal.ID), dtNow, srcValue.ToString(), dataStatus); var analyRecord = MonitorHandleHelper.BuildMonitorRecord(monitor, signal, dtNow, srcValue.ToString(), dtNow, dataValue, dataStatus); var result = new Service.MonitorWeekRecord().InsertLastRecord(analyRecord as Model.MonitorWeekRecordPure); if (result) { result = new RabbitMqExChangeHelper().Push(ConfigHelper.RunExchangeName, new List() { analyRecord }); if (!result) { LogHelper.Error($"常规周分析计划任务中,客户标识:{monitor.CorpID},测点标识:{monitor.ID} 数据分析记录推入运行监测通道失败!"); break; } LogHelper.Error($"常规周分析计划任务中,客户标识:{monitor.CorpID},测点标识:{monitor.ID} 数据分析完成!"); } else { LogHelper.Error($"常规周分析计划任务中,客户标识:{monitor.CorpID},测点标识:{monitor.ID} 数据分析记录保存失败!"); break; } #endregion } #endregion } catch (Exception ex) { LogHelper.Error("常规周分析计划任务中,出错", ex); var e = new JobExecutionException(ex); throw e; } }); } } }