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

2.4 KiB
Raw Blame History

CRM 线索转经销商 API 契约

基础信息

  • 服务: hzhub-system (8083)
  • API: POST /lead/convert
  • Gateway路由: /crm/** → StripPrefix=1 → /lead/convert

接口定义

线索转经销商

API: POST /lead/convert

请求参数 (CrmLeadConvertBo):

{
  "leadId": 1001,               // 必填线索ID
  "dealerName": "XX贸易有限公司", // 必填,经销商名称
  "dealerCode": "DL20260001",   // 必填,经销商编码
  "customerCode": "C001",       // 可选ERP客户编码
  "signedAt": "2026-05-20",     // 可选,签约时间
  "level": "C"                  // 可选经销商等级默认C
}

响应: R<Void>

{
  "code": 200,
  "msg": "转化成功"
}

业务逻辑

  1. 查询线索信息(crm_lead
  2. 校验线索状态(必须不是"已转化"
  3. 创建经销商记录(crm_dealer
    • 从线索复制基础信息companyName→dealerName, contactName, mobile, province, city
    • 设置 sourceLeadId = leadId
    • 设置 ownerUserId = lead.ownerUserId
  4. 迁移跟进记录(可选):
    • crm_lead_follow 数据复制到 crm_dealer_follow(如果有此表)
  5. 创建初始商机(crm_opportunity
    • opportunityName = "初始商机"
    • dealerId = 新经销商ID
    • stage = "初步接触"
  6. 更新线索状态:
    • leadStatus = "converted"
    • convertedDealerId = 新经销商ID
  7. 返回成功消息

数据字典

crm_dealer_level经销商等级

字典值 字典标签
A A级经销商
B B级经销商
C C级经销商

crm_lifecycle生命周期

字典值 字典标签
active 活跃期
stable 稳定期
decline 衰退期
churn 流失期

前端类型定义

export interface CrmLeadConvertBo {
  leadId: number;               // 必填
  dealerName: string;           // 必填
  dealerCode: string;           // 必填
  customerCode?: string;        // 可选
  signedAt?: string;            // 可选,格式 YYYY-MM-DD
  level?: string;               // 可选,默认 C
}

注意事项

  1. 数据校验: 线索ID必须存在且状态未转化
  2. 唯一性: dealerCode在同一租户内唯一
  3. 事务性: 整个转化过程使用事务(@Transactional
  4. ERP关联: 如果提供customerCode在经销商详情中可查看ERP数据