Commit 85628679 authored by alex yao's avatar alex yao

feat(文档对比):新增百度文档对比接口

parent 846cc766
......@@ -94,7 +94,7 @@ public class HttpUtils {
httpConn.setRequestProperty("Connection", "Keep-Alive");
httpConn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1)");
httpConn.setRequestProperty("Accept-Charset", "UTF-8");
httpConn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
httpConn.setRequestProperty("Content-Type", "multipart/form-data");
for (Map.Entry<String, String> entry : headers.entrySet()) {
httpConn.setRequestProperty(entry.getKey(), entry.getValue());
}
......
package cn.com.poc.covenant.constants;
/**
* @Author:Roger Wu
* @name:ContractConstants
* @Date:2025-05-29 17:09
*/
public interface ContractConstants {
public interface ActionType{
final static String extract = "extract"; //提取
final static String textreview = "textreview"; //审查
final static String textdiff = "textdiff"; //对比
}
public interface ContractType{
final static String contractExtract = "ContractExtract"; //审查
final static String contractReview = "ContractReview"; //对比
}
}
package cn.com.poc.covenant.dto;
import cn.com.poc.thirdparty.resource.text_in.entity.imageEdgeTriming.Result;
/**
* @author alex.yao
* @date 2025/5/19
*/
public class ExtractionDto {
private Integer status;
private Result result;
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public Result getResult() {
return result;
}
public void setResult(Result result) {
this.result = result;
}
}
package cn.com.poc.covenant.dto;
import java.util.Date;
/**
* 合同审核进度详情
*
* @author alex.yao
* @date 2025/5/21
*/
public class ReviewProgressDto {
private String reviewTaskId;//审核任务ID
private String fileName;//文件名
private String fileUrl;//文件URL
private String reviewStatus; //审核状态
private Date reviewDate;// 审核日期
private String textInTaskId; // textIn 任务id
public String getFileUrl() {
return fileUrl;
}
public void setFileUrl(String fileUrl) {
this.fileUrl = fileUrl;
}
public String getReviewTaskId() {
return reviewTaskId;
}
public void setReviewTaskId(String reviewTaskId) {
this.reviewTaskId = reviewTaskId;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public String getReviewStatus() {
return reviewStatus;
}
public void setReviewStatus(String reviewStatus) {
this.reviewStatus = reviewStatus;
}
public Date getReviewDate() {
return reviewDate;
}
public void setReviewDate(Date reviewDate) {
this.reviewDate = reviewDate;
}
public String getTextInTaskId() {
return textInTaskId;
}
public void setTextInTaskId(String textInTaskId) {
this.textInTaskId = textInTaskId;
}
}
package cn.com.poc.covenant.dto;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
/**
* @author alex.yao
* @date 2025/5/21
*/
public class StartReviewDto {
/**
* 文件URL列表
*/
private List<String> fileUrls;
private MultipartFile file;
/**
* 合同类型
*/
private String contractType;
public MultipartFile getFile() {
return file;
}
public void setFile(MultipartFile file) {
this.file = file;
}
public List<String> getFileUrls() {
return fileUrls;
}
public void setFileUrls(List<String> fileUrls) {
this.fileUrls = fileUrls;
}
public String getContractType() {
return contractType;
}
public void setContractType(String contractType) {
this.contractType = contractType;
}
}
package cn.com.poc.covenant.model;
import cn.com.yict.framemax.data.model.BaseModelClass;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import javax.persistence.*;
import java.io.Serializable;
/**
* Model class for biz_extraction_key_info_config
* TextIn 合同要素抽取 关键信息配置
*/
@Entity
@Table(name = "biz_extraction_key_info_config")
@DynamicInsert
@DynamicUpdate
public class BizExtractionKeyInfoConfigModel extends BaseModelClass implements Serializable {
private static final long serialVersionUID = 1L;
/**
* id
*/
private Integer id;
@Column(name = "id", length = 10)
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
super.addValidField("id");
}
/**
* key_info
* 关键信息名称, 长度限制20个字符
*/
private String keyInfo;
@Column(name = "key_info", length = 20)
public String getKeyInfo() {
return this.keyInfo;
}
public void setKeyInfo(String keyInfo) {
this.keyInfo = keyInfo;
super.addValidField("keyInfo");
}
/**
* paraphrase_names
* 相似名字段,字符串数组, 可根据相似名精准抽取关键信息, 最多填写3个,每个释义名称长度限制20个字符 [array]
*/
private String paraphraseNames;
@Column(name = "paraphrase_names", length = 1073741824)
public String getParaphraseNames() {
return this.paraphraseNames;
}
public void setParaphraseNames(String paraphraseNames) {
this.paraphraseNames = paraphraseNames;
super.addValidField("paraphraseNames");
}
/**
* field_type
* 字段类型字段, 可选项有,时间:time, 金额:amount, 地址:address, 公司:company, 姓名:name, 描述(长文本):long_text_description, 其他:other, 印章:stamp, 分别对应产品段配置的字段类型
*/
private String fieldType;
@Column(name = "field_type", length = 10)
public String getFieldType() {
return this.fieldType;
}
public void setFieldType(String fieldType) {
this.fieldType = fieldType;
super.addValidField("fieldType");
}
/**
* is_in_table
* 位于表格字段, 抽取内容是否位于表格内,若不确定可不填写
*/
private String isInTable;
@Column(name = "is_in_table", length = 1)
public String getIsInTable() {
return this.isInTable;
}
public void setIsInTable(String isInTable) {
this.isInTable = isInTable;
super.addValidField("isInTable");
}
/**
* keywords
* 关键字字段, 字符串数组, 可根据关键字信息,快速定位抽取信所在段落范围, 最多填写10个,且字符总长度不超过50 [array]
*/
private String keywords;
@Column(name = "keywords", length = 1073741824)
public String getKeywords() {
return this.keywords;
}
public void setKeywords(String keywords) {
this.keywords = keywords;
super.addValidField("keywords");
}
/**
* 合同类型
*/
private String contractType;
@Column(name = "contract_type", length = 100)
public String getContractType() {
return contractType;
}
public void setContractType(String contractType) {
this.contractType = contractType;
super.addValidField("contractType");
}
}
\ No newline at end of file
package cn.com.poc.covenant.model;
import cn.com.yict.framemax.data.model.BaseModelClass;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import javax.persistence.*;
import java.io.Serializable;
/**
* Model class for biz_extraction_review_task
* 合同审查任务
*/
@Entity
@Table(name = "biz_extraction_review_task")
@DynamicInsert
@DynamicUpdate
public class BizExtractionReviewTaskModel extends BaseModelClass implements Serializable {
private static final long serialVersionUID = 1L;
/** id
*
*/
private Integer id;
@Column(name = "id",length = 10)
@Id @GeneratedValue(strategy = GenerationType.AUTO)
public Integer getId(){
return this.id;
}
public void setId(Integer id){
this.id = id;
super.addValidField("id");
}
/** task_id
*审查任务
*/
private String taskId;
@Column(name = "task_id",length = 100)
public String getTaskId(){
return this.taskId;
}
public void setTaskId(String taskId){
this.taskId = taskId;
super.addValidField("taskId");
}
/** file_url
*文件地址
*/
private String fileUrl;
@Column(name = "file_url",length = 120)
public String getFileUrl(){
return this.fileUrl;
}
public void setFileUrl(String fileUrl){
this.fileUrl = fileUrl;
super.addValidField("fileUrl");
}
/** file_name
*文件名
*/
private String fileName;
@Column(name = "file_name",length = 100)
public String getFileName(){
return this.fileName;
}
public void setFileName(String fileName){
this.fileName = fileName;
super.addValidField("fileName");
}
/** actionType
*执行动作(审查,提取,对比)
*/
private String actionType;
@Column(name = "action_type",length = 100)
public String getActionType() {
return actionType;
}
public void setActionType(String actionType) {
this.actionType = actionType;
super.addValidField("actionType");
}
/** review_status
*审核状态 RUN-审核中 END-已完成 FAIL-审核失败
*/
private String reviewStatus;
@Column(name = "review_status",length = 10)
public String getReviewStatus(){
return this.reviewStatus;
}
public void setReviewStatus(String reviewStatus){
this.reviewStatus = reviewStatus;
super.addValidField("reviewStatus");
}
/** review_error_msg
*审核异常消息
*/
private String reviewErrorMsg;
@Column(name = "review_error_msg",length = 300)
public String getReviewErrorMsg(){
return this.reviewErrorMsg;
}
public void setReviewErrorMsg(String reviewErrorMsg){
this.reviewErrorMsg = reviewErrorMsg;
super.addValidField("reviewErrorMsg");
}
/** text_in_task_id
*textIn的task_id
*/
private String textInTaskId;
@Column(name = "text_in_task_id",length = 120)
public String getTextInTaskId(){
return this.textInTaskId;
}
public void setTextInTaskId(String textInTaskId){
this.textInTaskId = textInTaskId;
super.addValidField("textInTaskId");
}
/** contract_type
*合同类型
*/
private String contractType;
@Column(name = "contract_type",length = 100)
public String getContractType(){
return this.contractType;
}
public void setContractType(String contractType){
this.contractType = contractType;
super.addValidField("contractType");
}
/** is_deleted
*是否删除 1、Y 是 2、N 否
*/
private String isDeleted;
@Column(name = "is_deleted",length = 1)
public String getIsDeleted(){
return this.isDeleted;
}
public void setIsDeleted(String isDeleted){
this.isDeleted = isDeleted;
super.addValidField("isDeleted");
}
/** CREATOR
*创建人
*/
private String creator;
@Column(name = "CREATOR",length = 225)
public String getCreator(){
return this.creator;
}
public void setCreator(String creator){
this.creator = creator;
super.addValidField("creator");
}
/** CREATED_TIME
*创建时间
*/
private java.util.Date createdTime;
@Column(name = "CREATED_TIME",length = 19)
public java.util.Date getCreatedTime(){
return this.createdTime;
}
public void setCreatedTime(java.util.Date createdTime){
this.createdTime = createdTime;
super.addValidField("createdTime");
}
/** MODIFIER
*修改人
*/
private String modifier;
@Column(name = "MODIFIER",length = 225)
public String getModifier(){
return this.modifier;
}
public void setModifier(String modifier){
this.modifier = modifier;
super.addValidField("modifier");
}
/** MODIFIED_TIME
*修改时间
*/
private java.util.Date modifiedTime;
@Column(name = "MODIFIED_TIME",length = 19)
public java.util.Date getModifiedTime(){
return this.modifiedTime;
}
public void setModifiedTime(java.util.Date modifiedTime){
this.modifiedTime = modifiedTime;
super.addValidField("modifiedTime");
}
/** SYS_VERSION
*乐观锁,版本号
*/
private Integer sysVersion;
@Column(name = "SYS_VERSION",length = 10)
@Version
public Integer getSysVersion(){
return this.sysVersion;
}
public void setSysVersion(Integer sysVersion){
this.sysVersion = sysVersion;
super.addValidField("sysVersion");
}
}
\ No newline at end of file
package cn.com.poc.covenant.model;
import cn.com.yict.framemax.data.model.BaseModelClass;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import javax.persistence.*;
import java.io.Serializable;
/**
* Model class for biz_extreaction_contract_type
* 合同审查-合同类型
*/
@Entity
@Table(name = "biz_extreaction_contract_type")
@DynamicInsert
@DynamicUpdate
public class BizExtreactionContractTypeModel extends BaseModelClass implements Serializable {
private static final long serialVersionUID = 1L;
/** id
*
*/
private Integer id;
@Column(name = "id",length = 10)
@Id @GeneratedValue(strategy = GenerationType.AUTO)
public Integer getId(){
return this.id;
}
public void setId(Integer id){
this.id = id;
super.addValidField("id");
}
/** contract_code
*合同类型-代码
*/
private String contractCode;
@Column(name = "contract_code",length = 100)
public String getContractCode(){
return this.contractCode;
}
public void setContractCode(String contractCode){
this.contractCode = contractCode;
super.addValidField("contractCode");
}
/** contract_name
*合同类型名
*/
private String contractName;
@Column(name = "contract_name",length = 100)
public String getContractName(){
return this.contractName;
}
public void setContractName(String contractName){
this.contractName = contractName;
super.addValidField("contractName");
}
/** contract_type
*合同类型名
*/
private String contractType;
@Column(name = "contract_type",length = 100)
public String getContractType() {
return contractType;
}
public void setContractType(String contractType) {
this.contractType = contractType;
super.addValidField("contractType");
}
}
\ No newline at end of file
select id,
task_id,
file_url,
file_name,
action_type,
review_status,
review_error_msg,
text_in_task_id,
contract_type,
is_deleted,
CREATOR,
CREATED_TIME,
MODIFIER,
MODIFIED_TIME
from biz_extraction_review_task
where is_deleted = 'N' <<and task_id = :taskId>>
<<and LOCATE(:search,file_name)>> <<and action_type = :actionType>>
order by CREATED_TIME desc
\ No newline at end of file
package cn.com.poc.covenant.query;
import java.io.Serializable;
/**
* Query Condition class for ExtractionTaskQuery
*/
public class ExtractionTaskQueryCondition implements Serializable {
private static final long serialVersionUID = 1L;
private String taskId;
public String getTaskId() {
return taskId;
}
public void setTaskId(String taskId) {
this.taskId = taskId;
}
private String search;
public String getSearch() {
return this.search;
}
public void setSearch(String search) {
this.search = search;
}
private String actionType;
public String getActionType() {
return actionType;
}
public void setActionType(String actionType) {
this.actionType = actionType;
}
}
\ No newline at end of file
package cn.com.poc.covenant.query;
import cn.com.yict.framemax.data.model.BaseItemClass;
import javax.persistence.Column;
import javax.persistence.Entity;
import java.io.Serializable;
/**
* Query Item class for ExtractionTaskQuery
*/
@Entity
public class ExtractionTaskQueryItem extends BaseItemClass implements Serializable{
private static final long serialVersionUID = 1L;
/** id
*id
*/
private Integer id;
@Column(name = "id")
public Integer getId(){
return this.id;
}
public void setId(Integer id){
this.id = id;
}
/** task_id
*task_id
*/
private String taskId;
@Column(name = "task_id")
public String getTaskId(){
return this.taskId;
}
public void setTaskId(String taskId){
this.taskId = taskId;
}
/** file_url
*file_url
*/
private String fileUrl;
@Column(name = "file_url")
public String getFileUrl(){
return this.fileUrl;
}
public void setFileUrl(String fileUrl){
this.fileUrl = fileUrl;
}
/** file_name
*file_name
*/
private String fileName;
@Column(name = "file_name")
public String getFileName(){
return this.fileName;
}
public void setFileName(String fileName){
this.fileName = fileName;
}
/** actionType
*执行动作(审查,提取,对比)
*/
private String actionType;
@Column(name = "action_type",length = 100)
public String getActionType() {
return actionType;
}
public void setActionType(String actionType) {
this.actionType = actionType;
}
/** review_status
*review_status
*/
private String reviewStatus;
@Column(name = "review_status")
public String getReviewStatus(){
return this.reviewStatus;
}
public void setReviewStatus(String reviewStatus){
this.reviewStatus = reviewStatus;
}
/** review_error_msg
*review_error_msg
*/
private String reviewErrorMsg;
@Column(name = "review_error_msg")
public String getReviewErrorMsg(){
return this.reviewErrorMsg;
}
public void setReviewErrorMsg(String reviewErrorMsg){
this.reviewErrorMsg = reviewErrorMsg;
}
/** text_in_task_id
*text_in_task_id
*/
private String textInTaskId;
@Column(name = "text_in_task_id")
public String getTextInTaskId(){
return this.textInTaskId;
}
public void setTextInTaskId(String textInTaskId){
this.textInTaskId = textInTaskId;
}
/** contract_type
*contract_type
*/
private String contractType;
@Column(name = "contract_type")
public String getContractType(){
return this.contractType;
}
public void setContractType(String contractType){
this.contractType = contractType;
}
/** is_deleted
*is_deleted
*/
private String isDeleted;
@Column(name = "is_deleted")
public String getIsDeleted(){
return this.isDeleted;
}
public void setIsDeleted(String isDeleted){
this.isDeleted = isDeleted;
}
/** CREATOR
*CREATOR
*/
private String creator;
@Column(name = "CREATOR")
public String getCreator(){
return this.creator;
}
public void setCreator(String creator){
this.creator = creator;
}
/** CREATED_TIME
*CREATED_TIME
*/
private java.util.Date createdTime;
@Column(name = "CREATED_TIME")
public java.util.Date getCreatedTime(){
return this.createdTime;
}
public void setCreatedTime(java.util.Date createdTime){
this.createdTime = createdTime;
}
/** MODIFIER
*MODIFIER
*/
private String modifier;
@Column(name = "MODIFIER")
public String getModifier(){
return this.modifier;
}
public void setModifier(String modifier){
this.modifier = modifier;
}
/** MODIFIED_TIME
*MODIFIED_TIME
*/
private java.util.Date modifiedTime;
@Column(name = "MODIFIED_TIME")
public java.util.Date getModifiedTime(){
return this.modifiedTime;
}
public void setModifiedTime(java.util.Date modifiedTime){
this.modifiedTime = modifiedTime;
}
}
\ No newline at end of file
package cn.com.poc.covenant.repository;
import cn.com.poc.covenant.model.BizExtractionKeyInfoConfigModel;
import cn.com.yict.framemax.data.repository.Repository;
public interface BizExtractionKeyInfoConfigRepository extends Repository<BizExtractionKeyInfoConfigModel, Integer> {
}
\ No newline at end of file
package cn.com.poc.covenant.repository;
import cn.com.poc.covenant.model.BizExtractionReviewTaskModel;
import cn.com.yict.framemax.data.repository.Repository;
public interface BizExtractionReviewTaskRepository extends Repository<BizExtractionReviewTaskModel, Integer> {
}
\ No newline at end of file
package cn.com.poc.covenant.repository;
import cn.com.poc.covenant.model.BizExtreactionContractTypeModel;
import cn.com.yict.framemax.data.repository.Repository;
public interface BizExtreactionContractTypeRepository extends Repository<BizExtreactionContractTypeModel, Integer> {
}
\ No newline at end of file
package cn.com.poc.covenant.rest;
import cn.com.poc.covenant.dto.ExtractionDto;
import cn.com.poc.covenant.dto.ReviewProgressDto;
import cn.com.poc.covenant.dto.StartReviewDto;
import cn.com.poc.covenant.model.BizExtreactionContractTypeModel;
import cn.com.yict.framemax.core.rest.BaseRest;
import cn.com.yict.framemax.web.permission.Access;
import cn.com.yict.framemax.web.permission.Permission;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
/**
* 合同要素抽取服务
*
* @author alex.yao
* @date 2025/5/19
*/
@Permission(Access.Anonymous)
public interface ExtractionRest extends BaseRest {
/**
* 开始合同抽取
*/
String startExtract(@RequestBody StartReviewDto startReviewDto) throws Exception;
/**
* 开始合同审查
*/
String startReview(@RequestBody StartReviewDto startReviewDto) throws Exception;
/**
* 获取合同类型列表
*/
List<BizExtreactionContractTypeModel> getContractTypeList(@RequestParam String contractType) throws Exception;
/**
* 获取审核进度详情-列表
*/
List<ReviewProgressDto> reviewProgressList(@RequestParam String reviewTaskId, @RequestParam String search, @RequestParam String actionType);
/**
* 获取合同要素抽取结果
*
* @param taskId 任务ID
*/
ExtractionDto getResult(@RequestParam String taskId);
/**
* @param taskId 任务ID
* @return
*/
String getReviewUrl(@RequestParam String taskId) throws Exception;
}
package cn.com.poc.covenant.rest;
import cn.com.yict.framemax.core.rest.BaseRest;
import cn.com.yict.framemax.web.permission.Access;
import cn.com.yict.framemax.web.permission.Permission;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
/**
* 合同对比服务接口
*
* @author alex.yao
* @date 2025/6/25
*/
@Permission(Access.Anonymous)
public interface TextDiffRest extends BaseRest {
/**
* 文本对比
*
* @param baseFile 主版文件
* @param compareFile 副版文件
* @return 任务ID
*/
String textDiff(@RequestParam MultipartFile baseFile, @RequestParam MultipartFile compareFile);
/**
* 文本对比
*
* @param baseFileUrl 主版文件URL
* @param compareFileUrl 副版文件URL
* @return 任务ID
*/
String textDiffByUrl(@RequestParam String baseFileUrl, @RequestParam String compareFileUrl);
/**
* 获取前端SDK渲染地址
*
* @param taskId 任务ID
* @return 渲染地址
*/
String getRenderUrl(@RequestParam String taskId);
/**
* 查询任务状态
*/
String queryTextDiffTask(@RequestParam String taskId);
}
package cn.com.poc.covenant.rest.impl;
import cn.com.poc.common.constant.CommonConstant;
import cn.com.poc.common.model.BizFileUploadRecordModel;
import cn.com.poc.common.service.BizFileUploadRecordService;
import cn.com.poc.common.utils.DocumentLoad;
import cn.com.poc.common.utils.UUIDTool;
import cn.com.poc.covenant.constants.ContractConstants;
import cn.com.poc.covenant.dto.ExtractionDto;
import cn.com.poc.covenant.dto.ReviewProgressDto;
import cn.com.poc.covenant.dto.StartReviewDto;
import cn.com.poc.covenant.model.BizExtractionKeyInfoConfigModel;
import cn.com.poc.covenant.model.BizExtractionReviewTaskModel;
import cn.com.poc.covenant.model.BizExtreactionContractTypeModel;
import cn.com.poc.covenant.query.ExtractionTaskQueryCondition;
import cn.com.poc.covenant.query.ExtractionTaskQueryItem;
import cn.com.poc.covenant.rest.ExtractionRest;
import cn.com.poc.covenant.service.BizExtractionKeyInfoConfigService;
import cn.com.poc.covenant.service.BizExtractionReviewTaskService;
import cn.com.poc.covenant.service.BizExtreactionContractTypeService;
import cn.com.poc.thirdparty.resource.baidu.api.BaiduTokenAPI;
import cn.com.poc.thirdparty.resource.baidu.api.TextReviewApi;
import cn.com.poc.thirdparty.resource.baidu.entity.response.TextReviewSubmitResponse;
import cn.com.poc.thirdparty.resource.baidu.entity.result.TextReviewRequest;
import cn.com.poc.thirdparty.resource.text_in.api.TextInClient;
import cn.com.poc.thirdparty.resource.text_in.entity.extraction.entity.ExtractionResult;
import cn.com.poc.thirdparty.resource.text_in.entity.extraction.entity.KeyInfo;
import cn.com.yict.framemax.core.exception.BusinessException;
import cn.com.yict.framemax.frame.service.FmxParamConfigService;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.json.JSONArray;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;
import javax.annotation.Resource;
import java.io.*;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
/**
* @author alex.yao
* @date 2025/5/19
*/
@Component
public class ExtractionRestImpl implements ExtractionRest {
private final TextInClient textInClient = new TextInClient();
@Resource
private BizExtractionKeyInfoConfigService bizExtractionKeyInfoConfigService;
@Resource
private BizExtractionReviewTaskService bizExtractionReviewTaskService;
@Resource
private BizExtreactionContractTypeService bizExtreactionContractTypeService;
@Resource
private BizFileUploadRecordService bizFileUploadRecordService;
@Resource
private TextReviewApi textReviewApi;
@Resource
private FmxParamConfigService fmxConfigService;
@Resource
private BaiduTokenAPI baiduTokenAPI;
@Override
public String startExtract(StartReviewDto startReviewDto) throws Exception {
Assert.notNull(startReviewDto.getContractType());
Assert.notEmpty(startReviewDto.getFileUrls());
String taskId = UUIDTool.getUUID();
// 保存任务信息
List<BizExtractionReviewTaskModel> bizExtractionReviewTaskModels = new ArrayList<>();
for (String fileUrl : startReviewDto.getFileUrls()) {
String textInTaskId = createExtractTask(fileUrl, startReviewDto.getContractType());
BizFileUploadRecordModel bizFileUploadRecordModel = new BizFileUploadRecordModel();
bizFileUploadRecordModel.setFileUrl(fileUrl);
List<BizFileUploadRecordModel> models = bizFileUploadRecordService.findByExample(bizFileUploadRecordModel, null);
BizExtractionReviewTaskModel bizExtractionReviewTaskModel = new BizExtractionReviewTaskModel();
if (CollectionUtils.isNotEmpty(models)) {
bizExtractionReviewTaskModel.setFileName(models.get(0).getFileName());
} else {
bizExtractionReviewTaskModel.setFileName(getFileName(fileUrl));
}
bizExtractionReviewTaskModel.setTaskId(taskId);
bizExtractionReviewTaskModel.setFileUrl(fileUrl);
bizExtractionReviewTaskModel.setActionType(ContractConstants.ActionType.extract);
bizExtractionReviewTaskModel.setReviewStatus("RUN");
bizExtractionReviewTaskModel.setReviewErrorMsg(null);
bizExtractionReviewTaskModel.setTextInTaskId(textInTaskId);
bizExtractionReviewTaskModel.setContractType(startReviewDto.getContractType());
bizExtractionReviewTaskModels.add(bizExtractionReviewTaskModel);
}
bizExtractionReviewTaskService.saveAll(bizExtractionReviewTaskModels);
return taskId;
}
@Override
public String startReview(StartReviewDto startReviewDto) throws Exception {
Assert.notNull(startReviewDto.getContractType());
String taskId = UUIDTool.getUUID();
// 保存任务信息
if (CollectionUtils.isEmpty(startReviewDto.getFileUrls())) {
throw new BusinessException("请上传文件");
}
String fileUrl = startReviewDto.getFileUrls().get(0);
// File c = File.createTempFile(UUIDTool.getUUID(), "." + getFileSuffix(fileUrl));
//下载bos
URL url = new URL(fileUrl);
File tempAudioFile = DocumentLoad.downloadURLDocument(url.getPath());
// inputstreamtofile(download, tempAudioFile);
List<BizExtractionReviewTaskModel> bizExtractionReviewTaskModels = new ArrayList<>();
TextReviewSubmitResponse textReviewSubmitResponse = createReviewTask(tempAudioFile, startReviewDto.getContractType());
if (textReviewSubmitResponse == null || !"0".equals(textReviewSubmitResponse.getError_code())) {
throw new BusinessException("上传异常,请稍后重试");
}
BizFileUploadRecordModel bizFileUploadRecordModel = new BizFileUploadRecordModel();
bizFileUploadRecordModel.setFileUrl(fileUrl);
List<BizFileUploadRecordModel> models = bizFileUploadRecordService.findByExample(bizFileUploadRecordModel, null);
BizExtractionReviewTaskModel bizExtractionReviewTaskModel = new BizExtractionReviewTaskModel();
if (CollectionUtils.isNotEmpty(models)) {
bizExtractionReviewTaskModel.setFileName(models.get(0).getFileName());
} else {
bizExtractionReviewTaskModel.setFileName(getFileName(fileUrl));
}
bizExtractionReviewTaskModel.setTaskId(taskId);
bizExtractionReviewTaskModel.setFileUrl(fileUrl);
bizExtractionReviewTaskModel.setActionType(ContractConstants.ActionType.textreview);
bizExtractionReviewTaskModel.setReviewStatus("RUN");
bizExtractionReviewTaskModel.setReviewErrorMsg(null);
bizExtractionReviewTaskModel.setTextInTaskId(textReviewSubmitResponse.getResult().getTaskId());
bizExtractionReviewTaskModel.setContractType(startReviewDto.getContractType());
bizExtractionReviewTaskModels.add(bizExtractionReviewTaskModel);
bizExtractionReviewTaskService.saveAll(bizExtractionReviewTaskModels);
return taskId;
}
private TextReviewSubmitResponse createReviewTask(File file, String contractType) throws IOException {
TextReviewRequest textReviewRequest = new TextReviewRequest();
textReviewRequest.setFile(file);
textReviewRequest.setTemplateName(contractType);
textReviewRequest.setCommentRiskLevel("all");
String clientId = fmxConfigService.getParam("baidu.textmind.clientId");
String clientSecret = fmxConfigService.getParam("baidu.textmind.clientSecret");
return textReviewApi.textReview(textReviewRequest, baiduTokenAPI.getToken(clientId, clientSecret).getAccess_token());
}
@Override
public List<BizExtreactionContractTypeModel> getContractTypeList(String contractType) throws Exception {
Assert.notNull(contractType);
BizExtreactionContractTypeModel bizExtreactionContractTypeModel = new BizExtreactionContractTypeModel();
bizExtreactionContractTypeModel.setContractType(contractType);
List<BizExtreactionContractTypeModel> models = bizExtreactionContractTypeService.findByExample(bizExtreactionContractTypeModel, null);
return models;
}
@Override
public List<ReviewProgressDto> reviewProgressList(String reviewTaskId, String search, String actionType) {
Assert.notNull(reviewTaskId);
ExtractionTaskQueryCondition condition = new ExtractionTaskQueryCondition();
condition.setTaskId(reviewTaskId);
condition.setSearch(search);
condition.setActionType(actionType);
List<ExtractionTaskQueryItem> extractionTaskQueryItems = bizExtractionReviewTaskService.extractionTaskQuery(condition, null);
List<ReviewProgressDto> reviewProgressDtos = new ArrayList<>();
if (CollectionUtils.isNotEmpty(extractionTaskQueryItems)) {
for (ExtractionTaskQueryItem extractionTaskQueryItem : extractionTaskQueryItems) {
reviewProgressDtos.add(itemConvertDto(extractionTaskQueryItem));
}
}
return reviewProgressDtos;
}
@Override
public ExtractionDto getResult(String taskId) {
ExtractionResult extractionResult = textInClient.extractedResults(taskId);
ExtractionDto result = new ExtractionDto();
if (extractionResult.getCode().equals(209L)) {
result.setStatus(0);
result.setResult(null);
} else if (extractionResult.getCode().equals(200L)) {
result.setStatus(1);
result.setResult(extractionResult.getResult());
} else {
result.setStatus(-1);
result.setResult(null);
}
return result;
}
private ReviewProgressDto itemConvertDto(ExtractionTaskQueryItem extractionTaskQueryItem) {
ReviewProgressDto reviewProgressDto = new ReviewProgressDto();
reviewProgressDto.setReviewDate(extractionTaskQueryItem.getCreatedTime());
reviewProgressDto.setTextInTaskId(extractionTaskQueryItem.getTextInTaskId());
reviewProgressDto.setReviewTaskId(extractionTaskQueryItem.getTaskId());
reviewProgressDto.setFileName(extractionTaskQueryItem.getFileName());
reviewProgressDto.setFileUrl(extractionTaskQueryItem.getFileUrl());
reviewProgressDto.setReviewStatus(extractionTaskQueryItem.getReviewStatus());
return reviewProgressDto;
}
/**
* 创建 TextIn 合同审核任务
*
* @param fileUrl 文件地址
* @param contractType 合同类型
* @return textId_task_id
*/
private String createExtractTask(String fileUrl, String contractType) {
List<KeyInfo> keyInfoList = new ArrayList<>();
BizExtractionKeyInfoConfigModel model = new BizExtractionKeyInfoConfigModel();
model.setContractType(contractType);
List<BizExtractionKeyInfoConfigModel> bizExtractionKeyInfoConfigModels = bizExtractionKeyInfoConfigService.findByExample(model, null);
if (CollectionUtils.isNotEmpty(bizExtractionKeyInfoConfigModels)) {
for (BizExtractionKeyInfoConfigModel bizExtractionKeyInfoConfigModel : bizExtractionKeyInfoConfigModels) {
KeyInfo keyInfo = new KeyInfo();
keyInfo.setKey_info(bizExtractionKeyInfoConfigModel.getKeyInfo());
if (StringUtils.isNoneBlank(bizExtractionKeyInfoConfigModel.getParaphraseNames())) {
JSONArray jsonArray = new JSONArray(bizExtractionKeyInfoConfigModel.getParaphraseNames());
if (!jsonArray.isEmpty()) {
keyInfo.setParaphrase_names(jsonArray.toList().toArray(new String[0]));
}
}
if (StringUtils.isNoneBlank(bizExtractionKeyInfoConfigModel.getFieldType())) {
keyInfo.setField_type(bizExtractionKeyInfoConfigModel.getFieldType());
}
if (StringUtils.isNoneBlank(bizExtractionKeyInfoConfigModel.getIsInTable())) {
keyInfo.setIs_in_table(CommonConstant.YOrN.Y.equals(bizExtractionKeyInfoConfigModel.getIsInTable()));
}
if (StringUtils.isNotBlank(bizExtractionKeyInfoConfigModel.getKeywords())) {
JSONArray jsonArray = new JSONArray(bizExtractionKeyInfoConfigModel.getKeywords());
if (!jsonArray.isEmpty()) {
keyInfo.setKeywords(jsonArray.toList().toArray(new String[0]));
}
}
keyInfoList.add(keyInfo);
}
}
return textInClient.extraction(fileUrl, keyInfoList);
}
/**
* 获取文件名
*
* @param fileUrl
* @return
*/
private String getFileName(String fileUrl) {
int i = fileUrl.lastIndexOf("/");
return fileUrl.substring(i + 1);
}
@Override
public String getReviewUrl(String taskId) throws Exception {
Assert.notNull(taskId);
BizExtractionReviewTaskModel example = new BizExtractionReviewTaskModel();
example.setActionType(ContractConstants.ActionType.textreview);
example.setTaskId(taskId);
List<BizExtractionReviewTaskModel> bizExtractionReviewTaskModelList = bizExtractionReviewTaskService.findByExample(example, null);
if (CollectionUtils.isEmpty(bizExtractionReviewTaskModelList)) {
return StringUtils.EMPTY;
}
String originUrl = "https://textmind-sdk.bce.baidu.com/textmind/sdk/textreview/{taskId}?access_token={access_token}";
String clientId = fmxConfigService.getParam("baidu.textmind.clientId");
String clientSecret = fmxConfigService.getParam("baidu.textmind.clientSecret");
String accessToken = baiduTokenAPI.getToken(clientId, clientSecret).getAccess_token();
return originUrl.replaceAll("\\{taskId}", bizExtractionReviewTaskModelList.get(0).getTextInTaskId()).replaceAll("\\{access_token}", accessToken);
}
public void inputstreamtofile(InputStream ins, File file) throws IOException {
OutputStream os = new FileOutputStream(file);
int bytesRead;
byte[] buffer = new byte[8192];
while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
os.write(buffer, 0, bytesRead);
}
os.close();
ins.close();
}
// 提取文件后缀名
private static String getFileSuffix(String fileName) {
if (fileName.lastIndexOf('.') != -1 && fileName.lastIndexOf('/') != fileName.length() - 1) {
return fileName.substring(fileName.lastIndexOf('.') + 1);
}
return "";
}
}
\ No newline at end of file
package cn.com.poc.covenant.rest.impl;
import cn.com.poc.common.utils.Assert;
import cn.com.poc.common.utils.FileUtils;
import cn.com.poc.covenant.rest.TextDiffRest;
import cn.com.poc.thirdparty.resource.baidu.entity.response.text_diff.BaiduTextDiffQueryResult;
import cn.com.poc.thirdparty.resource.baidu.service.BaiduTextDiffService;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
/**
* @author alex.yao
* @date 2025/6/25
*/
@Component
public class TextDiffRestImpl implements TextDiffRest {
@Resource
private BaiduTextDiffService baiduTextDiffService;
@Override
public String textDiff(MultipartFile baseFile, MultipartFile compareFile) {
Assert.notNull(baseFile, "Base file cannot be null");
Assert.notNull(compareFile, "Compare file cannot be null");
return baiduTextDiffService.textDiff(baseFile, compareFile, null);
}
@Override
public String textDiffByUrl(String baseFileUrl, String compareFileUrl) {
Assert.notNull(baseFileUrl, "Base file cannot be null");
Assert.notNull(compareFileUrl, "Compare file cannot be null");
return baiduTextDiffService.textDiff(baseFileUrl, compareFileUrl, null);
}
@Override
public String getRenderUrl(String taskId) {
Assert.notBlank(taskId, "Task ID cannot be blank");
return baiduTextDiffService.getSDKUrl(taskId);
}
@Override
public String queryTextDiffTask(String taskId) {
Assert.notBlank(taskId, "Task ID cannot be blank");
BaiduTextDiffQueryResult baiduTextDiffQueryResult = baiduTextDiffService.queryTextDiffTask(taskId);
return baiduTextDiffQueryResult.getResult().getStatus();
}
}
package cn.com.poc.covenant.scheduler;
import cn.com.poc.common.constant.CommonConstant;
import cn.com.poc.covenant.constants.ContractConstants;
import cn.com.poc.covenant.model.BizExtractionReviewTaskModel;
import cn.com.poc.covenant.service.BizExtractionReviewTaskService;
import cn.com.poc.thirdparty.resource.baidu.api.BaiduTokenAPI;
import cn.com.poc.thirdparty.resource.baidu.api.TextReviewApi;
import cn.com.poc.thirdparty.resource.baidu.entity.response.TextReviewResultQueryResponse;
import cn.com.poc.thirdparty.resource.text_in.api.TextInClient;
import cn.com.poc.thirdparty.resource.text_in.entity.extraction.entity.ExtractionResult;
import cn.com.yict.framemax.frame.service.FmxParamConfigService;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.List;
/**
* @author alex.yao
* @date 2025/5/21
*/
@Component
public class ExtractionReviewScheduler {
private final TextInClient textInClient = new TextInClient();
@Resource
private BizExtractionReviewTaskService bizExtractionReviewTaskService;
@Resource
private TextReviewApi textReviewApi;
@Resource
private FmxParamConfigService fmxConfigService;
@Resource
private BaiduTokenAPI baiduTokenAPI;
@Scheduled(cron = "0 0/1 * * * ?")
public void extraction() throws Exception {
// 执行任务
BizExtractionReviewTaskModel bizExtractionReviewTaskModel = new BizExtractionReviewTaskModel();
bizExtractionReviewTaskModel.setReviewStatus("RUN");
bizExtractionReviewTaskModel.setActionType(ContractConstants.ActionType.extract);
bizExtractionReviewTaskModel.setIsDeleted(CommonConstant.IsDeleted.N);
List<BizExtractionReviewTaskModel> models = bizExtractionReviewTaskService.findByExample(bizExtractionReviewTaskModel, null);
if (CollectionUtils.isNotEmpty(models)) {
for (BizExtractionReviewTaskModel model : models) {
String textInTaskId = model.getTextInTaskId();
ExtractionResult extractionResult = textInClient.extractedResults(textInTaskId);
if (extractionResult == null) {
model.setReviewStatus("ERROR");
} else if (extractionResult.getCode().equals(209L)) {
model.setReviewStatus("RUN");
} else if (extractionResult.getCode().equals(200L)) {
model.setReviewStatus("END");
} else {
model.setReviewStatus("ERROR");
model.setReviewErrorMsg(extractionResult.getMsg());
}
}
bizExtractionReviewTaskService.saveAll(models);
}
}
@Scheduled(cron = "0 0/1 * * * ?")
public void textReviewTaskQuery() throws Exception {
// 执行任务
BizExtractionReviewTaskModel bizExtractionReviewTaskModel = new BizExtractionReviewTaskModel();
bizExtractionReviewTaskModel.setReviewStatus("RUN");
bizExtractionReviewTaskModel.setActionType(ContractConstants.ActionType.textreview);
bizExtractionReviewTaskModel.setIsDeleted(CommonConstant.IsDeleted.N);
List<BizExtractionReviewTaskModel> models = bizExtractionReviewTaskService.findByExample(bizExtractionReviewTaskModel, null);
if (CollectionUtils.isNotEmpty(models)) {
String clientId = fmxConfigService.getParam("baidu.textmind.clientId");
String clientSecret = fmxConfigService.getParam("baidu.textmind.clientSecret");
String accessToken = baiduTokenAPI.getToken(clientId, clientSecret).getAccess_token();
for (BizExtractionReviewTaskModel model : models) {
String textInTaskId = model.getTextInTaskId();
TextReviewResultQueryResponse textReviewResponse = textReviewApi.textReviewTaskQuery(textInTaskId, accessToken);
if (textReviewResponse == null) {
model.setReviewStatus("ERROR");
} else if ("0".equals(textReviewResponse.getError_code())) {
if (textReviewResponse.getResult() != null && "success".equals(textReviewResponse.getResult().getStatus())) {
model.setReviewStatus("END");
}
} else {
model.setReviewStatus("ERROR");
}
}
bizExtractionReviewTaskService.saveAll(models);
}
}
}
package cn.com.poc.covenant.service;
import cn.com.poc.covenant.model.BizExtractionKeyInfoConfigModel;
import cn.com.yict.framemax.core.service.BaseService;
import cn.com.yict.framemax.data.model.PagingInfo;
import java.util.Collection;
import java.util.List;
public interface BizExtractionKeyInfoConfigService extends BaseService {
BizExtractionKeyInfoConfigModel get(Integer id) throws Exception;
List<BizExtractionKeyInfoConfigModel> findByExample(BizExtractionKeyInfoConfigModel example,PagingInfo pagingInfo) ;
void delete(BizExtractionKeyInfoConfigModel model) throws Exception;
void deleteById(Integer id) throws Exception;
void deleteAll(Collection<Integer> ids) throws Exception;
BizExtractionKeyInfoConfigModel save(BizExtractionKeyInfoConfigModel model) throws Exception;
Collection<BizExtractionKeyInfoConfigModel> saveAll(Collection<BizExtractionKeyInfoConfigModel> models) throws Exception;
}
\ No newline at end of file
package cn.com.poc.covenant.service;
import cn.com.poc.covenant.model.BizExtractionReviewTaskModel;
import cn.com.poc.covenant.query.ExtractionTaskQueryCondition;
import cn.com.poc.covenant.query.ExtractionTaskQueryItem;
import cn.com.yict.framemax.core.service.BaseService;
import cn.com.yict.framemax.data.model.PagingInfo;
import java.util.Collection;
import java.util.List;
public interface BizExtractionReviewTaskService extends BaseService {
BizExtractionReviewTaskModel get(Integer id) throws Exception;
List<BizExtractionReviewTaskModel> findByExample(BizExtractionReviewTaskModel example, PagingInfo pagingInfo) throws Exception;
void delete(BizExtractionReviewTaskModel model) throws Exception;
void deleteById(Integer id) throws Exception;
void deleteAll(Collection<Integer> ids) throws Exception;
BizExtractionReviewTaskModel save(BizExtractionReviewTaskModel model) throws Exception;
Collection<BizExtractionReviewTaskModel> saveAll(Collection<BizExtractionReviewTaskModel> models) throws Exception;
List<ExtractionTaskQueryItem> extractionTaskQuery(ExtractionTaskQueryCondition condition, PagingInfo pagingInfo);
}
\ No newline at end of file
package cn.com.poc.covenant.service;
import cn.com.poc.covenant.model.BizExtreactionContractTypeModel;
import cn.com.yict.framemax.core.service.BaseService;
import cn.com.yict.framemax.data.model.PagingInfo;
import java.util.Collection;
import java.util.List;
public interface BizExtreactionContractTypeService extends BaseService {
BizExtreactionContractTypeModel get(Integer id) throws Exception;
List<BizExtreactionContractTypeModel> findByExample(BizExtreactionContractTypeModel example,PagingInfo pagingInfo) throws Exception;
void delete(BizExtreactionContractTypeModel model) throws Exception;
void deleteById(Integer id) throws Exception;
void deleteAll(Collection<Integer> ids) throws Exception;
BizExtreactionContractTypeModel save(BizExtreactionContractTypeModel model) throws Exception;
Collection<BizExtreactionContractTypeModel> saveAll(Collection<BizExtreactionContractTypeModel> models) throws Exception;
}
\ No newline at end of file
package cn.com.poc.covenant.service.impl;
import cn.com.poc.covenant.model.BizExtractionKeyInfoConfigModel;
import cn.com.poc.covenant.repository.BizExtractionKeyInfoConfigRepository;
import cn.com.poc.covenant.service.BizExtractionKeyInfoConfigService;
import cn.com.yict.framemax.core.service.impl.BaseServiceImpl;
import cn.com.yict.framemax.data.model.PagingInfo;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Collection;
import java.util.List;
@Service
public class BizExtractionKeyInfoConfigServiceImpl extends BaseServiceImpl
implements BizExtractionKeyInfoConfigService {
@Resource
private BizExtractionKeyInfoConfigRepository repository;
public BizExtractionKeyInfoConfigModel get(Integer id) throws Exception{
return this.repository.get(id);
}
public List<BizExtractionKeyInfoConfigModel> findByExample(BizExtractionKeyInfoConfigModel example,PagingInfo pagingInfo) {
if(example == null){
example = new BizExtractionKeyInfoConfigModel();
}
return this.repository.findByExample(example,pagingInfo);
}
public void delete(BizExtractionKeyInfoConfigModel model) throws Exception{
this.repository.remove(model);
}
public void deleteById(Integer id) throws Exception{
this.repository.removeByPk(id);
}
public void deleteAll(Collection<Integer> ids) throws Exception{
this.repository.removeAllByPk(ids);
}
public BizExtractionKeyInfoConfigModel save(BizExtractionKeyInfoConfigModel model) throws Exception{
return this.repository.save(model);
}
public Collection<BizExtractionKeyInfoConfigModel> saveAll(Collection<BizExtractionKeyInfoConfigModel> models) throws Exception{
return this.repository.saveAll(models);
}
}
\ No newline at end of file
package cn.com.poc.covenant.service.impl;
import cn.com.poc.covenant.model.BizExtractionReviewTaskModel;
import cn.com.poc.covenant.query.ExtractionTaskQueryCondition;
import cn.com.poc.covenant.query.ExtractionTaskQueryItem;
import cn.com.poc.covenant.repository.BizExtractionReviewTaskRepository;
import cn.com.poc.covenant.service.BizExtractionReviewTaskService;
import cn.com.yict.framemax.core.service.impl.BaseServiceImpl;
import cn.com.yict.framemax.data.model.PagingInfo;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Collection;
import java.util.List;
@Service
public class BizExtractionReviewTaskServiceImpl extends BaseServiceImpl
implements BizExtractionReviewTaskService {
@Resource
private BizExtractionReviewTaskRepository repository;
public BizExtractionReviewTaskModel get(Integer id) throws Exception {
return this.repository.get(id);
}
public List<BizExtractionReviewTaskModel> findByExample(BizExtractionReviewTaskModel example, PagingInfo pagingInfo) throws Exception {
if (example == null) {
example = new BizExtractionReviewTaskModel();
}
return this.repository.findByExample(example, pagingInfo);
}
public void delete(BizExtractionReviewTaskModel model) throws Exception {
this.repository.remove(model);
}
public void deleteById(Integer id) throws Exception {
this.repository.removeByPk(id);
}
public void deleteAll(Collection<Integer> ids) throws Exception {
this.repository.removeAllByPk(ids);
}
public BizExtractionReviewTaskModel save(BizExtractionReviewTaskModel model) throws Exception {
return this.repository.save(model);
}
public Collection<BizExtractionReviewTaskModel> saveAll(Collection<BizExtractionReviewTaskModel> models) throws Exception {
return this.repository.saveAll(models);
}
@Override
public List<ExtractionTaskQueryItem> extractionTaskQuery(ExtractionTaskQueryCondition condition, PagingInfo pagingInfo) {
return this.sqlDao.query(condition, ExtractionTaskQueryItem.class, pagingInfo);
}
}
\ No newline at end of file
package cn.com.poc.covenant.service.impl;
import cn.com.poc.covenant.model.BizExtreactionContractTypeModel;
import cn.com.poc.covenant.repository.BizExtreactionContractTypeRepository;
import cn.com.poc.covenant.service.BizExtreactionContractTypeService;
import cn.com.yict.framemax.core.service.impl.BaseServiceImpl;
import cn.com.yict.framemax.data.model.PagingInfo;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Collection;
import java.util.List;
@Service
public class BizExtreactionContractTypeServiceImpl extends BaseServiceImpl
implements BizExtreactionContractTypeService {
@Resource
private BizExtreactionContractTypeRepository repository;
public BizExtreactionContractTypeModel get(Integer id) throws Exception{
return this.repository.get(id);
}
public List<BizExtreactionContractTypeModel> findByExample(BizExtreactionContractTypeModel example,PagingInfo pagingInfo) throws Exception{
if(example == null){
example = new BizExtreactionContractTypeModel();
}
return this.repository.findByExample(example,pagingInfo);
}
public void delete(BizExtreactionContractTypeModel model) throws Exception{
this.repository.remove(model);
}
public void deleteById(Integer id) throws Exception{
this.repository.removeByPk(id);
}
public void deleteAll(Collection<Integer> ids) throws Exception{
this.repository.removeAllByPk(ids);
}
public BizExtreactionContractTypeModel save(BizExtreactionContractTypeModel model) throws Exception{
return this.repository.save(model);
}
public Collection<BizExtreactionContractTypeModel> saveAll(Collection<BizExtreactionContractTypeModel> models) throws Exception{
return this.repository.saveAll(models);
}
}
\ No newline at end of file
......@@ -20,4 +20,6 @@ public interface BaiduBaseApi {
Header acceptHeader = new BasicHeader(HttpHeaders.ACCEPT, ContentType.APPLICATION_JSON.toString());
Header formUrlEncodeHeader = new BasicHeader(HttpHeaders.CONTENT_TYPE, ContentType.APPLICATION_FORM_URLENCODED.withCharset("utf-8").toString());
Header multipartFormDataHeader = new BasicHeader(HttpHeaders.CONTENT_TYPE, ContentType.MULTIPART_FORM_DATA.toString());
}
package cn.com.poc.thirdparty.resource.baidu.api;
import cn.com.poc.common.utils.StringUtils;
import cn.com.poc.thirdparty.resource.baidu.entity.response.BaiduTextDiffResponse;
import cn.com.poc.thirdparty.resource.baidu.entity.response.text_diff.BaiduTextDiffQueryResult;
import cn.com.poc.thirdparty.resource.baidu.entity.result.BaiduTextDiffResult;
import cn.com.yict.framemax.core.exception.BusinessException;
import com.google.gson.Gson;
import okhttp3.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;
import java.io.IOException;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
/**
* 百度文档对比API
*
* @author alex.yao
* @desc 接口描述
* 文档比对支持精准比对文档的增删改差异,快速定位并高亮显示差异原文,支持导出完整的比对报告,大幅提升比对准确性和效率。
* 如希望快速可视化体验效果,可登录智能文档分析平台,一键上传文档,在线测试;在线工具和API服务的额度共享互通。
* 文档比对API服务为异步接口,需要先调用提交请求接口获取 taskID,
* 然后调用获取结果接口进行结果轮询,建议提交请求后5~10秒开始轮询。提交请求接口QPS为2,获取结果接口QPS为10。
* @url https://cloud.baidu.com/doc/OCR/s/Glqd7jgmf
* @date 2025/6/25
*/
@Component
public class BaiduTextDiffApi implements BaiduBaseApi {
private final Logger logger = LoggerFactory.getLogger(BaiduTextDiffApi.class);
public final OkHttpClient HTTP_CLIENT = new OkHttpClient().newBuilder().readTimeout(300, TimeUnit.SECONDS).build();
/**
* 提交请求接口
* <p>
* https://aip.baidubce.com/file/2.0/brain/online/v1/textdiff/create_task
*/
public BaiduTextDiffResult textDiff(BaiduTextDiffResponse response, String token) {
Assert.notNull(response);
Assert.notNull(token);
String url = BASE_API + "file/2.0/brain/online/v1/textdiff/create_task?access_token=" + token;
MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM);
try {
if (StringUtils.isNotBlank(response.getBaseFileURL())) {
builder = builder
.addFormDataPart("baseFileURL", response.getBaseFileURL())
.addFormDataPart("compareFileURL", response.getCompareFileURL());
} else {
RequestBody baseFile = RequestBody.create(MediaType.parse(Objects.requireNonNull(response.getBaseFile().getContentType())), response.getBaseFile().getBytes());
RequestBody compareFile = RequestBody.create(MediaType.parse(Objects.requireNonNull(response.getCompareFile().getContentType())), response.getCompareFile().getBytes());
builder = builder.addFormDataPart("baseFile", response.getBaseFile().getOriginalFilename(), baseFile)
.addFormDataPart("compareFile", response.getCompareFile().getOriginalFilename(), compareFile);
}
MultipartBody body = builder.build();
Request request = new Request.Builder()
.url(url)
.method("POST", body)
.addHeader("Content-Type", "multipart/form-data")
.build();
String result = Objects.requireNonNull(HTTP_CLIENT.newCall(request).execute().body()).string();
Gson gson = new Gson();
return gson.fromJson(result, BaiduTextDiffResult.class);
} catch (IOException e) {
logger.error("百度文本对比接口调用失败", e);
throw new BusinessException("百度文本对比接口调用失败");
}
}
/**
* 获取结果接口
* https://aip.baidubce.com/file/2.0/brain/online/v1/textdiff/query_task
*/
public BaiduTextDiffQueryResult queryTask(String taskId, String token) {
Assert.notNull(taskId);
MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM);
builder.addFormDataPart("taskId", taskId);
MultipartBody body = builder.build();
Request request = new Request.Builder()
.url(BASE_API + "file/2.0/brain/online/v1/textdiff/query_task?access_token=" + token)
.method("POST", body)
.addHeader("Content-Type", "multipart/form-data")
.build();
try {
String result = Objects.requireNonNull(HTTP_CLIENT.newCall(request).execute().body()).string();
Gson gson = new Gson();
return gson.fromJson(result, BaiduTextDiffQueryResult.class);
} catch (IOException e) {
logger.error("查询文本对比任务失败", e);
throw new BusinessException("查询文本对比任务失败");
}
}
}
......@@ -19,8 +19,8 @@ public class BaiduTokenAPI implements BaiduBaseApi {
Assert.notNull(secretKey);
HttpUriRequest httpUriRequest = RequestBuilder.post()
.setUri(BASE_API + "oauth/2.0/token")
.setHeader(jsonHeader)
.setHeader(acceptHeader)
.addHeader(jsonHeader)
.addHeader(acceptHeader)
.addParameter("grant_type", "client_credentials")
.addParameter("client_id",apiKey )
.addParameter("client_secret", secretKey)
......
package cn.com.poc.thirdparty.resource.baidu.api;
import cn.com.poc.thirdparty.resource.baidu.entity.response.TextReviewSubmitResponse;
import cn.com.poc.thirdparty.resource.baidu.entity.response.TextReviewResultQueryResponse;
import cn.com.poc.thirdparty.resource.baidu.entity.result.TextReviewRequest;
import com.google.gson.Gson;
import okhttp3.*;
import org.springframework.stereotype.Component;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
/**
* @author alex.yao
* @date 2025/5/21
*/
@Component
public class TextReviewApi {
// https://aip.baidubce.com/file/2.0/brain/online/v1/textreview/task
public static final OkHttpClient HTTP_CLIENT = new OkHttpClient().newBuilder().readTimeout(300, TimeUnit.SECONDS).build();
public TextReviewSubmitResponse textReview(TextReviewRequest textReviewRequest, String token) throws IOException {
File file = textReviewRequest.getFile();
RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM)
.addFormDataPart("file", file.getName(), RequestBody.create(null, file))
.addFormDataPart("templateName", textReviewRequest.getTemplateName())
.addFormDataPart("commentRiskLevel", textReviewRequest.getCommentRiskLevel())
.build();
Request request = new Request.Builder()
.url("https://aip.baidubce.com/file/2.0/brain/online/v1/textreview/task?access_token=" + token)
.method("POST", body)
.addHeader("Content-Type", "multipart/form-data")
.build();
String response = HTTP_CLIENT.newCall(request).execute().body().string();
Gson gson = new Gson();
return gson.fromJson(response, TextReviewSubmitResponse.class);
}
public TextReviewResultQueryResponse textReviewTaskQuery(String taskId, String token) throws IOException {
MediaType mediaType = MediaType.parse("multipart/form-data");
RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM)
.addFormDataPart("taskId", taskId)
.build();
Request request = new Request.Builder()
.url("https://aip.baidubce.com/file/2.0/brain/online/v1/textreview/task/query?access_token=" + token)
.method("POST", body)
.addHeader("Content-Type", "multipart/form-data")
.build();
String response = HTTP_CLIENT.newCall(request).execute().body().string();
Gson gson = new Gson();
return gson.fromJson(response, TextReviewResultQueryResponse.class);
}
}
package cn.com.poc.thirdparty.resource.baidu.entity.response;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
/**
* @author alex.yao
* @date 2025/6/25
*/
public class BaiduTextDiffResponse {
/**
* 文件数据,主版比对文档
* 支持的文件类型:
* -图片:bmp/jpg/jpeg/png/tif/tiff
* -文档:doc/docx/wps/pdf/ofd
* 支持的文件大小:仅支持上传一篇文件,文件大小不超过10M。图像最短边至少15px,最长边最大4096px
* 优先级: baseFile > baseFileURL,当baseFile字段存在时,baseFileURL字段失效
*/
private MultipartFile baseFile;
/**
* 文件数据,副版比对文档
* 支持的文件类型:
* -图片:bmp/jpg/jpeg/png/tif/tiff
* -文档:doc/docx/wps/pdf/ofd
* 支持的文件大小:仅支持上传一篇文件,文件大小不超过10M。图像最短边至少15px,最长边最大4096px
* 优先级: compareFile > compareFileURL,当compareFile字段存在时,compareFileURL字段失效
*/
private MultipartFile compareFile;
private String baseFileURL;
private String compareFileURL;
/**
* 文档比对特殊差异识别参数。默认为false。将指定参数以json格式传递。例如,传递参数{"sealRecognition":true,"handWritingRecognition":true}将分别启用印章识别与手写体识别功能
*/
private Param param;
public MultipartFile getBaseFile() {
return baseFile;
}
public void setBaseFile(MultipartFile baseFile) {
this.baseFile = baseFile;
}
public MultipartFile getCompareFile() {
return compareFile;
}
public void setCompareFile(MultipartFile compareFile) {
this.compareFile = compareFile;
}
public String getBaseFileURL() {
return baseFileURL;
}
public void setBaseFileURL(String baseFileURL) {
this.baseFileURL = baseFileURL;
}
public String getCompareFileURL() {
return compareFileURL;
}
public void setCompareFileURL(String compareFileURL) {
this.compareFileURL = compareFileURL;
}
public Param getParam() {
return param;
}
public void setParam(Param param) {
this.param = param;
}
/**
* sealRecognition 否 bool true/false 是否识别印章信息(识别印章信息有额外的时间开销)。默认为false
* fullWidthHalfWidthRecognition 否 bool true/false 是否识别中英文符号差异。默认为false
* fontFamilyRecognition 否 bool true/false 是否识别字体差异。默认为false
* fontSizeRecognition 否 bool true/false 是否识别字号差异。默认为false
* handWritingRecognition
*/
public static class Param {
private Boolean sealRecognition;
private Boolean fullWidthHalfWidthRecognition;
private Boolean fontFamilyRecognition;
private Boolean fontSizeRecognition;
private Boolean handWritingRecognition;
public Boolean getSealRecognition() {
return sealRecognition;
}
public void setSealRecognition(Boolean sealRecognition) {
this.sealRecognition = sealRecognition;
}
public Boolean getFullWidthHalfWidthRecognition() {
return fullWidthHalfWidthRecognition;
}
public void setFullWidthHalfWidthRecognition(Boolean fullWidthHalfWidthRecognition) {
this.fullWidthHalfWidthRecognition = fullWidthHalfWidthRecognition;
}
public Boolean getFontFamilyRecognition() {
return fontFamilyRecognition;
}
public void setFontFamilyRecognition(Boolean fontFamilyRecognition) {
this.fontFamilyRecognition = fontFamilyRecognition;
}
public Boolean getFontSizeRecognition() {
return fontSizeRecognition;
}
public void setFontSizeRecognition(Boolean fontSizeRecognition) {
this.fontSizeRecognition = fontSizeRecognition;
}
public Boolean getHandWritingRecognition() {
return handWritingRecognition;
}
public void setHandWritingRecognition(Boolean handWritingRecognition) {
this.handWritingRecognition = handWritingRecognition;
}
}
}
package cn.com.poc.thirdparty.resource.baidu.entity.response;
/**
* @Author:Roger Wu
* @name:TextReviewResult
* @Date:2025-05-29 17:30
*/
public class TextReviewQueryResult {
//任务状态,pending:排队中;processing:运行中;success:成功;failed:失败
private String status;
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
}
package cn.com.poc.thirdparty.resource.baidu.entity.response;
/**
* @Author:Roger Wu
* @name:TextReviewResponse
* @Date:2025-05-29 17:29
*/
public class TextReviewResultQueryResponse {
private String log_id;
private String error_code;
private String error_msg;
private TextReviewQueryResult result;
public String getLog_id() {
return log_id;
}
public void setLog_id(String log_id) {
this.log_id = log_id;
}
public String getError_code() {
return error_code;
}
public void setError_code(String error_code) {
this.error_code = error_code;
}
public String getError_msg() {
return error_msg;
}
public void setError_msg(String error_msg) {
this.error_msg = error_msg;
}
public TextReviewQueryResult getResult() {
return result;
}
public void setResult(TextReviewQueryResult result) {
this.result = result;
}
}
package cn.com.poc.thirdparty.resource.baidu.entity.response;
/**
* @Author:Roger Wu
* @name:TextReviewResponse
* @Date:2025-05-29 17:29
*/
public class TextReviewSubmitResponse {
private String log_id;
private String error_code;
private String error_msg;
private TextReviewSubmitResult result;
public String getLog_id() {
return log_id;
}
public void setLog_id(String log_id) {
this.log_id = log_id;
}
public String getError_code() {
return error_code;
}
public void setError_code(String error_code) {
this.error_code = error_code;
}
public String getError_msg() {
return error_msg;
}
public void setError_msg(String error_msg) {
this.error_msg = error_msg;
}
public TextReviewSubmitResult getResult() {
return result;
}
public void setResult(TextReviewSubmitResult result) {
this.result = result;
}
}
package cn.com.poc.thirdparty.resource.baidu.entity.response;
/**
* @Author:Roger Wu
* @name:TextReviewResult
* @Date:2025-05-29 17:30
*/
public class TextReviewSubmitResult {
private String taskId;
public String getTaskId() {
return taskId;
}
public void setTaskId(String taskId) {
this.taskId = taskId;
}
}
package cn.com.poc.thirdparty.resource.baidu.entity.response.text_diff;
import cn.com.poc.thirdparty.resource.baidu.entity.result.BaiduErrorResult;
public class BaiduTextDiffQueryResult extends BaiduErrorResult {
private Result result;
public Result getResult() {
return result;
}
public void setResult(Result result) {
this.result = result;
}
}
package cn.com.poc.thirdparty.resource.baidu.entity.response.text_diff;
import java.util.List;
import javax.annotation.Generated;
import com.google.gson.annotations.Expose;
@Generated("net.hexar.json2pojo")
@SuppressWarnings("unused")
public class DiffItemList {
@Expose
private List<Long> baseBoxArea;
@Expose
private String baseDiffBoxes;
@Expose
private String baseDiffContent;
@Expose
private List<Object> baseDiffContentType;
@Expose
private String baseDiffContext;
@Expose
private String baseDiffType;
@Expose
private Long basePageNum;
@Expose
private List<Long> compareBoxArea;
@Expose
private String compareDiffBoxes;
@Expose
private String compareDiffContent;
@Expose
private List<Object> compareDiffContentType;
@Expose
private String compareDiffContext;
@Expose
private String compareDiffType;
@Expose
private Long comparePageNum;
@Expose
private String id;
public List<Long> getBaseBoxArea() {
return baseBoxArea;
}
public void setBaseBoxArea(List<Long> baseBoxArea) {
this.baseBoxArea = baseBoxArea;
}
public String getBaseDiffBoxes() {
return baseDiffBoxes;
}
public void setBaseDiffBoxes(String baseDiffBoxes) {
this.baseDiffBoxes = baseDiffBoxes;
}
public String getBaseDiffContent() {
return baseDiffContent;
}
public void setBaseDiffContent(String baseDiffContent) {
this.baseDiffContent = baseDiffContent;
}
public List<Object> getBaseDiffContentType() {
return baseDiffContentType;
}
public void setBaseDiffContentType(List<Object> baseDiffContentType) {
this.baseDiffContentType = baseDiffContentType;
}
public String getBaseDiffContext() {
return baseDiffContext;
}
public void setBaseDiffContext(String baseDiffContext) {
this.baseDiffContext = baseDiffContext;
}
public String getBaseDiffType() {
return baseDiffType;
}
public void setBaseDiffType(String baseDiffType) {
this.baseDiffType = baseDiffType;
}
public Long getBasePageNum() {
return basePageNum;
}
public void setBasePageNum(Long basePageNum) {
this.basePageNum = basePageNum;
}
public List<Long> getCompareBoxArea() {
return compareBoxArea;
}
public void setCompareBoxArea(List<Long> compareBoxArea) {
this.compareBoxArea = compareBoxArea;
}
public String getCompareDiffBoxes() {
return compareDiffBoxes;
}
public void setCompareDiffBoxes(String compareDiffBoxes) {
this.compareDiffBoxes = compareDiffBoxes;
}
public String getCompareDiffContent() {
return compareDiffContent;
}
public void setCompareDiffContent(String compareDiffContent) {
this.compareDiffContent = compareDiffContent;
}
public List<Object> getCompareDiffContentType() {
return compareDiffContentType;
}
public void setCompareDiffContentType(List<Object> compareDiffContentType) {
this.compareDiffContentType = compareDiffContentType;
}
public String getCompareDiffContext() {
return compareDiffContext;
}
public void setCompareDiffContext(String compareDiffContext) {
this.compareDiffContext = compareDiffContext;
}
public String getCompareDiffType() {
return compareDiffType;
}
public void setCompareDiffType(String compareDiffType) {
this.compareDiffType = compareDiffType;
}
public Long getComparePageNum() {
return comparePageNum;
}
public void setComparePageNum(Long comparePageNum) {
this.comparePageNum = comparePageNum;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
package cn.com.poc.thirdparty.resource.baidu.entity.response.text_diff;
public class Param {
private Boolean fontFamilyRecognition;
private Boolean fontSizeRecognition;
private Boolean fullWidthHalfWidthRecognition;
private Boolean handWritingRecognition;
private Boolean sealRecognition;
public Boolean getFontFamilyRecognition() {
return fontFamilyRecognition;
}
public void setFontFamilyRecognition(Boolean fontFamilyRecognition) {
this.fontFamilyRecognition = fontFamilyRecognition;
}
public Boolean getFontSizeRecognition() {
return fontSizeRecognition;
}
public void setFontSizeRecognition(Boolean fontSizeRecognition) {
this.fontSizeRecognition = fontSizeRecognition;
}
public Boolean getFullWidthHalfWidthRecognition() {
return fullWidthHalfWidthRecognition;
}
public void setFullWidthHalfWidthRecognition(Boolean fullWidthHalfWidthRecognition) {
this.fullWidthHalfWidthRecognition = fullWidthHalfWidthRecognition;
}
public Boolean getHandWritingRecognition() {
return handWritingRecognition;
}
public void setHandWritingRecognition(Boolean handWritingRecognition) {
this.handWritingRecognition = handWritingRecognition;
}
public Boolean getSealRecognition() {
return sealRecognition;
}
public void setSealRecognition(Boolean sealRecognition) {
this.sealRecognition = sealRecognition;
}
}
package cn.com.poc.thirdparty.resource.baidu.entity.response.text_diff;
import java.util.List;
import javax.annotation.Generated;
import com.google.gson.annotations.Expose;
@SuppressWarnings("unused")
public class Result {
private String duration;
private Param param;
private String status;
private List<SubTaskList> subTaskList;
private String taskId;
public String getDuration() {
return duration;
}
public void setDuration(String duration) {
this.duration = duration;
}
public Param getParam() {
return param;
}
public void setParam(Param param) {
this.param = param;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public List<SubTaskList> getSubTaskList() {
return subTaskList;
}
public void setSubTaskList(List<SubTaskList> subTaskList) {
this.subTaskList = subTaskList;
}
public String getTaskId() {
return taskId;
}
public void setTaskId(String taskId) {
this.taskId = taskId;
}
}
package cn.com.poc.thirdparty.resource.baidu.entity.response.text_diff;
import java.util.List;
import javax.annotation.Generated;
import com.google.gson.annotations.Expose;
@Generated("net.hexar.json2pojo")
@SuppressWarnings("unused")
public class SubTaskList {
@Expose
private String baseDocId;
@Expose
private String baseDocName;
@Expose
private String baseDocOssURL;
@Expose
private String compareDocId;
@Expose
private String compareDocName;
@Expose
private String compareDocOssURL;
@Expose
private String compareStatus;
@Expose
private String createdAt;
@Expose
private List<DiffItemList> diffItemList;
@Expose
private String finishedAt;
@Expose
private String reportOssURL;
@Expose
private String reportStatus;
@Expose
private String similarity;
@Expose
private Long totalDiff;
public String getBaseDocId() {
return baseDocId;
}
public void setBaseDocId(String baseDocId) {
this.baseDocId = baseDocId;
}
public String getBaseDocName() {
return baseDocName;
}
public void setBaseDocName(String baseDocName) {
this.baseDocName = baseDocName;
}
public String getBaseDocOssURL() {
return baseDocOssURL;
}
public void setBaseDocOssURL(String baseDocOssURL) {
this.baseDocOssURL = baseDocOssURL;
}
public String getCompareDocId() {
return compareDocId;
}
public void setCompareDocId(String compareDocId) {
this.compareDocId = compareDocId;
}
public String getCompareDocName() {
return compareDocName;
}
public void setCompareDocName(String compareDocName) {
this.compareDocName = compareDocName;
}
public String getCompareDocOssURL() {
return compareDocOssURL;
}
public void setCompareDocOssURL(String compareDocOssURL) {
this.compareDocOssURL = compareDocOssURL;
}
public String getCompareStatus() {
return compareStatus;
}
public void setCompareStatus(String compareStatus) {
this.compareStatus = compareStatus;
}
public String getCreatedAt() {
return createdAt;
}
public void setCreatedAt(String createdAt) {
this.createdAt = createdAt;
}
public List<DiffItemList> getDiffItemList() {
return diffItemList;
}
public void setDiffItemList(List<DiffItemList> diffItemList) {
this.diffItemList = diffItemList;
}
public String getFinishedAt() {
return finishedAt;
}
public void setFinishedAt(String finishedAt) {
this.finishedAt = finishedAt;
}
public String getReportOssURL() {
return reportOssURL;
}
public void setReportOssURL(String reportOssURL) {
this.reportOssURL = reportOssURL;
}
public String getReportStatus() {
return reportStatus;
}
public void setReportStatus(String reportStatus) {
this.reportStatus = reportStatus;
}
public String getSimilarity() {
return similarity;
}
public void setSimilarity(String similarity) {
this.similarity = similarity;
}
public Long getTotalDiff() {
return totalDiff;
}
public void setTotalDiff(Long totalDiff) {
this.totalDiff = totalDiff;
}
}
package cn.com.poc.thirdparty.resource.baidu.entity.result;
/**
* @author alex.yao
* @date 2025/6/25
*/
public class BaiduTextDiffResult extends BaiduErrorResult {
private Result result;
public void setResult(Result result) {
this.result = result;
}
public Result getResult() {
return result;
}
public class Result {
private String taskId;
public String getTaskId() {
return taskId;
}
public void setTaskId(String taskId) {
this.taskId = taskId;
}
}
}
package cn.com.poc.thirdparty.resource.baidu.entity.result;
import java.io.File;
/**
* @Author:Roger Wu
* @name:TextReviewRequest
* @Date:2025-05-29 17:15
*/
public class TextReviewRequest {
/**
* 文件数据,支持Word和PDF格式,文件大小不超过10M
* 优先级: file > fileURLList,当file字段存在时,fileURLList字段失效
*/
private File file;
/**
* 文件完整URL,仅支持北京区域的BOS公网访问,URL长度不超过1024字节,支持PDF/doc/docx格式,仅支持上传1篇文件,文件大小不超过10M
* 优先级: file > fileURLList,当file字段存在时,fileURLList字段失效
* 请注意关闭URL防盗链
*/
private String fileURLList;
/**
* 该清单类型为系统预置清单。每次审查任务仅可选择单一清单。具体清单选项如下:
* - Sales_PartyA_V2:买卖合同-买方;
* - Sales_PartyB_V2:买卖合同-卖方;
* - Lease_PartyA_V2:租赁合同-出租方;
* - Lease_PartyB_V2:租赁合同-承租方;
* - TechDev_PartyA_V2:技术开发合同-委托方;
* - TechDev_PartyB_V2:技术开发合同-受托方;
* - Labor_PartyA_V2:劳动合同-用人单位;
* - Labor_PartyB_V2:劳动合同-劳动者;
* - Entrustment_PartyA_V2:委托合同-委托方;
* - Entrustment_PartyB_V2:委托合同-受托方;
* - Work-for-hire_PartyA_V2:承揽合同-定作人;
* - Work-for-hire_PartyB_V2:承揽合同-承揽人;
* - LaborDispatch_PartyA_V2:劳务派遣合同-用工单位;
* - LaborDispatch_PartyB_V2:劳务派遣合同-劳务派遣单位;
* - RealtySvcs_PartyA_V2:物业服务合同-业主;
* - RealtySvcs_PartyB_V2:物业服务合同-物业服务人;
* - EquipPur_PartyA_V2:设备采购合同-买方;
* - EquipPur_PartyB_V2:设备采购合同-卖方;
* - FinLease_PartyA_V2:融资租赁合同-出租方;
* - FinLease_PartyB_V2:融资租赁合同-承租方;
* - DebtAssign_PartyA_V2:债权转让合同-转让方;
* - DebtAssign_PartyB_V2:债权转让合同-受让方;
* - CISG_PartyA_V2:国际货物贸易合同-买方;
* - CISG_PartyB_V2:国际货物贸易合同-卖方 ;
* - GUAR_PartyA_V2:保证合同-保证方 ;
* - GUAR_PartyA_V2:保证合同-债权方 ;
* - CG_PartyA_V2:货运合同-承运方 ;
* - CG_PartyB_V2:货运合同-托运方 ;
* - Factoring_PartyA_V2:保理合同-保理商 ;
* - Factoring_PartyB_V2:保理合同-卖方 ;
* - Brokerage_PartyA_V2:中介合同-委托人 ;
* - Brokerage_PartyB_V2:中介合同-中介人 ;
* - TradingTrust_PartyA_V2:行纪合同-委托人 ;
* - TradingTrust_PartyB_V2:行纪合同-行纪人 ;
* - PNRship_V2:合伙合同-合伙人 ;
* - PT/PAT_PartyA_V2:专利(申请)权转让合同-受让方 ;
* - PT/PAT_PartyB_V2:专利(申请)权转让合同-转让方;
* - TST_PartyA_V2:技术秘密转让合同-受让方;
* - TST_PartyB_V2:技术秘密转让合同-转让方;
* - TST_PartyB_V2:技术秘密转让合同-转让方;
* -TechLic_PartyA_V2:技术许可合同-许可方;
* -TechLic_PartyB_V2:技术许可合同-被许可方;
* - EquipLea_PartyA_V2:设备租赁合同-出租方;
* - EquipLea_PartyB_V2:设备租赁合同-承租方;
* - ConstCtrl_PartyA_V2:建设工程施工合同-发包方;
* - ConstCtrl_PartyB_V2:建设工程施工合同-承包方
*/
private String templateName;
/**
* 该清单类型为用户在合同审查清单管理 创建的我的清单。每次审查任务仅可选择单一清单
* https://ai.baidu.com/ai-doc/OCR/olqc085rg
*/
private String templateId;
/**
* 筛选下载的批注结果中展示的风险等级条款。默认为"major",即仅展示重大风险条款。
* - normal:一般风险;
* - major:重大风险;
* - all:一般风险和重大风险
*/
private String commentRiskLevel;
public File getFile() {
return file;
}
public void setFile(File file) {
this.file = file;
}
public String getFileURLList() {
return fileURLList;
}
public void setFileURLList(String fileURLList) {
this.fileURLList = fileURLList;
}
public String getTemplateName() {
return templateName;
}
public void setTemplateName(String templateName) {
this.templateName = templateName;
}
public String getTemplateId() {
return templateId;
}
public void setTemplateId(String templateId) {
this.templateId = templateId;
}
public String getCommentRiskLevel() {
return commentRiskLevel;
}
public void setCommentRiskLevel(String commentRiskLevel) {
this.commentRiskLevel = commentRiskLevel;
}
}
package cn.com.poc.thirdparty.resource.baidu.service;
import cn.com.poc.thirdparty.resource.baidu.entity.response.BaiduTextDiffResponse;
import cn.com.poc.thirdparty.resource.baidu.entity.response.text_diff.BaiduTextDiffQueryResult;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
/**
* @author alex.yao
* @date 2025/6/25
*/
public interface BaiduTextDiffService {
/**
* 文档比对任务创建接口
*
* @param baseFile 主版比对文档
* @param compareFile 副版比对文档
* @param param 参数
* @return taskId - 任务ID
*/
String textDiff(MultipartFile baseFile, MultipartFile compareFile, BaiduTextDiffResponse.Param param);
/**
* 文档比对任务创建接口
*
* @param baseFileUrl 主版比对文档URL
* @param compareFileUrl 副版比对文档URL
* @param param 参数
* @return taskId - 任务ID
*/
String textDiff(String baseFileUrl, String compareFileUrl, BaiduTextDiffResponse.Param param);
/**
* 查询文档比对任务结果
*
* @param taskId 任务ID
* @return BaiduTextDiffQueryResult - 文档比对任务结果对象
*/
BaiduTextDiffQueryResult queryTextDiffTask(String taskId);
/**
* 获取前端SDK渲染
*
* @param taskId 任务ID
* @return SDK渲染地址
*/
String getSDKUrl(String taskId);
}
......@@ -7,4 +7,6 @@ package cn.com.poc.thirdparty.resource.baidu.service;
public interface BaiduTokenService {
String getToken();
String getToken(String clientId, String clientSecret);
}
package cn.com.poc.thirdparty.resource.baidu.service.impl;
import cn.com.poc.common.utils.StringUtils;
import cn.com.poc.thirdparty.resource.baidu.api.BaiduTextDiffApi;
import cn.com.poc.thirdparty.resource.baidu.entity.response.BaiduTextDiffResponse;
import cn.com.poc.thirdparty.resource.baidu.entity.response.text_diff.BaiduTextDiffQueryResult;
import cn.com.poc.thirdparty.resource.baidu.entity.result.BaiduTextDiffResult;
import cn.com.poc.thirdparty.resource.baidu.service.BaiduTextDiffService;
import cn.com.poc.thirdparty.resource.baidu.service.BaiduTokenService;
import cn.com.yict.framemax.core.exception.BusinessException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
/**
* @author alex.yao
* @date 2025/6/25
*/
@Service
public class BaiduTextDiffServiceImpl implements BaiduTextDiffService {
private final Logger logger = LoggerFactory.getLogger(BaiduTextDiffService.class);
@Value("baidu.text_diff.client_id")
private String clientId;
@Value("baidu.text_diff.client_secret")
private String clientSecret;
@Resource
private BaiduTextDiffApi baiduTextDiffApi;
@Resource
private BaiduTokenService baiduTokenService;
@Override
public String textDiff(MultipartFile baseFile, MultipartFile compareFile, BaiduTextDiffResponse.Param param) {
BaiduTextDiffResponse baiduTextDiffResponse = new BaiduTextDiffResponse();
baiduTextDiffResponse.setBaseFile(baseFile);
baiduTextDiffResponse.setCompareFile(compareFile);
baiduTextDiffResponse.setParam(param);
return createTextDiffTask(baiduTextDiffResponse, baiduTokenService.getToken(clientId, clientSecret));
}
@Override
public String textDiff(String baseFileUrl, String compareFileUrl, BaiduTextDiffResponse.Param param) {
BaiduTextDiffResponse baiduTextDiffResponse = new BaiduTextDiffResponse();
baiduTextDiffResponse.setBaseFileURL(baseFileUrl);
baiduTextDiffResponse.setCompareFileURL(compareFileUrl);
baiduTextDiffResponse.setParam(param);
return createTextDiffTask(baiduTextDiffResponse, baiduTokenService.getToken(clientId, clientSecret));
}
private String createTextDiffTask(BaiduTextDiffResponse baiduTextDiffResponse, String token) {
BaiduTextDiffResult baiduTextDiffResult = baiduTextDiffApi.textDiff(baiduTextDiffResponse, token);
if (baiduTextDiffResult == null || !baiduTextDiffResult.getError_code().equals(0)) {
if (baiduTextDiffResult != null
&& baiduTextDiffResult.getError_code() != null
&& StringUtils.isNotBlank(baiduTextDiffResult.getError_msg())) {
logger.error("文档比对任务创建失败,错误码:{},错误信息:{}", baiduTextDiffResult.getError_code(), baiduTextDiffResult.getError_msg());
}
throw new BusinessException("文档比对任务创建失败");
}
return baiduTextDiffResult.getResult().getTaskId();
}
@Override
public BaiduTextDiffQueryResult queryTextDiffTask(String taskId) {
String token = baiduTokenService.getToken(clientId, clientSecret);
BaiduTextDiffQueryResult baiduTextDiffQueryResult = baiduTextDiffApi.queryTask(taskId, token);
if (baiduTextDiffQueryResult == null || !baiduTextDiffQueryResult.getError_code().equals(0)) {
if (baiduTextDiffQueryResult != null
&& baiduTextDiffQueryResult.getError_code() != null
&& StringUtils.isNotBlank(baiduTextDiffQueryResult.getError_msg())) {
logger.error("查询文档对比任务,错误码:{},错误信息:{}", baiduTextDiffQueryResult.getError_code(), baiduTextDiffQueryResult.getError_msg());
}
throw new BusinessException("查询文档对比任务失败");
}
return baiduTextDiffQueryResult;
}
@Override
public String getSDKUrl(String taskId) {
String baseUrl = "https://textmind-sdk.bce.baidu.com/textmind/sdk/textdiff/{taskId}?access_token={access_token}";
String token = baiduTokenService.getToken(clientId, clientSecret);
baseUrl = baseUrl.replace("{taskId}", taskId).replace("{access_token}", token);
return baseUrl;
}
}
......@@ -31,7 +31,20 @@ public class BaiduTokenServiceImpl implements BaiduTokenService {
String SECRET_ACCESS_KEY = Config.get("baidu.code.keySecret");
if (null == redisService.get(BAIDU_AI_CUSTOM_TOKEN)) {
BaiduTokenResult token = baiduTokenApi.getToken(ACCESS_KEY_ID, SECRET_ACCESS_KEY);
if (StringUtils.isNoneBlank(token.getError())) {
if (token == null || StringUtils.isNoneBlank(token.getError())) {
throw new I18nMessageException("exception/failed.to.obtain.baidu.token");
}
redisService.set(BAIDU_AI_CUSTOM_TOKEN, token.getAccess_token(), token.getExpires_in());
}
return redisService.get(BAIDU_AI_CUSTOM_TOKEN).toString();
}
@Override
public String getToken(String clientId, String clientSecret) {
String BAIDU_AI_CUSTOM_TOKEN = "BAIDU_TOKEN_" + clientId;
if (null == redisService.get(BAIDU_AI_CUSTOM_TOKEN)) {
BaiduTokenResult token = baiduTokenApi.getToken(clientId, clientSecret);
if (token == null || StringUtils.isNoneBlank(token.getError())) {
throw new I18nMessageException("exception/failed.to.obtain.baidu.token");
}
redisService.set(BAIDU_AI_CUSTOM_TOKEN, token.getAccess_token(), token.getExpires_in());
......
......@@ -9,8 +9,10 @@ import cn.com.poc.thirdparty.resource.demand.ai.function.AbstractLargeModelFunct
import cn.com.poc.thirdparty.resource.demand.ai.function.entity.FunctionLLMConfig;
import cn.com.poc.thirdparty.resource.demand.ai.function.entity.Parameters;
import cn.com.poc.thirdparty.resource.demand.ai.function.entity.Properties;
import cn.com.poc.thirdparty.resource.demand.ai.function.extraction.entity.KeyInfo;
import cn.com.poc.thirdparty.resource.textin.api.TextInClient;
import cn.com.poc.thirdparty.resource.text_in.api.TextInClient;
import cn.com.poc.thirdparty.resource.text_in.entity.extraction.entity.KeyInfo;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.json.JSONException;
import com.alibaba.fastjson.JSONArray;
......
......@@ -9,7 +9,7 @@ import cn.com.poc.thirdparty.resource.demand.ai.function.AbstractLargeModelFunct
import cn.com.poc.thirdparty.resource.demand.ai.function.entity.FunctionLLMConfig;
import cn.com.poc.thirdparty.resource.demand.ai.function.entity.Parameters;
import cn.com.poc.thirdparty.resource.demand.ai.function.entity.Properties;
import cn.com.poc.thirdparty.resource.textin.api.TextInClient;
import cn.com.poc.thirdparty.resource.text_in.api.TextInClient;
import cn.hutool.core.collection.ListUtil;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.databind.JsonNode;
......
package cn.com.poc.thirdparty.resource.textin.api;
package cn.com.poc.thirdparty.resource.text_in.api;
/**
* @author alex.yao
......@@ -6,16 +6,15 @@ package cn.com.poc.thirdparty.resource.textin.api;
*/
import cn.com.poc.common.utils.DocumentLoad;
import cn.com.poc.common.utils.JsonUtils;
import cn.com.poc.common.utils.http.LocalHttpClient;
import cn.com.poc.thirdparty.resource.demand.ai.function.extraction.entity.Config;
import cn.com.poc.thirdparty.resource.demand.ai.function.extraction.entity.KeyInfo;
import cn.com.poc.thirdparty.resource.demand.ai.function.extraction.entity.RequestData;
import cn.com.poc.thirdparty.resource.text_in.entity.extraction.entity.*;
import cn.com.poc.thirdparty.resource.text_in.entity.imageEdgeTriming.ImageEdgeTrimingResult;
import cn.com.yict.framemax.core.exception.BusinessException;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.methods.RequestBuilder;
import org.apache.http.entity.StringEntity;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......@@ -25,6 +24,7 @@ import java.net.URL;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Base64;
import java.util.HashMap;
import java.util.List;
......@@ -32,18 +32,13 @@ import java.util.Map;
public class TextInClient {
final private Logger logger = LoggerFactory.getLogger(TextInClient.class);
private String appId = "dafd04a574230c00ccba61132160de0c";
private String secretCode = "3bc03c7e6f9402963e6e71d16d786a9c";
private Logger logger = LoggerFactory.getLogger(TextInClient.class);
private final String appId = "145b4303badd1da2f1628cf28534967a";
private final String secretCode = "5fe7d03b56714ec708f4ec6149d3a20c";
public TextInClient() {
}
public TextInClient(String appId, String secretCode) {
this.appId = appId;
this.secretCode = secretCode;
}
/**
* ocr
*
......@@ -85,7 +80,6 @@ public class TextInClient {
}
}
private HttpURLConnection getOCRHttpURLConnection(StringBuilder queryParams) throws IOException {
String baseUrl = "https://api.textin.com/ai/service/v1/pdf_to_markdown";
String fullUrl = baseUrl + (queryParams.length() > 0 ? "?" + queryParams : "");
......@@ -100,13 +94,147 @@ public class TextInClient {
return connection;
}
/**
* OCR
*
* @param fileContent
* @param options
* @return
* @throws IOException
*/
public String recognize(byte[] fileContent, HashMap<String, Object> options) throws IOException {
StringBuilder queryParams = new StringBuilder();
for (Map.Entry<String, Object> entry : options.entrySet()) {
if (queryParams.length() > 0) {
queryParams.append("&");
}
queryParams.append(URLEncoder.encode(entry.getKey(), "UTF-8"))
.append("=")
.append(URLEncoder.encode(entry.getValue().toString(), "UTF-8"));
}
String baseUrl = "https://api.textin.com/ai/service/v1/pdf_to_markdown";
String fullUrl = baseUrl + (queryParams.length() > 0 ? "?" + queryParams : "");
URL url = new URL(fullUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("x-ti-app-id", appId);
connection.setRequestProperty("x-ti-secret-code", secretCode);
connection.setRequestProperty("Content-Type", "text/plain;charset=utf-8");
connection.setDoOutput(true);
try (OutputStream os = connection.getOutputStream()) {
os.write(fileContent);
os.flush();
}
int responseCode = connection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
try (BufferedReader in = new BufferedReader(
new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8))) {
StringBuilder response = new StringBuilder();
String inputLine;
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
return response.toString();
}
} else {
logger.error("HTTP request failed with code: {}, Error message view :{}", responseCode, "https://www.textin.com/document/pdf_to_markdown");
throw new IOException("HTTP request failed with code: " + responseCode);
}
}
/**
* 文档图像切边增强矫正
* 文档图像切边矫正与图片切边增强合并产品;边缘背景去除,文档图像形变矫正,增强显示效果。
* https://www.textin.com/document/crop_enhance_image
*
* @param input 文件路径或URL,取决于 isUrl 参数的值。如果为 true,则视为 URL;否则视为本地文件路径。
* @param isUrl 指示输入是 URL 还是本地文件路径。如果为 true,则视为 URL;否则视为本地文件路径。
* @return 处理后的图像数据或错误信息。如果请求成功,返回处理后的图像数据;否则返回错误信息。
*/
public ImageEdgeTrimingResult imageEdgeTrimming(String input, boolean isUrl) {
// 文档图像切边增强矫正
String url = "https://api.textin.com/ai/service/v1/crop_enhance_image";
BufferedReader in = null;
DataOutputStream out = null;
try {
byte[] requestData;
if (isUrl) {
requestData = input.getBytes(StandardCharsets.UTF_8); // 将 URL 转为字节数组
} else {
requestData = readFile(input); // 读取文件内容
}
URL realUrl = new URL(url);
HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection();
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("Content-Type", isUrl ? "text/plain" : "application/octet-stream");
conn.setRequestProperty("x-ti-app-id", appId);
conn.setRequestProperty("x-ti-secret-code", secretCode);
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setRequestMethod("POST");
// 发送请求体
out = new DataOutputStream(conn.getOutputStream());
out.write(requestData);
out.flush();
// 读取响应
in = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8));
StringBuilder result = new StringBuilder();
String line;
while ((line = in.readLine()) != null) {
result.append(line);
}
ImageEdgeTrimingResult imageEdgeTrimingResult = JsonUtils.deSerialize(result.toString(), ImageEdgeTrimingResult.class);
return imageEdgeTrimingResult;
} catch (Exception e) {
logger.error("图像增强失败", e);
throw new BusinessException("图像增强失败");
} finally {
try {
if (out != null) {
out.close();
}
if (in != null) {
in.close();
}
} catch (IOException ex) {
logger.error("关闭流出现异常!", ex);
}
}
}
/**
* 读取文件内容为字节数组
*
* @param path 文件路径
* @return 文件的字节数组
*/
public byte[] readFile(String path) {
InputStream in = null;
byte[] data = null;
try {
in = Files.newInputStream(Paths.get(path));
data = new byte[in.available()];
in.read(data);
in.close();
} catch (IOException e) {
logger.error("读取文件出错!", e);
}
return data;
}
/**
* 【合同抽取】-创建抽取
* https://www.textin.com/document/doc_extraction_create
*
* @param fileUrl
* @param keyInfoList
* @return
* @param fileUrl PDF文件URL
* @param keyInfoList 抽取字段列表
* @return 任务ID
*/
public String extraction(String fileUrl, List<KeyInfo> keyInfoList) {
......@@ -119,50 +247,43 @@ public class TextInClient {
// 获取文件名
String fileName = file.getName();
Config config = new Config();
config.setEngine("table");
config.setRemove_watermark("false");
config.setUse_pdf_parser("true");
config.setUse_semantic_match("true");
CreateExtractionResponse response = new CreateExtractionResponse();
response.setConfig(config);
response.setCreator("");
response.setFiledata(base64FileData);
response.setFilename(fileName);
response.setKey_info_list(keyInfoList);
response.setToken_mode(1L);
// 构建请求数据
Config config = new Config("table", "true", "true", "false");
RequestData requestData = new RequestData("", config, base64FileData, fileName, keyInfoList.toArray(new KeyInfo[0]));
// 创建ObjectMapper对象,序列化Java对象为JSON
ObjectMapper objectMapper = new ObjectMapper();
String requestDataJson = objectMapper.writeValueAsString(requestData);
// 创建URL对象
URL url = new URL("https://doc-compare.intsig.com/api/contracts/v3/extraction/external/create");
// 打开HTTP连接
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("x-ti-app-id", appId);
connection.setRequestProperty("x-ti-secret-code", secretCode);
connection.setRequestProperty("Content-Type", "application/json;charset=utf-8");
connection.setDoOutput(true); // 开启输出流
// 发送请求数据
try (OutputStream os = connection.getOutputStream()) {
byte[] input = requestDataJson.getBytes(StandardCharsets.UTF_8);
os.write(input, 0, input.length);
}
String json = JSONObject.toJSONString(response);
// 获取响应代码
int status = connection.getResponseCode();
logger.info("Response Code: {}", status);
HttpUriRequest httpUriRequest = RequestBuilder.post()
.setUri("https://doc-compare.intsig.com/api/contracts/v3/extraction/external/create")
.addHeader("x-ti-app-id", appId)
.addHeader("x-ti-secret-code", secretCode)
.addHeader("Content-Type", "application/json;charset=utf-8")
.setEntity(new StringEntity(json, StandardCharsets.UTF_8))
.build();
// 读取响应内容
try (BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()))) {
String inputLine;
StringBuilder response = new StringBuilder();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
// 输出响应内容
logger.info("Response: {}", response);
JSONObject jsonResponse = JSONObject.parseObject(response.toString());
String taskId = jsonResponse.getJSONObject("result").getString("task_id");
return extractedResults(taskId);
CreateResult createResult = LocalHttpClient.executeJsonResult(httpUriRequest, CreateResult.class);
if (createResult == null) {
throw new BusinessException("创建抽取任务失败");
}
if (createResult.getCode().equals(200)) {
return createResult.getData().getTask_id();
} else {
logger.error("创建抽取任务失败,错误码:{},msg:{}", createResult.getCode(), createResult.getMsg());
throw new BusinessException("创建抽取任务失败");
}
} catch (IOException e) {
throw new BusinessException(e);
throw new BusinessException("创建抽取任务失败");
}
}
......@@ -173,23 +294,27 @@ public class TextInClient {
* @param taskId
* @return
*/
private String extractedResults(String taskId) {
public ExtractionResult extractedResults(String taskId) {
String baseUrl = "https://doc-compare.intsig.com/doc_extraction/keyinfo/extracted_results?format=json&task_id=" + taskId;
HttpUriRequest httpUriRequest = RequestBuilder.post()
HttpUriRequest httpUriRequest = RequestBuilder.get()
.setUri(baseUrl)
.addHeader("x-ti-app-id", appId)
.addHeader("x-ti-secret-code", secretCode)
.addHeader("Content-Type", "application/json;charset=utf-8")
.build();
String result = LocalHttpClient.executeJsonResult(httpUriRequest, String.class);
JSONObject resultJson = JSONObject.parseObject(result);
Integer code = resultJson.getInteger("code");
if (code.equals(200)) {
return resultJson.getJSONObject("result").toJSONString();
ExtractionResult result = LocalHttpClient.executeJsonResult(httpUriRequest, ExtractionResult.class);
if (result == null) {
logger.error("获取抽取结果失败");
return null;
}
if (result.getCode().equals(209L)) {
logger.info("任务未完成,继续等待");
return result;
} else if (result.getCode().equals(200L)) {
return result;
} else {
logger.error("获取token失败,错误码:{}", code);
return StringUtils.EMPTY;
logger.error("获取token失败,错误码:{},msg:{}", result.getCode(), result.getMsg());
return result;
}
}
}
\ No newline at end of file
package cn.com.poc.thirdparty.resource.text_in.entity.extraction.entity;
@SuppressWarnings("unused")
public class Config {
private String engine;
private String remove_watermark;
private String use_pdf_parser;
private String use_semantic_match;
public String getEngine() {
return engine;
}
public void setEngine(String engine) {
this.engine = engine;
}
public String getRemove_watermark() {
return remove_watermark;
}
public void setRemove_watermark(String remove_watermark) {
this.remove_watermark = remove_watermark;
}
public String getUse_pdf_parser() {
return use_pdf_parser;
}
public void setUse_pdf_parser(String use_pdf_parser) {
this.use_pdf_parser = use_pdf_parser;
}
public String getUse_semantic_match() {
return use_semantic_match;
}
public void setUse_semantic_match(String use_semantic_match) {
this.use_semantic_match = use_semantic_match;
}
}
package cn.com.poc.thirdparty.resource.text_in.entity.extraction.entity;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import java.util.List;
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class CreateExtractionResponse {
private Config config;
private String creator;
private String filedata;
private String filename;
private List<KeyInfo> key_info_list;
private Long token_mode;
public Config getConfig() {
return config;
}
public void setConfig(Config config) {
this.config = config;
}
public String getCreator() {
return creator;
}
public void setCreator(String creator) {
this.creator = creator;
}
public String getFiledata() {
return filedata;
}
public void setFiledata(String filedata) {
this.filedata = filedata;
}
public String getFilename() {
return filename;
}
public void setFilename(String filename) {
this.filename = filename;
}
public List<KeyInfo> getKey_info_list() {
return key_info_list;
}
public void setKey_info_list(List<KeyInfo> key_info_list) {
this.key_info_list = key_info_list;
}
public Long getToken_mode() {
return token_mode;
}
public void setToken_mode(Long token_mode) {
this.token_mode = token_mode;
}
}
package cn.com.poc.thirdparty.resource.text_in.entity.extraction.entity;
/**
* @author alex.yao
* @date 2025/5/21
*/
public class CreateResult {
private Integer code;
private Data data;
private String msg;
public static class Data {
private String extracted_results_url;
private String preview_url;
private String task_id;
public String getExtracted_results_url() {
return extracted_results_url;
}
public void setExtracted_results_url(String extracted_results_url) {
this.extracted_results_url = extracted_results_url;
}
public String getPreview_url() {
return preview_url;
}
public void setPreview_url(String preview_url) {
this.preview_url = preview_url;
}
public String getTask_id() {
return task_id;
}
public void setTask_id(String task_id) {
this.task_id = task_id;
}
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public Data getData() {
return data;
}
public void setData(Data data) {
this.data = data;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
package cn.com.poc.thirdparty.resource.text_in.entity.extraction.entity;
import cn.com.poc.thirdparty.resource.text_in.entity.imageEdgeTriming.Result;
/**
* @author alex.yao
* @date 2025/5/19
*/
public class ExtractionResult {
private Long code;
private String msg;
private Result result;
public Long getCode() {
return code;
}
public void setCode(Long code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Result getResult() {
return result;
}
public void setResult(Result result) {
this.result = result;
}
}
package cn.com.poc.thirdparty.resource.text_in.entity.extraction.entity;
/**
* @author alex.yao
* @date 2025/5/12
*/
public class KeyInfo {
public String key_info;
public String[] paraphrase_names;
public String field_type;
public boolean is_in_table;
public String[] keywords;
public KeyInfo() {
}
public KeyInfo(String key_info, String[] paraphrase_names, String field_type, boolean is_in_table, String[] keywords) {
this.key_info = key_info;
this.paraphrase_names = paraphrase_names;
this.field_type = field_type;
this.is_in_table = is_in_table;
this.keywords = keywords;
}
public String getKey_info() {
return key_info;
}
public void setKey_info(String key_info) {
this.key_info = key_info;
}
public String[] getParaphrase_names() {
return paraphrase_names;
}
public void setParaphrase_names(String[] paraphrase_names) {
this.paraphrase_names = paraphrase_names;
}
public String getField_type() {
return field_type;
}
public void setField_type(String field_type) {
this.field_type = field_type;
}
public boolean isIs_in_table() {
return is_in_table;
}
public void setIs_in_table(boolean is_in_table) {
this.is_in_table = is_in_table;
}
public String[] getKeywords() {
return keywords;
}
public void setKeywords(String[] keywords) {
this.keywords = keywords;
}
}
package cn.com.poc.thirdparty.resource.text_in.entity.extraction.entity;
/**
* @author alex.yao
* @date 2025/5/12
*/
public class RequestData {
public Integer token_mode;
public String creator;
public Config config;
public String filedata;
public String filename;
public KeyInfo[] key_info_list;
public RequestData(String creator, Config config, String filedata, String filename, KeyInfo[] key_info_list) {
this.token_mode = 1;
this.creator = creator;
this.config = config;
this.filedata = filedata;
this.filename = filename;
this.key_info_list = key_info_list;
}
}
package cn.com.poc.thirdparty.resource.text_in.entity.extraction.entity;
import java.util.List;
/**
* @author alex.yao
* @date 2025/5/19
*/
public class Result {
private List<Item> customize_keys; //自配置字段数组
private List<Item> stamp_keys; //印章字段数组
public List<Item> getCustomize_keys() {
return customize_keys;
}
public void setCustomize_keys(List<Item> customize_keys) {
this.customize_keys = customize_keys;
}
public List<Item> getStamp_keys() {
return stamp_keys;
}
public void setStamp_keys(List<Item> stamp_keys) {
this.stamp_keys = stamp_keys;
}
public static class Item{
private String key; //字段名
private Object value; //字段值
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
}
}
package cn.com.poc.thirdparty.resource.text_in.entity.imageEdgeTriming;
import com.google.gson.annotations.Expose;
import javax.annotation.Generated;
@Generated("net.hexar.json2pojo")
@SuppressWarnings("unused")
public class ImageEdgeTrimingResult {
@Expose
private Long duration;
@Expose
private Result result;
@Expose
private String version;
public Long getDuration() {
return duration;
}
public void setDuration(Long duration) {
this.duration = duration;
}
public Result getResult() {
return result;
}
public void setResult(Result result) {
this.result = result;
}
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
}
package cn.com.poc.thirdparty.resource.text_in.entity.imageEdgeTriming;
import java.util.List;
@SuppressWarnings("unused")
public class ImageList {
private Long angle;//图像角度,correct_direction=1时生效 定义0度为人类阅读文字的图像方向,称为正置图像, 本字段表示输入图像是正置图像进行顺时针若干角度的旋转所得。
private Long cropped_height;//图像处理后的高
private Long cropped_width;//图像处理后的宽
private String image;//图像处理后的jpg图片,base64格式
private List<Object> position;//切图区域的4个角点坐标, 是个长度为8的数组
public Long getAngle() {
return angle;
}
public void setAngle(Long angle) {
this.angle = angle;
}
public Long getCropped_height() {
return cropped_height;
}
public void setCropped_height(Long cropped_height) {
this.cropped_height = cropped_height;
}
public Long getCropped_width() {
return cropped_width;
}
public void setCropped_width(Long cropped_width) {
this.cropped_width = cropped_width;
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
public List<Object> getPosition() {
return position;
}
public void setPosition(List<Object> position) {
this.position = position;
}
}
package cn.com.poc.thirdparty.resource.text_in.entity.imageEdgeTriming;
import java.util.List;
@SuppressWarnings("unused")
public class Result {
private List<ImageList> image_list;
private Long origin_height;
private Long origin_width;
public List<ImageList> getImage_list() {
return image_list;
}
public void setImage_list(List<ImageList> image_list) {
this.image_list = image_list;
}
public Long getOrigin_height() {
return origin_height;
}
public void setOrigin_height(Long origin_height) {
this.origin_height = origin_height;
}
public Long getOrigin_width() {
return origin_width;
}
public void setOrigin_width(Long origin_width) {
this.origin_width = origin_width;
}
}
package cn.com.poc.thirdparty.resource.textin.entity;
/**
* @author alex.yao
* @date 2025/5/7
*/
public class PdfToMDResponse {
public String pdfPwd;
public Integer dpi;
public Integer pageStart;
public Integer pageCount;
public Boolean applyDocumentTree;
public String markdownDetails;
public String tableFlavor;
public String getImage;
public String parseMode;
public String getPdfPwd() {
return pdfPwd;
}
public void setPdfPwd(String pdfPwd) {
this.pdfPwd = pdfPwd;
}
public Integer getDpi() {
return dpi;
}
public void setDpi(Integer dpi) {
this.dpi = dpi;
}
public Integer getPageStart() {
return pageStart;
}
public void setPageStart(Integer pageStart) {
this.pageStart = pageStart;
}
public Integer getPageCount() {
return pageCount;
}
public void setPageCount(Integer pageCount) {
this.pageCount = pageCount;
}
public Boolean getApplyDocumentTree() {
return applyDocumentTree;
}
public void setApplyDocumentTree(Boolean applyDocumentTree) {
this.applyDocumentTree = applyDocumentTree;
}
public String getMarkdownDetails() {
return markdownDetails;
}
public void setMarkdownDetails(String markdownDetails) {
this.markdownDetails = markdownDetails;
}
public String getTableFlavor() {
return tableFlavor;
}
public void setTableFlavor(String tableFlavor) {
this.tableFlavor = tableFlavor;
}
public String getGetImage() {
return getImage;
}
public void setGetImage(String getImage) {
this.getImage = getImage;
}
public String getParseMode() {
return parseMode;
}
public void setParseMode(String parseMode) {
this.parseMode = parseMode;
}
}
package cn.com.poc.thirdparty.resource.textin.entity;
/**
* @author alex.yao
* @date 2025/5/7
*/
public class PdfToMDResult {
}
......@@ -55,6 +55,10 @@ baidu.code.mainLand.signatureId=sms-sign-wqlTsv51668
baidu.code.mainLand.template=sms-tmpl-AnDHlz15911
baidu.code.gangAo.signatureId=sms-sign-FcfPaR54702
baidu.code.gangAo.template=sms-tmpl-GZmkfn63181
#baidu text_diff
baidu.text_diff.client_id=ugOntUL9xGeePxI2IFlRO9IO
baidu.text_diff.client_secret=YZqMbOZMe9qnaj1ts2DP59xjfOWvKpDU
#tencent
tencent.speech.synthesizer.appid=1251105573
tencent.speech.synthesizer.secretId=AKIDAGE2Y1KWTGTTKZ5d5KTO5XzNdnpfOxPL
......
package cn.com.poc.thirdparty.resource.demand.ai.function;
import cn.com.poc.thirdparty.resource.demand.ai.function.extraction.ContractExtractionFunction;
import cn.com.poc.thirdparty.resource.textin.api.TextInClient;
import cn.com.poc.thirdparty.resource.text_in.api.TextInClient;
import cn.com.yict.framemax.core.spring.SingleContextInitializer;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment