Commit 595faec50b503fd9528e9fa836aa6d218824e87a

Authored by 黄 x
1 parent 6b1ddc09

fix: 调整告警配置,移除设备配置与告警配置的关系

Showing 17 changed files with 370 additions and 239 deletions
  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.security.access.prepost.PreAuthorize;
  7 +import org.springframework.validation.annotation.Validated;
  8 +import org.springframework.web.bind.annotation.*;
  9 +import org.thingsboard.server.common.data.StringUtils;
  10 +import org.thingsboard.server.common.data.exception.ThingsboardException;
  11 +import org.thingsboard.server.common.data.yunteng.common.DeleteGroup;
  12 +import org.thingsboard.server.common.data.yunteng.dto.AlarmProfileDTO;
  13 +import org.thingsboard.server.common.data.yunteng.dto.DeleteDTO;
  14 +import org.thingsboard.server.common.data.yunteng.dto.MailLogDTO;
  15 +import org.thingsboard.server.common.data.yunteng.enums.OrderTypeEnum;
  16 +import org.thingsboard.server.common.data.yunteng.utils.tools.YtPageData;
  17 +import org.thingsboard.server.controller.BaseController;
  18 +import org.thingsboard.server.dao.yunteng.service.AlarmProfileService;
  19 +
  20 +import java.util.HashMap;
  21 +
  22 +import static org.thingsboard.server.common.data.yunteng.constant.QueryConstant.*;
  23 +import static org.thingsboard.server.common.data.yunteng.constant.QueryConstant.ORDER_TYPE;
  24 +
  25 +@RestController
  26 +@RequestMapping("api/yt/alarm/profile")
  27 +@Api(tags = {"告警配置"})
  28 +@RequiredArgsConstructor
  29 +@PreAuthorize("hasAnyAuthority('TENANT_ADMIN','CUSTOMER_USER')")
  30 +public class AlarmProfileController extends BaseController {
  31 +
  32 + private final AlarmProfileService alarmProfileService;
  33 +
  34 + @GetMapping(params = {PAGE_SIZE, PAGE})
  35 + @ApiOperation("分页")
  36 + public YtPageData<AlarmProfileDTO> pageAlarmProfile(
  37 + @RequestParam(PAGE_SIZE) int pageSize,
  38 + @RequestParam(PAGE) int page,
  39 + @RequestParam(value = "status", required = false) Integer status,
  40 + @RequestParam(value = "name", required = false) String name,
  41 + @RequestParam(value = "organizationId", required = false) String organizationId,
  42 + @RequestParam(value = ORDER_FILED, required = false) String orderBy,
  43 + @RequestParam(value = ORDER_TYPE, required = false) OrderTypeEnum orderType)
  44 + throws ThingsboardException {
  45 +
  46 + HashMap<String, Object> queryMap = new HashMap<>();
  47 + queryMap.put(PAGE_SIZE, pageSize);
  48 + queryMap.put(PAGE, page);
  49 + queryMap.put(ORDER_FILED, orderBy);
  50 + queryMap.put("status", status);
  51 + queryMap.put("name", name);
  52 + queryMap.put("organizationId", organizationId);
  53 + if (orderType != null) {
  54 + queryMap.put(ORDER_TYPE, orderType.name());
  55 + }
  56 + return alarmProfileService.page(
  57 + getCurrentUser().isPtTenantAdmin(),
  58 + getCurrentUser().getCurrentTenantId(),
  59 + getCurrentUser().getCurrentUserId(),
  60 + queryMap);
  61 + }
  62 +
  63 + @PostMapping
  64 + @ApiOperation("新增|编辑")
  65 + public AlarmProfileDTO saveOrUpdateAlarmProfile(@Validated @RequestBody AlarmProfileDTO alarmProfileDTO)
  66 + throws ThingsboardException {
  67 + alarmProfileDTO.setTenantId(getCurrentUser().getCurrentTenantId());
  68 + return alarmProfileService.saveOrUpdateAlarmProfile(alarmProfileDTO);
  69 + }
  70 +
  71 + @DeleteMapping
  72 + @ApiOperation("删除")
  73 + public boolean deleteAlarmProfile(@Validated(DeleteGroup.class) @RequestBody DeleteDTO deleteDTO) {
  74 + return alarmProfileService.deleteAlarmProFile(deleteDTO);
  75 + }
  76 +
  77 + @GetMapping("{alarmProfileId}/{status}")
  78 + @ApiOperation("更新状态")
  79 + public AlarmProfileDTO saveOrUpdateAlarmProfile(
  80 + @PathVariable("alarmProfileId") String alarmProfileId, @PathVariable("status") Integer status)
  81 + throws ThingsboardException {
  82 + return alarmProfileService.updateAlarmProFileStatus(
  83 + alarmProfileId, getCurrentUser().getCurrentTenantId(), status);
  84 + }
  85 +}
... ...
... ... @@ -4,12 +4,10 @@ import io.swagger.annotations.Api;
4 4 import io.swagger.annotations.ApiOperation;
5 5 import lombok.RequiredArgsConstructor;
6 6 import org.apache.commons.lang3.StringUtils;
7   -import org.springframework.http.HttpStatus;
8 7 import org.springframework.http.ResponseEntity;
9 8 import org.springframework.security.access.prepost.PreAuthorize;
10 9 import org.springframework.validation.annotation.Validated;
11 10 import org.springframework.web.bind.annotation.*;
12   -import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
13 11 import org.thingsboard.server.common.data.DeviceProfile;
14 12 import org.thingsboard.server.common.data.DeviceProfileProvisionType;
15 13 import org.thingsboard.server.common.data.DeviceProfileType;
... ... @@ -33,8 +31,6 @@ import org.thingsboard.server.controller.BaseController;
33 31 import org.thingsboard.server.dao.yunteng.service.YtDeviceProfileService;
34 32 import org.thingsboard.server.service.security.permission.Operation;
35 33
36   -import java.net.URI;
37   -import java.sql.ResultSet;
38 34 import java.time.LocalDateTime;
39 35 import java.time.ZoneOffset;
40 36 import java.util.*;
... ... @@ -65,23 +61,9 @@ public class YtDeviceProfileController extends BaseController {
65 61
66 62 deviceProfileDTO.setTenantId(getCurrentUser().getCurrentTenantId());
67 63 DeviceProfile tbDeviceProfile = buildTbDeviceProfileFromDeviceProfileDTO(deviceProfileDTO);
68   - DeviceProfile savedDeviceProfile = updateTbDeviceProfile(tbDeviceProfile, created);
  64 + updateTbDeviceProfile(tbDeviceProfile, created);
69 65
70   -
71   -
72   -
73   - DeviceProfileDTO newDeviceProfileDTO = ytDeviceProfileService.insertOrUpdate(savedDeviceProfile.getId().getId().toString(), deviceProfileDTO);
74   - return Optional.ofNullable(newDeviceProfileDTO)
75   - .map(
76   - dto -> {
77   - URI location =
78   - ServletUriComponentsBuilder.fromCurrentRequest()
79   - .path("/{id}")
80   - .buildAndExpand(newDeviceProfileDTO.getId())
81   - .toUri();
82   - return ResponseEntity.created(location).body(newDeviceProfileDTO);
83   - })
84   - .orElse(ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build());
  66 + return ResponseEntity.ok(deviceProfileDTO);
85 67 }
86 68
87 69 /**
... ... @@ -151,7 +133,7 @@ public class YtDeviceProfileController extends BaseController {
151 133 @DeleteMapping
152 134 @ApiOperation("删除")
153 135 public void deleteDevices(@Validated({DeleteGroup.class}) @RequestBody DeleteDTO deleteDTO) throws ThingsboardException {
154   - ytDeviceProfileService.deleteDeviceProfiles(getCurrentUser().getCurrentTenantId(), deleteDTO.getIds());
  136 + ytDeviceProfileService.checkDeviceProfiles(getCurrentUser().getCurrentTenantId(), deleteDTO.getIds());
155 137
156 138 for (String id : deleteDTO.getIds()) {
157 139 deleteTbDeviceProfile(id);
... ... @@ -244,11 +226,6 @@ public class YtDeviceProfileController extends BaseController {
244 226 && deviceProfileDTO.getProfileData().getAlarms() !=null){
245 227 deviceProfileData.setAlarms(deviceProfileDTO.getProfileData().getAlarms());
246 228 }
247   -// if (null != deviceProfileDTO.getAlarms()) {
248   -// List<DeviceProfileAlarm> list = new ArrayList<>();
249   -// DeviceProfileAlarm deviceProfileAlarm = JacksonUtil.convertValue(deviceProfileDTO.getAlarms(),DeviceProfileAlarm.class);
250   -// list.add(deviceProfileAlarm);
251   -// }
252 229 tbDeviceProfile.setProfileData(deviceProfileData);
253 230
254 231 return tbDeviceProfile;
... ...
... ... @@ -54,7 +54,7 @@ public enum ErrorMessage {
54 54 EXIST_LEADER_MEMBER_RELATION(400035,"上下级之间有一种关系"),
55 55 FILE_NOT_FOUND(400036,"文件未找到"),
56 56 STORE_FILE_FAILED(400037,"文件存储失败"),
57   - NOT_BELONG_CURRENT_TENANT(400038,"该用户不属于当前租户"),
  57 + NOT_BELONG_CURRENT_TENANT(400038,"不属于当前租户"),
58 58 HAVE_NO_PERMISSION(500002,"没有修改权限");
59 59 private final int code;
60 60 private String message;
... ...
1 1 package org.thingsboard.server.common.data.yunteng.dto;
2 2
  3 +import io.swagger.annotations.ApiModelProperty;
3 4 import lombok.Data;
4 5
  6 +import javax.validation.constraints.NotEmpty;
  7 +
5 8 @Data
6 9 public class AlarmProfileDTO extends TenantDTO {
7   - /** 告警联系人 通知多人“,”号分隔 */
  10 + @ApiModelProperty(value = "告警联系人 通知多人“,”号分隔",required = true)
  11 + @NotEmpty(message = "告警联系人不能为空或空字符串")
8 12 private String alarmContactId;
9   - /** 设备配置ID */
10   - private String deviceProfileId;
11   - /** 消息通知方式:多种方式“,”号分隔 MessageTypeEnum */
  13 +
  14 + @ApiModelProperty(value ="消息通知方式:多种方式“,”号分隔 MessageTypeEnum",required = true)
  15 + @NotEmpty(message = "消息通知方式不能为空或空字符串")
12 16 private String messageMode;
  17 +
  18 + @ApiModelProperty(value ="组织ID",required = true)
  19 + @NotEmpty(message = "组织ID不能为空或空字符串")
  20 + private String organizationId;
  21 +
  22 + @ApiModelProperty("状态:0禁用 1启用")
  23 + private Integer status;
  24 +
  25 + @ApiModelProperty(value ="告警配置名称",required = true)
  26 + @NotEmpty(message = "告警配置名称不能为空或空字符串")
  27 + private String name;
  28 +
  29 + @ApiModelProperty("告警配置备注")
  30 + private String remark;
13 31 }
... ...
1 1 package org.thingsboard.server.common.data.yunteng.dto;
2 2
  3 +import io.swagger.annotations.ApiModelProperty;
3 4 import lombok.Data;
4 5 import org.thingsboard.server.common.data.yunteng.common.DeleteGroup;
5 6
... ... @@ -18,4 +19,7 @@ public class DeleteDTO {
18 19 message = "删除至少需要一个id",
19 20 groups = {DeleteGroup.class})
20 21 private Set<String> ids;
  22 +
  23 + @ApiModelProperty("租户ID")
  24 + private String tenantId;
21 25 }
... ...
... ... @@ -8,27 +8,23 @@ import org.thingsboard.server.common.data.yunteng.enums.ActionTypeEnum;
8 8
9 9 import java.util.List;
10 10
11   -/**
12   - * @Description 场景联动执行动作数据传输表
13   - * @Author cxy
14   - * @Date 2021/11/24 17:32
15   - */
  11 +/** @Description 场景联动执行动作数据传输表 @Author cxy @Date 2021/11/24 17:32 */
16 12 @Data
17 13 @EqualsAndHashCode(callSuper = true)
18   -public class DoActionDTO extends TenantDTO{
  14 +public class DoActionDTO extends TenantDTO {
19 15
20   - @ApiModelProperty(value = "所属设备id")
21   - private String deviceId;
  16 + @ApiModelProperty(value = "所属设备id")
  17 + private String deviceId;
22 18
  19 + @ApiModelProperty(value = "场景联动内容")
  20 + private JsonNode doContext;
23 21
  22 + @ApiModelProperty(value = "输出目标:设备,告警,其他")
  23 + private ActionTypeEnum outTarget;
24 24
25   - @ApiModelProperty(value = "场景联动内容")
26   - private JsonNode doContext;
27   -
28   - @ApiModelProperty(value = "输出目标:设备,场景,其他")
29   - private ActionTypeEnum outTarget;
30   -
31   - @ApiModelProperty(value = "场景联动id")
32   - private String sceneLinkageId;
  25 + @ApiModelProperty(value = "场景联动id")
  26 + private String sceneLinkageId;
33 27
  28 + @ApiModelProperty(value = "输出目标为告警才进行配置")
  29 + private String alarmProfileId;
34 30 }
... ...
... ... @@ -12,6 +12,10 @@ public class AlarmProfile extends TenantBaseEntity {
12 12
13 13 private static final long serialVersionUID = -4922707705163155569L;
14 14 private String alarmContactId;
15   - private String deviceProfileId;
  15 + private String organizationId;
16 16 private String messageMode;
  17 + private Integer status;
  18 + private String name;
  19 + private String remark;
  20 +
17 21 }
... ...
... ... @@ -10,27 +10,24 @@ import org.apache.ibatis.type.EnumTypeHandler;
10 10 import org.thingsboard.server.common.data.yunteng.constant.ModelConstants;
11 11 import org.thingsboard.server.common.data.yunteng.enums.ActionTypeEnum;
12 12
13   -/**
14   - * @Description 执行动作 @Author cxy @Date 2021/11/24 17:24
15   - */
  13 +/** @Description 执行动作 @Author cxy @Date 2021/11/24 17:24 */
16 14 @Data
17 15 @TableName(value = ModelConstants.Table.IOTFS_DO_ACTION_TABLE_NAME, autoResultMap = true)
18 16 @EqualsAndHashCode(callSuper = true)
19 17 public class DoAction extends TenantBaseEntity {
20 18
21   - private static final long serialVersionUID = -5459834451418047957L;
  19 + private static final long serialVersionUID = -5459834451418047957L;
22 20
23   - private String deviceId;
24   - @TableField(typeHandler = EnumTypeHandler.class)
25   - private ActionTypeEnum outTarget;
26   - /**
27   - * 场景联动内容
28   - */
29   - @TableField(typeHandler = JacksonTypeHandler.class)
30   - private JsonNode doContext;
  21 + private String deviceId;
31 22
32   - /**
33   - * 场景联动id
34   - */
35   - private String sceneLinkageId;
  23 + @TableField(typeHandler = EnumTypeHandler.class)
  24 + private ActionTypeEnum outTarget;
  25 + /** 场景联动内容 */
  26 + @TableField(typeHandler = JacksonTypeHandler.class)
  27 + private JsonNode doContext;
  28 +
  29 + /** 场景联动id */
  30 + private String sceneLinkageId;
  31 +
  32 + private String alarmProfileId;
36 33 }
... ...
1 1 package org.thingsboard.server.dao.yunteng.impl;
2 2
3 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;
4 6 import lombok.RequiredArgsConstructor;
5 7 import lombok.extern.slf4j.Slf4j;
6 8 import org.springframework.stereotype.Service;
  9 +import org.springframework.transaction.annotation.Transactional;
  10 +import org.thingsboard.server.common.data.StringUtils;
  11 +import org.thingsboard.server.common.data.yunteng.constant.FastIotConstants;
  12 +import org.thingsboard.server.common.data.yunteng.core.exception.NoneTenantAssetException;
  13 +import org.thingsboard.server.common.data.yunteng.core.exception.YtDataValidationException;
  14 +import org.thingsboard.server.common.data.yunteng.core.message.ErrorMessage;
7 15 import org.thingsboard.server.common.data.yunteng.dto.AlarmProfileDTO;
  16 +import org.thingsboard.server.common.data.yunteng.dto.DeleteDTO;
  17 +import org.thingsboard.server.common.data.yunteng.dto.DoActionDTO;
  18 +import org.thingsboard.server.common.data.yunteng.dto.OrganizationDTO;
  19 +import org.thingsboard.server.common.data.yunteng.enums.RoleEnum;
8 20 import org.thingsboard.server.common.data.yunteng.utils.ReflectUtils;
  21 +import org.thingsboard.server.common.data.yunteng.utils.tools.YtPageData;
9 22 import org.thingsboard.server.dao.yunteng.entities.AlarmProfile;
  23 +import org.thingsboard.server.dao.yunteng.entities.Role;
10 24 import org.thingsboard.server.dao.yunteng.mapper.AlarmProfileMapper;
  25 +import org.thingsboard.server.dao.yunteng.mapper.OrganizationMapper;
11 26 import org.thingsboard.server.dao.yunteng.service.AbstractBaseService;
12 27 import org.thingsboard.server.dao.yunteng.service.AlarmProfileService;
  28 +import org.thingsboard.server.dao.yunteng.service.DoActionService;
  29 +import org.thingsboard.server.dao.yunteng.service.YtOrganizationService;
13 30
14   -import java.util.List;
  31 +import java.util.*;
  32 +import java.util.stream.Collectors;
15 33
16 34 @Slf4j
17 35 @Service
18 36 @RequiredArgsConstructor
19 37 public class AlarmProfileServiceImpl extends AbstractBaseService<AlarmProfileMapper, AlarmProfile>
20 38 implements AlarmProfileService {
  39 +
  40 + private final DoActionService doActionService;
  41 +
  42 + private final UserOrganizationMappingServiceImpl userOrganizationMappingService;
  43 +
  44 + private final OrganizationMapper ytOrganizationMapper;
  45 +
  46 + @Override
  47 + public YtPageData<AlarmProfileDTO> page(
  48 + boolean isPtTenantAdmin,
  49 + String tenantId,
  50 + String currentUserId,
  51 + Map<String, Object> queryMap) {
  52 + List<String> organizationIds = null;
  53 + if (null != queryMap.get("organizationId")) {
  54 + String organizationId = (String) queryMap.get("organizationId");
  55 + List<OrganizationDTO> organizationList =
  56 + ytOrganizationMapper.findOrganizationTreeList(
  57 + tenantId, new HashSet<>(Arrays.asList(organizationId)));
  58 + Set<String> ids =
  59 + organizationList.stream()
  60 + .map(organizationDTO -> organizationDTO.getId())
  61 + .collect(Collectors.toSet());
  62 + organizationIds = new ArrayList<>(ids);
  63 + } else {
  64 + if (!isPtTenantAdmin) {
  65 + organizationIds = userOrganizationMappingService.getOrganizationIdsByUserId(currentUserId);
  66 + }
  67 + }
  68 + IPage<AlarmProfile> alarmProfileIPage =
  69 + baseMapper.selectPage(
  70 + getPage(queryMap, "create_time", false),
  71 + new QueryWrapper<AlarmProfile>()
  72 + .lambda()
  73 + .eq(queryMap.get("status") != null, AlarmProfile::getStatus, queryMap.get("status"))
  74 + .eq(AlarmProfile::getTenantId, tenantId)
  75 + .in(organizationIds != null, AlarmProfile::getOrganizationId, organizationIds)
  76 + .like(
  77 + queryMap.get("name") != null,
  78 + AlarmProfile::getName,
  79 + String.valueOf(queryMap.get("name"))));
  80 + return getPageData(alarmProfileIPage, AlarmProfileDTO.class);
  81 + }
  82 +
21 83 @Override
22 84 public List<AlarmProfileDTO> findAlarmProfilesByContactId(String contactId, String tenantId) {
23 85 return ReflectUtils.sourceToTarget(
... ... @@ -27,4 +89,47 @@ public class AlarmProfileServiceImpl extends AbstractBaseService<AlarmProfileMap
27 89 .like(AlarmProfile::getAlarmContactId, contactId)),
28 90 AlarmProfileDTO.class);
29 91 }
  92 +
  93 + @Override
  94 + @Transactional
  95 + public AlarmProfileDTO saveOrUpdateAlarmProfile(AlarmProfileDTO alarmProfileDTO) {
  96 + if (StringUtils.isNotEmpty(alarmProfileDTO.getId())) {
  97 + AlarmProfile alarmProfile = baseMapper.selectById(alarmProfileDTO.getId());
  98 + if (null == alarmProfile) {
  99 + throw new YtDataValidationException(ErrorMessage.INTERNAL_ERROR.getMessage());
  100 + }
  101 + baseMapper.updateById(alarmProfileDTO.getEntity(AlarmProfile.class));
  102 + } else {
  103 + baseMapper.insert(alarmProfileDTO.getEntity(AlarmProfile.class));
  104 + }
  105 + return alarmProfileDTO;
  106 + }
  107 +
  108 + @Override
  109 + @Transactional
  110 + public AlarmProfileDTO updateAlarmProFileStatus(
  111 + String alarmProfileId, String tenantId, Integer status) {
  112 + AlarmProfile alarmProfile = baseMapper.selectById(alarmProfileId);
  113 + if (null == alarmProfile) {
  114 + throw new YtDataValidationException(ErrorMessage.INTERNAL_ERROR.getMessage());
  115 + }
  116 + if (!alarmProfile.getTenantId().equals(tenantId)) {
  117 + throw new NoneTenantAssetException(ErrorMessage.NOT_BELONG_CURRENT_TENANT);
  118 + }
  119 + alarmProfile.setStatus(status);
  120 + baseMapper.updateById(alarmProfile);
  121 + return alarmProfile.getDTO(AlarmProfileDTO.class);
  122 + }
  123 +
  124 + @Override
  125 + @Transactional
  126 + public boolean deleteAlarmProFile(DeleteDTO deleteDTO) {
  127 + // 如果有场景联动使用告警配置,则不能删除
  128 + List<DoActionDTO> list =
  129 + doActionService.findDoActionByAlarmProfileIds(deleteDTO.getTenantId(), deleteDTO.getIds());
  130 + if (list.size() > FastIotConstants.MagicNumber.ZERO) {
  131 + throw new YtDataValidationException(ErrorMessage.EXIST_LEADER_MEMBER_RELATION.getMessage());
  132 + }
  133 + return baseMapper.deleteBatchIds(deleteDTO.getIds()) > 0;
  134 + }
30 135 }
... ...
1 1 package org.thingsboard.server.dao.yunteng.impl;
  2 +
2 3 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
3 4 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
4 5 import lombok.RequiredArgsConstructor;
  6 +import org.springframework.cglib.core.ReflectUtils;
5 7 import org.springframework.stereotype.Service;
  8 +import org.thingsboard.server.common.data.yunteng.dto.DoActionDTO;
6 9 import org.thingsboard.server.dao.yunteng.entities.DoAction;
  10 +import org.thingsboard.server.dao.yunteng.entities.TenantBaseEntity;
7 11 import org.thingsboard.server.dao.yunteng.mapper.DoActionMapper;
8 12 import org.thingsboard.server.dao.yunteng.service.AbstractBaseService;
9 13 import org.thingsboard.server.dao.yunteng.service.DoActionService;
10 14
11 15 import java.util.List;
  16 +import java.util.Optional;
  17 +import java.util.Set;
  18 +import java.util.stream.Collectors;
12 19
13   -/**
14   - * @Description
15   - * @Author cxy
16   - * @Date 2021/12/6 20:23
17   - */
  20 +/** @Description @Author cxy @Date 2021/12/6 20:23 */
18 21 @Service
19 22 @RequiredArgsConstructor
20 23 public class DoActionServiceImpl extends AbstractBaseService<DoActionMapper, DoAction>
21   - implements DoActionService {
22   - private final DoActionMapper actionMapper;
23   - @Override
24   - public List<DoAction> getActions(String sceneId) {
25   - LambdaQueryWrapper filter = new QueryWrapper<DoAction>().lambda()
26   - .eq(DoAction::getSceneLinkageId,sceneId);
27   - return actionMapper.selectList(filter);
28   - }
  24 + implements DoActionService {
  25 + @Override
  26 + public List<DoAction> getActions(String sceneId) {
  27 + LambdaQueryWrapper filter =
  28 + new QueryWrapper<DoAction>().lambda().eq(DoAction::getSceneLinkageId, sceneId);
  29 + return baseMapper.selectList(filter);
  30 + }
29 31
  32 + @Override
  33 + public List<DoActionDTO> findDoActionByAlarmProfileIds(
  34 + String tenantId, Set<String> alarmProfileIds) {
  35 + List<DoAction> doActions =
  36 + baseMapper.selectList(
  37 + new LambdaQueryWrapper<DoAction>()
  38 + .eq(TenantBaseEntity::getTenantId, tenantId)
  39 + .in(DoAction::getAlarmProfileId, alarmProfileIds));
  40 + return doActions.stream()
  41 + .map(doAction -> doAction.getDTO(DoActionDTO.class))
  42 + .collect(Collectors.toList());
  43 + }
30 44 }
... ...
... ... @@ -21,10 +21,7 @@ import org.thingsboard.server.dao.yunteng.service.AbstractBaseService;
21 21 import org.thingsboard.server.dao.yunteng.service.UserOrganizationMappingService;
22 22 import org.thingsboard.server.dao.yunteng.service.YtAlarmContactService;
23 23
24   -import java.util.ArrayList;
25   -import java.util.List;
26   -import java.util.Map;
27   -import java.util.Set;
  24 +import java.util.*;
28 25 import java.util.stream.Collectors;
29 26
30 27 /**
... ... @@ -165,7 +162,7 @@ public class YtAlarmContactServiceImpl extends AbstractBaseService<AlarmContactM
165 162 String organizationId = (String) queryMap.get("organizationId");
166 163 queryMap.put("tenantId", tenantId);
167 164 if (StringUtils.isNotEmpty(organizationId)) {
168   - List<String> ids = new ArrayList<>();
  165 + Set<String> ids = new HashSet<>();
169 166 ids.add(organizationId);
170 167 // 查询该组织的所有子类
171 168 List<OrganizationDTO> organizationDTOS =
... ...
... ... @@ -35,158 +35,76 @@ import java.util.*;
35 35 @Service
36 36 @RequiredArgsConstructor
37 37 @Slf4j
38   -public class YtDeviceProfileServiceImpl
39   - implements YtDeviceProfileService {
40   -
41   - private final DeviceMapper deviceMapper;
42   - private final AlarmProfileMapper alarmProfileMapper;
43   - private final CacheUtils cacheUtils;
44   -
45   - private final YtJpaDeviceProfileDao deviceProfileDao;
46   -
47   - @Override
48   - @Transactional
49   - public DeviceProfileDTO insertOrUpdate(String deviceProfileId, DeviceProfileDTO deviceProfileDTO) {
50   - if (StringUtils.isBlank(deviceProfileDTO.getId())) {
51   - return insert(deviceProfileId, deviceProfileDTO);
52   - } else {
53   - return update(deviceProfileDTO);
54   - }
55   - }
56   -
57   - private DeviceProfileDTO update(DeviceProfileDTO deviceProfileDTO) {
58   -
59   - // 如果原来不是TCP或者更新也不是TCP 那就需要check
60   -// if (!deviceProfile.getTransportType().equals(TransportTypeEnum.TCP)
61   -// || !deviceProfileDTO.getTransportType().equals(TransportTypeEnum.TCP)) {
62   -// checkDeviceProfile(deviceProfileDTO, deviceProfile);
63   -// }
64   - LambdaQueryWrapper<AlarmProfile> filter = new QueryWrapper<AlarmProfile>().lambda()
65   - .eq(AlarmProfile::getTenantId, deviceProfileDTO.getTenantId())
66   - .eq(AlarmProfile::getDeviceProfileId, deviceProfileDTO.getId());
67   - List<AlarmProfile> oldAlarms = alarmProfileMapper.selectList(filter);
68   - List<String> oldIds = new ArrayList<>();
69   - for (AlarmProfile item : oldAlarms) {
70   - oldIds.add(item.getId());
71   - }
72   -
73   -
74   - Optional.ofNullable(deviceProfileDTO.getAlarmProfile())
75   -// .filter(alarmProfileDTO -> StringUtils.isNotBlank(alarmProfileDTO.getId()))
76   - .ifPresent(alarmProfileDTO -> {
77   - AlarmProfile alarmProfile = buildAlarmDto2Entity(deviceProfileDTO.getId(), deviceProfileDTO.getTenantId(), alarmProfileDTO);
78   - String alarmId = alarmProfileDTO.getId();
79   - if (StringUtils.isNotBlank(alarmId)) {
80   - alarmProfileMapper.updateById(alarmProfile);
81   - oldIds.remove(alarmId);
82   - }
83   - {
84   - alarmProfileMapper.insert(alarmProfile);
85   - }
86   - });
87   - if(!oldIds.isEmpty()){
88   - alarmProfileMapper.deleteBatchIds(oldIds);
89   - }
90   - return deviceProfileDTO;
  38 +public class YtDeviceProfileServiceImpl implements YtDeviceProfileService {
  39 +
  40 + private final DeviceMapper deviceMapper;
  41 +
  42 + private final YtJpaDeviceProfileDao deviceProfileDao;
  43 +
  44 + @Override
  45 + public boolean validateFormdata(DeviceProfileDTO ytDeviceProfileDTO) {
  46 + TenantId tenantId = new TenantId(UUID.fromString(ytDeviceProfileDTO.getTenantId()));
  47 + if (StringUtils.isBlank(ytDeviceProfileDTO.getId())) {
  48 + // 判断数据库是否已存在名字相同的设备配置
  49 +
  50 + DeviceProfile profile = deviceProfileDao.findByName(tenantId, ytDeviceProfileDTO.getName());
  51 + if (profile != null) {
  52 + throw new YtDataValidationException(ErrorMessage.NAME_ALREADY_EXISTS.getMessage());
  53 + }
  54 + } else {
  55 + UUID profileId = UUID.fromString(ytDeviceProfileDTO.getId());
  56 + DeviceProfile profile = deviceProfileDao.findById(tenantId, profileId);
  57 + if (profile == null) {
  58 + throw new YtDataValidationException(ErrorMessage.TENANT_MISMATCHING.getMessage());
  59 + }
91 60 }
92 61
93   - private DeviceProfileDTO insert(String deviceProfileId, DeviceProfileDTO deviceProfileDTO) {
94   - Optional.ofNullable(deviceProfileDTO.getAlarmProfile())
95   - .map(
96   - alarmProfileDTO -> {
97   - AlarmProfile alarmProfile = buildAlarmDto2Entity(deviceProfileId, deviceProfileDTO.getTenantId(), alarmProfileDTO);
98   - alarmProfileMapper.insert(alarmProfile);
99   - alarmProfile.copyToDTO(alarmProfileDTO);
100   - return alarmProfileDTO;
101   - });
102   - return deviceProfileDTO;
  62 + return false;
  63 + }
  64 +
  65 + @Override
  66 + @Transactional
  67 + public void checkDeviceProfiles(String tenantId, Set<String> ids) {
  68 + // check if ids bind to device
  69 + int count =
  70 + deviceMapper.selectCount(
  71 + new QueryWrapper<YtDevice>().lambda().in(YtDevice::getProfileId, ids));
  72 + if (count > 0) {
  73 + throw new YtDataValidationException("有设备使用待删除配置,请先删除设备或者修改设备配置");
103 74 }
104   -
105   - @NotNull
106   - private AlarmProfile buildAlarmDto2Entity(String deviceProfileId, String tenantId, AlarmProfileDTO alarmProfileDTO) {
107   - alarmProfileDTO.setDeviceProfileId(deviceProfileId);
108   - alarmProfileDTO.setTenantId(tenantId);
109   - AlarmProfile alarmProfile = new AlarmProfile();
110   - alarmProfileDTO.copyToEntity(alarmProfile, ModelConstants.TablePropertyMapping.UPDATE_TIME,
111   - ModelConstants.TablePropertyMapping.UPDATER);
112   - return alarmProfile;
113   - }
114   -
115   - @Override
116   - public boolean validateFormdata(DeviceProfileDTO ytDeviceProfileDTO) {
117   - TenantId tenantId = new TenantId(UUID.fromString(ytDeviceProfileDTO.getTenantId()));
118   - if (StringUtils.isBlank(ytDeviceProfileDTO.getId())) {
119   - // 判断数据库是否已存在名字相同的设备配置
120   -
121   - DeviceProfile profile = deviceProfileDao.findByName(tenantId, ytDeviceProfileDTO.getName());
122   - if (profile != null) {
123   - throw new YtDataValidationException(ErrorMessage.NAME_ALREADY_EXISTS.getMessage());
124   - }
125   - } else {
126   - UUID profileId = UUID.fromString(ytDeviceProfileDTO.getId());
127   - DeviceProfile profile = deviceProfileDao.findById(tenantId, profileId);
128   - if (profile == null) {
129   - throw new YtDataValidationException(ErrorMessage.TENANT_MISMATCHING.getMessage());
130   - }
131   - }
132   -
133   - return false;
134   - }
135   -
136   - @Override
137   - @Transactional
138   - public void deleteDeviceProfiles(String tenantId, Set<String> ids) {
139   - // check if ids bind to device
140   - int count =
141   - deviceMapper.selectCount(new QueryWrapper<YtDevice>().lambda().in(YtDevice::getProfileId, ids));
142   - if (count > 0) {
143   - throw new YtDataValidationException("有设备使用待删除配置,请先删除设备或者修改设备配置");
144   - }
145   -
146   - for (String id : ids) {
147   - Validator.validateId(UUID.fromString(id),"Incorrect device profile id to deal.");
148   - LambdaQueryWrapper filter = new LambdaQueryWrapper<AlarmProfile>()
149   - .eq(AlarmProfile::getTenantId, tenantId)
150   - .in(AlarmProfile::getDeviceProfileId, id);
151   - alarmProfileMapper.delete(filter);
152   - }
153   -
154   - }
155   -
156   - @Override
157   - public Optional<DeviceProfileDTO> getDeviceProfile(String tenantId, String id) {
158   - TenantId tenant = new TenantId(UUID.fromString(tenantId));
159   - DeviceProfile profile = deviceProfileDao.findById(tenant, UUID.fromString(id));
160   - return Optional.ofNullable(profile).map(entity -> {
161   - DeviceProfileDTO result = ReflectUtils.getDeviceProfileDTO(entity);
162   - AlarmProfile alarmProfile = alarmProfileMapper.selectOne(new QueryWrapper<AlarmProfile>().lambda().eq(AlarmProfile::getDeviceProfileId, result.getId()));
163   - Optional.ofNullable(alarmProfile).ifPresent(alarmProfile1 -> {
164   - AlarmProfileDTO alarmProfileDTO = new AlarmProfileDTO();
165   - BeanUtils.copyProperties(alarmProfile, alarmProfileDTO);
166   - result.setAlarmProfile(alarmProfileDTO);
  75 + }
  76 +
  77 + @Override
  78 + public Optional<DeviceProfileDTO> getDeviceProfile(String tenantId, String id) {
  79 + TenantId tenant = new TenantId(UUID.fromString(tenantId));
  80 + DeviceProfile profile = deviceProfileDao.findById(tenant, UUID.fromString(id));
  81 + return Optional.ofNullable(profile)
  82 + .map(
  83 + entity -> {
  84 + DeviceProfileDTO result = ReflectUtils.getDeviceProfileDTO(entity);
  85 + return result;
167 86 });
168   -
169   - return result;
170   - });
171   - }
172   -
173   - @Override
174   - public YtPageData<DeviceProfileDTO> page(PageLink pageLink, String tenantIdStr, String transportType) {
175   -
176   -
177   - TenantId tenantId = new TenantId(UUID.fromString(tenantIdStr));
178   - Validator.validatePageLink(pageLink);
179   - PageData<DeviceProfileDTO> tbDatas = deviceProfileDao.findDeviceProfileInfos(pageLink, tenantId, transportType);
180   - YtPageData<DeviceProfileDTO> result = new YtPageData<>(tbDatas.getData(), tbDatas.getTotalElements());
181   -
182   - return result;
183   - }
184   -
185   -
186   - @Override
187   - public List<DeviceProfileDTO> findDeviceProfile(String tenantId) {
188   - UUID profileId = UUID.fromString(tenantId);
189   - List<DeviceProfileDTO> results = deviceProfileDao.findDeviceProfileByTenantId(new TenantId(profileId));
190   - return results;
191   - }
  87 + }
  88 +
  89 + @Override
  90 + public YtPageData<DeviceProfileDTO> page(
  91 + PageLink pageLink, String tenantIdStr, String transportType) {
  92 +
  93 + TenantId tenantId = new TenantId(UUID.fromString(tenantIdStr));
  94 + Validator.validatePageLink(pageLink);
  95 + PageData<DeviceProfileDTO> tbDatas =
  96 + deviceProfileDao.findDeviceProfileInfos(pageLink, tenantId, transportType);
  97 + YtPageData<DeviceProfileDTO> result =
  98 + new YtPageData<>(tbDatas.getData(), tbDatas.getTotalElements());
  99 +
  100 + return result;
  101 + }
  102 +
  103 + @Override
  104 + public List<DeviceProfileDTO> findDeviceProfile(String tenantId) {
  105 + UUID profileId = UUID.fromString(tenantId);
  106 + List<DeviceProfileDTO> results =
  107 + deviceProfileDao.findDeviceProfileByTenantId(new TenantId(profileId));
  108 + return results;
  109 + }
192 110 }
... ...
... ... @@ -69,8 +69,9 @@ public class YtNoticeServiceImpl implements YtNoticeService {
69 69 Organization organization = organizationMapper.selectOne(organizationQueryWrapper);
70 70
71 71 QueryWrapper<AlarmProfile> alarmProfileQueryWrapper = new QueryWrapper<AlarmProfile>();
72   - alarmProfileQueryWrapper.lambda()
73   - .eq(AlarmProfile::getDeviceProfileId, device.getProfileId());
  72 + //TODO junlianglee 修改通知
  73 +// alarmProfileQueryWrapper.lambda()
  74 +// .eq(AlarmProfile::getDeviceProfileId, device.getProfileId());
74 75 AlarmProfile alarmProfile = alarmProfileMapper.selectOne(alarmProfileQueryWrapper);
75 76
76 77
... ...
1 1 package org.thingsboard.server.dao.yunteng.service;
2 2
3 3 import org.thingsboard.server.common.data.yunteng.dto.AlarmProfileDTO;
  4 +import org.thingsboard.server.common.data.yunteng.dto.DeleteDTO;
  5 +import org.thingsboard.server.common.data.yunteng.utils.tools.YtPageData;
4 6 import org.thingsboard.server.dao.yunteng.entities.AlarmProfile;
5 7
6 8 import java.util.List;
  9 +import java.util.Map;
7 10
8 11 public interface AlarmProfileService extends BaseService<AlarmProfile> {
  12 +
  13 + YtPageData<AlarmProfileDTO> page(
  14 + boolean isPtTenantAdmin, String tenantId, String currentUserId, Map<String, Object> queryMap);
  15 +
9 16 List<AlarmProfileDTO> findAlarmProfilesByContactId(String contactId, String tenantId);
  17 +
  18 + AlarmProfileDTO saveOrUpdateAlarmProfile(AlarmProfileDTO alarmProfileDTO);
  19 +
  20 + AlarmProfileDTO updateAlarmProFileStatus(String alarmProfileId, String tenantId, Integer status);
  21 +
  22 + boolean deleteAlarmProFile(DeleteDTO deleteDTO);
10 23 }
... ...
1 1 package org.thingsboard.server.dao.yunteng.service;
2 2
3   -import org.thingsboard.server.common.data.id.EntityId;
4   -import org.thingsboard.server.common.data.yunteng.dto.TriggerDTO;
  3 +import org.thingsboard.server.common.data.yunteng.dto.DoActionDTO;
5 4 import org.thingsboard.server.dao.yunteng.entities.DoAction;
6 5
7 6 import java.util.List;
  7 +import java.util.Set;
8 8
9 9 /**
10 10 * @Description
... ... @@ -14,4 +14,6 @@ import java.util.List;
14 14 public interface DoActionService extends BaseService<DoAction>{
15 15
16 16 List<DoAction> getActions(String sceneId);
  17 +
  18 + List<DoActionDTO> findDoActionByAlarmProfileIds(String tenantId, Set<String> alarmProfileIds);
17 19 }
... ...
... ... @@ -9,9 +9,8 @@ import java.util.Optional;
9 9 import java.util.Set;
10 10
11 11 public interface YtDeviceProfileService {
12   - DeviceProfileDTO insertOrUpdate(String deviceProfileId, DeviceProfileDTO deviceProfileDTO);
13 12
14   - void deleteDeviceProfiles(String tenantId, Set<String> ids);
  13 + void checkDeviceProfiles(String tenantId, Set<String> ids);
15 14
16 15 Optional<DeviceProfileDTO> getDeviceProfile(String tenantId, String id);
17 16
... ...
... ... @@ -8,6 +8,7 @@
8 8 <result property="doContext" column="do_context" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>
9 9 <result property="outTarget" column="out_target" typeHandler="org.apache.ibatis.type.EnumTypeHandler"/>
10 10 <result property="sceneLinkageId" column="scene_linkage_id"/>
  11 + <result property="alarmProfileId" column="alarm_profile_id"/>
11 12 <result property="description" column="description"/>
12 13 <result property="tenantId" column="tenant_id"/>
13 14 <result property="updater" column="updater"/>
... ...