14 KiB
14 KiB
CRM业务表设计
1. 设计依据
本设计根据当前前端页面反推业务模型,涉及页面如下:
src/pages/Opportunities.tsx:商机储备、商机详情、跟进记录src/pages/Expansion.tsx:销售人员拓展、渠道拓展、跟进记录src/pages/Work.tsx:外勤打卡、日报、历史记录、主管点评src/pages/Profile.tsx:个人资料、统计信息src/pages/Dashboard.tsx:首页统计、待办、动态
当前前端是展示型页面,未接入真实接口,因此以下设计属于“按现有前端信息推导出的第一版业务库设计”。
2. 业务模块拆分
建议按以下模块建表:
- 组织与人员
- 客户与商机
- 拓展管理
- 工作管理
- 待办与动态(可选增强)
3. 核心实体关系
部门 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) | 手机号 |
| 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) | 手机号 |
| 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
activewonlostclosed
销售拓展意向 sales_expansion.intent_level
highmediumlow
外勤打卡状态 work_checkin.status
normalabnormalreissue
日报状态 work_daily_report.status
draftsubmittedreadreviewed
6. 第一版最小可落地表
如果先做 MVP,建议优先落以下 8 张:
sys_departmentsys_usercrm_customercrm_opportunitycrm_opportunity_followupcrm_channel_expansionwork_checkinwork_daily_report
这 8 张就能支撑目前前端大部分核心展示。
如果要把“拓展管理”做完整,再补:
crm_sales_expansioncrm_expansion_followupwork_checkin_attachmentwork_daily_report_comment
7. 建表原则建议
- 所有业务表统一保留
created_at、updated_at。 - 负责人、创建人、点评人等人员字段统一关联
sys_user.id。 - 跟进记录建议独立建表,不要直接塞进主表。
- 金额统一用
decimal(18,2),不要用字符串。 - 时间类字段区分清楚
date和datetime。 - 中文状态不要直接写死在数据库,建议存编码值。
- 如果后续要对接 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. 下一步建议
如果要继续往后端落地,建议按以下顺序推进:
- 先定字段字典和状态流转
- 再输出 MySQL DDL
- 再补接口文档
- 最后和前端页面一一对齐新增/编辑/详情接口
如果需要,我下一步可以直接继续帮你补一版 MySQL 建表 SQL。