From 8ad99e5f72085d14fd56e8faa7aa36701823c8b5 Mon Sep 17 00:00:00 2001
From: liu <2021943741@qq.com>
Date: 星期四, 05 十一月 2026 20:16:23 +0800
Subject: [PATCH] feat(crm): 统一客户团队数据权限并放开开票金额上限

---
 yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/permission/CrmPermissionServiceImpl.java |   97 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 97 insertions(+), 0 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 18d2cda..11e6a18 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
@@ -9,7 +9,12 @@
 import cn.iocoder.yudao.module.crm.dal.dataobject.business.CrmBusinessDO;
 import cn.iocoder.yudao.module.crm.dal.dataobject.contact.CrmContactDO;
 import cn.iocoder.yudao.module.crm.dal.dataobject.contract.CrmContractDO;
+import cn.iocoder.yudao.module.crm.dal.dataobject.customer.CrmCustomerDO;
 import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO;
+import cn.iocoder.yudao.module.crm.dal.mysql.business.CrmBusinessMapper;
+import cn.iocoder.yudao.module.crm.dal.mysql.contact.CrmContactMapper;
+import cn.iocoder.yudao.module.crm.dal.mysql.contract.CrmContractMapper;
+import cn.iocoder.yudao.module.crm.dal.mysql.customer.CrmCustomerMapper;
 import cn.iocoder.yudao.module.crm.dal.mysql.permission.CrmPermissionMapper;
 import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum;
 import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum;
@@ -46,6 +51,14 @@
 
     @Resource
     private CrmPermissionMapper permissionMapper;
+    @Resource
+    private CrmCustomerMapper customerMapper;
+    @Resource
+    private CrmContactMapper contactMapper;
+    @Resource
+    private CrmBusinessMapper businessMapper;
+    @Resource
+    private CrmContractMapper contractMapper;
     @Resource
     @Lazy // 瑙e喅渚濊禆寰幆
     private CrmContactService contactService;
@@ -177,6 +190,90 @@
 
     @Override
     @Transactional(rollbackFor = Exception.class)
+    public void syncCustomerOwnerPermission(Long customerId, Long ownerUserId) {
+        if (customerId == null || ownerUserId == null) {
+            return;
+        }
+        // 1. 鑱旂郴浜�
+        syncCustomerOwnerPermission(CrmBizTypeEnum.CRM_CONTACT.getType(), ownerUserId,
+                convertSet(contactMapper.selectListByCustomerId(customerId), CrmContactDO::getId));
+        // 2. 鍟嗘満
+        syncCustomerOwnerPermission(CrmBizTypeEnum.CRM_BUSINESS.getType(), ownerUserId,
+                convertSet(businessMapper.selectListByCustomerId(customerId), CrmBusinessDO::getId));
+        // 3. 鍚堝悓
+        syncCustomerOwnerPermission(CrmBizTypeEnum.CRM_CONTRACT.getType(), ownerUserId,
+                convertSet(contractMapper.selectListByCustomerId(customerId), CrmContractDO::getId));
+    }
+
+    /**
+     * 鍚屾鏌愪釜涓氬姟绫诲瀷涓嬶紝瀹㈡埛璐熻矗浜虹殑銆愯鍐欍�戞潈闄�
+     *
+     * @param bizType     鏁版嵁绫诲瀷
+     * @param ownerUserId 瀹㈡埛璐熻矗浜虹紪鍙�
+     * @param bizIds      鏁版嵁缂栧彿闆嗗悎
+     */
+    private void syncCustomerOwnerPermission(Integer bizType, Long ownerUserId, Set<Long> bizIds) {
+        if (CollUtil.isEmpty(bizIds)) {
+            return;
+        }
+        // 1. 鏌ヨ宸叉湁鐨勬潈闄愶紝閬垮厤閲嶅鎻掑叆
+        Map<Long, CrmPermissionDO> permissionMap = new HashMap<>();
+        for (CrmPermissionDO permission : permissionMapper.selectByBizTypeAndBizIds(bizType, bizIds)) {
+            if (ObjUtil.equal(permission.getUserId(), ownerUserId)) {
+                permissionMap.putIfAbsent(permission.getBizId(), permission);
+            }
+        }
+        // 2. 璁$畻闇�瑕佹柊澧炪�佸崌绾х殑鏉冮檺
+        List<CrmPermissionDO> createPermissions = new ArrayList<>();
+        List<CrmPermissionDO> updatePermissions = new ArrayList<>();
+        for (Long bizId : bizIds) {
+            CrmPermissionDO permission = permissionMap.get(bizId);
+            if (permission == null) {
+                createPermissions.add(new CrmPermissionDO().setBizType(bizType).setBizId(bizId)
+                        .setUserId(ownerUserId).setLevel(CrmPermissionLevelEnum.WRITE.getLevel()));
+            } else if (CrmPermissionLevelEnum.isRead(permission.getLevel())) {
+                // 鍙鍗囩骇涓鸿鍐欙紱璐熻矗浜虹骇鍒笉闄嶇骇
+                updatePermissions.add(new CrmPermissionDO().setId(permission.getId())
+                        .setLevel(CrmPermissionLevelEnum.WRITE.getLevel()));
+            }
+        }
+        // 3. 鎵归噺鍐欏叆
+        if (CollUtil.isNotEmpty(createPermissions)) {
+            permissionMapper.insertBatch(createPermissions);
+        }
+        if (CollUtil.isNotEmpty(updatePermissions)) {
+            permissionMapper.updateBatch(updatePermissions);
+        }
+    }
+
+    @Override
+    public void createPermissionForCustomerOwner(Integer bizType, Long bizId, Long customerId, Long ownerUserId) {
+        if (bizId == null || customerId == null) {
+            return;
+        }
+        // 1. 鏌ヨ瀹㈡埛璐熻矗浜�
+        CrmCustomerDO customer = customerMapper.selectById(customerId);
+        if (customer == null || customer.getOwnerUserId() == null) {
+            return;
+        }
+        Long customerOwnerUserId = customer.getOwnerUserId();
+        // 2. 鏁版嵁璐熻矗浜烘湰韬氨鏄鎴疯礋璐d汉鏃讹紝宸茬粡鎷ユ湁鏉冮檺锛屾棤闇�閲嶅鎺堟潈
+        if (ObjUtil.equal(customerOwnerUserId, ownerUserId)) {
+            return;
+        }
+        // 3. 涓嶅瓨鍦ㄥ垯鏂板璇诲啓鏉冮檺锛屽彧璇诲垯鍗囩骇涓鸿鍐�
+        CrmPermissionDO permission = permissionMapper.selectByBizTypeAndBizIdByUserId(bizType, bizId, customerOwnerUserId);
+        if (permission == null) {
+            permissionMapper.insert(new CrmPermissionDO().setBizType(bizType).setBizId(bizId)
+                    .setUserId(customerOwnerUserId).setLevel(CrmPermissionLevelEnum.WRITE.getLevel()));
+        } else if (CrmPermissionLevelEnum.isRead(permission.getLevel())) {
+            permissionMapper.updateById(new CrmPermissionDO().setId(permission.getId())
+                    .setLevel(CrmPermissionLevelEnum.WRITE.getLevel()));
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
     public void updatePermission(CrmPermissionUpdateReqVO updateReqVO) {
         // 1. 鏍¢獙瀛樺湪
         validatePermissionExists(updateReqVO.getIds());

--
Gitblit v1.9.3