# CRM商机管理功能 - 测试指引

## ✅ 开发完成状态

### 后端开发（hzhub-system）- 已完成

**创建文件**：
- 数据库SQL：1个（`crm_opportunity_init.sql`）
- Entity实体类：1个（`CrmOpportunity.java`）
- Bo业务对象：1个（`CrmOpportunityBo.java`）
- Vo视图对象：1个（`CrmOpportunityVo.java`）
- Mapper接口：1个（`CrmOpportunityMapper.java`）
- Mapper XML：1个（`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**

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

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

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

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

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

**验证服务状态**：

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

**后端验证**：

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

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

**成功响应**：

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

---

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

**排查步骤**：
1. 查询crm_opportunity表：
   ```sql
   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-3**：AI功能
- AI意向分析
- AI跟进摘要
- AI风险分析

**Week 4+**：企业微信集成

---

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