提交修改

This commit is contained in:
quyixiao 2026-06-04 01:59:46 +08:00
parent d58c9c9fd1
commit 6c2d38aa95

View File

@ -20,28 +20,83 @@ import java.util.Map;
/** /**
* 驾驶证识别控制器 * 驾驶证识别控制器
* <p> * <p>
* 对机动车驾驶证正页副页及电子驾驶证正页进行结构化识别 * 能力说明对机动车驾驶证<strong>正页</strong><strong>副页</strong><strong>电子驾驶证正页</strong>进行结构化识别
* 校验请求组装结果封装及异常处理均在 Controller 层完成 * 底层对接百度智能云文字识别驾驶证识别能力由本服务完成参数校验请求转发与字段映射
* </p>
* <p>
* 接口路径POST /driver/license/recognize
* </p>
* <p>
* 返回约定进入平台识别链路组装请求体之后一律 {@code R.ok()}若有异常则将详细提示写入 {@code msg}
* 仅入参校验失败时返回 {@code R.error()}未调用平台识别不计费
* </p> * </p>
* *
* <h3>百度官方文档</h3>
* <ul>
* <li>产品文档<a href="https://cloud.baidu.com/doc/OCR/s/Vk3h7xzz7">驾驶证识别</a></li>
* <li>接口地址{@code POST https://aip.baidubce.com/rest/2.0/ocr/v1/driving_license}</li>
* </ul>
*
* <h3>本服务接口</h3>
* <ul>
* <li>路径{@code POST /driver/license/recognize}</li>
* <li>Content-Type{@code application/x-www-form-urlencoded}</li>
* <li>鉴权{@link EbAuthentication}Tencent 鉴权头见项目网关配置</li>
* </ul>
*
* <h3>请求参数{@link DriverLicenseRecognizeRequest}</h3>
* <table>
* <tr><th>字段</th><th>必填</th><th>说明</th></tr>
* <tr><td>imageBase64</td><td> imageUrl 二选一</td>
* <td>图片 Base64 urlencode编码后4M支持 jpg/jpeg/png/bmp优先级高于 url</td></tr>
* <tr><td>imageUrl</td><td> imageBase64 二选一</td>
* <td>图片完整 URL1024 字节需公网可访问并关闭防盗链</td></tr>
* <tr><td>side</td><td>默认 face</td>
* <td>{@code face}/{@code front}正页/电子证正页{@code back}副页
* 映射百度参数 {@code driving_license_side=front|back}</td></tr>
* </table>
*
* <h3>返回结构统一包装 {@link R}</h3>
* <pre>
* {
* "code": "200", // 成功为 200仅入参非法时为 400
* "msg": "...", // 成功默认文案业务异常时写入详细提示仍可能 code=200
* "traceId": "...",
* "data": { ... } // 见下方 data 结构失败时可能为空对象
* }
* </pre>
* <p><b>返回约定重要</b></p>
* <ul>
* <li>入参校验失败{@code R.error()}<strong>未调用百度不计费</strong></li>
* <li>已调用百度识别链路一律 {@code R.ok()}若图片/平台/识别异常将说明写入 {@code msg}
* {@code data} 可能为空或字段不全对外不暴露百度字样日志内可排查</li>
* </ul>
*
* <h3>data 结构 side 区分</h3>
* <p><b>正页 / 电子证正页</b>{@link RecognizeDriverLicenseFaceResp}side=face front</p>
* <ul>
* <li>纸质正页常见字段licenseNumber 证号name 姓名gender 性别nationality 国籍
* birthDate 出生日期issueDate 初次领证日期vehicleType 准驾车型startDate 有效起始日期
* endDate 失效日期address 住址issueUnit 发证单位</li>
* <li>电子驾驶证正页额外accumulatedPoints 累积记分status 状态archiveNumber 档案编号
* generateTime 生成时间currentTime 当前时间barcodeNumber 条形码下编号</li>
* </ul>
* <p><b>副页</b>{@link RecognizeDriverLicenseBackResp}side=back</p>
* <ul>
* <li>name 姓名record 记录cardNumber 证号archiveNumber 档案编号</li>
* </ul>
*
* <p>字段与百度 {@code words_result} 中中文 key 的对应关系见
* <a href="https://cloud.baidu.com/doc/OCR/s/Vk3h7xzz7">官方返回示例</a></p>
*
* @author heyu * @author heyu
* @since 1.0.0 * @since 1.0.0
* @see DriverLicenseRecognizeRequest
* @see RecognizeDriverLicenseFaceResp
* @see RecognizeDriverLicenseBackResp
*/ */
@Slf4j @Slf4j
@RestController @RestController
@RequestMapping("/driver/license") @RequestMapping("/driver/license")
public class RecognizeDriverLicenseController extends BaseController { public class RecognizeDriverLicenseController extends BaseController {
/** 百度驾驶证识别 API 路径,完整地址见类注释 */
private static final String DRIVING_LICENSE_URI = "/rest/2.0/ocr/v1/driving_license"; private static final String DRIVING_LICENSE_URI = "/rest/2.0/ocr/v1/driving_license";
/** 平台错误码 → 对外原因说明(每条语义独立,便于客服判读) */ /** 百度 error_code → 对外 msg 原因说明(日志与返回 msg 使用「平台」表述,注释可写百度 */
private static final Map<String, String> PLATFORM_ERROR_HINTS = new HashMap<>(); private static final Map<String, String> PLATFORM_ERROR_HINTS = new HashMap<>();
static { static {
@ -63,6 +118,31 @@ public class RecognizeDriverLicenseController extends BaseController {
PLATFORM_ERROR_HINTS.put("282000", "平台识别引擎内部异常,属短暂性故障,可间隔数秒后重试"); PLATFORM_ERROR_HINTS.put("282000", "平台识别引擎内部异常,属短暂性故障,可间隔数秒后重试");
} }
/**
* 驾驶证识别
* <p>
* 请求示例form 表单
* </p>
* <pre>
* POST /driver/license/recognize
* Content-Type: application/x-www-form-urlencoded
*
* imageUrl=https://example.com/license.jpg&amp;side=face
* // imageBase64=xxx&amp;side=back
* </pre>
* <p>
* 成功示例正页data {@link RecognizeDriverLicenseFaceResp}
* </p>
* <pre>
* { "code":"200", "msg":"成功", "data": { "licenseNumber":"...", "name":"...", "vehicleType":"C1", ... } }
* </pre>
* <p>
* 已调用百度但识别异常时仍返回 code=200msg 中带处置指引data 可能为空对象
* </p>
*
* @param request 驾驶证识别请求字段见类注释请求参数
* @return 正页/电子证正页返回 {@link RecognizeDriverLicenseFaceResp}副页返回 {@link RecognizeDriverLicenseBackResp}
*/
@EbAuthentication(tencent = ApiConstants.TENCENT_AUTH) @EbAuthentication(tencent = ApiConstants.TENCENT_AUTH)
@PostMapping("/recognize") @PostMapping("/recognize")
public R recognize(DriverLicenseRecognizeRequest request) { public R recognize(DriverLicenseRecognizeRequest request) {