\set ON_ERROR_STOP on BEGIN; DO $$ BEGIN IF EXISTS ( SELECT 1 FROM "ExpenseClaim" WHERE "tenantId" = '1' AND "claimNo" = 'BX-20260809-002' ) THEN RAISE EXCEPTION 'Expense BX-20260809-002 already exists'; END IF; END $$; WITH restored AS ( INSERT INTO "ExpenseClaim" ( id, "tenantId", "claimNo", "applicantId", "costType", "budgetCategory", "projectId", "expenseCategory", purpose, amount, status, "submittedAt", "createdAt" ) SELECT gen_random_uuid()::text, '1', 'BX-20260809-002', applicant.id, 'PROJECT', 'TRAVEL', project.id, '办公', '日常办公(江苏风影)', 689.08, 'DRAFT', TIMESTAMP '2026-08-09 21:39:30', TIMESTAMP '2026-08-09 21:39:30' FROM "User" applicant CROSS JOIN "Project" project WHERE applicant."displayName" = '戴永康' AND project."projectNo" = 'XM-20260609-002' RETURNING id ) INSERT INTO "ExpenseLine" ( id, "tenantId", "claimId", kind, amount, remark, "sortNo", "createdAt" ) SELECT gen_random_uuid()::text, '1', restored.id, line.kind, line.amount, line.remark, line.sort_no, TIMESTAMP '2026-08-09 21:39:30' FROM restored CROSS JOIN ( VALUES ('OFFICE', 122.65::numeric, 'OA平台短信通知费用', 1), ('OFFICE', 566.43::numeric, 'OA云服务器及流量费用', 2) ) AS line(kind, amount, remark, sort_no); DO $$ BEGIN IF (SELECT count(*) FROM "ExpenseClaim" WHERE "claimNo" = 'BX-20260809-002') <> 1 OR (SELECT count(*) FROM "ExpenseLine" line JOIN "ExpenseClaim" claim ON claim.id = line."claimId" WHERE claim."claimNo" = 'BX-20260809-002') <> 2 THEN RAISE EXCEPTION 'Expense BX-20260809-002 restore verification failed'; END IF; END $$; COMMIT;