Files
mcp-server-demo/docs/crm/数据表与种子数据说明.md

279 lines
16 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# MCP for CRM — 数据表结构与种子数据说明文档
> 数据库:PostgreSQL 15+,库 `smart_quotation_auto`(与 ERP 服务共库不同表)
> 建表/种子脚本:`sql/init.sql`(v3,幂等可重跑);执行入口:`cd src && python3 seed.py`
> 版本:v1.0(2026-08-09)
---
## 1 概览
| # | 表名 | 用途 | 主键 | 种子行数 |
|---|------|------|------|----------|
| 1 | `customer` | 客户主数据(信用/折扣/账期) | customer_code | 20 |
| 2 | `inquiry` | 询价单 | inquiry_id | 9 |
| 3 | `inquiry_item` | 询价明细行(多零件) | id(SERIAL) | 9 |
| 4 | `quotation` | 报价单(多版本链) | quotation_id | 7 |
| 5 | `quotation_cost_detail` | 报价成本明细 | id(SERIAL) | 7 |
| 6 | `opportunity` | 商机 | opportunity_id | 8 |
| 7 | `quotation_mock` | 报价写入 CRM 模拟(独立 mock 表) | quotation_id | 0(运行时写入) |
**表关系**:
```
customer ──┬── inquiry ──── inquiry_item (客户 1─N 询价;询价 1─N 明细行)
├── quotation ── quotation_cost_detail(客户 1─N 报价;报价 1─1 成本明细)
│ └── inquiry_id 关联询价(版本链:同询价 N 版报价)
└── opportunity (客户 1─N 商机)
```
**外键**:inquiry/inquiry_item/quotation/opportunity 均外键指向 `customer.customer_code`;inquiry_item → inquiry;quotation → inquiry(可空);quotation_cost_detail → quotation。`quotation_mock` 无任何外键,为独立模拟表。
---
## 2 表结构详解
### 2.1 customer — 客户
| 列 | 类型 | 约束/默认 | 说明 |
|----|------|-----------|------|
| `customer_code` | VARCHAR(50) | PRIMARY KEY | 客户编码,如 `OEM-2024-003` |
| `name` | VARCHAR(200) | NOT NULL | 客户名称 |
| `oem_tier` | VARCHAR(20) | NOT NULL | OEM / Tier1 / Tier2 |
| `credit_level` | VARCHAR(5) | DEFAULT 'B' | 信用等级:A/B/C/D/无评级 |
| `discount_rate` | DECIMAL(4,3) | DEFAULT 0 | 折扣率(0.040 = 4%) |
| `payment_days` | INTEGER | DEFAULT 30 | 账期天数(0 = 货到付款/预付) |
| `contact_person` / `phone` / `email` | VARCHAR | — | 联系人信息 |
| `industry` / `region` | VARCHAR(50) | — | 行业 / 区域 |
| `total_orders` | INTEGER | DEFAULT 0 | 历史订单数 |
| `total_amount` | DECIMAL(14,2) | DEFAULT 0 | 历史订单总额 |
| `notes` | TEXT | — | 备注(风险提示等) |
| `created_at` | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP | 建档时间 |
### 2.2 inquiry — 询价单
| 列 | 类型 | 约束/默认 | 说明 |
|----|------|-----------|------|
| `inquiry_id` | VARCHAR(50) | PRIMARY KEY | 询价单号 `INQ-YYYY-NNNN` |
| `customer_code` | VARCHAR(50) | NOT NULL,FK | 客户编码 |
| `inquiry_date` | DATE | NOT NULL DEFAULT CURRENT_DATE | 询价日期 |
| `drawing_number` | VARCHAR(100) | — | 图纸号 |
| `part_number` | VARCHAR(100) | — | 零件号 |
| `annual_volume` | INTEGER | — | 年用量(件/年) |
| `target_price` | DECIMAL(10,2) | — | 客户目标价 ¥ |
| `status` | VARCHAR(20) | DEFAULT 'pending' | pending / quoted(首报自动推进);种子含历史态 completed/processing/lost |
| `notes` | TEXT | — | 备注 |
| `created_at` | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP | 创建时间 |
### 2.3 inquiry_item — 询价明细行
| 列 | 类型 | 约束/默认 | 说明 |
|----|------|-----------|------|
| `id` | SERIAL | PRIMARY KEY | 自增主键 |
| `inquiry_id` | VARCHAR(50) | NOT NULL,FK | 所属询价单 |
| `line_no` | INTEGER | NOT NULL | 行号;UNIQUE(inquiry_id, line_no) |
| `part_name` | VARCHAR(200) | — | 零件名称 |
| `part_number` | VARCHAR(100) | — | 零件号 |
| `material_grade` | VARCHAR(50) | — | 客户材质牌号 |
| `volume_cc` | DECIMAL(10,2) | — | 体积 cm³ |
| `annual_qty` | INTEGER | — | 该行年用量 |
| `unit` | VARCHAR(10) | DEFAULT '件' | 单位 |
| `remarks` | TEXT | — | 备注 |
### 2.4 quotation — 报价单(多版本核心表)
| 列 | 类型 | 约束/默认 | 说明 |
|----|------|-----------|------|
| `quotation_id` | VARCHAR(50) | PRIMARY KEY | 报价单号 `QUO-YYYY-NNNN` |
| `inquiry_id` | VARCHAR(50) | FK(可空) | 所属询价单;索引 idx_quotation_inquiry |
| `customer_code` | VARCHAR(50) | NOT NULL,FK | 客户编码 |
| `quotation_date` | DATE | NOT NULL DEFAULT CURRENT_DATE | 报价日期 |
| `valid_until` | DATE | — | 有效期至 |
| `version` | INTEGER | DEFAULT 1 | 版本号;**UNIQUE(inquiry_id, version)**(并发防重) |
| `status` | VARCHAR(20) | DEFAULT 'draft' | draft/sent/approved/superseded/won/lost |
| `mold_cost` | DECIMAL(12,2) | DEFAULT 0 | 模具费(一次性) |
| `unit_price` | DECIMAL(10,2) | — | 单价 ¥ |
| `annual_volume` | INTEGER | — | 年用量 |
| `total_annual` | DECIMAL(14,2) | — | 年总额 = 单价×年用量 |
| `subtotal` | DECIMAL(14,2) | — | 小计 |
| `tax_rate` | DECIMAL(4,3) | DEFAULT 0.130 | 税率 |
| `tax_amount` | DECIMAL(14,2) | — | 税额 |
| `total_amount` | DECIMAL(14,2) | — | 含税总额 |
| `currency` | VARCHAR(10) | DEFAULT 'CNY' | 币种 |
| `payment_terms` | VARCHAR(200) | DEFAULT '月结30天' | 付款条款 |
| `delivery_terms` | VARCHAR(200) | DEFAULT '含税含运' | 交付条款 |
| `created_by` | VARCHAR(50) | DEFAULT 'AI智能报价' | 创建者 |
| `approved_by` | VARCHAR(50) | — | 审核人(人工审核后填写) |
| `remarks` | TEXT | — | 备注(测试数据防护标记写入处) |
| `created_at` | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP | 创建时间 |
**版本链规则**:save_quotation 事务内 `version = MAX(version)+1`(不限次数);旧版非终态批量置 `superseded`;`won`/`lost` 终态保留不覆盖。
### 2.5 quotation_cost_detail — 报价成本明细
| 列 | 类型 | 约束/默认 | 说明 |
|----|------|-----------|------|
| `id` | SERIAL | PRIMARY KEY | 自增主键 |
| `quotation_id` | VARCHAR(50) | NOT NULL,FK,UNIQUE(uq_quotation_cost) | 报价单号(1:1) |
| `material_cost` | DECIMAL(10,4) | — | 材料成本 ¥/件 |
| `casting_cost` | DECIMAL(10,4) | — | 压铸成本 ¥/件 |
| `machining_cost` | DECIMAL(10,4) | — | 机加工成本 ¥/件 |
| `post_process_cost` | DECIMAL(10,4) | — | 后处理成本 ¥/件 |
| `overhead_rate` | DECIMAL(4,3) | — | 管理费率 |
| `profit_rate` | DECIMAL(4,3) | — | 利润率 |
| `total_cost` | DECIMAL(10,4) | — | 四项成本小计 |
| `unit_price` | DECIMAL(10,4) | — | 单价(冗余留痕,与主表对账) |
### 2.6 opportunity — 商机
| 列 | 类型 | 约束/默认 | 说明 |
|----|------|-----------|------|
| `opportunity_id` | VARCHAR(50) | PRIMARY KEY | 商机号 `OPP-YYYY-NNNN` |
| `customer_code` | VARCHAR(50) | NOT NULL,FK | 客户编码 |
| `title` | VARCHAR(200) | NOT NULL | 商机标题(测试数据防护标记写入处) |
| `stage` | VARCHAR(20) | DEFAULT 'lead' | lead/qualified/proposal/negotiation/quoted/won/lost |
| `expected_amount` | DECIMAL(14,2) | DEFAULT 0 | 预期金额 ¥ |
| `probability` | INTEGER | DEFAULT 20 | 成交概率 % |
| `oem_program` | VARCHAR(200) | — | OEM 项目/平台 |
| `expected_close_date` | DATE | — | 预期关单日期 |
| `source` | VARCHAR(100) | — | 来源(智能报价自动生成/客户主动询价/展会获客等) |
| `created_by` | VARCHAR(50) | — | 创建者 |
| `created_at` / `updated_at` | DATE | DEFAULT CURRENT_DATE | 创建/更新日期 |
---
### 2.7 quotation_mock — 报价写入 CRM 模拟表(独立,无外键)
| 字段 | 类型 | 说明 |
|------|------|------|
| quotation_id | VARCHAR(50) PK | 模拟报价单号,`QUO-MOCK-####` 自增 |
| customer_name | VARCHAR(200) | 客户名称(自由文本,不校验) |
| part_name | VARCHAR(200) | 零件名称 |
| part_number | VARCHAR(50) | 零件号 |
| material_grade | VARCHAR(50) | 材质牌号 |
| mold_cost | DECIMAL(12,2) | 模具费,默认 0 |
| unit_price | DECIMAL(10,2) | 报价单价 |
| annual_volume | INTEGER | 年用量 |
| total_annual | DECIMAL(14,2) | 年总额(unit_price × annual_volume) |
| currency | VARCHAR(10) | 币种,默认 CNY |
| quotation_date | DATE | 报价日期,默认当天 |
| status | VARCHAR(20) | 状态,固定 `draft` |
| remarks | TEXT | 备注 |
| created_at | TIMESTAMP | 创建时间 |
> 由工具 `save_quotation_mock` 单独写入,与正式报价链路(inquiry/quotation/opportunity)完全隔离,用于模拟「报价写入 CRM」场景。
## 3 种子数据详解
### 3.1 customer — 20 家客户
覆盖设计:
- **层级**:OEM×7 / Tier1×7 / Tier2×6
- **信用梯度**:A×8 / B×6 / C×2 / D×1 / 无评级×3
- **特殊样本**:零历史新客户×3(T2-2025-002、T2-2026-001、T2-2026-002,用于信用评审场景);长账期 90 天(OEM-2025-001);货到付款 C/D 级(T2-2025-001/003/004)
| 编码 | 名称 | 层级 | 信用 | 折扣率 | 账期 | 区域 | 特征 |
|------|------|------|------|--------|------|------|------|
| OEM-2024-001 | 某日系主机厂 | OEM | A | 5.0% | 60 | 上海 | 长期合作,铝合金阀体壳 |
| OEM-2024-002 | 某德系主机厂 | OEM | A | 3.0% | 45 | 北京 | 质量要求高,偏好铸铁件 |
| OEM-2024-003 | 某新能源主机厂 | OEM | A | 4.0% | 60 | 合肥 | 三电配套,增长快 |
| OEM-2024-004 | 某美系主机厂 | OEM | A | 3.0% | 45 | 武汉 | 混动变速箱项目 |
| OEM-2025-001 | 某商用车主机厂 | OEM | B | 2.0% | 90 | 长春 | 长账期,注意现金流 |
| OEM-2025-002 | 某乘商两用主机厂 | OEM | B | 2.5% | 60 | 柳州 | 乘商双线采购 |
| OEM-2026-001 | 某智能电动新势力 | OEM | A | 5.0% | 45 | 上海 | 高折扣,战略培育 |
| T1-2025-001 | 某博世供应商 | Tier1 | B | 2.0% | 30 | 江苏苏州 | 变速箱配套 |
| T1-2025-002 | 某大陆供应商 | Tier1 | B | 0 | 30 | 广东广州 | 制动配套,新开发 |
| T1-2025-003 | 某采埃孚供应商 | Tier1 | A | 2.0% | 45 | 上海 | ZF 悬架配套 |
| T1-2025-004 | 某电装系供应商 | Tier1 | A | 2.5% | 45 | 广州 | 日系热管理 |
| T1-2025-005 | 某日立安斯泰莫供应商 | Tier1 | A | 2.0% | 45 | 大连 | 日系制动/转向 |
| T1-2026-001 | 某制动系统供应商 | Tier1 | B | 1.5% | 30 | 重庆 | 国产线控制动 |
| T1-2026-002 | 某液压系统供应商 | Tier1 | B | 1.0% | 60 | 长沙 | 液压阀体,账期长 |
| T2-2025-001 | 某售后市场贸易商 | Tier2 | C | 0 | 0 | 杭州 | 货到付款,注意风险 |
| T2-2025-002 | 某智能底盘初创公司 | Tier2 | 无评级 | 0 | 30 | 苏州 | 零订单新客户 |
| T2-2025-003 | 某非道路机械贸易商 | Tier2 | D | 0 | 0 | 济宁 | 仅接受预付款 |
| T2-2025-004 | 某改装件连锁商 | Tier2 | C | 0 | 0 | 成都 | 改装连锁,货到付款 |
| T2-2026-001 | 某机器人关节初创公司 | Tier2 | 无评级 | 0 | 30 | 深圳 | 人形机器人关节部件 |
| T2-2026-002 | 某低空经济无人机公司 | Tier2 | 无评级 | 0 | 30 | 深圳 | eVTOL 液压部件 |
### 3.2 inquiry + inquiry_item — 9 单询价(含明细行)
覆盖设计:2024~2025 历史闭环(completed/lost)+ 2026 在途(pending/processing);单零件行,多零件场景由运行时写入。
| 询价单 | 客户 | 日期 | 零件 | 年用量 | 目标价 | 状态 |
|--------|------|------|------|--------|--------|------|
| INQ-2024-9005 | OEM-2024-001 | 2024-10-20 | 发动机油路阀体壳(EN AC-4600,555.56cc) | 200,000 | 55.00 | completed |
| INQ-2025-9001 | OEM-2024-001 | 2025-09-25 | 变速箱阀体外壳(ADC12,444.44cc) | 300,000 | 96.00 | completed |
| INQ-2025-9002 | OEM-2024-002 | 2025-08-10 | 制动阀体壳(HT250,388.89cc) | 150,000 | 155.00 | completed |
| INQ-2025-9003 | T1-2025-001 | 2025-05-28 | 转向器阀体壳(A356-T6,296.30cc) | 150,000 | 25.00 | lost |
| INQ-2025-9006 | OEM-2024-002 | 2025-11-05 | 变速箱阀体外壳(ADC12,小批量) | 100,000 | 100.00 | completed |
| INQ-2026-0001 | OEM-2024-001 | 2026-08-01 | 变速箱阀体外壳(ADC12,444.44cc) | 300,000 | 95.00 | processing |
| INQ-2026-0002 | T1-2025-001 | 2026-08-03 | 转向器阀体壳(A356-T6,296.30cc) | 150,000 | 55.00 | pending |
| INQ-2026-0006 | OEM-2024-004 | 2026-08-05 | 涡轮增压控制阀体壳(ADC12,320cc) | 120,000 | 48.00 | pending |
| INQ-2026-0007 | OEM-2025-001 | 2026-08-06 | 重卡制动阀体壳(HT300,850cc,1000T) | 60,000 | 260.00 | processing |
### 3.3 quotation + quotation_cost_detail — 7 张报价
覆盖设计:状态谱系 approved/won/lost/sent + 一条**两版议价链**(INQ-2025-9001:v1→v2,一致性校验基准)+ 跨客户价差样本。
| 报价单 | 询价单 | 客户 | 版本 | 状态 | 模具费 | 单价 | 年用量 | 含税总额 | 备注 |
|--------|--------|------|------|------|--------|------|--------|----------|------|
| QUO-2024-9005 | INQ-2024-9005 | OEM-2024-001 | 1 | approved | 180,000 | 52.30 | 200,000 | 11,819,800 | 2024 基线价 |
| QUO-2025-9001 | INQ-2025-9001 | OEM-2024-001 | 1 | approved | 0 | 42.50 | 300,000 | 14,407,500 | 模具费已摊销 |
| QUO-2025-9002 | INQ-2025-9001 | OEM-2024-001 | 2 | approved | 0 | 41.90 | 300,000 | 14,204,100 | 第二轮降价 |
| QUO-2025-9003 | INQ-2025-9002 | OEM-2024-002 | 1 | won | 250,000 | 46.80 | 150,000 | 7,932,600 | 已中标(终态保护样本) |
| QUO-2025-9004 | INQ-2025-9003 | T1-2025-001 | 1 | lost | 120,000 | 28.40 | 150,000 | 4,813,800 | 报价偏高丢单(利润率 28% 样本) |
| QUO-2025-9006 | INQ-2025-9006 | OEM-2024-002 | 1 | sent | 0 | 43.20 | 100,000 | 4,881,600 | 跨客户价差校验 |
| QUO-2026-0001 | INQ-2026-0001 | OEM-2024-001 | 1 | sent | 180,000 | 92.50 | 300,000 | 31,357,500 | 老客户优惠,含模具费 |
成本明细与报价 1:1(四项成本 + 12% 管理费 + 15% 利润,仅 QUO-2025-9004 为 28% 利润)。
### 3.4 opportunity — 8 条商机
覆盖设计:阶段全谱系 lead/qualified/proposal/negotiation/won/lost;金额 450 万~2775 万;AI 与销售团队双来源。
| 商机号 | 客户 | 阶段 | 金额¥ | 概率 | 关单日期 | OEM 项目 |
|--------|------|------|-------|------|----------|----------|
| OPP-2025-0005 | OEM-2024-002 | won | 8,200,000 | 100% | 2025-09-30 | 德系新制动平台 |
| OPP-2025-0006 | T1-2025-001 | lost | 4,500,000 | 0% | 2025-07-31 | EPS 转向系统 |
| OPP-2026-0001 | OEM-2024-001 | proposal | 27,750,000 | 60% | 2026-10-31 | 日系新车型 CVT |
| OPP-2026-0002 | T1-2025-001 | lead | 8,250,000 | 30% | 2026-12-31 | EPS 转向配套 |
| OPP-2026-0003 | T1-2025-003 | lead | 5,000,000 | 20% | 2026-12-31 | 主动悬架配套 |
| OPP-2026-0004 | OEM-2024-003 | negotiation | 9,000,000 | 60% | 2026-11-30 | 纯电平台热管理+制动 |
| OPP-2026-0005 | OEM-2024-004 | qualified | 12,000,000 | 40% | 2027-03-31 | 下一代混动变速箱 |
| OPP-2026-0006 | OEM-2025-001 | lead | 6,000,000 | 15% | 2026-12-31 | 重卡制动升级 |
---
## 4 运行时数据(种子之外,真实运行留痕)
以下数据由智能体真实运行产生,**不属于 init.sql**,作为演示/生产留痕保留:
- **版本链演示**:INQ-2026-0019 三版议价(v1→v2→v3,旧版 superseded,带 price_change_pct)。
- **生产报价留痕**:INQ-2026-0020~0027、QUO-2026-0019~0027、OPP-2026-0012~0018(含 TC-01/02/05 生产运行,如 QUO-2026-0027 单价 ¥8.06)。
- **数据库现状**(2026-08-09):customer 20 / inquiry 24 / quotation 27 / opportunity 18;inquiry_item 与成本明细随行数联动。
- **回归测试数据**:TC-03 写入带「TC-03回归测试」标记,跑完经 `purge_test_records` 自清理,不累积。
---
## 5 幂等性与重跑机制
`init.sql` 整体可重复执行,无副作用(NF-3):
1. **建表**:`CREATE TABLE IF NOT EXISTS`。
2. **历史去重**:inquiry_item 按 (inquiry_id, line_no)、quotation_cost_detail 按 quotation_id 删重(保留最小 id),随后幂等补唯一约束。
3. **版本号规范化**:对存量 quotation 按 (inquiry_id, created_at, quotation_id) 重写 version 为 1..n(幂等,已规范的行不变)。
4. **并发防重**:`UNIQUE(inquiry_id, version)` + 索引 `idx_quotation_inquiry`。
5. **种子写入**:全部 `ON CONFLICT (...) DO NOTHING`,重跑不产生重复客户/询价/报价/商机。
---
## 6 数据维护约定
| 场景 | 操作 | 说明 |
|------|------|------|
| 新客户建档 | 直接 SQL 或后续扩展工具 | customer_code 规则:OEM/T1/T2-年份-序号 |
| 报价审核 | UPDATE quotation SET status/approved_by | 当前无 MCP 写工具,人工线下完成 |
| 测试数据清理 | 仅经 MCP `purge_test_records` | 禁止直连 DELETE;非 TC-03 标记数据受防护 |
| 生产数据 | 不得清理 | 演示/运行留痕作为验收基线 |