# 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。