diff --git a/api-third/src/main/java/com/heyu/api/baidu/BaiduBaseHandle.java b/api-third/src/main/java/com/heyu/api/baidu/BaiduBaseHandle.java index da4e5c2..4c0b2ec 100644 --- a/api-third/src/main/java/com/heyu/api/baidu/BaiduBaseHandle.java +++ b/api-third/src/main/java/com/heyu/api/baidu/BaiduBaseHandle.java @@ -56,15 +56,8 @@ public abstract class BaiduBaseHandle { if (content.startsWith("&")) { content = content.substring(1); } - MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded"); - // image 可以通过 方法获取,如果Content-Type是application/x-www-form-urlencoded时,第二个参数传true - RequestBody body = RequestBody.create(mediaType, content); - Request request = new Request.Builder() - .url("https://aip.baidubce.com/" + getUri() + "?access_token=" + getBaiduAccessToken()) - .method("POST", body) - .addHeader("Content-Type", "application/x-www-form-urlencoded") - .addHeader("Accept", "application/json") - .build(); + + Request request = createRequest(content); Response response = HTTP_CLIENT.newCall(request).execute(); result = response.body().string(); @@ -73,8 +66,6 @@ public abstract class BaiduBaseHandle { return ApiR.setData(resp); } - - Class clazz = this.getClass(); //getGenericSuperclass()获得带有泛型的父类 //Type是 Java 编程语言中所有类型的公共高级接口。它们包括原始类型、参数化类型、数组类型、类型变量和基本类型。 @@ -98,6 +89,24 @@ public abstract class BaiduBaseHandle { return null; } + /*** + * 创建create + * @param content + * @return + */ + public Request createRequest(String content){ + MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded"); + // image 可以通过 方法获取,如果Content-Type是application/x-www-form-urlencoded时,第二个参数传true + RequestBody body = RequestBody.create(mediaType, content); + Request request = new Request.Builder() + .url("https://aip.baidubce.com/" + getUri() + "?access_token=" + getBaiduAccessToken()) + .method("POST", body) + .addHeader("Content-Type", "application/x-www-form-urlencoded") + .addHeader("Accept", "application/json") + .build(); + return request; + } + /** * 从用户的AK,SK生成鉴权签名(Access Token) * diff --git a/api-third/src/main/java/com/heyu/api/baidu/handle/convert/BTextreviewHandle.java b/api-third/src/main/java/com/heyu/api/baidu/handle/convert/BTextreviewHandle.java index ed8221b..34a3375 100644 --- a/api-third/src/main/java/com/heyu/api/baidu/handle/convert/BTextreviewHandle.java +++ b/api-third/src/main/java/com/heyu/api/baidu/handle/convert/BTextreviewHandle.java @@ -1,12 +1,20 @@ package com.heyu.api.baidu.handle.convert; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; import com.google.common.collect.Maps; -import com.heyu.api.data.utils.StringUtils; import com.heyu.api.baidu.BaiduBaseHandle; import com.heyu.api.baidu.request.convert.BTextreviewRequest; import com.heyu.api.baidu.response.convert.BTextreviewResp; -import org.apache.commons.collections.CollectionUtils; +import com.heyu.api.data.utils.SpringContextUtils; +import com.heyu.api.data.utils.StringUtils; +import com.heyu.api.oss.OssFileUploadService; +import lombok.extern.slf4j.Slf4j; +import okhttp3.MediaType; +import okhttp3.MultipartBody; +import okhttp3.Request; +import okhttp3.RequestBody; import org.springframework.stereotype.Component; import java.util.Arrays; @@ -19,6 +27,7 @@ import java.util.Map; * */ @Component +@Slf4j public class BTextreviewHandle extends BaiduBaseHandle { public static Map suport = Maps.newHashMap(); @@ -74,10 +83,33 @@ public class BTextreviewHandle extends BaiduBaseHandle fileURLList,当file字段存在时,fileURLList字段失效 */ - private File file; + private String fileBase64; /*** * 和 file/fileURLList 二选一 @@ -29,7 +26,7 @@ public class BTextreviewRequest extends BBaseRequest { * * */ - private List fileURLList; + private String fileURL; /** * 选择需要审查的合同类型。 diff --git a/api-third/src/main/java/com/heyu/api/baidu/response/convert/BQueryTaskResp.java b/api-third/src/main/java/com/heyu/api/baidu/response/convert/BQueryTaskResp.java index baafcfb..2dd9eca 100644 --- a/api-third/src/main/java/com/heyu/api/baidu/response/convert/BQueryTaskResp.java +++ b/api-third/src/main/java/com/heyu/api/baidu/response/convert/BQueryTaskResp.java @@ -1,18 +1,151 @@ package com.heyu.api.baidu.response.convert; +import com.fasterxml.jackson.annotation.JsonProperty; import com.heyu.api.baidu.response.BBaseResp; import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; /** * https://console.bce.baidu.com/support/?_=1740703582749×tamp=1740706160699#/api?product=AI&project=%E6%96%87%E5%AD%97%E8%AF%86%E5%88%AB&parent=%E6%99%BA%E8%83%BD%E6%96%87%E6%A1%A3%E5%88%86%E6%9E%90&api=rest%2F2.0%2Fbrain%2Fonline%2Fv1%2Fextract%2Fquery_task&method=post *

* 文档抽取-获取结果 */ +@NoArgsConstructor @Data public class BQueryTaskResp extends BBaseResp { + @JsonProperty("file_name") + private String fileName; + @JsonProperty("file_id") + private String fileId; + @JsonProperty("pages") + private List pages; + @JsonProperty("chunks") + private List chunks; + @NoArgsConstructor + @Data + public static class PagesDTO { + @JsonProperty("page_id") + private String pageId; + @JsonProperty("page_num") + private Integer pageNum; + @JsonProperty("text") + private String text; + @JsonProperty("layouts") + private List layouts; + @JsonProperty("tables") + private List tables; + @JsonProperty("images") + private List images; + @JsonProperty("meta") + private MetaDTO meta; + @NoArgsConstructor + @Data + public static class MetaDTO { + @JsonProperty("page_width") + private Integer pageWidth; + @JsonProperty("page_height") + private Integer pageHeight; + @JsonProperty("is_scan") + private Boolean isScan; + @JsonProperty("page_angle") + private Integer pageAngle; + @JsonProperty("page_type") + private String pageType; + @JsonProperty("sheet_name") + private String sheetName; + } + + @NoArgsConstructor + @Data + public static class LayoutsDTO { + @JsonProperty("layout_id") + private String layoutId; + @JsonProperty("text") + private String text; + @JsonProperty("position") + private List position; + @JsonProperty("type") + private String type; + @JsonProperty("sub_type") + private String subType; + @JsonProperty("parent") + private String parent; + @JsonProperty("children") + private List children; + } + + @NoArgsConstructor + @Data + public static class TablesDTO { + @JsonProperty("layout_id") + private String layoutId; + @JsonProperty("markdown") + private String markdown; + @JsonProperty("position") + private List position; + @JsonProperty("cells") + private List cells; + @JsonProperty("matrix") + private List> matrix; + @JsonProperty("merge_table") + private String mergeTable; + + @NoArgsConstructor + @Data + public static class CellsDTO { + @JsonProperty("layout_id") + private String layoutId; + @JsonProperty("text") + private String text; + @JsonProperty("position") + private List position; + @JsonProperty("type") + private String type; + @JsonProperty("sub_type") + private String subType; + @JsonProperty("parent") + private String parent; + @JsonProperty("children") + private Object children; + } + } + } + + @NoArgsConstructor + @Data + public static class ChunksDTO { + @JsonProperty("chunk_id") + private String chunkId; + @JsonProperty("content") + private String content; + @JsonProperty("type") + private String type; + @JsonProperty("meta") + private MetaDTO meta; + + @NoArgsConstructor + @Data + public static class MetaDTO { + @JsonProperty("title") + private List title; + @JsonProperty("position") + private List position; + + @NoArgsConstructor + @Data + public static class PositionDTO { + @JsonProperty("box") + private List box; + @JsonProperty("page_num") + private Integer pageNum; + } + } + } } diff --git a/api-third/src/main/java/com/heyu/api/baidu/response/convert/BTextreviewQueryResp.java b/api-third/src/main/java/com/heyu/api/baidu/response/convert/BTextreviewQueryResp.java index a59cea1..16d1b24 100644 --- a/api-third/src/main/java/com/heyu/api/baidu/response/convert/BTextreviewQueryResp.java +++ b/api-third/src/main/java/com/heyu/api/baidu/response/convert/BTextreviewQueryResp.java @@ -30,21 +30,21 @@ public class BTextreviewQueryResp { @Data public static class ResultDTO { @JsonProperty("taskId") - private String taskId; + private String taskId; // 任务ID @JsonProperty("status") - private String status; + private String status; // 任务状态,pending:排队中;processing:运行中;success:成功;failed:失败 @JsonProperty("apiVersion") private String apiVersion; @JsonProperty("createdAt") - private String createdAt; + private String createdAt; // 任务创建时间 @JsonProperty("startedAt") - private String startedAt; + private String startedAt; // 任务开始时间 @JsonProperty("finishedAt") - private String finishedAt; + private String finishedAt; // 任务结束时间 @JsonProperty("duration") - private String duration; + private String duration; //任务执行时长 @JsonProperty("reason") - private String reason; + private String reason; //任务失败描述信息 @JsonProperty("textreviewResult") private List textreviewResult; @@ -52,55 +52,55 @@ public class BTextreviewQueryResp { @Data public static class TextreviewResultDTO { @JsonProperty("docId") - private String docId; + private String docId; // 文档ID @JsonProperty("docName") - private String docName; + private String docName; // 文档名称 @JsonProperty("status") - private String status; + private String status; // 文件状态,success:成功;failed:失败 @JsonProperty("reason") - private String reason; + private String reason; // 文件失败描述信息 @JsonProperty("chatContents") - private List chatContents; + private List chatContents; // 条款审查结果列表 @JsonProperty("fileURL") - private String fileURL; + private String fileURL; // 解析后的含位置信息的PDF文件地址,地址有效期30天 @JsonProperty("reportURL") - private String reportURL; + private String reportURL; // 包含重大风险条款批注的Word文档地址,地址有效期30天。若上传的源文件为PDF格式,则无法支持批注下载 @JsonProperty("reportStatus") - private String reportStatus; + private String reportStatus; // 包含批注的Word文档状态,success:成功;failed:失败 @NoArgsConstructor @Data public static class ChatContentsDTO { @JsonProperty("ruleId") - private String ruleId; + private String ruleId; // 条款ID @JsonProperty("ruleName") - private String ruleName; + private String ruleName; // 条款名称 @JsonProperty("tags") - private List tags; + private List tags; // 条款的原文和位置信息列表 @JsonProperty("riskReviewResults") private List riskReviewResults; @JsonProperty("predictResult") - private String predictResult; + private String predictResult; // 条款的原始审查结果 @JsonProperty("isShow") private Boolean isShow; @JsonProperty("riskName") - private String riskName; + private String riskName; // 条款的风险等级 @NoArgsConstructor @Data public static class TagsDTO { @JsonProperty("value") - private String value; + private String value; // 条款的原文 @JsonProperty("positions") - private List positions; + private List positions; // 条款的位置信息列表 @NoArgsConstructor @Data public static class PositionsDTO { @JsonProperty("pageNum") - private Integer pageNum; + private Integer pageNum; // 条款的原文位置页码 @JsonProperty("box") - private List box; + private List box; // 条款的原文四角点坐标,每个框选范围包含左上角x坐标、左上角y坐标、矩形框宽度、矩形框高度,共四个数值,如[89,74,61,12] } } @@ -108,23 +108,23 @@ public class BTextreviewQueryResp { @Data public static class RiskReviewResultsDTO { @JsonProperty("originalContract") - private String originalContract; + private String originalContract; // 合同原文 @JsonProperty("riskPoint") - private String riskPoint; + private String riskPoint; // 风险点名称 @JsonProperty("riskAnalysis") - private String riskAnalysis; + private String riskAnalysis; // 风险分析 @JsonProperty("modifyExample") - private String modifyExample; + private String modifyExample; // 修改示例 @JsonProperty("positions") - private List positions; + private List positions; // 条款的位置信息列表 @NoArgsConstructor @Data public static class PositionsDTO { @JsonProperty("pageNum") - private Integer pageNum; + private Integer pageNum; // 条款的原文位置页码 @JsonProperty("box") - private List box; + private List box; // 条款的原文四角点坐标,每个框选范围包含左上角x坐标、左上角y坐标、矩形框宽度、矩形框高度,共四个数值,如[89,74,61,12] } } } diff --git a/api-web/api-interface/src/main/java/com/heyu/api/controller/convert/DocExtractController.java b/api-web/api-interface/src/main/java/com/heyu/api/controller/convert/DocExtractController.java new file mode 100644 index 0000000..5d09af1 --- /dev/null +++ b/api-web/api-interface/src/main/java/com/heyu/api/controller/convert/DocExtractController.java @@ -0,0 +1,59 @@ +package com.heyu.api.controller.convert; + + +import com.heyu.api.baidu.handle.convert.BExtractHandle; +import com.heyu.api.baidu.handle.convert.BQueryTaskHandle; +import com.heyu.api.data.annotation.CacheResult; +import com.heyu.api.data.annotation.NotIntercept; +import com.heyu.api.data.utils.R; +import com.heyu.api.request.convert.DocConvertReq; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + + +/*** + * + * https://console.bce.baidu.com/support/?_=1740703582749×tamp=1740705642373#/api?product=AI&project=%E6%96%87%E5%AD%97%E8%AF%86%E5%88%AB&parent=%E6%99%BA%E8%83%BD%E6%96%87%E6%A1%A3%E5%88%86%E6%9E%90&api=rest%2F2.0%2Fbrain%2Fonline%2Fv1%2Fextract%2Ftask&method=post + * + * + * 文档抽取-提交请求 + * + * + *https://console.bce.baidu.com/support/?_=1740703582749×tamp=1742713011202#/api?product=AI&project=%E6%96%87%E5%AD%97%E8%AF%86%E5%88%AB&parent=%E6%99%BA%E8%83%BD%E6%96%87%E6%A1%A3%E5%88%86%E6%9E%90&api=rest%2F2.0%2Fbrain%2Fonline%2Fv1%2Fextract%2Ftask&method=post + * + * + * + * + *文档抽取-提交请求 + * + * + * + * 接口描述 + * 文档抽取支持自定义配置字段,无需训练即可抽取文档字段信息,精准定位字段值,适用于合同、票据、订单等各类文档场景。如希望快速可视化体验效果,可登录智能文档分析平台,一键上传文档,在线测试;在线工具和API服务的额度共享互通。 + * + * 文档抽取API服务为异步接口,需要先调用提交请求接口获取taskId,然后调用获取结果接口进行结果轮询,建议提交请求后30秒开始轮询。提交请求接口QPS为2,获取结果接口QPS为10。 + * + */ +@Slf4j +@RestController +@RequestMapping("/doc") +@NotIntercept +public class DocExtractController { + + @Autowired + private BExtractHandle bExtractHandle ; + + @Autowired + private BQueryTaskHandle bQueryTaskHandle; + + + @RequestMapping("/extract") + @CacheResult + public R doc(DocConvertReq request) { + + + return R.error(); + } +} diff --git a/api-web/api-interface/src/main/java/com/heyu/api/controller/convert/ParserTextController.java b/api-web/api-interface/src/main/java/com/heyu/api/controller/convert/ParserTextController.java new file mode 100644 index 0000000..f2796d5 --- /dev/null +++ b/api-web/api-interface/src/main/java/com/heyu/api/controller/convert/ParserTextController.java @@ -0,0 +1,73 @@ +package com.heyu.api.controller.convert; + + +import com.heyu.api.baidu.handle.convert.BParserTextHandle; +import com.heyu.api.baidu.handle.convert.BParserTextQueryQueryHandle; +import com.heyu.api.baidu.request.convert.BParserTextQueryRequest; +import com.heyu.api.baidu.response.convert.BParserTextQueryResp; +import com.heyu.api.baidu.response.convert.BParserTextResp; +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.data.utils.StringUtils; +import com.heyu.api.request.convert.ParserTextReq; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + + +/*** + * https://console.bce.baidu.com/support/?_=1740703582749×tamp=1740704125877#/api?product=AI&project=%E6%96%87%E5%AD%97%E8%AF%86%E5%88%AB&parent=%E6%99%BA%E8%83%BD%E6%96%87%E6%A1%A3%E5%88%86%E6%9E%90&api=rest%2F2.0%2Fbrain%2Fonline%2Fv2%2Fparser%2Ftask&method=post + * + * 文档解析-提交请求 + * + * + *https://console.bce.baidu.com/support/?_=1740703582749×tamp=1742714833134#/api?product=AI&project=%E6%96%87%E5%AD%97%E8%AF%86%E5%88%AB&parent=%E6%99%BA%E8%83%BD%E6%96%87%E6%A1%A3%E5%88%86%E6%9E%90&api=rest%2F2.0%2Fbrain%2Fonline%2Fv2%2Fparser%2Ftask%2Fquery&method=post + * + * + * 文档解析-获取结果 + * + */ + + +@Slf4j +@RestController +@RequestMapping("/text") +@NotIntercept +public class ParserTextController extends BaseController { + + + @Autowired + private BParserTextHandle bParserTextHandle; + + @Autowired + private BParserTextQueryQueryHandle bParserTextQueryHandle; + + @RequestMapping("/parse") + @CacheResult + public R parse(ParserTextReq request) { + if (StringUtils.isNotBlank(request.getTaskId())) { + ApiR bR = bParserTextHandle.handle(request); + + if (bR.isSuccess()) { + BParserTextResp bParserTextResp = bR.getData(); + return R.ok().setData(bParserTextResp.getResult()); + } + return R.error(bR.getErrorMsg()); + } else { + + BParserTextQueryRequest bParserTextQueryRequest = new BParserTextQueryRequest(); + bParserTextQueryRequest.setTaskId(request.getTaskId()); + + ApiR bR = bParserTextQueryHandle.handle(bParserTextQueryRequest); + if (bR.isSuccess()) { + return R.ok().setData(bR.getData()); + } + return R.error(bR.getErrorMsg()); + } + + } +} diff --git a/api-web/api-interface/src/main/java/com/heyu/api/controller/convert/TextreviewController.java b/api-web/api-interface/src/main/java/com/heyu/api/controller/convert/TextreviewController.java new file mode 100644 index 0000000..d17bcb8 --- /dev/null +++ b/api-web/api-interface/src/main/java/com/heyu/api/controller/convert/TextreviewController.java @@ -0,0 +1,68 @@ +package com.heyu.api.controller.convert; + +import com.heyu.api.baidu.handle.convert.BTextreviewHandle; +import com.heyu.api.baidu.handle.convert.BTextreviewQueryHandle; +import com.heyu.api.baidu.request.convert.BTextreviewQueryRequest; +import com.heyu.api.baidu.response.convert.BTextreviewQueryResp; +import com.heyu.api.baidu.response.convert.BTextreviewResp; +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.data.utils.StringUtils; +import com.heyu.api.request.convert.TextreviewReq; +import com.heyu.api.resp.convert.TextreviewRequestResp; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + + +@Slf4j +@RestController +@RequestMapping("/doc") +@NotIntercept +public class TextreviewController extends BaseController { + + @Autowired + private BTextreviewHandle bTextreviewHandle; + + + @Autowired + private BTextreviewQueryHandle bTextreviewQueryHandle; + + + @RequestMapping("/textreview") + @CacheResult + public R parse(TextreviewReq request) { + + + if (StringUtils.isNotBlank(request.getTaskId())) { + + ApiR bR = bTextreviewHandle.handle(request); + if (bR.isSuccess()) { + TextreviewRequestResp resp = new TextreviewRequestResp(); + BTextreviewResp bTextreviewResp = bR.getData(); + + resp.setTaskId(bTextreviewResp.getResult().getTaskId()); + + return R.ok().setData(resp); + } + return R.error(bR.getErrorMsg()); + } else { + + BTextreviewQueryRequest bTextreviewQueryRequest = new BTextreviewQueryRequest(); + bTextreviewQueryRequest.setTaskId(request.getTaskId()); + + + ApiR bR = bTextreviewQueryHandle.handle(bTextreviewQueryRequest); + if(bR.isSuccess() ){ + BTextreviewQueryResp bTextreviewQueryResp = bR.getData(); + return R.ok().setData(bTextreviewQueryResp.getResult()); + } + return R.error(bR.getErrorMsg()); + } + } + +} diff --git a/api-web/api-interface/src/main/java/com/heyu/api/request/convert/ParserTextReq.java b/api-web/api-interface/src/main/java/com/heyu/api/request/convert/ParserTextReq.java new file mode 100644 index 0000000..9fe8b0f --- /dev/null +++ b/api-web/api-interface/src/main/java/com/heyu/api/request/convert/ParserTextReq.java @@ -0,0 +1,13 @@ +package com.heyu.api.request.convert; + +import com.heyu.api.baidu.request.convert.BParserTextRequest; +import lombok.Data; + +@Data +public class ParserTextReq extends BParserTextRequest { + /*** + * 任务id + */ + private String taskId; + +} diff --git a/api-web/api-interface/src/main/java/com/heyu/api/request/convert/TextreviewReq.java b/api-web/api-interface/src/main/java/com/heyu/api/request/convert/TextreviewReq.java new file mode 100644 index 0000000..fbb3fb2 --- /dev/null +++ b/api-web/api-interface/src/main/java/com/heyu/api/request/convert/TextreviewReq.java @@ -0,0 +1,13 @@ +package com.heyu.api.request.convert; + +import com.heyu.api.baidu.request.convert.BTextreviewRequest; +import lombok.Data; + +@Data +public class TextreviewReq extends BTextreviewRequest { + + /** + * 任务id + */ + private String taskId; +} diff --git a/api-web/api-interface/src/main/java/com/heyu/api/resp/convert/TextreviewRequestResp.java b/api-web/api-interface/src/main/java/com/heyu/api/resp/convert/TextreviewRequestResp.java new file mode 100644 index 0000000..d99cf8e --- /dev/null +++ b/api-web/api-interface/src/main/java/com/heyu/api/resp/convert/TextreviewRequestResp.java @@ -0,0 +1,14 @@ +package com.heyu.api.resp.convert; + +import com.heyu.api.data.dto.BaseReq; +import lombok.Data; + +@Data +public class TextreviewRequestResp extends BaseReq { + /** + * 任务id + */ + private String taskId; + + +}