feat(tenant): 添加租户删除时的数据清理逻辑
- 在SysDictItem和SysDictType实体中添加isDeleted字段用于逻辑删除 - 注入DeviceMapper用于处理设备数据删除 - 实现完整的租户删除逻辑,包括角色、组织、用户关联的逻辑删除 - 添加用户清理机制,删除不再属于任何租户的孤立用户 - 实master
parent
bf7439b200
commit
b55f17a0aa
|
|
@ -21,4 +21,6 @@ public class SysDictItem extends BaseEntity {
|
|||
|
||||
@TableField(exist = false)
|
||||
private Long tenantId;
|
||||
@TableField(exist = false)
|
||||
private Integer isDeleted;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -19,4 +19,6 @@ public class SysDictType extends BaseEntity {
|
|||
|
||||
@TableField(exist = false)
|
||||
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 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
|
||||
|
|
|
|||
Loading…
Reference in New Issue