...
|
...
|
@@ -27,421 +27,418 @@ import org.thingsboard.server.dao.yunteng.service.*; |
27
|
27
|
import java.util.*;
|
28
|
28
|
import java.util.stream.Collectors;
|
29
|
29
|
|
30
|
|
-/** @Description 场景联动业务实现层 @Author cxy @Date 2021/11/25 11:22 */
|
|
30
|
+/**
|
|
31
|
+ * @Description 场景联动业务实现层 @Author cxy @Date 2021/11/25 11:22
|
|
32
|
+ */
|
31
|
33
|
@Service
|
32
|
34
|
@RequiredArgsConstructor
|
33
|
35
|
public class SceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageMapper, SceneLinkage>
|
34
|
|
- implements SceneLinkageService {
|
35
|
|
-
|
36
|
|
- private final SceneLinkageMapper sceneLinkageMapper;
|
37
|
|
- private final DeviceMapper deviceMapper;
|
38
|
|
- private final DoActionMapper doActionMapper;
|
39
|
|
- private final DoConditionMapper doConditionMapper;
|
40
|
|
- private final TriggerMapper triggerMapper;
|
41
|
|
- private final OrganizationMapper organizationMapper;
|
42
|
|
- private final TriggerService triggerService;
|
43
|
|
- private final DoConditionService doConditionService;
|
44
|
|
- private final DoActionService doActionService;
|
45
|
|
- private final UserMapper userMapper;
|
46
|
|
- private final UserOrganizationMappingService userOrganizationMappingService;
|
47
|
|
- /**
|
48
|
|
- * 增加场景联动,触发器可以多个,执行条件可以多个,执行动作可以多个
|
49
|
|
- *
|
50
|
|
- * @param sceneLinkageDTO 场景对象
|
51
|
|
- * @return SceneLinkageDTO 场景
|
52
|
|
- */
|
53
|
|
- @Override
|
54
|
|
- @Transactional
|
55
|
|
- public SceneLinkageDTO saveSceneLinkage(SceneLinkageDTO sceneLinkageDTO, String tenantId) {
|
56
|
|
- sceneLinkageDTO.setTenantId(tenantId);
|
57
|
|
- // 第一步保存场景,获取场景ID
|
58
|
|
- // 场景对象
|
59
|
|
- SceneLinkage sceneLinkage = sceneLinkageDTO.getEntity(SceneLinkage.class);
|
60
|
|
- // 新增
|
61
|
|
- int insert = sceneLinkageMapper.insert(sceneLinkage);
|
62
|
|
- if (insert > 0) {
|
63
|
|
- sceneLinkage.copyToDTO(sceneLinkageDTO);
|
64
|
|
- }
|
|
36
|
+ implements SceneLinkageService {
|
|
37
|
+
|
|
38
|
+ private final SceneLinkageMapper sceneLinkageMapper;
|
|
39
|
+ private final DeviceMapper deviceMapper;
|
|
40
|
+ private final DoActionMapper doActionMapper;
|
|
41
|
+ private final DoConditionMapper doConditionMapper;
|
|
42
|
+ private final TriggerMapper triggerMapper;
|
|
43
|
+ private final OrganizationMapper organizationMapper;
|
|
44
|
+ private final TriggerService triggerService;
|
|
45
|
+ private final DoConditionService doConditionService;
|
|
46
|
+ private final DoActionService doActionService;
|
|
47
|
+ private final UserMapper userMapper;
|
|
48
|
+ private final UserOrganizationMappingService userOrganizationMappingService;
|
|
49
|
+
|
|
50
|
+ /**
|
|
51
|
+ * 增加场景联动,触发器可以多个,执行条件可以多个,执行动作可以多个
|
|
52
|
+ *
|
|
53
|
+ * @param sceneLinkageDTO 场景对象
|
|
54
|
+ * @return SceneLinkageDTO 场景
|
|
55
|
+ */
|
|
56
|
+ @Override
|
|
57
|
+ @Transactional
|
|
58
|
+ public SceneLinkageDTO saveSceneLinkage(SceneLinkageDTO sceneLinkageDTO, String tenantId,boolean tenantAdmin,String currentUserId) {
|
|
59
|
+ sceneLinkageDTO.setTenantId(tenantId);
|
|
60
|
+ // 第一步保存场景,获取场景ID
|
|
61
|
+ // 场景对象
|
|
62
|
+ SceneLinkage sceneLinkage = sceneLinkageDTO.getEntity(SceneLinkage.class);
|
|
63
|
+ // 新增
|
|
64
|
+ int insert = sceneLinkageMapper.insert(sceneLinkage);
|
|
65
|
+ if (insert > 0) {
|
|
66
|
+ sceneLinkage.copyToDTO(sceneLinkageDTO);
|
|
67
|
+ }
|
65
|
68
|
|
66
|
|
- String organizationId = sceneLinkage.getOrganizationId();
|
67
|
|
- List<YtDevice> organizationDevices =
|
68
|
|
- deviceMapper.selectList(
|
69
|
|
- new QueryWrapper<YtDevice>()
|
70
|
|
- .lambda()
|
71
|
|
- .eq(YtDevice::getTenantId,sceneLinkage.getTenantId())
|
72
|
|
- .eq(StringUtils.isNoneBlank(organizationId),YtDevice::getOrganizationId,organizationId)
|
73
|
|
- );
|
74
|
|
- List<String> tbDeviceIds = new ArrayList<>();
|
75
|
|
- for(YtDevice item:organizationDevices){
|
76
|
|
- tbDeviceIds.add(item.getTbDeviceId());
|
77
|
|
- }
|
|
69
|
+ String organizationId = sceneLinkage.getOrganizationId();
|
|
70
|
+ List<DeviceDTO> organizationDevices = findDeviceList(organizationId,tenantAdmin,tenantId,currentUserId);
|
|
71
|
+
|
|
72
|
+ List<String> tbDeviceIds = new ArrayList<>();
|
|
73
|
+ for (DeviceDTO item : organizationDevices) {
|
|
74
|
+ tbDeviceIds.add(item.getTbDeviceId());
|
|
75
|
+ }
|
|
76
|
+
|
|
77
|
+ updateTrigger(sceneLinkageDTO, tbDeviceIds);
|
|
78
|
+ updateDoCondition(sceneLinkageDTO, tbDeviceIds);
|
|
79
|
+ updateDoAction(sceneLinkageDTO, tbDeviceIds);
|
78
|
80
|
|
79
|
|
- updateTrigger(sceneLinkageDTO,tbDeviceIds);
|
80
|
|
- updateDoCondition(sceneLinkageDTO,tbDeviceIds);
|
81
|
|
- updateDoAction(sceneLinkageDTO,tbDeviceIds);
|
82
|
|
-
|
83
|
|
-
|
84
|
|
-
|
85
|
|
-
|
86
|
|
-
|
87
|
|
-
|
88
|
|
-
|
89
|
|
- return sceneLinkageDTO;
|
90
|
|
- }
|
91
|
|
-
|
92
|
|
- /**
|
93
|
|
- * byId删除场景联动
|
94
|
|
- *
|
95
|
|
- * @param ids 删除的ids
|
96
|
|
- */
|
97
|
|
- @Override
|
98
|
|
- public void deleteSceneLinkage(Set<String> ids, String tenantId) {
|
99
|
|
- // 删除场景,一并删除数据库触发器,执行条件,执行动作的数据
|
100
|
|
- triggerMapper.delete(
|
101
|
|
- new LambdaQueryWrapper<Trigger>()
|
102
|
|
- .eq(Trigger::getTenantId, tenantId)
|
103
|
|
- .in(Trigger::getSceneLinkageId, ids));
|
104
|
|
- doConditionMapper.delete(
|
105
|
|
- new LambdaQueryWrapper<DoCondition>()
|
106
|
|
- .eq(DoCondition::getTenantId, tenantId)
|
107
|
|
- .in(DoCondition::getSceneLinkageId, ids));
|
108
|
|
- doActionMapper.delete(
|
109
|
|
- new LambdaQueryWrapper<DoAction>()
|
110
|
|
- .eq(DoAction::getTenantId, tenantId)
|
111
|
|
- .in(DoAction::getSceneLinkageId, ids));
|
112
|
|
- LambdaQueryWrapper<SceneLinkage> Wrapper =
|
113
|
|
- new QueryWrapper<SceneLinkage>()
|
114
|
|
- .lambda()
|
115
|
|
- .eq(SceneLinkage::getTenantId, tenantId)
|
116
|
|
- .in(SceneLinkage::getId, ids);
|
117
|
|
- sceneLinkageMapper.delete(Wrapper);
|
118
|
|
- }
|
119
|
|
- /**
|
120
|
|
- * 修改场景联动和包含的触发器,执行条件,执行动作
|
121
|
|
- *
|
122
|
|
- * @param sceneLinkageDTO 场景
|
123
|
|
- * @return SceneLinkageDTO 场景
|
124
|
|
- */
|
125
|
|
- @Override
|
126
|
|
- @Transactional
|
127
|
|
- public SceneLinkageDTO updateSceneLinkage(SceneLinkageDTO sceneLinkageDTO, String tenantId) {
|
128
|
|
- // 获取场景
|
129
|
|
- SceneLinkage sceneLinkage = baseMapper.selectById(sceneLinkageDTO.getId());
|
130
|
|
- if (sceneLinkage == null) {
|
131
|
|
- throw new YtDataValidationException("此场景已不存在");
|
|
81
|
+
|
|
82
|
+ return sceneLinkageDTO;
|
132
|
83
|
}
|
133
|
|
- String organizationId = sceneLinkage.getOrganizationId();
|
134
|
|
- List<YtDevice> organizationDevices =
|
135
|
|
- deviceMapper.selectList(
|
136
|
|
- new QueryWrapper<YtDevice>()
|
137
|
|
- .lambda()
|
138
|
|
- .eq(YtDevice::getTenantId,sceneLinkage.getTenantId())
|
139
|
|
- .eq(StringUtils.isNoneBlank(organizationId),YtDevice::getOrganizationId,organizationId)
|
140
|
|
- );
|
141
|
|
- List<String> tbDeviceIds = new ArrayList<>();
|
142
|
|
- for(YtDevice item:organizationDevices){
|
143
|
|
- tbDeviceIds.add(item.getTbDeviceId());
|
|
84
|
+
|
|
85
|
+ /**
|
|
86
|
+ * byId删除场景联动
|
|
87
|
+ *
|
|
88
|
+ * @param ids 删除的ids
|
|
89
|
+ */
|
|
90
|
+ @Override
|
|
91
|
+ public void deleteSceneLinkage(Set<String> ids, String tenantId) {
|
|
92
|
+ // 删除场景,一并删除数据库触发器,执行条件,执行动作的数据
|
|
93
|
+ triggerMapper.delete(
|
|
94
|
+ new LambdaQueryWrapper<Trigger>()
|
|
95
|
+ .eq(Trigger::getTenantId, tenantId)
|
|
96
|
+ .in(Trigger::getSceneLinkageId, ids));
|
|
97
|
+ doConditionMapper.delete(
|
|
98
|
+ new LambdaQueryWrapper<DoCondition>()
|
|
99
|
+ .eq(DoCondition::getTenantId, tenantId)
|
|
100
|
+ .in(DoCondition::getSceneLinkageId, ids));
|
|
101
|
+ doActionMapper.delete(
|
|
102
|
+ new LambdaQueryWrapper<DoAction>()
|
|
103
|
+ .eq(DoAction::getTenantId, tenantId)
|
|
104
|
+ .in(DoAction::getSceneLinkageId, ids));
|
|
105
|
+ LambdaQueryWrapper<SceneLinkage> Wrapper =
|
|
106
|
+ new QueryWrapper<SceneLinkage>()
|
|
107
|
+ .lambda()
|
|
108
|
+ .eq(SceneLinkage::getTenantId, tenantId)
|
|
109
|
+ .in(SceneLinkage::getId, ids);
|
|
110
|
+ sceneLinkageMapper.delete(Wrapper);
|
144
|
111
|
}
|
145
|
112
|
|
146
|
|
- updateTrigger(sceneLinkageDTO,tbDeviceIds);
|
147
|
|
- updateDoCondition(sceneLinkageDTO,tbDeviceIds);
|
148
|
|
- updateDoAction(sceneLinkageDTO,tbDeviceIds);
|
149
|
|
-
|
150
|
|
- sceneLinkageDTO.copyToEntity(sceneLinkage);
|
151
|
|
- sceneLinkage.setTenantId(tenantId);
|
152
|
|
- sceneLinkageMapper.updateById(sceneLinkage);
|
153
|
|
- return sceneLinkage.getDTO(SceneLinkageDTO.class);
|
154
|
|
- }
|
155
|
|
- /**
|
156
|
|
- * 修改触发器
|
157
|
|
- *
|
158
|
|
- * @param sceneLinkage 场景联动信息
|
159
|
|
- * @param tbDeviceIds 场景联动所属组织设备主键集合
|
160
|
|
- */
|
161
|
|
- private void updateTrigger(SceneLinkageDTO sceneLinkage,List<String> tbDeviceIds) {
|
162
|
|
- List<TriggerDTO> triggerDTOS = sceneLinkage.getTriggers();
|
163
|
|
- if (triggerDTOS != null && !triggerDTOS.isEmpty()) {
|
164
|
|
- for (TriggerDTO triggerDTO : triggerDTOS) {
|
165
|
|
- String deviceId = triggerDTO.getEntityId();
|
166
|
|
- if (!TriggerTypeEnum.DEVICE_TRIGGER.equals(triggerDTO.getTriggerType())) {
|
167
|
|
- continue;
|
|
113
|
+ /**
|
|
114
|
+ * 修改场景联动和包含的触发器,执行条件,执行动作
|
|
115
|
+ *
|
|
116
|
+ * @param sceneLinkageDTO 场景
|
|
117
|
+ * @return SceneLinkageDTO 场景
|
|
118
|
+ */
|
|
119
|
+ @Override
|
|
120
|
+ @Transactional
|
|
121
|
+ public SceneLinkageDTO updateSceneLinkage(SceneLinkageDTO sceneLinkageDTO, String tenantId,boolean tenantAdmin ,String currentUserId) {
|
|
122
|
+ // 获取场景
|
|
123
|
+ SceneLinkage sceneLinkage = baseMapper.selectById(sceneLinkageDTO.getId());
|
|
124
|
+ if (sceneLinkage == null) {
|
|
125
|
+ throw new YtDataValidationException("此场景已不存在");
|
168
|
126
|
}
|
169
|
|
- if (!tbDeviceIds.contains(deviceId)) {
|
170
|
|
- throw new DataValidationException("in trigger ,this device not belong this org");
|
|
127
|
+ String organizationId = sceneLinkage.getOrganizationId();
|
|
128
|
+ List<DeviceDTO> organizationDevices = findDeviceList(organizationId,tenantAdmin,tenantId,currentUserId);
|
|
129
|
+
|
|
130
|
+ List<String> tbDeviceIds = new ArrayList<>();
|
|
131
|
+ for (DeviceDTO item : organizationDevices) {
|
|
132
|
+ tbDeviceIds.add(item.getTbDeviceId());
|
171
|
133
|
}
|
172
|
|
- }
|
173
|
|
- }else{
|
174
|
|
- return;
|
|
134
|
+
|
|
135
|
+ updateTrigger(sceneLinkageDTO, tbDeviceIds);
|
|
136
|
+ updateDoCondition(sceneLinkageDTO, tbDeviceIds);
|
|
137
|
+ updateDoAction(sceneLinkageDTO, tbDeviceIds);
|
|
138
|
+
|
|
139
|
+ sceneLinkageDTO.copyToEntity(sceneLinkage);
|
|
140
|
+ sceneLinkage.setTenantId(tenantId);
|
|
141
|
+ sceneLinkageMapper.updateById(sceneLinkage);
|
|
142
|
+ return sceneLinkage.getDTO(SceneLinkageDTO.class);
|
175
|
143
|
}
|
176
|
144
|
|
177
|
|
- // 先删除触发器
|
178
|
|
- triggerMapper.delete(
|
179
|
|
- new QueryWrapper<Trigger>()
|
180
|
|
- .lambda()
|
181
|
|
- .eq(StringUtils.isNoneBlank(sceneLinkage.getId()),Trigger::getSceneLinkageId,sceneLinkage.getId()));
|
182
|
|
-
|
183
|
|
-
|
184
|
|
- // 如果获取的触发器不为空,进行添加操作
|
185
|
|
- List<Trigger> triggers =
|
186
|
|
- triggerDTOS.stream()
|
187
|
|
- .map(triggerDTO -> {
|
188
|
|
- triggerDTO.setTenantId(sceneLinkage.getTenantId());
|
189
|
|
- triggerDTO.setSceneLinkageId(sceneLinkage.getId());
|
190
|
|
- return triggerDTO.getEntity(Trigger.class);
|
191
|
|
- })
|
192
|
|
- .collect(Collectors.toList());
|
193
|
|
- triggerService.insertBatch(triggers, 1000);
|
194
|
|
- }
|
195
|
|
- /**
|
196
|
|
- * 修改执行动作
|
197
|
|
- *
|
198
|
|
- * @param sceneLinkageDTO 场景联动信息
|
199
|
|
- * @param tbDeviceIds 场景联动所属组织设备主键集合
|
200
|
|
- */
|
201
|
|
- private void updateDoAction(SceneLinkageDTO sceneLinkageDTO,List<String> tbDeviceIds) {
|
202
|
|
- List<DoActionDTO> actionDTOS = sceneLinkageDTO.getDoActions();
|
203
|
|
- if (actionDTOS != null && !actionDTOS.isEmpty()) {
|
204
|
|
- for (DoActionDTO item : actionDTOS) {
|
205
|
|
- String deviceId = item.getDeviceId();
|
206
|
|
- if (!ActionTypeEnum.DEVICE_OUT.equals(item.getOutTarget())) {
|
207
|
|
- continue;
|
208
|
|
- }
|
209
|
|
- if (!tbDeviceIds.contains(deviceId)) {
|
210
|
|
- throw new DataValidationException("in action ,this device not belong this org ");
|
|
145
|
+ /**
|
|
146
|
+ * 修改触发器
|
|
147
|
+ *
|
|
148
|
+ * @param sceneLinkage 场景联动信息
|
|
149
|
+ * @param tbDeviceIds 场景联动所属组织设备主键集合
|
|
150
|
+ */
|
|
151
|
+ private void updateTrigger(SceneLinkageDTO sceneLinkage, List<String> tbDeviceIds) {
|
|
152
|
+ List<TriggerDTO> triggerDTOS = sceneLinkage.getTriggers();
|
|
153
|
+ if (triggerDTOS != null && !triggerDTOS.isEmpty()) {
|
|
154
|
+ for (TriggerDTO triggerDTO : triggerDTOS) {
|
|
155
|
+ String deviceId = triggerDTO.getEntityId();
|
|
156
|
+ if (!TriggerTypeEnum.DEVICE_TRIGGER.equals(triggerDTO.getTriggerType())) {
|
|
157
|
+ continue;
|
|
158
|
+ }
|
|
159
|
+ if (!tbDeviceIds.contains(deviceId)) {
|
|
160
|
+ throw new DataValidationException("in trigger ,this device not belong this org");
|
|
161
|
+ }
|
|
162
|
+ }
|
|
163
|
+ } else {
|
|
164
|
+ return;
|
211
|
165
|
}
|
212
|
|
- }
|
|
166
|
+
|
|
167
|
+ // 先删除触发器
|
|
168
|
+ triggerMapper.delete(
|
|
169
|
+ new QueryWrapper<Trigger>()
|
|
170
|
+ .lambda()
|
|
171
|
+ .eq(StringUtils.isNoneBlank(sceneLinkage.getId()), Trigger::getSceneLinkageId, sceneLinkage.getId()));
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+ // 如果获取的触发器不为空,进行添加操作
|
|
175
|
+ List<Trigger> triggers =
|
|
176
|
+ triggerDTOS.stream()
|
|
177
|
+ .map(triggerDTO -> {
|
|
178
|
+ triggerDTO.setTenantId(sceneLinkage.getTenantId());
|
|
179
|
+ triggerDTO.setSceneLinkageId(sceneLinkage.getId());
|
|
180
|
+ return triggerDTO.getEntity(Trigger.class);
|
|
181
|
+ })
|
|
182
|
+ .collect(Collectors.toList());
|
|
183
|
+ triggerService.insertBatch(triggers, 1000);
|
213
|
184
|
}
|
214
|
185
|
|
215
|
|
- doActionMapper.delete(
|
216
|
|
- new QueryWrapper<DoAction>()
|
217
|
|
- .lambda()
|
218
|
|
- .eq(StringUtils.isNoneBlank(sceneLinkageDTO.getId()), DoAction::getSceneLinkageId,sceneLinkageDTO.getId()));
|
|
186
|
+ /**
|
|
187
|
+ * 修改执行动作
|
|
188
|
+ *
|
|
189
|
+ * @param sceneLinkageDTO 场景联动信息
|
|
190
|
+ * @param tbDeviceIds 场景联动所属组织设备主键集合
|
|
191
|
+ */
|
|
192
|
+ private void updateDoAction(SceneLinkageDTO sceneLinkageDTO, List<String> tbDeviceIds) {
|
|
193
|
+ List<DoActionDTO> actionDTOS = sceneLinkageDTO.getDoActions();
|
|
194
|
+ if (actionDTOS != null && !actionDTOS.isEmpty()) {
|
|
195
|
+ for (DoActionDTO item : actionDTOS) {
|
|
196
|
+ String deviceId = item.getDeviceId();
|
|
197
|
+ if (!ActionTypeEnum.DEVICE_OUT.equals(item.getOutTarget())) {
|
|
198
|
+ continue;
|
|
199
|
+ }
|
|
200
|
+ if (!tbDeviceIds.contains(deviceId)) {
|
|
201
|
+ throw new DataValidationException("in action ,this device not belong this org ");
|
|
202
|
+ }
|
|
203
|
+ }
|
|
204
|
+ }
|
219
|
205
|
|
|
206
|
+ doActionMapper.delete(
|
|
207
|
+ new QueryWrapper<DoAction>()
|
|
208
|
+ .lambda()
|
|
209
|
+ .eq(StringUtils.isNoneBlank(sceneLinkageDTO.getId()), DoAction::getSceneLinkageId, sceneLinkageDTO.getId()));
|
220
|
210
|
|
221
|
211
|
|
222
|
|
- List<DoAction> collectA =
|
223
|
|
- sceneLinkageDTO.getDoActions().stream()
|
224
|
|
- .map(doActionDTO -> {
|
225
|
|
- doActionDTO.setTenantId(sceneLinkageDTO.getTenantId());
|
226
|
|
- doActionDTO.setSceneLinkageId(sceneLinkageDTO.getId());
|
227
|
|
- return doActionDTO.getEntity(DoAction.class);
|
228
|
|
- })
|
229
|
|
- .collect(Collectors.toList());
|
230
|
|
- doActionService.insertBatch(collectA, 1000);
|
|
212
|
+ List<DoAction> collectA =
|
|
213
|
+ sceneLinkageDTO.getDoActions().stream()
|
|
214
|
+ .map(doActionDTO -> {
|
|
215
|
+ doActionDTO.setTenantId(sceneLinkageDTO.getTenantId());
|
|
216
|
+ doActionDTO.setSceneLinkageId(sceneLinkageDTO.getId());
|
|
217
|
+ return doActionDTO.getEntity(DoAction.class);
|
|
218
|
+ })
|
|
219
|
+ .collect(Collectors.toList());
|
|
220
|
+ doActionService.insertBatch(collectA, 1000);
|
231
|
221
|
|
232
|
222
|
|
|
223
|
+ }
|
|
224
|
+
|
|
225
|
+ /**
|
|
226
|
+ * 修改执行动作
|
|
227
|
+ *
|
|
228
|
+ * @param sceneLinkageDTO 场景联动信息
|
|
229
|
+ * @param tbDeviceIds 场景联动所属组织设备主键集合
|
|
230
|
+ */
|
|
231
|
+ private void updateDoCondition(SceneLinkageDTO sceneLinkageDTO, List<String> tbDeviceIds) {
|
|
232
|
+ List<DoConditionDTO> conditionDTOS = sceneLinkageDTO.getDoConditions();
|
|
233
|
+ if (conditionDTOS != null && !conditionDTOS.isEmpty()) {
|
|
234
|
+ for (DoConditionDTO item : conditionDTOS) {
|
|
235
|
+ String deviceId = item.getEntityId();
|
|
236
|
+ if (!TriggerTypeEnum.DEVICE_TRIGGER.equals(item.getTriggerType())) {
|
|
237
|
+ continue;
|
|
238
|
+ }
|
|
239
|
+ if (!tbDeviceIds.contains(deviceId)) {
|
|
240
|
+ throw new DataValidationException("in condition ,this device not belong this org");
|
|
241
|
+ }
|
|
242
|
+ }
|
|
243
|
+ }
|
|
244
|
+
|
|
245
|
+ doConditionMapper.delete(
|
|
246
|
+ new QueryWrapper<DoCondition>()
|
|
247
|
+ .lambda()
|
|
248
|
+ .eq(StringUtils.isNoneBlank(sceneLinkageDTO.getId()), DoCondition::getSceneLinkageId, sceneLinkageDTO.getId()));
|
233
|
249
|
|
234
|
|
- }
|
235
|
250
|
|
236
|
|
- /**
|
237
|
|
- * 修改执行动作
|
238
|
|
- *
|
239
|
|
- * @param sceneLinkageDTO 场景联动信息
|
240
|
|
- * @param tbDeviceIds 场景联动所属组织设备主键集合
|
241
|
|
- */
|
242
|
|
- private void updateDoCondition(SceneLinkageDTO sceneLinkageDTO,List<String> tbDeviceIds) {
|
243
|
|
- List<DoConditionDTO> conditionDTOS = sceneLinkageDTO.getDoConditions();
|
244
|
|
- if (conditionDTOS != null && !conditionDTOS.isEmpty()) {
|
245
|
|
- for (DoConditionDTO item : conditionDTOS) {
|
246
|
|
- String deviceId = item.getEntityId();
|
247
|
|
- if (!TriggerTypeEnum.DEVICE_TRIGGER.equals(item.getTriggerType())) {
|
248
|
|
- continue;
|
|
251
|
+ // 4.批量新增执行条件
|
|
252
|
+ List<DoCondition> collectC =
|
|
253
|
+ sceneLinkageDTO.getDoConditions().stream()
|
|
254
|
+ .map(doConditionDTO -> {
|
|
255
|
+
|
|
256
|
+ doConditionDTO.setTenantId(sceneLinkageDTO.getTenantId());
|
|
257
|
+ doConditionDTO.setSceneLinkageId(sceneLinkageDTO.getId());
|
|
258
|
+ return doConditionDTO.getEntity(DoCondition.class);
|
|
259
|
+ }
|
|
260
|
+ )
|
|
261
|
+ .collect(Collectors.toList());
|
|
262
|
+ doConditionService.insertBatch(collectC, 1000);
|
|
263
|
+ }
|
|
264
|
+
|
|
265
|
+ /**
|
|
266
|
+ * 通过分页查询
|
|
267
|
+ *
|
|
268
|
+ * @param queryMap 封装参数
|
|
269
|
+ * @return SceneLinkageDTO 场景对象
|
|
270
|
+ */
|
|
271
|
+ @Override
|
|
272
|
+ public YtPageData<SceneLinkageDTO> page(Map<String, Object> queryMap, String tenantId, boolean isCustomerUser) {
|
|
273
|
+ queryMap.put("tenantId", tenantId);
|
|
274
|
+ // 拿到传入的组织id
|
|
275
|
+ String organizationId = (String) queryMap.get("organizationId");
|
|
276
|
+ // 不为空
|
|
277
|
+ if (null != organizationId && !StringUtils.isEmpty(organizationId)) {
|
|
278
|
+ queryMap.put("organizationIds", getQueryOrganizationIds(tenantId, Arrays.asList(organizationId)));
|
249
|
279
|
}
|
250
|
|
- if (!tbDeviceIds.contains(deviceId)) {
|
251
|
|
- throw new DataValidationException("in condition ,this device not belong this org");
|
|
280
|
+ if (null == organizationId && isCustomerUser) {
|
|
281
|
+ String currentUserId = (String) queryMap.get("currentUser");
|
|
282
|
+ List<String> ids = userOrganizationMappingService.getOrganizationIdsByUserId(currentUserId);
|
|
283
|
+ queryMap.put("organizationIds", getQueryOrganizationIds(tenantId, ids));
|
252
|
284
|
}
|
253
|
|
- }
|
|
285
|
+ IPage<SceneLinkage> page = getPage(queryMap, FastIotConstants.DefaultOrder.CREATE_TIME, false);
|
|
286
|
+ IPage<SceneLinkageDTO> scenePage = baseMapper.getScenePage(page, queryMap);
|
|
287
|
+ return getPageData(scenePage, SceneLinkageDTO.class);
|
254
|
288
|
}
|
255
|
289
|
|
256
|
|
- doConditionMapper.delete(
|
257
|
|
- new QueryWrapper<DoCondition>()
|
258
|
|
- .lambda()
|
259
|
|
- .eq(StringUtils.isNoneBlank(sceneLinkageDTO.getId()),DoCondition::getSceneLinkageId,sceneLinkageDTO.getId()));
|
260
|
|
-
|
261
|
|
-
|
262
|
|
- // 4.批量新增执行条件
|
263
|
|
- List<DoCondition> collectC =
|
264
|
|
- sceneLinkageDTO.getDoConditions().stream()
|
265
|
|
- .map(doConditionDTO -> {
|
266
|
|
-
|
267
|
|
- doConditionDTO.setTenantId(sceneLinkageDTO.getTenantId());
|
268
|
|
- doConditionDTO.setSceneLinkageId(sceneLinkageDTO.getId());
|
269
|
|
- return doConditionDTO.getEntity(DoCondition.class);}
|
270
|
|
- )
|
271
|
|
- .collect(Collectors.toList());
|
272
|
|
- doConditionService.insertBatch(collectC, 1000);
|
273
|
|
- }
|
274
|
|
- /**
|
275
|
|
- * 通过分页查询
|
276
|
|
- *
|
277
|
|
- * @param queryMap 封装参数
|
278
|
|
- * @return SceneLinkageDTO 场景对象
|
279
|
|
- */
|
280
|
|
- @Override
|
281
|
|
- public YtPageData<SceneLinkageDTO> page(Map<String, Object> queryMap, String tenantId,boolean isCustomerUser) {
|
282
|
|
- queryMap.put("tenantId", tenantId);
|
283
|
|
- // 拿到传入的组织id
|
284
|
|
- String organizationId = (String) queryMap.get("organizationId");
|
285
|
|
- // 不为空
|
286
|
|
- if (null != organizationId && !StringUtils.isEmpty(organizationId)) {
|
287
|
|
- queryMap.put("organizationIds", getQueryOrganizationIds(tenantId,Arrays.asList(organizationId)));
|
|
290
|
+ /**
|
|
291
|
+ * 获取当前租户的场景联动
|
|
292
|
+ */
|
|
293
|
+ @Override
|
|
294
|
+ public List<SceneLinkageDTO> findSceneLinkage(SceneLinkageDTO sceneLinkageDTO, String tenantId) {
|
|
295
|
+ List<SceneLinkage> scenelinkageList =
|
|
296
|
+ baseMapper.selectList(
|
|
297
|
+ new QueryWrapper<SceneLinkage>()
|
|
298
|
+ .lambda()
|
|
299
|
+ .eq(SceneLinkage::getTenantId, tenantId)
|
|
300
|
+ .like(SceneLinkage::getName, sceneLinkageDTO.getName())
|
|
301
|
+ .like(SceneLinkage::getOrganizationId, sceneLinkageDTO.getOrganizationId())
|
|
302
|
+ .like(SceneLinkage::getStatus, sceneLinkageDTO.getStatus()));
|
|
303
|
+ return ReflectUtils.sourceToTarget(scenelinkageList, SceneLinkageDTO.class);
|
288
|
304
|
}
|
289
|
|
- if(null == organizationId && isCustomerUser){
|
290
|
|
- String currentUserId = (String) queryMap.get("currentUser");
|
291
|
|
- List<String> ids = userOrganizationMappingService.getOrganizationIdsByUserId(currentUserId);
|
292
|
|
- queryMap.put("organizationIds", getQueryOrganizationIds(tenantId,ids));
|
|
305
|
+
|
|
306
|
+ /**
|
|
307
|
+ * 修改当前场景联动的状态,启用或者停用
|
|
308
|
+ *
|
|
309
|
+ * @param sceneLinkageId 场景id
|
|
310
|
+ * @param status 状态
|
|
311
|
+ */
|
|
312
|
+ @Override
|
|
313
|
+ @Transactional(rollbackFor = Exception.class)
|
|
314
|
+ public void updateSceneStatus(String sceneLinkageId, int status, String tenantId) {
|
|
315
|
+ Optional.ofNullable(
|
|
316
|
+ baseMapper.selectOne(
|
|
317
|
+ new QueryWrapper<SceneLinkage>()
|
|
318
|
+ .lambda()
|
|
319
|
+ .eq(SceneLinkage::getId, sceneLinkageId)
|
|
320
|
+ .eq(SceneLinkage::getTenantId, tenantId)))
|
|
321
|
+ .ifPresent(
|
|
322
|
+ sceneLinkage -> {
|
|
323
|
+ sceneLinkage.setStatus(status);
|
|
324
|
+ baseMapper.updateById(sceneLinkage);
|
|
325
|
+ });
|
293
|
326
|
}
|
294
|
|
- IPage<SceneLinkage> page = getPage(queryMap, FastIotConstants.DefaultOrder.CREATE_TIME, false);
|
295
|
|
- IPage<SceneLinkageDTO> scenePage = baseMapper.getScenePage(page, queryMap);
|
296
|
|
- return getPageData(scenePage, SceneLinkageDTO.class);
|
297
|
|
- }
|
298
|
|
- /** 获取当前租户的场景联动 */
|
299
|
|
- @Override
|
300
|
|
- public List<SceneLinkageDTO> findSceneLinkage(SceneLinkageDTO sceneLinkageDTO, String tenantId) {
|
301
|
|
- List<SceneLinkage> scenelinkageList =
|
302
|
|
- baseMapper.selectList(
|
303
|
|
- new QueryWrapper<SceneLinkage>()
|
304
|
|
- .lambda()
|
305
|
|
- .eq(SceneLinkage::getTenantId, tenantId)
|
306
|
|
- .like(SceneLinkage::getName, sceneLinkageDTO.getName())
|
307
|
|
- .like(SceneLinkage::getOrganizationId, sceneLinkageDTO.getOrganizationId())
|
308
|
|
- .like(SceneLinkage::getStatus, sceneLinkageDTO.getStatus()));
|
309
|
|
- return ReflectUtils.sourceToTarget(scenelinkageList, SceneLinkageDTO.class);
|
310
|
|
- }
|
311
|
|
- /**
|
312
|
|
- * 修改当前场景联动的状态,启用或者停用
|
313
|
|
- *
|
314
|
|
- * @param sceneLinkageId 场景id
|
315
|
|
- * @param status 状态
|
316
|
|
- */
|
317
|
|
- @Override
|
318
|
|
- @Transactional(rollbackFor = Exception.class)
|
319
|
|
- public void updateSceneStatus(String sceneLinkageId, int status, String tenantId) {
|
320
|
|
- Optional.ofNullable(
|
321
|
|
- baseMapper.selectOne(
|
|
327
|
+
|
|
328
|
+ /**
|
|
329
|
+ * @param organizationId 组织ID
|
|
330
|
+ * @param isTenantAdmin true租户管理员 false客户
|
|
331
|
+ * @param tenantId 租户ID
|
|
332
|
+ * @param currentUserId 当前用户ID
|
|
333
|
+ * @return 设备集合
|
|
334
|
+ */
|
|
335
|
+ @Override
|
|
336
|
+ public List<DeviceDTO> findDeviceList(
|
|
337
|
+ String organizationId, boolean isTenantAdmin, String tenantId, String currentUserId) {
|
|
338
|
+ List<String> organizationIds = new ArrayList<>();
|
|
339
|
+ organizationIds.add(organizationId);
|
|
340
|
+ // 查询该组织的所有子类
|
|
341
|
+ List<String> ids =
|
|
342
|
+ organizationMapper.findOrganizationTreeList(tenantId, organizationIds).stream()
|
|
343
|
+ .map(organization -> organization.getId())
|
|
344
|
+ .collect(Collectors.toList());
|
|
345
|
+ // 拿到当前组织ids所包含的设备集合
|
|
346
|
+ List<YtDevice> deviceList =
|
|
347
|
+ deviceMapper.selectList(
|
|
348
|
+ new QueryWrapper<YtDevice>().lambda().in(YtDevice::getOrganizationId, ids));
|
|
349
|
+ List<DeviceDTO> deviceDTOList =
|
|
350
|
+ deviceList.stream()
|
|
351
|
+ .map(device -> device.getDTO(DeviceDTO.class))
|
|
352
|
+ .collect(Collectors.toList());
|
|
353
|
+
|
|
354
|
+ List<DeviceDTO> result = new ArrayList<>();
|
|
355
|
+ if (!isTenantAdmin) {
|
|
356
|
+ // 查找分配给客户的设备
|
|
357
|
+ List<String> list =
|
|
358
|
+ deviceMapper.findDeviceIdsByCustomerId(userMapper.findUserCustomerIdById(currentUserId));
|
|
359
|
+ list.forEach(
|
|
360
|
+ id -> {
|
|
361
|
+ for (DeviceDTO dto : deviceDTOList) {
|
|
362
|
+ if (dto.getTbDeviceId().equals(id)) {
|
|
363
|
+ result.add(dto);
|
|
364
|
+ break;
|
|
365
|
+ }
|
|
366
|
+ }
|
|
367
|
+ });
|
|
368
|
+ } else {
|
|
369
|
+ return deviceDTOList;
|
|
370
|
+ }
|
|
371
|
+ return result;
|
|
372
|
+ }
|
|
373
|
+
|
|
374
|
+ /**
|
|
375
|
+ * 场景联动节点配置信息
|
|
376
|
+ *
|
|
377
|
+ * @param sceneId 场景联动主键
|
|
378
|
+ * @param tenantId 租户主键
|
|
379
|
+ * @param state 是否禁用场景联动,true标识禁用,false标识启用。
|
|
380
|
+ * @return
|
|
381
|
+ */
|
|
382
|
+ @Override
|
|
383
|
+ public JsonNode getRuleNodeConfig(String sceneId, String tenantId, Integer state) {
|
|
384
|
+ String ruleTyp = "org.thingsboard.rule.engine.filter.TbSceneReactNode";
|
|
385
|
+ List<SceneLinkage> runningScenes = baseMapper.selectList(
|
322
|
386
|
new QueryWrapper<SceneLinkage>()
|
323
|
|
- .lambda()
|
324
|
|
- .eq(SceneLinkage::getId, sceneLinkageId)
|
325
|
|
- .eq(SceneLinkage::getTenantId, tenantId)))
|
326
|
|
- .ifPresent(
|
327
|
|
- sceneLinkage -> {
|
328
|
|
- sceneLinkage.setStatus(status);
|
329
|
|
- baseMapper.updateById(sceneLinkage);
|
330
|
|
- });
|
331
|
|
- }
|
332
|
|
- /**
|
333
|
|
- * 通过组织id查询全部的设备集合
|
334
|
|
- *
|
335
|
|
- * @param organizationId 组织ID
|
336
|
|
- * @param isTenantAdmin true租户管理员 false客户
|
337
|
|
- * @param tenantId 租户ID
|
338
|
|
- * @return 设备集合
|
339
|
|
- */
|
340
|
|
- @Override
|
341
|
|
- public List<DeviceDTO> findDeviceList(
|
342
|
|
- String organizationId, boolean isTenantAdmin, String tenantId, String currentUserId) {
|
343
|
|
- List<String> organizationIds = new ArrayList<>();
|
344
|
|
- organizationIds.add(organizationId);
|
345
|
|
- // 查询该组织的所有子类
|
346
|
|
- List<String> ids =
|
347
|
|
- organizationMapper.findOrganizationTreeList(tenantId, organizationIds).stream()
|
348
|
|
- .map(organization -> organization.getId())
|
349
|
|
- .collect(Collectors.toList());
|
350
|
|
- // 拿到当前组织ids所包含的设备集合
|
351
|
|
- List<YtDevice> deviceList =
|
352
|
|
- deviceMapper.selectList(
|
353
|
|
- new QueryWrapper<YtDevice>().lambda().in(YtDevice::getOrganizationId, ids));
|
354
|
|
- List<DeviceDTO> deviceDTOList =
|
355
|
|
- deviceList.stream()
|
356
|
|
- .map(device -> device.getDTO(DeviceDTO.class))
|
357
|
|
- .collect(Collectors.toList());
|
358
|
|
-
|
359
|
|
- List<DeviceDTO> result = new ArrayList<>();
|
360
|
|
- if (!isTenantAdmin) {
|
361
|
|
- // 查找分配给客户的设备
|
362
|
|
- List<String> list =
|
363
|
|
- deviceMapper.findDeviceIdsByCustomerId(userMapper.findUserCustomerIdById(currentUserId));
|
364
|
|
- list.forEach(
|
365
|
|
- id -> {
|
366
|
|
- for (DeviceDTO dto : deviceDTOList) {
|
367
|
|
- if (dto.getTbDeviceId().equals(id)) {
|
368
|
|
- result.add(dto);
|
369
|
|
- break;
|
370
|
|
- }
|
|
387
|
+ .lambda()
|
|
388
|
+ .eq(SceneLinkage::getTenantId, tenantId)
|
|
389
|
+ .eq(SceneLinkage::getStatus, FastIotConstants.StateValue.ENABLE)
|
|
390
|
+ );
|
|
391
|
+ Set<String> enableIds = new HashSet<>();
|
|
392
|
+ enableIds.add(sceneId);
|
|
393
|
+ for (SceneLinkage item : runningScenes) {
|
|
394
|
+ enableIds.add(item.getId());
|
|
395
|
+ }
|
|
396
|
+ if (state == FastIotConstants.StateValue.DISABLE) {
|
|
397
|
+ enableIds.remove(sceneId);
|
|
398
|
+ }
|
|
399
|
+
|
|
400
|
+ List<Trigger> triggers = triggerMapper.selectList(
|
|
401
|
+ new QueryWrapper<Trigger>()
|
|
402
|
+ .lambda()
|
|
403
|
+ .eq(Trigger::getTenantId, tenantId)
|
|
404
|
+ .eq(Trigger::getTriggerType, TriggerTypeEnum.DEVICE_TRIGGER)
|
|
405
|
+ .in(Trigger::getSceneLinkageId, enableIds)
|
|
406
|
+ );
|
|
407
|
+
|
|
408
|
+ Map<String, List<String>> devices = new HashMap<>();
|
|
409
|
+ for (Trigger item : triggers) {
|
|
410
|
+ String deviceId = item.getEntityId();
|
|
411
|
+ List<String> scenes = devices.computeIfAbsent(deviceId, k -> new ArrayList<String>());
|
|
412
|
+ String scenId = item.getSceneLinkageId();
|
|
413
|
+ if (!scenes.contains(scenId)) {
|
|
414
|
+ scenes.add(sceneId);
|
371
|
415
|
}
|
372
|
|
- });
|
373
|
|
- }else{
|
374
|
|
- return deviceDTOList;
|
375
|
|
- }
|
376
|
|
- return result;
|
377
|
|
- }
|
378
|
|
-
|
379
|
|
- /**
|
380
|
|
- * 场景联动节点配置信息
|
381
|
|
- * @param sceneId 场景联动主键
|
382
|
|
- * @param tenantId 租户主键
|
383
|
|
- * @param state 是否禁用场景联动,true标识禁用,false标识启用。
|
384
|
|
- * @return
|
385
|
|
- */
|
386
|
|
- @Override
|
387
|
|
- public JsonNode getRuleNodeConfig(String sceneId,String tenantId,Integer state){
|
388
|
|
- String ruleTyp = "org.thingsboard.rule.engine.filter.TbSceneReactNode";
|
389
|
|
- List<SceneLinkage> runningScenes = baseMapper.selectList(
|
390
|
|
- new QueryWrapper<SceneLinkage>()
|
391
|
|
- .lambda()
|
392
|
|
- .eq(SceneLinkage::getTenantId,tenantId)
|
393
|
|
- .eq(SceneLinkage::getStatus,FastIotConstants.StateValue.ENABLE)
|
394
|
|
- );
|
395
|
|
- Set<String> enableIds = new HashSet<>();
|
396
|
|
- enableIds.add(sceneId);
|
397
|
|
- for(SceneLinkage item : runningScenes){
|
398
|
|
- enableIds.add(item.getId());
|
399
|
|
- }
|
400
|
|
- if(state == FastIotConstants.StateValue.DISABLE ){
|
401
|
|
- enableIds.remove(sceneId);
|
402
|
|
- }
|
|
416
|
+ if (scenes.isEmpty()) {
|
|
417
|
+ devices.remove(deviceId);
|
|
418
|
+ } else {
|
|
419
|
+ devices.put(deviceId, scenes);
|
|
420
|
+ }
|
|
421
|
+ }
|
|
422
|
+ if (devices.isEmpty()) {
|
|
423
|
+ return null;
|
|
424
|
+ }
|
403
|
425
|
|
404
|
|
- List<Trigger> triggers =triggerMapper.selectList(
|
405
|
|
- new QueryWrapper<Trigger>()
|
406
|
|
- .lambda()
|
407
|
|
- .eq(Trigger::getTenantId,tenantId)
|
408
|
|
- .eq(Trigger::getTriggerType,TriggerTypeEnum.DEVICE_TRIGGER)
|
409
|
|
- .in(Trigger::getSceneLinkageId,enableIds)
|
410
|
|
- );
|
411
|
|
-
|
412
|
|
- Map<String,List<String>> devices = new HashMap<>();
|
413
|
|
- for(Trigger item: triggers){
|
414
|
|
- String deviceId = item.getEntityId();
|
415
|
|
- List<String> scenes = devices.computeIfAbsent(deviceId,k -> new ArrayList<String>());
|
416
|
|
- String scenId = item.getSceneLinkageId();
|
417
|
|
- if(!scenes.contains(scenId)){
|
418
|
|
- scenes.add(sceneId);
|
419
|
|
- }
|
420
|
|
- if(scenes.isEmpty()){
|
421
|
|
- devices.remove(deviceId);
|
422
|
|
- }else{
|
423
|
|
- devices.put(deviceId,scenes);
|
424
|
|
- }
|
425
|
|
- }
|
426
|
|
- if(devices.isEmpty()){
|
427
|
|
- return null;
|
|
426
|
+ Map<String, Map> engineConfig = new HashMap<>();
|
|
427
|
+ engineConfig.put("scenes", devices);
|
|
428
|
+
|
|
429
|
+
|
|
430
|
+ return JacksonUtil.convertValue(engineConfig, JsonNode.class);
|
428
|
431
|
}
|
429
|
432
|
|
430
|
|
- Map<String,Map> engineConfig = new HashMap<>();
|
431
|
|
- engineConfig.put("scenes",devices);
|
432
|
|
-
|
433
|
|
-
|
434
|
|
- return JacksonUtil.convertValue(engineConfig, JsonNode.class);
|
435
|
|
- }
|
436
|
|
- private List<String> getQueryOrganizationIds(String tenantId,List<String> organizationIds){
|
437
|
|
- // 查询该组织的所有子类
|
438
|
|
- List<OrganizationDTO> organizationDTOS =
|
439
|
|
- organizationMapper.findOrganizationTreeList(tenantId, organizationIds);
|
440
|
|
- // 遍历组织id
|
441
|
|
- List<String> queryOrganizationIds = new ArrayList<>();
|
442
|
|
- organizationDTOS.forEach(item -> queryOrganizationIds.add(item.getId()));
|
443
|
|
- Set<String> set = new HashSet<>();
|
444
|
|
- set.addAll(queryOrganizationIds);
|
445
|
|
- return new ArrayList<>(set);
|
446
|
|
- }
|
|
433
|
+ private List<String> getQueryOrganizationIds(String tenantId, List<String> organizationIds) {
|
|
434
|
+ // 查询该组织的所有子类
|
|
435
|
+ List<OrganizationDTO> organizationDTOS =
|
|
436
|
+ organizationMapper.findOrganizationTreeList(tenantId, organizationIds);
|
|
437
|
+ // 遍历组织id
|
|
438
|
+ List<String> queryOrganizationIds = new ArrayList<>();
|
|
439
|
+ organizationDTOS.forEach(item -> queryOrganizationIds.add(item.getId()));
|
|
440
|
+ Set<String> set = new HashSet<>();
|
|
441
|
+ set.addAll(queryOrganizationIds);
|
|
442
|
+ return new ArrayList<>(set);
|
|
443
|
+ }
|
447
|
444
|
} |
...
|
...
|
|