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)
private Long tenantId;
@TableField(exist = false)
private Integer isDeleted;
}

View File

@ -19,4 +19,6 @@ public class SysDictType extends BaseEntity {
@TableField(exist = false)
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 SysTenantUserService sysTenantUserService;
private final PasswordEncoder passwordEncoder;
private final com.imeeting.mapper.DeviceMapper deviceMapper;
public SysTenantServiceImpl(SysUserService sysUserService, SysRoleService sysRoleService,
SysOrgService sysOrgService, SysPermissionService sysPermissionService,
SysParamService sysParamService, SysUserRoleMapper sysUserRoleMapper,
SysRolePermissionMapper sysRolePermissionMapper,
SysTenantUserService sysTenantUserService, PasswordEncoder passwordEncoder) {
SysTenantUserService sysTenantUserService, PasswordEncoder passwordEncoder,
com.imeeting.mapper.DeviceMapper deviceMapper) {
this.sysUserService = sysUserService;
this.sysRoleService = sysRoleService;
this.sysOrgService = sysOrgService;
@ -44,6 +46,57 @@ public class SysTenantServiceImpl extends ServiceImpl<SysTenantMapper, SysTenant
this.sysRolePermissionMapper = sysRolePermissionMapper;
this.sysTenantUserService = sysTenantUserService;
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