# 丰田 EPC 数据解析技术沟通说明

## 目标

把本机 Toyota EPC 数据源解析成可查询的数据服务，用于网站或内部系统查询：

- 输入 OE 号码，返回地区、目录、车型/底盘、左右舵、互换候选、原厂示意图。
- 输入 VIN/车架号，返回对应车型目录，再关联可用 OE 配件。
- 后续可做批量导出、API、前端查询页面。

当前本地数据源路径：

```text
D:\TMCEPCW3\epcdata
```

已有地区目录：

```text
EU
GR
JP
JPIO
US
FL
```

目前主要验证过的是：

```text
EU / GR / JP / US
```

## 一句话说明给技术

这不是 SQL 数据库，而是一套 Toyota EPC 专用的 `DAT / ACD / IA` 固定格式文件。很多关键字段是明文或半明文，可以解析；完整适配关系需要继续逆向每类文件的结构，尤其是 `KPT*.DAT`。

## 已确认可解析的数据

### 1. OE 到图组

文件：

```text
各目录下的 FGI*.DAT
例如：
D:\TMCEPCW3\epcdata\GR\672390\FGI67239.DAT
```

已确认结构：

```text
每条记录 22 字节
0-10   OE 号码，不带横杠
12-18  参考号
18-22  图组号
```

示例：

```text
485108Z205  48510 4803
485108Z205  48520 4803
```

含义：

```text
OE: 48510-8Z205
参考号: 48510 / 48520
图组: 4803
```

### 2. 零件名称

文件：

```text
HINMEI*.DAT
```

用途：

```text
参考号 -> 零件名称
```

示例：

```text
48510 = ENS. D'AMORTISSEUR DE CHOC DROIT AV
48520 = ENS. D'AMORTISSEUR DE CHOC GAUCHE AV
```

中文理解：

```text
48510 = 右前减震器总成
48520 = 左前减震器总成
```

注意：

```text
多语言编码需要处理，JP 日文/中文可能会出现乱码，需要单独确认编码。
```

### 3. 原厂示意图

文件：

```text
BZI*.DAT
EMI*.DAT
EMK*.DAT
```

用途：

```text
图组 -> 图号 -> PNG 图片数据
```

示例：

```text
GR / 672390 / 图组 4803
图号: 484156B
图片已提取:
C:\Users\26652\Documents\逆向工程\toyota_epc_output\GR_672390_4803_0001_484156B.png
```

### 4. 基础底盘代码

文件：

```text
KRK*.DAT
```

用途：

```text
目录 -> 基础底盘代码
```

示例：

```text
GR / 672390 对应：
GGN120, GGN125, GGN135, GUN112, GUN120, GUN122, GUN123,
GUN125, GUN126, KUN125, KUN126, LAN125, TGN126, TGN128
```

说明：

```text
当前这里是基础底盘代码，不是完整销售代码。
例如 Amayama 显示 GGN125L / GGN125R / GUN125L，
本地当前解析先得到 GGN125 / GUN125。
L/R 后缀需要继续解析其他车型索引或条件文件。
```

### 5. 条件字段

文件：

```text
TKM*.Dxx
KIG*.Dxx
```

用途：

```text
解释配置条件字段，例如发动机、变速箱、左右舵、目的地等。
```

已确认能读到：

```text
ENGINE
ATM, MTM
GEAR SHIFT TYPE
DRIVER'S POSITION
CAB
MODEL MARK
FUEL INDUCTION
DESTINATION
BUILDING CONDITION
```

左右舵字段示例：

```text
LHD = LEFT-HAND DRIVE VEHICLES
RHD = RIGHT-HAND DRIVE VEHICLES
```

### 6. 车架号范围索引

文件：

```text
FRAMNO.DAT
```

用途：

```text
基础底盘代码 + 年份 + 车架流水号范围
```

已确认：

```text
FRAMNO.DAT 每条记录 99 字节
不是每台车一条完整 17 位 VIN，而是车架号范围索引。
```

当前统计：

```text
EU: 33963 条范围记录，3000 个基础底盘代码
GR: 35479 条范围记录，3119 个基础底盘代码
JP: 33963 条范围记录，3000 个基础底盘代码
US: 33963 条范围记录，3000 个基础底盘代码

合计：
137368 条车架范围记录
约 1259570 个车架流水号断点
3126 个去重基础底盘代码
```

## 还需要继续解析的关键点

### 1. KPT*.DAT

文件：

```text
KPT*.DAT
```

这是最关键的文件。

用途推测：

```text
把 OE、图组、参考号、底盘、发动机、变速箱、左右舵、目的地、年月等条件关联起来。
```

现在状态：

```text
文件很大，里面有可读片段，但整体是固定格式/二进制混合。
需要继续逆向记录长度、索引、条件编码。
```

如果不解析 `KPT*.DAT`，只能做到：

```text
OE 在哪些目录出现
目录有哪些底盘
目录有哪些条件字段
图纸在哪
```

但不能精准做到：

```text
这个 OE 到底适配哪一个发动机、哪一个左右舵、哪一个年月段、哪一个目的地。
```

### 2. 完整车型销售代码

需要继续定位：

```text
GGN125 -> GGN125L / GGN125R
GUN125 -> GUN125L
```

可能相关文件：

```text
INM*.DAT
FRAMNO.DAT
SHAMEI.ACD
JOHO*.ACD
CHOHIN.DAT
DAIHIN.DAT
HINCLR.DAT
```

目标：

```text
输出更接近 Amayama 的车型结构：
Toyota Hilux
GGN125L Asia and Middle East
GGN125R Asia and Middle East
GUN125 Japan
GUN125L Asia and Middle East
```

### 3. VIN 到目录

目标链路：

```text
17 位 VIN
-> 识别 WMI / 车型段 / 年份码 / 工厂 / 流水号
-> 匹配 FRAMNO.DAT 或相关索引
-> 得到基础底盘、生产年份、地区目录
-> 进入 EPC 目录查询配件
```

注意：

```text
FRAMNO.DAT 更像车架流水号范围，不是完整 17 位 VIN 清单。
VIN 查询还需要结合 VIN9.INI 和地区规则。
```

## 建议数据库结构

可以先把 EPC 文件解析成自己的中间数据库，不要每次实时扫 DAT。

建议表：

```text
regions
catalogs
parts
part_occurrences
part_names
figure_groups
figure_images
catalog_frame_codes
condition_fields
condition_values
vin_frame_ranges
fitment_rules
interchange_candidates
```

核心关系：

```text
part_occurrences:
OE -> region -> catalog -> reference -> figure_group

figure_images:
region -> catalog -> figure_group -> image_code -> image_file

catalog_frame_codes:
region -> catalog -> frame_code

vin_frame_ranges:
region -> frame_code -> year -> serial_range

fitment_rules:
OE -> catalog -> frame_code -> condition_group
```

其中 `fitment_rules` 要等 `KPT*.DAT` 解清楚后才能完整。

## 网站查询建议

### 第一阶段：OE 查询

先做到：

```text
输入 OE
返回：
- 地区
- 目录
- 参考号
- 零件名称
- 图组
- 原厂示意图
- 基础底盘代码
- 同图组候选号码
```

这是当前已经基本打通的阶段。

### 第二阶段：完整车型适配

继续做到：

```text
输入 OE
返回：
- 完整车型销售代码
- 年月范围
- 发动机
- 变速箱
- LHD/RHD
- 目的地
- 是否精准适配
```

关键是解析 `KPT*.DAT`。

### 第三阶段：VIN 查询

继续做到：

```text
输入 17 位 VIN
返回：
- 车型
- 地区目录
- 生产年份/月
- 配置条件
- 可用 OE 配件
```

关键是解析 `FRAMNO.DAT + VIN9.INI + 目录索引`。

## 对外公开注意事项

如果网站公开给别人用，要注意版权边界。

建议：

```text
不要直接公开原始 EPC 文件。
不要直接批量公开原厂图片库。
可以先公开自己整理后的索引、适配摘要、互换关系。
原厂图纸最好只用于内部校验，或确认授权后再公开。
```

## 当前样例

测试 OE：

```text
48510-8Z205
```

当前已确认：

```text
OE 在 EU / GR / JP / US 均有命中。
GR / 672390 可解析到：
- 参考号 48510 / 48520
- 图组 4803
- 右前/左前减震器总成
- 基础底盘代码
- LHD/RHD 条件字段
- 原厂 PNG 示意图
```

当前 demo：

```text
C:\Users\26652\Documents\逆向工程\toyota_oe_demo_48510-8Z205.html
```

当前解析脚本：

```text
C:\Users\26652\Documents\逆向工程\toyota_epc_query.py
```

## 给技术的下一步任务

1. 固化现有解析器，把 `FGI / HINMEI / BZI / EMI / EMK / KRK / TKM / KIG / FRAMNO` 解析成数据库。
2. 重点逆向 `KPT*.DAT`，找出 OE 与具体适配条件的关联规则。
3. 补车型销售代码层级，解决 `GGN125 -> GGN125L / GGN125R` 这种展开。
4. 做 VIN 查询原型，用 `LFMAPE2C7A0185487` 作为测试 VIN。
5. 做一个内部查询页面，先验证准确率，再考虑是否对外分享。
