Commit 0fe62bddcefa0d6a1a8b368c0cc9af7918875700

Authored by 黄 x
1 parent f9810f43

feat: 网关设备查询关联网关子设备分页

... ... @@ -32,6 +32,7 @@ import org.thingsboard.server.common.data.yunteng.core.exception.YtDataValidatio
32 32 import org.thingsboard.server.common.data.yunteng.core.message.ErrorMessage;
33 33 import org.thingsboard.server.common.data.yunteng.dto.DeleteDTO;
34 34 import org.thingsboard.server.common.data.yunteng.dto.DeviceDTO;
  35 +import org.thingsboard.server.common.data.yunteng.dto.RelationDeviceDTO;
35 36 import org.thingsboard.server.common.data.yunteng.dto.YtCredentialsDto;
36 37 import org.thingsboard.server.common.data.yunteng.enums.DeviceState;
37 38 import org.thingsboard.server.common.data.yunteng.enums.DeviceTypeEnum;
... ... @@ -266,6 +267,40 @@ public class YtDeviceController extends BaseController {
266 267 }
267 268 return deviceService.page(getCurrentUser().getCurrentTenantId(), queryMap);
268 269 }
  270 + @PreAuthorize("hasAnyAuthority('TENANT_ADMIN','CUSTOMER_USER')")
  271 + @GetMapping(path = {"/relation"},params = {PAGE_SIZE, PAGE})
  272 + @ApiOperation("子设备查询")
  273 + public YtPageData<RelationDeviceDTO> pageRelationDevice(
  274 + @RequestParam(PAGE_SIZE) int pageSize,
  275 + @RequestParam(PAGE) int page,
  276 + @RequestParam(value = "name", required = false) String name,
  277 + @RequestParam(value = "deviceState", required = false) DeviceState deviceState,
  278 + @RequestParam(value = "fromId") String fromId,
  279 + @RequestParam(value = ORDER_FILED, required = false) String orderBy,
  280 + @RequestParam(value = ORDER_TYPE, required = false) OrderTypeEnum orderType) throws ThingsboardException {
  281 + HashMap<String, Object> queryMap = new HashMap<>();
  282 + queryMap.put(PAGE_SIZE, pageSize);
  283 + queryMap.put(PAGE, page);
  284 + queryMap.put(ORDER_FILED, orderBy);
  285 + queryMap.put("name", name);
  286 + queryMap.put("fromId", fromId);
  287 + queryMap.put("tenantId", getCurrentUser().getCurrentTenantId());
  288 + if (deviceState != null) {
  289 + if(deviceState != DeviceState.INACTIVE){
  290 + queryMap.put("deviceState", deviceState == DeviceState.ONLINE);
  291 + }else{
  292 + queryMap.put("activeState",DeviceState.INACTIVE);
  293 + }
  294 + }
  295 + if (orderType != null) {
  296 + queryMap.put(ORDER_TYPE, orderType.name());
  297 + }
  298 + // 如果当前用户是客户
  299 + if (getCurrentUser().isCustomerUser()) {
  300 + queryMap.put("customerId", getCurrentUser().getCustomerId().toString());
  301 + }
  302 + return deviceService.pageRelation(queryMap);
  303 + }
269 304
270 305 @PostMapping("/import")
271 306 @ApiOperation("导入配置")
... ...
  1 +package org.thingsboard.server.common.data.yunteng.dto;
  2 +import lombok.Data;
  3 +import org.thingsboard.server.common.data.yunteng.enums.DeviceState;
  4 +
  5 +@Data
  6 +public class RelationDeviceDTO {
  7 + private String tbDeviceId;
  8 + private String tbDeviceName;
  9 + private String label;
  10 + private DeviceState deviceState;
  11 + private Long createdTime;
  12 + private Long lastOnlineTime;
  13 +
  14 + public void setDeviceState(boolean deviceState) {
  15 + if (deviceState) {
  16 + this.deviceState = DeviceState.ONLINE;
  17 + } else {
  18 + this.deviceState = DeviceState.OFFLINE;
  19 + }
  20 + }
  21 +
  22 + public DeviceState getDeviceState() {
  23 + if (lastOnlineTime == null) {
  24 + return DeviceState.INACTIVE;
  25 + }
  26 + return deviceState;
  27 + }
  28 +}
... ...
... ... @@ -3,7 +3,6 @@ package org.thingsboard.server.dao.yunteng.impl;
3 3 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
4 4 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
5 5 import com.baomidou.mybatisplus.core.metadata.IPage;
6   -import com.fasterxml.jackson.databind.JsonNode;
7 6 import lombok.RequiredArgsConstructor;
8 7 import lombok.extern.slf4j.Slf4j;
9 8 import org.apache.commons.lang3.StringUtils;
... ... @@ -12,18 +11,16 @@ import org.springframework.transaction.annotation.Transactional;
12 11 import org.thingsboard.server.common.data.DeviceProfile;
13 12 import org.thingsboard.server.common.data.id.EntityId;
14 13 import org.thingsboard.server.common.data.id.TenantId;
15   -import org.thingsboard.server.common.data.security.DeviceCredentials;
16 14 import org.thingsboard.server.common.data.yunteng.constant.FastIotConstants;
17 15 import org.thingsboard.server.common.data.yunteng.constant.ModelConstants;
18 16 import org.thingsboard.server.common.data.yunteng.core.exception.YtDataValidationException;
19 17 import org.thingsboard.server.common.data.yunteng.core.message.ErrorMessage;
20 18 import org.thingsboard.server.common.data.yunteng.dto.DeviceDTO;
21 19 import org.thingsboard.server.common.data.yunteng.dto.OrganizationDTO;
22   -import org.thingsboard.server.common.data.yunteng.enums.DeviceState;
  20 +import org.thingsboard.server.common.data.yunteng.dto.RelationDeviceDTO;
23 21 import org.thingsboard.server.common.data.yunteng.enums.DeviceTypeEnum;
24 22 import org.thingsboard.server.common.data.yunteng.utils.ReflectUtils;
25 23 import org.thingsboard.server.common.data.yunteng.utils.tools.YtPageData;
26   -import org.thingsboard.server.dao.device.DeviceCredentialsDao;
27 24 import org.thingsboard.server.dao.device.DeviceProfileDao;
28 25 import org.thingsboard.server.dao.yunteng.entities.Organization;
29 26 import org.thingsboard.server.dao.yunteng.entities.YtDevice;
... ... @@ -42,7 +39,6 @@ public class YtDeviceServiceImpl extends AbstractBaseService<DeviceMapper, YtDev
42 39 implements YtDeviceService {
43 40
44 41 private final DeviceProfileDao deviceProfileDao;
45   - private final DeviceCredentialsDao deviceCredentialsDao;
46 42
47 43 private final OrganizationMapper ytOrganizationMapper;
48 44
... ... @@ -258,6 +254,14 @@ public class YtDeviceServiceImpl extends AbstractBaseService<DeviceMapper, YtDev
258 254 }
259 255
260 256 @Override
  257 + public YtPageData<RelationDeviceDTO> pageRelation(Map<String, Object> queryMap) {
  258 + IPage<YtDevice> page = getPage(queryMap, "last_online_time", false);
  259 + IPage<RelationDeviceDTO> deviceIPage = baseMapper.getRelationDevicePage(page, queryMap);
  260 + List<RelationDeviceDTO> records = deviceIPage.getRecords();
  261 + return new YtPageData<>(records, deviceIPage.getTotal());
  262 + }
  263 +
  264 + @Override
261 265 public List<DeviceDTO> findTbDeviceId(String tenantId, DeviceDTO deviceDTO) {
262 266 List<YtDevice> deviceList =
263 267 baseMapper.selectList(
... ...
... ... @@ -6,6 +6,7 @@ import org.apache.ibatis.annotations.Mapper;
6 6 import org.apache.ibatis.annotations.Param;
7 7 import org.thingsboard.server.common.data.Device;
8 8 import org.thingsboard.server.common.data.yunteng.dto.DeviceDTO;
  9 +import org.thingsboard.server.common.data.yunteng.dto.RelationDeviceDTO;
9 10 import org.thingsboard.server.dao.yunteng.entities.YtDevice;
10 11
11 12 import java.util.List;
... ... @@ -21,7 +22,8 @@ public interface DeviceMapper extends BaseMapper<YtDevice> {
21 22
22 23 /**
23 24 * 通过网关子设备的TB设备ID查询网关设备信息
24   - * @param tbDeviceId 网关子设备的TB设备ID
  25 + *
  26 + * @param tbDeviceId 网关子设备的TB设备ID
25 27 * @return 网关设备信息
26 28 */
27 29 List<DeviceDTO> findGateWayDeviceByTbDeviceId(@Param("tbDeviceId") String tbDeviceId);
... ... @@ -31,14 +33,23 @@ public interface DeviceMapper extends BaseMapper<YtDevice> {
31 33 *
32 34 * @param tbDeviceId TB设备主键
33 35 * @param created 告警状态:0正常,1告警
34   - * @return
  36 + * @return true or false
35 37 */
36   - boolean freshAlarmStatus(@Param("tbDeviceId") String tbDeviceId,@Param("created") Integer created);
  38 + boolean freshAlarmStatus(@Param("tbDeviceId") String tbDeviceId, @Param("created") Integer created);
37 39
38 40 /**
39 41 * 用于统计设备相关信息
  42 + *
40 43 * @param queryMap 查询条件
41 44 * @return 查询的设备信息
42 45 */
43   - List<DeviceDTO> findDevices(@Param("queryMap") Map<String,Object> queryMap);
  46 + List<DeviceDTO> findDevices(@Param("queryMap") Map<String, Object> queryMap);
  47 +
  48 + /**
  49 + * 获取关联设备的子设备分页列表
  50 + * @param page 分页
  51 + * @param queryMap 查询条件
  52 + * @return 分页数据
  53 + */
  54 + IPage<RelationDeviceDTO> getRelationDevicePage(IPage<?> page, @Param("queryMap") Map<String, Object> queryMap);
44 55 }
... ...
1 1 package org.thingsboard.server.dao.yunteng.service;
2 2
3   -import org.thingsboard.server.common.data.id.DeviceId;
4 3 import org.thingsboard.server.common.data.id.EntityId;
5 4 import org.thingsboard.server.common.data.yunteng.dto.DeviceDTO;
  5 +import org.thingsboard.server.common.data.yunteng.dto.RelationDeviceDTO;
6 6 import org.thingsboard.server.common.data.yunteng.enums.DeviceTypeEnum;
7 7 import org.thingsboard.server.common.data.yunteng.utils.tools.YtPageData;
8 8
... ... @@ -12,74 +12,77 @@ import java.util.Optional;
12 12 import java.util.Set;
13 13
14 14 public interface YtDeviceService {
15   - DeviceDTO insertOrUpdate(String tenantId, DeviceDTO deviceDTO);
  15 + DeviceDTO insertOrUpdate(String tenantId, DeviceDTO deviceDTO);
16 16
17   - void deleteDevices(String tenantId, Set<String> ids);
  17 + void deleteDevices(String tenantId, Set<String> ids);
18 18
19   - Optional<DeviceDTO> getDevice(String tenantId, String id);
  19 + Optional<DeviceDTO> getDevice(String tenantId, String id);
20 20
21   - YtPageData<DeviceDTO> page(String tenantId, Map<String, Object> queryMap);
  21 + YtPageData<DeviceDTO> page(String tenantId, Map<String, Object> queryMap);
22 22
23   - /**
24   - * 验证表单数据有效性
25   - *
26   - * @param ytDevice
27   - */
28   - boolean validateFormdata(String currentTenantId, DeviceDTO ytDevice);
  23 + YtPageData<RelationDeviceDTO> pageRelation(Map<String, Object> queryMap);
29 24
30   - /**
31   - * 查询所有的设备信息
32   - *
33   - * @param deviceDTO 过滤参数
34   - * @return List<DeviceDTO>
35   - */
36   - List<DeviceDTO> findTbDeviceId(String tenantId, DeviceDTO deviceDTO);
  25 + /**
  26 + * 验证表单数据有效性
  27 + *
  28 + * @param ytDevice
  29 + */
  30 + boolean validateFormdata(String currentTenantId, DeviceDTO ytDevice);
37 31
38   - List<String> findTbDeviceId(String tenantId, Set<String> ids);
  32 + /**
  33 + * 查询所有的设备信息
  34 + *
  35 + * @param deviceDTO 过滤参数
  36 + * @return List<DeviceDTO>
  37 + */
  38 + List<DeviceDTO> findTbDeviceId(String tenantId, DeviceDTO deviceDTO);
39 39
40   - /**
41   - * 通过设备类型和组织ID查询所有的设备
42   - *
43   - * @param deviceType 设备类型
44   - * @param organizationId 组织ID
45   - * @return 设备列表
46   - */
47   - List<DeviceDTO> findDevicesByDeviceTypeAndOrganizationId(DeviceTypeEnum deviceType, String organizationId);
  40 + List<String> findTbDeviceId(String tenantId, Set<String> ids);
48 41
49   - /**
50   - * 通过设备ID和租户ID判断该设备是否存在
51   - *
52   - * @param tenantId 租户ID
53   - * @param deviceId 设备ID
54   - * @return 设备
55   - */
56   - DeviceDTO checkDeviceByTenantIdAndDeviceId(String tenantId, String deviceId);
  42 + /**
  43 + * 通过设备类型和组织ID查询所有的设备
  44 + *
  45 + * @param deviceType 设备类型
  46 + * @param organizationId 组织ID
  47 + * @return 设备列表
  48 + */
  49 + List<DeviceDTO> findDevicesByDeviceTypeAndOrganizationId(
  50 + DeviceTypeEnum deviceType, String organizationId);
57 51
58   - /**
59   - * 通过网关子设备的TB设备ID查询网关设备信息
60   - *
61   - * @param tbDeviceId 网关子设备的TB设备ID
62   - * @param tenantId 租户ID
63   - * @return 网关设备信息
64   - */
65   - List<DeviceDTO> findGateWayDeviceByTbDeviceId(String tenantId, String tbDeviceId);
  52 + /**
  53 + * 通过设备ID和租户ID判断该设备是否存在
  54 + *
  55 + * @param tenantId 租户ID
  56 + * @param deviceId 设备ID
  57 + * @return 设备
  58 + */
  59 + DeviceDTO checkDeviceByTenantIdAndDeviceId(String tenantId, String deviceId);
66 60
67   - /**
68   - * 通过设备ID和租户ID检查设备是否存在
69   - *
70   - * @param tenantId 租户ID
71   - * @param deviceId 设备ID
72   - * @param isTbDeviceId 是TB设备ID
73   - * @return 设备信息
74   - */
75   - DeviceDTO checkDeviceByTenantIdAndId(String tenantId, String deviceId, boolean isTbDeviceId);
  61 + /**
  62 + * 通过网关子设备的TB设备ID查询网关设备信息
  63 + *
  64 + * @param tbDeviceId 网关子设备的TB设备ID
  65 + * @param tenantId 租户ID
  66 + * @return 网关设备信息
  67 + */
  68 + List<DeviceDTO> findGateWayDeviceByTbDeviceId(String tenantId, String tbDeviceId);
76 69
77   - /**
78   - * 更新设备告警状态
79   - *
80   - * @param tbDeviceId TB设备主键
81   - * @param created 告警状态:0正常,1告警
82   - * @return
83   - */
84   - boolean freshAlarmStatus(EntityId tbDeviceId, Integer created);
  70 + /**
  71 + * 通过设备ID和租户ID检查设备是否存在
  72 + *
  73 + * @param tenantId 租户ID
  74 + * @param deviceId 设备ID
  75 + * @param isTbDeviceId 是TB设备ID
  76 + * @return 设备信息
  77 + */
  78 + DeviceDTO checkDeviceByTenantIdAndId(String tenantId, String deviceId, boolean isTbDeviceId);
  79 +
  80 + /**
  81 + * 更新设备告警状态
  82 + *
  83 + * @param tbDeviceId TB设备主键
  84 + * @param created 告警状态:0正常,1告警
  85 + * @return
  86 + */
  87 + boolean freshAlarmStatus(EntityId tbDeviceId, Integer created);
85 88 }
... ...
... ... @@ -33,6 +33,14 @@
33 33 <result property="name" column="organization_name"/>
34 34 </association>
35 35 </resultMap>
  36 + <resultMap id="relationDeviceMap" type="org.thingsboard.server.common.data.yunteng.dto.RelationDeviceDTO">
  37 + <result property="tbDeviceId" column="id"/>
  38 + <result property="tbDeviceName" column="name"/>
  39 + <result property="label" column="label"/>
  40 + <result property="deviceState" column="status" />
  41 + <result property="createdTime" column="created_time"/>
  42 + <result property="lastOnlineTime" column="last_online_time"/>
  43 + </resultMap>
36 44 <sql id="basicColumns">
37 45 ifd.id,ifd.name,ifd.device_info,ifd.profile_id,ifd.active_time,ifd.tenant_id,ifd.description
38 46 ,ifd.tb_device_id,ifd.label,ifd.last_connect_time,ifd.device_type,ifd.device_state,ifd.create_time,ifd.update_time,ifd.creator,
... ... @@ -163,4 +171,39 @@
163 171 </if>
164 172 </where>
165 173 </select>
  174 + <select id="getRelationDevicePage" resultMap="relationDeviceMap">
  175 + SELECT
  176 + de.id,
  177 + de.name,
  178 + de.label,
  179 + de.created_time,
  180 + A.bool_v AS status,
  181 + b.long_v AS last_online_time
  182 + FROM
  183 + device de
  184 + LEFT JOIN relation rt ON de."id" = rt.to_id
  185 + LEFT JOIN attribute_kv A ON de."id" = A.entity_id
  186 + AND A.entity_type = 'DEVICE'
  187 + AND A.attribute_key = 'active'
  188 + LEFT JOIN attribute_kv b ON de."id" = b.entity_id
  189 + AND b.entity_type = 'DEVICE'
  190 + AND b.attribute_key = 'lastActivityTime'
  191 + <where>
  192 + rt.from_id ::TEXT = #{queryMap.fromId}
  193 + AND de.tenant_id ::TEXT = #{queryMap.tenantId}
  194 + <if test="queryMap.customerId !=null and queryMap.customerId !=''">
  195 + AND de.customer_id ::TEXT = #{queryMap.customerId}
  196 + </if>
  197 + <if test="queryMap.name !=null and queryMap.name !=''">
  198 + AND de.name LIKE concat('%',#{queryMap.name}::TEXT,'%')
  199 + </if>
  200 + <if test="queryMap.deviceState !=null">
  201 + AND A.bool_v = #{queryMap.deviceState}
  202 + AND b.long_v IS NOT NULL
  203 + </if>
  204 + <if test="queryMap.activeState !=null">
  205 + AND b.long_v IS NULL
  206 + </if>
  207 + </where>
  208 + </select>
166 209 </mapper>
... ...