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 184 throws ThingsboardException {
185 185 //TODO 通过接口获取JsonNode
186 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 191 boolean noValue = configuration == null;
189 192 if (noValue && convertReqDTO.getStatus() == FastIotConstants.StateValue.DISABLE) {
190 193 status = FastIotConstants.StateValue.DISABLE;
... ... @@ -198,7 +201,9 @@ public class YtConvertDataToController extends BaseController {
198 201 scene.setType("org.thingsboard.rule.engine.yunteng.scene.TbSceneReactNode");
199 202 scene.setConfiguration(configuration);
200 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 47 throws ThingsboardException {
48 48 SceneLinkageDTO newSceneLinkageDTO =
49 49 sceneLinkageService.saveSceneLinkage(
50   - sceneLinkageDTO, getCurrentUser().getCurrentTenantId());
  50 + sceneLinkageDTO, getCurrentUser().getCurrentTenantId(),getCurrentUser().isPtTenantAdmin(), getCurrentUser().getCurrentUserId());
51 51 return Optional.ofNullable(newSceneLinkageDTO)
52 52 .map(
53 53 dto -> {
... ... @@ -66,7 +66,7 @@ public class YtSceneLinkageController extends BaseController {
66 66 public void updateSceneLinkage(
67 67 @Validated(UpdateGroup.class) @RequestBody SceneLinkageDTO sceneLinkageDTO)
68 68 throws ThingsboardException {
69   - sceneLinkageService.updateSceneLinkage(sceneLinkageDTO, getCurrentUser().getCurrentTenantId());
  69 + sceneLinkageService.updateSceneLinkage(sceneLinkageDTO, getCurrentUser().getCurrentTenantId(),getCurrentUser().isPtTenantAdmin(), getCurrentUser().getCurrentUserId());
70 70 }
71 71
72 72 @ApiOperation("查询(分页列表)")
... ... @@ -98,16 +98,7 @@ public class YtSceneLinkageController extends BaseController {
98 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 103 @ApiOperation(value = "通过场景id获取所属组织的设备集合")
113 104 @GetMapping("/device")
... ...
... ... @@ -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 }
... ...
... ... @@ -15,12 +15,16 @@ import java.util.Set;
15 15 * @Date 2021/11/25 11:19
16 16 */
17 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 35
32 36 /**
33 37 * 修改场景联动
34   - * @param sceneLinkageDTO
  38 + * @param sceneLinkageDTO 场景联动信息
  39 + * @param tenantId 租户主键
  40 + * @param tenantAdmin 当前用户是否租户管理员
  41 + * @param currentUserId 当前登录用户主键
35 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 * 分页查询
... ...