Commit c7235c2d940641ffbe8b1e8956cceeefeeae5805

Authored by xp.Huang
2 parents 2837e773 f8fe572e

Merge branch '20220310' into 'master'

20220310

See merge request huang/thingsboard3.3.2!64
@@ -96,7 +96,7 @@ public class ControllerExceptionHandler { @@ -96,7 +96,7 @@ public class ControllerExceptionHandler {
96 public void handleEntityCreationException(HttpServletResponse response) { 96 public void handleEntityCreationException(HttpServletResponse response) {
97 errorResponseHandler.handle( 97 errorResponseHandler.handle(
98 new YunTengException( 98 new YunTengException(
99 - ErrorMessage.SEND_DESTINATION_NOT_FOUND, HttpStatus.PRECONDITION_FAILED), 99 + ErrorMessage.SEND_DESTINATION_NOT_FOUND, HttpStatus.BAD_REQUEST),
100 response); 100 response);
101 } 101 }
102 102
@@ -40,4 +40,6 @@ public class SceneLinkageDTO extends TenantDTO{ @@ -40,4 +40,6 @@ public class SceneLinkageDTO extends TenantDTO{
40 @ApiModelProperty(value = "执行条件") 40 @ApiModelProperty(value = "执行条件")
41 private List<DoConditionDTO> doConditions; 41 private List<DoConditionDTO> doConditions;
42 42
  43 + private String creatorName;
  44 +
43 } 45 }
@@ -9,6 +9,7 @@ import org.springframework.stereotype.Service; @@ -9,6 +9,7 @@ import org.springframework.stereotype.Service;
9 import org.springframework.transaction.annotation.Transactional; 9 import org.springframework.transaction.annotation.Transactional;
10 import org.thingsboard.server.common.data.yunteng.constant.FastIotConstants; 10 import org.thingsboard.server.common.data.yunteng.constant.FastIotConstants;
11 import org.thingsboard.server.common.data.yunteng.core.exception.YtDataValidationException; 11 import org.thingsboard.server.common.data.yunteng.core.exception.YtDataValidationException;
  12 +import org.thingsboard.server.common.data.yunteng.core.message.ErrorMessage;
12 import org.thingsboard.server.common.data.yunteng.dto.AlarmContactDTO; 13 import org.thingsboard.server.common.data.yunteng.dto.AlarmContactDTO;
13 import org.thingsboard.server.common.data.yunteng.dto.OrganizationDTO; 14 import org.thingsboard.server.common.data.yunteng.dto.OrganizationDTO;
14 import org.thingsboard.server.common.data.yunteng.utils.ReflectUtils; 15 import org.thingsboard.server.common.data.yunteng.utils.ReflectUtils;
@@ -24,142 +25,163 @@ import java.util.ArrayList; @@ -24,142 +25,163 @@ import java.util.ArrayList;
24 import java.util.List; 25 import java.util.List;
25 import java.util.Map; 26 import java.util.Map;
26 import java.util.Set; 27 import java.util.Set;
  28 +import java.util.stream.Collectors;
27 29
28 -/** @Description 告警联系人业务实现 @Author cxy @Date 2021/11/2 14:47 */ 30 +/**
  31 + * @Description 告警联系人业务实现 @Author cxy @Date 2021/11/2 14:47
  32 + */
29 @Service 33 @Service
30 @RequiredArgsConstructor 34 @RequiredArgsConstructor
31 public class YtAlarmContactServiceImpl extends AbstractBaseService<AlarmContactMapper, AlarmContact> 35 public class YtAlarmContactServiceImpl extends AbstractBaseService<AlarmContactMapper, AlarmContact>
32 - implements YtAlarmContactService {  
33 - /** mapper注入 自带方法加入,继承的baseMapper */  
34 - private final AlarmContactMapper alarmContactMapper; 36 + implements YtAlarmContactService {
  37 + /**
  38 + * mapper注入 自带方法加入,继承的baseMapper
  39 + */
  40 + private final AlarmContactMapper alarmContactMapper;
35 41
36 - private final OrganizationMapper ytOrganizationMapper; 42 + private final OrganizationMapper ytOrganizationMapper;
37 43
38 - private final UserOrganizationMappingService userOrganizationMappingService;  
39 - /**  
40 - * 查询全部的告警联系人  
41 - *  
42 - * @param params 传参  
43 - * @return List  
44 - */  
45 - @Override  
46 - public List<AlarmContactDTO> findAll(String tenantId, Map<String, Object> params) {  
47 - // 查询当前租户  
48 - List<AlarmContact> list =  
49 - alarmContactMapper.selectList(  
50 - new QueryWrapper<AlarmContact>()  
51 - .lambda()  
52 - .eq(AlarmContact::getTenantId, tenantId)  
53 - .like(  
54 - params.containsKey("username"),  
55 - AlarmContact::getUsername,  
56 - String.valueOf(params.get("username")))  
57 - .or()  
58 - .like(  
59 - params.containsKey("department"),  
60 - AlarmContact::getOrganizationId,  
61 - String.valueOf(params.get("organizationId"))));  
62 - System.out.println(list);  
63 - return ReflectUtils.sourceToTarget(list, AlarmContactDTO.class);  
64 - } 44 + private final UserOrganizationMappingService userOrganizationMappingService;
65 45
66 - /**  
67 - * 新增租户  
68 - *  
69 - * @param tenantId 租户编码  
70 - * @return alarmContactDTO  
71 - */  
72 - private LambdaQueryWrapper<AlarmContact> tenantWapper(String tenantId) {  
73 - return new QueryWrapper<AlarmContact>().lambda().eq(AlarmContact::getTenantId, tenantId);  
74 - } 46 + /**
  47 + * 查询全部的告警联系人
  48 + *
  49 + * @param params 传参
  50 + * @return List
  51 + */
  52 + @Override
  53 + public List<AlarmContactDTO> findAll(String tenantId, Map<String, Object> params) {
  54 + // 查询当前租户
  55 + List<AlarmContact> list =
  56 + alarmContactMapper.selectList(
  57 + new QueryWrapper<AlarmContact>()
  58 + .lambda()
  59 + .eq(AlarmContact::getTenantId, tenantId)
  60 + .like(
  61 + params.containsKey("username"),
  62 + AlarmContact::getUsername,
  63 + String.valueOf(params.get("username")))
  64 + .or()
  65 + .like(
  66 + params.containsKey("department"),
  67 + AlarmContact::getOrganizationId,
  68 + String.valueOf(params.get("organizationId"))));
  69 + System.out.println(list);
  70 + return ReflectUtils.sourceToTarget(list, AlarmContactDTO.class);
  71 + }
  72 +
  73 + /**
  74 + * 新增租户
  75 + *
  76 + * @param tenantId 租户编码
  77 + * @return alarmContactDTO
  78 + */
  79 + private LambdaQueryWrapper<AlarmContact> tenantWapper(String tenantId) {
  80 + return new QueryWrapper<AlarmContact>().lambda().eq(AlarmContact::getTenantId, tenantId);
  81 + }
75 82
76 - @Override  
77 - @Transactional  
78 - public AlarmContactDTO saveAlarmContact(String tenantId, AlarmContactDTO alarmContactDTO) {  
79 - LambdaQueryWrapper<AlarmContact> Wrapper =  
80 - tenantWapper(tenantId).eq(AlarmContact::getUsername, alarmContactDTO.getUsername());  
81 - int Count = baseMapper.selectCount(Wrapper);  
82 - if (Count > 0) {  
83 - throw new YtDataValidationException("department for this name is exited"); 83 + @Override
  84 + @Transactional
  85 + public AlarmContactDTO saveAlarmContact(String tenantId, AlarmContactDTO alarmContactDTO) {
  86 + LambdaQueryWrapper<AlarmContact> Wrapper =
  87 + tenantWapper(tenantId).eq(AlarmContact::getUsername, alarmContactDTO.getUsername());
  88 + int Count = baseMapper.selectCount(Wrapper);
  89 + if (Count > 0) {
  90 + throw new YtDataValidationException("department for this name is exited");
  91 + }
  92 + if (checkPhoneEmail(tenantId,alarmContactDTO.getPhone(), alarmContactDTO.getEmail()).size() > 0) {
  93 + throw new YtDataValidationException(ErrorMessage.PHONE_OR_EMAIL_HAS_REGISTER.getMessage());
  94 + }
  95 + alarmContactDTO.setTenantId(tenantId);
  96 + AlarmContact alarmContact = alarmContactDTO.getEntity(AlarmContact.class);
  97 + int insertCount = baseMapper.insert(alarmContact);
  98 + if (insertCount > 0) {
  99 + alarmContact.copyToDTO(alarmContactDTO);
  100 + return alarmContactDTO;
  101 + }
  102 + return null;
84 } 103 }
85 - alarmContactDTO.setTenantId(tenantId);  
86 - AlarmContact alarmContact = alarmContactDTO.getEntity(AlarmContact.class);  
87 - int insertCount = baseMapper.insert(alarmContact);  
88 - if (insertCount > 0) {  
89 - alarmContact.copyToDTO(alarmContactDTO);  
90 - return alarmContactDTO; 104 +
  105 + /**
  106 + * 删除告警联系人,byId
  107 + *
  108 + * @param alarmIds 通过列表id
  109 + * @return Integer
  110 + */
  111 + @Override
  112 + @Transactional
  113 + public boolean delete(String[] alarmIds) {
  114 + Set<String> ids = Set.of(alarmIds);
  115 + baseMapper.deleteBatchIds(ids);
  116 + return true;
91 } 117 }
92 - return null;  
93 - }  
94 118
95 - /**  
96 - * 删除告警联系人,byId  
97 - *  
98 - * @param alarmIds 通过列表id  
99 - * @return Integer  
100 - */  
101 - @Override  
102 - @Transactional  
103 - public boolean delete(String[] alarmIds) {  
104 - Set<String> ids = Set.of(alarmIds);  
105 - baseMapper.deleteBatchIds(ids);  
106 - return true;  
107 - } 119 + /**
  120 + * 修改告警联系人数据
  121 + *
  122 + * @param alarmContactDTO 对象
  123 + * @return Integer
  124 + */
  125 + @Override
  126 + @Transactional
  127 + public boolean update(AlarmContactDTO alarmContactDTO) {
  128 +
  129 + // 得到对象
  130 + AlarmContact alarmContact = baseMapper.selectById(alarmContactDTO.getId());
  131 + if (alarmContact == null) {
  132 + throw new YtDataValidationException("此数据不存在");
  133 + }
  134 + if (checkPhoneEmail(alarmContact.getTenantId(),alarmContactDTO.getPhone(), alarmContactDTO.getEmail()).size() > 1) {
  135 + throw new YtDataValidationException(ErrorMessage.PHONE_OR_EMAIL_HAS_REGISTER.getMessage());
  136 + }
  137 + AlarmContact entity = alarmContactDTO.getEntity(AlarmContact.class);
  138 + System.out.println(alarmContact);
  139 + baseMapper.updateById(entity);
  140 + alarmContact.copyToDTO(alarmContactDTO);
  141 + return true;
  142 + }
108 143
109 - /**  
110 - * 修改告警联系人数据  
111 - *  
112 - * @param alarmContactDTO 对象  
113 - * @return Integer  
114 - */  
115 - @Override  
116 - @Transactional  
117 - public boolean update(AlarmContactDTO alarmContactDTO) {  
118 144
119 - // 得到对象  
120 - AlarmContact alarmContact = baseMapper.selectById(alarmContactDTO.getId());  
121 - if (alarmContact == null) {  
122 - throw new YtDataValidationException("此数据不存在");  
123 - } else {  
124 - AlarmContact entity = alarmContactDTO.getEntity(AlarmContact.class);  
125 - System.out.println(alarmContact);  
126 - baseMapper.updateById(entity);  
127 - alarmContact.copyToDTO(alarmContactDTO);  
128 - return true; 145 + private List<String> checkPhoneEmail(String tenantId,String phone, String email) {
  146 + return baseMapper.selectList(new QueryWrapper<AlarmContact>()
  147 + .lambda()
  148 + .eq(AlarmContact::getTenantId,tenantId)
  149 + .eq(email!=null,AlarmContact::getEmail, email)
  150 + .or(f -> f.eq(phone !=null,AlarmContact::getPhone, phone)))
  151 + .stream().map(i -> i.getId()).collect(Collectors.toList());
129 } 152 }
130 - }  
131 153
132 - /**  
133 - * @param queryMap 查询集合  
134 - * @return PageData  
135 - */  
136 - @Override  
137 - public YtPageData<AlarmContactDTO> page(  
138 - String tenantId,  
139 - boolean isPtTenantAdmin,  
140 - String currentUserId,  
141 - Map<String, Object> queryMap) {  
142 - // 查询分页,加入条模糊条件查询  
143 - String organizationId = (String) queryMap.get("organizationId");  
144 - queryMap.put("tenantId", tenantId);  
145 - if (StringUtils.isNotEmpty(organizationId)) {  
146 - List<String> ids = new ArrayList<>();  
147 - ids.add(organizationId);  
148 - // 查询该组织的所有子类  
149 - List<OrganizationDTO> organizationDTOS =  
150 - ytOrganizationMapper.findOrganizationTreeList(tenantId, ids);  
151 - List<String> queryOrganizationIds = new ArrayList<>();  
152 - organizationDTOS.forEach(item -> queryOrganizationIds.add(item.getId()));  
153 - queryMap.put("organizationIds", queryOrganizationIds);  
154 - } else {  
155 - if (!isPtTenantAdmin) {  
156 - List<String> queryOrganizationIds =  
157 - userOrganizationMappingService.getOrganizationIdsByUserId(currentUserId);  
158 - queryMap.put("organizationIds", queryOrganizationIds);  
159 - } 154 + /**
  155 + * @param queryMap 查询集合
  156 + * @return PageData
  157 + */
  158 + @Override
  159 + public YtPageData<AlarmContactDTO> page(
  160 + String tenantId,
  161 + boolean isPtTenantAdmin,
  162 + String currentUserId,
  163 + Map<String, Object> queryMap) {
  164 + // 查询分页,加入条模糊条件查询
  165 + String organizationId = (String) queryMap.get("organizationId");
  166 + queryMap.put("tenantId", tenantId);
  167 + if (StringUtils.isNotEmpty(organizationId)) {
  168 + List<String> ids = new ArrayList<>();
  169 + ids.add(organizationId);
  170 + // 查询该组织的所有子类
  171 + List<OrganizationDTO> organizationDTOS =
  172 + ytOrganizationMapper.findOrganizationTreeList(tenantId, ids);
  173 + List<String> queryOrganizationIds = new ArrayList<>();
  174 + organizationDTOS.forEach(item -> queryOrganizationIds.add(item.getId()));
  175 + queryMap.put("organizationIds", queryOrganizationIds);
  176 + } else {
  177 + if (!isPtTenantAdmin) {
  178 + List<String> queryOrganizationIds =
  179 + userOrganizationMappingService.getOrganizationIdsByUserId(currentUserId);
  180 + queryMap.put("organizationIds", queryOrganizationIds);
  181 + }
  182 + }
  183 + IPage<AlarmContact> page = getPage(queryMap, FastIotConstants.DefaultOrder.CREATE_TIME, false);
  184 + IPage<AlarmContactDTO> pageDto = baseMapper.getAlarmPage(page, queryMap);
  185 + return getPageData(pageDto, AlarmContactDTO.class);
160 } 186 }
161 - IPage<AlarmContact> page = getPage(queryMap, FastIotConstants.DefaultOrder.CREATE_TIME, false);  
162 - IPage<AlarmContactDTO> pageDto = baseMapper.getAlarmPage(page, queryMap);  
163 - return getPageData(pageDto, AlarmContactDTO.class);  
164 - }  
165 } 187 }
@@ -14,17 +14,14 @@ import org.apache.commons.lang3.StringUtils; @@ -14,17 +14,14 @@ import org.apache.commons.lang3.StringUtils;
14 import org.springframework.context.ApplicationEventPublisher; 14 import org.springframework.context.ApplicationEventPublisher;
15 import org.springframework.scheduling.annotation.Async; 15 import org.springframework.scheduling.annotation.Async;
16 import org.springframework.security.access.AccessDeniedException; 16 import org.springframework.security.access.AccessDeniedException;
17 -import org.springframework.security.authentication.BadCredentialsException;  
18 import org.springframework.security.crypto.password.PasswordEncoder; 17 import org.springframework.security.crypto.password.PasswordEncoder;
19 import org.springframework.stereotype.Service; 18 import org.springframework.stereotype.Service;
20 import org.springframework.transaction.annotation.Transactional; 19 import org.springframework.transaction.annotation.Transactional;
21 -import org.thingsboard.server.common.data.edge.EdgeEventActionType;  
22 import org.thingsboard.server.common.data.id.EntityId; 20 import org.thingsboard.server.common.data.id.EntityId;
23 import org.thingsboard.server.common.data.id.TenantId; 21 import org.thingsboard.server.common.data.id.TenantId;
24 import org.thingsboard.server.common.data.id.UserId; 22 import org.thingsboard.server.common.data.id.UserId;
25 import org.thingsboard.server.common.data.query.TsValue; 23 import org.thingsboard.server.common.data.query.TsValue;
26 import org.thingsboard.server.common.data.security.UserCredentials; 24 import org.thingsboard.server.common.data.security.UserCredentials;
27 -import org.thingsboard.server.common.data.security.event.UserAuthDataChangedEvent;  
28 import org.thingsboard.server.common.data.yunteng.constant.FastIotConstants; 25 import org.thingsboard.server.common.data.yunteng.constant.FastIotConstants;
29 import org.thingsboard.server.common.data.yunteng.constant.ModelConstants; 26 import org.thingsboard.server.common.data.yunteng.constant.ModelConstants;
30 import org.thingsboard.server.common.data.yunteng.core.cache.CacheUtils; 27 import org.thingsboard.server.common.data.yunteng.core.cache.CacheUtils;
@@ -48,6 +45,7 @@ import java.time.LocalDateTime; @@ -48,6 +45,7 @@ import java.time.LocalDateTime;
48 import java.time.format.DateTimeFormatter; 45 import java.time.format.DateTimeFormatter;
49 import java.util.*; 46 import java.util.*;
50 import java.util.concurrent.CompletableFuture; 47 import java.util.concurrent.CompletableFuture;
  48 +import java.util.concurrent.atomic.AtomicReference;
51 import java.util.stream.Collectors; 49 import java.util.stream.Collectors;
52 50
53 import static org.thingsboard.server.common.data.yunteng.constant.FastIotConstants.*; 51 import static org.thingsboard.server.common.data.yunteng.constant.FastIotConstants.*;
@@ -81,6 +79,7 @@ public class YtUserServiceImpl extends AbstractBaseService<UserMapper, User> @@ -81,6 +79,7 @@ public class YtUserServiceImpl extends AbstractBaseService<UserMapper, User>
81 private final ApplicationEventPublisher eventPublisher; 79 private final ApplicationEventPublisher eventPublisher;
82 private final AccountProperties accountProperties; 80 private final AccountProperties accountProperties;
83 81
  82 + private final TenantMapper tenantMapper;
84 @Override 83 @Override
85 public List<UserDetailsDTO> findUserDetailsByUsername(String username, String tenantId) { 84 public List<UserDetailsDTO> findUserDetailsByUsername(String username, String tenantId) {
86 // 多个租户可能存在多个username相同的情况 85 // 多个租户可能存在多个username相同的情况
@@ -234,10 +233,16 @@ public class YtUserServiceImpl extends AbstractBaseService<UserMapper, User> @@ -234,10 +233,16 @@ public class YtUserServiceImpl extends AbstractBaseService<UserMapper, User>
234 if (!StringUtils.isEmpty(user.getActivateToken())) { 233 if (!StringUtils.isEmpty(user.getActivateToken())) {
235 userInfoDTO.setNeedSetPwd(false); 234 userInfoDTO.setNeedSetPwd(false);
236 } 235 }
  236 + AtomicReference<LocalDateTime> expireTime = new AtomicReference<>(user.getAccountExpireTime());
  237 + if(expireTime.get() == null){
  238 + Tenant tenant =tenantMapper.selectOne(new QueryWrapper<Tenant>().lambda().eq(Tenant::getTenantId,tenantId));
  239 + Optional.ofNullable(tenant).ifPresent(i -> {
  240 + expireTime.set(i.getTenantExpireTime());});
  241 + }
  242 + userInfoDTO.setAccountExpireTime(expireTime.get());
237 userInfoDTO.setUserId(userId); 243 userInfoDTO.setUserId(userId);
238 userInfoDTO.setUsername(user.getUsername()); 244 userInfoDTO.setUsername(user.getUsername());
239 userInfoDTO.setCreateTime(user.getCreateTime()); 245 userInfoDTO.setCreateTime(user.getCreateTime());
240 - userInfoDTO.setAccountExpireTime(user.getAccountExpireTime());  
241 userInfoDTO.setRealName(user.getRealName()); 246 userInfoDTO.setRealName(user.getRealName());
242 userInfoDTO.setAvatar(user.getAvatar()); 247 userInfoDTO.setAvatar(user.getAvatar());
243 userInfoDTO.setPhoneNumber(user.getPhoneNumber()); 248 userInfoDTO.setPhoneNumber(user.getPhoneNumber());
@@ -13,6 +13,7 @@ @@ -13,6 +13,7 @@
13 <result property="updateTime" column="update_time"/> 13 <result property="updateTime" column="update_time"/>
14 <result property="createTime" column="create_time"/> 14 <result property="createTime" column="create_time"/>
15 <result property="creator" column="creator"/> 15 <result property="creator" column="creator"/>
  16 + <result property="creatorName" column="creator_name"/>
16 <collection property="triggers" select="org.thingsboard.server.dao.yunteng.mapper.TriggerMapper.listBySceneId" column="id" /> 17 <collection property="triggers" select="org.thingsboard.server.dao.yunteng.mapper.TriggerMapper.listBySceneId" column="id" />
17 <collection property="doConditions" select="org.thingsboard.server.dao.yunteng.mapper.DoConditionMapper.listBySceneId" column="id" /> 18 <collection property="doConditions" select="org.thingsboard.server.dao.yunteng.mapper.DoConditionMapper.listBySceneId" column="id" />
18 <collection property="doActions" select="org.thingsboard.server.dao.yunteng.mapper.DoActionMapper.listBySceneId" column="id" /> 19 <collection property="doActions" select="org.thingsboard.server.dao.yunteng.mapper.DoActionMapper.listBySceneId" column="id" />
@@ -23,8 +24,9 @@ @@ -23,8 +24,9 @@
23 </sql> 24 </sql>
24 <select id="getScenePage" resultMap="sceneLinkageMap"> 25 <select id="getScenePage" resultMap="sceneLinkageMap">
25 SELECT 26 SELECT
26 - <include refid="columns"/> 27 + <include refid="columns"/>,su.real_name creator_name
27 FROM iotfs_scene_linkage s 28 FROM iotfs_scene_linkage s
  29 + LEFT JOIN sys_user su ON su.id = s.creator
28 LEFT JOIN iotfs_organization io ON io.id = s.organization_id 30 LEFT JOIN iotfs_organization io ON io.id = s.organization_id
29 <where> 31 <where>
30 <if test="queryMap.tenantId !=null and queryMap.tenantId !=''"> 32 <if test="queryMap.tenantId !=null and queryMap.tenantId !=''">