feature 1.提交OCR识别的代码

release
zhenghaiyang@ele-cloud.com 2 years ago
parent c7c08817e6
commit 13355ac73b
  1. 4
      dxhy-common/pom.xml
  2. 25
      dxhy-common/src/main/java/com/dxhy/common/util/FileUtil.java
  3. 312
      dxhy-core/src/main/java/com/dxhy/core/service/openservice/impl/OpenServicePlatformServiceImpl.java
  4. 36
      dxhy-core/src/main/java/com/dxhy/core/service/openservice/model/ocr/OcrDataListEntity.java
  5. 197
      dxhy-core/src/main/java/com/dxhy/core/service/openservice/model/ocr/OcrDataTypeEnum.java
  6. 13
      dxhy-core/src/main/java/com/dxhy/core/service/openservice/model/ocr/OcrItemListEntity.java
  7. 12
      dxhy-core/src/main/java/com/dxhy/core/service/openservice/model/ocr/OcrProductListEntity.java
  8. 15
      dxhy-core/src/main/java/com/dxhy/core/service/openservice/model/ocr/OcrResponseVo.java
  9. 14
      dxhy-core/src/main/java/com/dxhy/core/service/openservice/model/ocr/OcrResultEntity.java

@ -169,6 +169,10 @@
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
</dependency>
</dependencies>
<build>
<plugins>

@ -1,8 +1,16 @@
package com.dxhy.common.util;
import java.io.*;
import java.nio.charset.Charset;
import cn.hutool.core.codec.Base64;
import org.apache.commons.io.IOUtils;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
/**
* @author jiaohongyang
@ -163,4 +171,21 @@ public class FileUtil {
return base64;
}
//新增文件上传接口
public static String uploadFile(String url, String fileStream) {
HttpPost httpPost = new HttpPost(url);
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.addBinaryBody("file",fileStream.getBytes(Charset.forName("UTF-8")));
HttpEntity multipart = builder.build();
httpPost.setEntity(multipart);
String result = "";
try {
CloseableHttpResponse response = HttpClients.createDefault().execute(httpPost);
InputStream content = response.getEntity().getContent();
result = IOUtils.toString(content, "utf-8");
} catch (IOException e) {
throw new RuntimeException(e);
}
return result;
}
}

@ -1,12 +1,16 @@
package com.dxhy.core.service.openservice.impl;
import java.util.Date;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
import java.io.*;
import java.util.*;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import cn.hutool.core.codec.Base64Decoder;
import com.dxhy.common.util.FileUtil;
import com.dxhy.core.service.openservice.model.ocr.*;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
@ -57,6 +61,8 @@ public class OpenServicePlatformServiceImpl implements IOpenServicePlatformServi
private String ocrTaxno;
@Value("${openService.ocrUrl:}")
private String ocrUrl;
@Value("${sn.ocrUrl:}")
private String snOcrUrl;
@Resource
private MakeAppSecService makeAppSecService;
@ -154,38 +160,276 @@ public class OpenServicePlatformServiceImpl implements IOpenServicePlatformServi
@Override
public List<OpenServiceOcr> ocrInvoice(String picture, String userName, String password, String taxno) {
return OcrToSn(picture);
// String sendDate = DateUtil.format(new Date(), DatePattern.PURE_DATETIME_PATTERN);
// String signStr = "username=%s&sendDate=%s&version=%s";
// String version = "1.0";
// if (StringUtils.isBlank(userName) || StringUtils.isBlank(password) || StringUtils.isBlank(taxno)) {
// userName = ocrUserName;
// password = ocrPassword;
// taxno = ocrTaxno;
// }
// signStr = String.format(signStr, userName, sendDate, version);
// JSONObject dataJson = new JSONObject();
// dataJson.put("taxno", taxno);
// dataJson.put("picture", picture);
// JSONObject json = new JSONObject();
// json.put("username", userName);
// json.put("password", password);
// json.put("sendDate", sendDate);
// json.put("signature", makeAppSecService.getSign(signStr, password));
// json.put("version", version);
// log.info("请求报文,去除picture:{} , picture是否有值:{}", json.toJSONString(), StringUtils.isNotBlank(picture));
// json.put("data", Base64.encode(dataJson.toString()));
//
// String post = HttpUtil.post(ocrUrl, json.toString(), 60000);
// log.info("ocr识别结果:{}", post);
// JSONObject jsonObject = JSONObject.parseObject(post, JSONObject.class);
// String returnCode = jsonObject.getString("returnCode");
//
// if (!"0000".equals(returnCode)) {
// return null;
// }
//
// String decodeStr = Base64.decodeStr(jsonObject.getString("data"));
// return JSONObject.parseArray(decodeStr, OpenServiceOcr.class);
}
String sendDate = DateUtil.format(new Date(), DatePattern.PURE_DATETIME_PATTERN);
String signStr = "username=%s&sendDate=%s&version=%s";
String version = "1.0";
if (StringUtils.isBlank(userName) || StringUtils.isBlank(password) || StringUtils.isBlank(taxno)) {
userName = ocrUserName;
password = ocrPassword;
taxno = ocrTaxno;
}
signStr = String.format(signStr, userName, sendDate, version);
JSONObject dataJson = new JSONObject();
dataJson.put("taxno", taxno);
dataJson.put("picture", picture);
JSONObject json = new JSONObject();
json.put("username", userName);
json.put("password", password);
json.put("sendDate", sendDate);
json.put("signature", makeAppSecService.getSign(signStr, password));
json.put("version", version);
log.info("请求报文,去除picture:{} , picture是否有值:{}", json.toJSONString(), StringUtils.isNotBlank(picture));
json.put("data", Base64.encode(dataJson.toString()));
String post = HttpUtil.post(ocrUrl, json.toString(), 60000);
log.info("ocr识别结果:{}", post);
JSONObject jsonObject = JSONObject.parseObject(post, JSONObject.class);
String returnCode = jsonObject.getString("returnCode");
if (!"0000".equals(returnCode)) {
return null;
/**
* Ocr识别使用山能
* @param picture 文件流
* @return
*/
public List<OpenServiceOcr> OcrToSn(String picture){
//判断是否为图片流文件, 兼容公司平台进行base64解密
String str = Base64Decoder.decodeStr(picture);
String requestUrl = snOcrUrl;
String result = FileUtil.uploadFile(requestUrl, str);
if(StringUtils.isBlank(result)){
log.info("调用山能ocr识别失败");
}else {
OcrResponseVo ocrResponseVo = JSONObject.parseObject(result, OcrResponseVo.class);
if(ocrResponseVo != null && ocrResponseVo.getCode() == 200){
List<OcrDataListEntity> ocrDataListEntities = ocrResponseVo.getResult().getObjectList();
return dxOcrConvertSnOcr(ocrDataListEntities);
}
}
return null;
}
//实现实体类转换
public List<OpenServiceOcr> dxOcrConvertSnOcr(List<OcrDataListEntity> ocrDataListEntities){
List<OpenServiceOcr> openServices = Lists.newArrayList();
for (OcrDataListEntity ocrDataListEntity : ocrDataListEntities) {
OpenServiceOcr serviceOcr = new OpenServiceOcr();
List<List<OcrProductListEntity>> productList = ocrDataListEntity.getProductList();
List<OcrItemListEntity> itemList = ocrDataListEntity.getItemList();
Map<String, String> itemData = itemList.stream().collect(Collectors.toMap(OcrItemListEntity::getKey, OcrItemListEntity::getValue));
OpenServiceOcr openServiceOcr = new OpenServiceOcr();
String type = ocrDataListEntity.getType();
//type 为 vat_special_invoice(增值税专用发票)、vat_electronic_invoice(增
//值税电子普通发票)、vat_common_invoice(增值税普通发票)、
//vat_electronic_toll_invoice(增值税电子普通发票(通行费))
//type 为 motor_vehicle_sale_invoice(机动车销售统一发票)
//type 为 used_car_purchase_invoice(二手车销售统一发票)
//type 为 vat_roll_invoice(增值税普通发票(卷票))
//type 为 vehicle_toll(过路过桥费发票、汽车通行费)
//type 为 quota_invoice(通用定额发票)
//type 为 taxi_ticket(出租车发票)
//type 为 air_transport(行程单)
//type 为 train_ticket(火车票)
//type 为 general_machine_invoice(通用机打发票)、 highway_passenger_invoice(公路客运发票)、shipping_invoice(船运客票)、passenger_transport_invoice(旅客运输普票)
//type 为 parking_invoice(停车费发票)
openServiceOcr.setFPLXDM(itemData.get(OcrDataTypeEnum.VAT_INVOICE_TYPE.getKey()));
// openServiceOcr.setXZJD(itemData.get(OcrDataTypeEnum.VAT_INVOICE_TYPE.getKey()));
OpenServiceOcr.InvoiceOcrData invoiceOcrData = new OpenServiceOcr.InvoiceOcrData();
invoiceOcrData.setSFCY("0"); //是否查验
//判断发票类型
if("vat_special_invoice".equals(type) || "vat_electronic_invoice".equals(type) || "vat_common_invoice".equals(type) || "vat_electronic_toll_invoice".equals(type)){
invoiceOcrData.setJYM(itemData.get(OcrDataTypeEnum.VAT_INVOICE_CORRECT_CODE.getKey()));
invoiceOcrData.setFPDM(itemData.get(OcrDataTypeEnum.VAT_INVOICE_DAIMA.getKey()));
invoiceOcrData.setFPHM(itemData.get(OcrDataTypeEnum.VAT_INVOICE_HAOMA.getKey()));
invoiceOcrData.setKPRQ(itemData.get(OcrDataTypeEnum.VAT_INVOICE_ISSUE_DATE.getKey()));
invoiceOcrData.setGMFSBH(itemData.get(OcrDataTypeEnum.VAT_INVOICE_RATE_PAYER_ID.getKey()));
String decodeStr = Base64.decodeStr(jsonObject.getString("data"));
return JSONObject.parseArray(decodeStr, OpenServiceOcr.class);
invoiceOcrData.setJDHM(itemData.get(OcrDataTypeEnum.VAT_INVOICE_JIDA_HAOMA.getKey()));
invoiceOcrData.setXHFMC(itemData.get(OcrDataTypeEnum.VAT_INVOICE_SELLER_NAME.getKey()));
invoiceOcrData.setXHFSBH(itemData.get(OcrDataTypeEnum.VAT_INVOICE_SELLER_ID.getKey()));
invoiceOcrData.setXHFDZDH(itemData.get(OcrDataTypeEnum.VAT_INVOICE_SELLER_ADDR_TELL.getKey()));
invoiceOcrData.setXHFYHZH(itemData.get(OcrDataTypeEnum.VAT_INVOICE_SELLER_BANK_ACCOUNT.getKey()));
invoiceOcrData.setGMFMC(itemData.get(OcrDataTypeEnum.VAT_INVOICE_PAYER_NAME.getKey()));
invoiceOcrData.setGMFDZDH(itemData.get(OcrDataTypeEnum.VAT_INVOICE_PAYER_ADDR_TELL.getKey()));
invoiceOcrData.setGMFYHZH(itemData.get(OcrDataTypeEnum.VAT_INVOICE_PAYER_BANK_ACCOUNT.getKey()));
invoiceOcrData.setHJJE(itemData.get(OcrDataTypeEnum.VAT_INVOICE_PRICE_LIST.getKey()));
//是否代开 vat_invoice_zhuan_yong_flag TODO
invoiceOcrData.setSFDK(itemData.get(OcrDataTypeEnum.VAT_INVOICE_DAI_KAI_FLAG.getKey()));
invoiceOcrData.setHJSE(itemData.get(OcrDataTypeEnum.VAT_INVOICE_TAX_TOTAL.getKey()));
invoiceOcrData.setJSHJ(itemData.get(OcrDataTypeEnum.VAT_INVOICE_TOTAL_COVER_TAX_DIGITS.getKey()));
invoiceOcrData.setFPLC(itemData.get(OcrDataTypeEnum.VAT_INVOICE_PAGE_NUMBER.getKey()));
openServiceOcr.setFPLXDM(itemData.get(OcrDataTypeEnum.VAT_INVOICE_TYPE.getKey()));
invoiceOcrData.setBZ(itemData.get(OcrDataTypeEnum.VAT_INVOICE_TOTAL_NOTE.getKey()));
invoiceOcrData.setFWM(itemData.get(OcrDataTypeEnum.VAT_INVOICE_CIPHER_FIELD.getKey()));
invoiceOcrData.setSKR(itemData.get(OcrDataTypeEnum.VAT_INVOICE_PAYEE.getKey()));
invoiceOcrData.setFHR(itemData.get(OcrDataTypeEnum.VAT_INVOICE_REVIEW.getKey()));
invoiceOcrData.setKPR(itemData.get(OcrDataTypeEnum.VAT_INVOICE_DRAWER.getKey()));
invoiceOcrData.setSFYGSYZ("False".equals(itemData.get(OcrDataTypeEnum.EXIST_STAMPLE.getKey()))?"0":"1");
List<OpenServiceOcr.InvoiceOcrDetail> invoiceOcrDetailList = Lists.newArrayList();
for (List<OcrProductListEntity> productListEntities : productList) {
OpenServiceOcr.InvoiceOcrDetail invoiceOcrDetail = new OpenServiceOcr.InvoiceOcrDetail();
// invoiceOcrDetail.setMXXH(itemData.get(OcrDataTypeEnum.VAT_INVOICE_TYPE.getKey()));
invoiceOcrDetail.setHWMC(itemData.get(OcrDataTypeEnum.VAT_INVOICE_GOODS.getKey()));
invoiceOcrDetail.setGGXH(itemData.get(OcrDataTypeEnum.VAT_INVOICE_PLATE_SPECIFIC.getKey()));
invoiceOcrDetail.setDW(itemData.get(OcrDataTypeEnum.VAT_INVOICE_ELECTRANS_UNIT.getKey()));
invoiceOcrDetail.setSPSL(itemData.get(OcrDataTypeEnum.VAT_INVOICE_ELECTRANS_QUANTITY.getKey()));
invoiceOcrDetail.setDJ(itemData.get(OcrDataTypeEnum.VAT_INVOICE_ELECTRANS_UNIT_PRICE.getKey()));
invoiceOcrDetail.setJE(itemData.get(OcrDataTypeEnum.VAT_INVOICE_PRICE.getKey()));
invoiceOcrDetail.setSL(itemData.get(OcrDataTypeEnum.VAT_INVOICE_TAX_RATE.getKey()));
invoiceOcrDetail.setSE(itemData.get(OcrDataTypeEnum.VAT_INVOICE_TAX.getKey()));
invoiceOcrDetailList.add(invoiceOcrDetail);
invoiceOcrData.setFPMX(invoiceOcrDetailList);
}
} else if ("vat_roll_invoice".equals(type)) {
invoiceOcrData.setKPRQ(itemData.get(OcrDataTypeEnum.DATE_OF_INVOICE.getKey()));
invoiceOcrData.setFPBT(itemData.get(OcrDataTypeEnum.INVOICE_HEAD.getKey()));
invoiceOcrData.setJYM(itemData.get(OcrDataTypeEnum.CHECK_NUMBER.getKey()));
invoiceOcrData.setFPDM(itemData.get(OcrDataTypeEnum.INVOICE_NUMBER.getKey()));
invoiceOcrData.setFPHM(itemData.get(OcrDataTypeEnum.INVOICE_NUMBER.getKey()));
invoiceOcrData.setJQBM(itemData.get(OcrDataTypeEnum.MACHINE_CODE.getKey()));
invoiceOcrData.setGMFSBH(itemData.get(OcrDataTypeEnum.BUY_TAX_NUMBER.getKey()));
invoiceOcrData.setJSHJ(itemData.get(OcrDataTypeEnum.TOTAL_MONEY.getKey()));
invoiceOcrData.setXHFMC(itemData.get(OcrDataTypeEnum.SOLD_NAME.getKey()));
invoiceOcrData.setXHFSBH(itemData.get(OcrDataTypeEnum.SOLD_TAX_NUMBER.getKey()));
invoiceOcrData.setGMFMC(itemData.get(OcrDataTypeEnum.BUY_NAME.getKey()));
invoiceOcrData.setSKR(itemData.get(OcrDataTypeEnum.CASHIER_NAME.getKey()));
//是否代开 vat_invoice_zhuan_yong_flag TODO
invoiceOcrData.setSFYGSYZ("False".equals(itemData.get(OcrDataTypeEnum.EXIST_STAMPLE.getKey()))?"0":"1");
List<OpenServiceOcr.InvoiceOcrDetail> invoiceOcrDetailList = Lists.newArrayList();
for (List<OcrProductListEntity> productListEntities : productList) {
OpenServiceOcr.InvoiceOcrDetail invoiceOcrDetail = new OpenServiceOcr.InvoiceOcrDetail();
// invoiceOcrDetail.setMXXH(itemData.get(OcrDataTypeEnum.VAT_INVOICE_TYPE.getKey()));
invoiceOcrDetail.setHWMC(itemData.get(OcrDataTypeEnum.VAT_INVOICE_GOODS.getKey()));
invoiceOcrDetail.setGGXH(itemData.get(OcrDataTypeEnum.VAT_INVOICE_PLATE_SPECIFIC.getKey()));
invoiceOcrDetail.setDW(itemData.get(OcrDataTypeEnum.VAT_INVOICE_ELECTRANS_UNIT.getKey()));
invoiceOcrDetail.setSPSL(itemData.get(OcrDataTypeEnum.VAT_INVOICE_ELECTRANS_QUANTITY.getKey()));
invoiceOcrDetail.setDJ(itemData.get(OcrDataTypeEnum.VAT_INVOICE_ELECTRANS_UNIT_PRICE.getKey()));
invoiceOcrDetail.setJE(itemData.get(OcrDataTypeEnum.VAT_INVOICE_PRICE.getKey()));
invoiceOcrDetail.setSL(itemData.get(OcrDataTypeEnum.VAT_INVOICE_TAX_RATE.getKey()));
invoiceOcrDetail.setSE(itemData.get(OcrDataTypeEnum.VAT_INVOICE_TAX.getKey()));
invoiceOcrDetailList.add(invoiceOcrDetail);
invoiceOcrData.setFPMX(invoiceOcrDetailList);
}
} else if ("motor_vehicle_sale_invoice".equals(type)) {
// -------------机动车销售统一发票特殊字段--------------
invoiceOcrData.setGMFMC(itemData.get(OcrDataTypeEnum.VEHICLE_INVOICE_BUYER.getKey()));
invoiceOcrData.setGMFSBH(itemData.get(OcrDataTypeEnum.VEHICLE_INVOICE_BUYER_ID.getKey()));
invoiceOcrData.setCPXH(itemData.get(OcrDataTypeEnum.VEHICLE_INVOICE_CAR_MODEL.getKey()));
invoiceOcrData.setHGZH(itemData.get(OcrDataTypeEnum.VEHICLE_INVOICE_CERT_ID.getKey()));
invoiceOcrData.setFDJHM(itemData.get(OcrDataTypeEnum.VEHICLE_INVOICE_ENGINE_ID.getKey()));
invoiceOcrData.setCLSBH(itemData.get(OcrDataTypeEnum.VEHICLE_INVOICE_CAR_VIN.getKey()));
invoiceOcrData.setHJJE(itemData.get(OcrDataTypeEnum.VEHICLE_INVOICE_PRICE_WITHOUT_TAX.getKey()));
invoiceOcrData.setZGSWJG(itemData.get(OcrDataTypeEnum.VEHICLE_INVOICE_TAX_AUTHORITH.getKey()));
invoiceOcrData.setZGSWJGDM(itemData.get(OcrDataTypeEnum.VEHICLE_INVOICE_TAX_AUTHORITH_ID.getKey()));
invoiceOcrData.setJSHJ(itemData.get(OcrDataTypeEnum.VEHICLE_INVOICE_TOTAL_PRICE_DIGITS.getKey()));
invoiceOcrData.setKPRQ(itemData.get(OcrDataTypeEnum.VEHICLE_INVOICE_ISSUE_DATE.getKey()));
invoiceOcrData.setFPDM(itemData.get(OcrDataTypeEnum.VEHICLE_INVOICE_DAIMA.getKey()));
invoiceOcrData.setFPHM(itemData.get(OcrDataTypeEnum.VEHICLE_INVOICE_HAOMA.getKey()));
} else if ("used_car_purchase_invoice".equals(type)) {
// -------------二手车销售统一发票特殊字段--------------
invoiceOcrData.setGMFMC(itemData.get(OcrDataTypeEnum.VEHICLE_INVOICE_BUYER.getKey()));
invoiceOcrData.setGMFSBH(itemData.get(OcrDataTypeEnum.VEHICLE_INVOICE_BUYER_ID.getKey()));
invoiceOcrData.setXHFMC(itemData.get(OcrDataTypeEnum.VEHICLE_INVOICE_SELLER.getKey()));
invoiceOcrData.setXHFSBH(itemData.get(OcrDataTypeEnum.VEHICLE_INVOICE_SELLER_ID.getKey()));
invoiceOcrData.setESCSC(itemData.get(OcrDataTypeEnum.VEHICLE_INVOICE_MARKET.getKey()));
invoiceOcrData.setCPZH(itemData.get(OcrDataTypeEnum.VEHICLE_INVOICE_PLATE_NUM.getKey()));
invoiceOcrData.setDJZH(itemData.get(OcrDataTypeEnum.VEHICLE_INVOICE_CAR_MODEL.getKey()));
invoiceOcrData.setCLSBH(itemData.get(OcrDataTypeEnum.VEHICLE_INVOICE_VIN.getKey()));
invoiceOcrData.setCPXH(itemData.get(OcrDataTypeEnum.VEHICLE_INVOICE_CAR_MODEL.getKey()));
invoiceOcrData.setESCNSRSBH(itemData.get(OcrDataTypeEnum.VEHICLE_INVOICE_MARKET_TAX_ID.getKey()));
invoiceOcrData.setESCNSRSBH(itemData.get(OcrDataTypeEnum.VEHICLE_INVOICE_MARKET_TAX_ID.getKey()));
invoiceOcrData.setJSHJ(itemData.get(OcrDataTypeEnum.VEHICLE_INVOICE_TOTAL_PRICE_DIGITS.getKey()));
invoiceOcrData.setKPRQ(itemData.get(OcrDataTypeEnum.VEHICLE_INVOICE_ISSUE_DATE.getKey()));
invoiceOcrData.setFPDM(itemData.get(OcrDataTypeEnum.VEHICLE_INVOICE_DAIMA.getKey()));
invoiceOcrData.setFPHM(itemData.get(OcrDataTypeEnum.VEHICLE_INVOICE_HAOMA.getKey()));
} else if("vehicle_toll".equals(type)){
// -------------过路费特殊字段--------------
invoiceOcrData.setJSHJ(itemData.get(OcrDataTypeEnum.MONEY.getKey()));
invoiceOcrData.setKPRQ(itemData.get(OcrDataTypeEnum.DATE.getKey()));
invoiceOcrData.setSJ(itemData.get(OcrDataTypeEnum.TIME.getKey()));
invoiceOcrData.setFPDM(itemData.get(OcrDataTypeEnum.TOLL_CODE.getKey()));
invoiceOcrData.setFPHM(itemData.get(OcrDataTypeEnum.TOLL_NUMBER.getKey()));
}else if ("quota_invoice".equals(type)) {
invoiceOcrData.setJSHJ(itemData.get(OcrDataTypeEnum.MONEY_SMALL.getKey()));
invoiceOcrData.setFPDM(itemData.get(OcrDataTypeEnum.QUOTA_INVOICE_CODE.getKey()));
invoiceOcrData.setFPHM(itemData.get(OcrDataTypeEnum.QUOTA_INVOICE_NUMBER.getKey()));
} else if ("taxi_ticket".equals(type)) {
// -------------出租车发票特殊字段--------------
invoiceOcrData.setJSHJ(itemData.get(OcrDataTypeEnum.SUM.getKey()));
invoiceOcrData.setFPDM(itemData.get(OcrDataTypeEnum.INVOICE_CODE.getKey()));
invoiceOcrData.setFPHM(itemData.get(OcrDataTypeEnum.INVOICE_NO.getKey()));
invoiceOcrData.setKPRQ(itemData.get(OcrDataTypeEnum.DATE.getKey()));
invoiceOcrData.setSCSJ(itemData.get(OcrDataTypeEnum.BOARDING_TIME.getKey()));
invoiceOcrData.setXCSJ(itemData.get(OcrDataTypeEnum.LANDING_TIME.getKey()));
invoiceOcrData.setLC(itemData.get(OcrDataTypeEnum.MILEAGE.getKey()));
invoiceOcrData.setSZD(itemData.get(OcrDataTypeEnum.LOCATION.getKey()));
invoiceOcrData.setCPZH(itemData.get(OcrDataTypeEnum.TAXI_NO.getKey()));
} else if("air_transport".equals(type)){
invoiceOcrData.setXM(itemData.get(OcrDataTypeEnum.PASSENGER_NAME.getKey()));
invoiceOcrData.setSFZH(itemData.get(OcrDataTypeEnum.ID_NO.getKey()));
invoiceOcrData.setPZHM(itemData.get(OcrDataTypeEnum.E_TICKET_NO.getKey()));
invoiceOcrData.setTKRQ(itemData.get(OcrDataTypeEnum.ISSUED_DATE.getKey()));
invoiceOcrData.setTKDW(itemData.get(OcrDataTypeEnum.ISSUED_BY.getKey()));
invoiceOcrData.setPJ(itemData.get(OcrDataTypeEnum.FARE.getKey()));
invoiceOcrData.setMHFZJJ(itemData.get(OcrDataTypeEnum.CIVIL_AVIATION_FUND.getKey()));
invoiceOcrData.setRYFJF(itemData.get(OcrDataTypeEnum.FUEL_SURCHARGE.getKey()));
invoiceOcrData.setQTSF(itemData.get(OcrDataTypeEnum.OTHER_TAXES.getKey()));
invoiceOcrData.setZE(itemData.get(OcrDataTypeEnum.TOTAL.getKey()));
invoiceOcrData.setBXF(itemData.get(OcrDataTypeEnum.INSURANCE.getKey()));
} else if("train_ticket".equals(type)){
// -------------火车票特殊字段--------------
// invoiceOcrData.setPZHM(itemData.get(OcrDataTypeEnum.VAT_INVOICE_TYPE.getKey()));
invoiceOcrData.setKPRQ(itemData.get(OcrDataTypeEnum.DEPARTURE_DATE.getKey()));
invoiceOcrData.setSJ(itemData.get(OcrDataTypeEnum.DEPARTURE_DATE.getKey()));
// invoiceOcrData.setXM(itemData.get(OcrDataTypeEnum.VAT_INVOICE_TYPE.getKey()));
invoiceOcrData.setCFZD(itemData.get(OcrDataTypeEnum.DEPARTURE_STATION.getKey()));
invoiceOcrData.setDDZD(itemData.get(OcrDataTypeEnum.ARRIVAL_STATION.getKey()));
invoiceOcrData.setCC(itemData.get(OcrDataTypeEnum.TRAIN_NUMBER.getKey()));
invoiceOcrData.setZWDJ(itemData.get(OcrDataTypeEnum.CLASS.getKey()));
invoiceOcrData.setXLH(itemData.get(OcrDataTypeEnum.SEAT_NUMBER.getKey()));
invoiceOcrData.setSFZH(itemData.get(OcrDataTypeEnum.PASSENGER_ID.getKey()));
} else if ("general_machine_invoice".equals(type) || "highway_passenger_invoice".equals(type) || "shipping_invoice".equals(type) || "passenger_transport_invoice".equals(type)) {
//为 general_machine_invoice(通用机打发票)、 highway_passenger_invoice(公路客运发票)、shipping_invoice(船运客票)、passenger_transport_invoice(旅客运输普票)
// -------------航空运输电子客票行程单特殊字段--------------
invoiceOcrData.setJSHJ(itemData.get(OcrDataTypeEnum.MONEY.getKey()));
invoiceOcrData.setFPDM(itemData.get(OcrDataTypeEnum.INVOICE_CODE.getKey()));
invoiceOcrData.setFPHM(itemData.get(OcrDataTypeEnum.INVOICE_NUMBER.getKey()));
invoiceOcrData.setKPRQ(itemData.get(OcrDataTypeEnum.DATE.getKey()));
invoiceOcrData.setSJ(itemData.get(OcrDataTypeEnum.TIME.getKey()));
} else if ("parking_invoice".equals(type)) {
invoiceOcrData.setJSHJ(itemData.get(OcrDataTypeEnum.MONEY.getKey()));
invoiceOcrData.setFPHM(itemData.get(OcrDataTypeEnum.INVOICE_NUMBER.getKey()));
}
openServiceOcr.setRegion(ocrDataListEntity.getPosition());
openServices.add(openServiceOcr);
}
return openServices;
}
}

@ -0,0 +1,36 @@
package com.dxhy.core.service.openservice.model.ocr;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.util.List;
@Data
public class OcrDataListEntity {
@JsonProperty("image_angle")
private int imageAngle;
@JsonProperty("rotated_image_width")
private int rotatedImageWidth;
@JsonProperty("rotated_image_height")
private int rotatedImageHeight;
private String type;
@JsonProperty("type_description")
private String typeDescription;
//头信息
@JsonProperty("item_list")
private List<OcrItemListEntity> itemList;
//发票明细数据
@JsonProperty("product_list")
private List<List<OcrProductListEntity>> productList;
//特殊字符无法作为常量key
private String CLASS;
private String kind;
@JsonProperty("kind_description")
private String kindDescription;
private List<Integer> position;
private String image;
}

@ -0,0 +1,197 @@
package com.dxhy.core.service.openservice.model.ocr;
import lombok.AllArgsConstructor;
@AllArgsConstructor
public enum OcrDataTypeEnum {
//➢type 为 vat_special_invoice(增值税专用发票)、vat_electronic_invoice(增
//值税电子普通发票)、vat_common_invoice(增值税普通发票)、
//vat_electronic_toll_invoice(增值税电子普通发票(通行费))
VAT_INVOICE_CORRECT_CODE("vat_invoice_correct_code","校验码"),
VAT_INVOICE_DAIMA ("vat_invoice_daima","发票代码"),
VAT_INVOICE_HAOMA("vat_invoice_haoma","发票号码"),
VAT_INVOICE_HAOMA_LARGE_SIZE("vat_invoice_haoma_large_size","字体较大的发票号码"),
VAT_INVOICE_ISSUE_DATE("vat_invoice_issue_date","开票日期"),
VAT_INVOICE_RATE_PAYER_ID("vat_invoice_rate_payer_id","购买方纳税人识别号"),
VAT_INVOICE_TOTAL("vat_invoice_total","合计"),
VAT_INVOICE_TAX_RATE("vat_invoice_tax_rate","税率"),
VAT_INVOICE_JIDA_HAOMA("vat_invoice_jida_haoma","机打号码"),
VAT_INVOICE_SELLER_NAME("vat_invoice_seller_name","销售方名称"),
VAT_INVOICE_SELLER_BANK_ACCOUNT("vat_invoice_seller_bank_account","销售方开户行及帐号"),
VAT_INVOICE_SELLER_ID ("vat_invoice_seller_id","销售方纳税人识别号"),
VAT_INVOICE_SELLER_ADDR_TELL ("vat_invoice_seller_addr_tell","销售方地址、电话"),
VAT_INVOICE_PAYER_NAME ("vat_invoice_payer_name","购买方名称"),
VAT_INVOICE_PAYER_BANK_ACCOUNT ("vat_invoice_payer_bank_account","购买方开户行及帐号"),
VAT_INVOICE_PAYER_ADDR_TELL ("vat_invoice_payer_addr_tell","购买方地址、电话"),
VAT_INVOICE_TOTAL_COVER_TAX ("vat_invoice_total_cover_tax","价税合计大写"),
VAT_INVOICE_TOTAL_COVER_TAX_DIGITS ("vat_invoice_total_cover_tax_digits","价税合计小写"),
VAT_INVOICE_HEADLINE_PAGE_NUMBER ("vat_invoice_headline_page_number","标题发票联(普票,电子发票,专票增加字段)"),
VAT_INVOICE_TOTAL_PRINT ("vat_invoice_total_print","打印合计(普票,电子发票,专票增加字段)"),
VAT_INVOICE_CORRENT_CODE_PRINT ("vat_invoice_corrent_code_print","打印校验码(普票,电子发票,专票增加字段)"),
VAT_INVOICE_TAX_TOTAL("vat_invoice_tax_total","税额合计"),
VAT_INVOICE_GOODS_LIST ("vat_invoice_goods_list","货物或服务名称"),
VAT_INVOICE_GOODS("vat_invoice_goods","货物或服务名称"),
VAT_INVOICE_PRICE_LIST ("vat_invoice_price_list","金额明细"),
VAT_INVOICE_PRICE ("vat_invoice_price","金额明细"),
VAT_INVOICE_TAX_RATE_LIST ("vat_invoice_tax_rate_list","税率明细"),
VAT_INVOICE_TAX_LIST ("vat_invoice_tax_list","税额明细"),
VAT_INVOICE_TAX ("vat_invoice_tax","税额明细"),
VAT_INVOICE_ZHUAN_YONG_FLAG ("vat_invoice_zhuan_yong_flag","专票/普票/区块链发票"),
VAT_INVOICE_DAI_KAI_FLAG ("vat_invoice_dai_kai_flag","代开(非代开条目为空)"),
VAT_INVOICE_PLATE_SPECIFIC("vat_invoice_plate_specific","规格型号明细"),
VAT_INVOICE_ELECTRANS_UNIT ("vat_invoice_electrans_unit","单位明细"),
VAT_INVOICE_ELECTRANS_QUANTITY("vat_invoice_electrans_quantity","数量明细"),
VAT_INVOICE_ELECTRANS_UNIT_PRICE ("vat_invoice_electrans_unit_price","单价明细"),
VAT_INVOICE_DAIMA_RIGHT_SIDE ("vat_invoice_daima_right_side","右侧打印发票代码"),
VAT_INVOICE_HAOMA_RIGHT_SIDE ("vat_invoice_haoma_right_side","右侧打印发票号码"),
VAT_INVOICE_PAGE_NUMBER ("vat_invoice_page_number","抵扣联/发票联"),
VAT_INVOICE_TYPE ("vat_invoice_type","发票类型"),
VAT_INVOICE_TOTAL_NOTE ("vat_invoice_total_note","备注"),
VAT_INVOICE_CIPHER_FIELD ("vat_invoice_cipher_field","密码区"),
VAT_INVOICE_DRAWER ("vat_invoice_drawer","开票人"),
VAT_INVOICE_REVIEW ("vat_invoice_review","复核人"),
VAT_INVOICE_PAYEE ("vat_invoice_payee","收款人"),
EXIST_STAMPLE("exist_stample","盖章存在性判断"),
VEHICLE_INVOICE_BUYER("vehicle_invoice_buyer","购买方名称"),
VEHICLE_INVOICE_BUYER_ID ("vehicle_invoice_buyer_id","购买方名称的身份证号码或组织机构代码"),
VEHICLE_INVOICE_CAR_MODEL ("vehicle_invoice_car_model","厂牌型号"),
VEHICLE_INVOICE_CAR_MADE_PLACE("vehicle_invoice_car_made_place","产地"),
VEHICLE_INVOICE_CERT_ID ("vehicle_invoice_cert_id","合格证号"),
VEHICLE_INVOICE_ENGINE_ID ("vehicle_invoice_engine_id","发动机号码"),
VEHICLE_INVOICE_CAR_VIN("vehicle_invoice_car_vin","车辆识别代号/车架号"),
VEHICLE_INVOICE_TOTAL_PRICE("vehicle_invoice_total_price","价税合计"),
VEHICLE_INVOICE_TOTAL_PRICE_DIGITS("vehicle_invoice_total_price_digits","价税合计小写"),
VEHICLE_INVOICE_PRICE_WITHOUT_TAX("VEHICLE_INVOICE_PRICE_WITHOUT_TAX","不含税价"),
VEHICLE_INVOICE_TAX_RATE("vehicle_invoice_tax_rate","税率"),
VEHICLE_INVOICE_TAX_AMOUNT ("vehicle_invoice_tax_amount","税额"),
VEHICLE_INVOICE_TELEPHONE ("vehicle_invoice_telephone","电话"),
VEHICLE_INVOICE_ISSUE_DATE("vehicle_invoice_issue_date","开票日期"),
VEHICLE_INVOICE_DAIMA("vehicle_invoice_daima","发票代码"),
VEHICLE_INVOICE_HAOMA("vehicle_invoice_haoma","发票号码"),
VEHICLE_INVOICE_DEALER("vehicle_invoice_dealer","销货单位"),
VEHICLE_INVOICE_JIDA_DAIMA ("vehicle_invoice_jida_daima","机打代码"),
VEHICLE_INVOICE_JIDA_HAOMA ("vehicle_invoice_jida_haoma","机打号码"),
VEHICLE_INVOICE_MACHINE_ID ("vehicle_invoice_machine_id","机器编码"),
VEHICLE_INVOICE_TAX_AUTHORITH_ID("vehicle_invoice_tax_authorith_id","主管税务代码"),
VEHICLE_INVOICE_TAX_AUTHORITH ("vehicle_invoice_tax_authorith","主管税务机关"),
VEHICLE_INVOICE_SELLER_BANK_NAME ("vehicle_invoice_seller_bank_name","开户银行"),
VEHICLE_INVOICE_SELLER_BANK_ACCOUNT("vehicle_invoice_seller_bank_account","账号"),
VEHICLE_INVOICE_SELLER_TAX_ID ("vehicle_invoice_seller_tax_id","纳税人识别号"),
VEHICLE_INVOICE_COMMODITY_INSPECTION_ID ("vehicle_invoice_commodity_inspection_id","商检单号"),
VEHICLE_INVOICE_IMPORT_CERTIFICATE_ID ("vehicle_invoice_import_certificate_id","进口证明书号"),
VEHICLE_INVOICE_SELLER_ADDRESS ("vehicle_invoice_seller_address","地址"),
// vehicle_invoice_daima("vehicle_invoice_daima","购车发票代码"),
// vehicle_invoice_haoma ("vehicle_invoice_haoma","购车发票号码"),
// vehicle_invoice_buyer ("vehicle_invoice_buyer","购货单位(人)"),
// vehicle_invoice_buyer_id ("vehicle_invoice_buyer_id","购买身份证号码/组织机构代码"),
VEHICLE_INVOICE_BUYER_ADDR("vehicle_invoice_buyer_addr","购买方地址"),
VEHICLE_INVOICE_BUYER_PHONE ("vehicle_invoice_buyer_phone","购买方电话号码"),
VEHICLE_INVOICE_SELLER ("vehicle_invoice_seller","卖方单位(人)"),
VEHICLE_INVOICE_SELLER_ID ("vehicle_invoice_seller_id","买方身份证号码/组织机构代码"),
VEHICLE_INVOICE_SELLER_ADDR ("vehicle_invoice_seller_addr","卖方地址"),
VEHICLE_INVOICE_SELLER_PHONE ("vehicle_invoice_seller_phone","卖方电话号码"),
VEHICLE_INVOICE_PLATE_NUM ("vehicle_invoice_plate_num","车牌照号"),
VEHICLE_INVOICE_REGISTER_NUM("vehicle_invoice_register_num","登记证号"),
VEHICLE_INVOICE_VEHICLE_TYPE ("vehicle_invoice_vehicle_type","车辆类型"),
VEHICLE_INVOICE_VIN ("vehicle_invoice_vin","车架号/车辆识别代码"),
// vehicle_invoice_car_model("vehicle_invoice_car_model","厂牌型号"),
VEHICLE_INVOICE_DMV("vehicle_invoice_dmv","转入地车辆管理所名称"),
VEHICLE_INVOICE_PRICE_TOTAL_PRICE ("vehicle_invoice_price_total_price","价税合计"),
// vehicle_invoice_total_price_digits ("vehicle_invoice_total_price_digits","价税合计小写"),
VEHICLE_INVOICE_AUCTION_HOUSE ("vehicle_invoice_auction_house","经营、拍卖单位"),
VEHICLE_INVOICE_AUCTION_HOUSE_ADDR("vehicle_invoice_auction_house_addr","经营、拍卖单位地址"),
VEHICLE_INVOICE_AUCTION_HOUSE_TAX_ID ("vehicle_invoice_auction_house_tax_id","经营、拍卖单位纳税人识别号"),
VEHICLE_INVOICE_AUCTION_HOUSE_BANK_ACCOUNT ("vehicle_invoice_auction_house_bank_account","经营、拍卖单位开户银行、账号"),
VEHICLE_INVOICE_AUCTION_HOUSE_PHONE ("vehicle_invoice_auction_house_phone","经营、拍卖单位电话"),
VEHICLE_INVOICE_MARKET ("vehicle_invoice_market","二手车市场"),
VEHICLE_INVOICE_MARKET_ADDR ("vehicle_invoice_market_addr","二手车市场地址"),
VEHICLE_INVOICE_MARKET_TAX_ID ("vehicle_invoice_market_tax_id","二手车市场纳税人识别号"),
VEHICLE_INVOICE_MARKET_BANK_ACOUNT ("vehicle_invoice_market_bank_acount","二手车市场开户银行、账号"),
VEHICLE_INVOICE_MARKET_PHONE ("vehicle_invoice_market_phone","二手车市场电话"),
VEHICLE_INVOICE_NOTE ("vehicle_invoice_note","备注"),
// vehicle_invoice_issue_date ("vehicle_invoice_issue_date","购车发票开票日期"),
INVOICE_HEAD("invoice_head","发票票头"),
INVOICE_NUMBER("invoice_number","发票号码"),
INVOICE_CODE("invoice_code","发票代码"),
MACHINE_NUMBER ("machine_number","机器号码"),
MACHINE_CODE ("machine_code","机器编码"),
TOTAL_MONEY("total_money","合计金额(小写)"),
TOTAL_MONEY_BIG ("total_money_big","合计金额(大写)"),
DATE_OF_INVOICE ("date_of_invoice","开票日期"),
CHECK_NUMBER ("check_number","校验码"),
BUY_NAME("buy_name","购方名称"),
BUY_TAX_NUMBER("buy_tax_number","购方纳税人识别号"),
SOLD_NAME ("sold_name","销方名称"),
SOLD_TAX_NUMBER ("sold_tax_number","销方纳税人识别号"),
CASHIER_NAME ("cashier_name","收款员"),
QUOTA_INVOICE_CODE("quota_invoice_code","发票代码"),
QUOTA_INVOICE_NUMBER ("quota_invoice_number","发票号码"),
MONEY_SMALL ("money_small","金额(小写)"),
MONEY_BIG ("money_big","金额(大写)"),
LOCATION ("location","发票所在地"),
// invoice_code ("invoice_code","发票代码"),
INVOICE_NO ("invoice_no","发票号码"),
DATE ("date","日期"),
TAXI_NO ("taxi_no","车号"),
BOARDING_TIME("boarding_time","上车时间"),
LANDING_TIME ("landing_time","下车时间"),
MILEAGE ("mileage","里程"),
SUM ("sum","金额"),
// location ("location","发票所在地"),
PASSENGER_NAME ("passenger_name","旅客姓名"),
ID_NO ("id_no","身份证件号码"),
SERIAL_NUMBER ("serial_number","印刷序号"),
TOTAL("total","合计金额"),
FARE ("fare","票价"),
CIVIL_AVIATION_FUND ("civil_aviation_fund","民航发展基金"),
FUEL_SURCHARGE ("fuel_surcharge","燃油附加费"),
OTHER_TAXES("other_taxes","其他税费"),
ISSUED_DATE ("issued_date","填开日期"),
ISSUED_BY ("issued_by","填开单位"),
E_TICKET_NO ("e_ticket_no","电子客票号码"),
INSURANCE ("insurance","保险费"),
// passenger_name("passenger_name","乘客名称"),
PASSENGER_ID("passenger_id","乘客身份证"),
TRAIN_NUMBER ("train_number","车次号"),
DEPARTURE_STATION ("departure_station","出发地"),
DEPARTURE_DATE ("departure_date","乘车时间"),
//TODO
CLASS ("class","座位类别"),
TICKET_NUMBER ("ticket_number","火车票红色编码"),
ARRIVAL_STATION ("arrival_station","目的地"),
SEAT_NUMBER ("seat_number","座位号"),
PRICE ("price","价格"),
CHECK ("check","检票口"),
TICKET_ID ("ticket_id","火车票ID"),
// invoice_code ("invoice_code","发票代码"),
// invoice_number ("invoice_number","发票号码"),
MONEY ("money","金额"),
// date ("date","日期"),
TIME ("time","时间"),
TOLL_CODE ("toll_code","车辆通行费代码"),
TOLL_NUMBER ("toll_number","车辆通行费号码"),
// invoice_number ("invoice_number","发票号码"),
// money ("money","金额"),
;
private String key;
private String value;
public String getKey() {
return key;
}
}

@ -0,0 +1,13 @@
package com.dxhy.core.service.openservice.model.ocr;
import lombok.Data;
import java.util.List;
@Data
public class OcrItemListEntity {
private String value;
private String description;
private String key;
private List<Integer> position;
}

@ -0,0 +1,12 @@
package com.dxhy.core.service.openservice.model.ocr;
import lombok.Data;
import java.util.List;
@Data
public class OcrProductListEntity {
private String description;
private String key;
private String value;
}

@ -0,0 +1,15 @@
package com.dxhy.core.service.openservice.model.ocr;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
@Data
public class OcrResponseVo {
private OcrResultEntity result;
@JsonProperty("cost_time")
private int costTime;
private int code;
private String message;
}

@ -0,0 +1,14 @@
package com.dxhy.core.service.openservice.model.ocr;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.util.List;
@Data
public class OcrResultEntity {
@JsonProperty("object_list")
private List<OcrDataListEntity> objectList;
}
Loading…
Cancel
Save