tangxu
2023-04-12 ac2a648ea67669eab6de9a1864c07f6475511dd2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
using Quartz;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using IStation.Calculation;
 
namespace IStation.Server
{
    /// <summary>
    /// 报警中断分析任务
    /// </summary>
    [DisallowConcurrentExecution]//此特性标识 必须等待这次任务执行完成后,才能执行下次任务
    public class AlarmInterruptAnalyJob : IJob 
    {
 
        /// <summary>
        /// 
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public  Task Execute(IJobExecutionContext context)
        {
 
                return Task.Run(() =>
                {
                    try 
                    {
 
                        #region 加载目标客户
 
                        var corpIds = CorpHelper.GetCorpIds();
                        if (corpIds == null || corpIds.Count < 1)
                        {
                            LogHelper.Info("报警中断分析任务中,未检索到目标客户信息");
                            return;
                        }
 
                        #endregion
 
                        #region 加载所有数据中断报警配置
 
                        var configureList = new Service.MonitorAlarmConfigure().GetByCorpIds(corpIds);
                        if (configureList == null || configureList.Count < 1)
                        {
                            LogHelper.Info("报警中断分析任务中,未检索到监测报警配置!");
                            return;
                        }
                        configureList = configureList.Where(x => x.AlarmType == Alarm.Type_Interrupted).ToList();
                        if (configureList.Count < 1)
                        {
                            LogHelper.Info("报警中断分析任务中,未检索到数据中断监测报警配置!");
                            return;
                        }
                        configureList = configureList.Where(x => x.UseStatus == Model.eUseStatus.Enable).ToList();
                        if (configureList.Count < 1)
                        {
                            LogHelper.Info("报警中断分析任务中,未检索到有效数据中断监测报警配置!");
                            return;
                        }
 
                        #endregion
 
                        #region 遍历分析
 
                        var service_record = new Service.MonitorRecord();
                        var service_monitor = new Service.MonitorPoint();
                        var service_signal = new Service.Signal();
                        var service_alarm = new Service.MonitorAlarmRecord();
                        foreach (var configure in configureList)
                        {
                            if (!configure.MonitorPointID.HasValue)
                                continue;
                            if (double.TryParse(configure.ThresholdValue, out double thresholdValue))
                            {
                                var monitor = service_monitor.GetByID(configure.CorpID,configure.MonitorPointID.Value);
                                if (monitor == null)
                                    continue;
                                if (monitor.UseStatus != Model.eUseStatus.Enable)
                                    continue;
                                Model.Signal signal = null;
                                DateTime? lastTime = null;
                                if (!configure.SignalID.HasValue)
                                {
                                    var lastRecordList = service_record.GetLastRecord(configure.CorpID, configure.MonitorPointID.Value);
                                    if (lastRecordList != null && lastRecordList.Count > 0)
                                    {
                                        lastTime = lastRecordList.Max(t => t.DataTime);
                                    }
                                }
                                else
                                {
                                    signal = service_signal.GetByID(configure.CorpID,configure.SignalID.Value);
                                    if (signal == null)
                                        continue;
                                    var lastRecord = service_record.GetLastRecord(configure.CorpID, configure.MonitorPointID.Value, configure.SignalID.Value);
                                    if (lastRecord != null)
                                    {
                                        lastTime = lastRecord.DataTime;
                                    }
                                }
 
                                if (AlarmInterruptAnalyHelper.IsAlarm(configure.CorpID, configure.MonitorPointID.Value, configure.SignalID, lastTime, thresholdValue))
                                {
                                    var alarm = MonitorAlarmCalcuHelper.Create(monitor,signal,configure,null);
                                    var bol = service_alarm.InsertLastRecord(alarm);
                                    if (!bol)
                                    {
                                        LogHelper.Error($"报警中断分析任务中,客户标识:{configure.CorpID},配置标识:{configure.ID},报警记录保存失败!");
                                    }
                                }
                            }                       
                        }
 
                        #endregion
 
                    }
                    catch (Exception ex)
                    {
                        LogHelper.Error("报警中断分析任务出错", ex);
                        var e = new JobExecutionException(ex);
                        throw e;
                    }
 
                });
            
 
        }
 
 
 
 
 
 
    }
}