feat(tenant): 添加租户删除时的数据清理逻辑
- 在SysDictItem和SysDictType实体中添加isDeleted字段用于逻辑删除 - 注入DeviceMapper用于处理设备数据删除 - 实现完整的租户删除逻辑,包括角色、组织、用户关联的逻辑删除 - 添加用户清理机制,删除不再属于任何租户的孤立用户 - 实master
parent
bf7439b200
commit
b55f17a0aa
|
|
@ -21,4 +21,6 @@ public class SysDictItem extends BaseEntity {
|
||||||
|
|
||||||
@TableField(exist = false)
|
@TableField(exist = false)
|
||||||
private Long tenantId;
|
private Long tenantId;
|
||||||
|
@TableField(exist = false)
|
||||||
|
private Integer isDeleted;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -19,4 +19,6 @@ public class SysDictType extends BaseEntity {
|
||||||
|
|
||||||
@TableField(exist = false)
|
@TableField(exist = false)
|
||||||
private Long tenantId;
|
private Long tenantId;
|
||||||
|
@TableField(exist = false)
|
||||||
|
private Integer isDeleted;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -29,12 +29,14 @@ public class SysTenantServiceImpl extends ServiceImpl<SysTenantMapper, SysTenant
|
||||||
private final SysRolePermissionMapper sysRolePermissionMapper;
|
private final SysRolePermissionMapper sysRolePermissionMapper;
|
||||||
private final SysTenantUserService sysTenantUserService;
|
private final SysTenantUserService sysTenantUserService;
|
||||||
private final PasswordEncoder passwordEncoder;
|
private final PasswordEncoder passwordEncoder;
|
||||||
|
private final com.imeeting.mapper.DeviceMapper deviceMapper;
|
||||||
|
|
||||||
public SysTenantServiceImpl(SysUserService sysUserService, SysRoleService sysRoleService,
|
public SysTenantServiceImpl(SysUserService sysUserService, SysRoleService sysRoleService,
|
||||||
SysOrgService sysOrgService, SysPermissionService sysPermissionService,
|
SysOrgService sysOrgService, SysPermissionService sysPermissionService,
|
||||||
SysParamService sysParamService, SysUserRoleMapper sysUserRoleMapper,
|
SysParamService sysParamService, SysUserRoleMapper sysUserRoleMapper,
|
||||||
SysRolePermissionMapper sysRolePermissionMapper,
|
SysRolePermissionMapper sysRolePermissionMapper,
|
||||||
SysTenantUserService sysTenantUserService, PasswordEncoder passwordEncoder) {
|
SysTenantUserService sysTenantUserService, PasswordEncoder passwordEncoder,
|
||||||
|
com.imeeting.mapper.DeviceMapper deviceMapper) {
|
||||||
this.sysUserService = sysUserService;
|
this.sysUserService = sysUserService;
|
||||||
this.sysRoleService = sysRoleService;
|
this.sysRoleService = sysRoleService;
|
||||||
this.sysOrgService = sysOrgService;
|
this.sysOrgService = sysOrgService;
|
||||||
|
|
@ -44,6 +46,57 @@ public class SysTenantServiceImpl extends ServiceImpl<SysTenantMapper, SysTenant
|
||||||
this.sysRolePermissionMapper = sysRolePermissionMapper;
|
this.sysRolePermissionMapper = sysRolePermissionMapper;
|
||||||
this.sysTenantUserService = sysTenantUserService;
|
this.sysTenantUserService = sysTenantUserService;
|
||||||
this.passwordEncoder = passwordEncoder;
|
this.passwordEncoder = passwordEncoder;
|
||||||
|
this.deviceMapper = deviceMapper;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
public boolean removeById(java.io.Serializable id) {
|
||||||
|
Long tenantId = (Long) id;
|
||||||
|
|
||||||
|
// 1. 获取该租户下的所有用户 ID
|
||||||
|
List<SysTenantUser> tenantUsers = sysTenantUserService.list(
|
||||||
|
new LambdaQueryWrapper<SysTenantUser>().eq(SysTenantUser::getTenantId, tenantId)
|
||||||
|
);
|
||||||
|
List<Long> userIds = tenantUsers.stream().map(SysTenantUser::getUserId).collect(Collectors.toList());
|
||||||
|
|
||||||
|
// 2. 逻辑删除租户下的角色
|
||||||
|
sysRoleService.lambdaUpdate()
|
||||||
|
.set(SysRole::getIsDeleted, 1)
|
||||||
|
.eq(SysRole::getTenantId, tenantId)
|
||||||
|
.update();
|
||||||
|
|
||||||
|
// 3. 逻辑删除租户下的组织
|
||||||
|
sysOrgService.lambdaUpdate()
|
||||||
|
.set(SysOrg::getIsDeleted, 1)
|
||||||
|
.eq(SysOrg::getTenantId, tenantId)
|
||||||
|
.update();
|
||||||
|
|
||||||
|
// 4. 逻辑删除用户与租户的关联
|
||||||
|
sysTenantUserService.remove(new LambdaQueryWrapper<SysTenantUser>().eq(SysTenantUser::getTenantId, tenantId));
|
||||||
|
|
||||||
|
// 5. 逻辑删除用户与角色的关联 (带租户隔离的)
|
||||||
|
sysUserRoleMapper.delete(new com.baomidou.mybatisplus.core.conditions.query.QueryWrapper<SysUserRole>().eq("tenant_id", tenantId));
|
||||||
|
|
||||||
|
// 6. 清理孤立用户:如果用户不再属于任何租户,则逻辑删除该用户
|
||||||
|
if (userIds != null && !userIds.isEmpty()) {
|
||||||
|
for (Long userId : userIds) {
|
||||||
|
long count = sysTenantUserService.count(
|
||||||
|
new LambdaQueryWrapper<SysTenantUser>().eq(SysTenantUser::getUserId, userId)
|
||||||
|
);
|
||||||
|
if (count == 0) {
|
||||||
|
sysUserService.removeById(userId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 7. 逻辑删除租户下的设备
|
||||||
|
if (deviceMapper != null) {
|
||||||
|
deviceMapper.delete(new com.baomidou.mybatisplus.core.conditions.query.QueryWrapper<com.imeeting.entity.Device>().eq("tenant_id", tenantId));
|
||||||
|
}
|
||||||
|
|
||||||
|
// 8. 最后逻辑删除租户记录本身
|
||||||
|
return super.removeById(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue