This commit is contained in:
zlwu committed 2026-08-03 12:48:52 +08:00
1 parent 594e4ce38e
commit e233269abf
144 files changed
+228178 -111974

No files matched your search

@@ -0,0 +1,56 @@
-- 合同编号重复排查(只读,不改数据)
-- 库:shanxia2.0 / crm_contract
-- 用途:检查租户内 contract_no 是否仍有重复(含软删)
SET NAMES utf8mb4;
-- 1) 按 (contract_no, tenant_no) 分组:任何重复(含软删)
SELECT
contract_no,
tenant_no,
COUNT(*) AS cnt,
SUM(CASE WHEN del_flag = 0 THEN 1 ELSE 0 END) AS alive_cnt,
SUM(CASE WHEN del_flag = 1 THEN 1 ELSE 0 END) AS deleted_cnt,
GROUP_CONCAT(
CONCAT(id, '/del', del_flag, '/', IFNULL(customer_name, ''))
ORDER BY del_flag, create_time
SEPARATOR ' | '
) AS detail
FROM crm_contract
GROUP BY contract_no, tenant_no
HAVING COUNT(*) > 1
ORDER BY cnt DESC, contract_no;
-- 2) 仅有效单据 (del_flag=0) 是否撞号
SELECT
contract_no,
tenant_no,
COUNT(*) AS alive_cnt,
GROUP_CONCAT(id ORDER BY create_time SEPARATOR ' | ') AS ids,
GROUP_CONCAT(IFNULL(customer_name, '') ORDER BY create_time SEPARATOR ' | ') AS customers
FROM crm_contract
WHERE del_flag = 0
GROUP BY contract_no, tenant_no
HAVING COUNT(*) > 1
ORDER BY alive_cnt DESC, contract_no;
-- 3) 指定编号示例:SX/X-JT20260803001(含改号后的 ~DEL~ 变体)
SELECT
id,
contract_no,
contract_name,
customer_name,
status,
del_flag,
create_time,
update_time
FROM crm_contract
WHERE tenant_no = 'shanxia2.0'
AND (
contract_no = 'SX/X-JT20260803001'
OR contract_no LIKE 'SX/X-JT20260803001~%'
)
ORDER BY del_flag, create_time;
-- 4) 当前唯一索引是否已是全局唯一版
SHOW INDEX FROM crm_contract WHERE Key_name LIKE 'uk_contract%';
@@ -0,0 +1,77 @@
-- 合同编号租户内全局唯一(含软删不复用)— 可重复执行
-- 1) 消解已有 (contract_no, tenant_no) 撞号:保留 del_flag=0,软删行改号
-- 2) 唯一索引改为 (contract_no, tenant_no)
--
-- 说明:若生产已执行过,旧索引 uk_contract_tenant_no_del 可能已不存在,
-- 本脚本会先检查再 DROP/ADD,避免 1091。
SET NAMES utf8mb4;
-- 软删撞号改号:{原编号}~DEL~{id前8位}
UPDATE crm_contract c
INNER JOIN (
SELECT contract_no, tenant_no
FROM crm_contract
GROUP BY contract_no, tenant_no
HAVING COUNT(*) > 1
) d ON c.contract_no = d.contract_no AND c.tenant_no = d.tenant_no
SET c.contract_no = CONCAT(c.contract_no, '~DEL~', LEFT(c.id, 8)),
c.update_time = NOW()
WHERE c.del_flag = 1
AND c.contract_no NOT LIKE '%~DEL~%'
AND c.contract_no NOT LIKE '%~DUP~%';
-- 若仍有撞号(极端:两条都 del_flag=0),再改非 keep 的一条
UPDATE crm_contract c
INNER JOIN (
SELECT contract_no, tenant_no, MIN(id) AS keep_id
FROM crm_contract
GROUP BY contract_no, tenant_no
HAVING COUNT(*) > 1
) d ON c.contract_no = d.contract_no AND c.tenant_no = d.tenant_no AND c.id <> d.keep_id
SET c.contract_no = CONCAT(c.contract_no, '~DUP~', LEFT(c.id, 8)),
c.update_time = NOW()
WHERE c.contract_no NOT LIKE '%~DUP~%';
-- 有旧索引则删除
SET @db := DATABASE();
SET @sql := (
SELECT IF(
EXISTS(
SELECT 1 FROM information_schema.statistics
WHERE table_schema = @db
AND table_name = 'crm_contract'
AND index_name = 'uk_contract_tenant_no_del'
),
'ALTER TABLE crm_contract DROP INDEX `uk_contract_tenant_no_del`',
'SELECT ''skip DROP uk_contract_tenant_no_del'' AS info'
)
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 无新索引则添加
SET @sql := (
SELECT IF(
EXISTS(
SELECT 1 FROM information_schema.statistics
WHERE table_schema = @db
AND table_name = 'crm_contract'
AND index_name = 'uk_contract_tenant_no'
),
'SELECT ''skip ADD uk_contract_tenant_no (already exists)'' AS info',
'ALTER TABLE crm_contract ADD UNIQUE KEY `uk_contract_tenant_no` (`contract_no`, `tenant_no`)'
)
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 验收:应为空
SELECT contract_no, tenant_no, COUNT(*) AS cnt
FROM crm_contract
GROUP BY contract_no, tenant_no
HAVING COUNT(*) > 1;
SHOW INDEX FROM crm_contract WHERE Key_name LIKE 'uk_contract%';
File diff suppressed because it is too large. Load diff
+1 -1
View File
@@ -895,7 +895,7 @@ CREATE TABLE `crm_contract` (
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`del_flag` smallint(6) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_contract_tenant_no_del` (`contract_no`,`tenant_no`,`del_flag`),
UNIQUE KEY `uk_contract_tenant_no` (`contract_no`,`tenant_no`),
KEY `idx_customer_id` (`customer_id`),
KEY `idx_tenant` (`tenant_no`),
KEY `idx_opportunity_id` (`opportunity_id`),