diff --git a/api-third/src/main/java/com/heyu/api/baidu/handle/traffic/BMixedMultiVehicleHandle.java b/api-third/src/main/java/com/heyu/api/baidu/handle/traffic/BMixedMultiVehicleHandle.java
index 42d1e5a..08c6e66 100644
--- a/api-third/src/main/java/com/heyu/api/baidu/handle/traffic/BMixedMultiVehicleHandle.java
+++ b/api-third/src/main/java/com/heyu/api/baidu/handle/traffic/BMixedMultiVehicleHandle.java
@@ -1,55 +1,44 @@
package com.heyu.api.baidu.handle.traffic;
-
+import com.heyu.api.baidu.BaiduBaseHandle;
+import com.heyu.api.baidu.request.traffic.BMixedMultiVehicleRequest;
import com.heyu.api.data.annotation.CustomPath;
import com.heyu.api.data.constants.ApiConstants;
import com.heyu.api.data.utils.StringUtils;
-import com.heyu.api.baidu.BaiduBaseHandle;
-import com.heyu.api.baidu.request.traffic.BMixedMultiVehicleRequest;
-import com.heyu.api.baidu.response.traffic.BLicensePlateResp;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
-/**
- *
- *
- * https://console.bce.baidu.com/support/?_=1740219852952×tamp=1740325062124#/api?product=AI&project=%E6%96%87%E5%AD%97%E8%AF%86%E5%88%AB&parent=%E4%BA%A4%E9%80%9A%E5%9C%BA%E6%99%AFOCR&api=rest%2F2.0%2Focr%2Fv1%2Fdriving_license&method=post
- * 驾驶证识别
- */
+import java.util.Map;
@Component
@Slf4j
-@CustomPath("unifiedValidPeriod")
-public class BMixedMultiVehicleHandle extends BaiduBaseHandle {
-
+@CustomPath("mixedMultiVehicle")
+public class BMixedMultiVehicleHandle extends BaiduBaseHandle {
@Override
public String getUri() {
- return "/rest/2.0/ocr/v1/driving_license";
+ return "/rest/2.0/ocr/v1/mixed_multi_vehicle";
}
@Override
- public String check(BMixedMultiVehicleRequest bVehicleLicenseRequest) {
-
- if (checkNotTrueFalse(bVehicleLicenseRequest.getDetectDirection())) {
- return "detectDirection 必须传 " + ApiConstants.trueOrFalse + ",false:不进行图像方向自动矫正, true: 开启图像方向自动矫正功能,可对旋转 90/180/270 度的图片进行自动矫正并识别";
+ public String check(BMixedMultiVehicleRequest request) {
+ if (checkNotTrueFalse(request.getDetectDirection())) {
+ return "detectDirection must be one of " + ApiConstants.trueOrFalse;
}
-
- if (checkNotFrontBack(bVehicleLicenseRequest.getUnified())) {
- return "unified 必须传 " + ApiConstants.frontOrback + ",对输出字段进行归一化处理,将新/老版行驶证的“注册登记日期/注册日期”统一为”注册日期“进行输出";
+ if (checkNotTrueFalse(request.getUnified())) {
+ return "unified must be one of " + ApiConstants.trueOrFalse;
}
-
- return checkImageUri(bVehicleLicenseRequest);
+ return checkImageUri(request);
}
@Override
- public String getContent(BMixedMultiVehicleRequest bUnifiedValidPeriodRequest) {
- StringBuffer sb = getImageContent(bUnifiedValidPeriodRequest);
- if (StringUtils.isNotBlank(bUnifiedValidPeriodRequest.getDetectDirection())) {
- sb.append("&detect_direction=").append(bUnifiedValidPeriodRequest.getDetectDirection());
+ public String getContent(BMixedMultiVehicleRequest request) {
+ StringBuffer sb = getImageContent(request);
+ if (StringUtils.isNotBlank(request.getDetectDirection())) {
+ sb.append("&detect_direction=").append(request.getDetectDirection());
}
- if (StringUtils.isNotBlank(bUnifiedValidPeriodRequest.getUnified())) {
- sb.append("&unified=").append(bUnifiedValidPeriodRequest.getUnified());
+ if (StringUtils.isNotBlank(request.getUnified())) {
+ sb.append("&unified=").append(request.getUnified());
}
return sb.toString();
}
diff --git a/api-third/src/main/java/com/heyu/api/baidu/request/traffic/BLicensePlateRequest.java b/api-third/src/main/java/com/heyu/api/baidu/request/traffic/BLicensePlateRequest.java
index 28710fd..ae31f77 100644
--- a/api-third/src/main/java/com/heyu/api/baidu/request/traffic/BLicensePlateRequest.java
+++ b/api-third/src/main/java/com/heyu/api/baidu/request/traffic/BLicensePlateRequest.java
@@ -25,7 +25,7 @@ public class BLicensePlateRequest extends BaiduImageUrlRequest {
* - true:开启遮挡检测
* - false:不开启遮挡检测
*/
- private String detectComplete;
+ private String detectComplete = "false";
/**
@@ -33,7 +33,7 @@ public class BLicensePlateRequest extends BaiduImageUrlRequest {
* - true:开启PS检测
* - false:不开启PS检测
*/
- private String detectRisk;
+ private String detectRisk = "false";
}
diff --git a/api-third/src/main/java/com/heyu/api/baidu/request/traffic/BMixedMultiVehicleRequest.java b/api-third/src/main/java/com/heyu/api/baidu/request/traffic/BMixedMultiVehicleRequest.java
index 0ba4453..4222228 100644
--- a/api-third/src/main/java/com/heyu/api/baidu/request/traffic/BMixedMultiVehicleRequest.java
+++ b/api-third/src/main/java/com/heyu/api/baidu/request/traffic/BMixedMultiVehicleRequest.java
@@ -17,13 +17,13 @@ public class BMixedMultiVehicleRequest extends BaiduImageUrlRequest {
* **- false:默认值,**不检测朝向,朝向是指输入图像是正常方向、逆时针旋转90/180/270度
* **- true:**检测朝向
*/
- private String detectDirection;
+ private String detectDirection = "false";
/**
* - false:默认值,不进行归一化处理
* - **true:**对输出字段进行归一化处理,将新/老版行驶证的“注册登记日期/注册日期”统一为”注册日期“进行输出
*/
- private String unified;
+ private String unified = "false";
}
diff --git a/api-third/src/main/java/com/heyu/api/baidu/request/traffic/BWaybillRequest.java b/api-third/src/main/java/com/heyu/api/baidu/request/traffic/BWaybillRequest.java
index 5d47173..af34768 100644
--- a/api-third/src/main/java/com/heyu/api/baidu/request/traffic/BWaybillRequest.java
+++ b/api-third/src/main/java/com/heyu/api/baidu/request/traffic/BWaybillRequest.java
@@ -19,6 +19,6 @@ public class BWaybillRequest extends BaiduImageUrlRequest {
* - true:需要识别隐私面单,即此参数存在并填写为true的时候,会增加返回隐私面单的3个字段,详见下方返回参数列表;
* - false:不识别隐私面单
*/
- private String isIdentifyVirtualWaybill;
+ private String isIdentifyVirtualWaybill = "false";
}
diff --git a/api-web/api-interface/src/main/java/com/heyu/api/controller/car/RecognizeDriverLicenseController.java b/api-web/api-interface/src/main/java/com/heyu/api/controller/car/RecognizeDriverLicenseController.java
index a960a02..02b6c42 100644
--- a/api-web/api-interface/src/main/java/com/heyu/api/controller/car/RecognizeDriverLicenseController.java
+++ b/api-web/api-interface/src/main/java/com/heyu/api/controller/car/RecognizeDriverLicenseController.java
@@ -1,74 +1,30 @@
package com.heyu.api.controller.car;
+import com.heyu.api.baidu.handle.traffic.BDriverLicenseHandle;
import com.heyu.api.baidu.request.traffic.BDriverLicenseRequest;
import com.heyu.api.controller.BaseController;
+import com.heyu.api.controller.ocr.BaiduOcrResult;
import com.heyu.api.data.annotation.EbAuthentication;
import com.heyu.api.data.constants.ApiConstants;
-import com.heyu.api.data.utils.MapUtils;
import com.heyu.api.data.utils.R;
import com.heyu.api.data.utils.StringUtils;
import com.heyu.api.request.car.DriverLicenseRecognizeRequest;
-import com.heyu.api.resp.car.RecognizeDriverLicenseBackResp;
-import com.heyu.api.resp.car.RecognizeDriverLicenseFaceResp;
-import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
-import java.util.Map;
-
-/**
- * 驾驶证识别(百度OCR)
- *
- * 支持对机动车驾驶证正页及副页所有字段进行结构化识别。
- * 驾驶证正页:证号、姓名、性别、国籍、出生日期、初次领证日期、准驾车型、有效起始日期、失效日期、住址、发证单位 11个字段
- * 驾驶证副页:姓名、记录、证号、档案编号 4个字段
- * 同时支持识别交管12123 APP 发放的电子驾驶证正页,包括证号、姓名、性别、国籍、出生日期、初次领证日期、准驾车型、有效起始日期、失效日期、累积记分、状态、档案编号、生成时间、当前时间、条形码下编号 15个字段
- *
- * 百度文档:https://console.bce.baidu.com/support/#/api?product=AI&project=文字识别&parent=交通场景OCR&api=rest%2F2.0%2Focr%2Fv1%2Fdriving_license&method=post
- */
-@Slf4j
@RestController
@RequestMapping("/driver/license")
-@SuppressWarnings("unchecked")
public class RecognizeDriverLicenseController extends BaseController {
- private static final String DRIVER_LICENSE_URI = "/rest/2.0/ocr/v1/driving_license";
+ @Autowired
+ private BDriverLicenseHandle bDriverLicenseHandle;
@EbAuthentication(tencent = ApiConstants.TENCENT_AUTH)
@PostMapping("/recognize")
- public R recognize(DriverLicenseRecognizeRequest request) {
- long start = System.currentTimeMillis();
-
- long t1 = System.currentTimeMillis();
- BDriverLicenseRequest bRequest = toBaiduRequest(request);
- String checkMsg = checkRequest(bRequest);
- if (!isBlank(checkMsg)) {
- return R.error(checkMsg);
- }
- log.info("驾驶证识别-参数校验及构建请求耗时:{}ms", System.currentTimeMillis() - t1);
-
- long t2 = System.currentTimeMillis();
- Map data = requestBaidu(DRIVER_LICENSE_URI, getContent(bRequest));
- long baiduCost = System.currentTimeMillis() - t2;
- log.info("驾驶证识别-调用百度OCR接口耗时:{}ms", baiduCost);
-
- if (data == null) {
- log.info("驾驶证识别-识别失败, 耗时:{}ms", System.currentTimeMillis() - start);
- return R.error("驾驶证识别失败");
- }
-
- long t3 = System.currentTimeMillis();
- Object resp;
- if (ApiConstants.face.equals(request.getSide())) {
- resp = toFaceResp(data);
- } else {
- resp = toBackResp(data);
- }
- log.info("驾驶证识别-结果映射耗时:{}ms, side:{}", System.currentTimeMillis() - t3, request.getSide());
-
- log.info("驾驶证识别-总耗时:{}ms, 其中第三方(百度OCR):{}ms", System.currentTimeMillis() - start, baiduCost);
- return R.ok().setData(resp);
+ public R recognize(DriverLicenseRecognizeRequest request) {
+ return BaiduOcrResult.raw(bDriverLicenseHandle.handle(toBaiduRequest(request)));
}
private BDriverLicenseRequest toBaiduRequest(DriverLicenseRecognizeRequest request) {
@@ -78,133 +34,9 @@ public class RecognizeDriverLicenseController extends BaseController {
}
bRequest.setImageBase64(request.getImageBase64());
bRequest.setImageUrl(request.getImageUrl());
-
- // 将 "face" 映射为百度API的 "front"
if (StringUtils.isNotBlank(request.getSide())) {
- if (ApiConstants.face.equals(request.getSide())) {
- bRequest.setDrivingLicenseSide("front");
- } else {
- bRequest.setDrivingLicenseSide(request.getSide());
- }
+ bRequest.setDrivingLicenseSide(ApiConstants.face.equals(request.getSide()) ? ApiConstants.front : request.getSide());
}
return bRequest;
}
-
- private String checkRequest(BDriverLicenseRequest request) {
- if (!hasImage(request)) {
- return "imageUrl和imageBase64不能同时为空";
- }
- if (checkNotTrueFalse(request.getDetectDirection())) {
- return "detectDirection 必须传 " + ApiConstants.trueOrFalse
- + ",false:默认值,不检测朝向, true:检测朝向";
- }
- if (checkNotFrontBack(request.getDrivingLicenseSide())) {
- return "drivingLicenseSide 必须传 " + ApiConstants.frontOrback
- + ",front:识别驾驶证正页、电子驾驶证正页, back:识别驾驶证副页";
- }
- if (checkNotTrueFalse(request.getUnifiedValidPeriod())) {
- return "unifiedValidPeriod 必须传 " + ApiConstants.trueOrFalse
- + ",false:默认值,不进行归一化处理, true:归一化格式输出";
- }
- if (checkNotTrueFalse(request.getQualityWarn())) {
- return "qualityWarn 必须传 " + ApiConstants.trueOrFalse
- + ",false:不输出质量告警信息, true:输出遮挡、不完整质量告警信息";
- }
- if (checkNotTrueFalse(request.getRiskWarn())) {
- return "riskWarn 必须传 " + ApiConstants.trueOrFalse
- + ",false:不输出风险告警信息, true:开启,输出驾驶正复印、翻拍、PS等告警信息";
- }
- return null;
- }
-
- private boolean hasImage(BDriverLicenseRequest request) {
- return request != null && (!isBlank(request.getImageUrl()) || !isBlank(request.getImageBase64()));
- }
-
- private String getContent(BDriverLicenseRequest request) {
- StringBuffer sb = getImageContent(request);
- if (StringUtils.isNotBlank(request.getDetectDirection())) {
- sb.append("&detect_direction=").append(request.getDetectDirection());
- }
- if (StringUtils.isNotBlank(request.getDrivingLicenseSide())) {
- sb.append("&driving_license_side=").append(request.getDrivingLicenseSide());
- }
- if (StringUtils.isNotBlank(request.getUnifiedValidPeriod())) {
- sb.append("&unified_valid_period=").append(request.getUnifiedValidPeriod());
- }
- if (StringUtils.isNotBlank(request.getQualityWarn())) {
- sb.append("&quality_warn=").append(request.getQualityWarn());
- }
- if (StringUtils.isNotBlank(request.getRiskWarn())) {
- sb.append("&risk_warn=").append(request.getRiskWarn());
- }
- return sb.toString();
- }
-
- private StringBuffer getImageContent(BDriverLicenseRequest request) {
- StringBuffer sb = new StringBuffer();
- if (StringUtils.isNotBlank(request.getImageBase64())) {
- sb.append("&image=").append(request.getImageBase64());
- }
- if (StringUtils.isNotBlank(request.getImageUrl())) {
- sb.append("&url=").append(request.getImageUrl());
- }
- return sb;
- }
-
- private boolean checkNotTrueFalse(String value) {
- return !ApiConstants.trueOrFalse.contains(value);
- }
-
- private boolean checkNotFrontBack(String value) {
- return !ApiConstants.frontOrback.contains(value);
- }
-
- private RecognizeDriverLicenseFaceResp toFaceResp(Map data) {
- RecognizeDriverLicenseFaceResp resp = new RecognizeDriverLicenseFaceResp();
-
- // 驾驶证正页 11个字段
- resp.setLicenseNumber(MapUtils.getByExpr(data, "words_result.证号.words"));
- resp.setName(MapUtils.getByExpr(data, "words_result.姓名.words"));
- resp.setGender(MapUtils.getByExpr(data, "words_result.性别.words"));
- resp.setNationality(MapUtils.getByExpr(data, "words_result.国籍.words"));
- resp.setBirthDate(MapUtils.getByExpr(data, "words_result.出生日期.words"));
- resp.setIssueDate(MapUtils.getByExpr(data, "words_result.初次领证日期.words"));
- resp.setVehicleType(MapUtils.getByExpr(data, "words_result.准驾车型.words"));
- // 电子/归一化模式返回 "有效起始日期",非归一化返回 "有效期限"
- String startDate = MapUtils.getByExpr(data, "words_result.有效起始日期.words");
- if (startDate == null) {
- startDate = MapUtils.getByExpr(data, "words_result.有效期限.words");
- }
- resp.setStartDate(startDate);
-
- // 电子/归一化模式返回 "失效日期",非归一化返回 "至"
- String endDate = MapUtils.getByExpr(data, "words_result.失效日期.words");
- if (endDate == null) {
- endDate = MapUtils.getByExpr(data, "words_result.至.words");
- }
- resp.setEndDate(endDate);
- resp.setAddress(MapUtils.getByExpr(data, "words_result.住址.words"));
- resp.setIssueUnit(MapUtils.getByExpr(data, "words_result.发证单位.words"));
-
- // 电子驾驶证正页 额外字段
- resp.setAccumulatedPoints(MapUtils.getByExpr(data, "words_result.累积记分.words"));
- resp.setStatus(MapUtils.getByExpr(data, "words_result.状态.words"));
- resp.setArchiveNumber(MapUtils.getByExpr(data, "words_result.档案编号.words"));
- resp.setGenerateTime(MapUtils.getByExpr(data, "words_result.生成时间.words"));
- resp.setCurrentTime(MapUtils.getByExpr(data, "words_result.当前时间.words"));
- resp.setBarcodeNumber(MapUtils.getByExpr(data, "words_result.条形码下编号.words"));
-
- return resp;
- }
-
- private RecognizeDriverLicenseBackResp toBackResp(Map data) {
- RecognizeDriverLicenseBackResp resp = new RecognizeDriverLicenseBackResp();
- resp.setName(MapUtils.getByExpr(data, "words_result.姓名.words"));
- resp.setRecord(MapUtils.getByExpr(data, "words_result.记录.words"));
- resp.setCardNumber(MapUtils.getByExpr(data, "words_result.证号.words"));
- resp.setArchiveNumber(MapUtils.getByExpr(data, "words_result.档案编号.words"));
- return resp;
- }
-
}
diff --git a/api-web/api-interface/src/main/java/com/heyu/api/controller/car/RecognizeDrivingLicenseController.java b/api-web/api-interface/src/main/java/com/heyu/api/controller/car/RecognizeDrivingLicenseController.java
index 556248d..2e2f2f5 100644
--- a/api-web/api-interface/src/main/java/com/heyu/api/controller/car/RecognizeDrivingLicenseController.java
+++ b/api-web/api-interface/src/main/java/com/heyu/api/controller/car/RecognizeDrivingLicenseController.java
@@ -1,263 +1,43 @@
package com.heyu.api.controller.car;
+import com.heyu.api.baidu.handle.traffic.BVehicleLicenseHandle;
import com.heyu.api.baidu.request.traffic.BVehicleLicenseRequest;
import com.heyu.api.controller.BaseController;
+import com.heyu.api.controller.ocr.BaiduOcrResult;
import com.heyu.api.data.annotation.EbAuthentication;
import com.heyu.api.data.constants.ApiConstants;
-import com.heyu.api.data.utils.MapUtils;
import com.heyu.api.data.utils.R;
import com.heyu.api.data.utils.StringUtils;
import com.heyu.api.request.car.VehicleLicenseRequest;
-import com.heyu.api.resp.car.RecognizeDrivingLicenseBackResp;
-import com.heyu.api.resp.car.RecognizeDrivingLicenseFaceResp;
-import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
-import java.util.Map;
-
-
-/**
- * 行驶证识别控制器
- *
- * 提供行驶证OCR识别功能,基于百度云交通场景OCR接口实现
- * 支持功能:
- *
- * - 行驶证正面识别:包含号牌号码、车辆类型、所有人、使用性质等基本信息
- * - 行驶证反面识别:包含核定载人数、总质量、检验记录等详细信息
- * - 支持图片URL和Base64两种输入方式
- * - 支持图像方向自动矫正、质量告警等高级功能
- *
- *
- * 接口文档:https://console.bce.baidu.com/support/#/api?product=AI&project=文字识别&parent=交通场景OCR&api=rest%2F2.0%2Focr%2Fv1%2Fvehicle_license&method=post
- *
- * @author heyu
- * @since 1.0.0
- */
-@Slf4j
@RestController
@RequestMapping("/driving/license")
-@SuppressWarnings("unchecked")
public class RecognizeDrivingLicenseController extends BaseController {
- private static final String VEHICLE_LICENSE_URI = "/rest/2.0/ocr/v1/vehicle_license";
+ @Autowired
+ private BVehicleLicenseHandle bVehicleLicenseHandle;
- /**
- * 行驶证识别接口
- * 支持行驶证正反面识别,使用百度云OCR接口
- *
- * @param request 行驶证识别请求对象,包含图片URL或base64编码、正反面标识等参数
- * @return 识别结果,正面返回 {@link RecognizeDrivingLicenseFaceResp},反面返回 {@link RecognizeDrivingLicenseBackResp}
- */
@EbAuthentication(tencent = ApiConstants.TENCENT_AUTH)
@PostMapping("/recognize")
- public R