fix: 修复上行归属并实现签名质量日报优化
This commit is contained in:
@@ -0,0 +1,130 @@
|
||||
-- CreateTable
|
||||
CREATE TABLE "SignatureAnalyticsGeneration" (
|
||||
"id" TEXT NOT NULL,
|
||||
"businessDate" DATE NOT NULL,
|
||||
"sourceAsOf" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "SignatureAnalyticsGeneration_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "SignatureAnalyticsDay" (
|
||||
"businessDate" DATE NOT NULL,
|
||||
"publishedGenerationId" TEXT,
|
||||
"generatedAt" TIMESTAMP(3),
|
||||
"sourceAsOf" TIMESTAMP(3),
|
||||
"refreshFor" DATE,
|
||||
"state" TEXT NOT NULL DEFAULT 'missing',
|
||||
"error" TEXT,
|
||||
"provenance" TEXT NOT NULL DEFAULT 'daily',
|
||||
"schemaVersion" INTEGER NOT NULL DEFAULT 1,
|
||||
"rowCounts" JSONB,
|
||||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "SignatureAnalyticsDay_pkey" PRIMARY KEY ("businessDate")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "SignatureAnalyticsRun" (
|
||||
"id" TEXT NOT NULL,
|
||||
"scope" TEXT NOT NULL,
|
||||
"businessDate" DATE NOT NULL,
|
||||
"refreshFor" DATE NOT NULL,
|
||||
"generationId" TEXT NOT NULL,
|
||||
"state" TEXT NOT NULL DEFAULT 'pending',
|
||||
"owner" TEXT,
|
||||
"fence" INTEGER NOT NULL DEFAULT 0,
|
||||
"leaseUntil" TIMESTAMP(3),
|
||||
"attempt" INTEGER NOT NULL DEFAULT 0,
|
||||
"nextAttemptAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"checkpoint" JSONB,
|
||||
"error" TEXT,
|
||||
"startedAt" TIMESTAMP(3),
|
||||
"finishedAt" TIMESTAMP(3),
|
||||
|
||||
CONSTRAINT "SignatureAnalyticsRun_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "SignatureQualityDaily" (
|
||||
"generationId" TEXT NOT NULL,
|
||||
"businessDate" DATE NOT NULL,
|
||||
"signatureId" TEXT NOT NULL,
|
||||
"signatureName" TEXT NOT NULL,
|
||||
"tenantId" TEXT NOT NULL,
|
||||
"tenantName" TEXT NOT NULL,
|
||||
"applicationNames" TEXT NOT NULL,
|
||||
"total" INTEGER NOT NULL,
|
||||
"payload" JSONB NOT NULL,
|
||||
|
||||
CONSTRAINT "SignatureQualityDaily_pkey" PRIMARY KEY ("generationId","signatureId")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "SignatureActivityDaily" (
|
||||
"generationId" TEXT NOT NULL,
|
||||
"businessDate" DATE NOT NULL,
|
||||
"dimensionKey" TEXT NOT NULL,
|
||||
"dimensionType" TEXT NOT NULL,
|
||||
"signatureId" TEXT NOT NULL,
|
||||
"channelKey" TEXT NOT NULL,
|
||||
"carrier" TEXT NOT NULL,
|
||||
"tenantId" TEXT NOT NULL,
|
||||
"applicationId" TEXT,
|
||||
"signatureName" TEXT NOT NULL,
|
||||
"tenantName" TEXT NOT NULL,
|
||||
"applicationName" TEXT NOT NULL,
|
||||
"channelName" TEXT NOT NULL,
|
||||
"approvedAt" TIMESTAMP(3),
|
||||
"submittedAttempts" INTEGER NOT NULL,
|
||||
"acceptedBusinessCount" INTEGER NOT NULL,
|
||||
"deliveredBusinessCount" INTEGER NOT NULL,
|
||||
"applicability" TEXT NOT NULL,
|
||||
|
||||
CONSTRAINT "SignatureActivityDaily_pkey" PRIMARY KEY ("generationId","dimensionKey")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "UnreportedSignatureDaily" (
|
||||
"generationId" TEXT NOT NULL,
|
||||
"businessDate" DATE NOT NULL,
|
||||
"dimensionKey" TEXT NOT NULL,
|
||||
"tenantId" TEXT NOT NULL,
|
||||
"applicationId" TEXT NOT NULL,
|
||||
"signatureName" TEXT NOT NULL,
|
||||
"tenantName" TEXT NOT NULL,
|
||||
"applicationName" TEXT NOT NULL,
|
||||
"messageCount" INTEGER NOT NULL,
|
||||
|
||||
CONSTRAINT "UnreportedSignatureDaily_pkey" PRIMARY KEY ("generationId","dimensionKey")
|
||||
);
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "SignatureAnalyticsGeneration_id_businessDate_key" ON "SignatureAnalyticsGeneration"("id", "businessDate");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "SignatureAnalyticsRun_state_nextAttemptAt_idx" ON "SignatureAnalyticsRun"("state", "nextAttemptAt");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "SignatureAnalyticsRun_scope_businessDate_key" ON "SignatureAnalyticsRun"("scope", "businessDate");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "SignatureQualityDaily_businessDate_generationId_total_idx" ON "SignatureQualityDaily"("businessDate", "generationId", "total");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "SignatureActivityDaily_businessDate_generationId_dimensionT_idx" ON "SignatureActivityDaily"("businessDate", "generationId", "dimensionType", "acceptedBusinessCount");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE INDEX "UnreportedSignatureDaily_businessDate_generationId_messageC_idx" ON "UnreportedSignatureDaily"("businessDate", "generationId", "messageCount");
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "SignatureAnalyticsDay" ADD CONSTRAINT "SignatureAnalyticsDay_publishedGenerationId_businessDate_fkey" FOREIGN KEY ("publishedGenerationId", "businessDate") REFERENCES "SignatureAnalyticsGeneration"("id", "businessDate") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "SignatureQualityDaily" ADD CONSTRAINT "SignatureQualityDaily_generationId_businessDate_fkey" FOREIGN KEY ("generationId", "businessDate") REFERENCES "SignatureAnalyticsGeneration"("id", "businessDate") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "SignatureActivityDaily" ADD CONSTRAINT "SignatureActivityDaily_generationId_businessDate_fkey" FOREIGN KEY ("generationId", "businessDate") REFERENCES "SignatureAnalyticsGeneration"("id", "businessDate") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "UnreportedSignatureDaily" ADD CONSTRAINT "UnreportedSignatureDaily_generationId_businessDate_fkey" FOREIGN KEY ("generationId", "businessDate") REFERENCES "SignatureAnalyticsGeneration"("id", "businessDate") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
@@ -0,0 +1,4 @@
|
||||
-- Expression index matches the actual report/retirement time predicate, including legacy NULL submittedAt.
|
||||
-- Deliberately outside a transaction: online construction must not block SMS writes.
|
||||
CREATE INDEX CONCURRENTLY "SmsSubmitRecord_effective_at_idx"
|
||||
ON "SmsSubmitRecord" ((COALESCE("submittedAt", "createdAt")));
|
||||
@@ -2896,3 +2896,103 @@ model SmsCompletionEvent {
|
||||
work SmsAttemptCompletionWork @relation(fields: [workId], references: [id], onDelete: Restrict)
|
||||
@@index([workId, processedAt, createdAt])
|
||||
}
|
||||
|
||||
model SignatureAnalyticsGeneration {
|
||||
id String @id
|
||||
businessDate DateTime @db.Date
|
||||
sourceAsOf DateTime
|
||||
days SignatureAnalyticsDay[]
|
||||
quality SignatureQualityDaily[]
|
||||
activity SignatureActivityDaily[]
|
||||
unreported UnreportedSignatureDaily[]
|
||||
@@unique([id, businessDate])
|
||||
}
|
||||
|
||||
model SignatureAnalyticsDay {
|
||||
businessDate DateTime @id @db.Date
|
||||
publishedGenerationId String?
|
||||
publishedGeneration SignatureAnalyticsGeneration? @relation(fields: [publishedGenerationId, businessDate], references: [id, businessDate], onDelete: Restrict)
|
||||
generatedAt DateTime?
|
||||
sourceAsOf DateTime?
|
||||
refreshFor DateTime? @db.Date
|
||||
state String @default("missing")
|
||||
error String?
|
||||
provenance String @default("daily")
|
||||
schemaVersion Int @default(1)
|
||||
rowCounts Json?
|
||||
updatedAt DateTime @updatedAt
|
||||
}
|
||||
|
||||
model SignatureAnalyticsRun {
|
||||
id String @id @default(cuid())
|
||||
scope String
|
||||
businessDate DateTime @db.Date
|
||||
refreshFor DateTime @db.Date
|
||||
generationId String
|
||||
state String @default("pending")
|
||||
owner String?
|
||||
fence Int @default(0)
|
||||
leaseUntil DateTime?
|
||||
attempt Int @default(0)
|
||||
nextAttemptAt DateTime @default(now())
|
||||
checkpoint Json?
|
||||
error String?
|
||||
startedAt DateTime?
|
||||
finishedAt DateTime?
|
||||
@@unique([scope, businessDate])
|
||||
@@index([state, nextAttemptAt])
|
||||
}
|
||||
|
||||
model SignatureQualityDaily {
|
||||
generation SignatureAnalyticsGeneration @relation(fields: [generationId, businessDate], references: [id, businessDate], onDelete: Restrict)
|
||||
generationId String
|
||||
businessDate DateTime @db.Date
|
||||
signatureId String
|
||||
signatureName String
|
||||
tenantId String
|
||||
tenantName String
|
||||
applicationNames String
|
||||
total Int
|
||||
payload Json
|
||||
@@id([generationId, signatureId])
|
||||
@@index([businessDate, generationId, total])
|
||||
}
|
||||
|
||||
model SignatureActivityDaily {
|
||||
generation SignatureAnalyticsGeneration @relation(fields: [generationId, businessDate], references: [id, businessDate], onDelete: Restrict)
|
||||
generationId String
|
||||
businessDate DateTime @db.Date
|
||||
dimensionKey String
|
||||
dimensionType String
|
||||
signatureId String
|
||||
channelKey String
|
||||
carrier String
|
||||
tenantId String
|
||||
applicationId String?
|
||||
signatureName String
|
||||
tenantName String
|
||||
applicationName String
|
||||
channelName String
|
||||
approvedAt DateTime?
|
||||
submittedAttempts Int
|
||||
acceptedBusinessCount Int
|
||||
deliveredBusinessCount Int
|
||||
applicability String
|
||||
@@id([generationId, dimensionKey])
|
||||
@@index([businessDate, generationId, dimensionType, acceptedBusinessCount])
|
||||
}
|
||||
|
||||
model UnreportedSignatureDaily {
|
||||
generation SignatureAnalyticsGeneration @relation(fields: [generationId, businessDate], references: [id, businessDate], onDelete: Restrict)
|
||||
generationId String
|
||||
businessDate DateTime @db.Date
|
||||
dimensionKey String
|
||||
tenantId String
|
||||
applicationId String
|
||||
signatureName String
|
||||
tenantName String
|
||||
applicationName String
|
||||
messageCount Int
|
||||
@@id([generationId, dimensionKey])
|
||||
@@index([businessDate, generationId, messageCount])
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user