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 96 public void handleEntityCreationException(HttpServletResponse response) {
97 97 errorResponseHandler.handle(
98 98 new YunTengException(
99   - ErrorMessage.SEND_DESTINATION_NOT_FOUND, HttpStatus.PRECONDITION_FAILED),
  99 + ErrorMessage.SEND_DESTINATION_NOT_FOUND, HttpStatus.BAD_REQUEST),
100 100 response);
101 101 }
102 102
... ...
... ... @@ -40,4 +40,6 @@ public class SceneLinkageDTO extends TenantDTO{
40 40 @ApiModelProperty(value = "执行条件")
41 41 private List<DoConditionDTO> doConditions;
42 42
  43 + private String creatorName;
  44 +
43 45 }
... ...
... ... @@ -9,6 +9,7 @@ import org.springframework.stereotype.Service;
9 9 import org.springframework.transaction.annotation.Transactional;
10 10 import org.thingsboard.server.common.data.yunteng.constant.FastIotConstants;
11 11 import org.thingsboard.server.common.data.yunteng.core.exception.YtDataValidationException;
  12 +import org.thingsboard.server.common.data.yunteng.core.message.ErrorMessage;
12 13 import org.thingsboard.server.common.data.yunteng.dto.AlarmContactDTO;
13 14 import org.thingsboard.server.common.data.yunteng.dto.OrganizationDTO;
14 15 import org.thingsboard.server.common.data.yunteng.utils.ReflectUtils;
... ... @@ -24,142 +25,163 @@ import java.util.ArrayList;
24 25 import java.util.List;
25 26 import java.util.Map;
26 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 33 @Service
30 34 @RequiredArgsConstructor
31 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 14 import org.springframework.context.ApplicationEventPublisher;
15 15 import org.springframework.scheduling.annotation.Async;
16 16 import org.springframework.security.access.AccessDeniedException;
17   -import org.springframework.security.authentication.BadCredentialsException;
18 17 import org.springframework.security.crypto.password.PasswordEncoder;
19 18 import org.springframework.stereotype.Service;
20 19 import org.springframework.transaction.annotation.Transactional;
21   -import org.thingsboard.server.common.data.edge.EdgeEventActionType;
22 20 import org.thingsboard.server.common.data.id.EntityId;
23 21 import org.thingsboard.server.common.data.id.TenantId;
24 22 import org.thingsboard.server.common.data.id.UserId;
25 23 import org.thingsboard.server.common.data.query.TsValue;
26 24 import org.thingsboard.server.common.data.security.UserCredentials;
27   -import org.thingsboard.server.common.data.security.event.UserAuthDataChangedEvent;
28 25 import org.thingsboard.server.common.data.yunteng.constant.FastIotConstants;
29 26 import org.thingsboard.server.common.data.yunteng.constant.ModelConstants;
30 27 import org.thingsboard.server.common.data.yunteng.core.cache.CacheUtils;
... ... @@ -48,6 +45,7 @@ import java.time.LocalDateTime;
48 45 import java.time.format.DateTimeFormatter;
49 46 import java.util.*;
50 47 import java.util.concurrent.CompletableFuture;
  48 +import java.util.concurrent.atomic.AtomicReference;
51 49 import java.util.stream.Collectors;
52 50
53 51 import static org.thingsboard.server.common.data.yunteng.constant.FastIotConstants.*;
... ... @@ -81,6 +79,7 @@ public class YtUserServiceImpl extends AbstractBaseService<UserMapper, User>
81 79 private final ApplicationEventPublisher eventPublisher;
82 80 private final AccountProperties accountProperties;
83 81
  82 + private final TenantMapper tenantMapper;
84 83 @Override
85 84 public List<UserDetailsDTO> findUserDetailsByUsername(String username, String tenantId) {
86 85 // 多个租户可能存在多个username相同的情况
... ... @@ -234,10 +233,16 @@ public class YtUserServiceImpl extends AbstractBaseService<UserMapper, User>
234 233 if (!StringUtils.isEmpty(user.getActivateToken())) {
235 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 243 userInfoDTO.setUserId(userId);
238 244 userInfoDTO.setUsername(user.getUsername());
239 245 userInfoDTO.setCreateTime(user.getCreateTime());
240   - userInfoDTO.setAccountExpireTime(user.getAccountExpireTime());
241 246 userInfoDTO.setRealName(user.getRealName());
242 247 userInfoDTO.setAvatar(user.getAvatar());
243 248 userInfoDTO.setPhoneNumber(user.getPhoneNumber());
... ...
... ... @@ -13,6 +13,7 @@
13 13 <result property="updateTime" column="update_time"/>
14 14 <result property="createTime" column="create_time"/>
15 15 <result property="creator" column="creator"/>
  16 + <result property="creatorName" column="creator_name"/>
16 17 <collection property="triggers" select="org.thingsboard.server.dao.yunteng.mapper.TriggerMapper.listBySceneId" column="id" />
17 18 <collection property="doConditions" select="org.thingsboard.server.dao.yunteng.mapper.DoConditionMapper.listBySceneId" column="id" />
18 19 <collection property="doActions" select="org.thingsboard.server.dao.yunteng.mapper.DoActionMapper.listBySceneId" column="id" />
... ... @@ -23,8 +24,9 @@
23 24 </sql>
24 25 <select id="getScenePage" resultMap="sceneLinkageMap">
25 26 SELECT
26   - <include refid="columns"/>
  27 + <include refid="columns"/>,su.real_name creator_name
27 28 FROM iotfs_scene_linkage s
  29 + LEFT JOIN sys_user su ON su.id = s.creator
28 30 LEFT JOIN iotfs_organization io ON io.id = s.organization_id
29 31 <where>
30 32 <if test="queryMap.tenantId !=null and queryMap.tenantId !=''">
... ...