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 14 import org.thingsboard.server.common.data.yunteng.common.DeleteGroup;
15 15 import org.thingsboard.server.common.data.yunteng.common.UpdateGroup;
16 16 import org.thingsboard.server.common.data.yunteng.dto.DeleteDTO;
  17 +import org.thingsboard.server.common.data.yunteng.dto.DeviceDTO;
17 18 import org.thingsboard.server.common.data.yunteng.dto.SceneLinkageDTO;
18 19 import org.thingsboard.server.common.data.yunteng.dto.TriggerDTO;
19 20 import org.thingsboard.server.common.data.yunteng.utils.tools.YtPageData;
... ... @@ -29,9 +30,7 @@ import java.util.Optional;
29 30 import static org.thingsboard.server.common.data.yunteng.constant.QueryConstant.PAGE;
30 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 34 @RestController
36 35 @RequestMapping("/api/yt/sceneLinkage")
37 36 @RequiredArgsConstructor
... ... @@ -39,84 +38,88 @@ import static org.thingsboard.server.common.data.yunteng.constant.QueryConstant.
39 38 @PreAuthorize("hasAnyAuthority('TENANT_ADMIN','CUSTOMER_USER')")
40 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 35 private final TriggerService triggerService;
36 36 private final DoConditionService doConditionService;
37 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 196 */
196 197 @Override
197 198 @Transactional
198   - public SceneLinkageDTO updateSceneLinkage(SceneLinkageDTO sceneLinkageDTO,String tenantId) {
  199 + public SceneLinkageDTO updateSceneLinkage(SceneLinkageDTO sceneLinkageDTO, String tenantId) {
199 200 // 获取场景
200 201 SceneLinkage sceneLinkage = baseMapper.selectById(sceneLinkageDTO.getId());
201 202 if (sceneLinkage == null) {
... ... @@ -296,7 +297,7 @@ public class SceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageMap
296 297 // 拿到传入的组织id
297 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 302 List<String> organizationIds = new ArrayList<>();
302 303 // 添加拿到的组织
... ... @@ -314,20 +315,6 @@ public class SceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageMap
314 315 }
315 316 IPage<SceneLinkage> page = getPage(queryMap, FastIotConstants.DefaultOrder.CREATE_TIME, false);
316 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 318 return getPageData(scenePage, SceneLinkageDTO.class);
332 319 }
333 320 /** 获取当前租户的场景联动 */
... ... @@ -367,24 +354,45 @@ public class SceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageMap
367 354 /**
368 355 * 通过组织id查询全部的设备集合
369 356 *
370   - * @param organizationId
  357 + * @param organizationId 组织ID
  358 + * @param isTenantAdmin true租户管理员 false客户
  359 + * @param tenantId 租户ID
371 360 * @return 设备集合
372 361 */
373 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 373 List<YtDevice> deviceList =
377 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 376 List<DeviceDTO> deviceDTOList =
385 377 deviceList.stream()
386 378 .map(device -> device.getDTO(DeviceDTO.class))
387 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 47
48 48 /**
49 49 * 获取关联设备的子设备分页列表
50   - * @param page 分页
  50 + *
  51 + * @param page 分页
51 52 * @param queryMap 查询条件
52 53 * @return 分页数据
53 54 */
54 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 58
59 59 /**
60 60 * 通过组织id查询设备集合
61   - * @param organizationId
  61 + * @param organizationId 组织ID
  62 + * @param isTenantAdmin true租户管理员 false客户
  63 + * @param tenantId 租户ID
  64 + * @param currentUserId 当前用户ID
62 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 206 </if>
207 207 </where>
208 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 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>