feat(tenant): 添加租户删除时的数据清理逻辑

- 在SysDictItem和SysDictType实体中添加isDeleted字段用于逻辑删除
- 注入DeviceMapper用于处理设备数据删除
- 实现完整的租户删除逻辑,包括角色、组织、用户关联的逻辑删除
- 添加用户清理机制,删除不再属于任何租户的孤立用户
- 实
master
chenhao 2026-02-26 17:50:50 +08:00
parent bf7439b200
commit b55f17a0aa
3 changed files with 58 additions and 1 deletions

View File

@ -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;
} }

View File

@ -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;
} }

View File

@ -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