Showing
1 changed file
with
386 additions
and
384 deletions
... | ... | @@ -27,421 +27,423 @@ 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) { | |
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,true,sceneLinkage.getTenantId(),sceneLinkage.getCreator()); | |
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) { | |
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<YtDevice> organizationDevices = | |
129 | + deviceMapper.selectList( | |
130 | + new QueryWrapper<YtDevice>() | |
131 | + .lambda() | |
132 | + .eq(YtDevice::getTenantId, sceneLinkage.getTenantId()) | |
133 | + .eq(StringUtils.isNoneBlank(organizationId), YtDevice::getOrganizationId, organizationId) | |
134 | + ); | |
135 | + List<String> tbDeviceIds = new ArrayList<>(); | |
136 | + for (YtDevice item : organizationDevices) { | |
137 | + tbDeviceIds.add(item.getTbDeviceId()); | |
171 | 138 | } |
172 | - } | |
173 | - }else{ | |
174 | - return; | |
139 | + | |
140 | + updateTrigger(sceneLinkageDTO, tbDeviceIds); | |
141 | + updateDoCondition(sceneLinkageDTO, tbDeviceIds); | |
142 | + updateDoAction(sceneLinkageDTO, tbDeviceIds); | |
143 | + | |
144 | + sceneLinkageDTO.copyToEntity(sceneLinkage); | |
145 | + sceneLinkage.setTenantId(tenantId); | |
146 | + sceneLinkageMapper.updateById(sceneLinkage); | |
147 | + return sceneLinkage.getDTO(SceneLinkageDTO.class); | |
175 | 148 | } |
176 | 149 | |
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 "); | |
150 | + /** | |
151 | + * 修改触发器 | |
152 | + * | |
153 | + * @param sceneLinkage 场景联动信息 | |
154 | + * @param tbDeviceIds 场景联动所属组织设备主键集合 | |
155 | + */ | |
156 | + private void updateTrigger(SceneLinkageDTO sceneLinkage, List<String> tbDeviceIds) { | |
157 | + List<TriggerDTO> triggerDTOS = sceneLinkage.getTriggers(); | |
158 | + if (triggerDTOS != null && !triggerDTOS.isEmpty()) { | |
159 | + for (TriggerDTO triggerDTO : triggerDTOS) { | |
160 | + String deviceId = triggerDTO.getEntityId(); | |
161 | + if (!TriggerTypeEnum.DEVICE_TRIGGER.equals(triggerDTO.getTriggerType())) { | |
162 | + continue; | |
163 | + } | |
164 | + if (!tbDeviceIds.contains(deviceId)) { | |
165 | + throw new DataValidationException("in trigger ,this device not belong this org"); | |
166 | + } | |
167 | + } | |
168 | + } else { | |
169 | + return; | |
211 | 170 | } |
212 | - } | |
171 | + | |
172 | + // 先删除触发器 | |
173 | + triggerMapper.delete( | |
174 | + new QueryWrapper<Trigger>() | |
175 | + .lambda() | |
176 | + .eq(StringUtils.isNoneBlank(sceneLinkage.getId()), Trigger::getSceneLinkageId, sceneLinkage.getId())); | |
177 | + | |
178 | + | |
179 | + // 如果获取的触发器不为空,进行添加操作 | |
180 | + List<Trigger> triggers = | |
181 | + triggerDTOS.stream() | |
182 | + .map(triggerDTO -> { | |
183 | + triggerDTO.setTenantId(sceneLinkage.getTenantId()); | |
184 | + triggerDTO.setSceneLinkageId(sceneLinkage.getId()); | |
185 | + return triggerDTO.getEntity(Trigger.class); | |
186 | + }) | |
187 | + .collect(Collectors.toList()); | |
188 | + triggerService.insertBatch(triggers, 1000); | |
213 | 189 | } |
214 | 190 | |
215 | - doActionMapper.delete( | |
216 | - new QueryWrapper<DoAction>() | |
217 | - .lambda() | |
218 | - .eq(StringUtils.isNoneBlank(sceneLinkageDTO.getId()), DoAction::getSceneLinkageId,sceneLinkageDTO.getId())); | |
191 | + /** | |
192 | + * 修改执行动作 | |
193 | + * | |
194 | + * @param sceneLinkageDTO 场景联动信息 | |
195 | + * @param tbDeviceIds 场景联动所属组织设备主键集合 | |
196 | + */ | |
197 | + private void updateDoAction(SceneLinkageDTO sceneLinkageDTO, List<String> tbDeviceIds) { | |
198 | + List<DoActionDTO> actionDTOS = sceneLinkageDTO.getDoActions(); | |
199 | + if (actionDTOS != null && !actionDTOS.isEmpty()) { | |
200 | + for (DoActionDTO item : actionDTOS) { | |
201 | + String deviceId = item.getDeviceId(); | |
202 | + if (!ActionTypeEnum.DEVICE_OUT.equals(item.getOutTarget())) { | |
203 | + continue; | |
204 | + } | |
205 | + if (!tbDeviceIds.contains(deviceId)) { | |
206 | + throw new DataValidationException("in action ,this device not belong this org "); | |
207 | + } | |
208 | + } | |
209 | + } | |
210 | + | |
211 | + doActionMapper.delete( | |
212 | + new QueryWrapper<DoAction>() | |
213 | + .lambda() | |
214 | + .eq(StringUtils.isNoneBlank(sceneLinkageDTO.getId()), DoAction::getSceneLinkageId, sceneLinkageDTO.getId())); | |
215 | + | |
216 | + | |
217 | + List<DoAction> collectA = | |
218 | + sceneLinkageDTO.getDoActions().stream() | |
219 | + .map(doActionDTO -> { | |
220 | + doActionDTO.setTenantId(sceneLinkageDTO.getTenantId()); | |
221 | + doActionDTO.setSceneLinkageId(sceneLinkageDTO.getId()); | |
222 | + return doActionDTO.getEntity(DoAction.class); | |
223 | + }) | |
224 | + .collect(Collectors.toList()); | |
225 | + doActionService.insertBatch(collectA, 1000); | |
219 | 226 | |
220 | 227 | |
228 | + } | |
229 | + | |
230 | + /** | |
231 | + * 修改执行动作 | |
232 | + * | |
233 | + * @param sceneLinkageDTO 场景联动信息 | |
234 | + * @param tbDeviceIds 场景联动所属组织设备主键集合 | |
235 | + */ | |
236 | + private void updateDoCondition(SceneLinkageDTO sceneLinkageDTO, List<String> tbDeviceIds) { | |
237 | + List<DoConditionDTO> conditionDTOS = sceneLinkageDTO.getDoConditions(); | |
238 | + if (conditionDTOS != null && !conditionDTOS.isEmpty()) { | |
239 | + for (DoConditionDTO item : conditionDTOS) { | |
240 | + String deviceId = item.getEntityId(); | |
241 | + if (!TriggerTypeEnum.DEVICE_TRIGGER.equals(item.getTriggerType())) { | |
242 | + continue; | |
243 | + } | |
244 | + if (!tbDeviceIds.contains(deviceId)) { | |
245 | + throw new DataValidationException("in condition ,this device not belong this org"); | |
246 | + } | |
247 | + } | |
248 | + } | |
221 | 249 | |
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); | |
250 | + doConditionMapper.delete( | |
251 | + new QueryWrapper<DoCondition>() | |
252 | + .lambda() | |
253 | + .eq(StringUtils.isNoneBlank(sceneLinkageDTO.getId()), DoCondition::getSceneLinkageId, sceneLinkageDTO.getId())); | |
231 | 254 | |
232 | 255 | |
256 | + // 4.批量新增执行条件 | |
257 | + List<DoCondition> collectC = | |
258 | + sceneLinkageDTO.getDoConditions().stream() | |
259 | + .map(doConditionDTO -> { | |
233 | 260 | |
234 | - } | |
261 | + doConditionDTO.setTenantId(sceneLinkageDTO.getTenantId()); | |
262 | + doConditionDTO.setSceneLinkageId(sceneLinkageDTO.getId()); | |
263 | + return doConditionDTO.getEntity(DoCondition.class); | |
264 | + } | |
265 | + ) | |
266 | + .collect(Collectors.toList()); | |
267 | + doConditionService.insertBatch(collectC, 1000); | |
268 | + } | |
235 | 269 | |
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; | |
270 | + /** | |
271 | + * 通过分页查询 | |
272 | + * | |
273 | + * @param queryMap 封装参数 | |
274 | + * @return SceneLinkageDTO 场景对象 | |
275 | + */ | |
276 | + @Override | |
277 | + public YtPageData<SceneLinkageDTO> page(Map<String, Object> queryMap, String tenantId, boolean isCustomerUser) { | |
278 | + queryMap.put("tenantId", tenantId); | |
279 | + // 拿到传入的组织id | |
280 | + String organizationId = (String) queryMap.get("organizationId"); | |
281 | + // 不为空 | |
282 | + if (null != organizationId && !StringUtils.isEmpty(organizationId)) { | |
283 | + queryMap.put("organizationIds", getQueryOrganizationIds(tenantId, Arrays.asList(organizationId))); | |
249 | 284 | } |
250 | - if (!tbDeviceIds.contains(deviceId)) { | |
251 | - throw new DataValidationException("in condition ,this device not belong this org"); | |
285 | + if (null == organizationId && isCustomerUser) { | |
286 | + String currentUserId = (String) queryMap.get("currentUser"); | |
287 | + List<String> ids = userOrganizationMappingService.getOrganizationIdsByUserId(currentUserId); | |
288 | + queryMap.put("organizationIds", getQueryOrganizationIds(tenantId, ids)); | |
252 | 289 | } |
253 | - } | |
290 | + IPage<SceneLinkage> page = getPage(queryMap, FastIotConstants.DefaultOrder.CREATE_TIME, false); | |
291 | + IPage<SceneLinkageDTO> scenePage = baseMapper.getScenePage(page, queryMap); | |
292 | + return getPageData(scenePage, SceneLinkageDTO.class); | |
254 | 293 | } |
255 | 294 | |
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))); | |
295 | + /** | |
296 | + * 获取当前租户的场景联动 | |
297 | + */ | |
298 | + @Override | |
299 | + public List<SceneLinkageDTO> findSceneLinkage(SceneLinkageDTO sceneLinkageDTO, String tenantId) { | |
300 | + List<SceneLinkage> scenelinkageList = | |
301 | + baseMapper.selectList( | |
302 | + new QueryWrapper<SceneLinkage>() | |
303 | + .lambda() | |
304 | + .eq(SceneLinkage::getTenantId, tenantId) | |
305 | + .like(SceneLinkage::getName, sceneLinkageDTO.getName()) | |
306 | + .like(SceneLinkage::getOrganizationId, sceneLinkageDTO.getOrganizationId()) | |
307 | + .like(SceneLinkage::getStatus, sceneLinkageDTO.getStatus())); | |
308 | + return ReflectUtils.sourceToTarget(scenelinkageList, SceneLinkageDTO.class); | |
288 | 309 | } |
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)); | |
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( | |
322 | + 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 | + }); | |
293 | 331 | } |
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( | |
332 | + | |
333 | + /** | |
334 | + * @param organizationId 组织ID | |
335 | + * @param isTenantAdmin true租户管理员 false客户 | |
336 | + * @param tenantId 租户ID | |
337 | + * @param currentUserId 当前用户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 | + } | |
371 | + } | |
372 | + }); | |
373 | + } else { | |
374 | + return deviceDTOList; | |
375 | + } | |
376 | + return result; | |
377 | + } | |
378 | + | |
379 | + /** | |
380 | + * 场景联动节点配置信息 | |
381 | + * | |
382 | + * @param sceneId 场景联动主键 | |
383 | + * @param tenantId 租户主键 | |
384 | + * @param state 是否禁用场景联动,true标识禁用,false标识启用。 | |
385 | + * @return | |
386 | + */ | |
387 | + @Override | |
388 | + public JsonNode getRuleNodeConfig(String sceneId, String tenantId, Integer state) { | |
389 | + String ruleTyp = "org.thingsboard.rule.engine.filter.TbSceneReactNode"; | |
390 | + List<SceneLinkage> runningScenes = baseMapper.selectList( | |
322 | 391 | 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 | - } | |
392 | + .lambda() | |
393 | + .eq(SceneLinkage::getTenantId, tenantId) | |
394 | + .eq(SceneLinkage::getStatus, FastIotConstants.StateValue.ENABLE) | |
395 | + ); | |
396 | + Set<String> enableIds = new HashSet<>(); | |
397 | + enableIds.add(sceneId); | |
398 | + for (SceneLinkage item : runningScenes) { | |
399 | + enableIds.add(item.getId()); | |
400 | + } | |
401 | + if (state == FastIotConstants.StateValue.DISABLE) { | |
402 | + enableIds.remove(sceneId); | |
403 | + } | |
404 | + | |
405 | + List<Trigger> triggers = triggerMapper.selectList( | |
406 | + new QueryWrapper<Trigger>() | |
407 | + .lambda() | |
408 | + .eq(Trigger::getTenantId, tenantId) | |
409 | + .eq(Trigger::getTriggerType, TriggerTypeEnum.DEVICE_TRIGGER) | |
410 | + .in(Trigger::getSceneLinkageId, enableIds) | |
411 | + ); | |
412 | + | |
413 | + Map<String, List<String>> devices = new HashMap<>(); | |
414 | + for (Trigger item : triggers) { | |
415 | + String deviceId = item.getEntityId(); | |
416 | + List<String> scenes = devices.computeIfAbsent(deviceId, k -> new ArrayList<String>()); | |
417 | + String scenId = item.getSceneLinkageId(); | |
418 | + if (!scenes.contains(scenId)) { | |
419 | + scenes.add(sceneId); | |
371 | 420 | } |
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 | - } | |
421 | + if (scenes.isEmpty()) { | |
422 | + devices.remove(deviceId); | |
423 | + } else { | |
424 | + devices.put(deviceId, scenes); | |
425 | + } | |
426 | + } | |
427 | + if (devices.isEmpty()) { | |
428 | + return null; | |
429 | + } | |
403 | 430 | |
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; | |
431 | + Map<String, Map> engineConfig = new HashMap<>(); | |
432 | + engineConfig.put("scenes", devices); | |
433 | + | |
434 | + | |
435 | + return JacksonUtil.convertValue(engineConfig, JsonNode.class); | |
428 | 436 | } |
429 | 437 | |
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 | - } | |
438 | + private List<String> getQueryOrganizationIds(String tenantId, List<String> organizationIds) { | |
439 | + // 查询该组织的所有子类 | |
440 | + List<OrganizationDTO> organizationDTOS = | |
441 | + organizationMapper.findOrganizationTreeList(tenantId, organizationIds); | |
442 | + // 遍历组织id | |
443 | + List<String> queryOrganizationIds = new ArrayList<>(); | |
444 | + organizationDTOS.forEach(item -> queryOrganizationIds.add(item.getId())); | |
445 | + Set<String> set = new HashSet<>(); | |
446 | + set.addAll(queryOrganizationIds); | |
447 | + return new ArrayList<>(set); | |
448 | + } | |
447 | 449 | } | ... | ... |