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

## ✅ 后端开发完成状态

**创建文件统计**：
- 数据库SQL：1个（`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`表和数据字典：

```bash
# 方式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执行成功**：

```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`重启完成，无需额外操作。

**验证服务状态**：

```bash
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）

4. 填写转化表单：
   - 经销商名称：保持默认"测试贸易有限公司"
   - 经销商编码：DL20260001
   - 签约时间：选择今天或任意日期
   - 经销商等级：选择C级经销商

5. 点击"确认转化"按钮

**预期结果**：
- 显示"转化成功"提示
- Dialog自动关闭
- 线索列表刷新，该线索状态变为"已转化"
- 线索行的"转化"按钮消失或变为禁用状态

---

#### 后端数据验证

**验证线索状态更新**：

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

**预期结果**：
- `lead_status` = 'converted'
- `converted_dealer_id` 有值（指向新创建的经销商ID）

---

**验证经销商创建**：

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

**转化接口**：

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

**成功响应**：

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

**错误响应示例**：

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

---

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

**排查步骤**：
1. 查询线索数据：
   ```sql
   SELECT lead_id, lead_status, converted_dealer_id FROM crm_lead WHERE lead_id = {线索ID};
   ```
2. 检查`CrmLeadServiceImpl.convertToDealer`方法中是否执行了线索更新
3. 检查事务是否正确提交（方法有`@Transactional`注解）

---

### 问题4：Gateway路由失败

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

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

---

**当前任务完成，请开始测试！**