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

7.5 KiB
Raw Blame History

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自动关闭
  • 线索列表刷新,负责人列显示新分配的用户头像
  • 线索状态变为"跟进中"(如果之前是"新线索"

后端验证

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"吗?删除后无法恢复。"
  • 有"确定"和"取消"按钮
  1. 点击"确定"按钮

预期结果

  • 显示"删除成功"提示
  • 线索从列表消失(逻辑删除)

后端验证

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可选搜索关键词

请求示例

GET http://localhost:8080/system/user/portal/select?keyword=admin
Headers:
  Authorization: Bearer {token}
  ClientID: employee-portal

成功响应

{
  "code": 200,
  "msg": "操作成功",
  "data": [
    {
      "userId": 1,
      "userName": "admin",
      "nickName": "管理员",
      "deptName": "研发部门",
      "phonenumber": "15888888888",
      "status": "0"
    }
  ]
}

线索分配API

接口PUT /crm/lead/assign

请求参数

{
  "leadId": 1,
  "ownerUserId": 12345
}

请求示例

PUT http://localhost:8080/crm/lead/assign
Headers:
  Authorization: Bearer {token}
  ClientID: employee-portal
Body:
{
  "leadId": 1,
  "ownerUserId": 12345
}

成功响应

{
  "code": 200,
  "msg": "操作成功"
}

线索删除API

接口DELETE /crm/lead/{leadId}

请求示例

DELETE http://localhost:8080/crm/lead/1
Headers:
  Authorization: Bearer {token}
  ClientID: employee-portal

成功响应

{
  "code": 200,
  "msg": "操作成功"
}

🐛 常见问题排查

问题1用户选择器加载失败

排查步骤

  1. 检查hzhub-system服务是否启动
  2. 检查Gateway路由配置/system/**路由)
  3. 查看浏览器Console错误日志
  4. 查看后端日志:
    tail -f /data/hzhub/hzhub-system/logs/hzhub-system.log
    

问题2分配成功但负责人未更新

排查步骤

  1. 查询线索数据确认字段更新:
    SELECT lead_id, owner_user_id, lead_status FROM crm_lead WHERE lead_id = {线索ID};
    
  2. 检查前端是否调用了loadLeads()刷新列表
  3. 检查列表数据中的ownerUserName字段是否正确翻译

问题3删除后线索仍显示在列表

排查步骤

  1. 查询线索的del_flag字段:
    SELECT lead_id, del_flag FROM crm_lead WHERE lead_id = {线索ID};
    
  2. 检查前端列表查询是否正确过滤了del_flag=1的记录
  3. 检查后端Mapper查询条件是否包含del_flag过滤

问题4已转化线索仍显示分配按钮

排查步骤

  1. 检查前端条件渲染:
    <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-3AI功能

  1. AI意向分析 - 调用hzhub-ai服务分析线索意向
  2. AI跟进摘要 - 使用LangChain4j生成跟进摘要
  3. AI风险分析 - 基于线索数据生成风险评估

Week 4+:企业微信集成

  1. 移动端H5页面
  2. 企业微信侧边栏
  3. 企业微信消息推送

当前任务完成,请开始测试!