Commit 983450486bc534c4e77019243ee2ff171c721bd9

Authored by chenjunyu_1481036421
1 parent 891e4b80

feat:1.数据流转增加组织字段以及过滤 2.任务中心增加组织字段以及过滤 3.组织更新时,同时更新用户与组织的绑定关系 4.系统通知普通租户管理员通知选择全部通知当前组织及以下及超级管理员

... ... @@ -62,7 +62,6 @@ import org.thingsboard.server.common.data.yunteng.core.exception.TkDataValidatio
62 62 import org.thingsboard.server.common.data.yunteng.core.message.ErrorMessage;
63 63 import org.thingsboard.server.common.data.yunteng.dto.PublicCustomerDTO;
64 64 import org.thingsboard.server.common.data.yunteng.enums.ViewType;
65   -import org.thingsboard.server.common.data.yunteng.enums.TkScriptFunctionType;
66 65 import org.thingsboard.server.dao.asset.AssetService;
67 66 import org.thingsboard.server.dao.attributes.AttributesService;
68 67 import org.thingsboard.server.dao.audit.AuditLogService;
... ... @@ -89,7 +88,7 @@ import org.thingsboard.server.dao.tenant.TenantService;
89 88 import org.thingsboard.server.dao.user.UserService;
90 89 import org.thingsboard.server.dao.widget.WidgetTypeService;
91 90 import org.thingsboard.server.dao.widget.WidgetsBundleService;
92   -import org.thingsboard.server.dao.yunteng.service.TkOrganizationService;
  91 +import org.thingsboard.server.dao.yunteng.service.UserOrganizationMappingService;
93 92 import org.thingsboard.server.exception.ThingsboardErrorResponseHandler;
94 93 import org.thingsboard.server.queue.discovery.PartitionService;
95 94 import org.thingsboard.server.queue.provider.TbQueueProducerProvider;
... ... @@ -254,7 +253,7 @@ public abstract class BaseController {
254 253
255 254
256 255 @Autowired
257   - protected TkOrganizationService organizationService;
  256 + protected UserOrganizationMappingService userOrganizationMappingService;
258 257
259 258 @ExceptionHandler(ThingsboardException.class)
260 259 public void handleThingsboardException(ThingsboardException ex, HttpServletResponse response) {
... ... @@ -1005,7 +1004,7 @@ public abstract class BaseController {
1005 1004 }
1006 1005
1007 1006 protected List<String> commonTenantOrganizationAllIds() throws ThingsboardException {
1008   - return organizationService.currentUserOrganizationAllIds(getCurrentUser().getCurrentUserId());
  1007 + return userOrganizationMappingService.getOrganizationIdsByUserId(getCurrentUser().getCurrentUserId());
1009 1008 }
1010 1009
1011 1010 }
... ...
... ... @@ -94,6 +94,9 @@ public class TkConvertDataToController extends BaseController {
94 94 if (orderType != null) {
95 95 queryMap.put(ORDER_TYPE, orderType.name());
96 96 }
  97 + if(getCurrentUser().isPtCommonTenant()){
  98 + queryMap.put("orgIds",commonTenantOrganizationAllIds());
  99 + }
97 100 return convertConfigService.page(getCurrentUser().getCurrentTenantId(), queryMap);
98 101 }
99 102
... ...
... ... @@ -85,7 +85,10 @@ public class TkNoticeController extends BaseController {
85 85 public ResponseEntity<SysNoticeDTO> save(@Validated(AddGroup.class) @RequestBody SysNoticeDTO sysNoticeDTO) throws ThingsboardException {
86 86 sysNoticeDTO.setStatus(FastIotConstants.DraftStatus.DRAFT);
87 87 SysNoticeDTO newSysNoticeDTO =
88   - sysNoticeService.save(sysNoticeDTO, getCurrentUser().getCurrentTenantId());
  88 + sysNoticeService.save(sysNoticeDTO,
  89 + getCurrentUser().getCurrentTenantId(),
  90 + getCurrentUser().isPtCommonTenant(),
  91 + commonTenantOrganizationAllIds());
89 92 return newSysNoticeDTO == null ? ResponseEntity.badRequest().build() : ResponseEntity.ok().build();
90 93 }
91 94
... ... @@ -97,7 +100,9 @@ public class TkNoticeController extends BaseController {
97 100 sysNoticeService.send(
98 101 sysNoticeDTO,
99 102 getCurrentUser().getCurrentTenantId(),
100   - getCurrentUser().getCurrentUserId());
  103 + getCurrentUser().getCurrentUserId(),
  104 + getCurrentUser().isPtCommonTenant(),
  105 + commonTenantOrganizationAllIds());
101 106 return sysNoticeDto == null ? ResponseEntity.badRequest().build() : ResponseEntity.ok().build();
102 107 }
103 108 }
... ...
... ... @@ -37,6 +37,10 @@ public class ConvertConfigDTO extends TenantDTO {
37 37 @ApiModelProperty(value = "数据源内容")
38 38 private JsonNode datasourceContent;
39 39
  40 + @ApiModelProperty(value = "组织id")
  41 + @NotEmpty(message = "组织不能为空或者空字符串")
  42 + private String organizationId;
  43 +
40 44 private transient Integer nodeType;
41 45
42 46 private String remark;
... ...
... ... @@ -46,4 +46,7 @@ public class TkTaskCenterDTO extends TenantDTO {
46 46
47 47 @ApiModelProperty(value = "备注")
48 48 private String remark;
  49 +
  50 + @ApiModelProperty(value = "组织id")
  51 + private String organizationId;
49 52 }
... ...
... ... @@ -33,4 +33,5 @@ public class ConvertConfig extends TenantBaseEntity {
33 33 private Integer status;
34 34 private Integer nodeType;
35 35 private String remark;
  36 + private String organizationId;
36 37 }
... ...
... ... @@ -31,4 +31,6 @@ public class TkTaskCenterEntity extends TenantBaseEntity {
31 31 private Integer state;
32 32
33 33 private String remark;
  34 +
  35 + private String organizationId;
34 36 }
... ...
... ... @@ -67,7 +67,7 @@ public class SysNoticeServiceImpl extends AbstractBaseService<SysNoticeMapper, S
67 67
68 68 @Override
69 69 @Transactional
70   - public SysNoticeDTO save(SysNoticeDTO sysNoticeDTO, String tenantId) {
  70 + public SysNoticeDTO save(SysNoticeDTO sysNoticeDTO, String tenantId,boolean isPtTenant, List<String> orgIds) {
71 71 SysNoticeEntity sysNotice = sysNoticeDTO.getEntity(SysNoticeEntity.class);
72 72 // 设置为草稿
73 73 sysNotice.setTenantId(tenantId);
... ... @@ -77,18 +77,29 @@ public class SysNoticeServiceImpl extends AbstractBaseService<SysNoticeMapper, S
77 77 && StringUtils.isEmpty(sysNoticeDTO.getPointId()))) {
78 78 throw new EntityCreationException(ErrorMessage.SEND_DESTINATION_NOT_FOUND.getMessage());
79 79 }
80   - List<String> userList;
  80 + List<String> userList = null;
81 81 switch (sysNotice.getReceiverType()) {
82 82 case FastIotConstants.ReceiverType.ALL:
83   - // 获取全部用户ID
84   - userList =
85   - userMapper
86   - .selectList(
87   - new LambdaQueryWrapper<SysUserEntity>().eq(SysUserEntity::getTenantId, sysNotice.getTenantId()))
88   - .stream()
89   - .map(SysUserEntity::getId)
90   - .distinct()
91   - .collect(Collectors.toList());
  83 + //普通租户选全部只给当前组织及以下发送
  84 + if(isPtTenant){
  85 + userList =
  86 + userOrganizationMappingService.getUserIdByOrganizationIds(
  87 + tenantId,null, orgIds.toArray(new String[0]));
  88 + SysUserEntity tenantAdmin = userMapper.selectOne( new LambdaQueryWrapper<SysUserEntity>().eq(SysUserEntity::getTenantId, sysNotice.getTenantId())
  89 + .eq(SysUserEntity::getLevel,2));
  90 + if(null!=tenantAdmin){
  91 + userList.add(tenantAdmin.getId());
  92 + }
  93 + }else {// 获取全部用户ID
  94 + userList =
  95 + userMapper
  96 + .selectList(
  97 + new LambdaQueryWrapper<SysUserEntity>().eq(SysUserEntity::getTenantId, sysNotice.getTenantId()))
  98 + .stream()
  99 + .map(SysUserEntity::getId)
  100 + .distinct()
  101 + .collect(Collectors.toList());
  102 + }
92 103 break;
93 104 case FastIotConstants.ReceiverType.ORGANIZATION:
94 105 // 判断传入的集合id是否为空
... ... @@ -129,10 +140,10 @@ public class SysNoticeServiceImpl extends AbstractBaseService<SysNoticeMapper, S
129 140
130 141 @Override
131 142 @Transactional
132   - public SysNoticeDTO send(SysNoticeDTO sysNoticeDTO, String tenantId, String currentUserId) {
  143 + public SysNoticeDTO send(SysNoticeDTO sysNoticeDTO, String tenantId, String currentUserId,boolean isPtTenant, List<String> orgIds) {
133 144 SysNoticeEntity sysNotice;
134 145 // 如果通知为空,则新增
135   - sysNotice = save(sysNoticeDTO, tenantId).getEntity(SysNoticeEntity.class);
  146 + sysNotice = save(sysNoticeDTO, tenantId,isPtTenant,orgIds).getEntity(SysNoticeEntity.class);
136 147 //获取当前发送者
137 148 SysUserEntity user = userMapper.selectById(currentUserId);
138 149 if (null != user) {
... ...
... ... @@ -60,6 +60,9 @@ public class TkConvertConfigServiceImpl
60 60 ConvertConfig::getStatus,
61 61 queryMap.get("status"))
62 62 .eq(ConvertConfig::getNodeType, queryMap.get("nodeType"))
  63 + .in(null != queryMap.get("orgIds"),
  64 + ConvertConfig::getOrganizationId,
  65 + (List<String>)queryMap.get("orgIds"))
63 66 .and(
64 67 null != startTime && null != endTime,
65 68 qr ->
... ... @@ -68,7 +71,8 @@ public class TkConvertConfigServiceImpl
68 71 .like(
69 72 null != queryMap.get("name"),
70 73 ConvertConfig::getName,
71   - String.valueOf(queryMap.get("name"))));
  74 + String.valueOf(queryMap.get("name")))
  75 + );
72 76 return getPageData(iPage, ConvertConfigDTO.class);
73 77 }
74 78
... ...
... ... @@ -71,7 +71,7 @@ public class TkHomePageServiceImpl implements HomePageService {
71 71
72 72 private final TkDeviceProfileService tkDeviceProfileService;
73 73
74   - private final TkOrganizationService organizationService;
  74 + private final SysUserOrganizationMappingServiceImpl sysUserOrganizationMappingServiceImpl;
75 75
76 76 @Override
77 77 public HomePageLeftTopDTO getHomePageLeftTopInfo(
... ... @@ -119,7 +119,7 @@ public class TkHomePageServiceImpl implements HomePageService {
119 119 long startTs = todayBegin.toInstant(ZoneOffset.of("+8")).toEpochMilli();
120 120 if(isPtCommonTenant){
121 121 //查询所有组织id
122   - orgIds = organizationService.currentUserOrganizationAllIds(currentUserId);
  122 + orgIds = sysUserOrganizationMappingServiceImpl.getOrganizationIdsByUserId(currentUserId);
123 123 queryMap.put("organizationIds",orgIds);
124 124 alarmList = deviceMapper.findDeviceAlarmInfoByCustomer(startTs, null,orgIds);
125 125 //查询所有设备
... ...
... ... @@ -20,6 +20,7 @@ import org.thingsboard.server.dao.yunteng.entities.*;
20 20 import org.thingsboard.server.dao.yunteng.mapper.*;
21 21 import org.thingsboard.server.dao.yunteng.service.AbstractBaseService;
22 22 import org.thingsboard.server.dao.yunteng.service.TkOrganizationService;
  23 +import org.thingsboard.server.dao.yunteng.service.UserOrganizationMappingService;
23 24
24 25 import java.util.*;
25 26 import java.util.stream.Collectors;
... ... @@ -204,11 +205,81 @@ public class TkOrganizationServiceImpl extends AbstractBaseService<OrganizationM
204 205 (StringUtils.isNotEmpty(parentId)&&!parentId.equals(sourceParentOrganizationId))){//正常变化
205 206 invalidateParentAndMeCacheByTenantIdAndId(tenantId,false,sourceParentOrganizationId,parentId);
206 207 }
207   -
  208 + //获取组织修改之前原上级与目标上级所绑定的用户
  209 + List<Map<String,String>> userOrgList = getUserOrgMap(getUserByOrganizationIds(parentId),getUserByOrganizationIds(sourceParentOrganizationId));
208 210 baseMapper.updateById(organization);
  211 + //组织修改过后更新原上级与目标上级用户绑定的组织
  212 + for (Map<String,String> userOrg:userOrgList){
  213 + String user = userOrg.get("userId");
  214 + String org = userOrg.get("orgId");
  215 + List<String>orgIds = organizationAllIds(tenantId, org);
  216 + addOrUpdateUserOrganizationMapping(user,orgIds);
  217 + }
209 218 return organizationDTO;
210 219 }
211 220
  221 + public void addOrUpdateUserOrganizationMapping(
  222 + String userId, List<String> organizationIds) {
  223 + if (StringUtils.isEmpty(userId) || null == organizationIds || organizationIds.size() < 1) {
  224 + throw new TkDataValidationException(ErrorMessage.INVALID_PARAMETER.getMessage());
  225 + }
  226 + // 先删除,再新增
  227 + userOrganizationMappingMapper.delete(
  228 + new LambdaQueryWrapper<TkUserOrganizationMappingEntity>()
  229 + .eq(TkUserOrganizationMappingEntity::getUserId, userId));
  230 + organizationIds.forEach(
  231 + organizationId -> {
  232 + TkUserOrganizationMappingEntity userOrganizationMapping = new TkUserOrganizationMappingEntity();
  233 + userOrganizationMapping.setUserId(userId);
  234 + userOrganizationMapping.setOrganizationId(organizationId);
  235 + userOrganizationMappingMapper.insert(userOrganizationMapping);
  236 + });
  237 + }
  238 +
  239 + List<Map<String,String>> getUserOrgMap(List<String>newUserIds ,List<String> oldUserIds){
  240 + //目标上级原本绑定的用户 newUserIds
  241 + //原上级原本绑定的用户 oldUserIds
  242 + List<Map<String,String>> userOrgList = new ArrayList<>();
  243 + for (String oldUserId:oldUserIds) {
  244 + Map<String,String> map = new HashMap<>();
  245 + map.put("userId",oldUserId);
  246 + map.put("orgId", getOrganizationIdsByUser(oldUserId).get(0));
  247 + userOrgList.add(map);
  248 + }
  249 + for (String newUserId:newUserIds) {
  250 + Map<String,String> map = new HashMap<>();
  251 + map.put("userId",newUserId);
  252 + map.put("orgId", getOrganizationIdsByUser(newUserId).get(0));
  253 + userOrgList.add(map);
  254 + }
  255 + return userOrgList;
  256 + }
  257 + // 获取当前组织的用户id集
  258 + List<String> getUserByOrganizationIds(String ogrId){
  259 + if (StringUtils.isEmpty(ogrId)) {
  260 + return null;
  261 + }
  262 + return userOrganizationMappingMapper
  263 + .selectList(
  264 + new QueryWrapper<TkUserOrganizationMappingEntity>()
  265 + .lambda()
  266 + .eq(TkUserOrganizationMappingEntity::getOrganizationId, ogrId))
  267 + .stream()
  268 + .map(TkUserOrganizationMappingEntity::getUserId)
  269 + .collect(Collectors.toList());
  270 + }
  271 + // 获取当前用户的组织id集
  272 + List<String> getOrganizationIdsByUser(String userId){
  273 + return userOrganizationMappingMapper
  274 + .selectList(
  275 + new QueryWrapper<TkUserOrganizationMappingEntity>()
  276 + .lambda()
  277 + .in(TkUserOrganizationMappingEntity::getUserId, userId))
  278 + .stream()
  279 + .map(TkUserOrganizationMappingEntity::getOrganizationId)
  280 + .collect(Collectors.toList());
  281 + }
  282 +
212 283 @Override
213 284 public List<OrganizationDTO> getMyOrganizations(
214 285 boolean isPtSysAdmin, boolean isPtTenantAdmin,boolean isCustomer, boolean isPtCommonTenant, String tenantId, String currentUserId,String organizationId) {
... ... @@ -218,10 +289,7 @@ public class TkOrganizationServiceImpl extends AbstractBaseService<OrganizationM
218 289 return findOrganizationTree(tenantId,organizationIds);
219 290 } else {
220 291 // 返回当前用户组织id集
221   - Set<String> organizationIds =getUserOrganizationIds(currentUserId);
222   - if(!StringUtils.isEmpty(organizationId)){
223   - organizationIds = new HashSet<>(List.of(organizationId));
224   - }
  292 + List<String> organizationIds =getOrganizationIdsByUser(currentUserId);
225 293 if (organizationIds.size() > 0) {
226 294 return findOrganizationTree(tenantId, new ArrayList<>(organizationIds));
227 295 } else {
... ... @@ -231,17 +299,6 @@ public class TkOrganizationServiceImpl extends AbstractBaseService<OrganizationM
231 299 }
232 300 }
233 301
234   - // 获取当前用户组织id集
235   - Set<String> getUserOrganizationIds(String currentUserId){
236   - return userOrganizationMappingMapper
237   - .selectList(
238   - new QueryWrapper<TkUserOrganizationMappingEntity>()
239   - .lambda()
240   - .in(TkUserOrganizationMappingEntity::getUserId, currentUserId))
241   - .stream()
242   - .map(TkUserOrganizationMappingEntity::getOrganizationId)
243   - .collect(Collectors.toSet());
244   - }
245 302
246 303
247 304
... ... @@ -387,18 +444,6 @@ public class TkOrganizationServiceImpl extends AbstractBaseService<OrganizationM
387 444 });
388 445 }
389 446
390   - /**
391   - * 当前用户多个组织结构下的所有组织ID
392   - *
393   - * @param currentUserId 当前用户id
394   - */
395   - @Override
396   - public List<String> currentUserOrganizationAllIds(String currentUserId) {
397   - Set<String> organizationIds = getUserOrganizationIds(currentUserId);
398   - List<String> clearOrgId = new ArrayList<>();
399   - organizationIds.forEach(item ->clearOrgId.add(item));
400   - return clearOrgId;
401   - }
402 447
403 448 @Override
404 449 public List<OrganizationDTO> findOrganizationTreeList(String tenantId, OrganizationEnum sort, Collection<String> organizationIds) {
... ...
... ... @@ -54,18 +54,6 @@ public class TkTaskCenterServiceImpl
54 54 IPage<TkTaskCenterEntity> page =
55 55 getPage(queryMap, FastIotConstants.DefaultOrder.CREATE_TIME, false);
56 56 IPage<TkTaskCenterDTO> iPage = baseMapper.getPageData(page, queryMap);
57   - List<String> orgIds = (List<String>) queryMap.get("orgIds");
58   - if(null!=orgIds&&!iPage.getRecords().isEmpty()){
59   - List<TkTaskCenterDTO> list = new ArrayList<>();
60   - iPage.getRecords().stream().forEach(dto->{
61   - orgIds.forEach(orgId-> {
62   - if(dto.getExecuteTarget().getOrganizationId().equals(orgId)){
63   - list.add(dto);
64   - }
65   - });
66   - });
67   - iPage.setRecords(list);
68   - }
69 57 if (!iPage.getRecords().isEmpty()) {
70 58 iPage.setRecords(
71 59 iPage.getRecords().stream()
... ...
... ... @@ -4,6 +4,7 @@ import org.thingsboard.server.common.data.yunteng.dto.SysNoticeDTO;
4 4 import org.thingsboard.server.common.data.yunteng.utils.tools.TkPageData;
5 5 import org.thingsboard.server.dao.yunteng.entities.SysNoticeEntity;
6 6
  7 +import java.util.List;
7 8 import java.util.Map;
8 9 import java.util.Set;
9 10
... ... @@ -20,7 +21,7 @@ public interface SysNoticeService extends BaseService<SysNoticeEntity>{
20 21
21 22 boolean delete(Set<String> ids, String tenantId);
22 23
23   - SysNoticeDTO save(SysNoticeDTO sysNoticeDTO,String tenantId);
  24 + SysNoticeDTO save(SysNoticeDTO sysNoticeDTO, String tenantId, boolean isPtTenant, List<String> orgIds);
24 25
25   - SysNoticeDTO send(SysNoticeDTO sysNoticeDTO,String tenantId,String currentUserId);
  26 + SysNoticeDTO send(SysNoticeDTO sysNoticeDTO,String tenantId,String currentUserId,boolean isPtTenant, List<String> orgIds);
26 27 }
... ...
... ... @@ -32,12 +32,6 @@ public interface TkOrganizationService extends BaseService<TkOrganizationEntity>
32 32 */
33 33 List<String> organizationAllIds(String tenantId, String organizationId);
34 34
35   - /**
36   - * 组织结构下的所有组织ID
37   - *
38   - * @param currentUserId 当前用户id
39   - */
40   - List<String> currentUserOrganizationAllIds(String currentUserId);
41 35
42 36 List<OrganizationDTO> findOrganizationTreeList(String tenantId, OrganizationEnum sort, Collection<String> organizationIds);
43 37
... ...
... ... @@ -18,6 +18,7 @@
18 18 <result property="updater" column="updater"/>
19 19 <result property="updateTime" column="update_time"/>
20 20 <result property="tenantId" column="tenant_id" />
  21 + <result property="organizationId" column="organization_id" />
21 22 <association property="tkDeviceTaskCenter" javaType="org.thingsboard.server.common.data.yunteng.dto.task.TkDeviceTaskCenterDTO">
22 23 <result property="allowState" column="allow_state"/>
23 24 <result property="taskCenterId" column="task_center_id"/>
... ... @@ -29,7 +30,7 @@
29 30
30 31 <sql id="basicColumns">
31 32 tc.id,tc.name,tc.target_type,tc.execute_target,tc.execute_content,tc.execute_time,tc.create_time,tc.creator,
32   - tc.updater,tc.update_time,tc.tenant_id,tc.state
  33 + tc.updater,tc.update_time,tc.tenant_id,tc.state,tc.organization_id
33 34 </sql>
34 35 <select id="getPageData" resultMap="dataMap">
35 36 SELECT
... ... @@ -54,6 +55,12 @@
54 55 <if test="queryMap.tbDeviceId !=null and queryMap.tbDeviceId !=''">
55 56 AND tdc.tb_device_id = #{queryMap.tbDeviceId}
56 57 </if>
  58 + <if test="queryMap.orgIds !=null and queryMap.orgIds.size() &gt; 0">
  59 + AND organization_id IN
  60 + <foreach collection="queryMap.orgIds" item="organizationId" open="(" separator="," close=")">
  61 + #{organizationId}
  62 + </foreach>
  63 + </if>
57 64 </where>
58 65 </select>
59 66 </mapper>
... ...