Commit a5d4c85bf5a032f35f9416fe2b08215fe4eb9815

Authored by 云中非
2 parents cf8b65a3 5baeb608

Merge branch 'master' into ljl1207

Showing 37 changed files with 1140 additions and 107 deletions
... ... @@ -557,7 +557,7 @@ public abstract class BaseController {
557 557 }
558 558 }
559 559
560   - DeviceProfile checkDeviceProfileId(DeviceProfileId deviceProfileId, Operation operation) throws ThingsboardException {
  560 + protected DeviceProfile checkDeviceProfileId(DeviceProfileId deviceProfileId, Operation operation) throws ThingsboardException {
561 561 try {
562 562 validateId(deviceProfileId, "Incorrect deviceProfileId " + deviceProfileId);
563 563 DeviceProfile deviceProfile = deviceProfileService.findDeviceProfileById(getCurrentUser().getTenantId(), deviceProfileId);
... ...
... ... @@ -105,6 +105,8 @@ public class YtDeviceController extends BaseController {
105 105 @RequestParam(value = "deviceState", required = false) DeviceState deviceState,
106 106 @RequestParam(value = "deviceType", required = false) DeviceTypeEnum deviceType,
107 107 @RequestParam(value = "organizationId",required = false) String organizationId,
  108 + @RequestParam(value = "alarmStatus",required = false) Integer alarmStatus,
  109 + @RequestParam(value = "profileId",required = false) String profileId,
108 110 @RequestParam(value = ORDER_FILED, required = false) String orderBy,
109 111 @RequestParam(value = ORDER_TYPE, required = false) OrderTypeEnum orderType) throws ThingsboardException {
110 112 HashMap<String, Object> queryMap = new HashMap<>();
... ... @@ -112,6 +114,8 @@ public class YtDeviceController extends BaseController {
112 114 queryMap.put(PAGE, page);
113 115 queryMap.put(ORDER_FILED, orderBy);
114 116 queryMap.put("name", name);
  117 + queryMap.put("alarmStatus", alarmStatus);
  118 + queryMap.put("profileId", profileId);
115 119 if (deviceState != null) {
116 120 queryMap.put("deviceState", deviceState.name());
117 121 }
... ...
  1 +package org.thingsboard.server.controller.yunteng;
  2 +
  3 +import io.swagger.annotations.Api;
  4 +import io.swagger.annotations.ApiOperation;
  5 +import lombok.RequiredArgsConstructor;
  6 +import org.springframework.http.HttpStatus;
  7 +import org.springframework.http.ResponseEntity;
  8 +import org.springframework.validation.annotation.Validated;
  9 +import org.springframework.web.bind.annotation.*;
  10 +import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
  11 +import org.thingsboard.server.common.data.exception.ThingsboardException;
  12 +import org.thingsboard.server.common.data.yunteng.common.AddGroup;
  13 +import org.thingsboard.server.common.data.yunteng.common.DeleteGroup;
  14 +import org.thingsboard.server.common.data.yunteng.common.UpdateGroup;
  15 +import org.thingsboard.server.common.data.yunteng.dto.DeleteDTO;
  16 +import org.thingsboard.server.common.data.yunteng.dto.SceneLinkageDTO;
  17 +import org.thingsboard.server.common.data.yunteng.dto.TriggerDTO;
  18 +import org.thingsboard.server.common.data.yunteng.utils.tools.PageData;
  19 +import org.thingsboard.server.controller.BaseController;
  20 +import org.thingsboard.server.dao.yunteng.service.SceneLinkageService;
  21 +
  22 +import java.net.URI;
  23 +import java.util.HashMap;
  24 +import java.util.List;
  25 +import java.util.Map;
  26 +import java.util.Optional;
  27 +
  28 +import static org.thingsboard.server.common.data.yunteng.constant.QueryConstant.PAGE;
  29 +import static org.thingsboard.server.common.data.yunteng.constant.QueryConstant.PAGE_SIZE;
  30 +
  31 +/** @Description 场景联动 @Author cxy @Date 2021/11/25 11:25 */
  32 +@RestController
  33 +@RequestMapping("/api/yt/sceneLinkage")
  34 +@RequiredArgsConstructor
  35 +@Api(tags = "场景联动")
  36 +public class YtSceneLinkageController extends BaseController {
  37 +
  38 + private final SceneLinkageService sceneLinkageService;
  39 +
  40 + @ApiOperation(value = "保存新增的场景联动数据")
  41 + @PostMapping
  42 + public ResponseEntity<SceneLinkageDTO> saveSceneLinkage(
  43 + @Validated(AddGroup.class) @RequestBody SceneLinkageDTO sceneLinkageDTO)
  44 + throws ThingsboardException {
  45 + SceneLinkageDTO newSceneLinkageDTO =
  46 + sceneLinkageService.saveScenelinkage(
  47 + sceneLinkageDTO, getCurrentUser().getCurrentTenantId());
  48 + return Optional.ofNullable(newSceneLinkageDTO)
  49 + .map(
  50 + dto -> {
  51 + URI location =
  52 + ServletUriComponentsBuilder.fromCurrentRequest()
  53 + .path("/{id}")
  54 + .buildAndExpand(newSceneLinkageDTO.getId())
  55 + .toUri();
  56 + return ResponseEntity.created(location).body(newSceneLinkageDTO);
  57 + })
  58 + .orElse(ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build());
  59 + }
  60 +
  61 + @ApiOperation("修改场景联动的数据")
  62 + @PostMapping("/update")
  63 + public void updateSceneLinkage(
  64 + @Validated(UpdateGroup.class) @RequestBody SceneLinkageDTO sceneLinkageDTO) {
  65 + sceneLinkageService.updateSceneLinkage(sceneLinkageDTO);
  66 + }
  67 +
  68 + @ApiOperation("场景联动的分页")
  69 + @GetMapping(params = {PAGE_SIZE, PAGE})
  70 + public PageData<SceneLinkageDTO> page(
  71 + @RequestParam(PAGE_SIZE) int pageSize,
  72 + @RequestParam(PAGE) int page,
  73 + @RequestParam(value = "name", required = false) String name,
  74 + @RequestParam(value = "status", required = false) Integer status,
  75 + @RequestParam(value = "organizationId", required = false) String organizationId,
  76 + @RequestParam(value = "triggers", required = false) List<TriggerDTO> triggers)
  77 + throws ThingsboardException {
  78 + HashMap<String, Object> queryMap = new HashMap<>();
  79 + queryMap.put(PAGE_SIZE, pageSize);
  80 + queryMap.put(PAGE, page);
  81 + queryMap.put("name", name);
  82 + queryMap.put("status", status);
  83 + queryMap.put("organizationId", organizationId);
  84 + queryMap.put("triggers", triggers);
  85 + return sceneLinkageService.page(queryMap, getCurrentUser().getCurrentTenantId());
  86 + }
  87 +
  88 + @ApiOperation(value = "删除场景联动")
  89 + @DeleteMapping
  90 + public void delete(@Validated({DeleteGroup.class}) @RequestBody DeleteDTO deleteDTO)
  91 + throws ThingsboardException {
  92 + sceneLinkageService.deleteSceneLinkage(
  93 + deleteDTO.getIds(), getCurrentUser().getCurrentTenantId());
  94 + }
  95 +
  96 + @ApiOperation(value = "修改场景联动所属状态")
  97 + @PutMapping("/updateSceneStatus/{sceneLinkageId}/{status}")
  98 + public void updateRoleStatus(
  99 + @PathVariable String sceneLinkageId, @PathVariable("status") int status)
  100 + throws ThingsboardException {
  101 +
  102 + sceneLinkageService.updateSceneStatus(
  103 + sceneLinkageId, status, getCurrentUser().getCurrentTenantId());
  104 + }
  105 +
  106 + @ApiOperation(value = "通过场景id获取所属组织的设备集合")
  107 + @GetMapping("/device")
  108 + public ResponseEntity<Map> findDeviceList(@RequestParam String organizationId) {
  109 + HashMap<String, Object> map =
  110 + new HashMap<>() {
  111 + {
  112 + put("items", sceneLinkageService.findDeviceList(organizationId));
  113 + }
  114 + };
  115 + return ResponseEntity.ok(map);
  116 + }
  117 +}
... ...
... ... @@ -60,6 +60,14 @@ public final class ModelConstants {
60 60 public static final String SYS_APP_DESIGN_TABLE_NAME = "sys_app_design";
61 61 /** 中国城镇区街 */
62 62 public static final String SYS_TOWN_TABLE_NAME = "sys_town";
  63 + /** 场景联动表 */
  64 + public static final String IOTFS_SCENE_LINKAGE_TABLE_NAME = "iotfs_scene_linkage";
  65 + /** 场景触发器 */
  66 + public static final String IOTFS_TRIGGER_TABLE_NAME = "iotfs_trigger";
  67 + /** 执行条件表 */
  68 + public static final String IOTFS_DO_CONDITION_TABLE_NAME = "iotfs_do_condition";
  69 + /** 条件动作表 */
  70 + public static final String IOTFS_DO_ACTION_TABLE_NAME = "iotfs_do_action";
63 71 }
64 72
65 73 public static class TableFields {
... ...
... ... @@ -70,5 +70,6 @@ public class DeviceDTO extends TenantDTO {
70 70 /** 设备凭证 */
71 71 private DeviceCredentialsType deviceCredentials;
72 72 /** 告警状态:0:正常 1:告警 */
  73 + @ApiModelProperty(value="告警状态:0正常,1告警")
73 74 private Integer alarmStatus;
74 75 }
... ...
  1 +package org.thingsboard.server.common.data.yunteng.dto;
  2 +
  3 +import io.swagger.annotations.ApiModelProperty;
  4 +import lombok.Data;
  5 +import lombok.EqualsAndHashCode;
  6 +
  7 +import java.util.List;
  8 +
  9 +/**
  10 + * @Description 场景联动执行动作数据传输表
  11 + * @Author cxy
  12 + * @Date 2021/11/24 17:32
  13 + */
  14 +@Data
  15 +@EqualsAndHashCode(callSuper = true)
  16 +public class DoActionDTO extends TenantDTO{
  17 +
  18 + @ApiModelProperty(value = "所属设备id")
  19 + private String deviceId;
  20 +
  21 + @ApiModelProperty(value = "设备输出方式")
  22 + private String outPut;
  23 +
  24 + @ApiModelProperty(value = "下发指令")
  25 + private String command;
  26 +
  27 + @ApiModelProperty(value = "输出目标:设备,场景,其他")
  28 + private String outTarget;
  29 +
  30 + @ApiModelProperty(value = "场景联动id")
  31 + private String sceneLinkageId;
  32 +
  33 + @ApiModelProperty(value = "所属设备集合")
  34 + private List<DeviceDTO> deviceDTOList;
  35 +}
... ...
  1 +package org.thingsboard.server.common.data.yunteng.dto;
  2 +
  3 +import io.swagger.annotations.ApiModelProperty;
  4 +import lombok.Data;
  5 +import lombok.EqualsAndHashCode;
  6 +
  7 +import java.util.List;
  8 +
  9 +/**
  10 + * @Description 场景联动执行条件数据传输表
  11 + * @Author cxy
  12 + * @Date 2021/11/24 17:33
  13 + */
  14 +@Data
  15 +@EqualsAndHashCode(callSuper = true)
  16 +public class DoConditionDTO extends TenantDTO{
  17 +
  18 + @ApiModelProperty(value = "所属设备id")
  19 + private String deviceId;
  20 +
  21 + @ApiModelProperty(value = "设备状态")
  22 + private String status;
  23 +
  24 + @ApiModelProperty(value = "属性")
  25 + private String property;
  26 +
  27 + @ApiModelProperty(value = "比较大小,0为=, 1为<, 2为 >,3为<=, 4为>=")
  28 + private Integer compare;
  29 +
  30 + @ApiModelProperty(value = "请输入比较值")
  31 + private String value;
  32 +
  33 + @ApiModelProperty(value = "场景联动id")
  34 + private String sceneLinkageId;
  35 +
  36 + @ApiModelProperty(value = "所属设备集合")
  37 + private List<DeviceDTO> deviceDTOList;
  38 +}
... ...
  1 +package org.thingsboard.server.common.data.yunteng.dto;
  2 +
  3 +import io.swagger.annotations.ApiModelProperty;
  4 +import lombok.Data;
  5 +import lombok.EqualsAndHashCode;
  6 +import org.thingsboard.server.common.data.yunteng.common.AddGroup;
  7 +
  8 +import javax.validation.constraints.NotEmpty;
  9 +import java.util.List;
  10 +
  11 +/**
  12 + * @Description 场景联动数据传输表
  13 + * @Author cxy
  14 + * @Date 2021/11/24 17:31
  15 + */
  16 +@Data
  17 +@EqualsAndHashCode(callSuper = true)
  18 +public class SceneLinkageDTO extends TenantDTO{
  19 +
  20 + @ApiModelProperty(value = "场景联动名称", required = true)
  21 + @NotEmpty(message = "名称不能为空或字符串", groups = AddGroup.class)
  22 + private String name;
  23 +
  24 + @ApiModelProperty(value = "状态:0表示已停用,1表示启用")
  25 + private Integer status;
  26 +
  27 + @ApiModelProperty(value = "描述")
  28 + private String description;
  29 +
  30 + @NotEmpty(message = "所属组织不能为空或者空字符串", groups = {AddGroup.class})
  31 + @ApiModelProperty(value = "所属组织id",required = true)
  32 + private String organizationId;
  33 +
  34 + @ApiModelProperty(value = "触发器")
  35 + private List<TriggerDTO> triggers;
  36 +
  37 + @ApiModelProperty(value = "执行动作")
  38 + private List<DoActionDTO> doActions;
  39 +
  40 + @ApiModelProperty(value = "执行条件")
  41 + private List<DoConditionDTO> doConditions;
  42 +
  43 +}
... ...
... ... @@ -32,20 +32,9 @@ public class SysEnterpriseDTO extends BaseDTO {
32 32 private String area;
33 33 @ApiModelProperty(value = "联系电话")
34 34 private String tel;
35   - @ApiModelProperty(value = "省")
36   - private String nameProv;
37   - @ApiModelProperty(value = "省code")
38   - private String codeProv;
39   - @ApiModelProperty(value = "市")
40   - private String nameCity;
41   - @ApiModelProperty(value = "市code")
42   - private String codeCity;
43   - @ApiModelProperty(value = "区")
44   - private String nameCoun;
45   - @ApiModelProperty(value = "区code")
46   - private String codeCoun;
47   - @ApiModelProperty(value = "县")
48   - private String nameTown;
49   - @ApiModelProperty(value = "县code")
  35 + @ApiModelProperty(value = "区域信息")
  36 + private SysTownDTO sysTown;
50 37 private String codeTown;
  38 + @ApiModelProperty(value = "二维码")
  39 + private String qrCode;
51 40 }
... ...
  1 +package org.thingsboard.server.common.data.yunteng.dto;
  2 +
  3 +import io.swagger.annotations.ApiModel;
  4 +import io.swagger.annotations.ApiModelProperty;
  5 +import lombok.Data;
  6 +import lombok.RequiredArgsConstructor;
  7 +
  8 +@Data
  9 +@ApiModel(value = "区域信息")
  10 +@RequiredArgsConstructor
  11 +public class SysTownDTO {
  12 + @ApiModelProperty(value = "省")
  13 + private String nameProv;
  14 + @ApiModelProperty(value = "省code")
  15 + private String codeProv;
  16 + @ApiModelProperty(value = "市")
  17 + private String nameCity;
  18 + @ApiModelProperty(value = "市code")
  19 + private String codeCity;
  20 + @ApiModelProperty(value = "区")
  21 + private String nameCoun;
  22 + @ApiModelProperty(value = "区code")
  23 + private String codeCoun;
  24 + @ApiModelProperty(value = "县")
  25 + private String nameTown;
  26 + @ApiModelProperty(value = "县code")
  27 + private String codeTown;
  28 +}
... ...
  1 +package org.thingsboard.server.common.data.yunteng.dto;
  2 +
  3 +import io.swagger.annotations.ApiModelProperty;
  4 +import lombok.Data;
  5 +import lombok.EqualsAndHashCode;
  6 +
  7 +import java.util.List;
  8 +
  9 +/**
  10 + * @Description 场景联动触发器数据传输表
  11 + * @Author cxy
  12 + * @Date 2021/11/24 17:32
  13 + */
  14 +@Data
  15 +@EqualsAndHashCode(callSuper = true)
  16 +public class TriggerDTO extends TenantDTO{
  17 +
  18 + @ApiModelProperty(value = "所属设备id")
  19 + private String deviceId;
  20 +
  21 + @ApiModelProperty(value = "触发方式")
  22 + private String touchWay;
  23 +
  24 + @ApiModelProperty(value = "触发事件")
  25 + private String triggerEvent;
  26 +
  27 + @ApiModelProperty(value = "属性选择")
  28 + private String attributeChoose;
  29 +
  30 + @ApiModelProperty(value = "场景联动id")
  31 + private String sceneLinkageId;
  32 +
  33 + @ApiModelProperty(value = "比较大小,0为=, 1为<, 2为 >,3为<=, 4为>=")
  34 + private Integer compare;
  35 +
  36 + @ApiModelProperty(value = "请输入比较值")
  37 + private String value;
  38 +
  39 + @ApiModelProperty(value = "设备集合")
  40 + private List<DeviceDTO> deviceDTOList;
  41 +}
... ...
  1 +package org.thingsboard.server.common.data.yunteng.enums;
  2 +
  3 +public enum AreaLevelEnum {
  4 + COUNTRY,
  5 + PROVINCE,
  6 + CITY,
  7 + COUNTY,
  8 + TOWN
  9 +}
... ...
  1 +package org.thingsboard.server.dao.yunteng.entities;
  2 +import com.baomidou.mybatisplus.annotation.TableName;
  3 +import lombok.Data;
  4 +import lombok.EqualsAndHashCode;
  5 +import org.thingsboard.server.common.data.yunteng.constant.ModelConstants;
  6 +
  7 +/** @Description 执行动作 @Author cxy @Date 2021/11/24 17:24 */
  8 +@Data
  9 +@TableName(value = ModelConstants.Table.IOTFS_DO_ACTION_TABLE_NAME,autoResultMap = true)
  10 +@EqualsAndHashCode(callSuper = true)
  11 +public class DoAction extends TenantBaseEntity {
  12 +
  13 + private static final long serialVersionUID = -5459834451418047957L;
  14 +
  15 + private String deviceId;
  16 + /** 设备输出方式 */
  17 + private String outPut;
  18 + /** 下发指令 */
  19 + private String command;
  20 +
  21 + /** 输出目标:设备,场景,其他 */
  22 + private String outTarget;
  23 +
  24 + /** 场景联动id */
  25 + private String sceneLinkageId;
  26 +}
... ...
  1 +package org.thingsboard.server.dao.yunteng.entities;
  2 +
  3 +import com.baomidou.mybatisplus.annotation.TableName;
  4 +import lombok.Data;
  5 +import lombok.EqualsAndHashCode;
  6 +import org.thingsboard.server.common.data.yunteng.constant.ModelConstants;
  7 +
  8 +/** @Description 执行条件实体表 @Author cxy @Date 2021/11/24 17:16 */
  9 +@Data
  10 +@TableName(value = ModelConstants.Table.IOTFS_DO_CONDITION_TABLE_NAME)
  11 +@EqualsAndHashCode(callSuper = true)
  12 +public class DoCondition extends TenantBaseEntity {
  13 + private static final long serialVersionUID = 2827674377416477646L;
  14 + /** 设备 */
  15 + private String deviceId;
  16 + /** 设备状态 */
  17 + private String status;
  18 + /** 设备属性 */
  19 + private String property;
  20 +
  21 + /** 比较大小: 0为=, 1为<, 2为 >,3为<=, 4为>= */
  22 + private Integer compare;
  23 +
  24 + /** 请输入比较值 */
  25 + private String value;
  26 +
  27 + private String sceneLinkageId;
  28 +}
... ...
  1 +package org.thingsboard.server.dao.yunteng.entities;
  2 +import com.baomidou.mybatisplus.annotation.TableName;
  3 +import lombok.Data;
  4 +import lombok.EqualsAndHashCode;
  5 +import org.thingsboard.server.common.data.yunteng.constant.ModelConstants;
  6 +
  7 +/** @Description 场景联动实体表 @Author cxy @Date 2021/11/24 16:40 */
  8 +@Data
  9 +@TableName(value = ModelConstants.Table.IOTFS_SCENE_LINKAGE_TABLE_NAME)
  10 +@EqualsAndHashCode(callSuper = true)
  11 +public class SceneLinkage extends TenantBaseEntity {
  12 +
  13 + private static final long serialVersionUID = -306446373876239910L;
  14 +
  15 + private String name;
  16 + /**
  17 + * 0表示已停用,1表示启用
  18 + */
  19 + private Integer status;
  20 +
  21 + private String description;
  22 +
  23 + private String organizationId;
  24 +}
... ...
1 1 package org.thingsboard.server.dao.yunteng.entities;
2 2
3   -import com.baomidou.mybatisplus.annotation.TableField;
4 3 import com.baomidou.mybatisplus.annotation.TableName;
5 4 import lombok.Data;
6 5 import lombok.RequiredArgsConstructor;
... ... @@ -36,25 +35,6 @@ public class SysEnterprise extends TenantBaseEntity {
36 35 private String tel;
37 36 /** 县code */
38 37 private String codeTown;
39   - /** 省 */
40   - @TableField(exist = false)
41   - private String nameProv;
42   - /** 省code */
43   - @TableField(exist = false)
44   - private String codeProv;
45   - /** 市 */
46   - @TableField(exist = false)
47   - private String nameCity;
48   - /** 市code */
49   - @TableField(exist = false)
50   - private String codeCity;
51   - /** 区 */
52   - @TableField(exist = false)
53   - private String nameCoun;
54   - /** 区code */
55   - @TableField(exist = false)
56   - private String codeCoun;
57   - /** 县 */
58   - @TableField(exist = false)
59   - private String nameTown;
  38 + /** 二维码 */
  39 + private String qrCode;
60 40 }
... ...
  1 +package org.thingsboard.server.dao.yunteng.entities;
  2 +import com.baomidou.mybatisplus.annotation.TableName;
  3 +import lombok.Data;
  4 +import lombok.EqualsAndHashCode;
  5 +import org.thingsboard.server.common.data.yunteng.constant.ModelConstants;
  6 +
  7 +/** @Description 触发器实体表 @Author cxy @Date 2021/11/24 17:06 */
  8 +@Data
  9 +@TableName(value = ModelConstants.Table.IOTFS_TRIGGER_TABLE_NAME)
  10 +@EqualsAndHashCode(callSuper = true)
  11 +public class Trigger extends TenantBaseEntity {
  12 +
  13 + private static final long serialVersionUID = -1847061176808850967L;
  14 + /** 设备 */
  15 + private String deviceId;
  16 + /** 触发方式 */
  17 + private String touchWay;
  18 + /** 触发事件 */
  19 + private String triggerEvent;
  20 + /** 属性选择 */
  21 + private String attributeChoose;
  22 + /** 场景联动id */
  23 + private String sceneLinkageId;
  24 + /** 比较大小: 0为=, 1为<, 2为 >,3为<=, 4为>= */
  25 + private Integer compare;
  26 + /** 请输入比较值 */
  27 + private String value;
  28 +}
... ...
  1 +package org.thingsboard.server.dao.yunteng.impl;
  2 +import lombok.RequiredArgsConstructor;
  3 +import org.springframework.stereotype.Service;
  4 +import org.thingsboard.server.dao.yunteng.entities.DoAction;
  5 +import org.thingsboard.server.dao.yunteng.mapper.DoActionMapper;
  6 +import org.thingsboard.server.dao.yunteng.service.AbstractBaseService;
  7 +import org.thingsboard.server.dao.yunteng.service.DoActionService;
  8 +
  9 +/**
  10 + * @Description
  11 + * @Author cxy
  12 + * @Date 2021/12/6 20:23
  13 + */
  14 +@Service
  15 +@RequiredArgsConstructor
  16 +public class DoActionServiceImpl extends AbstractBaseService<DoActionMapper, DoAction>
  17 + implements DoActionService {
  18 +}
... ...
  1 +package org.thingsboard.server.dao.yunteng.impl;
  2 +import lombok.RequiredArgsConstructor;
  3 +import org.springframework.stereotype.Service;
  4 +import org.thingsboard.server.dao.yunteng.entities.DoCondition;
  5 +import org.thingsboard.server.dao.yunteng.mapper.DoConditionMapper;
  6 +import org.thingsboard.server.dao.yunteng.service.AbstractBaseService;
  7 +import org.thingsboard.server.dao.yunteng.service.DoConditionService;
  8 +
  9 +/**
  10 + * @Description
  11 + * @Author cxy
  12 + * @Date 2021/12/6 20:16
  13 + */
  14 +@Service
  15 +@RequiredArgsConstructor
  16 +public class DoConditionServiceImpl extends AbstractBaseService<DoConditionMapper, DoCondition>
  17 + implements DoConditionService {
  18 +}
... ...
... ... @@ -46,7 +46,8 @@ public class RoleServiceImpl extends AbstractBaseService<RoleMapper, Role> imple
46 46 private final UserRoleMapper userRoleMapper;
47 47
48 48 @Override
49   - public PageData<RoleDTO> page(boolean isSysadmin,boolean isPlatformAdmin, String tenantId,Map<String, Object> queryMap) {
  49 + public PageData<RoleDTO> page(
  50 + boolean isSysadmin, boolean isPlatformAdmin, String tenantId, Map<String, Object> queryMap) {
50 51 IPage<Role> roleIPage =
51 52 baseMapper.selectPage(
52 53 getPage(queryMap, "create_time", false),
... ... @@ -56,14 +57,10 @@ public class RoleServiceImpl extends AbstractBaseService<RoleMapper, Role> imple
56 57 .eq(queryMap.get("roleType") != null, Role::getRoleType, queryMap.get("roleType"))
57 58 .ne(queryMap.get("roleType") == null, Role::getRoleType, RoleEnum.TENANT_ADMIN)
58 59 .ne(
59   - queryMap.get("roleType") == null
60   - && isPlatformAdmin,
  60 + queryMap.get("roleType") == null && isPlatformAdmin,
61 61 Role::getRoleType,
62 62 RoleEnum.SYS_ADMIN)
63   - .eq(
64   - !isSysadmin,
65   - Role::getTenantId,
66   - tenantId)
  63 + .eq(!isSysadmin, Role::getTenantId, tenantId)
67 64 .like(
68 65 queryMap.get("roleName") != null,
69 66 Role::getName,
... ... @@ -73,14 +70,11 @@ public class RoleServiceImpl extends AbstractBaseService<RoleMapper, Role> imple
73 70
74 71 @Override
75 72 @Transactional
76   - public boolean deleteRole(String[] roleIds,String tenantId) {
  73 + public boolean deleteRole(String[] roleIds, String tenantId) {
77 74 Set<String> ids = Set.of(roleIds);
78 75 int notTenantMenuCount =
79 76 baseMapper.selectCount(
80   - new QueryWrapper<Role>()
81   - .lambda()
82   - .ne(Role::getTenantId, tenantId)
83   - .in(Role::getId, ids));
  77 + new QueryWrapper<Role>().lambda().ne(Role::getTenantId, tenantId).in(Role::getId, ids));
84 78 if (notTenantMenuCount > 0) {
85 79 throw new AccessDeniedException("cannot delete role that not create by you");
86 80 }
... ... @@ -99,40 +93,32 @@ public class RoleServiceImpl extends AbstractBaseService<RoleMapper, Role> imple
99 93 }
100 94
101 95 @Override
102   - public Set<String> getPermissions(boolean isSysadmin,boolean isTenantAdmin,String tenantId,String useerId) {
  96 + public Set<String> getPermissions(
  97 + boolean isSysadmin, boolean isTenantAdmin, String tenantId, String useerId) {
103 98 Set<String> permissions = Sets.newHashSet();
104 99 Set<String> allPermission;
105 100 String cacheKey;
106 101 boolean cachePresent;
107 102 if (isSysadmin) {
108   - cacheKey =
109   - FastIotConstants.CacheConfigKey.USER_PERMISSION_PREFIX + RoleEnum.SYS_ADMIN.name();
  103 + cacheKey = FastIotConstants.CacheConfigKey.USER_PERMISSION_PREFIX + RoleEnum.SYS_ADMIN.name();
110 104 Optional<Set<String>> optionalPermission =
111 105 cacheUtils.get(FastIotConstants.CacheConfigKey.CACHE_CONFIG_KEY, cacheKey);
112 106 cachePresent = optionalPermission.isPresent();
113 107 allPermission = optionalPermission.orElseGet(menuMapper::getAllPermission);
114 108 } else if (isTenantAdmin) {
115   - cacheKey =
116   - FastIotConstants.CacheConfigKey.USER_PERMISSION_PREFIX
117   - + tenantId;
  109 + cacheKey = FastIotConstants.CacheConfigKey.USER_PERMISSION_PREFIX + tenantId;
118 110 Optional<Set<String>> optionalPermission =
119 111 cacheUtils.get(FastIotConstants.CacheConfigKey.CACHE_CONFIG_KEY, cacheKey);
120 112 cachePresent = optionalPermission.isPresent();
121 113 allPermission =
122   - optionalPermission.orElseGet(
123   - () ->
124   - menuMapper.getAllPermissionsByTenantId(tenantId));
  114 + optionalPermission.orElseGet(() -> menuMapper.getAllPermissionsByTenantId(tenantId));
125 115 } else {
126   - cacheKey =
127   - FastIotConstants.CacheConfigKey.USER_PERMISSION_PREFIX
128   - + useerId;
  116 + cacheKey = FastIotConstants.CacheConfigKey.USER_PERMISSION_PREFIX + useerId;
129 117 Optional<Set<String>> optionalPermission =
130 118 cacheUtils.get(FastIotConstants.CacheConfigKey.CACHE_CONFIG_KEY, cacheKey);
131 119 cachePresent = optionalPermission.isPresent();
132 120 allPermission =
133   - optionalPermission.orElseGet(
134   - () ->
135   - menuMapper.getAllPermissionsByUserId(useerId));
  121 + optionalPermission.orElseGet(() -> menuMapper.getAllPermissionsByUserId(useerId));
136 122 }
137 123 if (cachePresent) {
138 124 return allPermission;
... ... @@ -146,16 +132,13 @@ public class RoleServiceImpl extends AbstractBaseService<RoleMapper, Role> imple
146 132
147 133 @Override
148 134 @Transactional
149   - public void updateRoleStatus(String roleId, int status,boolean isSysadmin,String tenantId) {
  135 + public void updateRoleStatus(String roleId, int status, boolean isSysadmin, String tenantId) {
150 136 Optional.ofNullable(
151 137 baseMapper.selectOne(
152 138 new QueryWrapper<Role>()
153 139 .lambda()
154 140 .eq(Role::getId, roleId)
155   - .eq(
156   - !isSysadmin,
157   - Role::getTenantId,
158   - tenantId)))
  141 + .eq(!isSysadmin, Role::getTenantId, tenantId)))
159 142 .ifPresent(
160 143 role -> {
161 144 role.setEnabled(status == 1);
... ... @@ -165,15 +148,15 @@ public class RoleServiceImpl extends AbstractBaseService<RoleMapper, Role> imple
165 148
166 149 @Override
167 150 @Transactional
168   - public RoleDTO saveOrUpdateRoleInfoWithMenu(RoleReqDTO roleReqDTO,boolean isSysadmin,boolean isPlatformAdmin,String tenantId) {
  151 + public RoleDTO saveOrUpdateRoleInfoWithMenu(
  152 + RoleReqDTO roleReqDTO, boolean isSysadmin, boolean isPlatformAdmin, String tenantId) {
169 153 Role role;
170 154 // 默认普通管理员角色,即租户管理员添加的角色
171 155 var roleType = RoleEnum.CUSTOMER_USER.name();
172 156 if (null != roleReqDTO.getRoleType()) {
173 157 roleType = roleReqDTO.getRoleType().name();
174 158 } else {
175   - if (isSysadmin
176   - || isPlatformAdmin) {
  159 + if (isSysadmin || isPlatformAdmin) {
177 160 roleType = RoleEnum.PLATFORM_ADMIN.name();
178 161 }
179 162 }
... ... @@ -185,10 +168,7 @@ public class RoleServiceImpl extends AbstractBaseService<RoleMapper, Role> imple
185 168 new QueryWrapper<Role>()
186 169 .lambda()
187 170 .eq(Role::getId, roleReqDTO.getId())
188   - .eq(
189   - !isSysadmin,
190   - Role::getTenantId,
191   - tenantId));
  171 + .eq(!isSysadmin, Role::getTenantId, tenantId));
192 172 if (role == null) {
193 173 return null;
194 174 } else {
... ... @@ -223,27 +203,25 @@ public class RoleServiceImpl extends AbstractBaseService<RoleMapper, Role> imple
223 203 tenantRoles.forEach(
224 204 tenantRole -> {
225 205 String updateTenantId = tenantRole.getTenantId();
226   - int deleteCount =
227   - tenantMenuMapper.delete(
228   - new QueryWrapper<TenantMenu>()
229   - .lambda()
230   - .eq(TenantMenu::getTenantId, updateTenantId));
231   - if (deleteCount > 0) {
232   - menus.forEach(
233   - menu -> {
234   - TenantMenu tenantMenu = new TenantMenu();
235   - tenantMenu.setMenuId(menu);
236   - tenantMenu.setTenantId(updateTenantId);
237   - tenantMenuMapper.insert(tenantMenu);
238   - });
239   - }
  206 + tenantMenuMapper.delete(
  207 + new QueryWrapper<TenantMenu>()
  208 + .lambda()
  209 + .eq(TenantMenu::getTenantId, updateTenantId));
  210 + menus.forEach(
  211 + menu -> {
  212 + TenantMenu tenantMenu = new TenantMenu();
  213 + tenantMenu.setMenuId(menu);
  214 + tenantMenu.setTenantId(updateTenantId);
  215 + tenantMenuMapper.insert(tenantMenu);
  216 + });
240 217 });
241 218 }
242 219 return role.getDTO(RoleDTO.class);
243 220 }
244 221
245 222 @Override
246   - public List<RoleDTO> findRoleInfo(boolean isTenantAdmin,String tenantId,String userId,RoleDTO roleDTO) {
  223 + public List<RoleDTO> findRoleInfo(
  224 + boolean isTenantAdmin, String tenantId, String userId, RoleDTO roleDTO) {
247 225 if (StringUtils.isEmpty(roleDTO.getTenantId())) {
248 226 roleDTO.setTenantId(tenantId);
249 227 }
... ...
  1 +package org.thingsboard.server.dao.yunteng.impl;
  2 +
  3 +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  4 +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  5 +import com.baomidou.mybatisplus.core.metadata.IPage;
  6 +import lombok.RequiredArgsConstructor;
  7 +import org.apache.commons.lang3.StringUtils;
  8 +import org.springframework.stereotype.Service;
  9 +import org.springframework.transaction.annotation.Transactional;
  10 +import org.thingsboard.server.common.data.yunteng.constant.FastIotConstants;
  11 +import org.thingsboard.server.common.data.yunteng.core.exception.YtDataValidationException;
  12 +import org.thingsboard.server.common.data.yunteng.dto.*;
  13 +import org.thingsboard.server.common.data.yunteng.utils.ReflectUtils;
  14 +import org.thingsboard.server.common.data.yunteng.utils.tools.PageData;
  15 +import org.thingsboard.server.dao.exception.DataValidationException;
  16 +import org.thingsboard.server.dao.yunteng.entities.*;
  17 +import org.thingsboard.server.dao.yunteng.mapper.*;
  18 +import org.thingsboard.server.dao.yunteng.service.*;
  19 +
  20 +import java.util.*;
  21 +import java.util.stream.Collectors;
  22 +
  23 +/** @Description 场景联动业务实现层 @Author cxy @Date 2021/11/25 11:22 */
  24 +@Service
  25 +@RequiredArgsConstructor
  26 +public class SceneLinkageServiceImpl extends AbstractBaseService<SceneLinkageMapper, SceneLinkage>
  27 + implements SceneLinkageService {
  28 +
  29 + private final SceneLinkageMapper sceneLinkageMapper;
  30 + private final DeviceMapper deviceMapper;
  31 + private final DoActionMapper doActionMapper;
  32 + private final DoConditionMapper doConditionMapper;
  33 + private final TriggerMapper triggerMapper;
  34 + private final OrganizationMapper organizationMapper;
  35 + private final TriggerServiceImpl triggerService;
  36 + private final DoConditionServiceImpl doConditionService;
  37 + private final DoActionServiceImpl doActionService;
  38 + /**
  39 + * 增加场景联动,触发器可以多个,执行条件可以多个,执行动作可以多个
  40 + *
  41 + * @param sceneLinkageDTO 场景对象
  42 + * @return SceneLinkageDTO 场景
  43 + */
  44 + @Override
  45 + @Transactional
  46 + public SceneLinkageDTO saveScenelinkage(SceneLinkageDTO sceneLinkageDTO, String tenantId) {
  47 + sceneLinkageDTO.setTenantId(tenantId);
  48 + // 第一步保存场景,获取场景ID
  49 + // 场景对象
  50 + SceneLinkage sceneLinkage = sceneLinkageDTO.getEntity(SceneLinkage.class);
  51 + // 新增
  52 + int insert = sceneLinkageMapper.insert(sceneLinkage);
  53 + if (insert > 0) {
  54 + sceneLinkage.copyToDTO(sceneLinkageDTO);
  55 + }
  56 + // 拿到场景id
  57 + String sceneLinkageId = sceneLinkage.getId();
  58 + // 拿到场景id的组织,假如是云腾公司的组织id
  59 + String organizationId = sceneLinkage.getOrganizationId();
  60 + // 拿到当前组织id所包含的设备集合
  61 + List<YtDevice> deviceList =
  62 + deviceMapper.selectList(
  63 + new QueryWrapper<YtDevice>()
  64 + .lambda()
  65 + .select(YtDevice::getId)
  66 + .eq(
  67 + StringUtils.isNoneBlank(organizationId),
  68 + YtDevice::getOrganizationId,
  69 + organizationId));
  70 + // 判断设备id是否包含
  71 + List<TriggerDTO> triggerDTOS = sceneLinkageDTO.getTriggers();
  72 + if (triggerDTOS != null) {
  73 + boolean condition = false;
  74 + for (TriggerDTO triggerDTO : triggerDTOS) {
  75 + String deviceId = triggerDTO.getDeviceId();
  76 + if (deviceId == null) {
  77 + break;
  78 + }
  79 + for (YtDevice device : deviceList) {
  80 + String id = device.getId();
  81 + if (deviceId.equals(id)) {
  82 + triggerDTO.setDeviceId(id);
  83 + condition = true;
  84 + break;
  85 + }
  86 + }
  87 + if (!condition) {
  88 + throw new DataValidationException("触发器里面该设备不存在");
  89 + }
  90 + }
  91 + }
  92 + List<DoConditionDTO> doConditionList = sceneLinkageDTO.getDoConditions();
  93 + // 定义常量,如果满足条件,则新增,循环完了不满足则抛出异常
  94 + if (doConditionList != null) {
  95 + boolean conditionC = false;
  96 + for (DoConditionDTO conditionDTO : doConditionList) {
  97 + String deviceIdC = conditionDTO.getDeviceId();
  98 + if (deviceIdC == null) {
  99 + break;
  100 + }
  101 + for (YtDevice deviceC : deviceList) {
  102 + String id = deviceC.getId();
  103 + if (deviceIdC.equals(id)) {
  104 + conditionDTO.setDeviceId(id);
  105 + conditionC = true;
  106 + break;
  107 + }
  108 + }
  109 + if (!conditionC) {
  110 + throw new DataValidationException("执行条件里面该设备不存在");
  111 + }
  112 + }
  113 + }
  114 + List<DoActionDTO> doActionDTOList = sceneLinkageDTO.getDoActions();
  115 + // 定义常量,如果满足条件,则新增,循环完了不满足则抛出异常
  116 + if (doActionDTOList != null) {
  117 + boolean conditionA = false;
  118 + for (DoActionDTO actionDTO : doActionDTOList) {
  119 + String deviceIdA = actionDTO.getDeviceId();
  120 + if (deviceIdA == null) {
  121 + break;
  122 + }
  123 + for (YtDevice deviceA : deviceList) {
  124 + String id = deviceA.getId();
  125 + if (deviceIdA.equals(id)) {
  126 + actionDTO.setDeviceId(id);
  127 + conditionA = true;
  128 + break;
  129 + }
  130 + }
  131 + if (!conditionA) {
  132 + throw new DataValidationException("执行动作里面该设备不存在");
  133 + }
  134 + }
  135 + }
  136 + // 3.批量新增Trigger
  137 + List<Trigger> collect =
  138 + sceneLinkageDTO.getTriggers().stream()
  139 + .peek(triggerDTO -> triggerDTO.setSceneLinkageId(sceneLinkageId))
  140 + .peek(triggerDTO -> triggerDTO.setTenantId(tenantId))
  141 + .map(triggerDTO -> triggerDTO.getEntity(Trigger.class))
  142 + .collect(Collectors.toList());
  143 + triggerService.insertBatch(collect, 1000);
  144 + // 4.批量新增执行条件
  145 + List<DoCondition> collectC =
  146 + sceneLinkageDTO.getDoConditions().stream()
  147 + .peek(doConditionDTO -> doConditionDTO.setSceneLinkageId(sceneLinkageId))
  148 + .peek(doConditionDTO -> doConditionDTO.setTenantId(tenantId))
  149 + .map(doConditionDTO -> doConditionDTO.getEntity(DoCondition.class))
  150 + .collect(Collectors.toList());
  151 + doConditionService.insertBatch(collectC, 1000);
  152 + // 5.批量新增执行动作
  153 + List<DoAction> collectA =
  154 + sceneLinkageDTO.getDoActions().stream()
  155 + .peek(doActionDTO -> doActionDTO.setSceneLinkageId(sceneLinkageId))
  156 + .peek(doActionDTO -> doActionDTO.setTenantId(tenantId))
  157 + .map(doActionDTO -> doActionDTO.getEntity(DoAction.class))
  158 + .collect(Collectors.toList());
  159 + doActionService.insertBatch(collectA, 1000);
  160 + return sceneLinkageDTO;
  161 + }
  162 +
  163 + /**
  164 + * byId删除场景联动
  165 + *
  166 + * @param ids 删除的ids
  167 + */
  168 + @Override
  169 + public void deleteSceneLinkage(Set<String> ids, String tenantId) {
  170 + // 删除场景,一并删除数据库触发器,执行条件,执行动作的数据
  171 + triggerMapper.delete(
  172 + new LambdaQueryWrapper<Trigger>()
  173 + .eq(Trigger::getTenantId, tenantId)
  174 + .in(Trigger::getSceneLinkageId, ids));
  175 + doConditionMapper.delete(
  176 + new LambdaQueryWrapper<DoCondition>()
  177 + .eq(DoCondition::getTenantId, tenantId)
  178 + .in(DoCondition::getSceneLinkageId, ids));
  179 + doActionMapper.delete(
  180 + new LambdaQueryWrapper<DoAction>()
  181 + .eq(DoAction::getTenantId, tenantId)
  182 + .in(DoAction::getSceneLinkageId, ids));
  183 + LambdaQueryWrapper<SceneLinkage> Wrapper =
  184 + new QueryWrapper<SceneLinkage>()
  185 + .lambda()
  186 + .eq(SceneLinkage::getTenantId, tenantId)
  187 + .in(SceneLinkage::getId, ids);
  188 + sceneLinkageMapper.delete(Wrapper);
  189 + }
  190 + /**
  191 + * 修改场景联动和包含的触发器,执行条件,执行动作
  192 + *
  193 + * @param sceneLinkageDTO 场景
  194 + * @return SceneLinkageDTO 场景
  195 + */
  196 + @Override
  197 + @Transactional
  198 + public SceneLinkageDTO updateSceneLinkage(SceneLinkageDTO sceneLinkageDTO) {
  199 + // 获取场景
  200 + SceneLinkage sceneLinkage = baseMapper.selectById(sceneLinkageDTO.getId());
  201 + if (sceneLinkage == null) {
  202 + throw new YtDataValidationException("此场景已不存在");
  203 + }
  204 + sceneLinkageDTO.copyToEntity(sceneLinkage);
  205 +
  206 + updateTrigger(sceneLinkageDTO);
  207 + updateDoAction(sceneLinkageDTO);
  208 + updateDoCondition(sceneLinkageDTO);
  209 + sceneLinkageMapper.updateById(sceneLinkage);
  210 + return sceneLinkage.getDTO(SceneLinkageDTO.class);
  211 + }
  212 + /**
  213 + * 修改触发器
  214 + *
  215 + * @param sceneLinkageDTO 修改场景
  216 + */
  217 + private void updateTrigger(SceneLinkageDTO sceneLinkageDTO) {
  218 + // 先删除触发器
  219 + triggerMapper.delete(
  220 + new QueryWrapper<Trigger>()
  221 + .lambda()
  222 + .eq(
  223 + StringUtils.isNoneBlank(sceneLinkageDTO.getId()),
  224 + Trigger::getSceneLinkageId,
  225 + sceneLinkageDTO.getId()));
  226 + // 如果获取的触发器不为空,进行添加操作
  227 + if (null != sceneLinkageDTO.getTriggers() && !sceneLinkageDTO.getTriggers().isEmpty()) {
  228 + sceneLinkageDTO
  229 + .getTriggers()
  230 + .forEach(
  231 + triggerDTO -> {
  232 + Trigger trigger = new Trigger();
  233 + triggerDTO.copyToEntity(trigger);
  234 + triggerMapper.insert(trigger);
  235 + });
  236 + }
  237 + }
  238 + /**
  239 + * 修改执行动作
  240 + *
  241 + * @param sceneLinkageDTO 场景
  242 + */
  243 + private void updateDoAction(SceneLinkageDTO sceneLinkageDTO) {
  244 + doActionMapper.delete(
  245 + new QueryWrapper<DoAction>()
  246 + .lambda()
  247 + .eq(
  248 + StringUtils.isNoneBlank(sceneLinkageDTO.getId()),
  249 + DoAction::getSceneLinkageId,
  250 + sceneLinkageDTO.getId()));
  251 + if (null != sceneLinkageDTO.getDoActions() && !sceneLinkageDTO.getDoActions().isEmpty()) {
  252 + sceneLinkageDTO
  253 + .getDoActions()
  254 + .forEach(
  255 + doActionDTO -> {
  256 + DoAction doAction = new DoAction();
  257 + doActionDTO.copyToEntity(doAction);
  258 + doActionMapper.insert(doAction);
  259 + });
  260 + }
  261 + }
  262 + /**
  263 + * 修改执行动作
  264 + *
  265 + * @param sceneLinkageDTO 场景
  266 + */
  267 + private void updateDoCondition(SceneLinkageDTO sceneLinkageDTO) {
  268 + doConditionMapper.delete(
  269 + new QueryWrapper<DoCondition>()
  270 + .lambda()
  271 + .eq(
  272 + StringUtils.isNoneBlank(sceneLinkageDTO.getId()),
  273 + DoCondition::getSceneLinkageId,
  274 + sceneLinkageDTO.getId()));
  275 + if (null != sceneLinkageDTO.getDoConditions() && !sceneLinkageDTO.getDoActions().isEmpty()) {
  276 + sceneLinkageDTO
  277 + .getDoConditions()
  278 + .forEach(
  279 + doConditionDTO -> {
  280 + DoCondition doCondition = new DoCondition();
  281 + doConditionDTO.copyToEntity(doCondition);
  282 + doConditionMapper.insert(doCondition);
  283 + });
  284 + }
  285 + }
  286 + /**
  287 + * 通过分页查询
  288 + *
  289 + * @param queryMap 封装参数
  290 + * @return SceneLinkageDTO 场景对象
  291 + */
  292 + @Override
  293 + @Transactional
  294 + public PageData<SceneLinkageDTO> page(Map<String, Object> queryMap, String tenantId) {
  295 + queryMap.put("tenantCode", tenantId);
  296 + // 拿到传入的组织id
  297 + String organizationId = (String) queryMap.get("organizationId");
  298 + // 不为空
  299 + if (!StringUtils.isEmpty(organizationId)) {
  300 + // 新建组织集合
  301 + List<String> organizationIds = new ArrayList<>();
  302 + // 添加拿到的组织
  303 + organizationIds.add(organizationId);
  304 + // 查询该组织的所有子类
  305 + List<OrganizationDTO> organizationDTOS =
  306 + organizationMapper.findOrganizationTreeList(tenantId, organizationIds);
  307 + // 遍历组织id
  308 + List<String> queryOrganizationIds = new ArrayList<>();
  309 + organizationDTOS.forEach(
  310 + item -> {
  311 + queryOrganizationIds.add(item.getId());
  312 + });
  313 + queryMap.put("organizationIds", queryOrganizationIds);
  314 + }
  315 + IPage<SceneLinkage> page = getPage(queryMap, FastIotConstants.DefaultOrder.CREATE_TIME, false);
  316 + 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);
  332 + }
  333 + /** 获取当前租户的场景联动 */
  334 + @Override
  335 + public List<SceneLinkageDTO> findSceneLinkage(SceneLinkageDTO sceneLinkageDTO, String tenantId) {
  336 + List<SceneLinkage> scenelinkageList =
  337 + baseMapper.selectList(
  338 + new QueryWrapper<SceneLinkage>()
  339 + .lambda()
  340 + .eq(SceneLinkage::getTenantId, tenantId)
  341 + .like(SceneLinkage::getName, sceneLinkageDTO.getName())
  342 + .like(SceneLinkage::getOrganizationId, sceneLinkageDTO.getOrganizationId())
  343 + .like(SceneLinkage::getStatus, sceneLinkageDTO.getStatus()));
  344 + return ReflectUtils.sourceToTarget(scenelinkageList, SceneLinkageDTO.class);
  345 + }
  346 + /**
  347 + * 修改当前场景联动的状态,启用或者停用
  348 + *
  349 + * @param sceneLinkageId 场景id
  350 + * @param status 状态
  351 + */
  352 + @Override
  353 + @Transactional(rollbackFor = Exception.class)
  354 + public void updateSceneStatus(String sceneLinkageId, int status, String tenantId) {
  355 + Optional.ofNullable(
  356 + baseMapper.selectOne(
  357 + new QueryWrapper<SceneLinkage>()
  358 + .lambda()
  359 + .eq(SceneLinkage::getId, sceneLinkageId)
  360 + .eq(SceneLinkage::getTenantId, tenantId)))
  361 + .ifPresent(
  362 + sceneLinkage -> {
  363 + sceneLinkage.setStatus(status);
  364 + baseMapper.updateById(sceneLinkage);
  365 + });
  366 + }
  367 + /**
  368 + * 通过组织id查询全部的设备集合
  369 + *
  370 + * @param organizationId
  371 + * @return 设备集合
  372 + */
  373 + @Override
  374 + public List<DeviceDTO> findDeviceList(String organizationId) {
  375 + // 拿到当前组织id所包含的设备集合
  376 + List<YtDevice> deviceList =
  377 + deviceMapper.selectList(
  378 + new QueryWrapper<YtDevice>()
  379 + .lambda()
  380 + .eq(
  381 + StringUtils.isNoneBlank(organizationId),
  382 + YtDevice::getOrganizationId,
  383 + organizationId));
  384 + List<DeviceDTO> deviceDTOList =
  385 + deviceList.stream()
  386 + .map(device -> device.getDTO(DeviceDTO.class))
  387 + .collect(Collectors.toList());
  388 + return ReflectUtils.sourceToTarget(deviceDTOList, DeviceDTO.class);
  389 + }
  390 +}
... ...
... ... @@ -30,8 +30,7 @@ public class SysEnterpriseServiceImpl
30 30
31 31 @Override
32 32 public SysEnterpriseDTO get(String tenantId) {
33   - SysEnterprise sysEnterprise = baseMapper.get(tenantId).getEntity(SysEnterprise.class);
34   - return sysEnterprise == null ? null : sysEnterprise.getDTO(SysEnterpriseDTO.class);
  33 + return baseMapper.get(tenantId);
35 34 }
36 35
37 36 @Override
... ...
... ... @@ -47,15 +47,14 @@ public class SysNoticeServiceImpl extends AbstractBaseService<SysNoticeMapper, S
47 47 public PageData<SysNoticeDTO> page(Map<String, Object> queryMap) {
48 48 IPage<SysNotice> sysNoticeIPage =
49 49 getPage(queryMap, FastIotConstants.DefaultOrder.CREATE_TIME, true);
50   - sysNoticeIPage = baseMapper.page(sysNoticeIPage, queryMap);
  50 + baseMapper.page(sysNoticeIPage, queryMap);
51 51 return getPageData(sysNoticeIPage, SysNoticeDTO.class);
52 52 }
53 53
54 54 @Override
55 55 public SysNoticeDTO get(String id,String tenantId) {
56 56 return baseMapper
57   - .get(id, tenantId)
58   - .getDTO(SysNoticeDTO.class);
  57 + .get(id, tenantId);
59 58 }
60 59
61 60 @Override
... ...
  1 +package org.thingsboard.server.dao.yunteng.impl;
  2 +import lombok.RequiredArgsConstructor;
  3 +import org.springframework.stereotype.Service;
  4 +import org.thingsboard.server.dao.yunteng.entities.Trigger;
  5 +import org.thingsboard.server.dao.yunteng.mapper.TriggerMapper;
  6 +import org.thingsboard.server.dao.yunteng.service.AbstractBaseService;
  7 +import org.thingsboard.server.dao.yunteng.service.TriggerService;
  8 +
  9 +/**
  10 + * @Description
  11 + * @Author cxy
  12 + * @Date 2021/12/6 19:53
  13 + */
  14 +@Service
  15 +@RequiredArgsConstructor
  16 +public class TriggerServiceImpl extends AbstractBaseService<TriggerMapper, Trigger>
  17 + implements TriggerService {
  18 +}
... ...
  1 +package org.thingsboard.server.dao.yunteng.mapper;
  2 +
  3 +import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  4 +import org.apache.ibatis.annotations.Mapper;
  5 +import org.thingsboard.server.dao.yunteng.entities.DoAction;
  6 +
  7 +/**
  8 + * @Description 执行动作mapper
  9 + * @Author cxy
  10 + * @Date 2021/11/26 9:38
  11 + */
  12 +@Mapper
  13 +public interface DoActionMapper extends BaseMapper<DoAction> {
  14 +}
... ...
  1 +package org.thingsboard.server.dao.yunteng.mapper;
  2 +
  3 +import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  4 +import org.apache.ibatis.annotations.Mapper;
  5 +import org.thingsboard.server.dao.yunteng.entities.DoCondition;
  6 +
  7 +/**
  8 + * @Description 执行条件mapper
  9 + * @Author cxy
  10 + * @Date 2021/11/26 9:39
  11 + */
  12 +@Mapper
  13 +public interface DoConditionMapper extends BaseMapper<DoCondition> {
  14 +}
... ...
  1 +package org.thingsboard.server.dao.yunteng.mapper;
  2 +
  3 +import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  4 +import com.baomidou.mybatisplus.core.metadata.IPage;
  5 +import org.apache.ibatis.annotations.Mapper;
  6 +import org.apache.ibatis.annotations.Param;
  7 +import org.thingsboard.server.common.data.yunteng.dto.SceneLinkageDTO;
  8 +import org.thingsboard.server.dao.yunteng.entities.SceneLinkage;
  9 +
  10 +import java.util.Map;
  11 +
  12 +/**
  13 + * @Description 场景联动持久层
  14 + * @Author cxy
  15 + * @Date 2021/11/25 10:48
  16 + */
  17 +@Mapper
  18 +public interface SceneLinkageMapper extends BaseMapper<SceneLinkage> {
  19 + /**
  20 + * 分页条件查询
  21 + * @param page
  22 + * @param queryMap
  23 + * @return
  24 + */
  25 + IPage<SceneLinkageDTO> getScenePage(
  26 + IPage<?> page, @Param("queryMap") Map<String, Object> queryMap);
  27 +
  28 +
  29 +}
... ...
... ... @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
4 4 import com.baomidou.mybatisplus.core.metadata.IPage;
5 5 import org.apache.ibatis.annotations.Mapper;
6 6 import org.apache.ibatis.annotations.Param;
  7 +import org.thingsboard.server.common.data.yunteng.dto.SysNoticeDTO;
7 8 import org.thingsboard.server.dao.yunteng.entities.SysNotice;
8 9
9 10 import java.util.Map;
... ... @@ -20,11 +21,11 @@ public interface SysNoticeMapper extends BaseMapper<SysNotice> {
20 21 * @param queryMap
21 22 * @return 系统通知分页
22 23 */
23   - IPage<SysNotice> page(IPage<SysNotice> page, @Param("queryMap") Map<String, Object> queryMap);
  24 + IPage<SysNoticeDTO> page(IPage<SysNotice> page, @Param("queryMap") Map<String, Object> queryMap);
24 25
25 26 /**
26 27 * @param id
27 28 * @return 消息详情
28 29 */
29   - SysNotice get(@Param("id") String id, @Param("tenantId") String tenantId);
  30 + SysNoticeDTO get(@Param("id") String id, @Param("tenantId") String tenantId);
30 31 }
... ...
  1 +package org.thingsboard.server.dao.yunteng.mapper;
  2 +
  3 +import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  4 +import org.apache.ibatis.annotations.Mapper;
  5 +import org.thingsboard.server.dao.yunteng.entities.Trigger;
  6 +
  7 +/**
  8 + * @Description 触发器mapper层
  9 + * @Author cxy
  10 + * @Date 2021/11/26 9:30
  11 + */
  12 +@Mapper
  13 +public interface TriggerMapper extends BaseMapper<Trigger> {
  14 +}
... ...
  1 +package org.thingsboard.server.dao.yunteng.service;
  2 +
  3 +/**
  4 + * @Description
  5 + * @Author cxy
  6 + * @Date 2021/12/6 20:23
  7 + */
  8 +public interface DoActionService {
  9 +}
... ...
  1 +package org.thingsboard.server.dao.yunteng.service;
  2 +
  3 +/**
  4 + * @Description
  5 + * @Author cxy
  6 + * @Date 2021/12/6 20:14
  7 + */
  8 +public interface DoConditionService {
  9 +}
... ...
  1 +package org.thingsboard.server.dao.yunteng.service;
  2 +import org.thingsboard.server.common.data.yunteng.dto.DeviceDTO;
  3 +import org.thingsboard.server.common.data.yunteng.dto.SceneLinkageDTO;
  4 +import org.thingsboard.server.common.data.yunteng.utils.tools.PageData;
  5 +
  6 +import java.util.List;
  7 +import java.util.Map;
  8 +import java.util.Set;
  9 +
  10 +/**
  11 + * @Description 场景联动的业务
  12 + * @Author cxy
  13 + * @Date 2021/11/25 11:19
  14 + */
  15 +public interface SceneLinkageService {
  16 + /**
  17 + * 新增场景联动
  18 + * @param sceneLinkageDTO
  19 + * @return
  20 + */
  21 + SceneLinkageDTO saveScenelinkage(SceneLinkageDTO sceneLinkageDTO,String tenantId);
  22 +
  23 + /**
  24 + * 删除场景联动
  25 + * @param ids
  26 + * @return
  27 + */
  28 + void deleteSceneLinkage(Set<String> ids,String tenantId);
  29 +
  30 + /**
  31 + * 修改场景联动
  32 + * @param sceneLinkageDTO
  33 + * @return
  34 + */
  35 + SceneLinkageDTO updateSceneLinkage(SceneLinkageDTO sceneLinkageDTO);
  36 +
  37 + /**
  38 + * 分页查询
  39 + * @param queryMap
  40 + * @return
  41 + */
  42 + PageData<SceneLinkageDTO> page(Map<String, Object> queryMap,String tenantId);
  43 +
  44 + /**
  45 + * 查找场景联动所有数据
  46 + * @param sceneLinkageDTO
  47 + * @return
  48 + */
  49 + List<SceneLinkageDTO> findSceneLinkage(SceneLinkageDTO sceneLinkageDTO,String tenantId);
  50 +
  51 + /**
  52 + * 修改场景的状态
  53 + * @param sceneLinkageId
  54 + * @param status
  55 + */
  56 + void updateSceneStatus(String sceneLinkageId, int status,String tenantId);
  57 +
  58 + /**
  59 + * 通过组织id查询设备集合
  60 + * @param organizationId
  61 + * @return
  62 + */
  63 + List<DeviceDTO> findDeviceList(String organizationId);
  64 +
  65 +}
... ...
  1 +package org.thingsboard.server.dao.yunteng.service;
  2 +
  3 +/**
  4 + * @Description
  5 + * @Author cxy
  6 + * @Date 2021/12/6 19:52
  7 + */
  8 +public interface TriggerService {
  9 +}
... ...
... ... @@ -12,6 +12,7 @@
12 12 <result property="updater" column="updater"/>
13 13 <result property="updateTime" column="update_time"/>
14 14 <result property="remark" column="remark"/>
  15 + <result property="tenantId" column="tenant_id"/>
15 16 </resultMap>
16 17
17 18 <select id="findOrganizationTreeList" resultMap="organizationDTOMap">
... ...
  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="org.thingsboard.server.dao.yunteng.mapper.SceneLinkageMapper">
  5 + <resultMap id="sceneLinkageMap" type="org.thingsboard.server.common.data.yunteng.dto.SceneLinkageDTO">
  6 + <result property="id" column="id"/>
  7 + <result property="name" column="name"/>
  8 + <result property="organizationId" column="organization_id"/>
  9 + <result property="status" column="status"/>
  10 + <result property="description" column="description"/>
  11 + <result property="tenantId" column="tenant_id"/>
  12 + <result property="updater" column="updater"/>
  13 + <result property="updateTime" column="update_time"/>
  14 + <result property="createTime" column="create_time"/>
  15 + <result property="creator" column="creator"/>
  16 + </resultMap>
  17 + <sql id="columns">
  18 + s.id,s.name,s.organization_id,s.status,s.description,s.tenant_id,s.updater,s.update_time,s.create_time,s.creator
  19 + </sql>
  20 + <select id="getScenePage" resultMap="sceneLinkageMap">
  21 + SELECT
  22 + <include refid="columns"/>
  23 + FROM iotfs_scene_linkage s
  24 + LEFT JOIN iotfs_organization io ON io.id = s.organization_id
  25 + <where>
  26 + <if test="queryMap.tenantId !=null and queryMap.tenantId !=''">
  27 + AND s.tenant_id = #{queryMap.tenantId}
  28 + </if>
  29 + <if test="queryMap.name !=null and queryMap.name !=''">
  30 + AND s.name LIKE concat('%',#{queryMap.name}::TEXT,'%')
  31 + </if>
  32 + <if test="queryMap.status !=null and queryMap.status!=''">
  33 + AND s.status = #{queryMap.status}
  34 + </if>
  35 + <if test="queryMap.organizationId !=null">
  36 + AND s.organization_id IN
  37 + <foreach collection="queryMap.organizationIds" item="organizationId" open="(" separator="," close=")">
  38 + #{organizationId}
  39 + </foreach>
  40 + </if>
  41 + </where>
  42 + </select>
  43 +
  44 +</mapper>
... ...
... ... @@ -13,13 +13,17 @@
13 13 <result property="area" column="area"/>
14 14 <result property="tel" column="tel"/>
15 15 <result property="codeTown" column="code_town"/>
16   - <result property="nameProv" column="name_prov"/>
17   - <result property="codeProv" column="code_prov"/>
18   - <result property="nameCity" column="name_city"/>
19   - <result property="codeCity" column="code_city"/>
20   - <result property="nameCoun" column="name_coun"/>
21   - <result property="codeCoun" column="code_coun"/>
22   - <result property="nameTown" column="name_town"/>
  16 + <result property="qrCode" column="qr_code"/>
  17 + <association property="sysTown" javaType="org.thingsboard.server.common.data.yunteng.dto.SysTownDTO">
  18 + <result property="nameProv" column="name_prov"/>
  19 + <result property="codeProv" column="code_prov"/>
  20 + <result property="nameCity" column="name_city"/>
  21 + <result property="codeCity" column="code_city"/>
  22 + <result property="nameCoun" column="name_coun"/>
  23 + <result property="codeCoun" column="code_coun"/>
  24 + <result property="nameTown" column="name_town"/>
  25 + <result property="codeTown" column="code_town"/>
  26 + </association>
23 27 </resultMap>
24 28
25 29 <select id="get" resultMap="entity">
... ... @@ -33,6 +37,7 @@
33 37 se.area area,
34 38 se.tel tel,
35 39 se.code_town code_town,
  40 + se.qr_code qr_code,
36 41 st.name_prov name_prov,
37 42 st.code_prov code_prov,
38 43 st.name_city name_city,
... ...
... ... @@ -55,7 +55,7 @@
55 55 WHERE
56 56 sn.tenant_id = #{queryMap.tenantId}
57 57 <if test="queryMap.type != null">
58   - sn.type = #{queryMap.type}
  58 + AND sn.type = #{queryMap.type}
59 59 </if>
60 60 </select>
61 61 <select id="get" resultMap="sysNotice">
... ...