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

9.7 KiB
Raw Blame History

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

创建商机表、跟进记录表和数据字典:

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

# 检查表创建
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重启服务

由于修改了后端代码和前端代码,需要重启服务:

cd /data/hzhub
./restart-all.sh

验证服务状态

./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自动创建商机验证

后端验证

-- 查询刚转化的线索对应的商机
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

GET http://localhost:8080/crm/opportunity/list?pageNum=1&pageSize=10
Headers:
  Authorization: Bearer {token}
  ClientID: employee-portal

成功响应

{
  "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. 查看后端日志:
    tail -f /data/hzhub/hzhub-system/logs/hzhub-system.log
    

问题2线索转化后商机未创建

排查步骤

  1. 查询crm_opportunity表
    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-3AI功能

  • AI意向分析
  • AI跟进摘要
  • AI风险分析

Week 4+:企业微信集成


当前任务完成请执行SQL并开始测试