Initial commit: TradeMate 外贸小助手 MVP
项目结构: - backend/ Python FastAPI 后端 - uni-app/ uni-app跨端前端 - docs/ 设计文档 - docker-compose.yml Docker编排 - nginx/scripts/systemd 运维配置 已完成功能: - 用户认证 (JWT) - 智能翻译 + 回复建议 - 营销素材生成 - 客户管理 + 沉默检测 - 报价单管理 - 产品库管理 - 汇率换算 - 推送通知 (uni-push) - WhatsApp Webhook框架 - Celery定时任务
This commit is contained in:
@@ -0,0 +1,352 @@
|
||||
# 外贸小助手 (TradeMate) — API 设计文档
|
||||
|
||||
> 版本: v1.0
|
||||
> 创建日期: 2026-05-08
|
||||
|
||||
---
|
||||
|
||||
## 一、Base URL
|
||||
|
||||
```
|
||||
Production: https://api.trademate.example.com/api/v1
|
||||
Development: http://localhost:8000/api/v1
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 二、认证方式
|
||||
|
||||
采用 JWT Bearer Token 认证,请求 Header 中需携带:
|
||||
|
||||
```
|
||||
Authorization: Bearer <access_token>
|
||||
```
|
||||
|
||||
Token 刷新:access_token 有效期 24 小时,可使用 refresh_token 换新。
|
||||
|
||||
---
|
||||
|
||||
## 三、API 端点清单
|
||||
|
||||
### 1. 认证 API (`/auth`)
|
||||
|
||||
| 方法 | 路径 | 描述 | 认证 |
|
||||
|------|------|------|------|
|
||||
| POST | `/auth/register` | 用户注册 | 否 |
|
||||
| POST | `/auth/login` | 用户登录 | 否 |
|
||||
| POST | `/auth/refresh` | 刷新 Token | 是 |
|
||||
| GET | `/auth/me` | 获取当前用户信息 | 是 |
|
||||
|
||||
#### 注册
|
||||
```http
|
||||
POST /auth/register
|
||||
Content-Type: application/json
|
||||
|
||||
{
|
||||
"username": "string",
|
||||
"phone": "string",
|
||||
"password": "string"
|
||||
}
|
||||
```
|
||||
|
||||
#### 登录
|
||||
```http
|
||||
POST /auth/login
|
||||
Content-Type: application/json
|
||||
|
||||
{
|
||||
"username": "string",
|
||||
"password": "string"
|
||||
}
|
||||
```
|
||||
|
||||
响应:
|
||||
```json
|
||||
{
|
||||
"access_token": "string",
|
||||
"refresh_token": "string",
|
||||
"token_type": "bearer",
|
||||
"user": {
|
||||
"id": "uuid",
|
||||
"username": "string",
|
||||
"tier": "free"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 2. 客户管理 API (`/customers`)
|
||||
|
||||
| 方法 | 路径 | 描述 | 认证 |
|
||||
|------|------|------|------|
|
||||
| GET | `/customers` | 获取客户列表 | 是 |
|
||||
| GET | `/customers/silent` | 获取沉默客户列表 | 是 |
|
||||
| GET | `/customers/{id}` | 获取单个客户详情 | 是 |
|
||||
| POST | `/customers` | 创建新客户 | 是 |
|
||||
| PATCH | `/customers/{id}` | 更新客户信息 | 是 |
|
||||
| DELETE | `/customers/{id}` | 删除客户 | 是 |
|
||||
| GET | `/customers/{id}/conversation` | 获取客户对话记录 | 是 |
|
||||
|
||||
#### 列表查询参数
|
||||
- `status`: 筛选状态 (lead/negotiating/customer/lost)
|
||||
- `page`: 页码 (默认 1)
|
||||
- `size`: 每页数量 (默认 20)
|
||||
|
||||
#### 沉默客户
|
||||
```http
|
||||
GET /customers/silent?days=3
|
||||
```
|
||||
|
||||
响应:
|
||||
```json
|
||||
{
|
||||
"customers": [
|
||||
{
|
||||
"id": "uuid",
|
||||
"name": "Carlos",
|
||||
"country": "Mexico",
|
||||
"last_contact_at": "2026-05-01T10:00:00Z",
|
||||
"silence_days": 5
|
||||
}
|
||||
],
|
||||
"count": 10,
|
||||
"silence_days": 3
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 3. 翻译与回复 API (`/translate`)
|
||||
|
||||
| 方法 | 路径 | 描述 | 认证 |
|
||||
|------|------|------|------|
|
||||
| POST | `/translate` | 翻译文本 | 是 |
|
||||
| POST | `/translate/reply` | 生成回复建议 | 是 |
|
||||
| POST | `/translate/extract` | 提取关键信息 | 是 |
|
||||
| POST | `/translate/feedback` | 反馈翻译质量 | 是 |
|
||||
|
||||
#### 翻译
|
||||
```http
|
||||
POST /translate
|
||||
Authorization: Bearer <token>
|
||||
Content-Type: application/json
|
||||
|
||||
{
|
||||
"text": "How much for 500pcs FOB Shanghai?",
|
||||
"source": "en",
|
||||
"target": "zh"
|
||||
}
|
||||
```
|
||||
|
||||
响应:
|
||||
```json
|
||||
{
|
||||
"original": "How much for 500pcs FOB Shanghai?",
|
||||
"translated": "上海离岸价500件多少钱?",
|
||||
"provider": "deepl",
|
||||
"tokens_used": 45
|
||||
}
|
||||
```
|
||||
|
||||
#### 回复建议
|
||||
```http
|
||||
POST /translate/reply
|
||||
Authorization: Bearer <token>
|
||||
Content-Type: application/json
|
||||
|
||||
{
|
||||
"customer_message": "Hi, I'm interested in your outdoor chairs. Can you give me a quote for 500pcs?",
|
||||
"product_context": "户外折叠椅,承重150kg",
|
||||
"tone": "professional"
|
||||
}
|
||||
```
|
||||
|
||||
响应:
|
||||
```json
|
||||
{
|
||||
"suggestions": [
|
||||
{
|
||||
"text": "Thank you for your inquiry. Our FOB Shanghai price for 500pcs is $12.5/pc. Lead time is 25 days. Payment terms: T/T 30% deposit.",
|
||||
"tone": "professional",
|
||||
"reasoning": "Based on询价 context, direct quote with terms"
|
||||
},
|
||||
{
|
||||
"text": "Hi! Thanks for reaching out. I'd be happy to help you with our outdoor folding chairs. $12.5/pc for 500pcs, FOB Shanghai. Want more details?",
|
||||
"tone": "friendly",
|
||||
"reasoning": "More casual approach for initial contact"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 4. 营销素材 API (`/marketing`)
|
||||
|
||||
| 方法 | 路径 | 描述 | 认证 |
|
||||
|------|------|------|------|
|
||||
| POST | `/marketing/generate` | 生成营销文案 | 是 |
|
||||
| POST | `/marketing/keywords` | 生成关键词建议 | 是 |
|
||||
| POST | `/marketing/competitor-analysis` | 竞品分析 | 是 |
|
||||
|
||||
#### 生成文案
|
||||
```http
|
||||
POST /marketing/generate
|
||||
Authorization: Bearer <token>
|
||||
Content-Type: application/json
|
||||
|
||||
{
|
||||
"product_name": "户外折叠椅",
|
||||
"description": "承重150kg,防水面料,带杯架和扶手",
|
||||
"category": "furniture",
|
||||
"price": "$25",
|
||||
"target": "US importers",
|
||||
"style": "professional",
|
||||
"language": "en",
|
||||
"count": 3
|
||||
}
|
||||
```
|
||||
|
||||
响应:
|
||||
```json
|
||||
{
|
||||
"results": [
|
||||
"Premium Outdoor Folding Chair - 150kg Load Capacity, Waterproof Fabric, Cup Holder & Armrests. Perfect for patios, camping, and events. FDA certified manufacturer.",
|
||||
"Heavy-Duty Folding Chair: 150kg capacity, waterproof, portable. Ideal for restaurants, events, outdoor venues. MOQ: 100pcs. FOB Shanghai.",
|
||||
"Upgrade your outdoor seating! Our folding chairs feature reinforced steel frame, waterproof fabric, and convenient cup holder. Bulk orders welcome."
|
||||
],
|
||||
"product": "户外折叠椅",
|
||||
"target": "US importers",
|
||||
"count": 3
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 5. 报价单 API (`/quotations`)
|
||||
|
||||
| 方法 | 路径 | 描述 | 认证 |
|
||||
|------|------|------|------|
|
||||
| POST | `/quotations` | 创建报价单 | 是 |
|
||||
| GET | `/quotations` | 获取报价单列表 | 是 |
|
||||
| GET | `/quotations/{id}` | 获取报价单详情 | 是 |
|
||||
| PATCH | `/quotations/{id}/status` | 更新报价单状态 | 是 |
|
||||
|
||||
#### 创建报价单
|
||||
```http
|
||||
POST /quotations
|
||||
Authorization: Bearer <token>
|
||||
Content-Type: application/json
|
||||
|
||||
{
|
||||
"customer_id": "uuid",
|
||||
"title": "Quote for Outdoor Chairs",
|
||||
"currency": "USD",
|
||||
"payment_terms": "T/T 30% deposit",
|
||||
"delivery_terms": "FOB Shanghai",
|
||||
"lead_time": "25 days",
|
||||
"valid_until": "2026-06-08",
|
||||
"items": [
|
||||
{
|
||||
"product_name": "Outdoor Folding Chair",
|
||||
"description": "150kg capacity, waterproof",
|
||||
"quantity": 500,
|
||||
"unit_price": 12.5,
|
||||
"unit": "pcs"
|
||||
}
|
||||
],
|
||||
"discount": 0,
|
||||
"shipping": 0,
|
||||
"notes": "Sample quote"
|
||||
}
|
||||
```
|
||||
|
||||
响应:
|
||||
```json
|
||||
{
|
||||
"id": "uuid",
|
||||
"customer_id": "uuid",
|
||||
"title": "Quote for Outdoor Chairs",
|
||||
"status": "draft",
|
||||
"currency": "USD",
|
||||
"subtotal": 6250,
|
||||
"total": 6250,
|
||||
"items": [...],
|
||||
"text": "QUOTATION\n\nDate: 2026-05-08...",
|
||||
"created_at": "2026-05-08T10:00:00Z"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 6. WhatsApp API (`/whatsapp`)
|
||||
|
||||
| 方法 | 路径 | 描述 | 认证 |
|
||||
|------|------|------|------|
|
||||
| GET | `/whatsapp/webhook` | Webhook 验证 | 否 |
|
||||
| POST | `/whatsapp/webhook` | Webhook 接收消息 | 否 |
|
||||
| POST | `/whatsapp/send` | 发送消息 | 是 |
|
||||
| GET | `/whatsapp/qr` | 获取二维码 | 是 |
|
||||
|
||||
#### Webhook 验证
|
||||
```http
|
||||
GET /whatsapp/webhook?hub.mode=subscribe&hub.challenge=STRING&hub.verify_token=TOKEN
|
||||
```
|
||||
|
||||
#### 发送消息
|
||||
```http
|
||||
POST /whatsapp/send
|
||||
Authorization: Bearer <token>
|
||||
Content-Type: application/json
|
||||
|
||||
{
|
||||
"customer_id": "uuid",
|
||||
"message": "Thank you for your inquiry. Our price is $12.5/pc."
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 四、错误响应格式
|
||||
|
||||
```json
|
||||
{
|
||||
"error": "error_code",
|
||||
"detail": "具体错误描述",
|
||||
"timestamp": "2026-05-08T10:00:00Z"
|
||||
}
|
||||
```
|
||||
|
||||
常见错误码:
|
||||
- `UNAUTHORIZED`: 未认证
|
||||
- `FORBIDDEN`: 无权限
|
||||
- `NOT_FOUND`: 资源不存在
|
||||
- `QUOTA_EXCEEDED`: 配额超限
|
||||
- `TIER_LIMITED`: 订阅等级限制
|
||||
- `VALIDATION_ERROR`: 参数校验失败
|
||||
|
||||
---
|
||||
|
||||
## 五、速率限制
|
||||
|
||||
| 级别 | 请求限制 |
|
||||
|------|---------|
|
||||
| 免费版 | 100 请求/分钟 |
|
||||
| Pro版 | 500 请求/分钟 |
|
||||
| 企业版 | 2000 请求/分钟 |
|
||||
|
||||
---
|
||||
|
||||
## 六、WebSocket (可选)
|
||||
|
||||
实时翻译进度和消息推送:
|
||||
|
||||
```
|
||||
wss://api.trademate.example.com/ws/translate
|
||||
```
|
||||
|
||||
连接需携带 Token 参数:
|
||||
```
|
||||
wss://api.trademate.example.com/ws/translate?token=<access_token>
|
||||
```
|
||||
@@ -0,0 +1,388 @@
|
||||
# 外贸小助手 (TradeMate) — 数据库设计文档
|
||||
|
||||
> 版本: v1.0
|
||||
> 创建日期: 2026-05-08
|
||||
|
||||
---
|
||||
|
||||
## 一、数据库概述
|
||||
|
||||
- **数据库类型**: PostgreSQL 15 + pgvector
|
||||
- **字符集**: UTF-8
|
||||
- **时区**: UTC (存储), 应用层转换
|
||||
|
||||
---
|
||||
|
||||
## 二、实体关系图
|
||||
|
||||
```
|
||||
┌────────────────┐ ┌────────────────┐
|
||||
│ users │ │ products │
|
||||
├────────────────┤ ├────────────────┤
|
||||
│ id (PK) │◄──────│ user_id (FK) │
|
||||
│ wechat_openid │ │ id (PK) │
|
||||
│ phone │ │ name │
|
||||
│ username │ │ name_en │
|
||||
│ password_hash │ │ description │
|
||||
│ tier │ │ category │
|
||||
│ is_active │ │ price │
|
||||
│ settings (JSON)│ │ keywords (JSON)│
|
||||
│ created_at │ │ specifications │
|
||||
└───────┬────────┘ └────────────────┘
|
||||
│
|
||||
│ 1:N
|
||||
▼
|
||||
┌────────────────┐ ┌────────────────┐
|
||||
│ customers │ │ quotations │
|
||||
├────────────────┤ ├────────────────┤
|
||||
│ id (PK) │ │ id (PK) │
|
||||
│ user_id (FK) │ │ user_id (FK) │
|
||||
│ name │ │ customer_id(FK)│
|
||||
│ company │ │ title │
|
||||
│ country │ │ status │
|
||||
│ phone │ │ currency │
|
||||
│ whatsapp_id │ │ subtotal │
|
||||
│ status │ │ total │
|
||||
│ last_contact_at│ │ ... │
|
||||
└───────┬────────┘ └────────────────┘
|
||||
│
|
||||
│ 1:N
|
||||
▼
|
||||
┌────────────────┐ ┌────────────────┐
|
||||
│ conversations │ │ quotation_items│
|
||||
├────────────────┤ ├────────────────┤
|
||||
│ id (PK) │ │ id (PK) │
|
||||
│ user_id (FK) │ │ quotation_id │
|
||||
│ customer_id(FK)│ │ product_name │
|
||||
│ channel │ │ quantity │
|
||||
│ status │ │ unit_price │
|
||||
│ message_count │ │ total_price │
|
||||
└───────┬────────┘ └────────────────┘
|
||||
│
|
||||
│ 1:N
|
||||
▼
|
||||
┌────────────────┐
|
||||
│ messages │
|
||||
├────────────────┤
|
||||
│ id (PK) │
|
||||
│ conversation_id│
|
||||
│ direction │
|
||||
│ content │
|
||||
│ content_translt│
|
||||
│ ai_suggestions │
|
||||
└────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 三、表结构定义
|
||||
|
||||
### 3.1 用户表 (users)
|
||||
|
||||
```sql
|
||||
CREATE TABLE users (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
wechat_openid VARCHAR(255) UNIQUE,
|
||||
phone VARCHAR(20) UNIQUE,
|
||||
username VARCHAR(100),
|
||||
password_hash VARCHAR(255),
|
||||
tier VARCHAR(50) DEFAULT 'free',
|
||||
is_active BOOLEAN DEFAULT true,
|
||||
settings JSONB DEFAULT '{"preferred_translate_provider": "auto", "reply_tone": "professional"}',
|
||||
created_at TIMESTAMP DEFAULT NOW(),
|
||||
updated_at TIMESTAMP DEFAULT NOW()
|
||||
);
|
||||
|
||||
CREATE INDEX idx_users_wechat ON users(wechat_openid);
|
||||
CREATE INDEX idx_users_phone ON users(phone);
|
||||
```
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| id | UUID | 主键 |
|
||||
| wechat_openid | VARCHAR | 微信 OpenID (唯一) |
|
||||
| phone | VARCHAR | 手机号 (唯一) |
|
||||
| username | VARCHAR | 用户名 |
|
||||
| password_hash | VARCHAR | 密码 bcrypt 哈希 |
|
||||
| tier | VARCHAR | 订阅等级: free/pro/enterprise |
|
||||
| is_active | BOOLEAN | 账户状态 |
|
||||
| settings | JSONB | 用户偏好设置 |
|
||||
|
||||
---
|
||||
|
||||
### 3.2 产品表 (products)
|
||||
|
||||
```sql
|
||||
CREATE TABLE products (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||||
name VARCHAR(255) NOT NULL,
|
||||
name_en VARCHAR(255),
|
||||
description TEXT,
|
||||
description_en TEXT,
|
||||
category VARCHAR(100),
|
||||
price VARCHAR(50),
|
||||
price_unit VARCHAR(20) DEFAULT 'USD',
|
||||
moq VARCHAR(50),
|
||||
keywords JSONB DEFAULT '[]',
|
||||
specifications JSONB DEFAULT '{}',
|
||||
images JSONB DEFAULT '[]',
|
||||
is_active BOOLEAN DEFAULT true,
|
||||
created_at TIMESTAMP DEFAULT NOW(),
|
||||
updated_at TIMESTAMP DEFAULT NOW()
|
||||
);
|
||||
|
||||
CREATE INDEX idx_products_user ON products(user_id);
|
||||
```
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| id | UUID | 主键 |
|
||||
| user_id | UUID | 所属用户 |
|
||||
| name | VARCHAR | 产品名称 (中文) |
|
||||
| name_en | VARCHAR | 产品英文名 |
|
||||
| description | TEXT | 产品描述 |
|
||||
| price | VARCHAR | 价格 |
|
||||
| moq | VARCHAR | 最小起订量 |
|
||||
| keywords | JSONB | 关键词列表 |
|
||||
|
||||
---
|
||||
|
||||
### 3.3 客户表 (customers)
|
||||
|
||||
```sql
|
||||
CREATE TABLE customers (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||||
name VARCHAR(255) NOT NULL,
|
||||
company VARCHAR(255),
|
||||
country VARCHAR(100),
|
||||
phone VARCHAR(50),
|
||||
email VARCHAR(255),
|
||||
whatsapp_id VARCHAR(255),
|
||||
source VARCHAR(100),
|
||||
tags JSONB DEFAULT '[]',
|
||||
notes TEXT,
|
||||
preference JSONB DEFAULT '{}',
|
||||
status VARCHAR(50) DEFAULT 'lead',
|
||||
last_contact_at TIMESTAMP,
|
||||
silence_started_at TIMESTAMP,
|
||||
next_followup_at TIMESTAMP,
|
||||
estimated_value VARCHAR(50),
|
||||
created_at TIMESTAMP DEFAULT NOW(),
|
||||
updated_at TIMESTAMP DEFAULT NOW()
|
||||
);
|
||||
|
||||
CREATE INDEX idx_customers_user ON customers(user_id);
|
||||
CREATE INDEX idx_customers_status ON customers(status);
|
||||
CREATE INDEX idx_customers_last_contact ON customers(last_contact_at);
|
||||
```
|
||||
|
||||
**status 枚举值**:
|
||||
- `lead`: 潜在客户
|
||||
- `negotiating`: 谈判中
|
||||
- `customer`: 已成交客户
|
||||
- `lost`: 丢失客户
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| id | UUID | 主键 |
|
||||
| user_id | UUID | 所属用户 |
|
||||
| name | VARCHAR | 客户姓名 |
|
||||
| whatsapp_id | VARCHAR | WhatsApp ID |
|
||||
| status | VARCHAR | 客户状态 |
|
||||
| last_contact_at | TIMESTAMP | 最后联系时间 |
|
||||
| silence_started_at | TIMESTAMP | 沉默开始时间 |
|
||||
| next_followup_at | TIMESTAMP | 下次跟进时间 |
|
||||
|
||||
---
|
||||
|
||||
### 3.4 对话表 (conversations)
|
||||
|
||||
```sql
|
||||
CREATE TABLE conversations (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||||
customer_id UUID NOT NULL REFERENCES customers(id) ON DELETE CASCADE,
|
||||
channel VARCHAR(50) DEFAULT 'whatsapp',
|
||||
topic VARCHAR(255),
|
||||
status VARCHAR(50) DEFAULT 'active',
|
||||
message_count INTEGER DEFAULT 0,
|
||||
last_message_at TIMESTAMP,
|
||||
created_at TIMESTAMP DEFAULT NOW(),
|
||||
updated_at TIMESTAMP DEFAULT NOW()
|
||||
);
|
||||
|
||||
CREATE INDEX idx_conversations_user ON conversations(user_id);
|
||||
CREATE INDEX idx_conversations_customer ON conversations(customer_id);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 3.5 消息表 (messages)
|
||||
|
||||
```sql
|
||||
CREATE TABLE messages (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
conversation_id UUID NOT NULL REFERENCES conversations(id) ON DELETE CASCADE,
|
||||
direction VARCHAR(20) NOT NULL,
|
||||
content TEXT NOT NULL,
|
||||
content_translated TEXT,
|
||||
content_type VARCHAR(50) DEFAULT 'text',
|
||||
ai_suggestions JSONB,
|
||||
selected_suggestion INTEGER,
|
||||
user_edited TEXT,
|
||||
status VARCHAR(50) DEFAULT 'sent',
|
||||
metadata JSONB DEFAULT '{}',
|
||||
created_at TIMESTAMP DEFAULT NOW()
|
||||
);
|
||||
|
||||
CREATE INDEX idx_messages_conversation ON messages(conversation_id);
|
||||
```
|
||||
|
||||
**direction 枚举值**:
|
||||
- `inbound`: 客户发来
|
||||
- `outbound`: 用户发出
|
||||
|
||||
---
|
||||
|
||||
### 3.6 报价单表 (quotations)
|
||||
|
||||
```sql
|
||||
CREATE TABLE quotations (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||||
customer_id UUID REFERENCES customers(id),
|
||||
title VARCHAR(255),
|
||||
status VARCHAR(50) DEFAULT 'draft',
|
||||
currency VARCHAR(10) DEFAULT 'USD',
|
||||
exchange_rate FLOAT,
|
||||
payment_terms VARCHAR(255),
|
||||
delivery_terms VARCHAR(255),
|
||||
lead_time VARCHAR(100),
|
||||
valid_until VARCHAR(100),
|
||||
subtotal FLOAT,
|
||||
discount FLOAT DEFAULT 0,
|
||||
shipping FLOAT DEFAULT 0,
|
||||
total FLOAT,
|
||||
notes TEXT,
|
||||
pdf_url TEXT,
|
||||
sent_at TIMESTAMP,
|
||||
created_at TIMESTAMP DEFAULT NOW(),
|
||||
updated_at TIMESTAMP DEFAULT NOW()
|
||||
);
|
||||
|
||||
CREATE INDEX idx_quotations_user ON quotations(user_id);
|
||||
CREATE INDEX idx_quotations_customer ON quotations(customer_id);
|
||||
CREATE INDEX idx_quotations_status ON quotations(status);
|
||||
```
|
||||
|
||||
**status 枚举值**:
|
||||
- `draft`: 草稿
|
||||
- `sent`: 已发送
|
||||
- `accepted`: 已接受
|
||||
- `rejected`: 已拒绝
|
||||
- `expired`: 已过期
|
||||
|
||||
---
|
||||
|
||||
### 3.7 报价单项表 (quotation_items)
|
||||
|
||||
```sql
|
||||
CREATE TABLE quotation_items (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
quotation_id UUID NOT NULL REFERENCES quotations(id) ON DELETE CASCADE,
|
||||
product_name VARCHAR(255) NOT NULL,
|
||||
description TEXT,
|
||||
quantity INTEGER NOT NULL,
|
||||
unit_price FLOAT NOT NULL,
|
||||
total_price FLOAT,
|
||||
unit VARCHAR(50) DEFAULT 'pcs'
|
||||
);
|
||||
|
||||
CREATE INDEX idx_quotation_items_quotation ON quotation_items(quotation_id);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 3.8 语料库表 (corpus_entries)
|
||||
|
||||
```sql
|
||||
CREATE TABLE corpus_entries (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
source_text TEXT NOT NULL,
|
||||
target_text TEXT NOT NULL,
|
||||
source_lang VARCHAR(20),
|
||||
target_lang VARCHAR(20),
|
||||
task_type VARCHAR(50) NOT NULL,
|
||||
domain VARCHAR(100) DEFAULT 'general',
|
||||
provider_used VARCHAR(50),
|
||||
quality_score FLOAT DEFAULT 0.5,
|
||||
user_edited BOOLEAN DEFAULT false,
|
||||
user_rating INTEGER,
|
||||
usage_count INTEGER DEFAULT 0,
|
||||
embedding VECTOR(768),
|
||||
metadata JSONB DEFAULT '{}',
|
||||
created_at TIMESTAMP DEFAULT NOW()
|
||||
);
|
||||
|
||||
CREATE INDEX idx_corpus_task ON corpus_entries(task_type);
|
||||
CREATE INDEX idx_corpus_domain ON corpus_entries(domain);
|
||||
CREATE INDEX idx_corpus_embedding ON corpus_entries USING ivfflat (embedding vector_cosine_ops);
|
||||
```
|
||||
|
||||
**task_type 枚举值**:
|
||||
- `translation`: 翻译
|
||||
- `reply_suggestion`: 回复建议
|
||||
- `marketing_copy`: 营销文案
|
||||
|
||||
---
|
||||
|
||||
## 四、pgvector 扩展
|
||||
|
||||
```sql
|
||||
CREATE EXTENSION IF NOT EXISTS vector;
|
||||
```
|
||||
|
||||
语料库表使用向量存储,支持语义相似度搜索:
|
||||
|
||||
```sql
|
||||
-- 查找相似翻译
|
||||
SELECT * FROM corpus_entries
|
||||
WHERE task_type = 'translation'
|
||||
ORDER BY embedding <=> query_embedding
|
||||
LIMIT 5;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 五、索引策略
|
||||
|
||||
| 表 | 索引 | 用途 |
|
||||
|---|------|------|
|
||||
| users | wechat_openid, phone | 登录查询 |
|
||||
| products | user_id | 用户产品列表 |
|
||||
| customers | user_id, status, last_contact_at | 客户列表、沉默检测 |
|
||||
| conversations | user_id, customer_id | 对话查询 |
|
||||
| messages | conversation_id | 消息历史 |
|
||||
| quotations | user_id, customer_id, status | 报价单管理 |
|
||||
| corpus_entries | task_type, domain, embedding | 语料检索 |
|
||||
|
||||
---
|
||||
|
||||
## 六、数据保留策略
|
||||
|
||||
| 数据类型 | 保留期限 | 原因 |
|
||||
|---------|---------|------|
|
||||
| 用户数据 | 永久 | 业务核心 |
|
||||
| 客户数据 | 永久 | 业务核心 |
|
||||
| 消息数据 | 2年 | 对话历史 |
|
||||
| 报价单数据 | 3年 | 订单追溯 |
|
||||
| 语料数据 | 永久 | AI训练 |
|
||||
| 日志数据 | 90天 | 调试审计 |
|
||||
|
||||
---
|
||||
|
||||
## 七、迁移脚本
|
||||
|
||||
使用 Alembic 进行数据库迁移,初始迁移见 `backend/alembic/versions/001_initial.py`。
|
||||
@@ -0,0 +1,250 @@
|
||||
# 外贸小助手 (TradeMate) — 产品设计文档
|
||||
|
||||
> 版本: v1.0
|
||||
> 创建日期: 2026-05-08
|
||||
> 状态: 初始设计
|
||||
|
||||
---
|
||||
|
||||
## 一、产品定位
|
||||
|
||||
### 1.1 一句话定义
|
||||
|
||||
> **微信里的外贸成交助理——帮不懂英文、不懂营销的中小企业,把客户询盘变成订单。**
|
||||
|
||||
### 1.2 目标用户
|
||||
|
||||
| 画像 | 特征 | 典型场景 |
|
||||
|------|------|---------|
|
||||
| **个体外贸SOHO** | 1-2人,什么都自己干 | 每天都在回WhatsApp消息,顾不上主动开发客户 |
|
||||
| **小型外贸公司老板** | 10-30人,团队没有专业营销 | 员工英文一般,发了开发信没人回复就不知道怎么继续 |
|
||||
| **工厂转型外贸** | 原来做内销,刚开阿里国际站 | 有产品优势,但不会写英文文案,不知道怎么跟老外沟通 |
|
||||
|
||||
### 1.3 核心洞察
|
||||
|
||||
外贸成交的本质是三个动作:
|
||||
```
|
||||
收到询盘 → 看懂意思 → 回复报价 → 跟进催单
|
||||
↑ ↑
|
||||
用户卡在这里 用户卡在这里
|
||||
(英文不好) (不知道怎么跟进)
|
||||
```
|
||||
|
||||
**我们只解决这三件事,别的都不做。**
|
||||
|
||||
---
|
||||
|
||||
## 二、功能设计
|
||||
|
||||
### 2.1 功能全景图
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────┐
|
||||
│ 外贸小助手 │
|
||||
│ │
|
||||
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
|
||||
│ │ 营销素材 │ │ 智能沟通 │ │ 客户跟进 │ │
|
||||
│ │ 工厂 │ │ 助手 │ │ 引擎 │ │
|
||||
│ ├──────────┤ ├──────────┤ ├──────────┤ │
|
||||
│ │ 开发信 │ │ 消息翻译 │ │ 沉默检测 │ │
|
||||
│ │ 产品文案 │ │ 回复建议 │ │ 跟进提醒 │ │
|
||||
│ │ 关键词 │ │ 一键发送 │ │ 话术推荐 │ │
|
||||
│ │ 竞品分析 │ │ 语气调整 │ │ 周期提醒 │ │
|
||||
│ └──────────┘ └──────────┘ └──────────┘ │
|
||||
│ │
|
||||
│ ┌─────────────────────────────────────────┐ │
|
||||
│ │ 跨功能支撑: 报价单生成 / 汇率换算 │ │
|
||||
│ └─────────────────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 2.2 功能一:营销素材工厂(帮用户"有内容可发")
|
||||
|
||||
#### 用户场景
|
||||
> "我想给美国客户发邮件推广我的户外折叠椅,但我不知道英文怎么写,也不知道怎么写才有吸引力。"
|
||||
|
||||
#### 交互流程
|
||||
|
||||
```
|
||||
[用户打开小程序]
|
||||
└─ 点击"营销素材"
|
||||
└─ 输入: "户外折叠椅,承重150kg,防水面料,带杯架和扶手"
|
||||
└─ 选择: ①英文开发信 ②WhatsApp开场白 ③产品描述 ④关键词建议
|
||||
└─ AI生成→用户左右滑动筛选→保存→一键复制
|
||||
|
||||
[用户过几天再来]
|
||||
└─ 点击"换一批" → AI 基于同样产品生成不同角度的话术
|
||||
└─ 点击"效果追踪" → 可以看到哪些文案被复制/发送了多少次
|
||||
```
|
||||
|
||||
#### 核心机制
|
||||
|
||||
- 每个用户有自己的**产品库**(首次输入后系统保存)
|
||||
- 同一个产品可以生成不同风格(正式/亲切/促销)
|
||||
- 不同目标国家生成适配当地习惯的文案
|
||||
- **关键**: AI 不是一次性生成,而是持续迭代——用户保存的文案越多,系统越懂用户的偏好风格
|
||||
|
||||
### 2.3 功能二:智能沟通助手(帮用户"看懂+回好")
|
||||
|
||||
#### 用户场景
|
||||
> "客户在WhatsApp发了一大段英文,我大概能看懂一些,但不知道怎么回,怕写错了让客户觉得不专业。"
|
||||
|
||||
#### 交互流程
|
||||
|
||||
```
|
||||
[客户发来 WhatsApp 消息]
|
||||
└─ 系统自动翻译成中文(显示在客户消息下方)
|
||||
└─ 同时给出 3 个回复选项:
|
||||
① 快速报价(如果消息是询价)
|
||||
② 专业回复(通用商务场景)
|
||||
③ 亲切回复(如果客户是老客户)
|
||||
└─ 用户选择一个 → 自动填入对话输入框 → 用户可编辑 → 发送
|
||||
|
||||
[用户主动发起]
|
||||
└─ 打开小程序 → 输入中文 → 选择语气 → AI 翻译成英文
|
||||
└─ 支持: 文字转语音(方便用户确认发音)
|
||||
```
|
||||
|
||||
#### 核心机制
|
||||
|
||||
- **翻译质量领先**:结合 DeepL + OpenAI + 外贸术语库,翻译"MOQ、FOB、lead time"等术语准确
|
||||
- **回复建议有上下文**:基于聊天历史 + 产品库 + 客户画像,不是通用 ChatGPT 式回复
|
||||
- **用户微调记录**:用户每次编辑 AI 建议后再发送,系统记录差异,未来建议自动适配用户风格
|
||||
|
||||
#### 翻译 vs 回复建议 的边界
|
||||
|
||||
| 场景 | 做什么 | 用哪个引擎 |
|
||||
|------|--------|-----------|
|
||||
| 用户想看懂客户消息 | 翻译(直译,保留原意) | DeepL(准确) |
|
||||
| 用户想回复客户 | 生成回复建议(意译,优化表达) | OpenAI/Claude(生成质量高) |
|
||||
| 用户想写营销文案 | 生成创意内容 | Claude(写作最优) |
|
||||
| 用户需要正式报价 | 生成结构化报价单 | OpenAI(结构化能力强) |
|
||||
|
||||
### 2.4 功能三:客户跟进引擎(帮用户"不丢单")
|
||||
|
||||
#### 用户场景
|
||||
> "上周报完价客户就没消息了,我也不知道该不该再发消息,发了怕烦到客户,不发怕被别人抢走。"
|
||||
|
||||
#### 交互流程
|
||||
|
||||
```
|
||||
[系统自动检测]
|
||||
└─ 客户沉默 3 天 → 推送提醒:
|
||||
"客户 Carlos (墨西哥) 已沉默3天,建议发送跟进消息"
|
||||
└─ 提供跟进话术(基于上次聊天内容定制)
|
||||
|
||||
└─ 客户沉默 7 天 → 升级提醒:
|
||||
"客户已沉默1周,建议发送限时优惠或新产品信息"
|
||||
└─ 提供促销话术 + 可选折扣模板
|
||||
|
||||
[用户主动查看]
|
||||
└─ 打开"客户"页面 → 按沉默天数排序
|
||||
└─ 每个客户显示: 最后联系时间、沉默天数、建议动作
|
||||
└─ 一键发送跟进消息
|
||||
```
|
||||
|
||||
#### 核心机制
|
||||
|
||||
- **沉默检测规则**:
|
||||
- 3天无回复 = 轻度沉默 → 跟进提醒
|
||||
- 7天无回复 = 中度沉默 → 升级提醒 + 提供优惠话术
|
||||
- 14天无回复 = 重度沉默 → 建议换话题(发新品/行业资讯/节日问候)
|
||||
- **行业基准对比**:跨用户匿名统计不同国家客户的回复率基线,帮助判断"这个客户是不是真的没意向"
|
||||
- **最佳发送时间**:基于历史数据推荐(如拉美客户下午3-5点回复率高)
|
||||
|
||||
### 2.5 跨功能支撑:报价单生成
|
||||
|
||||
#### 场景
|
||||
> "客户问价格了,我得赶紧报个价。但报价单要用英文写,还要算运费、汇率……"
|
||||
|
||||
#### 功能
|
||||
|
||||
```
|
||||
客户说 "How much for 500pcs FOB Shanghai?"
|
||||
|
||||
系统:
|
||||
- 识别出:FOB上海、500件、询价
|
||||
- 自动调取用户产品库里的价格($12.5/pc)
|
||||
- 显示当前汇率(USD/CNY)
|
||||
- 生成报价草稿:
|
||||
"FOB Shanghai: $12.5/pc
|
||||
Total: $6,250
|
||||
Lead time: 25 days
|
||||
Payment: T/T 30% deposit"
|
||||
- 用户确认 → 生成正式报价单图片 → 一键发送
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 三、用户旅程
|
||||
|
||||
### 3.1 首次使用(30秒上手)
|
||||
|
||||
```
|
||||
1. 扫码打开小程序 → 微信授权登录
|
||||
2. 输入产品信息(中文): "你主要卖什么?"
|
||||
└─ 示例: "户外折叠椅,主要出口欧美"
|
||||
3. 系统自动:
|
||||
├─ 生成 5 条开发信模板
|
||||
├─ 生成 5 条 WhatsApp 开场白
|
||||
└─ 保存产品到我的产品库
|
||||
4. 引导到"客户"页面 → 提示"可以导入或手动添加客户"
|
||||
5. 完成。全程 < 30 秒。
|
||||
```
|
||||
|
||||
### 3.2 日常使用
|
||||
|
||||
```
|
||||
早上:
|
||||
└─ 打开小程序 → 看"待跟进"列表 → 选择1-2个客户发跟进消息
|
||||
|
||||
白天:
|
||||
└─ WhatsApp 收到消息 → 切到小程序翻译 → 复制回复
|
||||
|
||||
晚上:
|
||||
└─ 打开小程序 → 看今日概览(回复了几个客户、几个沉默)→ 准备明天的跟进
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 四、数据模型概要
|
||||
|
||||
| 实体 | 核心字段 | 用途 |
|
||||
|------|---------|------|
|
||||
| 用户 | tier, 产品库 | 账户+订阅 |
|
||||
| 产品 | 名称, 描述, 价格, 规格, 关键词 | 用户自己的产品信息 |
|
||||
| 客户 | 姓名, 国家, WhatsApp, 来源, 标签 | 客户管理 |
|
||||
| 对话 | 消息, 翻译, 回复, 状态 | 沟通记录 |
|
||||
| 报价单 | 产品, 数量, 价格, 条款, 状态 | 报价管理 |
|
||||
| 语料条目 | 源文, 译文, 领域, 质量评分 | AI 训练数据 |
|
||||
|
||||
---
|
||||
|
||||
## 五、护城河策略
|
||||
|
||||
详见 `TECH_ARCHITECTURE.md` 第 5 章,核心三层:
|
||||
|
||||
1. **外贸垂直语料库**:用户每次使用产生的翻译/回复数据,积累成行业专属语料
|
||||
2. **用户产品知识库**:产品信息+客户偏好+历史报价,迁移成本极高
|
||||
3. **沉默客户模式算法**:跨用户行为数据产生的预测能力,网络效应
|
||||
|
||||
---
|
||||
|
||||
## 六、盈利模式
|
||||
|
||||
| 层级 | 价格 | 能力 |
|
||||
|------|------|------|
|
||||
| 免费版 | ¥0 | 1个产品、20次翻译/天、5个客户、基础回复建议 |
|
||||
| Pro版 | ¥99/月 | 10个产品、无限翻译、50个客户、跟进提醒、报价单 |
|
||||
| 企业版 | ¥399/月 | 无限产品、多人协作、品牌报价单、专属语料训练、API |
|
||||
|
||||
---
|
||||
|
||||
## 七、路线图
|
||||
|
||||
| 阶段 | 时间 | 功能 |
|
||||
|------|------|------|
|
||||
| MVP | 第1-4周 | 智能翻译+回复建议+基础营销素材+产品库 |
|
||||
| V2 | 第5-8周 | 沉默客户跟进+WhatsApp集成+报价单生成 |
|
||||
| V3 | 第9-12周 | 语料库训练+回复质量优化+多人协作 |
|
||||
| V4 | 第13-16周 | 跨用户A/B测试+预测算法+API开放 |
|
||||
@@ -0,0 +1,235 @@
|
||||
# 外贸小助手 (TradeMate) — 项目进度文档
|
||||
|
||||
> 版本: v1.0
|
||||
> 更新日期: 2026-05-08
|
||||
> 状态: MVP开发中
|
||||
|
||||
---
|
||||
|
||||
## 一、项目概述
|
||||
|
||||
**项目名称**: 外贸小助手 (TradeMate)
|
||||
**项目类型**: 微信小程序 + 后端API
|
||||
**目标用户**: 外贸SOHO、小型外贸公司、工厂转型外贸
|
||||
|
||||
---
|
||||
|
||||
## 二、功能实现总览
|
||||
|
||||
### 2.1 已完成功能 ✅
|
||||
|
||||
| 功能模块 | 后端API | 前端页面 | 状态 |
|
||||
|---------|---------|---------|------|
|
||||
| **用户认证** | /auth/register, login, refresh, me, settings | 登录页 | ✅ |
|
||||
| **智能翻译** | /translate, /reply, /extract, /feedback | 翻译页 | ✅ |
|
||||
| **回复建议** | /translate/reply (3种语气) | 翻译页 | ✅ |
|
||||
| **营销素材** | /marketing/generate, /keywords, /competitor-analysis | 营销页 | ✅ |
|
||||
| **客户管理** | /customers CRUD, /silent, /conversation | 客户页 | ✅ |
|
||||
| **沉默检测** | /customers/silent (3/7/14天) | 客户页 | ✅ |
|
||||
| **报价单** | /quotations CRUD, /status | 报价页 | ✅ |
|
||||
| **产品库** | /products CRUD | 产品页 | ✅ |
|
||||
| **汇率换算** | /exchange/convert, /rates | (待集成) | ✅ |
|
||||
| **推送通知** | /push/register, /send, /devices | (uni-push) | ✅ |
|
||||
| **WhatsApp** | /whatsapp/webhook, /send, /qr | (框架) | ✅ |
|
||||
| **定时任务** | Celery tasks | - | ✅ |
|
||||
|
||||
**前端页面**:
|
||||
- 登录页 (pages/login)
|
||||
- 首页仪表盘 (pages/index)
|
||||
- 翻译+回复 (pages/translate)
|
||||
- 客户管理 (pages/customers)
|
||||
- 营销素材 (pages/marketing)
|
||||
- 报价单 (pages/quotation)
|
||||
- 产品库 (pages/product)
|
||||
- 自定义TabBar
|
||||
|
||||
### 2.2 未完成功能 ❌
|
||||
|
||||
| 功能 | 优先级 | 说明 |
|
||||
|------|--------|------|
|
||||
| **微信登录** | 高 | 需配置微信开放平台OAuth |
|
||||
| **WhatsApp真实集成** | 高 | 需注册Meta Business,配置真实API |
|
||||
| **报价单PDF生成** | 中 | 需集成 weasyprint 库 |
|
||||
| **文字转语音(TTS)** | 中 | uni-app 有对应API |
|
||||
| **批量导入客户** | 中 | 需集成文件上传+xlsx解析 |
|
||||
| **Web管理后台** | 低 | 设计中有,未实现 |
|
||||
| **数据分析报表** | 低 | 首页数据目前为模拟 |
|
||||
| **多人协作/团队** | 低 | 企业版功能 |
|
||||
| **语料库训练** | 低 | V3功能,仅框架 |
|
||||
|
||||
### 2.3 缺失文档
|
||||
|
||||
- [x] 产品设计文档 (PRODUCT_DESIGN.md)
|
||||
- [x] 技术架构文档 (TECH_ARCHITECTURE.md)
|
||||
- [x] API设计文档 (API_DESIGN.md)
|
||||
- [x] 数据库设计文档 (DATABASE_SCHEMA.md)
|
||||
- [ ] 项目进度文档 (本文档) ✅
|
||||
|
||||
---
|
||||
|
||||
## 三、技术栈
|
||||
|
||||
### 3.1 后端
|
||||
|
||||
| 技术 | 版本 | 用途 |
|
||||
|------|------|------|
|
||||
| Python | 3.11+ | 运行环境 |
|
||||
| FastAPI | latest | Web框架 |
|
||||
| SQLAlchemy | 2.0+ | ORM |
|
||||
| PostgreSQL | 15 | 主数据库 |
|
||||
| pgvector | latest | 向量数据库 |
|
||||
| Redis | 7 | 缓存/队列 |
|
||||
| Celery | 5.0+ | 定时任务 |
|
||||
| AI Providers | - | DeepL/OpenAI/Claude |
|
||||
|
||||
### 3.2 前端
|
||||
|
||||
| 技术 | 版本 | 用途 |
|
||||
|------|------|------|
|
||||
| uni-app | 3.0+ | 跨端框架 |
|
||||
| Vue | 3.4+ | UI框架 |
|
||||
| Sass/SCSS | - | 样式预处理 |
|
||||
| uni-push | 2.0 | 推送服务 |
|
||||
|
||||
### 3.3 部署
|
||||
|
||||
| 技术 | 用途 |
|
||||
|------|------|
|
||||
| Docker | 容器化 |
|
||||
| Docker Compose | 编排 |
|
||||
| Nginx | 反向代理 |
|
||||
| Systemd | 进程管理 |
|
||||
|
||||
---
|
||||
|
||||
## 四、目录结构
|
||||
|
||||
```
|
||||
trade-assistant/
|
||||
├── docs/ # 设计文档
|
||||
│ ├── PRODUCT_DESIGN.md # 产品设计
|
||||
│ ├── TECH_ARCHITECTURE.md # 技术架构
|
||||
│ ├── API_DESIGN.md # API接口
|
||||
│ ├── DATABASE_SCHEMA.md # 数据库设计
|
||||
│ └── PROJECT_STATUS.md # 项目进度
|
||||
│
|
||||
├── backend/ # Python后端
|
||||
│ ├── app/
|
||||
│ │ ├── main.py # FastAPI入口
|
||||
│ │ ├── config.py # 配置
|
||||
│ │ ├── database.py # 数据库连接
|
||||
│ │ ├── celery_app.py # Celery配置
|
||||
│ │ ├── models/ # 数据模型
|
||||
│ │ │ ├── user.py # 用户+产品
|
||||
│ │ │ ├── customer.py # 客户+对话+消息
|
||||
│ │ │ ├── quotation.py # 报价单+明细
|
||||
│ │ │ └── corpus.py # 语料库
|
||||
│ │ ├── api/v1/ # REST API
|
||||
│ │ │ ├── auth.py # 认证
|
||||
│ │ │ ├── translate.py # 翻译
|
||||
│ │ │ ├── marketing.py # 营销
|
||||
│ │ │ ├── customer.py # 客户
|
||||
│ │ │ ├── quotation.py # 报价单
|
||||
│ │ │ ├── product.py # 产品
|
||||
│ │ │ ├── exchange.py # 汇率
|
||||
│ │ │ ├── push.py # 推送
|
||||
│ │ │ └── whatsapp.py # WhatsApp
|
||||
│ │ ├── services/ # 业务逻辑
|
||||
│ │ ├── ai/ # AI抽象层
|
||||
│ │ │ ├── router.py # 智能路由
|
||||
│ │ │ ├── trade_corpus.py # 语料库
|
||||
│ │ │ └── providers/ # 各引擎实现
|
||||
│ │ ├── core/ # 核心组件
|
||||
│ │ │ ├── security.py # JWT认证
|
||||
│ │ │ ├── exceptions.py # 异常处理
|
||||
│ │ │ └── middleware.py # 中间件
|
||||
│ │ └── workers/ # Celery任务
|
||||
│ │ └── tasks.py
|
||||
│ ├── alembic/ # 数据库迁移
|
||||
│ ├── requirements.txt
|
||||
│ ├── Dockerfile
|
||||
│ └── .env.example
|
||||
│
|
||||
├── uni-app/ # uni-app前端
|
||||
│ ├── src/
|
||||
│ │ ├── pages/ # 页面
|
||||
│ │ │ ├── login/ # 登录
|
||||
│ │ │ ├── index/ # 首页
|
||||
│ │ │ ├── translate/ # 翻译
|
||||
│ │ │ ├── customers/ # 客户
|
||||
│ │ │ ├── marketing/ # 营销
|
||||
│ │ │ ├── quotation/ # 报价单
|
||||
│ │ │ └── product/ # 产品库
|
||||
│ │ ├── components/ # 组件
|
||||
│ │ │ └── tabbar/ # 自定义TabBar
|
||||
│ │ ├── utils/ # 工具
|
||||
│ │ │ ├── api.js # API封装
|
||||
│ │ │ └── push.js # 推送服务
|
||||
│ │ ├── static/ # 静态资源
|
||||
│ │ ├── App.vue # 应用入口
|
||||
│ │ ├── main.js # Vue初始化
|
||||
│ │ └── pages.json # 页面配置
|
||||
│ ├── package.json
|
||||
│ └── vite.config.js
|
||||
│
|
||||
├── miniprogram/ # 微信小程序(原生-已弃用)
|
||||
│
|
||||
├── docker-compose.yml # Docker编排
|
||||
├── nginx/ # Nginx配置
|
||||
├── scripts/ # 运维脚本
|
||||
├── systemd/ # Systemd服务
|
||||
└── data/ # 数据目录
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 五、待办事项
|
||||
|
||||
### 5.1 高优先级 (MVP)
|
||||
|
||||
- [ ] 配置微信登录OAuth
|
||||
- [ ] 配置WhatsApp Cloud API真实环境
|
||||
- [ ] 集成PDF生成库 (weasyprint)
|
||||
- [ ] 添加批量客户导入功能
|
||||
|
||||
### 5.2 中优先级 (V2)
|
||||
|
||||
- [ ] 添加文字转语音(TTS)功能
|
||||
- [ ] 实现Web管理后台基础功能
|
||||
- [ ] 数据分析图表集成
|
||||
|
||||
### 5.3 低优先级 (V3+)
|
||||
|
||||
- [ ] 团队/多人协作功能
|
||||
- [ ] 语料库训练模型
|
||||
- [ ] API开放平台
|
||||
|
||||
---
|
||||
|
||||
## 六、部署说明
|
||||
|
||||
### 开发环境
|
||||
|
||||
```bash
|
||||
# 启动后端
|
||||
cd backend
|
||||
docker-compose up -d
|
||||
|
||||
# 启动前端
|
||||
cd uni-app
|
||||
npm install
|
||||
npm run dev:mp-weixin
|
||||
```
|
||||
|
||||
### 生产环境
|
||||
|
||||
详见 `scripts/deploy.sh` 和 systemd 配置
|
||||
|
||||
---
|
||||
|
||||
## 七、相关文档链接
|
||||
|
||||
- [产品设计](./PRODUCT_DESIGN.md)
|
||||
- [技术架构](./TECH_ARCHITECTURE.md)
|
||||
- [API设计](./API_DESIGN.md)
|
||||
- [数据库设计](./DATABASE_SCHEMA.md)
|
||||
@@ -0,0 +1,361 @@
|
||||
# 外贸小助手 (TradeMate) — 技术架构文档
|
||||
|
||||
> 版本: v1.0
|
||||
> 创建日期: 2026-05-08
|
||||
|
||||
---
|
||||
|
||||
## 一、系统架构总览
|
||||
|
||||
```
|
||||
┌──────────────────────────────────────────────────────┐
|
||||
│ 客户端层 │
|
||||
│ ┌────────────┐ ┌────────────┐ ┌────────────┐ │
|
||||
│ │ 微信小程序 │ │ Web后台 │ │ WhatsApp │ │
|
||||
│ │ (主入口) │ │ (管理用) │ │ 原生客户端 │ │
|
||||
│ └──────┬─────┘ └──────┬─────┘ └──────┬─────┘ │
|
||||
└─────────┼───────────────┼────────────────┼───────────┘
|
||||
│ HTTP/JSON │ HTTP/JSON │ WhatsApp
|
||||
│ │ │ Cloud API
|
||||
┌─────────┼───────────────┼────────────────┼───────────┐
|
||||
│ ┌┴──────────────┴────────────────┴┐ │
|
||||
│ │ API Gateway (FastAPI) │ │
|
||||
│ │ - 认证 (JWT + WeChat OAuth) │ │
|
||||
│ │ - 用户 tier 中间件 │ │
|
||||
│ │ - 配额控制中间件 │ │
|
||||
│ └────────────────┬─────────────────┘ │
|
||||
│ │ │
|
||||
│ ┌────────────────┼─────────────────┐ │
|
||||
│ │ │ │ │
|
||||
│ ┌─────┴─────┐ ┌──────┴──────┐ ┌───────┴──────┐ │
|
||||
│ │ 业务服务 │ │ AI 服务 │ │ WhatsApp │ │
|
||||
│ │ │ │ 抽象层 │ │ 集成服务 │ │
|
||||
│ │ - 营销素材 │ │ - Provider │ │ - 消息收发 │ │
|
||||
│ │ - 翻译回复 │ │ - Router │ │ - Webhook │ │
|
||||
│ │ - 客户跟进 │ │ - 语料库 │ │ - 会话管理 │ │
|
||||
│ │ - 报价单 │ │ - 成本控制 │ │ │ │
|
||||
│ └─────┬─────┘ └──────┬──────┘ └──────┬───────┘ │
|
||||
│ │ │ │ │
|
||||
│ ┌─────┴─────────────────┴─────────────────┴──────┐ │
|
||||
│ │ 数据层 │ │
|
||||
│ │ ┌──────────┐ ┌──────────┐ ┌──────────────┐ │ │
|
||||
│ │ │PostgreSQL│ │ Redis │ │ 文件存储 │ │ │
|
||||
│ │ │+pgvector │ │ (缓存) │ │ (报价单PDF) │ │ │
|
||||
│ │ └──────────┘ └──────────┘ └──────────────┘ │ │
|
||||
│ └──────────────────────────────────────────────────┘ │
|
||||
└────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 二、技术栈选型
|
||||
|
||||
| 层级 | 技术 | 选型理由 |
|
||||
|------|------|---------|
|
||||
| 客户端 | 微信小程序 | 触达成本最低,中国外贸商家几乎100%使用微信 |
|
||||
| 后端 | FastAPI (Python 3.11+) | 异步性能好,类型安全,生态成熟 |
|
||||
| 主数据库 | PostgreSQL 15 + pgvector | 结构化数据 + 向量检索(语料库语义搜索) |
|
||||
| 缓存 | Redis 7 | 会话缓存、配额计数、任务队列 |
|
||||
| 任务队列 | Celery + Redis broker | 异步翻译、批量语料处理 |
|
||||
| AI Provider | DeepL + OpenAI + Claude + 本地模型 | 按场景路由,成本优化 |
|
||||
| WhatsApp | WhatsApp Cloud API | 官方API,合规稳定 |
|
||||
| 部署 | Docker + Docker Compose | 一键部署,环境一致 |
|
||||
|
||||
---
|
||||
|
||||
## 三、目录结构
|
||||
|
||||
```
|
||||
trade-assistant/
|
||||
├── docs/ # 设计文档
|
||||
│ ├── PRODUCT_DESIGN.md
|
||||
│ ├── TECH_ARCHITECTURE.md
|
||||
│ ├── API_DESIGN.md # API 接口设计
|
||||
│ └── DATABASE_SCHEMA.md # 数据库设计
|
||||
│
|
||||
├── backend/ # Python 后端
|
||||
│ ├── app/
|
||||
│ │ ├── main.py # FastAPI 入口
|
||||
│ │ ├── config.py # 配置管理
|
||||
│ │ ├── database.py # 数据库连接
|
||||
│ │ │
|
||||
│ │ ├── models/ # SQLAlchemy 数据模型
|
||||
│ │ │ ├── user.py
|
||||
│ │ │ ├── product.py
|
||||
│ │ │ ├── customer.py
|
||||
│ │ │ ├── conversation.py
|
||||
│ │ │ ├── quotation.py
|
||||
│ │ │ └── corpus.py
|
||||
│ │ │
|
||||
│ │ ├── api/v1/ # REST API 路由
|
||||
│ │ │ ├── auth.py # 认证
|
||||
│ │ │ ├── marketing.py # 营销素材
|
||||
│ │ │ ├── translate.py # 翻译与回复
|
||||
│ │ │ ├── customer.py # 客户管理
|
||||
│ │ │ ├── quotation.py # 报价单
|
||||
│ │ │ └── whatsapp.py # WhatsApp 集成
|
||||
│ │ │
|
||||
│ │ ├── services/ # 业务逻辑层
|
||||
│ │ │ ├── marketing.py # 营销素材生成
|
||||
│ │ │ ├── translation.py # 翻译+回复引擎
|
||||
│ │ │ ├── customer.py # 客户跟进引擎
|
||||
│ │ │ ├── quotation.py # 报价单服务
|
||||
│ │ │ └── whatsapp.py # WhatsApp 服务
|
||||
│ │ │
|
||||
│ │ ├── ai/ # AI 抽象层
|
||||
│ │ │ ├── base.py # Provider 接口
|
||||
│ │ │ ├── router.py # 智能路由+fallback
|
||||
│ │ │ ├── trade_corpus.py # 外贸语料库
|
||||
│ │ │ └── providers/ # 各引擎实现
|
||||
│ │ │ ├── openai.py
|
||||
│ │ │ ├── claude.py
|
||||
│ │ │ ├── deepl.py
|
||||
│ │ │ └── local.py
|
||||
│ │ │
|
||||
│ │ ├── core/ # 核心基础设施
|
||||
│ │ │ ├── security.py # JWT + 加密
|
||||
│ │ │ ├── exceptions.py # 异常处理
|
||||
│ │ │ └── middleware.py # 中间件
|
||||
│ │ │
|
||||
│ │ └── workers/ # Celery 任务
|
||||
│ │ └── tasks.py
|
||||
│ │
|
||||
│ ├── alembic/ # 数据库迁移
|
||||
│ ├── requirements.txt
|
||||
│ ├── Dockerfile
|
||||
│ └── .env.example
|
||||
│
|
||||
├── miniprogram/ # 微信小程序
|
||||
│ ├── app.js / app.json / app.wxss
|
||||
│ ├── pages/
|
||||
│ │ ├── index/ # 首页仪表盘
|
||||
│ │ ├── translate/ # 翻译+回复
|
||||
│ │ ├── customers/ # 客户管理
|
||||
│ │ ├── marketing/ # 营销素材
|
||||
│ │ └── quotation/ # 报价单
|
||||
│ ├── components/ # 通用组件
|
||||
│ └── utils/ # 工具函数
|
||||
│
|
||||
├── data/ # 数据存储
|
||||
│ ├── corpus/ # 外贸语料库文件
|
||||
│ └── models/ # 微调模型占位
|
||||
│
|
||||
├── scripts/ # 运维脚本
|
||||
├── docker-compose.yml
|
||||
└── README.md
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 四、AI 服务架构(核心)
|
||||
|
||||
### 4.1 Provider 抽象层
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────┐
|
||||
│ AIRouter │
|
||||
│ │
|
||||
│ execute(task_type, method, *args, **kwargs) │
|
||||
│ │
|
||||
│ 1. 根据 task_type 获取优先级列表 │
|
||||
│ 2. 按优先级依次尝试 provider │
|
||||
│ 3. 失败自动 fallback 到下一个 │
|
||||
│ 4. 记录每次调用的 provider、token、耗时、成本 │
|
||||
│ 5. 将结果存入语料库(如果质量达标) │
|
||||
└──────────┬──────────┬──────────┬──────────┬──────────┘
|
||||
│ │ │ │
|
||||
┌──────┴──┐ ┌───┴────┐ ┌───┴────┐ ┌───┴──────┐
|
||||
│ OpenAI │ │ Claude │ │ DeepL │ │ Local │
|
||||
│ Provider│ │Provider│ │Provider│ │Provider │
|
||||
└─────────┘ └────────┘ └────────┘ └──────────┘
|
||||
```
|
||||
|
||||
### 4.2 路由规则
|
||||
|
||||
| 任务类型 | 主引擎 | Fallback | 成本策略 |
|
||||
|---------|--------|---------|---------|
|
||||
| 翻译(看懂) | DeepL | OpenAI → 本地 | 优先低成本 |
|
||||
| 回复建议 | OpenAI GPT-4o | Claude → 本地 | 质量优先 |
|
||||
| 营销文案 | Claude | OpenAI → 本地 | 质量优先 |
|
||||
| 结构化提取 | OpenAI GPT-4o | Claude | 结构化能力优先 |
|
||||
| 语料训练 | 本地(离线) | - | 零成本 |
|
||||
|
||||
### 4.3 语料库架构
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────┐
|
||||
│ TradeCorpus │
|
||||
│ │
|
||||
│ 收集: │
|
||||
│ ├─ 用户翻译记录(原文→译文,用户是否编辑过) │
|
||||
│ ├─ 用户选择的回复(用户从N个AI建议中选了哪个) │
|
||||
│ ├─ 用户点赞/点踩的反馈 │
|
||||
│ └─ 用户最终发出的版本(可能是AI建议+用户修改) │
|
||||
│ │
|
||||
│ 存储: │
|
||||
│ ├─ PostgreSQL (结构化: 源文, 译文, 领域, 评分) │
|
||||
│ └─ pgvector (语义向量, 用于相似翻译检索) │
|
||||
│ │
|
||||
│ 使用: │
|
||||
│ ├─ 运行时: 相似翻译召回 → 做 few-shot prompt │
|
||||
│ ├─ 离线: 训练专用翻译模型(用户量 >1万后启动) │
|
||||
│ └─ 质量评估: 持续评估各 provider 的质量分数 │
|
||||
└─────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 五、护城河实现策略
|
||||
|
||||
### 5.1 外贸垂直语料库(数据壁垒)
|
||||
|
||||
**数据采集点**(在用户流程中无感埋点):
|
||||
|
||||
```
|
||||
用户操作 → 系统记录
|
||||
────────────────────────────────────────
|
||||
用户输入中文要翻译 → 原文
|
||||
用户选择了某个回复建议 → 被选中的建议 + 未被选中的建议
|
||||
用户修改了AI建议再发送 → AI原文 + 用户修改版本
|
||||
用户点了赞/点踩 → 质量标签
|
||||
用户复制了某条营销文案 → 文案被使用的统计
|
||||
```
|
||||
|
||||
**语料库达到 10 万条后的效果**:
|
||||
- 翻译时从语料库检索相似度 >90% 的历史翻译,直接复用或做 few-shot
|
||||
- 回复建议不再是通用 prompt,而是"过去100个类似询盘的回复模式"
|
||||
- 新用户冷启动时直接受益于存量语料
|
||||
|
||||
### 5.2 用户产品知识库(迁移成本壁垒)
|
||||
|
||||
用户存入的数据是不可替代的资产:
|
||||
|
||||
```
|
||||
用户产品库:
|
||||
├─ 产品名称/描述(双语)
|
||||
├─ 价格表(不同客户不同价)
|
||||
├─ 规格参数
|
||||
├─ 产品图片
|
||||
└─ 关键词(多语言)
|
||||
|
||||
客户画像:
|
||||
├─ 基本信息(国家/公司/职位)
|
||||
├─ 沟通偏好(正式/亲切)
|
||||
├─ 历史价格
|
||||
├─ 付款习惯
|
||||
└─ 砍价风格
|
||||
|
||||
→ 换平台 = 所有数据重录
|
||||
→ 用户用得越久,走得越难
|
||||
```
|
||||
|
||||
### 5.3 沉默客户模式算法(网络效应)
|
||||
|
||||
```
|
||||
输入:
|
||||
- 本用户的客户沉默时长
|
||||
- 跨用户匿名统计的"不同国家客户回复率时间分布"
|
||||
- 历史成功跟进的话术模式
|
||||
|
||||
输出:
|
||||
- 最佳跟进时间
|
||||
- 最高回复率的话术类型
|
||||
- 客户"可能还有意向"的概率评分
|
||||
|
||||
网络效应:
|
||||
- 用户A的墨西哥客户跟进数据 → 改善用户B的墨西哥客户跟进建议
|
||||
- 用户越多,预测越准
|
||||
- 新用户直接获得"过去100个相似案例的最佳实践"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 六、配额与计费系统
|
||||
|
||||
### 6.1 计费计量点
|
||||
|
||||
```
|
||||
┌──────────────┬────────────┬───────────────┐
|
||||
│ 功能 │ 计量单位 │ 免费版限制 │
|
||||
├──────────────┼────────────┼───────────────┤
|
||||
│ 翻译 │ 字符数 │ 5000/天 │
|
||||
│ 回复建议 │ 请求次数 │ 20次/天 │
|
||||
│ 营销文案生成 │ 请求次数 │ 5次/天 │
|
||||
│ 报价单生成 │ 份数 │ 3份/天 │
|
||||
│ 客户管理 │ 客户数 │ 5个 │
|
||||
│ 跟进提醒 │ - │ 仅沉默检测 │
|
||||
└──────────────┴────────────┴───────────────┘
|
||||
```
|
||||
|
||||
### 6.2 实现架构
|
||||
|
||||
```
|
||||
用户请求 → tier middleware → quota middleware → 业务逻辑
|
||||
│ │
|
||||
↓ ↓
|
||||
User.tier Redis INCR user:daily_count
|
||||
控制功能可用性 检查是否超限
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 七、WhatsApp 集成架构
|
||||
|
||||
```
|
||||
WhatsApp User WhatsApp Cloud API TradeMate Backend
|
||||
│ │ │
|
||||
│ 发送消息 │ │
|
||||
│ ────────────────────────────────► │ │
|
||||
│ │ Webhook POST /webhook/whatsapp │
|
||||
│ │ ────────────────────────────────► │
|
||||
│ │ │
|
||||
│ │ 1. 验证 Webhook signature │
|
||||
│ │ 2. 解析消息内容 + 发送者信息 │
|
||||
│ │ 3. 调用翻译服务(用户可配置) │
|
||||
│ │ 4. 存储到 conversations 表 │
|
||||
│ │ 5. 检查是否触发沉默检测更新 │
|
||||
│ │ 6. 返回 200 OK │
|
||||
│ │ │
|
||||
│ 回复消息 │ POST /messages (通过 Cloud API) │
|
||||
│ ◄──────────────────────────────── │ ──── 用户在小程序确认回复后 ────► │
|
||||
│ │ │
|
||||
```
|
||||
|
||||
**注意**:WhatsApp Cloud API 要求企业通过 Meta Business 认证,初始阶段可以使用用户手动复制消息到 WhatsApp 的方式替代,降低启动门槛。
|
||||
|
||||
---
|
||||
|
||||
## 八、安全设计
|
||||
|
||||
| 维度 | 措施 |
|
||||
|------|------|
|
||||
| 认证 | JWT + 微信 OAuth + refresh token 轮换 |
|
||||
| API 安全 | 全站 HTTPS、请求签名校验、rate limiting |
|
||||
| 数据安全 | 密码 bcrypt 哈希、敏感配置环境变量注入 |
|
||||
| AI API Key | 仅服务端持有,不暴露给前端 |
|
||||
| 用户隔离 | 所有查询强制 user_id 过滤 |
|
||||
| WhatsApp | Webhook signature 验证、消息内容不落日志 |
|
||||
|
||||
---
|
||||
|
||||
## 九、部署架构
|
||||
|
||||
```
|
||||
开发环境: docker-compose up(单机)
|
||||
├─ backend:8000
|
||||
├─ postgres:5432
|
||||
├─ redis:6379
|
||||
└─ celery-worker
|
||||
|
||||
生产环境: 阿里云/腾讯云轻量服务器
|
||||
├─ Nginx 反代 + SSL
|
||||
├─ systemd 管理 backend + celery
|
||||
├─ PostgreSQL 走内网
|
||||
└─ Redis 走内网
|
||||
|
||||
关键指标:
|
||||
├─ API 响应: < 200ms (p95)
|
||||
├─ 翻译延迟: < 2s (p95)
|
||||
├─ 并发用户: 500+(单实例)
|
||||
└─ 可用性: 99.5%
|
||||
```
|
||||
Reference in New Issue
Block a user