Files
wxsales/demo/2-impl.md
T
freedakgmail 5926c73ff1 微信营销管理系统 - 益童宝销售管理平台
- 数据库: PostgreSQL schema + 3名销售/21客户/341消息/6成交
- 采集代理: mock_sync.py 模拟微信聊天同步
- AI分析: analyze.py 规则模式 + 千问LLM模式
- 后端: FastAPI 11个API接口
- 前端: 仪表盘/销售列表/客户列表/成交记录/交流分析/录入成交
- 交流分析: 全部客户对话概览 + LLM标准范式对话生成
- 部署: systemd + nginx, 已部署至 sale.all8ai.top
2026-07-14 22:31:29 +08:00

321 lines
9.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 微信营销管理系统 MVP 实施计划
> 文档日期:2026-07-14
> 版本:v0.1
> 依赖:0-req.md, 1-design.md
---
## 一、实施阶段
### 阶段 1:数据库与基础设施
**目标**:启动独立 PostgreSQL,建表,预置销售数据。
**产出文件**
- `demo/db/schema.sql` — 完整建表 SQL
- `demo/db/init_db.sh` — 数据库启动与初始化脚本
- `demo/requirements.txt` — Python 依赖
**任务清单**
- [ ] 编写 `schema.sql`6 张表 + 索引)
- [ ] 编写 `init_db.sh`(启动 PG 5434 → 建库 → 建表 → 插入 3 名销售)
- [ ] 编写 `requirements.txt`
- [ ] 验证:执行 `init_db.sh` 后,`psql` 能查到 3 名销售
**验证命令**
```bash
/usr/local/opt/postgresql@17/bin/psql -h demo/db/socket -p 5434 -d wxchat_sales -c "SELECT * FROM salesperson;"
```
---
### 阶段 2:模拟采集代理
**目标**:3 个模拟代理生成微信数据并写入中央库。
**产出文件**
- `demo/agent/mock_sync.py` — 模拟采集代理
**任务清单**
- [ ] 定义 5 个销售场景模板(询价成交、犹豫、咨询、长期跟进、竞品对比)
- [ ] 定义非客户联系人模板(广告、社交、群聊)
- [ ] 实现 `generate_contacts()` — 每销售 1530 个联系人
- [ ] 实现 `generate_conversations()` — 每销售 1020 个会话
- [ ] 实现 `generate_messages()` — 基于场景模板生成消息
- [ ] 实现 `sync_to_central()` — 批量写入 PG
- [ ] 实现增量同步(递增 source_local_id
- [ ] 支持 `--salesperson-id` 参数
- [ ] 支持 `--batch` 参数控制生成数量
**验证命令**
```bash
python demo/agent/mock_sync.py --salesperson-id 1
python demo/agent/mock_sync.py --salesperson-id 2
python demo/agent/mock_sync.py --salesperson-id 3
# 检查数据
psql ... -c "SELECT salesperson_id, count(*) FROM message GROUP BY salesperson_id;"
# 再次运行验证增量
python demo/agent/mock_sync.py --salesperson-id 1
psql ... -c "SELECT count(*) FROM message WHERE salesperson_id=1;"
# 消息数应增加
```
---
### 阶段 3AI 分析服务
**目标**:规则引擎实现客户识别和沟通摘要。
**产出文件**
- `demo/ai/analyze.py` — AI 分析服务
**任务清单**
- [ ] 实现客户识别规则引擎
- 消息数量过滤
- 关键词匹配(价格词、产品词、合作词)
- 行业推断
- 意向等级判断
- [ ] 实现沟通摘要规则引擎
- 阶段判断
- 异议提取
- 摘要生成
- 下一步建议
- [ ] 支持 `--mode rule|llm` 参数
- [ ] 支持 `--force` 强制重新分析
- [ ] 已分析客户跳过(`last_analysis IS NULL` 过滤)
**验证命令**
```bash
python demo/ai/analyze.py --mode rule
# 检查客户表
psql ... -c "SELECT customer_name, industry, intent_level, stage FROM customer;"
# 应有客户记录,非客户不在其中
```
---
### 阶段 4Web 后端
**目标**FastAPI 提供全部 API 接口。
**产出文件**
- `demo/web/server.py` — FastAPI 后端
**任务清单**
- [ ] 实现 DB 连接池
- [ ] 实现 `/api/dashboard`
- [ ] 实现 `/api/salespersons`
- [ ] 实现 `/api/customers`(支持筛选)
- [ ] 实现 `/api/customers/{id}`
- [ ] 实现 `/api/customers/{id}/messages`(分页)
- [ ] 实现 `/api/customers/{id}/deals`
- [ ] 实现 `POST /api/deals`
- [ ] 实现 `/api/deals`(支持筛选)
- [ ] 实现 `POST /api/analyze`
- [ ] 实现 `/api/sync/status`
- [ ] 静态文件托管(`/``web/static/index.html`
**验证命令**
```bash
uvicorn demo.web.server:app --port 8770 &
curl http://127.0.0.1:8770/api/dashboard | python -m json.tool
curl http://127.0.0.1:8770/api/customers | python -m json.tool
curl -X POST http://127.0.0.1:8770/api/deals \
-H "Content-Type: application/json" \
-d '{"salesperson_id":1,"customer_id":1,"product_name":"收银系统","amount":12000,"deal_date":"2026-07-14"}'
```
---
### 阶段 5Web 前端
**目标**:单页 HTML 实现 5 个页面。
**产出文件**
- `demo/web/static/index.html` — 单页前端
**任务清单**
- [ ] 页面骨架 + TailwindCSS CDN + 导航栏
- [ ] 仪表盘面板(统计卡片 + 销售对比图)
- [ ] 销售列表面板
- [ ] 客户列表面板(筛选 + 列表)
- [ ] 客户详情面板(基本信息 + 摘要 + 聊天时间线 + 成交记录)
- [ ] 成交录入表单
- [ ] 成交列表面板
- [ ] SPA 路由切换(hash 或手动切换)
- [ ] API 调用封装
- [ ] 错误提示
**验证方式**
- 浏览器访问 `http://127.0.0.1:8770`
- 逐个页面检查数据展示
- 录入一条成交,检查列表和客户详情
---
### 阶段 6:一键启动与集成
**目标**`run_demo.sh` 一键启动全部服务。
**产出文件**
- `demo/run_demo.sh` — 一键启动
- `demo/stop_demo.sh` — 一键停止
- `demo/README.md` — 项目说明
**任务清单**
- [ ] 编写 `run_demo.sh`
- 检查 PG 17
- 启动 PG 5434
- 建库建表
- 运行 3 个 mock_sync
- 运行 analyze
- 启动 uvicorn 后台
- 输出访问地址
- [ ] 编写 `stop_demo.sh`
- 停止 uvicorn
- 停止 PG
- [ ] 编写 `README.md`
- [ ] 端到端验证
**验证命令**
```bash
cd demo && bash run_demo.sh
# 浏览器访问 http://127.0.0.1:8770
bash stop_demo.sh
# 再次运行验证幂等
bash run_demo.sh
```
---
## 二、依赖清单
### Python 包
```
psycopg2-binary>=2.9
fastapi>=0.111
uvicorn>=0.30
```
### 系统依赖
- PostgreSQL 17(本机已安装于 `/usr/local/opt/postgresql@17/`
- Python 3.11+
- macOSlaunchd、pg_ctl 等)
### 可选依赖
- Ollama + qwen2.5LLM 分析模式,非必需)
---
## 三、风险与对策
| 风险 | 影响 | 对策 |
|---|---|---|
| PG 5434 端口被占用 | 启动失败 | 脚本检测并提示 |
| psycopg2 安装失败 | 无法连接 DB | 使用 psycopg2-binary 避免编译 |
| 模拟数据不够真实 | 演示效果差 | 场景模板覆盖 5 种典型销售对话 |
| 规则引擎误判 | 客户识别不准 | MVP 可接受,后续替换为 LLM |
| 前端无框架 | 代码维护性差 | MVP 可接受,后续可迁移到 React |
---
## 三点五、测试计划
### 测试分层
| 层级 | 范围 | 方式 | 产出文件 |
|---|---|---|---|
| 数据库层 | 建表、约束、索引 | SQL 验证脚本 | `demo/tests/test_db.sql` |
| 采集代理层 | 联系人/消息生成、增量同步、去重 | Python 单元测试 | `demo/tests/test_mock_sync.py` |
| AI 分析层 | 客户识别准确率、阶段判断、异议提取 | Python 单元测试 | `demo/tests/test_analyze.py` |
| API 层 | 全部 11 个接口的输入输出 | Python HTTP 测试 | `demo/tests/test_api.py` |
| 端到端 | run_demo.sh → 浏览器 → 成交录入 | Shell 脚本 + curl | `demo/tests/test_e2e.sh` |
### 各阶段测试任务
#### 阶段 1 测试(数据库)
- [ ] 执行 `test_db.sql` 验证 6 张表存在
- [ ] 验证唯一约束生效(插入重复数据应失败)
- [ ] 验证外键约束生效
- [ ] 验证 3 名预置销售数据正确
#### 阶段 2 测试(采集代理)
- [ ] 运行 mock_sync 后联系人数量在预期范围
- [ ] 运行 mock_sync 后消息数量 > 0
- [ ] 重复运行 mock_sync 不产生重复消息(增量同步)
- [ ] 消息类型分布合理(text 占比最高)
- [ ] 非客户联系人的消息不含业务关键词
#### 阶段 3 测试(AI 分析)
- [ ] 真实客户被正确识别(is_customer=true
- [ ] 非客户不被识别为客户(广告/社交/家人)
- [ ] 意向等级判断合理(成交场景=high,犹豫场景=medium
- [ ] 销售阶段判断合理(成交场景=成交,犹豫场景=异议处理)
- [ ] 异议提取包含"贵""考虑""商量"等关键词
- [ ] 重复运行不重复分析(last_analysis 过滤)
#### 阶段 4 测试(API
- [ ] `GET /api/dashboard` 返回非空统计数据
- [ ] `GET /api/customers` 返回客户列表
- [ ] `GET /api/customers?intent_level=high` 筛选正确
- [ ] `GET /api/customers/{id}` 返回客户详情含摘要
- [ ] `GET /api/customers/{id}/messages` 返回聊天记录
- [ ] `POST /api/deals` 成功创建成交记录
- [ ] `GET /api/deals` 返回成交列表
- [ ] `POST /api/analyze` 触发分析并返回统计
#### 阶段 6 测试(端到端)
- [ ] `run_demo.sh` 执行无报错
- [ ] `curl http://127.0.0.1:8770/api/dashboard` 返回 200
- [ ] `stop_demo.sh` 停止所有进程
- [ ] 重复运行 `run_demo.sh` 幂等
### 测试执行命令
```bash
# 数据库测试
psql -h demo/db/socket -p 5434 -d wxchat_sales -f demo/tests/test_db.sql
# Python 单元测试
python -m pytest demo/tests/ -v
# 端到端测试
bash demo/tests/test_e2e.sh
```
---
## 四、工作量估算
| 阶段 | 预计工作量 | 产出文件数 |
|---|---|---|
| 阶段 1:数据库 | 1~2 小时 | 3 个文件 |
| 阶段 2:采集代理 | 3~4 小时 | 1 个文件(大) |
| 阶段 3AI 分析 | 2~3 小时 | 1 个文件 |
| 阶段 4Web 后端 | 23 小时 | 1 个文件 |
| 阶段 5Web 前端 | 3~4 小时 | 1 个文件(大) |
| 阶段 6:集成启动 | 1 小时 | 3 个文件 |
| **合计** | **1217 小时** | **10 个文件** |
---
## 五、里程碑
| 里程碑 | 标志 | 验收标准 |
|---|---|---|
| M1 数据库就绪 | `init_db.sh` 成功执行 | 3 名销售在库中 |
| M2 数据采集就绪 | 3 个 mock_sync 运行完成 | 消息数 > 600 |
| M3 AI 分析就绪 | `analyze.py` 运行完成 | 客户表非空 |
| M4 API 就绪 | FastAPI 启动 | 所有 API 返回正确数据 |
| M5 前端就绪 | 浏览器可访问 | 5 个页面数据正确 |
| M6 一键启动 | `run_demo.sh` 成功 | AC-1 AC-12 全部通过 |