- 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
230 lines
6.3 KiB
Plaintext
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
|
|
}
|