diff --git a/api-web/api-interface/src/main/java/com/heyu/api/controller/doc/DocClassifyController.java b/api-web/api-interface/src/main/java/com/heyu/api/controller/doc/DocClassifyController.java index 580c75f..fd76f75 100644 --- a/api-web/api-interface/src/main/java/com/heyu/api/controller/doc/DocClassifyController.java +++ b/api-web/api-interface/src/main/java/com/heyu/api/controller/doc/DocClassifyController.java @@ -1,62 +1,69 @@ package com.heyu.api.controller.doc; -import com.heyu.api.baidu.handle.doc.BDocClassifyHandle; import com.heyu.api.baidu.request.doc.BDocClassifyRequest; import com.heyu.api.baidu.response.doc.BDocClassifyResp; +import com.heyu.api.controller.BaseController; import com.heyu.api.data.annotation.CacheResult; import com.heyu.api.data.annotation.NotIntercept; -import com.heyu.api.data.utils.ApiR; import com.heyu.api.data.utils.R; -import com.heyu.api.resp.doc.DocClassifyResp; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.collections.CollectionUtils; -import org.springframework.beans.factory.annotation.Autowired; +import com.heyu.api.data.utils.StringUtils; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import java.util.ArrayList; -import java.util.List; +import java.util.Map; /*** - * https://console.bce.baidu.com/support/?_=1740667714316×tamp=1742716755429#/api?product=AI&project=%E6%96%87%E5%AD%97%E8%AF%86%E5%88%AB&parent=%E6%96%87%E6%A1%A3%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86&api=rest%2F2.0%2Focr%2Fv1%2Fdoc_classify&method=post - * + * https://cloud.baidu.com/doc/OCR/s/qlor1ahik * * 文件检测分类 * * 接口描述 * 对图片中的文档、卡证、票据等含文字的主体进行检测、分类,可同时支持一张图片中多张主体的情况,返回每个主体的类别及位置信息。 - * - * */ -@Slf4j @RestController @RequestMapping("/doc") @NotIntercept -public class DocClassifyController { - - @Autowired - private BDocClassifyHandle bDocClassifyHandle; +public class DocClassifyController extends BaseController { + private static final String DOC_CLASSIFY_URI = "/rest/2.0/ocr/v1/doc_classify"; + /** + * 文件检测分类,对图片中的文档、卡证、票据等含文字的主体进行检测、分类 + * + * 请求参数: + *
+     * {
+     *     "imageBase64": "图像base64编码(与imageUrl二选一)",
+     *     "imageUrl": "图片完整URL(与imageBase64二选一)"
+     * }
+     * 
+ */ @RequestMapping("/classify") @CacheResult - public R classify(BDocClassifyRequest request) { - List respList = new ArrayList<>(); - ApiR bR = bDocClassifyHandle.handle(request); - if (bR.isSuccess()) { - BDocClassifyResp bDocClassifyResp = bR.getData(); - if (CollectionUtils.isNotEmpty(bDocClassifyResp.getWordsResult())) { - for (BDocClassifyResp.WordsResultDTO wordsResultDTO : bDocClassifyResp.getWordsResult()) { - DocClassifyResp resp = new DocClassifyResp(); - resp.setProbablity(wordsResultDTO.getProbablity()); - resp.setType(wordsResultDTO.getType()); - respList.add(resp); - } - return R.ok().setData(respList); - } + public R classify(BDocClassifyRequest request) { + if (request == null || (isBlank(request.getImageBase64()) && isBlank(request.getImageUrl()))) { + return R.error("image 和 url 不能都为空"); } - return R.error(bR.getErrorMsg()); + String content = buildContent(request); + Map result = requestBaidu(DOC_CLASSIFY_URI, content); + if (result == null) { + return R.error("识别失败"); + } + BDocClassifyResp resp = com.alibaba.fastjson.JSONObject.parseObject( + com.alibaba.fastjson.JSONObject.toJSONString(result), BDocClassifyResp.class); + return R.ok().setData(resp); } -} \ No newline at end of file + private String buildContent(BDocClassifyRequest request) { + StringBuilder sb = new StringBuilder(); + if (StringUtils.isNotBlank(request.getImageBase64())) { + sb.append("&image=").append(request.getImageBase64()); + } + if (StringUtils.isNotBlank(request.getImageUrl())) { + sb.append("&url=").append(request.getImageUrl()); + } + return sb.toString(); + } + +} diff --git a/api-web/api-interface/src/test/java/com/heyu/api/controller/doc/DocClassifyControllerTest.java b/api-web/api-interface/src/test/java/com/heyu/api/controller/doc/DocClassifyControllerTest.java new file mode 100644 index 0000000..0854b5c --- /dev/null +++ b/api-web/api-interface/src/test/java/com/heyu/api/controller/doc/DocClassifyControllerTest.java @@ -0,0 +1,78 @@ +package com.heyu.api.controller.doc; + +import com.ApiInterfaceApplicationTests; +import com.alibaba.fastjson.JSON; +import com.heyu.api.baidu.request.doc.BDocClassifyRequest; +import com.heyu.api.baidu.response.doc.BDocClassifyResp; +import com.heyu.api.data.utils.R; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +/** + * 文件检测分类 - 在线图片验证 + * + * 调用本地 /doc/classify 接口,对图片中的文档、卡证、票据进行检测分类。 + * + * 假设(Given): 目标图片可访问,百度 API 可用 + * 当(When): 调用 classify 接口,传入图片 URL + * 则(Then): 返回检测结果 + * + * @author zhengli + * @since 20260531_zl + */ +public class DocClassifyControllerTest extends ApiInterfaceApplicationTests { + + @Autowired + private DocClassifyController docClassifyController; + + private static final String TARGET_IMAGE_URL = "https://www.opsky.com.cn/upload/20211224/KXfgvm2MFRAXKbPu5LK.png"; + + @Test + void classifyByUrlTest() { + // 1. 构造请求 + BDocClassifyRequest request = new BDocClassifyRequest(); + request.setImageUrl(TARGET_IMAGE_URL); + + // 2. 打印请求参数 + System.out.println("\n========== 请求参数 =========="); + System.out.println(JSON.toJSONString(request)); + System.out.println("=============================="); + + // 3. 调用本地 /doc/classify 接口 + R result = docClassifyController.classify(request); + + // 4. 打印响应结果 + System.out.println("\n========== 响应结果 =========="); + System.out.println(JSON.toJSONString(result)); + System.out.println("=============================="); + + // 5. 断言 + assertNotNull(result, "返回结果不能为空"); + assertEquals("200", result.getCode(), "接口应返回成功"); + assertNotNull(result.getData(), "返回数据不能为空"); + + // 6. 打印接口返回值 + System.out.println("\n========== /doc/classify 接口返回 =========="); + System.out.println("{\"code\":\"" + result.getCode() + "\","); + System.out.println(" \"msg\":\"" + result.getMsg() + "\","); + System.out.println(" \"data\":" + JSON.toJSONString(result.getData())); + System.out.println("}"); + System.out.println("================================================"); + } + + @Test + void classifyParamEmptyTest() { + // 1. 构造请求 - image 和 url 都为空 + BDocClassifyRequest request = new BDocClassifyRequest(); + + // 2. 调用接口 + R result = docClassifyController.classify(request); + + // 3. 断言 + assertNotNull(result, "返回结果不能为空"); + assertEquals("400", result.getCode(), "参数为空时应返回失败"); + } +} diff --git a/doc/商品发布说明文档.md b/doc/商品发布说明文档.md index 0a6a8d3..5e94edd 100644 --- a/doc/商品发布说明文档.md +++ b/doc/商品发布说明文档.md @@ -4,6 +4,7 @@ - 商售后支持不能出现联系方式 - 任何地方不能出现绝对化字眼 - 商品介绍不能出现三方品牌 +- 商品上架完成后,并更新文档【doc/百度智能云-文字识别-API文档-API列表.md】状态; #### 二、特殊商品资质文案 ``` diff --git a/doc/接口开发说明文档.md b/doc/接口开发说明文档.md index 50efcde..83fe472 100644 --- a/doc/接口开发说明文档.md +++ b/doc/接口开发说明文档.md @@ -3,5 +3,5 @@ - 1.1、接口开发时,所有的逻辑用controller 来实现; - 1.2、接口实现规范参考:RecognizeDrivingLicenseController.java; - 1.3、接口开发自测完成后记得更新文档【doc/百度智能云-文字识别-API文档-API列表.md】状态; -- 1.4、商品上架完成后,并更新文档【doc/百度智能云-文字识别-API文档-API列表.md】状态; -- 1.5、接口使用body传参数,ContentType= application/x-www-form-urlencoded; \ No newline at end of file +- 1.4、接口使用body传参数,ContentType= application/x-www-form-urlencoded; +- 1.5、集成测试参考:com/heyu/api/controller/doc/ForgeryDetectionControllerTest.java; \ No newline at end of file