Files
Public/apps/api/prisma/production-deduplicate-20260901.sql
daiyongkang 76f266645d Initial commit: 风影 OA 全栈源码(API/Web/Flutter/IM)
含 Phase 1.1 IM seq 排序、断线重连、多端已读同步与微信式语音转文字 UI。
排除 node_modules、构建产物、安装包与 .env 密钥。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-02 10:04:03 +00:00

112 lines
3.4 KiB
PL/PgSQL

\set ON_ERROR_STOP on
BEGIN;
CREATE TEMP TABLE expense_dedup_map (
old_id text PRIMARY KEY,
new_id text NOT NULL UNIQUE
) ON COMMIT DROP;
INSERT INTO expense_dedup_map (old_id, new_id)
SELECT old_claim.id, formal_claim.id
FROM "ExpenseClaim" old_claim
JOIN "ExpenseClaim" formal_claim
ON formal_claim."claimNo" ~ '^BX-[0-9]{8}-[0-9]{3}$'
AND formal_claim."applicantId" = old_claim."applicantId"
AND formal_claim.amount = old_claim.amount
AND formal_claim."projectId" IS NOT DISTINCT FROM old_claim."projectId"
AND formal_claim."bidCaseId" IS NOT DISTINCT FROM old_claim."bidCaseId"
WHERE old_claim."createdAt" >= TIMESTAMP '2026-08-29 11:00:30'
AND old_claim."createdAt" < TIMESTAMP '2026-08-29 11:00:31';
INSERT INTO expense_dedup_map (old_id, new_id)
SELECT old_claim.id, formal_claim.id
FROM "ExpenseClaim" old_claim
JOIN "ExpenseClaim" formal_claim
ON formal_claim."claimNo" = CASE old_claim."claimNo"
WHEN 'BX-2026-00043' THEN 'BX-20260617-004'
WHEN 'BX-2026-00044' THEN 'BX-20260617-005'
END
WHERE old_claim."claimNo" IN ('BX-2026-00043', 'BX-2026-00044');
DO $$
BEGIN
IF (SELECT count(*) FROM expense_dedup_map) <> 83 THEN
RAISE EXCEPTION 'Expense dedup mapping is incomplete: expected 83, got %',
(SELECT count(*) FROM expense_dedup_map);
END IF;
END $$;
-- FileAsset is intentionally reassigned before duplicate claims are removed.
UPDATE "FileAsset" file
SET "bizId" = mapping.new_id
FROM expense_dedup_map mapping
WHERE file."bizType" = 'EXPENSE'
AND file."bizId" = mapping.old_id;
DELETE FROM "ApprovalTask" task
USING expense_dedup_map mapping
WHERE task."bizId" = mapping.old_id;
DELETE FROM "TodoTask" task
USING expense_dedup_map mapping
WHERE task."bizId" = mapping.old_id;
DELETE FROM "ExpenseClaim" claim
USING expense_dedup_map mapping
WHERE claim.id = mapping.old_id;
CREATE TEMP TABLE loan_dedup_map (
old_id text PRIMARY KEY,
new_id text NOT NULL UNIQUE,
new_status text NOT NULL
) ON COMMIT DROP;
INSERT INTO loan_dedup_map (old_id, new_id, new_status)
SELECT old_loan.id, formal_loan.id, formal_loan.status
FROM "LoanRecord" old_loan
JOIN "LoanRecord" formal_loan
ON formal_loan."loanNo" ~ '^JZ-[0-9]{8}-[0-9]{3}$'
AND formal_loan."applicantId" = old_loan."applicantId"
AND formal_loan.amount = old_loan.amount
AND formal_loan."projectId" IS NOT DISTINCT FROM old_loan."projectId"
AND formal_loan.purpose = old_loan.purpose
WHERE old_loan."loanNo" ~ '^JK-2026-[0-9]{5}$'
AND old_loan."createdAt" >= TIMESTAMP '2026-08-29 11:00:30'
AND old_loan."createdAt" < TIMESTAMP '2026-08-29 11:00:31';
DO $$
BEGIN
IF (SELECT count(*) FROM loan_dedup_map) <> 9 THEN
RAISE EXCEPTION 'Loan dedup mapping is incomplete: expected 9, got %',
(SELECT count(*) FROM loan_dedup_map);
END IF;
END $$;
-- Keep approval tasks only when the surviving formal loan is still pending.
UPDATE "ApprovalTask" task
SET "bizId" = mapping.new_id
FROM loan_dedup_map mapping
WHERE task."bizId" = mapping.old_id
AND mapping.new_status = 'PENDING';
DELETE FROM "ApprovalTask" task
USING loan_dedup_map mapping
WHERE task."bizId" = mapping.old_id;
DELETE FROM "TodoTask" task
USING loan_dedup_map mapping
WHERE task."bizId" = mapping.old_id;
UPDATE "FileAsset" file
SET "bizId" = mapping.new_id
FROM loan_dedup_map mapping
WHERE file."bizType" = 'LOAN'
AND file."bizId" = mapping.old_id;
DELETE FROM "LoanRecord" loan
USING loan_dedup_map mapping
WHERE loan.id = mapping.old_id;
COMMIT;