From b55f17a0aab19a03f53ae09f3789d16a1c63d7b4 Mon Sep 17 00:00:00 2001 From: chenhao Date: Thu, 26 Feb 2026 17:50:50 +0800 Subject: [PATCH] =?UTF-8?q?feat(tenant):=20=E6=B7=BB=E5=8A=A0=E7=A7=9F?= =?UTF-8?q?=E6=88=B7=E5=88=A0=E9=99=A4=E6=97=B6=E7=9A=84=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=B8=85=E7=90=86=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在SysDictItem和SysDictType实体中添加isDeleted字段用于逻辑删除 - 注入DeviceMapper用于处理设备数据删除 - 实现完整的租户删除逻辑,包括角色、组织、用户关联的逻辑删除 - 添加用户清理机制,删除不再属于任何租户的孤立用户 - 实 --- .../java/com/imeeting/entity/SysDictItem.java | 2 + .../java/com/imeeting/entity/SysDictType.java | 2 + .../service/impl/SysTenantServiceImpl.java | 55 ++++++++++++++++++- 3 files changed, 58 insertions(+), 1 deletion(-) diff --git a/backend/src/main/java/com/imeeting/entity/SysDictItem.java b/backend/src/main/java/com/imeeting/entity/SysDictItem.java index 49191c9..8c42b16 100644 --- a/backend/src/main/java/com/imeeting/entity/SysDictItem.java +++ b/backend/src/main/java/com/imeeting/entity/SysDictItem.java @@ -21,4 +21,6 @@ public class SysDictItem extends BaseEntity { @TableField(exist = false) private Long tenantId; + @TableField(exist = false) + private Integer isDeleted; } diff --git a/backend/src/main/java/com/imeeting/entity/SysDictType.java b/backend/src/main/java/com/imeeting/entity/SysDictType.java index 905ae82..c4a285d 100644 --- a/backend/src/main/java/com/imeeting/entity/SysDictType.java +++ b/backend/src/main/java/com/imeeting/entity/SysDictType.java @@ -19,4 +19,6 @@ public class SysDictType extends BaseEntity { @TableField(exist = false) private Long tenantId; + @TableField(exist = false) + private Integer isDeleted; } diff --git a/backend/src/main/java/com/imeeting/service/impl/SysTenantServiceImpl.java b/backend/src/main/java/com/imeeting/service/impl/SysTenantServiceImpl.java index 8c6bd8d..7293ebe 100644 --- a/backend/src/main/java/com/imeeting/service/impl/SysTenantServiceImpl.java +++ b/backend/src/main/java/com/imeeting/service/impl/SysTenantServiceImpl.java @@ -29,12 +29,14 @@ public class SysTenantServiceImpl extends ServiceImpl tenantUsers = sysTenantUserService.list( + new LambdaQueryWrapper().eq(SysTenantUser::getTenantId, tenantId) + ); + List 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().eq(SysTenantUser::getTenantId, tenantId)); + + // 5. 逻辑删除用户与角色的关联 (带租户隔离的) + sysUserRoleMapper.delete(new com.baomidou.mybatisplus.core.conditions.query.QueryWrapper().eq("tenant_id", tenantId)); + + // 6. 清理孤立用户:如果用户不再属于任何租户,则逻辑删除该用户 + if (userIds != null && !userIds.isEmpty()) { + for (Long userId : userIds) { + long count = sysTenantUserService.count( + new LambdaQueryWrapper().eq(SysTenantUser::getUserId, userId) + ); + if (count == 0) { + sysUserService.removeById(userId); + } + } + } + + // 7. 逻辑删除租户下的设备 + if (deviceMapper != null) { + deviceMapper.delete(new com.baomidou.mybatisplus.core.conditions.query.QueryWrapper().eq("tenant_id", tenantId)); + } + + // 8. 最后逻辑删除租户记录本身 + return super.removeById(id); } @Override