## 新增功能 ### 商机中心 (/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>
361 lines
7.5 KiB
Markdown
361 lines
7.5 KiB
Markdown
# 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. 企业微信消息推送
|
||
|
||
---
|
||
|
||
**当前任务完成,请开始测试!** |