Commit 46ab1034c3c8914d62240856c2a6ea0f3e94d249

Authored by xp.Huang
2 parents 3b347a99 83a01a24

Merge branch 'ljl0225' into 'master'

Ljl0225

See merge request huang/thingsboard3.3.2!49
@@ -184,7 +184,10 @@ public class YtConvertDataToController extends BaseController { @@ -184,7 +184,10 @@ public class YtConvertDataToController extends BaseController {
184 throws ThingsboardException { 184 throws ThingsboardException {
185 //TODO 通过接口获取JsonNode 185 //TODO 通过接口获取JsonNode
186 int status = -1; 186 int status = -1;
187 - JsonNode configuration = sceneLinkageService.getRuleNodeConfig(convertReqDTO.getId(),getCurrentUser().getCurrentTenantId(),convertReqDTO.getStatus()); 187 + String sceneId = convertReqDTO.getId();
  188 + String currentTenant = getCurrentUser().getCurrentTenantId();
  189 + Integer sceneStatus = convertReqDTO.getStatus();
  190 + JsonNode configuration = sceneLinkageService.getRuleNodeConfig(sceneId,currentTenant,sceneStatus);
188 boolean noValue = configuration == null; 191 boolean noValue = configuration == null;
189 if (noValue && convertReqDTO.getStatus() == FastIotConstants.StateValue.DISABLE) { 192 if (noValue && convertReqDTO.getStatus() == FastIotConstants.StateValue.DISABLE) {
190 status = FastIotConstants.StateValue.DISABLE; 193 status = FastIotConstants.StateValue.DISABLE;
@@ -198,7 +201,9 @@ public class YtConvertDataToController extends BaseController { @@ -198,7 +201,9 @@ public class YtConvertDataToController extends BaseController {
198 scene.setType("org.thingsboard.rule.engine.yunteng.scene.TbSceneReactNode"); 201 scene.setType("org.thingsboard.rule.engine.yunteng.scene.TbSceneReactNode");
199 scene.setConfiguration(configuration); 202 scene.setConfiguration(configuration);
200 ruleNodes.add(scene); 203 ruleNodes.add(scene);
201 - return saveRuleChain(ruleNodes, status, FastIotConstants.SCENE_REACT); 204 + RuleChainMetaData result = saveRuleChain(ruleNodes, status, FastIotConstants.SCENE_REACT);
  205 + sceneLinkageService.updateSceneStatus(sceneId,sceneStatus,currentTenant);
  206 + return result;
202 } 207 }
203 208
204 /** 209 /**
@@ -47,7 +47,7 @@ public class YtSceneLinkageController extends BaseController { @@ -47,7 +47,7 @@ public class YtSceneLinkageController extends BaseController {
47 throws ThingsboardException { 47 throws ThingsboardException {
48 SceneLinkageDTO newSceneLinkageDTO = 48 SceneLinkageDTO newSceneLinkageDTO =
49 sceneLinkageService.saveSceneLinkage( 49 sceneLinkageService.saveSceneLinkage(
50 - sceneLinkageDTO, getCurrentUser().getCurrentTenantId()); 50 + sceneLinkageDTO, getCurrentUser().getCurrentTenantId(),getCurrentUser().isPtTenantAdmin(), getCurrentUser().getCurrentUserId());
51 return Optional.ofNullable(newSceneLinkageDTO) 51 return Optional.ofNullable(newSceneLinkageDTO)
52 .map( 52 .map(
53 dto -> { 53 dto -> {
@@ -66,7 +66,7 @@ public class YtSceneLinkageController extends BaseController { @@ -66,7 +66,7 @@ public class YtSceneLinkageController extends BaseController {
66 public void updateSceneLinkage( 66 public void updateSceneLinkage(
67 @Validated(UpdateGroup.class) @RequestBody SceneLinkageDTO sceneLinkageDTO) 67 @Validated(UpdateGroup.class) @RequestBody SceneLinkageDTO sceneLinkageDTO)
68 throws ThingsboardException { 68 throws ThingsboardException {
69 - sceneLinkageService.updateSceneLinkage(sceneLinkageDTO, getCurrentUser().getCurrentTenantId()); 69 + sceneLinkageService.updateSceneLinkage(sceneLinkageDTO, getCurrentUser().getCurrentTenantId(),getCurrentUser().isPtTenantAdmin(), getCurrentUser().getCurrentUserId());
70 } 70 }
71 71
72 @ApiOperation("查询(分页列表)") 72 @ApiOperation("查询(分页列表)")
@@ -98,16 +98,7 @@ public class YtSceneLinkageController extends BaseController { @@ -98,16 +98,7 @@ public class YtSceneLinkageController extends BaseController {
98 deleteDTO.getIds(), getCurrentUser().getCurrentTenantId()); 98 deleteDTO.getIds(), getCurrentUser().getCurrentTenantId());
99 } 99 }
100 100
101 - @ApiOperation(value = "启用/禁用")  
102 - @PutMapping("/updateSceneStatus/{sceneLinkageId}/{status}")  
103 - public void updateRoleStatus(  
104 - @PathVariable String sceneLinkageId, @PathVariable("status") int status)  
105 - throws ThingsboardException {  
106 - // TODO: 启动时,验证必填的动作是否为空  
107 101
108 - sceneLinkageService.updateSceneStatus(  
109 - sceneLinkageId, status, getCurrentUser().getCurrentTenantId());  
110 - }  
111 102
112 @ApiOperation(value = "通过场景id获取所属组织的设备集合") 103 @ApiOperation(value = "通过场景id获取所属组织的设备集合")
113 @GetMapping("/device") 104 @GetMapping("/device")
@@ -27,421 +27,418 @@ import org.thingsboard.server.dao.yunteng.service.*; @@ -27,421 +27,418 @@ import org.thingsboard.server.dao.yunteng.service.*;
27 import java.util.*; 27 import java.util.*;
28 import java.util.stream.Collectors; 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 @Service 33 @Service
32 @RequiredArgsConstructor 34 @RequiredArgsConstructor
33 public class SceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageMapper, SceneLinkage> 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 new QueryWrapper<SceneLinkage>() 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 }
@@ -15,12 +15,16 @@ import java.util.Set; @@ -15,12 +15,16 @@ import java.util.Set;
15 * @Date 2021/11/25 11:19 15 * @Date 2021/11/25 11:19
16 */ 16 */
17 public interface SceneLinkageService extends BaseService<SceneLinkage>{ 17 public interface SceneLinkageService extends BaseService<SceneLinkage>{
  18 +
18 /** 19 /**
19 - * 新增场景联动  
20 - * @param sceneLinkageDTO  
21 - * @return 20 + * 新增场景联动
  21 + * @param sceneLinkageDTO 场景联动信息
  22 + * @param tenantId 租户主键
  23 + * @param tenantAdmin 当前用户是否租户管理员
  24 + * @param currentUserId 当前登录用户主键
  25 + * @return sceneLinkageDTO
22 */ 26 */
23 - SceneLinkageDTO saveSceneLinkage(SceneLinkageDTO sceneLinkageDTO, String tenantId); 27 + SceneLinkageDTO saveSceneLinkage(SceneLinkageDTO sceneLinkageDTO, String tenantId,boolean tenantAdmin,String currentUserId);
24 28
25 /** 29 /**
26 * 删除场景联动 30 * 删除场景联动
@@ -31,10 +35,13 @@ public interface SceneLinkageService extends BaseService<SceneLinkage>{ @@ -31,10 +35,13 @@ public interface SceneLinkageService extends BaseService<SceneLinkage>{
31 35
32 /** 36 /**
33 * 修改场景联动 37 * 修改场景联动
34 - * @param sceneLinkageDTO 38 + * @param sceneLinkageDTO 场景联动信息
  39 + * @param tenantId 租户主键
  40 + * @param tenantAdmin 当前用户是否租户管理员
  41 + * @param currentUserId 当前登录用户主键
35 * @return 42 * @return
36 */ 43 */
37 - SceneLinkageDTO updateSceneLinkage(SceneLinkageDTO sceneLinkageDTO,String tenantId); 44 + SceneLinkageDTO updateSceneLinkage(SceneLinkageDTO sceneLinkageDTO,String tenantId,boolean tenantAdmin,String currentUserId);
38 45
39 /** 46 /**
40 * 分页查询 47 * 分页查询