## 新增功能 ### 商机中心 (/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>
397 lines
10 KiB
Markdown
397 lines
10 KiB
Markdown
# CRM线索转经销商功能 - 测试指引
|
||
|
||
## ✅ 后端开发完成状态
|
||
|
||
**创建文件统计**:
|
||
- 数据库SQL:1个(`crm_dealer_init.sql`)
|
||
- Entity实体类:1个(`CrmDealer.java`)
|
||
- Bo业务对象:2个(`CrmDealerBo.java`, `CrmLeadConvertBo.java`)
|
||
- Vo视图对象:1个(`CrmDealerVo.java`)
|
||
- Mapper接口:1个(`CrmDealerMapper.java`)
|
||
- Service实现:修改1个(`CrmLeadServiceImpl.java`,添加`convertToDealer`方法)
|
||
- Controller:修改1个(`CrmLeadController.java`,添加`POST /lead/convert`接口)
|
||
|
||
**总计**:6个新代码文件 + 1个SQL文件 + 2个现有文件修改
|
||
|
||
---
|
||
|
||
## ✅ 前端开发完成状态
|
||
|
||
**修改文件统计**:
|
||
- 页面扩展:1个(`/crm/index.vue`,添加转经销商Dialog和转化逻辑)
|
||
- API类型定义:1个修改(`types.ts`,添加`LeadConvertRequest`类型)
|
||
- API调用方法:1个修改(`index.ts`,添加`convertLeadToDealer`函数)
|
||
|
||
**总计**:3个文件修改
|
||
|
||
---
|
||
|
||
## 🚀 测试步骤
|
||
|
||
### 步骤1:数据库初始化
|
||
|
||
**⚠️ 重要:必须先执行数据库SQL**
|
||
|
||
执行SQL脚本创建`crm_dealer`表和数据字典:
|
||
|
||
```bash
|
||
# 方式1:使用Docker MySQL容器(推荐)
|
||
cd /data/hzhub/hzhub-deploy
|
||
docker compose exec -T mysql mysql -u root -pHzhub@2024 hzhub < /data/hzhub/hzhub-system/src/main/resources/db/crm_dealer_init.sql
|
||
|
||
# 方式2:手动在数据库客户端执行
|
||
# 打开数据库客户端(如Navicat、DBeaver),连接到hzhub数据库
|
||
# 执行SQL文件:/data/hzhub/hzhub-system/src/main/resources/db/crm_dealer_init.sql
|
||
```
|
||
|
||
**验证SQL执行成功**:
|
||
|
||
```sql
|
||
-- 检查表创建
|
||
SHOW TABLES LIKE 'crm_dealer';
|
||
DESC crm_dealer;
|
||
|
||
-- 检查数据字典
|
||
SELECT dict_type, dict_name FROM sys_dict_type WHERE dict_type IN ('crm_dealer_level', 'crm_lifecycle');
|
||
SELECT dict_value, dict_label FROM sys_dict_data WHERE dict_type = 'crm_dealer_level';
|
||
SELECT dict_value, dict_label FROM sys_dict_data WHERE dict_type = 'crm_lifecycle';
|
||
```
|
||
|
||
**预期结果**:
|
||
- `crm_dealer`表存在,包含所有字段
|
||
- 数据字典类型:`crm_dealer_level`(经销商等级)、`crm_lifecycle`(生命周期)
|
||
- 经销商等级数据:A、B、C
|
||
- 生命周期数据:active、stable、decline、churn
|
||
|
||
---
|
||
|
||
### 步骤2:重启后端服务
|
||
|
||
所有服务已通过`restart-all.sh`重启完成,无需额外操作。
|
||
|
||
**验证服务状态**:
|
||
|
||
```bash
|
||
cd /data/hzhub
|
||
./status-all.sh
|
||
```
|
||
|
||
**预期结果**:
|
||
- hzhub-system: Running (PID: 1771446)
|
||
- hzhub-gateway: Running (PID: 1771913)
|
||
- hzhub-portal-employee: Running (PID: 1772306)
|
||
|
||
---
|
||
|
||
### 步骤3:测试线索转化功能
|
||
|
||
#### 测试准备:创建测试线索
|
||
|
||
1. 登录员工门户:http://localhost:5137
|
||
2. 导航到"销售CRM" → "线索管理"Tab
|
||
3. 点击"新建线索",填写以下信息:
|
||
- 公司名称:测试贸易有限公司
|
||
- 联系人:张三
|
||
- 手机号:13800138000
|
||
- 线索来源:活动
|
||
- 活动名称:春季招商会
|
||
|
||
4. 点击"创建线索",确认创建成功
|
||
|
||
---
|
||
|
||
#### 测试转化流程
|
||
|
||
**测试步骤**:
|
||
|
||
1. 在线索列表中,找到刚创建的测试线索
|
||
2. 点击该线索行的"转化"按钮
|
||
3. 查看转经销商Dialog弹出
|
||
|
||
**Dialog字段检查**:
|
||
- 经销商名称:默认填充线索公司名称(可修改)
|
||
- 经销商编码:输入框(必填)
|
||
- ERP客户编码:输入框(可选)
|
||
- 签约时间:日期选择器(可选)
|
||
- 经销商等级:下拉选择(默认C,可选:A/B/C)
|
||
|
||
4. 填写转化表单:
|
||
- 经销商名称:保持默认"测试贸易有限公司"
|
||
- 经销商编码:DL20260001
|
||
- 签约时间:选择今天或任意日期
|
||
- 经销商等级:选择C级经销商
|
||
|
||
5. 点击"确认转化"按钮
|
||
|
||
**预期结果**:
|
||
- 显示"转化成功"提示
|
||
- Dialog自动关闭
|
||
- 线索列表刷新,该线索状态变为"已转化"
|
||
- 线索行的"转化"按钮消失或变为禁用状态
|
||
|
||
---
|
||
|
||
#### 后端数据验证
|
||
|
||
**验证线索状态更新**:
|
||
|
||
```sql
|
||
-- 查询线索状态
|
||
SELECT lead_id, company_name, lead_status, converted_dealer_id
|
||
FROM crm_lead
|
||
WHERE company_name = '测试贸易有限公司';
|
||
```
|
||
|
||
**预期结果**:
|
||
- `lead_status` = 'converted'
|
||
- `converted_dealer_id` 有值(指向新创建的经销商ID)
|
||
|
||
---
|
||
|
||
**验证经销商创建**:
|
||
|
||
```sql
|
||
-- 查询经销商数据
|
||
SELECT dealer_id, dealer_name, dealer_code, contact_name, mobile, level, lifecycle, source_lead_id
|
||
FROM crm_dealer
|
||
WHERE dealer_code = 'DL20260001';
|
||
```
|
||
|
||
**预期结果**:
|
||
- `dealer_name` = '测试贸易有限公司'
|
||
- `dealer_code` = 'DL20260001'
|
||
- `contact_name` = '张三'(从线索复制)
|
||
- `mobile` = '13800138000'(从线索复制)
|
||
- `level` = 'C'
|
||
- `lifecycle` = 'active'
|
||
- `source_lead_id` = 线索ID(关联)
|
||
|
||
---
|
||
|
||
#### 测试重复转化(负面测试)
|
||
|
||
**测试步骤**:
|
||
|
||
1. 尝试再次转化已转化的线索
|
||
2. 点击已转化线索的"转化"按钮
|
||
|
||
**预期结果**:
|
||
- 后端返回错误:"线索已转化,不能重复转化"
|
||
- Dialog显示错误提示
|
||
|
||
---
|
||
|
||
#### 测试经销商编码唯一性(负面测试)
|
||
|
||
**测试步骤**:
|
||
|
||
1. 创建另一个新线索(不同手机号):
|
||
- 公司名称:另一个测试公司
|
||
- 联系人:李四
|
||
- 手机号:13900139000
|
||
|
||
2. 点击"转化",填写表单:
|
||
- 经销商编码:DL20260001(重复编码)
|
||
|
||
3. 点击"确认转化"
|
||
|
||
**预期结果**:
|
||
- 后端返回错误:"经销商编码已存在"
|
||
- Dialog显示错误提示
|
||
|
||
---
|
||
|
||
## 🔧 后端接口验证
|
||
|
||
### API调用测试(使用Postman或curl)
|
||
|
||
**转化接口**:
|
||
|
||
```bash
|
||
POST http://localhost:8080/crm/lead/convert
|
||
Headers:
|
||
Authorization: Bearer {token}
|
||
ClientID: employee-portal
|
||
Body:
|
||
{
|
||
"leadId": 1,
|
||
"dealerName": "测试贸易有限公司",
|
||
"dealerCode": "DL20260001",
|
||
"signedAt": "2026-05-20",
|
||
"level": "C"
|
||
}
|
||
```
|
||
|
||
**成功响应**:
|
||
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"msg": "操作成功"
|
||
}
|
||
```
|
||
|
||
**错误响应示例**:
|
||
|
||
```json
|
||
{
|
||
"code": 500,
|
||
"msg": "线索已转化,不能重复转化"
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 📊 完整功能测试清单
|
||
|
||
| 测试项 | 预期结果 | 实际结果 | 备注 |
|
||
|---|---|---|---|
|
||
| 数据库SQL执行 | 表和数据字典创建成功 | ✅/❌ | |
|
||
| 服务重启 | 所有服务正常运行 | ✅/❌ | |
|
||
| 创建测试线索 | 线索创建成功 | ✅/❌ | |
|
||
| 转化Dialog显示 | Dialog正常弹出,字段完整 | ✅/❌ | |
|
||
| 默认值填充 | 公司名称自动填充 | ✅/❌ | |
|
||
| 经销商等级下拉 | 显示A/B/C选项,默认C | ✅/❌ | |
|
||
| 正常转化流程 | 转化成功,提示显示 | ✅/❌ | |
|
||
| 线索状态更新 | lead_status = converted | ✅/❌ | |
|
||
| 经销商数据创建 | 所有字段正确复制 | ✅/❌ | |
|
||
| 重复转化拦截 | 错误提示显示 | ✅/❌ | |
|
||
| 编码唯一性校验 | 错误提示显示 | ✅/❌ | |
|
||
|
||
---
|
||
|
||
## 🐛 常见问题排查
|
||
|
||
### 问题1:转化按钮点击无响应
|
||
|
||
**排查步骤**:
|
||
1. 检查浏览器Console是否有错误日志
|
||
2. 检查前端代码中`submitConvert`函数是否正确实现
|
||
3. 检查`convertLeadToDealer` API调用是否正常
|
||
|
||
---
|
||
|
||
### 问题2:转化成功但经销商数据未创建
|
||
|
||
**排查步骤**:
|
||
1. 检查数据库中`crm_dealer`表是否创建成功
|
||
2. 检查数据字典是否存在
|
||
3. 查看hzhub-system日志:
|
||
```bash
|
||
tail -f /data/hzhub/hzhub-system/logs/hzhub-system.log
|
||
```
|
||
4. 确认`CrmDealerMapper`是否正确注入到`CrmLeadServiceImpl`
|
||
|
||
---
|
||
|
||
### 问题3:转化成功但线索状态未更新
|
||
|
||
**排查步骤**:
|
||
1. 查询线索数据:
|
||
```sql
|
||
SELECT lead_id, lead_status, converted_dealer_id FROM crm_lead WHERE lead_id = {线索ID};
|
||
```
|
||
2. 检查`CrmLeadServiceImpl.convertToDealer`方法中是否执行了线索更新
|
||
3. 检查事务是否正确提交(方法有`@Transactional`注解)
|
||
|
||
---
|
||
|
||
### 问题4:Gateway路由失败
|
||
|
||
**排查步骤**:
|
||
1. 检查Gateway服务是否启动
|
||
2. 检查Gateway路由配置:
|
||
```bash
|
||
cat /data/hzhub/hzhub-gateway/src/main/resources/application.yml | grep -A 10 "hzhub-crm"
|
||
```
|
||
3. 测试Gateway健康:http://localhost:8080/actuator/health
|
||
|
||
---
|
||
|
||
## ✅ 测试完成确认
|
||
|
||
**请按照以上步骤进行测试,完成后告知测试结果。**
|
||
|
||
**测试报告格式**:
|
||
|
||
```
|
||
测试日期:{填写日期}
|
||
测试人员:{填写姓名}
|
||
|
||
测试结果:
|
||
- 数据库初始化:✅/❌
|
||
- 转化功能:✅/❌
|
||
- 数据验证:✅/❌
|
||
- 异常处理:✅/❌
|
||
|
||
问题记录:
|
||
1. {问题描述}
|
||
2. {问题描述}
|
||
|
||
下一步建议:
|
||
{填写内容}
|
||
```
|
||
|
||
---
|
||
|
||
## 📝 开发总结
|
||
|
||
### 实现的功能
|
||
|
||
1. **数据库层**:
|
||
- 创建`crm_dealer`表,包含经销商完整字段
|
||
- 初始化经销商等级和生命周期数据字典
|
||
- 建立线索与经销商的关联(`converted_dealer_id`, `source_lead_id`)
|
||
|
||
2. **业务逻辑层**:
|
||
- 线索状态校验(防止重复转化)
|
||
- 经销商编码唯一性校验
|
||
- 从线索复制基础信息到经销商
|
||
- 线索状态更新为"已转化"
|
||
- 关联线索和经销商ID
|
||
- 事务保证数据一致性
|
||
|
||
3. **前端交互层**:
|
||
- 转经销商Dialog UI
|
||
- 表单字段默认值填充(公司名称)
|
||
- 经销商等级下拉选择
|
||
- 转化成功提示和列表刷新
|
||
- 错误提示显示
|
||
|
||
### 待实现功能(后续阶段)
|
||
|
||
1. **跟进记录迁移**:
|
||
- 将线索跟进记录迁移到经销商跟进记录表(需要创建`crm_dealer_follow`表)
|
||
|
||
2. **初始商机创建**:
|
||
- 转化时自动创建初始商机(需要创建`crm_opportunity`表)
|
||
|
||
3. **ERP数据关联**:
|
||
- 如果提供了ERP客户编码,在经销商详情中可查看ERP数据
|
||
|
||
4. **用户选择器集成**:
|
||
- 分配线索时使用真实的用户选择组件
|
||
|
||
5. **线索删除功能**:
|
||
- 完整的线索删除功能实现
|
||
|
||
---
|
||
|
||
## 🎯 下一阶段功能预告
|
||
|
||
根据"方案A:实用优先",后续开发顺序:
|
||
|
||
**第2项功能**:用户选择器组件
|
||
- 替换线索分配中的硬编码用户ID输入
|
||
- 实现真实的用户选择下拉组件
|
||
|
||
**第3项功能**:线索删除功能
|
||
- 完善删除按钮和确认逻辑
|
||
|
||
**Week 2-3**:AI功能(AI意向分析、AI跟进摘要、AI风险分析)
|
||
|
||
**Week 4+**:企业微信集成、移动H5页面
|
||
|
||
---
|
||
|
||
**当前任务完成,请开始测试!** |