From 5bbf6b97525dd92c81fe91447953e7819f8a4e18 Mon Sep 17 00:00:00 2001
From: huminmin <mac@MacBook-Pro.local>
Date: 星期一, 17 八月 2026 16:49:46 +0800
Subject: [PATCH] 上级账户可以将下属账户添加的团队成员退出团队

---
 yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionServiceImpl.java |   31 ++++++++++++++++++++++++-------
 1 files changed, 24 insertions(+), 7 deletions(-)

diff --git a/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionServiceImpl.java b/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionServiceImpl.java
index 6e2c37c..18d2cda 100644
--- a/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionServiceImpl.java
+++ b/yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionServiceImpl.java
@@ -272,16 +272,22 @@
         if (CollUtil.isEmpty(permissions)) {
             throw exception(CRM_PERMISSION_NOT_EXISTS);
         }
-        // 鏍¢獙锛氭暟鎹潈闄愮殑妯″潡鏁版嵁缂栧彿鏄竴鑷寸殑涓嶅彲鑳藉瓨鍦ㄤ袱涓�
-        if (convertSet(permissions, CrmPermissionDO::getBizId).size() > 1) {
+        // 鏍¢獙锛氭暟鎹潈闄愬繀椤诲睘浜庡悓涓�涓笟鍔$被鍨嬨�佸悓涓�鏉′笟鍔℃暟鎹�
+        if (convertSet(permissions, CrmPermissionDO::getBizType).size() > 1
+                || convertSet(permissions, CrmPermissionDO::getBizId).size() > 1) {
             throw exception(CRM_PERMISSION_DELETE_FAIL);
         }
-        // 鏍¢獙鎿嶄綔浜烘槸鍚︿负璐熻矗浜�
-        CrmPermissionDO permission = permissionMapper.selectByBizAndUserId(permissions.get(0).getBizType(), permissions.get(0).getBizId(), userId);
-        if (permission == null) {
-            throw exception(CRM_PERMISSION_DELETE_DENIED);
+        // 璐熻矗浜哄彧鑳介�氳繃杞Щ鎿嶄綔鍙樻洿锛屼笉鑳界洿鎺ョЩ鍑哄洟闃�
+        if (anyMatch(permissions, permission -> CrmPermissionLevelEnum.isOwner(permission.getLevel()))) {
+            throw exception(CRM_PERMISSION_DELETE_SELF_PERMISSION_FAIL_EXIST_OWNER);
         }
-        if (!CrmPermissionLevelEnum.isOwner(permission.getLevel())) {
+
+        Integer bizType = permissions.get(0).getBizType();
+        Long bizId = permissions.get(0).getBizId();
+        CrmPermissionDO operatorPermission = permissionMapper.selectByBizAndUserId(bizType, bizId, userId);
+        boolean isOwner = operatorPermission != null
+                && CrmPermissionLevelEnum.isOwner(operatorPermission.getLevel());
+        if (!isOwner && !isSubordinateOwner(bizType, bizId, userId)) {
             throw exception(CRM_PERMISSION_DELETE_DENIED);
         }
 
@@ -289,6 +295,17 @@
         permissionMapper.deleteByIds(ids);
     }
 
+    /** 褰撳墠鐢ㄦ埛鐨勪笅灞炴槸鍚︿负璇ヤ笟鍔℃暟鎹殑璐熻矗浜� */
+    private boolean isSubordinateOwner(Integer bizType, Long bizId, Long userId) {
+        Set<Long> subordinateUserIds = convertSet(adminUserApi.getUserListBySubordinate(userId), AdminUserRespDTO::getId);
+        if (CollUtil.isEmpty(subordinateUserIds)) {
+            return false;
+        }
+        return anyMatch(permissionMapper.selectByBizTypeAndBizId(bizType, bizId),
+                permission -> subordinateUserIds.contains(permission.getUserId())
+                        && CrmPermissionLevelEnum.isOwner(permission.getLevel()));
+    }
+
     @Override
     public void deleteSelfPermission(Long id, Long userId) {
         // 鏍¢獙鏁版嵁瀛樺湪涓旀槸鑷繁

--
Gitblit v1.9.3