Commit 0d17f3aa2d72c196cd701ec662d8c842223a00c5

Authored by 黄 x
1 parent a65b6aae

fix: 场景联动根据组织ID查询分配给客户的设备BUG

@@ -14,6 +14,7 @@ import org.thingsboard.server.common.data.yunteng.common.AddGroup; @@ -14,6 +14,7 @@ import org.thingsboard.server.common.data.yunteng.common.AddGroup;
14 import org.thingsboard.server.common.data.yunteng.common.DeleteGroup; 14 import org.thingsboard.server.common.data.yunteng.common.DeleteGroup;
15 import org.thingsboard.server.common.data.yunteng.common.UpdateGroup; 15 import org.thingsboard.server.common.data.yunteng.common.UpdateGroup;
16 import org.thingsboard.server.common.data.yunteng.dto.DeleteDTO; 16 import org.thingsboard.server.common.data.yunteng.dto.DeleteDTO;
  17 +import org.thingsboard.server.common.data.yunteng.dto.DeviceDTO;
17 import org.thingsboard.server.common.data.yunteng.dto.SceneLinkageDTO; 18 import org.thingsboard.server.common.data.yunteng.dto.SceneLinkageDTO;
18 import org.thingsboard.server.common.data.yunteng.dto.TriggerDTO; 19 import org.thingsboard.server.common.data.yunteng.dto.TriggerDTO;
19 import org.thingsboard.server.common.data.yunteng.utils.tools.YtPageData; 20 import org.thingsboard.server.common.data.yunteng.utils.tools.YtPageData;
@@ -29,9 +30,7 @@ import java.util.Optional; @@ -29,9 +30,7 @@ import java.util.Optional;
29 import static org.thingsboard.server.common.data.yunteng.constant.QueryConstant.PAGE; 30 import static org.thingsboard.server.common.data.yunteng.constant.QueryConstant.PAGE;
30 import static org.thingsboard.server.common.data.yunteng.constant.QueryConstant.PAGE_SIZE; 31 import static org.thingsboard.server.common.data.yunteng.constant.QueryConstant.PAGE_SIZE;
31 32
32 -/**  
33 - * @Description 场景联动 @Author cxy @Date 2021/11/25 11:25  
34 - */ 33 +/** @Description 场景联动 @Author cxy @Date 2021/11/25 11:25 */
35 @RestController 34 @RestController
36 @RequestMapping("/api/yt/sceneLinkage") 35 @RequestMapping("/api/yt/sceneLinkage")
37 @RequiredArgsConstructor 36 @RequiredArgsConstructor
@@ -39,84 +38,88 @@ import static org.thingsboard.server.common.data.yunteng.constant.QueryConstant. @@ -39,84 +38,88 @@ import static org.thingsboard.server.common.data.yunteng.constant.QueryConstant.
39 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN','CUSTOMER_USER')") 38 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN','CUSTOMER_USER')")
40 public class YtSceneLinkageController extends BaseController { 39 public class YtSceneLinkageController extends BaseController {
41 40
42 - private final SceneLinkageService sceneLinkageService; 41 + private final SceneLinkageService sceneLinkageService;
43 42
44 - @ApiOperation(value = "新增场景联动")  
45 - @PostMapping  
46 - public ResponseEntity<SceneLinkageDTO> saveSceneLinkage(  
47 - @Validated(AddGroup.class) @RequestBody SceneLinkageDTO sceneLinkageDTO)  
48 - throws ThingsboardException {  
49 - SceneLinkageDTO newSceneLinkageDTO =  
50 - sceneLinkageService.saveScenelinkage(  
51 - sceneLinkageDTO, getCurrentUser().getCurrentTenantId());  
52 - return Optional.ofNullable(newSceneLinkageDTO)  
53 - .map(  
54 - dto -> {  
55 - URI location =  
56 - ServletUriComponentsBuilder.fromCurrentRequest()  
57 - .path("/{id}")  
58 - .buildAndExpand(newSceneLinkageDTO.getId())  
59 - .toUri();  
60 - return ResponseEntity.created(location).body(newSceneLinkageDTO);  
61 - })  
62 - .orElse(ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build());  
63 - } 43 + @ApiOperation(value = "新增场景联动")
  44 + @PostMapping
  45 + public ResponseEntity<SceneLinkageDTO> saveSceneLinkage(
  46 + @Validated(AddGroup.class) @RequestBody SceneLinkageDTO sceneLinkageDTO)
  47 + throws ThingsboardException {
  48 + SceneLinkageDTO newSceneLinkageDTO =
  49 + sceneLinkageService.saveScenelinkage(
  50 + sceneLinkageDTO, getCurrentUser().getCurrentTenantId());
  51 + return Optional.ofNullable(newSceneLinkageDTO)
  52 + .map(
  53 + dto -> {
  54 + URI location =
  55 + ServletUriComponentsBuilder.fromCurrentRequest()
  56 + .path("/{id}")
  57 + .buildAndExpand(newSceneLinkageDTO.getId())
  58 + .toUri();
  59 + return ResponseEntity.created(location).body(newSceneLinkageDTO);
  60 + })
  61 + .orElse(ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build());
  62 + }
64 63
65 - @ApiOperation("编辑")  
66 - @PostMapping("/update")  
67 - public void updateSceneLinkage(  
68 - @Validated(UpdateGroup.class) @RequestBody SceneLinkageDTO sceneLinkageDTO) throws ThingsboardException {  
69 - sceneLinkageService.updateSceneLinkage(sceneLinkageDTO, getCurrentUser().getCurrentTenantId());  
70 - } 64 + @ApiOperation("编辑")
  65 + @PostMapping("/update")
  66 + public void updateSceneLinkage(
  67 + @Validated(UpdateGroup.class) @RequestBody SceneLinkageDTO sceneLinkageDTO)
  68 + throws ThingsboardException {
  69 + sceneLinkageService.updateSceneLinkage(sceneLinkageDTO, getCurrentUser().getCurrentTenantId());
  70 + }
71 71
72 - @ApiOperation("查询(分页列表)")  
73 - @GetMapping(params = {PAGE_SIZE, PAGE})  
74 - public YtPageData<SceneLinkageDTO> page(  
75 - @RequestParam(PAGE_SIZE) int pageSize,  
76 - @RequestParam(PAGE) int page,  
77 - @RequestParam(value = "name", required = false) String name,  
78 - @RequestParam(value = "status", required = false) Integer status,  
79 - @RequestParam(value = "organizationId", required = false) String organizationId,  
80 - @RequestParam(value = "triggers", required = false) List<TriggerDTO> triggers)  
81 - throws ThingsboardException {  
82 - HashMap<String, Object> queryMap = new HashMap<>();  
83 - queryMap.put(PAGE_SIZE, pageSize);  
84 - queryMap.put(PAGE, page);  
85 - queryMap.put("name", name);  
86 - queryMap.put("status", status);  
87 - queryMap.put("organizationId", organizationId);  
88 - queryMap.put("triggers", triggers);  
89 - return sceneLinkageService.page(queryMap, getCurrentUser().getCurrentTenantId());  
90 - } 72 + @ApiOperation("查询(分页列表)")
  73 + @GetMapping(params = {PAGE_SIZE, PAGE})
  74 + public YtPageData<SceneLinkageDTO> page(
  75 + @RequestParam(PAGE_SIZE) int pageSize,
  76 + @RequestParam(PAGE) int page,
  77 + @RequestParam(value = "name", required = false) String name,
  78 + @RequestParam(value = "status", required = false) Integer status,
  79 + @RequestParam(value = "organizationId", required = false) String organizationId,
  80 + @RequestParam(value = "triggers", required = false) List<TriggerDTO> triggers)
  81 + throws ThingsboardException {
  82 + HashMap<String, Object> queryMap = new HashMap<>();
  83 + queryMap.put(PAGE_SIZE, pageSize);
  84 + queryMap.put(PAGE, page);
  85 + queryMap.put("name", name);
  86 + queryMap.put("status", status);
  87 + queryMap.put("organizationId", organizationId);
  88 + queryMap.put("triggers", triggers);
  89 + return sceneLinkageService.page(queryMap, getCurrentUser().getCurrentTenantId());
  90 + }
91 91
92 - @ApiOperation(value = "删除")  
93 - @DeleteMapping  
94 - public void delete(@Validated({DeleteGroup.class}) @RequestBody DeleteDTO deleteDTO)  
95 - throws ThingsboardException {  
96 - sceneLinkageService.deleteSceneLinkage(  
97 - deleteDTO.getIds(), getCurrentUser().getCurrentTenantId());  
98 - } 92 + @ApiOperation(value = "删除")
  93 + @DeleteMapping
  94 + public void delete(@Validated({DeleteGroup.class}) @RequestBody DeleteDTO deleteDTO)
  95 + throws ThingsboardException {
  96 + sceneLinkageService.deleteSceneLinkage(
  97 + deleteDTO.getIds(), getCurrentUser().getCurrentTenantId());
  98 + }
99 99
100 - @ApiOperation(value = "启用/禁用")  
101 - @PutMapping("/updateSceneStatus/{sceneLinkageId}/{status}")  
102 - public void updateRoleStatus(  
103 - @PathVariable String sceneLinkageId, @PathVariable("status") int status)  
104 - throws ThingsboardException {  
105 - //TODO: 启动时,验证必填的动作是否为空 100 + @ApiOperation(value = "启用/禁用")
  101 + @PutMapping("/updateSceneStatus/{sceneLinkageId}/{status}")
  102 + public void updateRoleStatus(
  103 + @PathVariable String sceneLinkageId, @PathVariable("status") int status)
  104 + throws ThingsboardException {
  105 + // TODO: 启动时,验证必填的动作是否为空
106 106
107 - sceneLinkageService.updateSceneStatus(  
108 - sceneLinkageId, status, getCurrentUser().getCurrentTenantId());  
109 - } 107 + sceneLinkageService.updateSceneStatus(
  108 + sceneLinkageId, status, getCurrentUser().getCurrentTenantId());
  109 + }
110 110
111 - @ApiOperation(value = "通过场景id获取所属组织的设备集合")  
112 - @GetMapping("/device")  
113 - public ResponseEntity<Map> findDeviceList(@RequestParam String organizationId) {  
114 - HashMap<String, Object> map =  
115 - new HashMap<>() {  
116 - {  
117 - put("items", sceneLinkageService.findDeviceList(organizationId));  
118 - }  
119 - };  
120 - return ResponseEntity.ok(map);  
121 - } 111 + @ApiOperation(value = "通过场景id获取所属组织的设备集合")
  112 + @GetMapping("/device")
  113 + public ResponseEntity<Map> findDeviceList(@RequestParam String organizationId)
  114 + throws ThingsboardException {
  115 + List<DeviceDTO> dtoList =
  116 + sceneLinkageService.findDeviceList(
  117 + organizationId,
  118 + getCurrentUser().isPtTenantAdmin(),
  119 + getCurrentUser().getCurrentTenantId(),
  120 + getCurrentUser().getCurrentUserId());
  121 + Map<String, Object> map = new HashMap<>();
  122 + map.put("items", dtoList);
  123 + return ResponseEntity.ok(map);
  124 + }
122 } 125 }
@@ -35,6 +35,7 @@ public class SceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageMap @@ -35,6 +35,7 @@ public class SceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageMap
35 private final TriggerService triggerService; 35 private final TriggerService triggerService;
36 private final DoConditionService doConditionService; 36 private final DoConditionService doConditionService;
37 private final DoActionService doActionService; 37 private final DoActionService doActionService;
  38 + private final UserMapper userMapper;
38 /** 39 /**
39 * 增加场景联动,触发器可以多个,执行条件可以多个,执行动作可以多个 40 * 增加场景联动,触发器可以多个,执行条件可以多个,执行动作可以多个
40 * 41 *
@@ -195,7 +196,7 @@ public class SceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageMap @@ -195,7 +196,7 @@ public class SceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageMap
195 */ 196 */
196 @Override 197 @Override
197 @Transactional 198 @Transactional
198 - public SceneLinkageDTO updateSceneLinkage(SceneLinkageDTO sceneLinkageDTO,String tenantId) { 199 + public SceneLinkageDTO updateSceneLinkage(SceneLinkageDTO sceneLinkageDTO, String tenantId) {
199 // 获取场景 200 // 获取场景
200 SceneLinkage sceneLinkage = baseMapper.selectById(sceneLinkageDTO.getId()); 201 SceneLinkage sceneLinkage = baseMapper.selectById(sceneLinkageDTO.getId());
201 if (sceneLinkage == null) { 202 if (sceneLinkage == null) {
@@ -296,7 +297,7 @@ public class SceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageMap @@ -296,7 +297,7 @@ public class SceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageMap
296 // 拿到传入的组织id 297 // 拿到传入的组织id
297 String organizationId = (String) queryMap.get("organizationId"); 298 String organizationId = (String) queryMap.get("organizationId");
298 // 不为空 299 // 不为空
299 - if (null!=organizationId && !StringUtils.isEmpty(organizationId) ) { 300 + if (null != organizationId && !StringUtils.isEmpty(organizationId)) {
300 // 新建组织集合 301 // 新建组织集合
301 List<String> organizationIds = new ArrayList<>(); 302 List<String> organizationIds = new ArrayList<>();
302 // 添加拿到的组织 303 // 添加拿到的组织
@@ -314,20 +315,6 @@ public class SceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageMap @@ -314,20 +315,6 @@ public class SceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageMap
314 } 315 }
315 IPage<SceneLinkage> page = getPage(queryMap, FastIotConstants.DefaultOrder.CREATE_TIME, false); 316 IPage<SceneLinkage> page = getPage(queryMap, FastIotConstants.DefaultOrder.CREATE_TIME, false);
316 IPage<SceneLinkageDTO> scenePage = baseMapper.getScenePage(page, queryMap); 317 IPage<SceneLinkageDTO> scenePage = baseMapper.getScenePage(page, queryMap);
317 -// scenePage  
318 -// .getRecords()  
319 -// .forEach(  
320 -// sceneLinkageDTO -> {  
321 -// List<TriggerDTO> collect =  
322 -// triggerMapper  
323 -// .selectList(  
324 -// new LambdaQueryWrapper<Trigger>()  
325 -// .in(Trigger::getSceneLinkageId, sceneLinkageDTO.getId()))  
326 -// .stream()  
327 -// .map(trigger -> trigger.getDTO(TriggerDTO.class))  
328 -// .collect(Collectors.toList());  
329 -// sceneLinkageDTO.setTriggers(collect);  
330 -// });  
331 return getPageData(scenePage, SceneLinkageDTO.class); 318 return getPageData(scenePage, SceneLinkageDTO.class);
332 } 319 }
333 /** 获取当前租户的场景联动 */ 320 /** 获取当前租户的场景联动 */
@@ -367,24 +354,45 @@ public class SceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageMap @@ -367,24 +354,45 @@ public class SceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageMap
367 /** 354 /**
368 * 通过组织id查询全部的设备集合 355 * 通过组织id查询全部的设备集合
369 * 356 *
370 - * @param organizationId 357 + * @param organizationId 组织ID
  358 + * @param isTenantAdmin true租户管理员 false客户
  359 + * @param tenantId 租户ID
371 * @return 设备集合 360 * @return 设备集合
372 */ 361 */
373 @Override 362 @Override
374 - public List<DeviceDTO> findDeviceList(String organizationId) {  
375 - // 拿到当前组织id所包含的设备集合 363 + public List<DeviceDTO> findDeviceList(
  364 + String organizationId, boolean isTenantAdmin, String tenantId, String currentUserId) {
  365 + List<String> organizationIds = new ArrayList<>();
  366 + organizationIds.add(organizationId);
  367 + // 查询该组织的所有子类
  368 + List<String> ids =
  369 + organizationMapper.findOrganizationTreeList(tenantId, organizationIds).stream()
  370 + .map(organization -> organization.getId())
  371 + .collect(Collectors.toList());
  372 + // 拿到当前组织ids所包含的设备集合
376 List<YtDevice> deviceList = 373 List<YtDevice> deviceList =
377 deviceMapper.selectList( 374 deviceMapper.selectList(
378 - new QueryWrapper<YtDevice>()  
379 - .lambda()  
380 - .eq(  
381 - StringUtils.isNoneBlank(organizationId),  
382 - YtDevice::getOrganizationId,  
383 - organizationId)); 375 + new QueryWrapper<YtDevice>().lambda().in(YtDevice::getOrganizationId, ids));
384 List<DeviceDTO> deviceDTOList = 376 List<DeviceDTO> deviceDTOList =
385 deviceList.stream() 377 deviceList.stream()
386 .map(device -> device.getDTO(DeviceDTO.class)) 378 .map(device -> device.getDTO(DeviceDTO.class))
387 .collect(Collectors.toList()); 379 .collect(Collectors.toList());
388 - return ReflectUtils.sourceToTarget(deviceDTOList, DeviceDTO.class); 380 +
  381 + List<DeviceDTO> result = new ArrayList<>();
  382 + if (!isTenantAdmin) {
  383 + // 查找分配给客户的设备
  384 + List<String> list =
  385 + deviceMapper.findDeviceIdsByCustomerId(userMapper.findUserCustomerIdById(currentUserId));
  386 + list.forEach(
  387 + id -> {
  388 + for (DeviceDTO dto : deviceDTOList) {
  389 + if (dto.getTbDeviceId().equals(id)) {
  390 + result.add(dto);
  391 + break;
  392 + }
  393 + }
  394 + });
  395 + }
  396 + return result;
389 } 397 }
390 } 398 }
@@ -47,9 +47,17 @@ public interface DeviceMapper extends BaseMapper<YtDevice> { @@ -47,9 +47,17 @@ public interface DeviceMapper extends BaseMapper<YtDevice> {
47 47
48 /** 48 /**
49 * 获取关联设备的子设备分页列表 49 * 获取关联设备的子设备分页列表
50 - * @param page 分页 50 + *
  51 + * @param page 分页
51 * @param queryMap 查询条件 52 * @param queryMap 查询条件
52 * @return 分页数据 53 * @return 分页数据
53 */ 54 */
54 IPage<RelationDeviceDTO> getRelationDevicePage(IPage<?> page, @Param("queryMap") Map<String, Object> queryMap); 55 IPage<RelationDeviceDTO> getRelationDevicePage(IPage<?> page, @Param("queryMap") Map<String, Object> queryMap);
  56 +
  57 + /**
  58 + * 通过用户ID查询分配的所有设备ID
  59 + * @param customerId 用户ID
  60 + * @return 所有的设备ids
  61 + */
  62 + List<String> findDeviceIdsByCustomerId(@Param("customerId")String customerId);
55 } 63 }
@@ -58,9 +58,12 @@ public interface SceneLinkageService extends BaseService<SceneLinkage>{ @@ -58,9 +58,12 @@ public interface SceneLinkageService extends BaseService<SceneLinkage>{
58 58
59 /** 59 /**
60 * 通过组织id查询设备集合 60 * 通过组织id查询设备集合
61 - * @param organizationId 61 + * @param organizationId 组织ID
  62 + * @param isTenantAdmin true租户管理员 false客户
  63 + * @param tenantId 租户ID
  64 + * @param currentUserId 当前用户ID
62 * @return 65 * @return
63 */ 66 */
64 - List<DeviceDTO> findDeviceList(String organizationId); 67 + List<DeviceDTO> findDeviceList(String organizationId,boolean isTenantAdmin,String tenantId,String currentUserId);
65 68
66 } 69 }
@@ -206,4 +206,8 @@ @@ -206,4 +206,8 @@
206 </if> 206 </if>
207 </where> 207 </where>
208 </select> 208 </select>
  209 + <select id="findDeviceIdsByCustomerId" resultType="java.lang.String">
  210 + SELECT idi.tb_device_id FROM iotfs_device idi LEFT JOIN device d ON d.id::TEXT = idi.tb_device_id
  211 + WHERE customer_id::TEXT = #{customerId}
  212 + </select>
209 </mapper> 213 </mapper>
1 -<?xml version="1.0" encoding="UTF-8"?>  
2 -<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
3 -  
4 -<mapper namespace="com.codeez.mapper.DeviceTypeMapper">  
5 - <resultMap type="org.thingsboard.server.common.data.yunteng.dto.DeviceTypeDTO" id="deviceTypeMap">  
6 - <result property="id" column="id"/>  
7 - <result property="name" column="name"/>  
8 - <result property="parentId" column="parent_id"/>  
9 - <result property="path" column="path"/>  
10 - <result property="sort" column="sort"/>  
11 - <result property="tenantId" column="tenant_id"/>  
12 - <result property="createTime" column="create_time"/>  
13 - <result property="updateTime" column="update_time"/>  
14 - <result property="creator" column="creator"/>  
15 - <result property="updater" column="updater"/>  
16 - </resultMap>  
17 -</mapper>