feat: add sms send chain phase

This commit is contained in:
hectorzhao
2026-07-01 13:39:26 +08:00
parent 56f835a00f
commit 27bb2d798a
11 changed files with 981 additions and 2 deletions
+202
View File
@@ -29,6 +29,12 @@ model Tenant {
riskRules RiskRule[]
smsSendTasks SmsSendTask[]
riskHitRecords RiskHitRecord[]
smsBatchTasks SmsBatchTask[]
smsMessageRecords SmsMessageRecord[]
smsApiRequests SmsApiRequest[]
smsSubmitRecords SmsSubmitRecord[]
smsReceiptRecords SmsReceiptRecord[]
smsUplinkMessages SmsUplinkMessage[]
}
model User {
@@ -47,6 +53,7 @@ model User {
auditRecords AuditRecord[]
createdSmsSendTasks SmsSendTask[] @relation("SmsSendTaskCreator")
reviewedSmsSendTasks SmsSendTask[] @relation("SmsSendTaskReviewer")
createdSmsBatchTasks SmsBatchTask[] @relation("SmsBatchTaskCreator")
}
model Role {
@@ -299,6 +306,8 @@ model SmsApplication {
signatures SmsSignature[]
templates SmsTemplate[]
sendTasks SmsSendTask[]
batchTasks SmsBatchTask[]
messageRecords SmsMessageRecord[]
@@index([tenantId, status])
}
@@ -370,6 +379,8 @@ model SmsTemplate {
signature SmsSignature? @relation(fields: [signatureId], references: [id])
variables TemplateVariable[]
sendTasks SmsSendTask[]
batchTasks SmsBatchTask[]
messageRecords SmsMessageRecord[]
@@index([tenantId, auditStatus])
@@index([applicationId])
@@ -433,6 +444,11 @@ model SmsChannel {
reportFields ChannelReportField[]
reportTasks ChannelSignatureReportTask[]
reportRecords ChannelSignatureReportRecord[]
messageRecords SmsMessageRecord[]
submitSessions CmppSubmitSession[]
submitRecords SmsSubmitRecord[]
receiptRecords SmsReceiptRecord[]
uplinkMessages SmsUplinkMessage[]
@@index([status])
}
@@ -685,3 +701,189 @@ model RiskHitRecord {
@@index([taskId])
@@index([ruleCode])
}
model SmsBatchTask {
id String @id @default(cuid())
tenantId String
applicationId String?
templateId String?
taskNo String @unique
sourceType String @default("client")
content String
category String?
phoneTotal Int
status String @default("created")
riskTaskId String?
auditStatus String @default("approved")
reviewReason String?
rejectReason String?
progressTotal Int @default(0)
submittedTotal Int @default(0)
successTotal Int @default(0)
failedTotal Int @default(0)
unknownTotal Int @default(0)
timeoutTotal Int @default(0)
createdById String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
tenant Tenant @relation(fields: [tenantId], references: [id])
application SmsApplication? @relation(fields: [applicationId], references: [id])
template SmsTemplate? @relation(fields: [templateId], references: [id])
createdBy User? @relation("SmsBatchTaskCreator", fields: [createdById], references: [id])
apiRequests SmsApiRequest[]
messages SmsMessageRecord[]
submitRecords SmsSubmitRecord[]
receiptRecords SmsReceiptRecord[]
@@index([tenantId, status, createdAt])
@@index([applicationId, createdAt])
}
model SmsApiRequest {
id String @id @default(cuid())
tenantId String
batchTaskId String
requestId String @unique
sourceIp String?
userAgent String?
payloadSummary Json?
status String @default("accepted")
createdAt DateTime @default(now())
tenant Tenant @relation(fields: [tenantId], references: [id])
batchTask SmsBatchTask @relation(fields: [batchTaskId], references: [id], onDelete: Cascade)
@@index([tenantId, createdAt])
@@index([batchTaskId])
}
model SmsMessageRecord {
id String @id @default(cuid())
tenantId String
batchTaskId String
applicationId String?
templateId String?
messageId String @unique
phoneNumber String
content String
billingUnits Int @default(1)
unitPrice Int @default(0)
amountCents Int @default(0)
channelId String?
submitId String?
gatewayMessageId String?
status String @default("queued")
submitStatus String?
receiptStatus String?
errorCode String?
errorMessage String?
queuedAt DateTime @default(now())
submittedAt DateTime?
deliveredAt DateTime?
timeoutAt DateTime?
updatedAt DateTime @updatedAt
tenant Tenant @relation(fields: [tenantId], references: [id])
batchTask SmsBatchTask @relation(fields: [batchTaskId], references: [id], onDelete: Cascade)
application SmsApplication? @relation(fields: [applicationId], references: [id])
template SmsTemplate? @relation(fields: [templateId], references: [id])
channel SmsChannel? @relation(fields: [channelId], references: [id])
submitRecords SmsSubmitRecord[]
receiptRecords SmsReceiptRecord[]
@@index([tenantId, status, queuedAt])
@@index([batchTaskId, status])
@@index([phoneNumber])
@@index([gatewayMessageId])
}
model CmppSubmitSession {
id String @id @default(cuid())
channelId String
sessionNo String @unique
status String @default("open")
submitTotal Int @default(0)
acceptedTotal Int @default(0)
rejectedTotal Int @default(0)
startedAt DateTime @default(now())
endedAt DateTime?
channel SmsChannel @relation(fields: [channelId], references: [id])
submitRecords SmsSubmitRecord[]
@@index([channelId, status])
}
model SmsSubmitRecord {
id String @id @default(cuid())
tenantId String
batchTaskId String
messageRecordId String
channelId String
sessionId String?
submitId String @unique
sequenceId Int?
gatewayMessageId String?
submitStatus String @default("queued")
errorCode String?
errorMessage String?
submittedAt DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
tenant Tenant @relation(fields: [tenantId], references: [id])
batchTask SmsBatchTask @relation(fields: [batchTaskId], references: [id], onDelete: Cascade)
messageRecord SmsMessageRecord @relation(fields: [messageRecordId], references: [id], onDelete: Cascade)
channel SmsChannel @relation(fields: [channelId], references: [id])
session CmppSubmitSession? @relation(fields: [sessionId], references: [id])
@@index([tenantId, createdAt])
@@index([messageRecordId])
@@index([gatewayMessageId])
}
model SmsReceiptRecord {
id String @id @default(cuid())
tenantId String
batchTaskId String?
messageRecordId String?
channelId String?
messageId String
gatewayMessageId String
sequenceId Int?
receiptStatus String
rawStatus String
errorCode String?
deliveredAt DateTime
createdAt DateTime @default(now())
tenant Tenant @relation(fields: [tenantId], references: [id])
batchTask SmsBatchTask? @relation(fields: [batchTaskId], references: [id])
messageRecord SmsMessageRecord? @relation(fields: [messageRecordId], references: [id])
channel SmsChannel? @relation(fields: [channelId], references: [id])
@@index([tenantId, createdAt])
@@index([messageId])
@@index([gatewayMessageId])
}
model SmsUplinkMessage {
id String @id @default(cuid())
tenantId String?
channelId String
messageId String?
sequenceId Int?
phoneNumber String
destId String
content String
receivedAt DateTime
createdAt DateTime @default(now())
tenant Tenant? @relation(fields: [tenantId], references: [id])
channel SmsChannel @relation(fields: [channelId], references: [id])
@@index([tenantId, createdAt])
@@index([channelId, receivedAt])
@@index([phoneNumber])
}