platform-assistant/apps/api/prisma/schema.prisma
Sisyphus afac18e843 feat(F002): W26 + W29.x + W30 + W31 平台助手全部改动首次 commit
- W26: NestJS API + Next.js Web + Prisma + SQLite scaffold
- W26: Lead 模型 + Crawler + 询价发布助手 (线索池 + 一键发布)
- W29.x: MCP 集成 (Integration 模型 + connectMcp + publish_rfq 5 工具端到端跑通)
- W30: 3 字段补充 (notes / quotationType / quotationDemand)
- W31 P1: 自动填 enterpriseId / userId (Prisma companyUserId 字段 + get_app_identity tool + lead.service.ts publishArgs)
- W31: detail 详情页 + admin UI 集成管理 (OpenAppListView + AuditLogListView)

关联: ~/Documents/02-平台开发/产品开发/F002-W31-交接文档.md
GIT-AUDIT-REPORT-2026-06-24.md
2026-06-24 11:07:11 +08:00

230 lines
6.3 KiB
Plaintext

generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "sqlite"
url = env("DATABASE_URL")
}
model Lead {
id String @id @default(uuid())
title String
noticeId String?
detailUrl String?
level String @default("C")
status String @default("待复核")
star Int @default(0)
amount String @default("待确认")
category String?
organization String?
region String?
regionDetail String? // 详细收货地址(区别于 region 省份/区域)
source String?
contact String?
phone String?
email String?
deadline String?
quantity Int? // 询价数量
unit String? // 单位(件/吨/米/台等)
attachments String? // JSON 数组字符串(附件 URL 列表)
summary String?
reason String?
analysisLogic String?
aiScore Float?
scoringDetails String?
publish String @default("未发布")
publishTime String? // 原始公告的发布时间(从抓取源读取)
publishedAt DateTime?
inquiryNo String?
direvUrl String?
assignedTo String?
followLogs String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@unique([source, noticeId])
}
model Rule {
id String @id @default(uuid())
name String
type String
config String
enabled Boolean @default(true)
userId String @default("default")
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model RuleVersion {
id String @id @default(uuid())
ruleId String
version Int
config String
userId String?
createdAt DateTime @default(now())
}
model Report {
id String @id @default(uuid())
title String
type String
status String @default("generating")
config String?
channels String?
fileUrl String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model AuditLog {
id String @id @default(uuid())
action String
detail String
operator String
ip String?
userId String @default("default")
createdAt DateTime @default(now())
}
model CrawlerConfig {
id String @id @default(uuid())
name String
targetUrl String
status String @default("active")
type String @default("bid")
sourceName String?
scriptPath String?
schedule String?
keywords String?
categories String?
lastRunAt DateTime?
totalRuns Int @default(0)
successRuns Int @default(0)
failedRuns Int @default(0)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model Inquiry {
id String @id @default(uuid())
title String
source String
url String
budget String?
deadline String?
buyer String
category String
status String @default("pending")
level String @default("C")
star Int @default(0)
region String?
contact String?
phone String?
aiScore Float?
assignedTo String?
inquiryNo String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model Product {
id String @id @default(uuid())
name String
spec String
unit String
price Float
quantity Int
imageUrl String?
category String
status String @default("draft")
brand String?
supplier String?
minOrder Int?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model Tenant {
id String @id @default(uuid())
companyName String
contactName String?
contactEmail String?
plan String @default("basic")
status String @default("active")
validFrom DateTime @default(now())
validUntil DateTime
platformType String?
platformUrl String?
platformApiKey String?
features String?
usageQuotas String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
users User[]
}
model User {
id String @id @default(uuid())
email String? @unique
username String? @unique
password String
name String?
phone String?
role String @default("user")
isActive Boolean @default(true)
tenantId String?
tenant Tenant? @relation(fields: [tenantId], references: [id])
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model GeneratedImage {
id String @id @default(uuid())
productName String
url String
status String @default("generating")
style String?
sourceHash String?
createdAt DateTime @default(now())
}
model ImageLibrary {
id String @id @default(uuid())
productName String
keyword String?
filePath String
source String @default("baidu")
style String?
ratio String?
createdAt DateTime @default(now())
}
model SystemConfig {
id String @id @default(uuid())
key String @unique
value String
group String @default("general")
description String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model Integration {
id String @id @default(uuid())
name String // 对接名称,如 "B2B 询价平台"
type String @default("mcp") // "mcp" | "http" | "custom"
endpoint String // MCP server 地址 (devbox 开发机), 如 "http://100.111.84.16:3002/mcp"
appId String? // B2B 运营后台"集成管理"申请到的 appId (公开 ID, 非敏感)
apiKey String? // appSecret (加密存储) - 对应 B2B 运营后台 app_secret
customerCode String? // 客户编码 (冗余, 实际由 MCP 验证后从 X-Customer-Code 头获取)
status String @default("inactive") // "active" | "inactive" | "error"
tools String? // JSON: 可用工具列表
lastConnected DateTime? // 最后成功连接时间
error String? // 最近错误信息
companyUserId String? // W31: 公司账号 ID (从 B2B 后端 open_api_app 表来, 用于一键发布时自动填 enterpriseId/userId; 用 String 存避免 JS Number 精度丢失)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}