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

10 KiB
Raw Blame History

CRM线索转经销商功能 - 测试指引

后端开发完成状态

创建文件统计

  • 数据库SQL1个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表和数据字典:

# 方式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执行成功

-- 检查表创建
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重启完成,无需额外操作。

验证服务状态

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
  1. 填写转化表单:

    • 经销商名称:保持默认"测试贸易有限公司"
    • 经销商编码DL20260001
    • 签约时间:选择今天或任意日期
    • 经销商等级选择C级经销商
  2. 点击"确认转化"按钮

预期结果

  • 显示"转化成功"提示
  • Dialog自动关闭
  • 线索列表刷新,该线索状态变为"已转化"
  • 线索行的"转化"按钮消失或变为禁用状态

后端数据验证

验证线索状态更新

-- 查询线索状态
SELECT lead_id, company_name, lead_status, converted_dealer_id
FROM crm_lead
WHERE company_name = '测试贸易有限公司';

预期结果

  • lead_status = 'converted'
  • converted_dealer_id 有值指向新创建的经销商ID

验证经销商创建

-- 查询经销商数据
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

转化接口

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"
}

成功响应

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

错误响应示例

{
  "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日志
    tail -f /data/hzhub/hzhub-system/logs/hzhub-system.log
    
  4. 确认CrmDealerMapper是否正确注入到CrmLeadServiceImpl

问题3转化成功但线索状态未更新

排查步骤

  1. 查询线索数据:
    SELECT lead_id, lead_status, converted_dealer_id FROM crm_lead WHERE lead_id = {线索ID};
    
  2. 检查CrmLeadServiceImpl.convertToDealer方法中是否执行了线索更新
  3. 检查事务是否正确提交(方法有@Transactional注解)

问题4Gateway路由失败

排查步骤

  1. 检查Gateway服务是否启动
  2. 检查Gateway路由配置
    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-3AI功能AI意向分析、AI跟进摘要、AI风险分析

Week 4+企业微信集成、移动H5页面


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