13f8b9c512
Co-Authored-By: Claude <noreply@anthropic.com>
4.8 KiB
4.8 KiB
商机跟单优化 — 跟进记录子表 — 设计文档
日期:2026-07-12 | 状态:已确认
一、需求概述
当前商机跟单只有一条静态记录(产品+金额+跟进内容文本+状态),缺少"持续跟进"的时间线感。新增跟进记录子表,将每个商机从"快照"变为"持续跟单"。
二、核心决策
| 决策项 | 结论 |
|---|---|
| 方案 | 新增 mini_business_logs 子表 |
| 跟进方式 | 电话/微信/上门/邮件/其他(chip 按钮选择) |
| 原 follow_up_detail | 保留,含义改为"商机概述/背景" |
| 状态 | 不变(跟进中/已签约/已流失) |
三、新增表 mini_business_logs
CREATE TABLE mini_business_logs (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
business_id UUID NOT NULL REFERENCES mini_business(id) ON DELETE CASCADE,
log_date DATE NOT NULL,
method VARCHAR(20) NOT NULL DEFAULT '电话',
content TEXT NOT NULL DEFAULT '',
created_by UUID NOT NULL REFERENCES users(id),
created_at TIMESTAMPTZ DEFAULT now()
);
CREATE INDEX idx_mbl_business_id ON mini_business_logs(business_id);
CREATE INDEX idx_mbl_log_date ON mini_business_logs(log_date);
SQLAlchemy 模型
class MiniBusinessLog(Base):
__tablename__ = "mini_business_logs"
id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
business_id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), ForeignKey("mini_business.id", ondelete="CASCADE"), index=True)
log_date: Mapped[date] = mapped_column(Date)
method: Mapped[str] = mapped_column(String(20), default="电话")
content: Mapped[str] = mapped_column(Text, default="")
created_by: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), ForeignKey("users.id"))
created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now())
MiniBusiness 模型添加 relationship
logs: Mapped[list["MiniBusinessLog"]] = relationship(back_populates="business", cascade="all, delete-orphan")
四、商机主体字段调整
| 字段 | 变更 | 前端 label |
|---|---|---|
follow_up_detail |
保留,含义改为商机概述 | "商机概述" |
| 其他字段 | 不变 |
五、API
子路由
| 方法 | 路径 | 说明 | 权限 |
|---|---|---|---|
GET |
/mini-business/{id}/logs |
获取跟进记录列表(date DESC) | 经理仅看自己 |
POST |
/mini-business/{id}/logs |
新增跟进记录 | 经理本人或支局长/领导 |
PUT |
/mini-business/logs/{log_id} |
编辑跟进记录 | 创建人或支局长/领导 |
DELETE |
/mini-business/logs/{log_id} |
删除跟进记录 | 创建人或支局长/领导 |
请求体 (POST/PUT)
{
"log_date": "2026-07-12",
"method": "电话",
"content": "客户反馈价格偏高,需进一步沟通方案"
}
跟进方式枚举
["电话", "微信", "上门", "邮件", "其他"]
六、前端
PC 端 — 商机列表页增强
- 表格新增「最近跟进」列(最近一次跟进日期 + 跟进次数 badge)
- 点击客户名打开详情弹窗(替代直接编辑)
- 详情弹窗:上部=商机基本信息(客户/产品/金额/状态/概述)+ 编辑按钮,下部=跟进时间线 + 新增跟进入口
PC 端 — 跟进时间线组件
📞 07-10 电话 — 客户反馈价格偏高,需进一步沟通 [编辑] [删除]
🏢 07-05 上门 — 现场演示产品功能,客户初步认可 [编辑] [删除]
📧 07-01 邮件 — 发送报价方案 [编辑] [删除]
- 按日期倒序,最新在上
- 每条显示:方式图标 + 日期 + 内容 + 操作按钮
- 底部「新增跟进」按钮展开内联表单(日期+方式 chip+内容 textarea)
移动端 — 商机表单页改为详情页
- 现有新建表单保留
- 新增商机详情页(路由
/m/mini-biz/:id) - 上部:商机信息卡片(可点击编辑)
- 下部:跟进时间线 + 底部固定「新增跟进」按钮
移动端 — 首页入口
- Home.vue 的「商机跟单」chip 改为跳转商机列表(需新增
/m/mini-biz路由)
七、文件变更
| 类型 | 文件 | 说明 |
|---|---|---|
| 新增 | models/mini_business_log.py |
Log 模型 |
| 新增 | schemas/mini_business_log.py |
Log Schema |
| 新增 | api/mini_business_logs.py |
Log CRUD API |
| 修改 | models/mini_business.py |
添加 logs relationship |
| 修改 | models/__init__.py |
注册新模型 |
| 修改 | main.py |
lifespan 自动建表 |
| 修改 | MiniBusiness.vue (PC) |
详情弹窗 + 时间线 |
| 修改 | MiniBusinessForm.vue (mobile) |
改为详情页模式 |
| 新增 | frontend/src/api/miniBusiness.ts |
追加 logs API |
| 新增 | 移动端商机列表页 | /m/mini-biz |