# 商机跟单优化 — 跟进记录子表 — 设计文档 > 日期:2026-07-12 | 状态:已确认 ## 一、需求概述 当前商机跟单只有一条静态记录(产品+金额+跟进内容文本+状态),缺少"持续跟进"的时间线感。新增跟进记录子表,将每个商机从"快照"变为"持续跟单"。 ## 二、核心决策 | 决策项 | 结论 | |--------|------| | 方案 | 新增 `mini_business_logs` 子表 | | 跟进方式 | 电话/微信/上门/邮件/其他(chip 按钮选择) | | 原 follow_up_detail | 保留,含义改为"商机概述/背景" | | 状态 | 不变(跟进中/已签约/已流失) | ## 三、新增表 `mini_business_logs` ```sql 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 模型 ```python 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 ```python 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) ```json { "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` |