Files
hzhub/docs/crm-opportunity-testing-guide.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

393 lines
9.7 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商机管理功能 - 测试指引
## ✅ 开发完成状态
### 后端开发hzhub-system- 已完成
**创建文件**
- 数据库SQL1个`crm_opportunity_init.sql`
- Entity实体类1个`CrmOpportunity.java`
- Bo业务对象1个`CrmOpportunityBo.java`
- Vo视图对象1个`CrmOpportunityVo.java`
- Mapper接口1个`CrmOpportunityMapper.java`
- Mapper XML1个`CrmOpportunityMapper.xml`
- Service接口1个`ICrmOpportunityService.java`
- Service实现1个`CrmOpportunityServiceImpl.java`
- Controller控制器1个`CrmOpportunityController.java`
**修改文件**
- CrmLeadServiceImpl.java - 在线索转化时自动创建初始商机
**总计**9个新文件 + 1个SQL文件 + 1个现有文件修改
---
### 前端开发hzhub-portal-employee- 已完成
**修改文件**
- API类型定义1个修改`api/crm/types.ts`,添加商机类型)
- API调用方法1个修改`api/crm/index.ts`添加商机API
- CRM页面1个修改`pages/crm/index.vue`,商机管道使用真实数据)
**总计**3个文件修改
---
## 🚀 测试步骤
### 步骤1数据库初始化
**⚠️ 重要必须先执行数据库SQL**
创建商机表、跟进记录表和数据字典:
```bash
# 方式1使用Docker MySQL容器推荐
cd /data/hzhub/hzhub-deploy
sudo docker compose exec -T mysql mysql -u root -pHzhub@2024 hzhub < /data/hzhub/hzhub-system/src/main/resources/db/crm_opportunity_init.sql
# 方式2手动在数据库客户端执行
# 打开数据库客户端如Navicat、DBeaver连接到hzhub数据库
# 执行SQL文件/data/hzhub/hzhub-system/src/main/resources/db/crm_opportunity_init.sql
```
**验证SQL执行成功**
```bash
# 检查表创建
sudo docker compose exec mysql mysql -u root -pHzhub@2024 hzhub -e "SHOW TABLES LIKE 'crm_opportunity';"
sudo docker compose exec mysql mysql -u root -pHzhub@2024 hzhub -e "SHOW TABLES LIKE 'crm_opportunity_follow';"
# 检查数据字典
sudo docker compose exec mysql mysql -u root -pHzhub@2024 hzhub -e "SELECT dict_type, dict_name FROM sys_dict_type WHERE dict_type IN ('crm_opportunity_stage', 'crm_opportunity_status');"
```
**预期结果**
- `crm_opportunity`表存在(商机表)
- `crm_opportunity_follow`表存在(跟进记录表)
- 数据字典类型:`crm_opportunity_stage`(商机阶段)、`crm_opportunity_status`(商机状态)
- 商机阶段数据lead、negotiation、proposal、closing、lost
- 商机状态数据active、won、lost、paused
---
### 步骤2重启服务
由于修改了后端代码和前端代码,需要重启服务:
```bash
cd /data/hzhub
./restart-all.sh
```
**验证服务状态**
```bash
./status-all.sh
```
**预期结果**
- hzhub-system: Running
- hzhub-gateway: Running
- hzhub-portal-employee: Running
---
### 步骤3测试商机管道功能
#### 测试准备:转化线索创建经销商
1. 登录员工门户http://localhost:5137
2. 导航到"销售CRM" → "线索管理"Tab
3. 选择一个线索,点击"转化"按钮
4. 填写转化表单(经销商编码、签约时间等)
5. 点击"确认转化"
**预期结果**
- 线索转化成功
- 创建经销商记录
- **自动创建初始商机**(商机名称="初始商机",阶段="lead"
---
#### 测试1商机管道显示真实数据
**测试步骤**
1. 点击"商机管道"Tab
2. 查看Pipeline视图
**预期结果**
- 商机管道显示真实数据不再是mock数据
- Pipeline顶部显示各阶段计数全部、线索、谈判中、方案、赢单
- 商机卡片显示:
- 商机名称(如"初始商机"
- 经销商名称(如"测试贸易有限公司"
- 负责人姓名
- 预计成交日期
- 商机金额
- 阶段标签(线索/赢单等)
---
#### 测试2商机阶段筛选
**测试步骤**
1. 在商机管道顶部点击不同阶段Tab全部、线索、谈判中、方案、赢单
2. 观察商机卡片的变化
**预期结果**
- 点击"线索"Tab只显示阶段为"lead"的商机
- 点击"赢单"Tab只显示阶段为"closing"的商机
- 计数实时更新
---
#### 测试3自动创建商机验证
**后端验证**
```sql
-- 查询刚转化的线索对应的商机
SELECT o.opportunity_id, o.opportunity_name, o.dealer_id, o.stage, o.source_lead_id,
d.dealer_name, d.dealer_code
FROM crm_opportunity o
LEFT JOIN crm_dealer d ON o.dealer_id = d.dealer_id
WHERE o.source_lead_id = {线ID};
```
**预期结果**
- 商机记录存在
- `opportunity_name` = '初始商机'
- `stage` = 'lead'
- `dealer_id` 关联到新创建的经销商
- `source_lead_id` = 线索ID
- `dealer_name` 显示经销商名称
---
#### 测试4商机列表API测试
**API调用测试**使用Postman或curl
```bash
GET http://localhost:8080/crm/opportunity/list?pageNum=1&pageSize=10
Headers:
Authorization: Bearer {token}
ClientID: employee-portal
```
**成功响应**
```json
{
"code": 200,
"msg": "查询成功",
"data": {
"rows": [
{
"opportunityId": 1,
"opportunityName": "初始商机",
"dealerId": 1,
"dealerName": "测试贸易有限公司",
"stage": "lead",
"stageName": "线索",
"amount": 0,
"probability": 10,
"ownerUserId": 1,
"ownerUserName": "管理员",
"status": "active",
"statusName": "进行中"
}
],
"total": 1
}
}
```
---
## 📊 完整功能测试清单
| 测试项 | 状态 | 备注 |
|---|---|---|
| 数据库SQL执行 | ⏳ 待执行 | |
| 表创建验证 | ⏳ 待测试 | |
| 数据字典验证 | ⏳ 待测试 | |
| 服务重启 | ⏳ 待执行 | |
| 线索转化创建商机 | ⏳ 待测试 | |
| 商机管道显示 | ⏳ 待测试 | |
| 商机阶段筛选 | ⏳ 待测试 | |
| 商机数据验证 | ⏳ 待测试 | |
| 商机列表API | ⏳ 待测试 | |
---
## 🐛 常见问题排查
### 问题1商机管道显示空列表
**排查步骤**
1. 检查crm_opportunity表是否创建
2. 检查是否有商机数据(先转化线索创建经销商)
3. 查看浏览器Console错误日志
4. 查看后端日志:
```bash
tail -f /data/hzhub/hzhub-system/logs/hzhub-system.log
```
---
### 问题2线索转化后商机未创建
**排查步骤**
1. 查询crm_opportunity表
```sql
SELECT * FROM crm_opportunity WHERE source_lead_id = {线索ID};
```
2. 检查CrmLeadServiceImpl.convertToDealer方法是否正确调用opportunityService
3. 查看后端日志中的商机创建记录
---
### 问题3商机管道仍显示mock数据
**排查步骤**
1. 检查前端代码是否正确导入getOpportunityList
2. 检查onMounted是否调用loadOpportunities
3. 检查opportunityList是否绑定到商机卡片渲染
4. 清空浏览器缓存重新加载页面
---
### 问题4负责人显示为空
**排查步骤**
1. 查询商机数据中的owner_user_id字段
2. 检查用户翻译是否生效UserNameTranslationImpl
3. 查询sys_user表确认用户数据存在
---
## 🎯 功能说明
### 商机管道设计
**数据流**
```
线索(crm_lead)
↓转化
经销商(crm_dealer)
↓自动创建
商机(crm_opportunity) [阶段:lead]
↓跟进推进
└阶段变化: lead → negotiation → proposal → closing
```
**阶段含义**
- **lead线索**:初始商机,刚转化
- **negotiation谈判中**:正在谈判价格和条件
- **proposal方案**:已提交方案报价
- **closing赢单**:即将成交
- **lost输单**:商机失败
**商机管道视图**
- 管道顶部阶段Tab切换全部/线索/谈判中/方案/赢单)
- 管道卡片:商机信息(名称、经销商、负责人、金额、日期)
- 实时计数:各阶段商机数量统计
---
## ✅ 开发总结
### 实现的功能
1. **数据库层**
- 创建crm_opportunity表商机表
- 创建crm_opportunity_follow表跟进记录表
- 初始化商机阶段和状态数据字典
2. **业务逻辑层**
- 商机CRUD完整功能新增、修改、删除、查询
- 线索转化自动创建初始商机
- 商机关联经销商方案A
- 商机数据翻译(经销商名称、负责人姓名)
3. **前端交互层**
- 商机管道使用真实数据渲染
- Pipeline阶段Tab切换和筛选
- 商机卡片动态显示
- 实时计数统计
### 架构关系
**确认的设计方案**
- ✅ 方案A商机关联经销商
- ✅ 商机管道"客户" = 经销商
- ✅ ERP客户是独立对象数据参考源
- ✅ 创建crm_opportunity表
**数据关系图**
```
ERP客户独立对象数据源
↓(可选关联)
线索crm_lead
↓转化
经销商crm_dealer
↓关联
商机crm_opportunity[可多个]
↓跟进
商机跟进记录crm_opportunity_follow
```
---
## 📝 后续开发建议
### 待实现功能
1. **商机跟进功能**
- 添加商机跟进按钮和Dialog
- 创建跟进记录
- AI跟进摘要
2. **商机编辑功能**
- 商机详情查看
- 商机信息修改
- 阶段推进
3. **商机新建功能**
- 直接为经销商创建新商机(不通过线索转化)
4. **商机筛选增强**
- 经销商搜索筛选
- 负责人筛选
- 商机金额范围筛选
5. **商机统计分析**
- 商机金额统计
- 成功率分析
- 阶段转化率分析
---
## 🎯 下一步开发计划
根据"方案A实用优先",后续开发顺序:
**本周剩余时间**:完善商机基础功能
- 商机跟进功能
- 商机详情查看
- 商机编辑功能
**Week 2-3**AI功能
- AI意向分析
- AI跟进摘要
- AI风险分析
**Week 4+**:企业微信集成
---
**当前任务完成请执行SQL并开始测试**