Files
oneos-backend/yudao-module-ocr
kkfluous 2f38a703f9 refactor(energy): 简化事件驱动系统(7个→3个)
- 删除旧事件:BillApprovedEvent, BillCreatedEvent, DeductionCompletedEvent, DetailAuditedEvent, DetailCreatedEvent, RecordMatchedEvent
- 新增事件:BillAuditPassedEvent, DetailAuditPassedEvent
- 保留事件:RecordImportedEvent
- 更新监听器:AccountEventListener, BillEventListener, DetailEventListener
- 清理代码中的旧事件引用和注释

优化原则:前端简单,后端健壮
事件流程:导入→匹配→生成明细→审核→扣款→生成账单→结算
2026-03-16 12:53:14 +08:00
..

OCR 识别模块

概述

OCR 识别模块yudao-module-ocr提供图像识别服务支持行驶证、驾驶证等多种证件识别。采用策略模式设计支持多厂商切换百度、腾讯、阿里等

功能特性

  • 行驶证识别(已实现)
  • 🔲 驾驶证识别(预留)
  • 🔲 身份证识别(预留)
  • 🔲 营业执照识别(预留)

架构设计

Controller (统一入口)
    ↓
OcrService (业务服务层)
    ↓
OcrClientFactory (客户端工厂)
    ↓
OcrClient (客户端接口)
    ↓
├── BaiduOcrClient (百度实现)
├── TencentOcrClient (腾讯实现 - 预留)
└── AliyunOcrClient (阿里实现 - 预留)

快速开始

1. 配置

application.yaml 或 Nacos 配置中心添加:

ocr:
  # 默认使用的厂商
  default-provider: baidu

  # 百度 OCR 配置
  baidu:
    app-id: your-app-id
    api-key: your-api-key
    secret-key: your-secret-key

2. API 调用

识别行驶证

POST /admin-api/ocr/vehicle-license
Content-Type: multipart/form-data

参数:
- file: 行驶证图片文件(必填)
- provider: OCR 厂商(可选,默认使用配置的厂商)

响应示例:
{
  "code": 0,
  "data": {
    "vin": "LSVAM4189E2123456",
    "plateNo": "粤A12345",
    "brand": "比亚迪秦PLUS DM-i",
    "vehicleType": "小型轿车",
    "owner": "张三",
    "useCharacter": "非营运",
    "engineNo": "BYD123456",
    "registerDate": "2023-01-01",
    "issueDate": "2023-01-01",
    "inspectionRecord": "2026-06",
    "scrapDate": "2035-12-31",
    "curbWeight": "1500",
    "totalMass": "1875",
    "approvedPassengerCapacity": "5"
  },
  "msg": "success"
}

扩展指南

添加新厂商

  1. 创建配置类
@Data
public class TencentOcrClientConfig implements OcrClientConfig {
    private String secretId;
    private String secretKey;

    @Override
    public String getProvider() {
        return "tencent";
    }
}
  1. 实现客户端
public class TencentOcrClient extends AbstractOcrClient<TencentOcrClientConfig> {

    public TencentOcrClient(TencentOcrClientConfig config) {
        super(config);
    }

    @Override
    protected void doInit() {
        // 初始化腾讯 OCR SDK
    }

    @Override
    public VehicleLicenseResult recognizeVehicleLicense(byte[] imageData) {
        // 调用腾讯 OCR API
    }
}
  1. 注册到工厂

OcrClientFactoryImpl.createClient() 中添加:

case "tencent":
    return new TencentOcrClient((TencentOcrClientConfig) config);
  1. 添加配置

OcrProperties 中添加:

private TencentOcrClientConfig tencent;

OcrAutoConfiguration 中初始化:

if (properties.getTencent() != null) {
    factory.createOrUpdateClient("tencent", properties.getTencent());
}

添加新识别场景

  1. 定义结果类
@Data
public class DriverLicenseResult {
    private String name;
    private String licenseNo;
    // ...
}
  1. 扩展客户端接口
public interface OcrClient {
    VehicleLicenseResult recognizeVehicleLicense(byte[] imageData);
    DriverLicenseResult recognizeDriverLicense(byte[] imageData); // 新增
}
  1. 实现各厂商客户端

BaiduOcrClient 等类中实现新方法。

  1. 添加 Service 和 Controller

OcrServiceOcrController 中添加对应方法。

注意事项

  1. API 密钥安全:不要将密钥硬编码,使用配置中心管理
  2. 图片大小限制:百度 OCR 限制图片大小 4MB
  3. 并发控制:百度 OCR 有 QPS 限制,需要考虑限流
  4. 错误处理:网络异常、识别失败等需要友好的错误提示

错误码

错误码 说明
1_009_001_000 不支持的 OCR 厂商
1_009_001_001 不支持的识别场景
1_009_001_002 图片格式不正确或已损坏
1_009_001_003 图片大小超过限制
1_009_001_004 识别失败
1_009_001_005 OCR 客户端配置无效

依赖

  • Spring Boot 3.5.9
  • 百度 OCR SDK 4.16.18
  • MyBatis Plus
  • MapStruct
  • Lombok

许可证

Apache License 2.0