- 新增 yudao-module-ocr 模块 - OCR API 模块:定义 Feign 接口和 DTO - OCR Server 模块:实现行驶证识别功能 - 集成百度 OCR SDK - 支持多厂商扩展(百度/腾讯/阿里云) - 新增车辆上牌管理功能 - 数据库表:asset_vehicle_registration - 完整的 CRUD 接口 - 行驶证识别接口(集成 OCR) - 车辆匹配功能(根据 VIN) - 确认上牌功能(更新车辆信息) - 技术实现 - 遵循 BPM/System 模块的 RPC API 模式 - 使用 Feign 实现服务间调用 - Base64 编码传输图片数据 - 统一返回格式 CommonResult<T> - 文档 - OCR 模块使用文档 - OCR 部署指南 - 车辆上牌管理总结 - API 集成规划和总结
7.8 KiB
7.8 KiB
OCR API 集成完成总结
实施完成情况
✅ Phase 1: 重构 OCR API 模块(已完成)
1.1 创建 ApiConstants
文件: yudao-module-ocr-api/src/main/java/cn/iocoder/yudao/module/ocr/enums/ApiConstants.java
- ✅ 定义服务名:
ocr-server - ✅ 定义 RPC 前缀:
/rpc-api/ocr - ✅ 定义版本号:
1.0.0
1.2 创建 DTO 对象
文件: yudao-module-ocr-api/src/main/java/cn/iocoder/yudao/module/ocr/api/dto/VehicleLicenseRespDTO.java
- ✅ 定义行驶证识别结果 DTO
- ✅ 包含所有识别字段(VIN、车牌号、品牌型号等)
- ✅ 实现 Serializable 接口
1.3 创建 Feign API 接口
文件: yudao-module-ocr-api/src/main/java/cn/iocoder/yudao/module/ocr/api/OcrApi.java
- ✅ 使用
@FeignClient(name = ApiConstants.NAME)注解 - ✅ 定义识别接口:
recognizeVehicleLicense() - ✅ 参数:Base64 编码的图片数据 + 可选的 OCR 厂商
- ✅ 返回:
CommonResult<VehicleLicenseRespDTO>
1.4 添加依赖
文件: yudao-module-ocr-api/pom.xml
- ✅ 添加
yudao-spring-boot-starter-rpc依赖(提供 Feign 支持)
✅ Phase 2: 实现 OCR API(已完成)
2.1 创建 API 实现类
文件: yudao-module-ocr-server/src/main/java/cn/iocoder/yudao/module/ocr/api/OcrApiImpl.java
- ✅ 使用
@RestController注解(提供 RESTful API) - ✅ 实现
OcrApi接口 - ✅ 注入
OcrClientFactory - ✅ Base64 解码图片数据
- ✅ 调用现有的 OCR 识别逻辑
- ✅ 返回
CommonResult<VehicleLicenseRespDTO>
✅ Phase 3: Asset 模块集成 OCR API(已完成)
3.1 修改 VehicleRegistrationServiceImpl
文件: yudao-module-asset-server/.../VehicleRegistrationServiceImpl.java
- ✅ 注入
OcrApi(Feign 自动代理) - ✅ 实现
recognizeVehicleLicense()方法 - ✅ Base64 编码图片数据
- ✅ 调用
ocrApi.recognizeVehicleLicense() - ✅ 处理识别结果
- ✅ 根据 VIN 查找匹配车辆
- ✅ 返回完整的识别结果(包含车辆匹配信息)
3.2 依赖已存在
文件: yudao-module-asset-server/pom.xml
- ✅ 已包含
yudao-module-ocr-api依赖
✅ 编译验证
- ✅ OCR API 模块编译成功
- ✅ OCR Server 模块编译成功
- ✅ Asset Server 模块编译成功
架构说明
调用链路
Asset Module (调用方)
↓
OcrApi (Feign 接口)
↓ (通过 Feign 远程调用)
OcrApiImpl (实现类)
↓
OcrClientFactory
↓
OcrClient (百度/腾讯/阿里云)
↓
第三方 OCR 服务
API 接口
RPC 接口路径
POST /rpc-api/ocr/recognition/vehicle-license
请求参数
imageData: String (Base64 编码的图片数据)provider: String (可选,OCR 厂商,如 "baidu")
响应格式
{
"code": 0,
"data": {
"vin": "LB9A32A22R0LS1439",
"plateNo": "粤AGR5547",
"brand": "帕力安牌XDQ5041XLCFCEV",
"vehicleType": "轻型厢式货车",
"owner": "广州开发区交投氯能运营管理有限公司",
"useCharacter": "货运",
"engineNo": "268E7AEL153",
"registerDate": "2025-02-19",
"issueDate": "2025-10-21",
"inspectionRecord": "2026-06",
"scrapDate": "2035-12-31",
"curbWeight": "1500",
"totalMass": "1875",
"approvedPassengerCapacity": "5"
},
"msg": "操作成功"
}
核心功能
1. OCR 识别
- 支持行驶证照片识别
- 自动提取车辆信息
- 支持多个 OCR 厂商(百度/腾讯/阿里云)
2. 车辆匹配
- 根据 VIN 自动查找系统中的车辆
- 精确匹配:VIN 完全一致
- 返回匹配置信度
3. 上牌记录管理
- 创建上牌记录
- 确认上牌(更新车辆信息)
- 查询上牌历史
技术亮点
- 标准化 RPC 调用:遵循 BPM/System 模块的 API 模式
- Feign 自动代理:无需手动实现 HTTP 调用
- Base64 传输:解决 Feign 不支持 byte[] 的问题
- 统一返回格式:使用
CommonResult<T>包装 - 服务解耦:OCR 服务独立部署,可单独扩展
- 多厂商支持:可灵活切换 OCR 厂商
文件清单
OCR API 模块
yudao-module-ocr/yudao-module-ocr-api/
├── pom.xml (添加 RPC 依赖)
└── src/main/java/cn/iocoder/yudao/module/ocr/
├── enums/
│ └── ApiConstants.java (新增)
└── api/
├── OcrApi.java (新增)
└── dto/
└── VehicleLicenseRespDTO.java (新增)
OCR Server 模块
yudao-module-ocr/yudao-module-ocr-server/
└── src/main/java/cn/iocoder/yudao/module/ocr/
└── api/
└── OcrApiImpl.java (新增)
Asset Server 模块
yudao-module-asset/yudao-module-asset-server/
└── src/main/java/cn/iocoder/yudao/module/asset/
└── service/vehicleregistration/
└── VehicleRegistrationServiceImpl.java (修改)
使用示例
在其他模块中使用 OCR API
@Service
public class YourService {
@Resource
private OcrApi ocrApi;
public void recognizeVehicleLicense(byte[] imageData) {
// Base64 编码
String imageDataBase64 = Base64.encode(imageData);
// 调用 OCR API
CommonResult<VehicleLicenseRespDTO> result =
ocrApi.recognizeVehicleLicense(imageDataBase64, "baidu");
// 处理结果
if (result.isSuccess()) {
VehicleLicenseRespDTO data = result.getData();
System.out.println("VIN: " + data.getVin());
System.out.println("车牌号: " + data.getPlateNo());
}
}
}
测试验证
单元测试
@SpringBootTest
public class OcrApiTest {
@Resource
private OcrApi ocrApi;
@Test
public void testRecognizeVehicleLicense() {
// 读取测试图片
byte[] imageData = Files.readAllBytes(Paths.get("test.jpg"));
String imageDataBase64 = Base64.encode(imageData);
// 调用识别
CommonResult<VehicleLicenseRespDTO> result =
ocrApi.recognizeVehicleLicense(imageDataBase64, null);
// 验证结果
assertNotNull(result);
assertTrue(result.isSuccess());
assertNotNull(result.getData());
assertNotNull(result.getData().getVin());
}
}
集成测试
- 启动 OCR Server
- 启动 Asset Server
- 调用车辆上牌接口
- 验证识别结果
配置说明
application.yml (OCR Server)
spring:
application:
name: ocr-server # 必须与 ApiConstants.NAME 一致
yudao:
ocr:
default-provider: baidu
providers:
baidu:
app-id: your-app-id
api-key: your-api-key
secret-key: your-secret-key
application.yml (Asset Server)
spring:
cloud:
openfeign:
client:
config:
ocr-server: # 对应 ApiConstants.NAME
url: http://localhost:48083 # OCR 服务地址
性能优化建议
- 缓存识别结果:相同图片不重复识别
- 异步处理:批量识别使用异步队列
- 连接池优化:配置 Feign 连接池参数
- 超时设置:合理设置 OCR 调用超时时间
下一步工作
🔲 Phase 4: 测试验证(待完成)
- 编写单元测试
- 编写集成测试
- 端到端测试
- 性能测试
🔲 Phase 5: 部署上线(待完成)
- 执行数据库脚本
- 配置 OCR 服务
- 配置 Feign 客户端
- 启动服务验证
🔲 Phase 6: 功能完善(可选)
- 添加识别结果缓存
- 实现批量识别
- 添加识别历史记录
- 实现车型智能匹配
成功标准
- ✅ 编译通过
- ✅ 代码符合规范
- ✅ 遵循 BPM/System 模块的 API 模式
- 🔲 单元测试通过
- 🔲 集成测试通过
- 🔲 OCR 识别准确率 > 95%
- 🔲 API 响应时间 < 500ms (p95)
实施日期:2026-03-12 实施人员:AI Assistant 版本:v1.0.0 状态:Phase 1-3 完成,待测试验证