unis_crm/docs/business-schema-design.md

527 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# CRM业务表设计
## 1. 设计依据
本设计根据当前前端页面反推业务模型,涉及页面如下:
- `src/pages/Opportunities.tsx`:商机储备、商机详情、跟进记录
- `src/pages/Expansion.tsx`:销售人员拓展、渠道拓展、跟进记录
- `src/pages/Work.tsx`:外勤打卡、日报、历史记录、主管点评
- `src/pages/Profile.tsx`:个人资料、统计信息
- `src/pages/Dashboard.tsx`:首页统计、待办、动态
当前前端是展示型页面,未接入真实接口,因此以下设计属于“按现有前端信息推导出的第一版业务库设计”。
---
## 2. 业务模块拆分
建议按以下模块建表:
1. 组织与人员
2. 客户与商机
3. 拓展管理
4. 工作管理
5. 待办与动态(可选增强)
---
## 3. 核心实体关系
```text
部门 department
└─< 用户 user
客户 customer
└─< 商机 opportunity
└─< 商机跟进记录 opportunity_followup
用户 user
└─< 销售拓展 sales_expansion
└─< 拓展跟进记录 expansion_followup
用户 user
└─< 渠道拓展 channel_expansion
└─< 拓展跟进记录 expansion_followup
用户 user
└─< 外勤打卡 work_checkin
└─< 打卡附件 work_checkin_attachment
用户 user
└─< 日报 work_daily_report
└─< 日报点评 work_daily_report_comment
```
---
## 4. 表设计
## 4.1 `sys_department` 部门表
用于承接“华东大区、华北大区”等组织信息。
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| id | bigint PK | 主键 |
| dept_code | varchar(50) | 部门编码 |
| dept_name | varchar(100) | 部门名称 |
| parent_id | bigint | 上级部门ID |
| manager_user_id | bigint | 部门负责人 |
| status | tinyint | 1启用 0停用 |
| created_at | datetime | 创建时间 |
| updated_at | datetime | 更新时间 |
---
## 4.2 `sys_user` 用户表
承接“张三、李四、王五”等销售人员,以及个人页中的员工资料。
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| id | bigint PK | 主键 |
| user_code | varchar(50) | 工号/员工编号 |
| username | varchar(50) | 登录账号 |
| real_name | varchar(50) | 姓名 |
| mobile | varchar(20) | 手机号 |
| email | varchar(100) | 邮箱 |
| dept_id | bigint | 所属部门 |
| job_title | varchar(100) | 职位,如高级销售 |
| status | tinyint | 1在职 0离职 |
| hire_date | date | 入职日期 |
| avatar_url | varchar(255) | 头像地址 |
| password_hash | varchar(255) | 登录密码摘要 |
| created_at | datetime | 创建时间 |
| updated_at | datetime | 更新时间 |
索引建议:
- `idx_user_dept_id(dept_id)`
- `uk_user_username(username)`
- `uk_user_mobile(mobile)`
---
## 4.3 `crm_customer` 客户表
来源于商机页面中的“客户名称”,如医院、学校、集团。
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| id | bigint PK | 主键 |
| customer_code | varchar(50) | 客户编码 |
| customer_name | varchar(200) | 客户名称 |
| customer_type | varchar(50) | 客户类型,如医院/高校/企业 |
| industry | varchar(50) | 行业 |
| province | varchar(50) | 省份 |
| city | varchar(50) | 城市 |
| address | varchar(255) | 地址 |
| owner_user_id | bigint | 当前负责人 |
| source | varchar(50) | 来源,如渠道推荐/市场活动 |
| status | varchar(30) | 潜在/跟进中/成交/流失 |
| remark | text | 备注 |
| created_at | datetime | 创建时间 |
| updated_at | datetime | 更新时间 |
索引建议:
- `idx_customer_owner(owner_user_id)`
- `idx_customer_name(customer_name)`
---
## 4.4 `crm_opportunity` 商机表
这是前端最核心业务表,对应“商机储备”页面。
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| id | bigint PK | 主键 |
| opportunity_code | varchar(50) | 商机编号,如 `HD-20231024-001` |
| opportunity_name | varchar(200) | 商机名称 |
| customer_id | bigint | 关联客户 |
| owner_user_id | bigint | 商机负责人 |
| amount | decimal(18,2) | 商机金额 |
| expected_close_date | date | 预计结单日期 |
| confidence_pct | tinyint | 把握度0-100 |
| stage | varchar(50) | 阶段,如初步沟通/方案交流/招投标/商务谈判/已成交 |
| opportunity_type | varchar(50) | 类型,如新建/扩容 |
| product_type | varchar(100) | 产品类别如VDI/VOI/IDV云桌面 |
| source | varchar(50) | 商机来源 |
| pushed_to_oms | tinyint | 是否已推送OMS |
| oms_push_time | datetime | 推送OMS时间 |
| description | text | 商机说明/备注 |
| status | varchar(30) | 正常/赢单/输单/关闭 |
| created_at | datetime | 创建时间 |
| updated_at | datetime | 更新时间 |
索引建议:
- `uk_opportunity_code(opportunity_code)`
- `idx_opportunity_customer(customer_id)`
- `idx_opportunity_owner(owner_user_id)`
- `idx_opportunity_stage(stage)`
- `idx_opportunity_expected_close(expected_close_date)`
---
## 4.5 `crm_opportunity_followup` 商机跟进记录表
对应商机详情里的“跟进记录”时间线。
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| id | bigint PK | 主键 |
| opportunity_id | bigint | 商机ID |
| followup_time | datetime | 跟进时间 |
| followup_type | varchar(50) | 跟进方式,如电话沟通/现场拜访/微信沟通 |
| content | text | 跟进内容 |
| next_action | varchar(255) | 下一步动作 |
| followup_user_id | bigint | 跟进人 |
| created_at | datetime | 创建时间 |
| updated_at | datetime | 更新时间 |
索引建议:
- `idx_opp_followup_opportunity(opportunity_id, followup_time desc)`
- `idx_opp_followup_user(followup_user_id)`
---
## 4.6 `crm_sales_expansion` 销售拓展表
对应“销售人员拓展”。
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| id | bigint PK | 主键 |
| candidate_name | varchar(50) | 候选人姓名 |
| mobile | varchar(20) | 手机号 |
| email | varchar(100) | 邮箱 |
| target_dept_id | bigint | 目标归属部门 |
| industry | varchar(50) | 擅长行业 |
| title | varchar(100) | 当前或目标职位 |
| intent_level | varchar(20) | 意向度,高/中/低 |
| stage | varchar(50) | 阶段,如初步沟通/方案交流 |
| has_desktop_exp | tinyint | 是否有云桌面经验 |
| in_progress | tinyint | 是否持续跟进中 |
| employment_status | varchar(20) | 在职/离职/已入职/已放弃 |
| expected_join_date | date | 预计入职日期,可为空 |
| owner_user_id | bigint | 负责人 |
| remark | text | 备注 |
| created_at | datetime | 创建时间 |
| updated_at | datetime | 更新时间 |
索引建议:
- `idx_sales_expansion_owner(owner_user_id)`
- `idx_sales_expansion_stage(stage)`
- `idx_sales_expansion_mobile(mobile)`
---
## 4.7 `crm_channel_expansion` 渠道拓展表
对应“渠道拓展”。
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| id | bigint PK | 主键 |
| channel_name | varchar(200) | 渠道名称 |
| province | varchar(50) | 所在省份 |
| industry | varchar(50) | 主要行业 |
| annual_revenue | decimal(18,2) | 年营收规模 |
| staff_size | int | 公司人数 |
| contact_name | varchar(50) | 联系人 |
| contact_title | varchar(100) | 联系人职务 |
| contact_mobile | varchar(20) | 联系电话 |
| stage | varchar(50) | 阶段,如初步接触/合作洽谈 |
| landed_flag | tinyint | 是否已落地 |
| expected_sign_date | date | 预计签约日期 |
| owner_user_id | bigint | 负责人 |
| remark | text | 备注 |
| created_at | datetime | 创建时间 |
| updated_at | datetime | 更新时间 |
索引建议:
- `idx_channel_expansion_owner(owner_user_id)`
- `idx_channel_expansion_stage(stage)`
- `idx_channel_expansion_name(channel_name)`
---
## 4.8 `crm_expansion_followup` 拓展跟进记录表
销售拓展和渠道拓展都存在“跟进记录”,建议共用一张表,通过对象类型区分。
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| id | bigint PK | 主键 |
| biz_type | varchar(20) | `sales` / `channel` |
| biz_id | bigint | 对应拓展对象ID |
| followup_time | datetime | 跟进时间 |
| followup_type | varchar(50) | 电话/微信/面谈等 |
| content | text | 跟进内容 |
| next_action | varchar(255) | 下一步动作 |
| followup_user_id | bigint | 跟进人 |
| created_at | datetime | 创建时间 |
| updated_at | datetime | 更新时间 |
索引建议:
- `idx_exp_followup_biz(biz_type, biz_id, followup_time desc)`
- `idx_exp_followup_user(followup_user_id)`
---
## 4.9 `work_checkin` 外勤打卡表
对应工作台里的“外勤打卡”。
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| id | bigint PK | 主键 |
| user_id | bigint | 打卡人 |
| checkin_date | date | 打卡日期 |
| checkin_time | datetime | 打卡时间 |
| longitude | decimal(10,6) | 经度 |
| latitude | decimal(10,6) | 纬度 |
| location_text | varchar(255) | 地址文本 |
| remark | varchar(500) | 备注说明 |
| status | varchar(30) | 正常/异常/补卡 |
| created_at | datetime | 创建时间 |
| updated_at | datetime | 更新时间 |
索引建议:
- `idx_checkin_user_date(user_id, checkin_date desc)`
---
## 4.10 `work_checkin_attachment` 打卡附件表
前端要求“现场照片必填”,建议单独拆附件表。
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| id | bigint PK | 主键 |
| checkin_id | bigint | 打卡ID |
| file_url | varchar(255) | 文件地址 |
| file_type | varchar(30) | image/audio/video |
| file_name | varchar(255) | 原始文件名 |
| file_size | bigint | 文件大小 |
| created_at | datetime | 创建时间 |
索引建议:
- `idx_checkin_attachment_checkin(checkin_id)`
---
## 4.11 `work_daily_report` 日报表
对应“每日表”和右侧历史日报。
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| id | bigint PK | 主键 |
| user_id | bigint | 提交人 |
| report_date | date | 日报日期 |
| work_content | text | 今日工作内容 |
| tomorrow_plan | text | 明日工作计划 |
| source_type | varchar(30) | manual/voice |
| submit_time | datetime | 提交时间 |
| status | varchar(30) | 待提交/已提交/已阅/已点评 |
| score | int | 评分 |
| created_at | datetime | 创建时间 |
| updated_at | datetime | 更新时间 |
索引建议:
- `idx_daily_report_user_date(user_id, report_date desc)`
- `idx_daily_report_status(status)`
- `uk_daily_report_user_date(user_id, report_date)`
---
## 4.12 `work_daily_report_comment` 日报点评表
对应历史记录中的“主管点评”。
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| id | bigint PK | 主键 |
| report_id | bigint | 日报ID |
| reviewer_user_id | bigint | 点评人 |
| score | int | 评分 |
| comment_content | text | 点评内容 |
| reviewed_at | datetime | 点评时间 |
| created_at | datetime | 创建时间 |
索引建议:
- `idx_report_comment_report(report_id)`
---
## 4.13 `work_todo` 待办表(建议补充)
首页有“待办事项”,虽然现在是静态数据,但真实业务通常需要。
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| id | bigint PK | 主键 |
| user_id | bigint | 所属用户 |
| title | varchar(200) | 待办标题 |
| biz_type | varchar(30) | opportunity / expansion / report / other |
| biz_id | bigint | 业务对象ID |
| due_date | datetime | 截止时间 |
| status | varchar(20) | todo / done / canceled |
| priority | varchar(20) | high / medium / low |
| created_at | datetime | 创建时间 |
| updated_at | datetime | 更新时间 |
---
## 4.14 `sys_activity_log` 动态日志表(建议补充)
首页“最新动态”适合由统一动态表驱动。
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| id | bigint PK | 主键 |
| biz_type | varchar(30) | 业务类型 |
| biz_id | bigint | 业务ID |
| action_type | varchar(50) | 如商机阶段更新/日报点评/新增渠道 |
| title | varchar(200) | 动态标题 |
| content | varchar(500) | 动态描述 |
| operator_user_id | bigint | 操作人 |
| created_at | datetime | 创建时间 |
索引建议:
- `idx_activity_created(created_at desc)`
- `idx_activity_biz(biz_type, biz_id)`
---
## 5. 推荐枚举值
为了避免硬编码中文状态,建议状态字段统一使用编码值,前端再做字典映射。
### 商机阶段 `opportunity.stage`
- `initial_contact` 初步沟通
- `solution_discussion` 方案交流
- `bidding` 招投标
- `business_negotiation` 商务谈判
- `won` 已成交
- `lost` 已丢单
### 商机状态 `opportunity.status`
- `active`
- `won`
- `lost`
- `closed`
### 销售拓展意向 `sales_expansion.intent_level`
- `high`
- `medium`
- `low`
### 外勤打卡状态 `work_checkin.status`
- `normal`
- `abnormal`
- `reissue`
### 日报状态 `work_daily_report.status`
- `draft`
- `submitted`
- `read`
- `reviewed`
---
## 6. 第一版最小可落地表
如果先做 MVP建议优先落以下 8 张:
1. `sys_department`
2. `sys_user`
3. `crm_customer`
4. `crm_opportunity`
5. `crm_opportunity_followup`
6. `crm_channel_expansion`
7. `work_checkin`
8. `work_daily_report`
这 8 张就能支撑目前前端大部分核心展示。
如果要把“拓展管理”做完整,再补:
1. `crm_sales_expansion`
2. `crm_expansion_followup`
3. `work_checkin_attachment`
4. `work_daily_report_comment`
---
## 7. 建表原则建议
1. 所有业务表统一保留 `created_at`、`updated_at`。
2. 负责人、创建人、点评人等人员字段统一关联 `sys_user.id`
3. 跟进记录建议独立建表,不要直接塞进主表。
4. 金额统一用 `decimal(18,2)`,不要用字符串。
5. 时间类字段区分清楚 `date``datetime`
6. 中文状态不要直接写死在数据库,建议存编码值。
7. 如果后续要对接 OMS商机表中保留 `pushed_to_oms` 和外部系统单号字段会更稳妥。
---
## 8. 与前端页面的映射关系
### 商机页
- 列表:`crm_opportunity`
- 客户名称:`crm_customer`
- 详情跟进:`crm_opportunity_followup`
### 拓展页
- 销售拓展:`crm_sales_expansion`
- 渠道拓展:`crm_channel_expansion`
- 跟进记录:`crm_expansion_followup`
### 工作页
- 外勤打卡:`work_checkin`
- 打卡照片:`work_checkin_attachment`
- 日报:`work_daily_report`
- 主管点评:`work_daily_report_comment`
### 首页/我的
- 统计看板:由商机、拓展、打卡、日报聚合生成
- 待办事项:`work_todo`
- 最新动态:`sys_activity_log`
- 个人信息:`sys_user` + `sys_department`
---
## 9. 下一步建议
如果要继续往后端落地,建议按以下顺序推进:
1. 先定字段字典和状态流转
2. 再输出 MySQL DDL
3. 再补接口文档
4. 最后和前端页面一一对齐新增/编辑/详情接口
如果需要,我下一步可以直接继续帮你补一版 MySQL 建表 SQL。