解决冲突

This commit is contained in:
wulin 2025-03-23 19:46:53 +08:00
commit b44d06c43d
13 changed files with 635 additions and 6 deletions

View File

@ -1,11 +1,11 @@
package com.heyu.api.baidu.handle.financial;
import com.heyu.api.data.annotation.CustomPath;
import com.heyu.api.data.utils.StringUtils;
import com.heyu.api.baidu.BaiduBaseHandle;
import com.heyu.api.baidu.request.financial.BAirTicketRequest;
import com.heyu.api.baidu.response.financial.BAirTicketResp;
import com.heyu.api.data.annotation.CustomPath;
import com.heyu.api.data.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

View File

@ -12,7 +12,6 @@ import java.util.List;
* https://console.bce.baidu.com/support/?_=1740575657628&timestamp=1740583045120#/api?product=AI&project=%E6%96%87%E5%AD%97%E8%AF%86%E5%88%AB&parent=%E6%95%99%E8%82%B2%E5%9C%BA%E6%99%AFOCR&api=rest%2F2.0%2Focr%2Fv1%2Fdoc_analysis&method=post
*
*试卷分析与识别
*
*/
@NoArgsConstructor
@Data

View File

@ -52,7 +52,7 @@ public class BMultiAirTicketResp extends BAirTicketResp {
@JsonProperty("issued_date")
private List<IssuedDateDTO> issuedDate;
@JsonProperty("other_tax")
private List<?> otherTax;
private List<String> otherTax;
@JsonProperty("id_num")
private List<IdNumDTO> idNum;
@JsonProperty("destination_station")

View File

@ -37,7 +37,7 @@ public class RemoveHandwritingController extends BaseController {
@Autowired
private BRemoveHandwritingHandle bRemoveHandwritingHandle;
@RequestMapping("/repair2")
@RequestMapping("/removeHandwriting")
@CacheResult
public R repair(BRemoveHandwritingRequest request) {

View File

@ -34,7 +34,7 @@ public class RemoveMoireController {
private BRemoveMoireHandle bRemoveMoireHandle;
@RequestMapping("/repair1")
@RequestMapping("/removeMoire")
@CacheResult
public R repair(BRemoveMoireRequest request) {

View File

@ -0,0 +1,90 @@
package com.heyu.api.controller.educational;
import com.heyu.api.baidu.handle.educational.BDocAnalysisHandle;
import com.heyu.api.baidu.request.educational.BDocAnalysisRequest;
import com.heyu.api.baidu.response.educational.BDocAnalysisResp;
import com.heyu.api.data.annotation.CacheResult;
import com.heyu.api.data.annotation.NotIntercept;
import com.heyu.api.data.utils.ApiR;
import com.heyu.api.data.utils.R;
import com.heyu.api.resp.doc.DocAnalysisResp;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
/***
* https://console.bce.baidu.com/support/?_=1740575657628&timestamp=1742719522919#/api?product=AI&project=%E6%96%87%E5%AD%97%E8%AF%86%E5%88%AB&parent=%E6%95%99%E8%82%B2%E5%9C%BA%E6%99%AFOCR&api=rest%2F2.0%2Focr%2Fv1%2Fdoc_analysis&method=post
*
* 试卷分析与识别
*
*
* 接口描述
* 可对文档版面进行分析输出图标题文本的位置并输出分版块内容的OCR识别结果支持中英两种语言手写印刷体混排多种场景支持公式识别手写竖式识别
*
*/
@Slf4j
@RestController
@RequestMapping("/doc")
@NotIntercept
public class DocAnalysisController {
@Autowired
private BDocAnalysisHandle bDocAnalysisHandle;
@RequestMapping("/analysis")
@CacheResult
public R analysis(BDocAnalysisRequest request) {
DocAnalysisResp resp = new DocAnalysisResp();
ApiR<BDocAnalysisResp> bR = bDocAnalysisHandle.handle(request);
if (bR.isSuccess()) {
BDocAnalysisResp bDocAnalysisResp = bR.getData();
resp.setResultsNum(bDocAnalysisResp.getResultsNum());
resp.setLayoutsNum(bDocAnalysisResp.getLayoutsNum());
resp.setImgDirection(bDocAnalysisResp.getImgDirection());
List<DocAnalysisResp.ResultsDTO> resultsDTOList = new ArrayList<>();
if (CollectionUtils.isNotEmpty(bDocAnalysisResp.getResults())) {
for (BDocAnalysisResp.ResultsDTO result : bDocAnalysisResp.getResults()) {
DocAnalysisResp.ResultsDTO resultsDTO = new DocAnalysisResp.ResultsDTO();
resultsDTO.setWordsType(result.getWordsType());
resultsDTO.setWords(result.getWordsType());
resultsDTOList.add(resultsDTO);
}
}
resp.setResults(resultsDTOList);
if (CollectionUtils.isNotEmpty(resp.getFormWords())) {
List<String> formWords = new ArrayList<>();
for (String formWord : resp.getFormWords()) {
formWords.add(formWord);
}
resp.setFormWords(formWords);
}
if (CollectionUtils.isNotEmpty(resp.getWords())) {
List<String> words = new ArrayList<>();
for (String word : resp.getWords()) {
words.add(word);
}
resp.setWords(words);
}
}
return R.error();
}
}

View File

@ -0,0 +1,77 @@
package com.heyu.api.controller.educational;
import com.heyu.api.baidu.handle.educational.BPenHandle;
import com.heyu.api.baidu.request.educational.BPenRequest;
import com.heyu.api.baidu.response.educational.BPenResp;
import com.heyu.api.controller.BaseController;
import com.heyu.api.data.annotation.CacheResult;
import com.heyu.api.data.annotation.NotIntercept;
import com.heyu.api.data.utils.ApiR;
import com.heyu.api.data.utils.R;
import com.heyu.api.resp.doc.PenResp;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
/***
*
*
* https://console.bce.baidu.com/support/?_=1740575657628&timestamp=1742720986912#/api?product=AI&project=%E6%96%87%E5%AD%97%E8%AF%86%E5%88%AB&parent=%E6%95%99%E8%82%B2%E5%9C%BA%E6%99%AFOCR&api=rest%2F2.0%2Focr%2Fv1%2Fpen&method=post
*
*
* 词典笔文字识别
*
*
*
接口描述
面向词典笔应用场景是词典笔的基本功能之一主要用于扫描文字并识别为字词查询和翻译提供文本信息支撑支持中英文识别印刷手写混排识别满足多种复杂背景下的文字扫描识别
*/
@Slf4j
@RestController
@RequestMapping("/doc")
@NotIntercept
public class PenController extends BaseController {
@Autowired
private BPenHandle bPenHandle;
@RequestMapping("/pen")
@CacheResult
public R pen(BPenRequest request) {
List<PenResp> respList = new ArrayList<>();
ApiR<BPenResp> bR = bPenHandle.handle(request);
if (bR.isSuccess()) {
BPenResp bPenResp = bR.getData();
for (BPenResp.WordsResultDTO wordsResultDTO : bPenResp.getWordsResult()) {
PenResp penResp = new PenResp();
penResp.setWords(wordsResultDTO.getWords());
PenResp.ProbabilityDTO probabilityDTO = new PenResp.ProbabilityDTO();
BPenResp.WordsResultDTO.ProbabilityDTO probability = wordsResultDTO.getProbability();
probabilityDTO.setAverage(probability.getAverage());
probabilityDTO.setVariance(probability.getVariance());
probabilityDTO.setMin(probability.getMin());
penResp.setProbability(probabilityDTO);
}
return R.ok().setData(respList);
}
return R.error(bR.getErrorMsg());
}
}

View File

@ -0,0 +1,227 @@
package com.heyu.api.controller.financial;
import com.heyu.api.baidu.handle.financial.BAirTicketHandle;
import com.heyu.api.baidu.request.financial.BAirTicketRequest;
import com.heyu.api.baidu.response.financial.BAirTicketResp;
import com.heyu.api.baidu.response.financial.BMultiAirTicketResp;
import com.heyu.api.controller.BaseController;
import com.heyu.api.data.annotation.CacheResult;
import com.heyu.api.data.annotation.NotIntercept;
import com.heyu.api.data.utils.ApiR;
import com.heyu.api.data.utils.R;
import com.heyu.api.resp.financial.AirTicketMultiResp;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
/**
* https://console.bce.baidu.com/support/?_=1740575657628&timestamp=1740577959399#/api?product=AI&project=%E6%96%87%E5%AD%97%E8%AF%86%E5%88%AB&parent=%E8%B4%A2%E5%8A%A1%E7%A5%A8%E6%8D%AEOCR&api=rest%2F2.0%2Focr%2Fv1%2Fair_ticket&method=post
* <p>
* 飞机行程单识别
* <p>
* <p>
* 接口描述
* 支持对飞机行程单的24个字段进行结构化识别包括电子客票号印刷序号姓名始发站目的站航班号日期时间票价身份证号承运人民航发展基金
* 保险费燃油附加费其他税费合计金额填开日期订票渠道客票级别座位等级销售单位号签注免费行李验证码 同时支持单张行程单上的多航班信
* 息识别
*/
@Slf4j
@RestController
@RequestMapping("/air/ticket/multi")
@NotIntercept
public class AirTicketMultiController extends BaseController {
@Autowired
private BAirTicketHandle bAirTicketHandle;
@RequestMapping("/recognize")
@CacheResult
public R recognize(BAirTicketRequest req) {
AirTicketMultiResp resp = new AirTicketMultiResp();
req.setMultiDetect("true");
ApiR<BAirTicketResp> bR = bAirTicketHandle.handle(req, BMultiAirTicketResp.class);
if (bR.isSuccess()) {
BMultiAirTicketResp bAirTicketResp = (BMultiAirTicketResp) bR.getData();
BMultiAirTicketResp.WordsResultDTO wordsResultDTO = bAirTicketResp.getWordsResult();
List<String> insurance = new ArrayList<>();
if (CollectionUtils.isNotEmpty(wordsResultDTO.getInsurance())) {
for (BMultiAirTicketResp.WordsResultDTO.InsuranceDTO insuranceDTO : wordsResultDTO.getInsurance()) {
insurance.add(insuranceDTO.getWord());
}
}
resp.setInsurance(insurance);
List<String> date = new ArrayList<>();
if (CollectionUtils.isNotEmpty(wordsResultDTO.getDate())) {
for (BMultiAirTicketResp.WordsResultDTO.DateDTO dateDTO : wordsResultDTO.getDate()) {
date.add(dateDTO.getWord());
}
}
resp.setDate(date);
List<String> flight = new ArrayList<>();
if (CollectionUtils.isNotEmpty(wordsResultDTO.getFlight())) {
for (BMultiAirTicketResp.WordsResultDTO.FlightDTO flightDTO : wordsResultDTO.getFlight()) {
flight.add(flightDTO.getWord());
}
}
resp.setFlight(flight);
List<String> issuedBy = new ArrayList<>();
if (CollectionUtils.isNotEmpty(wordsResultDTO.getIssuedBy())) {
for (BMultiAirTicketResp.WordsResultDTO.IssuedByDTO issuedByDTO : wordsResultDTO.getIssuedBy()) {
issuedBy.add(issuedByDTO.getWord());
}
}
resp.setIssuedBy(issuedBy);
List<String> startingStation = new ArrayList<>();
if (CollectionUtils.isNotEmpty(wordsResultDTO.getStartingStation())) {
for (BMultiAirTicketResp.WordsResultDTO.StartingStationDTO startingStationDTO : wordsResultDTO.getStartingStation()) {
startingStation.add(startingStationDTO.getWord());
}
}
resp.setStartingStation(startingStation);
List<String> fare = new ArrayList<>();
if (CollectionUtils.isNotEmpty(wordsResultDTO.getFare())) {
for (BMultiAirTicketResp.WordsResultDTO.FareDTO fareDTO : wordsResultDTO.getFare()) {
fare.add(fareDTO.getWord());
}
}
resp.setFare(fare);
List<String> ticketRates = new ArrayList<>();
if (CollectionUtils.isNotEmpty(wordsResultDTO.getTicketRates())) {
for (BMultiAirTicketResp.WordsResultDTO.TicketRatesDTO ticketRate : wordsResultDTO.getTicketRates()) {
ticketRates.add(ticketRate.getWord());
}
}
resp.setTicketRates(ticketRates);
List<String> serialNumber = new ArrayList<>();
if (CollectionUtils.isNotEmpty(wordsResultDTO.getSerialNumber())) {
for (BMultiAirTicketResp.WordsResultDTO.SerialNumberDTO serialNumberDTO : wordsResultDTO.getSerialNumber()) {
serialNumber.add(serialNumberDTO.getWord());
}
}
resp.setSerialNumber(serialNumber);
List<String> ticketNumber = new ArrayList<>();
if (CollectionUtils.isNotEmpty(wordsResultDTO.getTicketNumber())) {
for (BMultiAirTicketResp.WordsResultDTO.TicketNumberDTO ticketNumberDTO : wordsResultDTO.getTicketNumber()) {
ticketNumber.add(ticketNumberDTO.getWord());
}
}
resp.setTicketNumber(ticketNumber);
List<String> fuelSurcharge = new ArrayList<>();
if (CollectionUtils.isNotEmpty(wordsResultDTO.getFuelSurcharge())) {
for (BMultiAirTicketResp.WordsResultDTO.FuelSurchargeDTO fuelSurchargeDTO : wordsResultDTO.getFuelSurcharge()) {
fuelSurcharge.add(fuelSurchargeDTO.getWord());
}
}
resp.setFuelSurcharge(fuelSurcharge);
List<String> carrier = new ArrayList<>();
if (CollectionUtils.isNotEmpty(wordsResultDTO.getCarrier())) {
for (BMultiAirTicketResp.WordsResultDTO.CarrierDTO carrierDTO : wordsResultDTO.getCarrier()) {
carrier.add(carrierDTO.getWord());
}
}
resp.setCarrier(carrier);
List<String> issuedDate = new ArrayList<>();
if (CollectionUtils.isNotEmpty(wordsResultDTO.getIssuedDate())) {
for (BMultiAirTicketResp.WordsResultDTO.IssuedDateDTO issuedDateDTO : wordsResultDTO.getIssuedDate()) {
issuedDate.add(issuedDateDTO.getWord());
}
}
resp.setIssuedDate(issuedDate);
List<String> otherTax = new ArrayList<>();
if (CollectionUtils.isNotEmpty(wordsResultDTO.getOtherTax())) {
for (String tax : wordsResultDTO.getOtherTax()) {
otherTax.add(tax);
}
}
resp.setOtherTax(otherTax);
List<String> idNum = new ArrayList<>();
if (CollectionUtils.isNotEmpty(wordsResultDTO.getIdNum())) {
for (BMultiAirTicketResp.WordsResultDTO.IdNumDTO idNumDTO : wordsResultDTO.getIdNum()) {
idNum.add(idNumDTO.getWord());
}
}
resp.setIdNum(idNum);
List<String> destinationStation = new ArrayList<>();
if (CollectionUtils.isNotEmpty(wordsResultDTO.getDestinationStation())) {
for (BMultiAirTicketResp.WordsResultDTO.DestinationStationDTO destinationStationDTO : wordsResultDTO.getDestinationStation()) {
destinationStation.add(destinationStationDTO.getWord());
}
}
resp.setDestinationStation(destinationStation);
List<String> name = new ArrayList<>();
if (CollectionUtils.isNotEmpty(wordsResultDTO.getName())) {
for (BMultiAirTicketResp.WordsResultDTO.NameDTO nameDTO : wordsResultDTO.getName()) {
name.add(nameDTO.getWord());
}
}
resp.setName(name);
List<String> time = new ArrayList<>();
if (CollectionUtils.isNotEmpty(wordsResultDTO.getTime())) {
for (BMultiAirTicketResp.WordsResultDTO.TimeDTO timeDTO : wordsResultDTO.getTime()) {
time.add(timeDTO.getWord());
}
}
resp.setTime(time);
return R.ok().setData(resp);
}
return R.error();
}
}

View File

@ -0,0 +1,87 @@
package com.heyu.api.controller.financial;
import com.heyu.api.baidu.handle.financial.BAirTicketHandle;
import com.heyu.api.baidu.request.financial.BAirTicketRequest;
import com.heyu.api.baidu.response.financial.BAirTicketResp;
import com.heyu.api.baidu.response.financial.BSingleAirTicketResp;
import com.heyu.api.controller.BaseController;
import com.heyu.api.data.annotation.CacheResult;
import com.heyu.api.data.annotation.NotIntercept;
import com.heyu.api.data.utils.ApiR;
import com.heyu.api.data.utils.R;
import com.heyu.api.resp.financial.AirTicketSingleResp;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* https://console.bce.baidu.com/support/?_=1740575657628&timestamp=1740577959399#/api?product=AI&project=%E6%96%87%E5%AD%97%E8%AF%86%E5%88%AB&parent=%E8%B4%A2%E5%8A%A1%E7%A5%A8%E6%8D%AEOCR&api=rest%2F2.0%2Focr%2Fv1%2Fair_ticket&method=post
* <p>
* 飞机行程单识别
* <p>
* <p>
* 接口描述
* 支持对飞机行程单的24个字段进行结构化识别包括电子客票号印刷序号姓名始发站目的站航班号日期时间票价身份证号承运人民航发展基金
* 保险费燃油附加费其他税费合计金额填开日期订票渠道客票级别座位等级销售单位号签注免费行李验证码 同时支持单张行程单上的多航班信
* 息识别
*/
@Slf4j
@RestController
@RequestMapping("/air/ticket/single")
@NotIntercept
public class AirTicketSingleController extends BaseController {
@Autowired
private BAirTicketHandle bAirTicketHandle;
@RequestMapping("/recognize")
@CacheResult
public R recognize(BAirTicketRequest req) {
AirTicketSingleResp resp = new AirTicketSingleResp();
req.setMultiDetect("false");
ApiR<BAirTicketResp> bR = bAirTicketHandle.handle(req, BSingleAirTicketResp.class);
if (bR.isSuccess()) {
BSingleAirTicketResp bAirTicketResp = (BSingleAirTicketResp) bR.getData();
BSingleAirTicketResp.WordsResultDTO wordsResultDTO = bAirTicketResp.getWordsResult();
resp.setInsurance(wordsResultDTO.getInsurance()); // 保险费
resp.setDate(wordsResultDTO.getDate()); // 日期
resp.setAllow(wordsResultDTO.getAllow()); //免费行李
resp.setFlight(wordsResultDTO.getFlight()); // 航班号
resp.setIssuedBy(wordsResultDTO.getIssuedBy()); //订票渠道
resp.setStartingStation(wordsResultDTO.getStartingStation()); // 始发站
resp.setFare(wordsResultDTO.getFare()); //票价
resp.setEndorsement(wordsResultDTO.getEndorsement()); // 签注
resp.setTicketRates(wordsResultDTO.getTicketRates()); // 合计金额
resp.setCk(wordsResultDTO.getCk()); //验证码
resp.setSerialNumber(wordsResultDTO.getSerialNumber()); // 印刷序号
resp.setTicketNumber(wordsResultDTO.getTicketNumber()); // 电子客票号码
resp.setFuelSurcharge(wordsResultDTO.getFuelSurcharge()); // 燃油附加费
resp.setCarrier(wordsResultDTO.getCarrier()); // 承运人
resp.setIssuedDate(wordsResultDTO.getIssuedDate()); //填开日期
resp.setOtherTax(wordsResultDTO.getOtherTax()); // 其他税费
resp.setFareBasis(wordsResultDTO.getFareBasis()); // 客票级别
resp.setIdNum(wordsResultDTO.getIdNum()); // 身份证号
resp.setDestinationStation(wordsResultDTO.getDestinationStation()); // 目的站
resp.setName(wordsResultDTO.getName()); // 姓名
resp.setAgentCode(wordsResultDTO.getAgentCode()); // 销售单位号
resp.setTime(wordsResultDTO.getTime()); // 时间
resp.setClassX(wordsResultDTO.getClassX()); // 座位等级
resp.setDevFund(wordsResultDTO.getDevFund()); // 民航发展基金/基建费
return R.ok().setData(resp);
}
return R.error();
}
}

View File

@ -0,0 +1,38 @@
package com.heyu.api.resp.doc;
import com.heyu.api.data.dto.BaseResp;
import lombok.Data;
import java.util.List;
@Data
public class DocAnalysisResp extends BaseResp {
private Integer resultsNum; // 识别结果数表示results的元素个数
private Integer imgDirection; // detect_direction=true 时返回检测到的图像朝向0 正向 1逆时针旋转90度2逆时针旋转180度3逆时针旋转270度
private Integer layoutsNum; // 版面分析结果数表示layout的元素个数
private List<ResultsDTO> results; // 识别结果数组
private List<String> formWords; // 识别结果中的公式数组包括公式位置和公式内容recg_formula=true时返回
private List<String> words; // 将普通文字和公式融合后的识别结果数组recg_formula=true时返回
@Data
public static class ResultsDTO {
/**
* 文字类型
* 默认印刷文字识别
* = handwring_only手写文字识别
* = handprint_mix 手写印刷混排识别
*/
private String wordsType;
/***
* 文字
*/
private String words;
}
}

View File

@ -0,0 +1,24 @@
package com.heyu.api.resp.doc;
import com.heyu.api.data.dto.BaseResp;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
public class PenResp extends BaseResp {
private ProbabilityDTO probability;
// 识别结果字符串
private String words;
@NoArgsConstructor
@Data
public static class ProbabilityDTO {
// 识别结果中每一行的置信度值包含average行置信度平均值variance行置信度方差min行置信度最小值 probability=true 时返回该字段
private Double average;
private Double min;
private Double variance;
}
}

View File

@ -0,0 +1,51 @@
package com.heyu.api.resp.financial;
import com.heyu.api.data.dto.BaseResp;
import lombok.Data;
import java.util.List;
@Data
public class AirTicketMultiResp extends BaseResp {
private List<String> insurance;
private List<String> date;
private List<String> flight;
private List<String> issuedBy;
private List<String> startingStation;
private List<String > fare;
private List<String> ticketRates;
private List<String> serialNumber;
private List<String> ticketNumber;
private List<String> fuelSurcharge;
private List<String> carrier;
private List<String> issuedDate;
private List<?> otherTax;
private List<String> idNum;
private List<String> destinationStation;
private List<String> name;
private List<String> time;
private List<String> devFund;
}

View File

@ -0,0 +1,36 @@
package com.heyu.api.resp.financial;
import com.heyu.api.data.dto.BaseResp;
import lombok.Data;
@Data
public class AirTicketSingleResp extends BaseResp {
private String insurance; // 保险费
private String date; // 日期
private String allow; //免费行李
private String flight; // 航班号
private String issuedBy; //订票渠道
private String startingStation; // 始发站
private String fare; //票价
private String endorsement; // 签注
private String ticketRates; // 合计金额
private String ck; //验证码
private String serialNumber; // 印刷序号
private String ticketNumber; // 电子客票号码
private String fuelSurcharge; // 燃油附加费
private String carrier; // 承运人
private String issuedDate; //填开日期
private String otherTax; // 其他税费
private String fareBasis; // 客票级别
private String idNum; // 身份证号
private String destinationStation; // 目的站
private String name; // 姓名
private String agentCode; // 销售单位号
private String time; // 时间
private String classX; // 座位等级
private String devFund; // 民航发展基金/基建费
}