Files
hzhub/docs/crm-assign-delete-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

361 lines
7.5 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- 已完成
**新增文件**
- 无新文件(修改现有文件)
**修改文件**
- SysUserController.java - 添加 `/system/user/portal/select` API员工门户用户选择器
**总计**1个文件修改
---
### 前端开发hzhub-portal-employee- 已完成
**新增文件**
- API文件2个`src/api/user/index.ts`, `src/api/user/types.ts`
**修改文件**
- 页面文件1个`src/pages/crm/index.vue`
- 添加分配和删除按钮操作列从220px扩展到280px
- 添加分配Dialog和用户选择器
- 添加删除确认逻辑
- 添加用户列表加载、分配提交、删除处理方法
**总计**2个新API文件 + 1个页面文件修改
---
## 🚀 测试步骤
### 前提条件
1. 确保数据库SQL已执行crm_dealer表和数据字典
2. 确保所有服务正常运行
3. 已完成线索转化功能测试
---
### 测试1用户选择器功能
**测试步骤**
1. 登录员工门户http://localhost:5137
2. 导航到"销售CRM" → "线索管理"Tab
3. 点击某个线索的"分配"按钮
4. 查看分配Dialog弹出
5. 查看用户选择下拉框
**预期结果**
- 分配Dialog正常弹出
- 用户选择下拉框显示用户列表
- 每个用户选项显示:昵称(用户名)- 部门名称
- 下拉框支持搜索过滤(输入关键词后实时搜索)
---
### 测试2线索分配功能
**测试步骤**
1. 在分配Dialog中选择一个用户作为负责人
2. 点击"确认分配"按钮
**预期结果**
- 显示"分配成功"提示
- Dialog自动关闭
- 线索列表刷新,负责人列显示新分配的用户头像
- 线索状态变为"跟进中"(如果之前是"新线索"
**后端验证**
```sql
SELECT lead_id, company_name, owner_user_id, lead_status
FROM crm_lead
WHERE lead_id = {线ID};
```
**预期结果**
- `owner_user_id` = 新分配的用户ID
- `lead_status` = 'following'(如果之前是'new'
---
### 测试3已转化线索的分配按钮隐藏
**测试步骤**
1. 查找已转化的线索(线索状态为"已转化"
2. 查看操作列按钮
**预期结果**
- "分配"按钮不显示(已转化线索不能分配)
- "转经销商"按钮不显示(已转化线索不能重复转化)
- 只显示"详情"、"跟进"、"删除"按钮
---
### 测试4线索删除功能
**测试步骤**
1. 创建一个测试线索(用于删除测试)
2. 点击该线索的"删除"按钮
3. 查看删除确认对话框
**预期结果**
- 弹出确认对话框,显示:"确定要删除线索"XXX"吗?删除后无法恢复。"
- 有"确定"和"取消"按钮
4. 点击"确定"按钮
**预期结果**
- 显示"删除成功"提示
- 线索从列表消失(逻辑删除)
**后端验证**
```sql
SELECT lead_id, company_name, del_flag
FROM crm_lead
WHERE lead_id = {线ID};
```
**预期结果**
- `del_flag` = 1逻辑删除标记
---
### 测试5删除取消操作
**测试步骤**
1. 点击某个线索的"删除"按钮
2. 在确认对话框中点击"取消"
**预期结果**
- 对话框关闭
- 线索列表不刷新
- 线索数据未删除
---
## 📊 完整功能测试清单
| 测试项 | 状态 | 备注 |
|---|---|---|
| 用户选择器加载 | ⏳ | |
| 用户搜索过滤 | ⏳ | |
| 分配Dialog显示 | ⏳ | |
| 正常分配流程 | ⏳ | |
| 已转化线索分配按钮隐藏 | ⏳ | |
| 删除确认对话框 | ⏳ | |
| 正常删除流程 | ⏳ | |
| 删除取消操作 | ⏳ | |
---
## 🔧 后端接口验证
### 用户选择器API
**接口**`GET /system/user/portal/select`
**请求参数**
- keyword可选搜索关键词
**请求示例**
```bash
GET http://localhost:8080/system/user/portal/select?keyword=admin
Headers:
Authorization: Bearer {token}
ClientID: employee-portal
```
**成功响应**
```json
{
"code": 200,
"msg": "操作成功",
"data": [
{
"userId": 1,
"userName": "admin",
"nickName": "管理员",
"deptName": "研发部门",
"phonenumber": "15888888888",
"status": "0"
}
]
}
```
---
### 线索分配API
**接口**`PUT /crm/lead/assign`
**请求参数**
```json
{
"leadId": 1,
"ownerUserId": 12345
}
```
**请求示例**
```bash
PUT http://localhost:8080/crm/lead/assign
Headers:
Authorization: Bearer {token}
ClientID: employee-portal
Body:
{
"leadId": 1,
"ownerUserId": 12345
}
```
**成功响应**
```json
{
"code": 200,
"msg": "操作成功"
}
```
---
### 线索删除API
**接口**`DELETE /crm/lead/{leadId}`
**请求示例**
```bash
DELETE http://localhost:8080/crm/lead/1
Headers:
Authorization: Bearer {token}
ClientID: employee-portal
```
**成功响应**
```json
{
"code": 200,
"msg": "操作成功"
}
```
---
## 🐛 常见问题排查
### 问题1用户选择器加载失败
**排查步骤**
1. 检查hzhub-system服务是否启动
2. 检查Gateway路由配置`/system/**`路由)
3. 查看浏览器Console错误日志
4. 查看后端日志:
```bash
tail -f /data/hzhub/hzhub-system/logs/hzhub-system.log
```
---
### 问题2分配成功但负责人未更新
**排查步骤**
1. 查询线索数据确认字段更新:
```sql
SELECT lead_id, owner_user_id, lead_status FROM crm_lead WHERE lead_id = {线索ID};
```
2. 检查前端是否调用了`loadLeads()`刷新列表
3. 检查列表数据中的`ownerUserName`字段是否正确翻译
---
### 问题3删除后线索仍显示在列表
**排查步骤**
1. 查询线索的`del_flag`字段:
```sql
SELECT lead_id, del_flag FROM crm_lead WHERE lead_id = {线索ID};
```
2. 检查前端列表查询是否正确过滤了`del_flag=1`的记录
3. 检查后端Mapper查询条件是否包含`del_flag`过滤
---
### 问题4已转化线索仍显示分配按钮
**排查步骤**
1. 检查前端条件渲染:
```vue
<el-button v-if="row.leadStatus !== 'converted'" ...>
```
2. 检查线索列表数据中`leadStatus`字段的值
3. 使用浏览器开发者工具检查元素是否被渲染
---
## ✅ 开发总结
### 实现的功能
1. **用户选择器**
- 员工门户专用用户选择API无需Sa-Token权限注解
- 支持关键词搜索过滤
- 返回简化用户信息ID、用户名、昵称、部门
- 只返回状态正常的用户
2. **线索分配**
- 分配按钮和Dialog UI
- 用户选择下拉框(支持搜索)
- 分配成功后更新负责人和状态
- 已转化线索不显示分配按钮
3. **线索删除**
- 删除按钮和确认对话框
- 逻辑删除设置del_flag=1
- 删除成功后列表刷新
- 用户可取消删除操作
### 技术要点
- **Gateway权限控制**员工门户API不需要Sa-Token权限注解权限由Gateway统一控制
- **用户选择器优化**使用分页查询pageSize=1000获取所有用户避免性能问题
- **前端交互优化**使用ElMessageBox.confirm提供删除确认防止误操作
- **状态联动**:分配线索时自动将状态更新为"跟进中"
---
## 🎯 下一步开发计划
根据"方案A实用优先",后续开发顺序:
**Week 2-3**AI功能
1. AI意向分析 - 调用hzhub-ai服务分析线索意向
2. AI跟进摘要 - 使用LangChain4j生成跟进摘要
3. AI风险分析 - 基于线索数据生成风险评估
**Week 4+**:企业微信集成
1. 移动端H5页面
2. 企业微信侧边栏
3. 企业微信消息推送
---
**当前任务完成,请开始测试!**