Files
hzhub/docs/crm-convert-plan.md
大壮 3f643ef31f feat: 完成CRM商机和线索管理模块开发
## 新增功能

### 商机中心 (/opportunity)
- Stats统计卡片(商机总数、金额、赢单、转化率)
- Pipeline商机管道(阶段Tab:全部/线索/谈判中/方案/赢单)
- 商机列表真实数据渲染(来自crm_opportunity表)
- 商机卡片详情(经销商、负责人、金额、概率)
- Pipeline计数实时更新

### 线索中心 (/lead)
- 线索列表完整功能(CRUD)
- 线索详情Drawer(基础信息 + 跟进记录Timeline)
- 新建线索(含ERP客户关联、手机号验证)
- 添加跟进记录(跟进方式、内容、下次时间)
- 分配负责人(用户选择器,显示真实姓名)
- 线索转经销商(自动创建商机)
- 删除线索(逻辑删除)

## 后端开发

### 数据库表
- crm_lead(线索表)
- crm_lead_follow(线索跟进记录表)
- crm_dealer(经销商表)
- crm_opportunity(商机表)
- crm_opportunity_follow(商机跟进记录表)
- 数据字典初始化

### API接口
- 线索管理:CRUD、详情、跟进、分配、转化
- 商机管理:列表查询
- 用户选择器:员工门户专用API

### 核心功能
- 线索转化自动创建经销商和商机
- 负责人翻译显示真实姓名(修复)
- 手机号前后端双重格式验证(修复)

## 前端开发

### 页面架构改进
- 商机中心:保留原CRM设计风格(Stats + Pipeline)
- 线索中心:独立页面(完整线索管理)
- 左侧菜单:独立菜单项(商机中心、线索中心)

### API模块
- src/api/crm/:线索和商机API类型定义和调用方法
- src/api/user/:用户选择器API

### 样式设计
- 商机中心:100%保持原CRM Pipeline设计风格
- 使用CSS变量系统(var(--radius-lg), var(--shadow-sm)等)
- Pipeline Tab白色圆角设计
- 商机卡片阴影和hover效果
- 头像堆叠显示

## 配置修改

- Gateway路由:添加CRM模块路由配置
- Gateway路由:添加system模块路由配置
- Aside菜单:拆分商机中心和线索中心

## Bug修复

- 修复负责人显示手机号问题(UserNameTranslationImpl返回昵称)
- 修复手机号格式验证缺失(前后端双重验证)
- 修复商机管道设计风格不一致(完整复制原CRM样式)

## 文档

- CRM销售模块详细设计说明书V3.md
- CRM线索转化API契约
- CRM线索转化开发计划
- CRM线索转化测试指引
- CRM线索管理测试指引
- CRM商机管理测试指引
- CRM架构改进报告
- CRM Bug修复报告

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-20 09:46:59 +00:00

150 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# CRM线索转经销商功能开发计划
## 功能概述
将线索转化为正式经销商,创建经销商档案、迁移跟进记录、创建初始商机。
---
## 数据表设计
### crm_dealer经销商表
```sql
CREATE TABLE IF NOT EXISTS crm_dealer (
dealer_id BIGINT NOT NULL COMMENT '经销商ID主键',
tenant_id VARCHAR(20) DEFAULT '000000' COMMENT '租户ID',
customer_code VARCHAR(100) DEFAULT NULL COMMENT 'ERP客户编码关联',
dealer_name VARCHAR(200) NOT NULL COMMENT '经销商名称',
dealer_code VARCHAR(100) NOT NULL COMMENT '经销商编码',
contact_name VARCHAR(100) DEFAULT NULL COMMENT '联系人',
mobile VARCHAR(50) DEFAULT NULL COMMENT '手机',
province VARCHAR(50) DEFAULT NULL COMMENT '',
city VARCHAR(50) DEFAULT NULL COMMENT '',
level VARCHAR(50) DEFAULT 'C' COMMENT '经销商等级字典crm_dealer_level',
lifecycle VARCHAR(50) DEFAULT 'active' COMMENT '生命周期字典crm_lifecycle',
signed_at DATETIME DEFAULT NULL COMMENT '签约时间',
store_count INT DEFAULT 0 COMMENT '门店数',
team_size INT DEFAULT 0 COMMENT '团队规模',
total_order_amount DECIMAL(18,2) DEFAULT 0 COMMENT '累计订单金额',
total_payment_amount DECIMAL(18,2) DEFAULT 0 COMMENT '累计回款金额',
activity_score DECIMAL(5,2) DEFAULT 0 COMMENT '活跃评分',
risk_score DECIMAL(5,2) DEFAULT 0 COMMENT '风险评分',
owner_user_id BIGINT DEFAULT NULL COMMENT '负责人(关联 sys_user',
source_lead_id BIGINT DEFAULT NULL COMMENT '来源线索ID',
create_dept BIGINT DEFAULT NULL COMMENT '创建部门',
create_by BIGINT DEFAULT NULL COMMENT '创建人',
create_time DATETIME DEFAULT NULL COMMENT '创建时间',
update_by BIGINT DEFAULT NULL COMMENT '更新人',
update_time DATETIME DEFAULT NULL COMMENT '更新时间',
del_flag INT DEFAULT 0 COMMENT '删除标志',
PRIMARY KEY (dealer_id),
KEY idx_tenant_id (tenant_id),
KEY idx_customer_code (customer_code),
KEY idx_dealer_code (dealer_code),
KEY idx_owner_user_id (owner_user_id),
KEY idx_source_lead_id (source_lead_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='CRM经销商表';
```
---
## 后端接口设计
### 1. 线索转经销商
**API**: `POST /lead/convert`
**请求参数**:
```json
{
"leadId": 1001,
"dealerName": "XX贸易有限公司",
"dealerCode": "DL20260001",
"customerCode": "C001" // 可选ERP客户编码
}
```
**业务逻辑**:
1. 查询线索信息
2. 创建 `crm_dealer` 记录
3. 迁移跟进记录:`crm_lead_follow``crm_dealer_follow`
4. 创建初始商机:`crm_opportunity`
5. 更新线索状态为"已转化"
6. 返回经销商ID
---
## 前端UI设计
### 转经销商Dialog
```vue
<el-dialog v-model="showConvertDialog" title="线索转经销商" width="600px">
<el-form :model="convertForm" label-width="120px">
<el-form-item label="经销商名称" required>
<el-input v-model="convertForm.dealerName" placeholder="默认为线索公司名称" />
</el-form-item>
<el-form-item label="经销商编码" required>
<el-input v-model="convertForm.dealerCode" placeholder="请输入经销商编码" />
</el-form-item>
<el-form-item label="ERP客户编码">
<el-input v-model="convertForm.customerCode" placeholder="可选关联ERP客户" />
</el-form-item>
<el-form-item label="签约时间">
<el-date-picker v-model="convertForm.signedAt" type="date" value-format="YYYY-MM-DD" />
</el-form-item>
<el-form-item label="经销商等级">
<el-select v-model="convertForm.level">
<el-option label="A级经销商" value="A" />
<el-option label="B级经销商" value="B" />
<el-option label="C级经销商" value="C" />
</el-select>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="showConvertDialog = false">取消</el-button>
<el-button type="success" @click="submitConvert">确认转化</el-button>
</template>
</el-dialog>
```
---
## 开发任务清单
### 后端任务
1. ✅ 创建数据表:`crm_dealer_init.sql`
2. ✅ Entity`CrmDealer.java`
3. ✅ Bo`CrmDealerBo.java`
4. ✅ Vo`CrmDealerVo.java`
5. ✅ Mapper`CrmDealerMapper.java`
6. ✅ Service`ICrmDealerService.java` + `Impl`
7. ✅ Controller转化接口 `POST /lead/convert`
### 前端任务
1. ✅ API定义`convertLeadToDealer()` 函数
2. ✅ 转经销商Dialog UI
3. ✅ 转化成功后列表刷新
---
## 开发顺序
建议按以下顺序开发:
**Day 1-2**: 后端开发
- 数据表、Entity、Service、Controller
**Day 3**: 前端开发
- Dialog UI、API调用、转化逻辑
**Day 4**: 测试验证
- 线索转化流程测试
- 经销商数据验证
---
请按照此计划开始开发。