feat(crm): 统一客户团队数据权限并放开开票金额上限
- 联系人/商机/合同/报价/回款/回款计划/开票统一继承客户团队权限
- super_admin 视为 CRM 管理员,可查看全部数据
- 合同/报价列表移除额外的客户权限过滤
- 取消开票金额不得超过合同金额的限制
- 新增 CRM 权限修复与诊断 SQL
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ============================================================ |
| | | -- CRM æéè¯æèæ¬ï¼æ¥æä¸ªè´¦å·çæéå°åºæ¥èªåªé |
| | | -- |
| | | -- ä½¿ç¨æ¹æ³ï¼ |
| | | -- 1. æ @uid æ¹æè¦æ¥è¯¢çç¨æ·ç¼å· |
| | | -- 2. æ´æ®µæ§è¡ï¼æç»æé段ç |
| | | -- 3. æ³æ¥ææ¡åå为ä»ä¹è½/ä¸è½çï¼æ¹ @cid åæ§è¡æå䏿®µ |
| | | -- ============================================================ |
| | | |
| | | SET @uid = 235; |
| | | |
| | | -- ------------------------------------------------------------ |
| | | -- 1. è´¦å·è§è²ï¼å³å®æ¯ä¸æ¯ç®¡çåï¼ç®¡çåä¸åæ°æ®æééå¶ï¼ |
| | | -- ------------------------------------------------------------ |
| | | SELECT '1.è´¦å·è§è²' AS section, u.id, u.username, u.nickname, |
| | | r.code AS role_code, r.name AS role_name |
| | | FROM system_users u |
| | | LEFT JOIN system_user_role ur ON ur.user_id = u.id AND ur.deleted = 0 |
| | | LEFT JOIN system_role r ON r.id = ur.role_id AND r.deleted = 0 |
| | | WHERE u.id = @uid AND u.deleted = 0; |
| | | |
| | | -- 说æï¼role_code éæ super_admin æ crm_admin â å
¨é¨æ°æ®å¯è§ |
| | | |
| | | -- ------------------------------------------------------------ |
| | | -- 2. ä»ä½ä¸ºã客æ·è´è´£äººãçå®¢æ· |
| | | -- ------------------------------------------------------------ |
| | | SELECT '2.客æ·è´è´£äºº' AS section, c.id AS customer_id, c.name AS customer_name, |
| | | c.owner_user_id |
| | | FROM crm_customer c |
| | | WHERE c.deleted = 0 AND c.owner_user_id = @uid; |
| | | |
| | | -- ------------------------------------------------------------ |
| | | -- 3. ä»å¨ã客æ·å¢éãéçè®°å½ï¼è系人/åæº/åå é è¿ä¸ªç»§æ¿ï¼ |
| | | -- ------------------------------------------------------------ |
| | | SELECT '3.客æ·å¢é' AS section, c.id AS customer_id, c.name AS customer_name, |
| | | p.level, ELT(p.level, 'è´è´£äºº', 'åªè¯»', '读å') AS level_name |
| | | FROM crm_permission p |
| | | JOIN crm_customer c ON c.id = p.biz_id AND c.deleted = 0 |
| | | WHERE p.biz_type = 2 AND p.user_id = @uid AND p.deleted = 0 |
| | | ORDER BY c.id; |
| | | |
| | | -- ------------------------------------------------------------ |
| | | -- 4. ä»å¨åä¸å¡æ¨¡åãèªå·±çå¢éãéç身份ï¼é客æ·ï¼ |
| | | -- 注æï¼çº¿ç´¢/æ¥ä»·/忬¾/忬¾è®¡å/å¼ç¥¨ ä»ç¶åªè®¤è¿é |
| | | -- ------------------------------------------------------------ |
| | | SELECT '4.ä¸å¡å¢é' AS section, |
| | | CASE p.biz_type |
| | | WHEN 1 THEN '线索' |
| | | WHEN 3 THEN 'è系人' |
| | | WHEN 4 THEN 'åæº' |
| | | WHEN 5 THEN 'åå' |
| | | WHEN 7 THEN '忬¾' |
| | | WHEN 8 THEN '忬¾è®¡å' |
| | | WHEN 9 THEN 'é宿¥ä»·' |
| | | WHEN 10 THEN 'å¼ç¥¨' |
| | | ELSE CONCAT('ç±»å', p.biz_type) END AS module, |
| | | p.biz_id, p.level, ELT(p.level, 'è´è´£äºº', 'åªè¯»', '读å') AS level_name |
| | | FROM crm_permission p |
| | | WHERE p.user_id = @uid |
| | | AND p.deleted = 0 |
| | | AND p.biz_type <> 2 |
| | | ORDER BY p.biz_type, p.biz_id; |
| | | |
| | | -- ------------------------------------------------------------ |
| | | -- 5. ä»ä½ä¸ºå模åãè´è´£äººãçæ°æ® |
| | | -- ------------------------------------------------------------ |
| | | SELECT '5.1客æ·è´è´£äºº' AS section, c.id, c.name AS data_name FROM crm_customer c |
| | | WHERE c.deleted = 0 AND c.owner_user_id = @uid; |
| | | |
| | | SELECT '5.2è系人è´è´£äºº' AS section, ct.id, ct.name AS data_name FROM crm_contact ct |
| | | WHERE ct.deleted = 0 AND ct.owner_user_id = @uid; |
| | | |
| | | SELECT '5.3åæºè´è´£äºº' AS section, b.id, b.name AS data_name FROM crm_business b |
| | | WHERE b.deleted = 0 AND b.owner_user_id = @uid; |
| | | |
| | | SELECT '5.4ååè´è´£äºº' AS section, c.id, c.name AS data_name FROM crm_contract c |
| | | WHERE c.deleted = 0 AND c.owner_user_id = @uid; |
| | | |
| | | SELECT '5.5æ¥ä»·è´è´£äºº' AS section, q.id, CONCAT(q.no, ' ', q.name) AS data_name FROM crm_sale_quotation q |
| | | WHERE q.deleted = 0 AND q.owner_user_id = @uid; |
| | | |
| | | SELECT '5.6忬¾è´è´£äºº' AS section, r.id, r.no AS data_name FROM crm_receivable r |
| | | WHERE r.deleted = 0 AND r.owner_user_id = @uid; |
| | | |
| | | SELECT '5.7å¼ç¥¨è´è´£äºº' AS section, i.id, i.no AS data_name FROM crm_invoice i |
| | | WHERE i.deleted = 0 AND i.owner_user_id = @uid; |
| | | |
| | | -- ------------------------------------------------------------ |
| | | -- 6. åæ¡æ°æ®æº¯æºï¼ä¸ºä»ä¹è¿ä¸ªè´¦å·è½/ä¸è½çè¿æ¡åå |
| | | -- æ @cid æ¹æååç¼å·åæ§è¡ |
| | | -- ------------------------------------------------------------ |
| | | SET @cid = 3; |
| | | |
| | | SELECT '6.ååæé溯æº' AS section, |
| | | ct.id AS contract_id, |
| | | ct.name AS contract_name, |
| | | ct.customer_id, |
| | | ct.owner_user_id AS contract_owner, |
| | | cu.owner_user_id AS customer_owner, |
| | | EXISTS(SELECT 1 FROM crm_permission p |
| | | WHERE p.biz_type = 5 AND p.biz_id = ct.id |
| | | AND p.user_id = @uid AND p.deleted = 0) AS in_contract_team, |
| | | EXISTS(SELECT 1 FROM crm_permission p |
| | | WHERE p.biz_type = 2 AND p.biz_id = ct.customer_id |
| | | AND p.user_id = @uid AND p.deleted = 0) AS in_customer_team, |
| | | (cu.owner_user_id = @uid) AS is_customer_owner, |
| | | (ct.owner_user_id = @uid) AS is_contract_owner |
| | | FROM crm_contract ct |
| | | LEFT JOIN crm_customer cu ON cu.id = ct.customer_id AND cu.deleted = 0 |
| | | WHERE ct.id = @cid AND ct.deleted = 0; |
| | | |
| | | -- 夿è§åï¼ |
| | | -- role_code = super_admin / crm_admin â è½ç |
| | | -- is_contract_owner = 1 â è½ç |
| | | -- in_contract_team = 1 â è½ç |
| | | -- is_customer_owner = 1 â è½çï¼ååç»§æ¿å®¢æ·è´è´£äººï¼ |
| | | -- in_customer_team = 1 â è½çï¼ååç»§æ¿å®¢æ·å¢éï¼ |
| | | -- 以ä¸é½ä¸æ»¡è¶³ â çä¸å° |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ============================================================ |
| | | -- CRM æ°æ®æéä¿®å¤èæ¬ï¼ç»ä¸ä»¥ã客æ·å¢éã为åï¼ |
| | | -- |
| | | -- èæ¯ï¼å®æµåç°ï¼ï¼ |
| | | -- 1. crm_customer.owner_user_id ä¸ crm_permission çè´è´£äººè¡ä¸ä¸è´ï¼6 个客æ·ï¼ |
| | | -- 2. é¨ååå/åæº/è系人没æèªèº«çæéè®°å½ï¼å岿°æ®ç´æ¥å
¥åºï¼ |
| | | -- |
| | | -- 说æï¼ |
| | | -- - 代ç å·²å
¼å®¹ä¸è¿°å¼å¸¸ï¼æ¬èæ¬ä¸æ¯å¿
é¡»æ§è¡ï¼ä½æ§è¡åæ°æ®æ´è§è |
| | | -- - èæ¬å¹çï¼å¯é夿§è¡ |
| | | -- - æ§è¡å请å¤ä»½ crm_permissionãcrm_customer |
| | | -- - 䏿¶åè¡¨ç»æåæ´ï¼æ éåæº |
| | | -- |
| | | -- æä¸¾å¼ï¼ |
| | | -- biz_typeï¼2=å®¢æ· 3=è系人 4=åæº 5=åå |
| | | -- level ï¼1=è´è´£äºº 2=åªè¯» 3=读å |
| | | -- ============================================================ |
| | | |
| | | -- ============================================================ |
| | | -- ä¸ã客æ·è´è´£äººæéè¡å¯¹é½ crm_customer.owner_user_id |
| | | -- ============================================================ |
| | | |
| | | -- 1.1 ç®æ è´è´£äººè¿æ²¡ææéè¡ï¼ææ§è´è´£äººè¡æ¹å°ç®æ è´è´£äºº |
| | | DROP TEMPORARY TABLE IF EXISTS tmp_perm_customer; |
| | | CREATE TEMPORARY TABLE tmp_perm_customer AS |
| | | SELECT biz_id, user_id |
| | | FROM crm_permission |
| | | WHERE biz_type = 2 AND deleted = 0; |
| | | ALTER TABLE tmp_perm_customer ADD INDEX idx_bu (biz_id, user_id); |
| | | |
| | | UPDATE crm_permission p |
| | | JOIN crm_customer c ON c.id = p.biz_id |
| | | LEFT JOIN tmp_perm_customer t ON t.biz_id = c.id AND t.user_id = c.owner_user_id |
| | | SET p.user_id = c.owner_user_id, |
| | | p.update_time = NOW() |
| | | WHERE p.biz_type = 2 |
| | | AND p.deleted = 0 |
| | | AND c.deleted = 0 |
| | | AND p.level = 1 |
| | | AND p.user_id <> c.owner_user_id |
| | | AND t.user_id IS NULL; |
| | | |
| | | -- 1.2 ç®æ è´è´£äººå·²ææéè¡ï¼å级为è´è´£äºº |
| | | UPDATE crm_permission p |
| | | JOIN crm_customer c ON c.id = p.biz_id |
| | | SET p.level = 1, |
| | | p.update_time = NOW() |
| | | WHERE p.biz_type = 2 |
| | | AND p.deleted = 0 |
| | | AND c.deleted = 0 |
| | | AND p.user_id = c.owner_user_id |
| | | AND p.level <> 1; |
| | | |
| | | -- 1.3 å é¤éå¤çæ§è´è´£äººè¡ï¼ç®æ è´è´£äººè¡å·²å卿¶ï¼ |
| | | DROP TEMPORARY TABLE IF EXISTS tmp_perm_customer; |
| | | CREATE TEMPORARY TABLE tmp_perm_customer AS |
| | | SELECT id, biz_id, user_id, level |
| | | FROM crm_permission |
| | | WHERE biz_type = 2 AND deleted = 0; |
| | | ALTER TABLE tmp_perm_customer ADD INDEX idx_bu (biz_id, user_id); |
| | | |
| | | DELETE p |
| | | FROM crm_permission p |
| | | JOIN crm_customer c ON c.id = p.biz_id |
| | | JOIN tmp_perm_customer t |
| | | ON t.biz_id = c.id AND t.user_id = c.owner_user_id AND t.level = 1 |
| | | WHERE p.biz_type = 2 |
| | | AND p.deleted = 0 |
| | | AND c.deleted = 0 |
| | | AND p.level = 1 |
| | | AND p.user_id <> c.owner_user_id; |
| | | |
| | | DROP TEMPORARY TABLE IF EXISTS tmp_perm_customer; |
| | | |
| | | -- ============================================================ |
| | | -- äºãè¡¥é½åæ°æ®èªèº«çè´è´£äººæéè¡ |
| | | -- ============================================================ |
| | | |
| | | -- 2.1 ååï¼biz_type = 5ï¼ |
| | | INSERT INTO crm_permission (biz_type, biz_id, user_id, level, creator, create_time, updater, update_time, deleted) |
| | | SELECT 5, ct.id, ct.owner_user_id, 1, '1', NOW(), '1', NOW(), 0 |
| | | FROM crm_contract ct |
| | | WHERE ct.deleted = 0 |
| | | AND ct.owner_user_id IS NOT NULL |
| | | AND NOT EXISTS (SELECT 1 |
| | | FROM crm_permission p |
| | | WHERE p.biz_type = 5 |
| | | AND p.biz_id = ct.id |
| | | AND p.user_id = ct.owner_user_id |
| | | AND p.deleted = 0); |
| | | |
| | | UPDATE crm_permission p |
| | | JOIN crm_contract ct ON ct.id = p.biz_id AND ct.deleted = 0 |
| | | SET p.level = 1, |
| | | p.update_time = NOW() |
| | | WHERE p.biz_type = 5 |
| | | AND p.deleted = 0 |
| | | AND p.user_id = ct.owner_user_id |
| | | AND p.level <> 1; |
| | | |
| | | -- 2.2 åæºï¼biz_type = 4ï¼ |
| | | INSERT INTO crm_permission (biz_type, biz_id, user_id, level, creator, create_time, updater, update_time, deleted) |
| | | SELECT 4, b.id, b.owner_user_id, 1, '1', NOW(), '1', NOW(), 0 |
| | | FROM crm_business b |
| | | WHERE b.deleted = 0 |
| | | AND b.owner_user_id IS NOT NULL |
| | | AND NOT EXISTS (SELECT 1 |
| | | FROM crm_permission p |
| | | WHERE p.biz_type = 4 |
| | | AND p.biz_id = b.id |
| | | AND p.user_id = b.owner_user_id |
| | | AND p.deleted = 0); |
| | | |
| | | UPDATE crm_permission p |
| | | JOIN crm_business b ON b.id = p.biz_id AND b.deleted = 0 |
| | | SET p.level = 1, |
| | | p.update_time = NOW() |
| | | WHERE p.biz_type = 4 |
| | | AND p.deleted = 0 |
| | | AND p.user_id = b.owner_user_id |
| | | AND p.level <> 1; |
| | | |
| | | -- 2.3 è系人ï¼biz_type = 3ï¼ |
| | | INSERT INTO crm_permission (biz_type, biz_id, user_id, level, creator, create_time, updater, update_time, deleted) |
| | | SELECT 3, ct.id, ct.owner_user_id, 1, '1', NOW(), '1', NOW(), 0 |
| | | FROM crm_contact ct |
| | | WHERE ct.deleted = 0 |
| | | AND ct.owner_user_id IS NOT NULL |
| | | AND NOT EXISTS (SELECT 1 |
| | | FROM crm_permission p |
| | | WHERE p.biz_type = 3 |
| | | AND p.biz_id = ct.id |
| | | AND p.user_id = ct.owner_user_id |
| | | AND p.deleted = 0); |
| | | |
| | | UPDATE crm_permission p |
| | | JOIN crm_contact ct ON ct.id = p.biz_id AND ct.deleted = 0 |
| | | SET p.level = 1, |
| | | p.update_time = NOW() |
| | | WHERE p.biz_type = 3 |
| | | AND p.deleted = 0 |
| | | AND p.user_id = ct.owner_user_id |
| | | AND p.level <> 1; |
| | | |
| | | -- 2.4 é宿¥ä»·ï¼biz_type = 9ï¼ |
| | | INSERT INTO crm_permission (biz_type, biz_id, user_id, level, creator, create_time, updater, update_time, deleted) |
| | | SELECT 9, q.id, q.owner_user_id, 1, '1', NOW(), '1', NOW(), 0 |
| | | FROM crm_sale_quotation q |
| | | WHERE q.deleted = 0 |
| | | AND q.owner_user_id IS NOT NULL |
| | | AND NOT EXISTS (SELECT 1 |
| | | FROM crm_permission p |
| | | WHERE p.biz_type = 9 |
| | | AND p.biz_id = q.id |
| | | AND p.user_id = q.owner_user_id |
| | | AND p.deleted = 0); |
| | | |
| | | UPDATE crm_permission p |
| | | JOIN crm_sale_quotation q ON q.id = p.biz_id AND q.deleted = 0 |
| | | SET p.level = 1, |
| | | p.update_time = NOW() |
| | | WHERE p.biz_type = 9 |
| | | AND p.deleted = 0 |
| | | AND p.user_id = q.owner_user_id |
| | | AND p.level <> 1; |
| | | |
| | | -- 2.5 忬¾ï¼biz_type = 7ï¼ |
| | | INSERT INTO crm_permission (biz_type, biz_id, user_id, level, creator, create_time, updater, update_time, deleted) |
| | | SELECT 7, r.id, r.owner_user_id, 1, '1', NOW(), '1', NOW(), 0 |
| | | FROM crm_receivable r |
| | | WHERE r.deleted = 0 |
| | | AND r.owner_user_id IS NOT NULL |
| | | AND NOT EXISTS (SELECT 1 |
| | | FROM crm_permission p |
| | | WHERE p.biz_type = 7 |
| | | AND p.biz_id = r.id |
| | | AND p.user_id = r.owner_user_id |
| | | AND p.deleted = 0); |
| | | |
| | | UPDATE crm_permission p |
| | | JOIN crm_receivable r ON r.id = p.biz_id AND r.deleted = 0 |
| | | SET p.level = 1, |
| | | p.update_time = NOW() |
| | | WHERE p.biz_type = 7 |
| | | AND p.deleted = 0 |
| | | AND p.user_id = r.owner_user_id |
| | | AND p.level <> 1; |
| | | |
| | | -- 2.6 忬¾è®¡åï¼biz_type = 8ï¼ |
| | | INSERT INTO crm_permission (biz_type, biz_id, user_id, level, creator, create_time, updater, update_time, deleted) |
| | | SELECT 8, rp.id, rp.owner_user_id, 1, '1', NOW(), '1', NOW(), 0 |
| | | FROM crm_receivable_plan rp |
| | | WHERE rp.deleted = 0 |
| | | AND rp.owner_user_id IS NOT NULL |
| | | AND NOT EXISTS (SELECT 1 |
| | | FROM crm_permission p |
| | | WHERE p.biz_type = 8 |
| | | AND p.biz_id = rp.id |
| | | AND p.user_id = rp.owner_user_id |
| | | AND p.deleted = 0); |
| | | |
| | | UPDATE crm_permission p |
| | | JOIN crm_receivable_plan rp ON rp.id = p.biz_id AND rp.deleted = 0 |
| | | SET p.level = 1, |
| | | p.update_time = NOW() |
| | | WHERE p.biz_type = 8 |
| | | AND p.deleted = 0 |
| | | AND p.user_id = rp.owner_user_id |
| | | AND p.level <> 1; |
| | | |
| | | -- 2.7 å¼ç¥¨ï¼biz_type = 10ï¼ |
| | | INSERT INTO crm_permission (biz_type, biz_id, user_id, level, creator, create_time, updater, update_time, deleted) |
| | | SELECT 10, i.id, i.owner_user_id, 1, '1', NOW(), '1', NOW(), 0 |
| | | FROM crm_invoice i |
| | | WHERE i.deleted = 0 |
| | | AND i.owner_user_id IS NOT NULL |
| | | AND NOT EXISTS (SELECT 1 |
| | | FROM crm_permission p |
| | | WHERE p.biz_type = 10 |
| | | AND p.biz_id = i.id |
| | | AND p.user_id = i.owner_user_id |
| | | AND p.deleted = 0); |
| | | |
| | | UPDATE crm_permission p |
| | | JOIN crm_invoice i ON i.id = p.biz_id AND i.deleted = 0 |
| | | SET p.level = 1, |
| | | p.update_time = NOW() |
| | | WHERE p.biz_type = 10 |
| | | AND p.deleted = 0 |
| | | AND p.user_id = i.owner_user_id |
| | | AND p.level <> 1; |
| | | |
| | | -- ============================================================ |
| | | -- ä¸ãæ ¡éªï¼å¯éï¼æ§è¡åè·ä¸ä¸çç»æï¼ |
| | | -- ============================================================ |
| | | |
| | | -- 3.1 客æ·è´è´£äººæ¯å¦å·²ä¸è´ï¼åºä¸º 0 è¡ï¼ |
| | | -- SELECT c.id, c.name, c.owner_user_id, p.user_id AS perm_owner |
| | | -- FROM crm_customer c |
| | | -- LEFT JOIN crm_permission p |
| | | -- ON p.biz_type = 2 AND p.biz_id = c.id AND p.level = 1 AND p.deleted = 0 |
| | | -- WHERE c.deleted = 0 AND (p.user_id IS NULL OR p.user_id <> c.owner_user_id); |
| | | |
| | | -- 3.2 åæ°æ®æ¯å¦é½æè´è´£äººæéè¡ï¼åºä¸º 0ï¼ |
| | | -- SELECT 'åå' AS biz, COUNT(*) AS missing FROM crm_contract ct |
| | | -- WHERE ct.deleted = 0 AND NOT EXISTS ( |
| | | -- SELECT 1 FROM crm_permission p WHERE p.biz_type = 5 AND p.biz_id = ct.id AND p.level = 1 AND p.deleted = 0) |
| | | -- UNION ALL |
| | | -- SELECT 'åæº', COUNT(*) FROM crm_business b |
| | | -- WHERE b.deleted = 0 AND NOT EXISTS ( |
| | | -- SELECT 1 FROM crm_permission p WHERE p.biz_type = 4 AND p.biz_id = b.id AND p.level = 1 AND p.deleted = 0) |
| | | -- UNION ALL |
| | | -- SELECT 'è系人', COUNT(*) FROM crm_contact ct |
| | | -- WHERE ct.deleted = 0 AND NOT EXISTS ( |
| | | -- SELECT 1 FROM crm_permission p WHERE p.biz_type = 3 AND p.biz_id = ct.id AND p.level = 1 AND p.deleted = 0) |
| | | -- UNION ALL |
| | | -- SELECT 'é宿¥ä»·', COUNT(*) FROM crm_sale_quotation q |
| | | -- WHERE q.deleted = 0 AND NOT EXISTS ( |
| | | -- SELECT 1 FROM crm_permission p WHERE p.biz_type = 9 AND p.biz_id = q.id AND p.level = 1 AND p.deleted = 0) |
| | | -- UNION ALL |
| | | -- SELECT '忬¾', COUNT(*) FROM crm_receivable r |
| | | -- WHERE r.deleted = 0 AND NOT EXISTS ( |
| | | -- SELECT 1 FROM crm_permission p WHERE p.biz_type = 7 AND p.biz_id = r.id AND p.level = 1 AND p.deleted = 0) |
| | | -- UNION ALL |
| | | -- SELECT '忬¾è®¡å', COUNT(*) FROM crm_receivable_plan rp |
| | | -- WHERE rp.deleted = 0 AND NOT EXISTS ( |
| | | -- SELECT 1 FROM crm_permission p WHERE p.biz_type = 8 AND p.biz_id = rp.id AND p.level = 1 AND p.deleted = 0) |
| | | -- UNION ALL |
| | | -- SELECT 'å¼ç¥¨', COUNT(*) FROM crm_invoice i |
| | | -- WHERE i.deleted = 0 AND NOT EXISTS ( |
| | | -- SELECT 1 FROM crm_permission p WHERE p.biz_type = 10 AND p.biz_id = i.id AND p.level = 1 AND p.deleted = 0); |
| | |
| | | import cn.iocoder.yudao.framework.common.util.spring.SpringExpressionUtils; |
| | | import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils; |
| | | 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.invoice.CrmInvoiceDO; |
| | | import cn.iocoder.yudao.module.crm.dal.dataobject.permission.CrmPermissionDO; |
| | | import cn.iocoder.yudao.module.crm.dal.dataobject.quotation.CrmSaleQuotationDO; |
| | | import cn.iocoder.yudao.module.crm.dal.dataobject.receivable.CrmReceivableDO; |
| | | import cn.iocoder.yudao.module.crm.dal.dataobject.receivable.CrmReceivablePlanDO; |
| | | 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.invoice.CrmInvoiceMapper; |
| | | import cn.iocoder.yudao.module.crm.dal.mysql.quotation.CrmSaleQuotationMapper; |
| | | import cn.iocoder.yudao.module.crm.dal.mysql.receivable.CrmReceivableMapper; |
| | | import cn.iocoder.yudao.module.crm.dal.mysql.receivable.CrmReceivablePlanMapper; |
| | | import cn.iocoder.yudao.module.crm.enums.common.CrmBizTypeEnum; |
| | | import cn.iocoder.yudao.module.crm.enums.permission.CrmPermissionLevelEnum; |
| | | import cn.iocoder.yudao.module.crm.framework.permission.core.annotations.CrmPermission; |
| | |
| | | |
| | | @Resource |
| | | private CrmBusinessMapper businessMapper; |
| | | @Resource |
| | | private CrmContractMapper contractMapper; |
| | | @Resource |
| | | private CrmContactMapper contactMapper; |
| | | @Resource |
| | | private CrmCustomerMapper customerMapper; |
| | | @Resource |
| | | private CrmSaleQuotationMapper quotationMapper; |
| | | @Resource |
| | | private CrmReceivableMapper receivableMapper; |
| | | @Resource |
| | | private CrmReceivablePlanMapper receivablePlanMapper; |
| | | @Resource |
| | | private CrmInvoiceMapper invoiceMapper; |
| | | |
| | | @Before("@annotation(crmPermission)") |
| | | public void doBefore(JoinPoint joinPoint, CrmPermission crmPermission) { |
| | |
| | | if (CrmPermissionUtils.isCrmAdmin()) { |
| | | return; |
| | | } |
| | | // ç¹æ®ï¼æ²¡ææ°æ®æéçæ
åµï¼é对 READ çç¹æ®å¤ç |
| | | // 2. æ°æ®æ¬èº«çè´è´£äººï¼ç´æ¥éè¿ï¼å
¼å®¹æéè®°å½ç¼ºå¤±çå岿°æ®ï¼ |
| | | Long userId = getUserId(); |
| | | if (isRecordOwner(bizType, bizId, userId)) { |
| | | return; |
| | | } |
| | | // 3. è系人/åæº/åå/æ¥ä»·/忬¾/忬¾è®¡å/å¼ç¥¨ï¼ç»§æ¿æå±å®¢æ·çæé |
| | | // æ¾å¨ãæ æ°æ®æéã夿ä¹åï¼é¿å
æéè®°å½ç¼ºå¤±çå岿°æ®å¯¼è´è´è´£äººæ æ³åæä½ |
| | | if (validateCustomerPermission(bizType, bizId, userId, permissionLevel)) { |
| | | return; |
| | | } |
| | | |
| | | // 3. ç¹æ®ï¼æ²¡ææ°æ®æéçæ
åµï¼é对 READ çç¹æ®å¤ç |
| | | if (CollUtil.isEmpty(bizPermissions)) { |
| | | // 1.1 å
¬æµ·æ°æ®ï¼å¦ææ²¡æå¢éæåï¼å¤§å®¶ä¹åºè¯¥æ READ æéæå¯¹ |
| | | if (CrmPermissionLevelEnum.isRead(permissionLevel)) { |
| | | // 3.1 çæ£çå
¬æµ·æ°æ®ï¼ç¶å®¢æ·ä¹æ²¡æå¢éï¼ï¼å¤§å®¶æ READ æéï¼ |
| | | // 妿ç¶å®¢æ·æå¢éï¼åèµ°ä¸é¢ç»§æ¿é»è¾ï¼è¿éä¸è½æ¾è¡ï¼é¿å
è¶æè¯»å |
| | | if (CrmPermissionLevelEnum.isRead(permissionLevel) && !hasParentCustomerTeam(bizType, bizId)) { |
| | | return; |
| | | } |
| | | // æ²¡ææ°æ®æéçæ
åµä¸è¶
åºäºè¯»æéç´æ¥æ¥éï¼é¿å
å颿 ¡éªç©ºæé |
| | | throw exception(CRM_PERMISSION_DENIED, CrmBizTypeEnum.getNameByType(bizType)); |
| | | } else { // 1.2 ææ°æ®æé使¯æ²¡æè´è´£äººçæ
åµ |
| | | } else { // 3.2 ææ°æ®æé使¯æ²¡æè´è´£äººçæ
åµ |
| | | if (!anyMatch(bizPermissions, item -> CrmPermissionLevelEnum.isOwner(item.getLevel())) |
| | | && CrmPermissionLevelEnum.isRead(permissionLevel)) { |
| | | return; |
| | | } |
| | | } |
| | | |
| | | // 2. åªèèèªèº«çæé |
| | | Long userId = getUserId(); |
| | | // 4. åªèèèªèº«çæé |
| | | CrmPermissionDO userPermission = CollUtil.findOne(bizPermissions, permission -> ObjUtil.equal(permission.getUserId(), userId)); |
| | | if (userPermission != null) { |
| | | if (isUserPermissionValid(userPermission, permissionLevel)) { |
| | | return; |
| | | } |
| | | } |
| | | |
| | | // 3. åæºç¹æ®å¤çï¼æ£æ¥å®¢æ·å¢éæé |
| | | if (CrmBizTypeEnum.CRM_BUSINESS.getType().equals(bizType)) { |
| | | if (validateBusinessCustomerPermission(bizId, userId, permissionLevel)) { |
| | | return; |
| | | } |
| | | } |
| | |
| | | if (subordinatePermission != null && isUserPermissionValid(subordinatePermission, permissionLevel)) { |
| | | return; |
| | | } |
| | | // åæºç¹æ®å¤çï¼æ£æ¥å®¢æ·å¢éæéï¼ä¸å±çï¼ |
| | | if (CrmBizTypeEnum.CRM_BUSINESS.getType().equals(bizType)) { |
| | | if (validateBusinessCustomerPermission(bizId, subordinateUserId, permissionLevel)) { |
| | | return; |
| | | } |
| | | // ç»§æ¿æå±å®¢æ·çæéï¼ä¸å±çï¼ |
| | | if (validateCustomerPermission(bizType, bizId, subordinateUserId, permissionLevel)) { |
| | | return; |
| | | } |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | /** |
| | | * åæºç¹æ®æéæ ¡éªï¼æ£æ¥ç¨æ·æ¯å¦æè¯¥åæºæå±å®¢æ·çå¢éæé |
| | | * ç»§æ¿æå±å®¢æ·çæéæ ¡éªï¼å®¢æ·è´è´£äººã客æ·å¢éæå |
| | | * |
| | | * @param businessId åæºç¼å· |
| | | * @param userId ç¨æ·ç¼å· |
| | | * éç¨äºï¼è系人ãåæºãååãé宿¥ä»·ã忬¾ã忬¾è®¡åãå¼ç¥¨ |
| | | * |
| | | * @param bizType æ°æ®ç±»å |
| | | * @param bizId æ°æ®ç¼å· |
| | | * @param userId ç¨æ·ç¼å· |
| | | * @param permissionLevel éè¦çæéçº§å« |
| | | * @return æ¯å¦ææé |
| | | */ |
| | | private boolean validateBusinessCustomerPermission(Long businessId, Long userId, Integer permissionLevel) { |
| | | // è·ååæºç客æ·ID |
| | | CrmBusinessDO business = businessMapper.selectById(businessId); |
| | | if (business == null || business.getCustomerId() == null) { |
| | | private boolean validateCustomerPermission(Integer bizType, Long bizId, Long userId, Integer permissionLevel) { |
| | | // 1. è·åæå±å®¢æ· |
| | | Long customerId = getCustomerId(bizType, bizId); |
| | | if (customerId == null) { |
| | | return false; |
| | | } |
| | | // æ£æ¥å®¢æ·å¢éæé |
| | | List<CrmPermissionDO> customerPermissions = crmPermissionService.getPermissionListByBiz( |
| | | CrmBizTypeEnum.CRM_CUSTOMER.getType(), Collections.singleton(business.getCustomerId())); |
| | | if (CollUtil.isEmpty(customerPermissions)) { |
| | | // 客æ·å
¬æµ·æ°æ®ï¼READ æéæ¾è¡ |
| | | return CrmPermissionLevelEnum.isRead(permissionLevel); |
| | | } |
| | | // æ£æ¥ç¨æ·æ¯å¦æå®¢æ·å¢éçæé |
| | | CrmPermissionDO userCustomerPermission = CollUtil.findOne(customerPermissions, |
| | | permission -> ObjUtil.equal(permission.getUserId(), userId)); |
| | | if (userCustomerPermission != null && isUserPermissionValid(userCustomerPermission, permissionLevel)) { |
| | | CrmCustomerDO customer = customerMapper.selectById(customerId); |
| | | // 2. 客æ·è´è´£äººï¼ç´æ¥éè¿ï¼å
¼å®¹æé表ä¸è´è´£äººè®°å½ç¼ºå¤±/ä¸ä¸è´çå岿°æ®ï¼ |
| | | if (customer != null && ObjUtil.equal(customer.getOwnerUserId(), userId)) { |
| | | return true; |
| | | } |
| | | return false; |
| | | // 3. æ£æ¥å®¢æ·å¢éæé |
| | | List<CrmPermissionDO> customerPermissions = crmPermissionService.getPermissionListByBiz( |
| | | CrmBizTypeEnum.CRM_CUSTOMER.getType(), Collections.singleton(customerId)); |
| | | if (CollUtil.isEmpty(customerPermissions)) { |
| | | // å®¢æ·æè´è´£äººä½ä¸æ¯å½åç¨æ·ï¼ä¸æ¯å
¬æµ·ï¼ä¸è½æ¾è¡ |
| | | if (customer != null && customer.getOwnerUserId() != null) { |
| | | return false; |
| | | } |
| | | // çæ£çå
¬æµ·æ°æ®ï¼READ æéæ¾è¡ |
| | | return CrmPermissionLevelEnum.isRead(permissionLevel); |
| | | } |
| | | // 4. æ£æ¥ç¨æ·æ¯å¦æå®¢æ·å¢éçæé |
| | | CrmPermissionDO userCustomerPermission = CollUtil.findOne(customerPermissions, |
| | | permission -> ObjUtil.equal(permission.getUserId(), userId)); |
| | | return userCustomerPermission != null && isUserPermissionValid(userCustomerPermission, permissionLevel); |
| | | } |
| | | |
| | | /** |
| | | * è·åæ°æ®æå±ç客æ·ç¼å· |
| | | * |
| | | * @param bizType æ°æ®ç±»å |
| | | * @param bizId æ°æ®ç¼å· |
| | | * @return 客æ·ç¼å·ï¼ä¸å卿¶è¿å null |
| | | */ |
| | | private Long getCustomerId(Integer bizType, Long bizId) { |
| | | if (CrmBizTypeEnum.CRM_CONTACT.getType().equals(bizType)) { |
| | | CrmContactDO contact = contactMapper.selectById(bizId); |
| | | return contact == null ? null : contact.getCustomerId(); |
| | | } |
| | | if (CrmBizTypeEnum.CRM_BUSINESS.getType().equals(bizType)) { |
| | | CrmBusinessDO business = businessMapper.selectById(bizId); |
| | | return business == null ? null : business.getCustomerId(); |
| | | } |
| | | if (CrmBizTypeEnum.CRM_CONTRACT.getType().equals(bizType)) { |
| | | CrmContractDO contract = contractMapper.selectById(bizId); |
| | | return contract == null ? null : contract.getCustomerId(); |
| | | } |
| | | if (CrmBizTypeEnum.CRM_SALE_QUOTATION.getType().equals(bizType)) { |
| | | CrmSaleQuotationDO quotation = quotationMapper.selectById(bizId); |
| | | return quotation == null ? null : quotation.getCustomerId(); |
| | | } |
| | | if (CrmBizTypeEnum.CRM_RECEIVABLE.getType().equals(bizType)) { |
| | | CrmReceivableDO receivable = receivableMapper.selectById(bizId); |
| | | return receivable == null ? null : receivable.getCustomerId(); |
| | | } |
| | | if (CrmBizTypeEnum.CRM_RECEIVABLE_PLAN.getType().equals(bizType)) { |
| | | CrmReceivablePlanDO plan = receivablePlanMapper.selectById(bizId); |
| | | return plan == null ? null : plan.getCustomerId(); |
| | | } |
| | | if (CrmBizTypeEnum.CRM_INVOICE.getType().equals(bizType)) { |
| | | CrmInvoiceDO invoice = invoiceMapper.selectById(bizId); |
| | | return invoice == null ? null : invoice.getCustomerId(); |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | /** |
| | | * è·åæ°æ®æ¬èº«çè´è´£äººç¼å· |
| | | * |
| | | * @param bizType æ°æ®ç±»å |
| | | * @param bizId æ°æ®ç¼å· |
| | | * @return è´è´£äººç¼å·ï¼ä¸å卿¶è¿å null |
| | | */ |
| | | private Long getOwnerUserId(Integer bizType, Long bizId) { |
| | | if (CrmBizTypeEnum.CRM_CONTACT.getType().equals(bizType)) { |
| | | CrmContactDO contact = contactMapper.selectById(bizId); |
| | | return contact == null ? null : contact.getOwnerUserId(); |
| | | } |
| | | if (CrmBizTypeEnum.CRM_BUSINESS.getType().equals(bizType)) { |
| | | CrmBusinessDO business = businessMapper.selectById(bizId); |
| | | return business == null ? null : business.getOwnerUserId(); |
| | | } |
| | | if (CrmBizTypeEnum.CRM_CONTRACT.getType().equals(bizType)) { |
| | | CrmContractDO contract = contractMapper.selectById(bizId); |
| | | return contract == null ? null : contract.getOwnerUserId(); |
| | | } |
| | | if (CrmBizTypeEnum.CRM_SALE_QUOTATION.getType().equals(bizType)) { |
| | | CrmSaleQuotationDO quotation = quotationMapper.selectById(bizId); |
| | | return quotation == null ? null : quotation.getOwnerUserId(); |
| | | } |
| | | if (CrmBizTypeEnum.CRM_RECEIVABLE.getType().equals(bizType)) { |
| | | CrmReceivableDO receivable = receivableMapper.selectById(bizId); |
| | | return receivable == null ? null : receivable.getOwnerUserId(); |
| | | } |
| | | if (CrmBizTypeEnum.CRM_RECEIVABLE_PLAN.getType().equals(bizType)) { |
| | | CrmReceivablePlanDO plan = receivablePlanMapper.selectById(bizId); |
| | | return plan == null ? null : plan.getOwnerUserId(); |
| | | } |
| | | if (CrmBizTypeEnum.CRM_INVOICE.getType().equals(bizType)) { |
| | | CrmInvoiceDO invoice = invoiceMapper.selectById(bizId); |
| | | return invoice == null ? null : invoice.getOwnerUserId(); |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | /** |
| | | * å¤æç¨æ·æ¯å¦æ¯æ°æ®æ¬èº«çè´è´£äºº |
| | | * |
| | | * ä¸ä¾èµ crm_permission è®°å½ï¼å
¼å®¹å岿°æ®ä¸æéè®°å½ç¼ºå¤±çæ
åµ |
| | | * |
| | | * @param bizType æ°æ®ç±»å |
| | | * @param bizId æ°æ®ç¼å· |
| | | * @param userId ç¨æ·ç¼å· |
| | | * @return æ¯å¦æ¯è´è´£äºº |
| | | */ |
| | | private boolean isRecordOwner(Integer bizType, Long bizId, Long userId) { |
| | | return userId != null && ObjUtil.equal(getOwnerUserId(bizType, bizId), userId); |
| | | } |
| | | |
| | | /** |
| | | * å¤æåæ°æ®æå±å®¢æ·æ¯å¦åå¨å¢éï¼è´è´£äººæå¢éæåï¼ |
| | | * |
| | | * ç¨äºåºåãçæ£çå
¬æµ·æ°æ®ãåãç¶å®¢æ·æå¢éãä½åæ°æ®æ¬èº«æ²¡ææéè®°å½ãçå岿°æ® |
| | | * |
| | | * @param bizType æ°æ®ç±»å |
| | | * @param bizId æ°æ®ç¼å· |
| | | * @return æ¯å¦åå¨å®¢æ·å¢é |
| | | */ |
| | | private boolean hasParentCustomerTeam(Integer bizType, Long bizId) { |
| | | Long customerId = getCustomerId(bizType, bizId); |
| | | if (customerId == null) { |
| | | return false; |
| | | } |
| | | // å®¢æ·æè´è´£äººï¼è¯´æä¸æ¯å
¬æµ· |
| | | CrmCustomerDO customer = customerMapper.selectById(customerId); |
| | | if (customer == null) { |
| | | return false; |
| | | } |
| | | if (customer.getOwnerUserId() != null) { |
| | | return true; |
| | | } |
| | | // å®¢æ·æ²¡æè´è´£äººæ¶ï¼æ£æ¥æ¯å¦æå¢éæå |
| | | return CollUtil.isNotEmpty(crmPermissionService.getPermissionListByBiz( |
| | | CrmBizTypeEnum.CRM_CUSTOMER.getType(), Collections.singleton(customerId))); |
| | | } |
| | | |
| | | /** |
| | |
| | | permissionService.createPermission(new CrmPermissionCreateReqBO().setUserId(business.getOwnerUserId()) |
| | | .setBizType(CrmBizTypeEnum.CRM_BUSINESS.getType()).setBizId(business.getId()) |
| | | .setLevel(CrmPermissionLevelEnum.OWNER.getLevel())); |
| | | // 3.1 客æ·è´è´£äººèªå¨æ¥æè¯¥åæºç读åæé |
| | | permissionService.createPermissionForCustomerOwner(CrmBizTypeEnum.CRM_BUSINESS.getType(), |
| | | business.getId(), business.getCustomerId(), business.getOwnerUserId()); |
| | | |
| | | // 4. å¨è系人ç详æ
页ï¼å¦æç´æ¥ãæ°å»ºåæºãï¼åéè¦å
³èä¸ |
| | | if (createReqVO.getContactId() != null) { |
| | |
| | | permissionService.createPermission(new CrmPermissionCreateReqBO() |
| | | .setBizType(CrmBizTypeEnum.CRM_BUSINESS.getType()).setBizId(business.getId()) |
| | | .setUserId(ownerUserId).setLevel(CrmPermissionLevelEnum.OWNER.getLevel())); |
| | | // 客æ·è´è´£äººèªå¨æ¥æè¯¥åæºç读åæé |
| | | permissionService.createPermissionForCustomerOwner(CrmBizTypeEnum.CRM_BUSINESS.getType(), |
| | | business.getId(), customer.getId(), ownerUserId); |
| | | respVO.getCreateBusinessNames().add(importBusiness.getName()); |
| | | // è®°å½æä½æ¥å¿ |
| | | getSelf().importBusinessLog(business, false); |
| | |
| | | permissionService.createPermission(new CrmPermissionCreateReqBO().setUserId(userId) |
| | | .setBizType(CrmBizTypeEnum.CRM_CONTACT.getType()).setBizId(contact.getId()) |
| | | .setLevel(CrmPermissionLevelEnum.OWNER.getLevel())); |
| | | // 3.1 客æ·è´è´£äººèªå¨æ¥æè¯¥è系人ç读åæé |
| | | permissionService.createPermissionForCustomerOwner(CrmBizTypeEnum.CRM_CONTACT.getType(), |
| | | contact.getId(), contact.getCustomerId(), userId); |
| | | |
| | | // 4. 妿æå
³èåæºï¼åéè¦å建å
³è |
| | | if (createReqVO.getBusinessId() != null) { |
| | |
| | | permissionService.createPermission(new CrmPermissionCreateReqBO() |
| | | .setBizType(CrmBizTypeEnum.CRM_CONTACT.getType()).setBizId(contact.getId()) |
| | | .setUserId(ownerUserId).setLevel(CrmPermissionLevelEnum.OWNER.getLevel())); |
| | | // 客æ·è´è´£äººèªå¨æ¥æè¯¥è系人ç读åæé |
| | | permissionService.createPermissionForCustomerOwner(CrmBizTypeEnum.CRM_CONTACT.getType(), |
| | | contact.getId(), customer.getId(), ownerUserId); |
| | | respVO.getCreateContactNames().add(importContact.getName()); |
| | | // è®°å½æä½æ¥å¿ |
| | | getSelf().importContactLog(contact, false); |
| | |
| | | import cn.iocoder.yudao.module.crm.framework.permission.core.annotations.CrmPermission; |
| | | import cn.iocoder.yudao.module.crm.service.business.CrmBusinessService; |
| | | import cn.iocoder.yudao.module.crm.service.contact.CrmContactService; |
| | | import cn.iocoder.yudao.module.crm.api.customer.CrmCustomerApi; |
| | | import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerService; |
| | | import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService; |
| | | import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO; |
| | |
| | | @Resource |
| | | private CrmCustomerService customerService; |
| | | @Resource |
| | | private CrmCustomerApi customerApi; |
| | | @Resource |
| | | private CrmBusinessService businessService; |
| | | @Resource |
| | | private CrmContactService contactService; |
| | |
| | | crmPermissionService.createPermission(new CrmPermissionCreateReqBO().setUserId(contract.getOwnerUserId()) |
| | | .setBizType(CrmBizTypeEnum.CRM_CONTRACT.getType()).setBizId(contract.getId()) |
| | | .setLevel(CrmPermissionLevelEnum.OWNER.getLevel())); |
| | | // 3.1 客æ·è´è´£äººèªå¨æ¥æè¯¥ååç读åæé |
| | | crmPermissionService.createPermissionForCustomerOwner(CrmBizTypeEnum.CRM_CONTRACT.getType(), |
| | | contract.getId(), contract.getCustomerId(), contract.getOwnerUserId()); |
| | | |
| | | // 4. è®°å½æä½æ¥å¿ä¸ä¸æ |
| | | LogRecordContext.putVariable("contract", contract); |
| | |
| | | return PageResult.empty(); |
| | | } |
| | | } |
| | | // 2. è·åç¨æ·ææéçå®¢æ· ID å表 |
| | | List<Long> permittedCustomerIds = customerApi.getPermittedCustomerIds(); |
| | | // 3. æ¥è¯¢å页 |
| | | return contractMapper.selectPage(pageReqVO, userId, config, permittedCustomerIds); |
| | | // 2. æ¥è¯¢å页 |
| | | // ååå¯è§æ§å®å
¨ç± appendPermissionCondition æ§å¶ï¼ååå¢é ⪠客æ·å¢éï¼ï¼ |
| | | // ä¸åé¢å¤æãææéç客æ·ãè¿æ»¤ï¼å¦åä¸å¨å®¢æ·å¢éãä½å±äºååè´è´£äºº/ååå¢éçç¨æ·ä¼è¢«éè¯¯è¿æ»¤æ |
| | | return contractMapper.selectPage(pageReqVO, userId, config); |
| | | } |
| | | |
| | | @Override |
| | |
| | | if (!products.isEmpty() || contract.getTotalPrice() == null) calculateTotalPrice(contract, validateContractProducts(products)); |
| | | contractMapper.insert(contract); |
| | | crmPermissionService.createPermission(new CrmPermissionCreateReqBO().setBizType(CrmBizTypeEnum.CRM_CONTRACT.getType()).setBizId(contract.getId()).setUserId(ownerId).setLevel(CrmPermissionLevelEnum.OWNER.getLevel())); |
| | | // 客æ·è´è´£äººèªå¨æ¥æè¯¥ååç读åæé |
| | | crmPermissionService.createPermissionForCustomerOwner(CrmBizTypeEnum.CRM_CONTRACT.getType(), |
| | | contract.getId(), customer.getId(), ownerId); |
| | | } else { |
| | | contract.setId(existing.getId()); |
| | | List<CrmContractProductDO> amountDetails = products.isEmpty() |
| | |
| | | if (CollUtil.isNotEmpty(reqVO.getToBizTypes())) { |
| | | transfer(reqVO, userId); |
| | | } |
| | | // 2.4 æ°è´è´£äººèªå¨æ¥æè¯¥å®¢æ·ä¸è系人ãåæºãååç读åæé |
| | | permissionService.syncCustomerOwnerPermission(reqVO.getId(), reqVO.getNewOwnerUserId()); |
| | | |
| | | // 3. è®°å½è½¬ç§»æ¥å¿ |
| | | LogRecordContext.putVariable("customer", customer); |
| | |
| | | customerMapper.updateBatch(updateCustomers); |
| | | // 2.3 å建è´è´£äººæ°æ®æé |
| | | permissionService.createPermissionBatch(createPermissions); |
| | | // TODO @èè¿ï¼è¦ä¸è¦å¤çå
³èçè系人ï¼ï¼ï¼ |
| | | // 2.4 è´è´£äººèªå¨æ¥æè¿äºå®¢æ·ä¸è系人ãåæºãååç读åæé |
| | | customers.forEach(customer -> permissionService.syncCustomerOwnerPermission(customer.getId(), ownerUserId)); |
| | | |
| | | // 3. è®°å½æä½æ¥å¿ |
| | | AdminUserRespDTO user = null; |
| | |
| | | @LogRecord(type = CRM_INVOICE_TYPE, subType = CRM_INVOICE_CREATE_SUB_TYPE, bizNo = "{{#invoice.id}}", |
| | | success = CRM_INVOICE_CREATE_SUCCESS) |
| | | public Long createInvoice(CrmInvoiceSaveReqVO createReqVO) { |
| | | // 1.1 æ ¡éªå¯å¼ç¥¨éé¢è¶
è¿ä¸é |
| | | validateInvoicePriceExceedsLimit(createReqVO); |
| | | // 1.2 æ ¡éªå
³èæ°æ®åå¨ |
| | | // 1.1 æ ¡éªå
³èæ°æ®åå¨ï¼å¼ç¥¨éé¢ä¸ååååéé¢éå¶ï¼ä»
å端æç¤ºå¯å¼ç¥¨éé¢ï¼ |
| | | validateRelationDataExists(createReqVO); |
| | | // 1.3 çæå¼ç¥¨ç¼å· |
| | | String no = noRedisDAO.generate(CrmNoRedisDAO.INVOICE_PREFIX); |
| | |
| | | return invoice.getId(); |
| | | } |
| | | |
| | | private void validateInvoicePriceExceedsLimit(CrmInvoiceSaveReqVO reqVO) { |
| | | // 1. 计ç®å©ä½å¯å¼ç¥¨éé¢ï¼ä¸å
æ¬ reqVO èªèº«ï¼å®¡æ¹ä¸ä¹å ç¨é¢åº¦ï¼é²æ¢ç´¯è®¡å¼ç¥¨è¶
è¿ååéé¢ï¼ |
| | | CrmContractDO contract = contractService.validateContract(reqVO.getContractId()); |
| | | List<CrmInvoiceDO> invoices = invoiceMapper.selectListByContractIdAndStatus(reqVO.getContractId(), |
| | | List.of(CrmAuditStatusEnum.APPROVE.getStatus(), CrmAuditStatusEnum.PROCESS.getStatus())); |
| | | if (reqVO.getId() != null) { |
| | | invoices.removeIf(invoice -> ObjectUtil.equal(invoice.getId(), reqVO.getId())); |
| | | } |
| | | BigDecimal notInvoicePrice = contract.getTotalPrice().subtract( |
| | | CollectionUtils.getSumValue(invoices, CrmInvoiceDO::getPrice, BigDecimal::add, BigDecimal.ZERO)); |
| | | // 2. æ ¡éªé颿¯å¦è¶
è¿ |
| | | if (reqVO.getPrice().compareTo(notInvoicePrice) > 0) { |
| | | throw exception(INVOICE_CREATE_FAIL_PRICE_EXCEEDS_LIMIT, notInvoicePrice); |
| | | } |
| | | } |
| | | |
| | | private void validateRelationDataExists(CrmInvoiceSaveReqVO reqVO) { |
| | | if (reqVO.getOwnerUserId() != null) { |
| | | adminUserApi.validateUser(reqVO.getOwnerUserId()); // æ ¡éªè´è´£äººåå¨ |
| | |
| | | CrmInvoiceDO oldInvoice = validateInvoiceExists(updateReqVO.getId()); |
| | | updateReqVO.setOwnerUserId(oldInvoice.getOwnerUserId()).setCustomerId(oldInvoice.getCustomerId()) |
| | | .setContractId(oldInvoice.getContractId()); // 设置已åå¨çå¼ |
| | | // 1.2 æ ¡éªå¯å¼ç¥¨éé¢è¶
è¿ä¸é |
| | | validateInvoicePriceExceedsLimit(updateReqVO); |
| | | |
| | | // 1.3 åªæè稿ãå®¡æ ¸ä¸éè¿ï¼å¯ä»¥ç¼è¾ï¼ |
| | | // 1.2 åªæè稿ãå®¡æ ¸ä¸éè¿ï¼å¯ä»¥ç¼è¾ï¼ |
| | | if (!ObjectUtils.equalsAny(oldInvoice.getAuditStatus(), CrmAuditStatusEnum.DRAFT.getStatus(), |
| | | CrmAuditStatusEnum.REJECT.getStatus())) { |
| | | throw exception(INVOICE_UPDATE_FAIL_EDITING_PROHIBITED); |
| | |
| | | throw exception(INVOICE_SUBMIT_FAIL_NOT_EDITABLE); |
| | | } |
| | | |
| | | // 2. éæ°æ ¡éªå¯å¼ç¥¨éé¢ï¼é²æ¢ç´¯è®¡å¼ç¥¨è¶
è¿ååéé¢ï¼è稿æåå¯è½æå
¶ä»åè¿å
¥å®¡æ¹ä¸ï¼ |
| | | validateInvoicePriceExceedsLimit(new CrmInvoiceSaveReqVO() |
| | | .setId(invoice.getId()).setContractId(invoice.getContractId()).setPrice(invoice.getPrice())); |
| | | |
| | | // 3. æ ¡éªå®¡æ¹é
置已å¯ç¨ä¸é
ç½®äºææå®¡æ¹äººï¼æªé
ç½®æ¶æåºå¸¦æç¡®æç¤ºçä¸å¡å¼å¸¸ï¼ |
| | | // 2. æ ¡éªå®¡æ¹é
置已å¯ç¨ä¸é
ç½®äºææå®¡æ¹äººï¼æªé
ç½®æ¶æåºå¸¦æç¡®æç¤ºçä¸å¡å¼å¸¸ï¼ |
| | | approvalConfigApi.validateApprovalEnabledAndGetApprovers(INVOICE_APPROVE_BIZ_TYPE); |
| | | |
| | | // 4. ç¶æç½®ä¸ºå®¡æ¹ä¸ï¼å¹¶æ¸
空ä¸ä¸è½®å®¡æ ¸ç»æï¼é¿å
æ®çãå®¡æ ¸ä¸éè¿ãçåå |
| | |
| | | void createPermissionBatch(@Valid List<CrmPermissionCreateReqBO> createReqBOs); |
| | | |
| | | /** |
| | | * 忥客æ·è´è´£äººçåä¸å¡ã读åãæé |
| | | * |
| | | * 客æ·è´è´£äººåæ´ï¼è½¬ç§»ãé¢åå
¬æµ·å®¢æ·ï¼åï¼èªå¨è·å¾è¯¥å®¢æ·ä¸è系人ãåæºãååç读åæé |
| | | * |
| | | * @param customerId 客æ·ç¼å· |
| | | * @param ownerUserId 客æ·è´è´£äººç¼å· |
| | | */ |
| | | void syncCustomerOwnerPermission(Long customerId, Long ownerUserId); |
| | | |
| | | /** |
| | | * æ°å¢åä¸å¡æ°æ®æ¶ï¼ä¸ºå®¢æ·è´è´£äººè¡¥å
ã读åãæé |
| | | * |
| | | * 客æ·è´è´£äººä¸è¯¥æ°æ®è´è´£äººä¸æ¯åä¸äººæ¶ï¼èªå¨ä¸ºå®¢æ·è´è´£äººå建读åæé |
| | | * |
| | | * @param bizType æ°æ®ç±»åï¼å
³è {@link CrmBizTypeEnum} |
| | | * @param bizId æ°æ®ç¼å· |
| | | * @param customerId 客æ·ç¼å· |
| | | * @param ownerUserId æ°æ®è´è´£äººç¼å· |
| | | */ |
| | | void createPermissionForCustomerOwner(Integer bizType, Long bizId, Long customerId, Long ownerUserId); |
| | | |
| | | /** |
| | | * æ´æ°æ°æ®æé |
| | | * |
| | | * @param updateReqVO æ´æ°ä¿¡æ¯ |
| | |
| | | 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; |
| | |
| | | |
| | | @Resource |
| | | private CrmPermissionMapper permissionMapper; |
| | | @Resource |
| | | private CrmCustomerMapper customerMapper; |
| | | @Resource |
| | | private CrmContactMapper contactMapper; |
| | | @Resource |
| | | private CrmBusinessMapper businessMapper; |
| | | @Resource |
| | | private CrmContractMapper contractMapper; |
| | | @Resource |
| | | @Lazy // è§£å³ä¾èµå¾ªç¯ |
| | | private CrmContactService contactService; |
| | |
| | | |
| | | @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. æ°æ®è´è´£äººæ¬èº«å°±æ¯å®¢æ·è´è´£äººæ¶ï¼å·²ç»æ¥ææéï¼æ éé夿æ |
| | | 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()); |
| | |
| | | import cn.iocoder.yudao.module.crm.service.contact.CrmContactService; |
| | | import cn.iocoder.yudao.module.crm.service.contract.CrmContractService; |
| | | import cn.iocoder.yudao.module.crm.service.customer.CrmCustomerService; |
| | | import cn.iocoder.yudao.module.crm.api.customer.CrmCustomerApi; |
| | | import cn.iocoder.yudao.module.crm.service.permission.CrmPermissionService; |
| | | import cn.iocoder.yudao.module.crm.service.permission.bo.CrmPermissionCreateReqBO; |
| | | import cn.iocoder.yudao.module.system.api.storage.StorageAttachmentApi; |
| | |
| | | |
| | | @Resource |
| | | private CrmCustomerService customerService; |
| | | @Resource |
| | | private CrmCustomerApi customerApi; |
| | | @Resource |
| | | private CrmBusinessService businessService; |
| | | @Resource |
| | |
| | | |
| | | @Override |
| | | public PageResult<CrmSaleQuotationDO> getSaleQuotationPage(CrmSaleQuotationPageReqVO pageReqVO, Long userId) { |
| | | // è·åç¨æ·ææéçå®¢æ· ID å表 |
| | | List<Long> permittedCustomerIds = customerApi.getPermittedCustomerIds(); |
| | | return saleQuotationMapper.selectPage(pageReqVO, userId, permittedCustomerIds); |
| | | // å¯è§æ§å®å
¨ç± appendPermissionCondition æ§å¶ï¼æ¥ä»·å¢é ⪠客æ·å¢éï¼ï¼ |
| | | // ä¸åé¢å¤æãææéç客æ·ãè¿æ»¤ï¼é¿å
ä¸å¨å®¢æ·å¢éãä½å±äºæ¥ä»·è´è´£äºº/æ¥ä»·å¢éçç¨æ·è¢«éè¯¯è¿æ»¤ |
| | | return saleQuotationMapper.selectPage(pageReqVO, userId, null); |
| | | } |
| | | |
| | | @Override |
| | |
| | | public class CrmPermissionUtils { |
| | | |
| | | /** |
| | | * æ ¡éªç¨æ·æ¯å¦æ¯ CRM 管çå |
| | | * æ ¡éªç¨æ·æ¯å¦æ¯ CRM 管çåï¼CRM 管çåæç³»ç»è¶
级管çåï¼ |
| | | * |
| | | * è¶
级管çåï¼super_adminï¼ä¸å CRM æ°æ®æééå¶ï¼å¯ä»¥æ¥çå
¨é¨æ°æ® |
| | | * |
| | | * @return æ¯/å¦ |
| | | */ |
| | | public static boolean isCrmAdmin() { |
| | | PermissionCommonApi permissionApi = SpringUtil.getBean(PermissionCommonApi.class); |
| | | return permissionApi.hasAnyRoles(getLoginUserId(), RoleCodeEnum.CRM_ADMIN.getCode()); |
| | | return permissionApi.hasAnyRoles(getLoginUserId(), |
| | | RoleCodeEnum.CRM_ADMIN.getCode(), RoleCodeEnum.SUPER_ADMIN.getCode()); |
| | | } |
| | | |
| | | /** |
| | |
| | | */ |
| | | public static <T extends MPJLambdaWrapper<?>, S> void appendPermissionCondition(T query, Integer bizType, SFunction<S, ?> bizId, |
| | | Long userId, Integer sceneType) { |
| | | // ç¹æ®é»è¾ï¼CRM 管çå / è¶
级管çåç´æ¥æ¥è¯¢ææï¼ä¸è¿æ»¤æ°æ®æé |
| | | if (isCrmAdmin()) { |
| | | return; |
| | | } |
| | | MybatisPlusJoinProperties mybatisPlusJoinProperties = SpringUtil.getBean(MybatisPlusJoinProperties.class); |
| | | final String ownerUserIdField = mybatisPlusJoinProperties.getTableAlias() + ".owner_user_id"; |
| | | // åºæ¯ä¸ï¼æè´è´£çæ°æ® |
| | |
| | | } |
| | | // åºæ¯äºï¼æåä¸çæ°æ®ï¼ææè¯»æåæéï¼å¹¶ä¸ä¸æ¯è´è´£äººï¼ |
| | | if (CrmSceneTypeEnum.isInvolved(sceneType)) { |
| | | if (CrmPermissionUtils.isCrmAdmin()) { // ç¹æ®é»è¾ï¼å¦ææ¯è¶
管ï¼ç´æ¥æ¥è¯¢ææï¼ä¸è¿æ»¤æ°æ®æé |
| | | return; |
| | | } |
| | | // åæºç¹æ®å¤çï¼åæ¶å
³èåæºå¢éå客æ·å¢éçæé |
| | | if (CrmBizTypeEnum.CRM_BUSINESS.getType().equals(bizType)) { |
| | | appendBusinessPermissionCondition(query, bizId, userId, ownerUserIdField); |
| | | // éè¦ç»§æ¿å®¢æ·å¢éçæ¨¡åï¼æ°æ®èªèº«å¢é ⪠客æ·è´è´£äºº/客æ·å¢é |
| | | String tableName = getInheritCustomerTeamTable(bizType); |
| | | if (tableName != null) { |
| | | appendCustomerInheritedPermissionCondition(query, bizType, tableName, userId, ownerUserIdField); |
| | | } else { |
| | | query.innerJoin(CrmPermissionDO.class, on -> on.eq(CrmPermissionDO::getBizType, bizType) |
| | | .eq(CrmPermissionDO::getBizId, bizId) |
| | |
| | | } |
| | | |
| | | /** |
| | | * åæºç¹æ®æéæ¡ä»¶ï¼åæ¶å
³èåæºå¢éå客æ·å¢éçæé |
| | | * åæºç»§æ¿å®¢æ·å¢éçæéï¼å³å®¢æ·å¢éæåä¹è½çå°è¯¥å®¢æ·ä¸çåæº |
| | | * è·å¾ãç»§æ¿å®¢æ·å¢éãçä¸å¡è¡¨åï¼ä¸éè¦ç»§æ¿çè¿å null |
| | | * |
| | | * ç®åç»ä¸ä¸ºï¼è系人ãåæºãååãé宿¥ä»·ã忬¾ã忬¾è®¡åãå¼ç¥¨ |
| | | */ |
| | | private static <T extends MPJLambdaWrapper<?>, S> void appendBusinessPermissionCondition(T query, SFunction<S, ?> bizId, |
| | | Long userId, String ownerUserIdField) { |
| | | // 使ç¨åæ¥è¯¢æ¹å¼ï¼åæºå¢éæå OR 客æ·å¢éæå |
| | | // åæ¥è¯¢1ï¼åæºå¢éæåæé |
| | | private static String getInheritCustomerTeamTable(Integer bizType) { |
| | | if (CrmBizTypeEnum.CRM_CONTACT.getType().equals(bizType)) { |
| | | return "crm_contact"; |
| | | } |
| | | if (CrmBizTypeEnum.CRM_BUSINESS.getType().equals(bizType)) { |
| | | return "crm_business"; |
| | | } |
| | | if (CrmBizTypeEnum.CRM_CONTRACT.getType().equals(bizType)) { |
| | | return "crm_contract"; |
| | | } |
| | | if (CrmBizTypeEnum.CRM_SALE_QUOTATION.getType().equals(bizType)) { |
| | | return "crm_sale_quotation"; |
| | | } |
| | | if (CrmBizTypeEnum.CRM_RECEIVABLE.getType().equals(bizType)) { |
| | | return "crm_receivable"; |
| | | } |
| | | if (CrmBizTypeEnum.CRM_RECEIVABLE_PLAN.getType().equals(bizType)) { |
| | | return "crm_receivable_plan"; |
| | | } |
| | | if (CrmBizTypeEnum.CRM_INVOICE.getType().equals(bizType)) { |
| | | return "crm_invoice"; |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | /** |
| | | * ç»§æ¿å®¢æ·å¢éçæ°æ®æéï¼æ°æ®èªèº«å¢é ⪠客æ·è´è´£äºº/客æ·å¢é |
| | | * |
| | | * @param query è¿è¡¨æ¥è¯¢å¯¹è±¡ |
| | | * @param bizType æ°æ®ç±»å |
| | | * @param tableName ä¸å¡è¡¨å |
| | | * @param userId ç¨æ·ç¼å· |
| | | * @param ownerUserIdField è´è´£äººå段 |
| | | */ |
| | | private static <T extends MPJLambdaWrapper<?>> void appendCustomerInheritedPermissionCondition( |
| | | T query, Integer bizType, String tableName, Long userId, String ownerUserIdField) { |
| | | // åæ¥è¯¢1ï¼æ°æ®èªèº«çå¢éæåæé |
| | | String subQuery1 = "(SELECT p1.biz_id FROM crm_permission p1 " + |
| | | "WHERE p1.biz_type = " + CrmBizTypeEnum.CRM_BUSINESS.getType() + " " + |
| | | "AND p1.level IN (" + CrmPermissionLevelEnum.READ.getLevel() + "," + CrmPermissionLevelEnum.WRITE.getLevel() + ") " + |
| | | "AND p1.user_id = " + userId + ")"; |
| | | // åæ¥è¯¢2ï¼å®¢æ·å¢éæåæéï¼éè¿åæºç customer_id å
³èï¼ |
| | | String subQuery2 = "(SELECT b.id FROM crm_business b " + |
| | | "INNER JOIN crm_permission p2 ON p2.biz_type = " + CrmBizTypeEnum.CRM_CUSTOMER.getType() + " " + |
| | | "AND p2.biz_id = b.customer_id " + |
| | | "AND p2.level IN (" + CrmPermissionLevelEnum.READ.getLevel() + "," + CrmPermissionLevelEnum.WRITE.getLevel() + ") " + |
| | | "AND p2.user_id = " + userId + ")"; |
| | | "WHERE p1.biz_type = " + bizType + " " + |
| | | "AND p1.level IN (" + CrmPermissionLevelEnum.OWNER.getLevel() + "," + |
| | | CrmPermissionLevelEnum.READ.getLevel() + "," + CrmPermissionLevelEnum.WRITE.getLevel() + ") " + |
| | | "AND p1.user_id = " + userId + " AND p1.deleted = 0)"; |
| | | // åæ¥è¯¢2ï¼æå±å®¢æ·çè´è´£äºº + å¢éæå |
| | | // 注æï¼ä»¥ crm_customer.owner_user_id 为åï¼å
¼å®¹æé表ä¸è´è´£äººè®°å½ç¼ºå¤±/ä¸ä¸è´çå岿°æ® |
| | | String subQuery2 = "(SELECT x.id FROM " + tableName + " x " + |
| | | "INNER JOIN crm_customer cu ON cu.id = x.customer_id AND cu.deleted = 0 " + |
| | | "WHERE x.deleted = 0 AND (cu.owner_user_id = " + userId + |
| | | " OR EXISTS (SELECT 1 FROM crm_permission p2 " + |
| | | "WHERE p2.biz_type = " + CrmBizTypeEnum.CRM_CUSTOMER.getType() + " " + |
| | | "AND p2.biz_id = x.customer_id AND p2.user_id = " + userId + " AND p2.deleted = 0)))"; |
| | | // ä½¿ç¨ OR è¿æ¥ä¸¤ä¸ªåæ¥è¯¢ï¼å¹¶æé¤èªå·±æ¯è´è´£äººçæ
åµ |
| | | query.apply("t.id IN (" + subQuery1 + " UNION " + subQuery2 + ")") |
| | | .ne(ownerUserIdField, userId); |