feat: complete drainage review and admin search workflows

This commit is contained in:
hectorzhao
2026-07-14 09:58:18 +08:00
parent dec2430b7e
commit 6421671259
33 changed files with 1107 additions and 255 deletions
@@ -0,0 +1,78 @@
CREATE TABLE "SmsDrainageInfo" (
"id" TEXT NOT NULL,
"tenantId" TEXT NOT NULL,
"signatureId" TEXT NOT NULL,
"applicationId" TEXT,
"siteName" TEXT NOT NULL,
"url" TEXT NOT NULL,
"remark" TEXT,
"reportValues" JSONB,
"auditStatus" TEXT NOT NULL DEFAULT 'pending',
"rejectReason" TEXT,
"submittedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"reviewedAt" TIMESTAMP(3),
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "SmsDrainageInfo_pkey" PRIMARY KEY ("id")
);
CREATE TEMP TABLE drainage_backfill_map AS
SELECT
signature."id" AS "signatureId",
COALESCE(NULLIF(item.value->>'id', ''), item.ordinality::text) AS "oldId",
'drain_' || md5(signature."id" || ':' || COALESCE(NULLIF(item.value->>'id', ''), item.ordinality::text)) AS "newId",
signature."tenantId" AS "tenantId",
signature."applicationId" AS "applicationId",
item.value AS item
FROM "SmsSignature" signature
CROSS JOIN LATERAL jsonb_array_elements(COALESCE(signature."drainageInfo"->'links', '[]'::jsonb)) WITH ORDINALITY AS item(value, ordinality);
INSERT INTO "SmsDrainageInfo" (
"id", "tenantId", "signatureId", "applicationId", "siteName", "url", "remark", "reportValues",
"auditStatus", "submittedAt", "createdAt", "updatedAt"
)
SELECT
"newId",
"tenantId",
"signatureId",
"applicationId",
COALESCE(NULLIF(item->>'siteName', ''), '未命名站点'),
COALESCE(item->>'url', ''),
NULLIF(item->>'remark', ''),
COALESCE(item->'reportValues', '{}'::jsonb),
CASE WHEN item->>'auditStatus' IN ('pending', 'approved', 'rejected') THEN item->>'auditStatus' ELSE 'pending' END,
CURRENT_TIMESTAMP,
CURRENT_TIMESTAMP,
CURRENT_TIMESTAMP
FROM drainage_backfill_map;
UPDATE "ChannelSignatureReportTask" task
SET "drainageItemId" = map."newId"
FROM drainage_backfill_map map
WHERE task."signatureId" = map."signatureId"
AND task."reportType" = 'drainage'
AND task."drainageItemId" = map."oldId";
UPDATE "DrainageReportMaterial" material
SET "drainageItemId" = map."newId"
FROM drainage_backfill_map map
WHERE material."signatureId" = map."signatureId"
AND material."drainageItemId" = map."oldId";
DROP TABLE drainage_backfill_map;
CREATE INDEX "SmsDrainageInfo_tenantId_auditStatus_updatedAt_idx"
ON "SmsDrainageInfo"("tenantId", "auditStatus", "updatedAt");
CREATE INDEX "SmsDrainageInfo_signatureId_auditStatus_idx"
ON "SmsDrainageInfo"("signatureId", "auditStatus");
CREATE INDEX "SmsDrainageInfo_applicationId_idx"
ON "SmsDrainageInfo"("applicationId");
ALTER TABLE "SmsDrainageInfo" ADD CONSTRAINT "SmsDrainageInfo_tenantId_fkey"
FOREIGN KEY ("tenantId") REFERENCES "Tenant"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
ALTER TABLE "SmsDrainageInfo" ADD CONSTRAINT "SmsDrainageInfo_signatureId_fkey"
FOREIGN KEY ("signatureId") REFERENCES "SmsSignature"("id") ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE "SmsDrainageInfo" ADD CONSTRAINT "SmsDrainageInfo_applicationId_fkey"
FOREIGN KEY ("applicationId") REFERENCES "SmsApplication"("id") ON DELETE SET NULL ON UPDATE CASCADE;
ALTER TABLE "ChannelSignatureReportTask" ADD CONSTRAINT "ChannelSignatureReportTask_drainageItemId_fkey"
FOREIGN KEY ("drainageItemId") REFERENCES "SmsDrainageInfo"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
@@ -0,0 +1,2 @@
ALTER TABLE "ChannelSignatureReportRecord"
ADD COLUMN "sourceEntry" TEXT NOT NULL DEFAULT 'system';