...
|
...
|
@@ -5,25 +5,18 @@ package org.thingsboard.rule.engine.yunteng.scene; |
5
|
5
|
|
6
|
6
|
import com.fasterxml.jackson.databind.JsonNode;
|
7
|
7
|
import com.fasterxml.jackson.databind.node.ObjectNode;
|
8
|
|
-import com.google.common.util.concurrent.ListenableFuture;
|
9
|
8
|
import lombok.extern.slf4j.Slf4j;
|
10
|
|
-import org.apache.commons.lang3.StringUtils;
|
11
|
9
|
import org.jetbrains.annotations.NotNull;
|
12
|
|
-import org.thingsboard.common.util.DonAsynchron;
|
13
|
|
-import org.thingsboard.rule.engine.action.TbAlarmResult;
|
14
|
10
|
import org.thingsboard.rule.engine.api.TbContext;
|
15
|
11
|
import org.thingsboard.server.common.data.DataConstants;
|
16
|
12
|
import org.thingsboard.server.common.data.alarm.Alarm;
|
17
|
13
|
import org.thingsboard.server.common.data.alarm.AlarmStatus;
|
18
|
|
-import org.thingsboard.server.common.data.device.profile.AlarmCondition;
|
19
|
14
|
import org.thingsboard.server.common.data.device.profile.AlarmConditionFilter;
|
20
|
15
|
import org.thingsboard.server.common.data.device.profile.AlarmConditionFilterKey;
|
21
|
16
|
import org.thingsboard.server.common.data.device.profile.AlarmRule;
|
22
|
17
|
import org.thingsboard.server.common.data.id.DeviceId;
|
23
|
|
-import org.thingsboard.server.common.data.rule.RuleNodeState;
|
24
|
18
|
import org.thingsboard.server.common.data.yunteng.dto.ActionAlarmDTO;
|
25
|
19
|
import org.thingsboard.server.common.data.yunteng.dto.AlarmInfoDTO;
|
26
|
|
-import org.thingsboard.server.common.data.yunteng.dto.DoActionDTO;
|
27
|
20
|
import org.thingsboard.server.common.data.yunteng.dto.TriggerDTO;
|
28
|
21
|
import org.thingsboard.server.common.data.yunteng.enums.ActionTypeEnum;
|
29
|
22
|
import org.thingsboard.server.common.data.yunteng.utils.JacksonUtil;
|
...
|
...
|
@@ -31,13 +24,14 @@ import org.thingsboard.server.common.data.yunteng.utils.SpringBeanUtils; |
31
|
24
|
import org.thingsboard.server.common.msg.TbMsg;
|
32
|
25
|
import org.thingsboard.server.common.msg.TbMsgMetaData;
|
33
|
26
|
import org.thingsboard.server.common.msg.queue.ServiceQueue;
|
34
|
|
-import org.thingsboard.server.dao.alarm.AlarmOperationResult;
|
35
|
27
|
import org.thingsboard.server.dao.yunteng.entities.DoAction;
|
36
|
28
|
import org.thingsboard.server.dao.yunteng.entities.DoCondition;
|
37
|
29
|
import org.thingsboard.server.dao.yunteng.service.*;
|
38
|
30
|
|
39
|
|
-import java.net.InetAddress;
|
40
|
|
-import java.util.*;
|
|
31
|
+import java.util.HashSet;
|
|
32
|
+import java.util.List;
|
|
33
|
+import java.util.Set;
|
|
34
|
+import java.util.UUID;
|
41
|
35
|
import java.util.concurrent.ConcurrentHashMap;
|
42
|
36
|
import java.util.concurrent.ExecutionException;
|
43
|
37
|
|
...
|
...
|
@@ -68,7 +62,7 @@ class ReactState { |
68
|
62
|
* 键:设备ID为键
|
69
|
63
|
* 值:设备最新告警信息
|
70
|
64
|
*/
|
71
|
|
- private ConcurrentHashMap<String, Alarm> currentAlarms =new ConcurrentHashMap<>();
|
|
65
|
+ private ConcurrentHashMap<String, Alarm> currentAlarms = new ConcurrentHashMap<>();
|
72
|
66
|
|
73
|
67
|
/**
|
74
|
68
|
* 场景联动的执行条件状态
|
...
|
...
|
@@ -92,7 +86,6 @@ class ReactState { |
92
|
86
|
private YtDeviceService ytDeviceService;
|
93
|
87
|
|
94
|
88
|
|
95
|
|
-
|
96
|
89
|
ReactState(String reactId, TbContext ctx, TbSceneReactNodeConfig config) {
|
97
|
90
|
this.reactId = reactId;
|
98
|
91
|
this.reactName = config.getNames().get(reactId);
|
...
|
...
|
@@ -102,9 +95,9 @@ class ReactState { |
102
|
95
|
this.conditions = conditionService.getConditions(reactId);
|
103
|
96
|
DoActionService actionService = SpringBeanUtils.getBean(DoActionService.class);
|
104
|
97
|
this.actions = actionService.getActions(reactId);
|
105
|
|
- for(DoAction action: actions){
|
|
98
|
+ for (DoAction action : actions) {
|
106
|
99
|
/**动作中只有1个告警通知*/
|
107
|
|
- if(ActionTypeEnum.MSG_NOTIFY.equals(action.getOutTarget())){
|
|
100
|
+ if (ActionTypeEnum.MSG_NOTIFY.equals(action.getOutTarget())) {
|
108
|
101
|
this.alarmAction = action;
|
109
|
102
|
break;
|
110
|
103
|
}
|
...
|
...
|
@@ -132,10 +125,10 @@ class ReactState { |
132
|
125
|
matched = triggerState.process(ctx, msg);
|
133
|
126
|
if (matched) {
|
134
|
127
|
detail.append(triggerState.getAlarmDetails());
|
135
|
|
- if(this.alarmAction != null){
|
136
|
|
- noticeMsg(ctx, msg, alarmAction,deviceId,triggerState.getAlarmDetails(),triggerState.getLatestValues().getTs());
|
|
128
|
+ if (this.alarmAction != null) {
|
|
129
|
+ noticeMsg(ctx, msg, alarmAction, deviceId, triggerState.getAlarmDetails(), triggerState.getLatestValues().getTs());
|
137
|
130
|
}
|
138
|
|
- }else if(currentAlarms.containsKey(deviceId) && this.alarmAction != null){
|
|
131
|
+ } else if (currentAlarms.containsKey(deviceId) && this.alarmAction != null) {
|
139
|
132
|
//清除设备告警
|
140
|
133
|
clearAlarm(ctx, msg, deviceId);
|
141
|
134
|
}
|
...
|
...
|
@@ -169,10 +162,10 @@ class ReactState { |
169
|
162
|
|
170
|
163
|
if (matched) {
|
171
|
164
|
for (DoAction item : actions) {
|
172
|
|
- if(ActionTypeEnum.MSG_NOTIFY.equals(item.getOutTarget())){
|
|
165
|
+ if (ActionTypeEnum.MSG_NOTIFY.equals(item.getOutTarget())) {
|
173
|
166
|
continue;
|
174
|
167
|
}
|
175
|
|
- pushMsg(ctx, msg, item,detail.toString());
|
|
168
|
+ pushMsg(ctx, msg, item, detail.toString());
|
176
|
169
|
}
|
177
|
170
|
} else {
|
178
|
171
|
ctx.tellSuccess(msg);
|
...
|
...
|
@@ -201,9 +194,9 @@ class ReactState { |
201
|
194
|
return triggerState.get(deviceId);
|
202
|
195
|
}
|
203
|
196
|
if (alarmAction.getDeviceId().contains(deviceId)) {
|
204
|
|
- ActionAlarmDTO alarm = JacksonUtil.convertValue(alarmAction.getDoContext(),ActionAlarmDTO.class);
|
205
|
|
- if(alarm != null && alarm.getClearRule()!=null){
|
206
|
|
- TriggerState state = createTriggerState(deviceId, alarm.getClearRule());
|
|
197
|
+ ActionAlarmDTO alarm = JacksonUtil.convertValue(alarmAction.getDoContext(), ActionAlarmDTO.class);
|
|
198
|
+ if (alarm != null && alarm.getClearRule() != null) {
|
|
199
|
+ TriggerState state = createTriggerState(deviceId, alarm.getClearRule().getTriggerCondition());
|
207
|
200
|
triggerState.put(deviceId, state);
|
208
|
201
|
return state;
|
209
|
202
|
}
|
...
|
...
|
@@ -230,12 +223,12 @@ class ReactState { |
230
|
223
|
for (AlarmConditionFilter filter : rule.getCondition().getCondition()) {
|
231
|
224
|
filterKeys.add(filter.getKey());
|
232
|
225
|
}
|
233
|
|
- TriggerState state = new TriggerState(deviceId, rule, filterKeys, rule.getAlarmDetails(),null);
|
|
226
|
+ TriggerState state = new TriggerState(deviceId, rule, filterKeys, rule.getAlarmDetails(), null);
|
234
|
227
|
|
235
|
228
|
return state;
|
236
|
229
|
}
|
237
|
230
|
|
238
|
|
- private void pushMsg(TbContext ctx, TbMsg msg, DoAction action,String detail) {
|
|
231
|
+ private void pushMsg(TbContext ctx, TbMsg msg, DoAction action, String detail) {
|
239
|
232
|
TbMsgMetaData metaData = //lastMsgMetaData != null ? lastMsgMetaData.copy() :
|
240
|
233
|
new TbMsgMetaData();
|
241
|
234
|
String relationType = "";
|
...
|
...
|
@@ -282,10 +275,10 @@ class ReactState { |
282
|
275
|
* @param msg
|
283
|
276
|
* @param action
|
284
|
277
|
*/
|
285
|
|
- private void noticeMsg(TbContext ctx, TbMsg msg, DoAction action,String deviceId,String detailStr,long startTs) {
|
|
278
|
+ private void noticeMsg(TbContext ctx, TbMsg msg, DoAction action, String deviceId, String detailStr, long startTs) {
|
286
|
279
|
|
287
|
280
|
DeviceId entityId = new DeviceId(UUID.fromString(deviceId));
|
288
|
|
- ActionAlarmDTO actionAlarm = JacksonUtil.convertValue(action.getDoContext(),ActionAlarmDTO.class);
|
|
281
|
+ ActionAlarmDTO actionAlarm = JacksonUtil.convertValue(action.getDoContext(), ActionAlarmDTO.class);
|
289
|
282
|
|
290
|
283
|
|
291
|
284
|
Alarm currentAlarm = new Alarm();
|
...
|
...
|
@@ -298,8 +291,8 @@ class ReactState { |
298
|
291
|
currentAlarm.setStartTs(startTs);
|
299
|
292
|
currentAlarm.setEndTs(currentAlarm.getStartTs());
|
300
|
293
|
ObjectNode detailData = JacksonUtil.newObjectNode();
|
301
|
|
- detailData.put("msg",detailStr);
|
302
|
|
- detailData.put("data",JacksonUtil.toJsonNode(msg.getData()));
|
|
294
|
+ detailData.put("msg", detailStr);
|
|
295
|
+ detailData.put("data", JacksonUtil.toJsonNode(msg.getData()));
|
303
|
296
|
currentAlarm.setDetails(detailData);
|
304
|
297
|
currentAlarm.setOriginator(entityId);
|
305
|
298
|
currentAlarm.setTenantId(ctx.getTenantId());
|
...
|
...
|
@@ -307,8 +300,7 @@ class ReactState { |
307
|
300
|
|
308
|
301
|
currentAlarm = ctx.getAlarmService().createOrUpdateAlarm(currentAlarm);
|
309
|
302
|
ytDeviceService.freshAlarmStatus(entityId, 1);
|
310
|
|
- currentAlarms.put(deviceId,currentAlarm);
|
311
|
|
-
|
|
303
|
+ currentAlarms.put(deviceId, currentAlarm);
|
312
|
304
|
|
313
|
305
|
|
314
|
306
|
AlarmInfoDTO formData = new AlarmInfoDTO();
|
...
|
...
|
@@ -322,12 +314,12 @@ class ReactState { |
322
|
314
|
formData.setDeviceId(deviceId);
|
323
|
315
|
formData.setTenantId(currentAlarm.getTenantId().getId().toString());
|
324
|
316
|
formData.setSeverity(actionAlarm.getAlarmLevel().name());
|
325
|
|
- noticeService.alert(action.getAlarmProfileId(),formData);
|
|
317
|
+ noticeService.alert(action.getAlarmProfileId(), formData);
|
326
|
318
|
}
|
327
|
319
|
|
328
|
|
- private void clearAlarm(TbContext ctx, TbMsg msg,String deviceId) throws ExecutionException, InterruptedException {
|
329
|
|
- TriggerState clearStete = getOrCreateClearState(deviceId);
|
330
|
|
- if(clearStete.process(ctx, msg)){
|
|
320
|
+ private void clearAlarm(TbContext ctx, TbMsg msg, String deviceId) throws ExecutionException, InterruptedException {
|
|
321
|
+ TriggerState clearState = getOrCreateClearState(deviceId);
|
|
322
|
+ if (clearState.process(ctx, msg)) {
|
331
|
323
|
ctx.getAlarmService().clearAlarmForResult(ctx.getTenantId(), currentAlarms.get(deviceId).getId(), null, System.currentTimeMillis());
|
332
|
324
|
ytDeviceService.freshAlarmStatus(new DeviceId(UUID.fromString(deviceId)), 0);
|
333
|
325
|
currentAlarms.remove(deviceId);
|
...
|
...
|
|