|
@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON;
|
|
|
import com.malk.pro.guyuan.server.model.McInvoiceDto;
|
|
import com.malk.pro.guyuan.server.model.McInvoiceDto;
|
|
|
import com.malk.pro.guyuan.server.model.McInvoiceKind;
|
|
import com.malk.pro.guyuan.server.model.McInvoiceKind;
|
|
|
import com.malk.pro.guyuan.server.tencent.TXYConf;
|
|
import com.malk.pro.guyuan.server.tencent.TXYConf;
|
|
|
|
|
+import com.malk.pro.guyuan.service.tencent.IvYdService;
|
|
|
import com.malk.pro.guyuan.service.tencent.TXYInvoice;
|
|
import com.malk.pro.guyuan.service.tencent.TXYInvoice;
|
|
|
import com.malk.server.aliwork.YDConf;
|
|
import com.malk.server.aliwork.YDConf;
|
|
|
import com.malk.server.aliwork.YDParam;
|
|
import com.malk.server.aliwork.YDParam;
|
|
@@ -64,8 +65,13 @@ public class IVController {
|
|
|
return "";
|
|
return "";
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ public static void main(String[] args) {
|
|
|
|
|
+ System.out.println("上海渔米可禧文化传媒有限公司".equals(guyuanNameRepalce("上海渔米可禧文化传媒有限公司 ")));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
// 兼容历史配置, 格式 (谷元)
|
|
// 兼容历史配置, 格式 (谷元)
|
|
|
- private String guyuanNameRepalce(String name) {
|
|
|
|
|
|
|
+ private static String guyuanNameRepalce(String name) {
|
|
|
|
|
+ name=name.replaceAll(" ","");
|
|
|
if (name.contains("谷元")) {
|
|
if (name.contains("谷元")) {
|
|
|
return UtilString.replaceBracketIsWhole(name);
|
|
return UtilString.replaceBracketIsWhole(name);
|
|
|
} else {
|
|
} else {
|
|
@@ -167,24 +173,58 @@ public class IVController {
|
|
|
image = pdfUrlConvertBase64(image);
|
|
image = pdfUrlConvertBase64(image);
|
|
|
}
|
|
}
|
|
|
List<Map> invoices = (List<Map>) txyInvoice.doRecognizeGeneralInvoice(image).get("MixedInvoiceItems");
|
|
List<Map> invoices = (List<Map>) txyInvoice.doRecognizeGeneralInvoice(image).get("MixedInvoiceItems");
|
|
|
|
|
+ List<String> nos=new ArrayList<>();
|
|
|
List<McInvoiceDto> result = invoices.stream().map(item -> {
|
|
List<McInvoiceDto> result = invoices.stream().map(item -> {
|
|
|
Map prop = UtilMap.getMap(UtilMap.getMap(item, "SingleInvoiceInfos"), UtilMap.getString(item, "SubType"));
|
|
Map prop = UtilMap.getMap(UtilMap.getMap(item, "SingleInvoiceInfos"), UtilMap.getString(item, "SubType"));
|
|
|
|
|
+ String no=UtilMap.getString(prop, "Number");
|
|
|
|
|
+ if(nos.contains(no)){
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+ nos.add(no);
|
|
|
|
|
+ String kind = UtilMap.getString(item, "TypeDescription");
|
|
|
|
|
+ String invoiceName = UtilMap.getString(item, "SubTypeDescription");
|
|
|
|
|
+ if (kind.equals("全电发票")) {
|
|
|
|
|
+ if(invoiceName.contains("铁路电子客票")){
|
|
|
|
|
+ kind="火车票";
|
|
|
|
|
+ } else if(invoiceName.contains("机票行程单")){
|
|
|
|
|
+ kind="机票行程单";
|
|
|
|
|
+ } else if (invoiceName.contains("专用发票")) {
|
|
|
|
|
+ kind="全电专用发票";
|
|
|
|
|
+ }else {
|
|
|
|
|
+ kind="全电普通发票";
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if (kind.equals("增值税发票")) {
|
|
|
|
|
+ if(invoiceName.contains("区块链电子发票")){
|
|
|
|
|
+ kind="区块链电子发票";
|
|
|
|
|
+ } else if(invoiceName.contains("增值税专用发票")){
|
|
|
|
|
+ kind="增值税专用发票";
|
|
|
|
|
+ } else if(invoiceName.contains("增值税普通发票")){
|
|
|
|
|
+ kind="增值税普通发票";
|
|
|
|
|
+ } else if (invoiceName.contains("增值税电子专用发票")) {
|
|
|
|
|
+ kind="增值税电子专用发票";
|
|
|
|
|
+ } else if (invoiceName.contains("增值税电子普通发票")) {
|
|
|
|
|
+ kind="增值税电子普通发票";
|
|
|
|
|
+ }else {
|
|
|
|
|
+ kind="增值税普通发票";
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
// ppExt: 通用字段定义
|
|
// ppExt: 通用字段定义
|
|
|
McInvoiceDto invoiceDto = McInvoiceDto.builder()
|
|
McInvoiceDto invoiceDto = McInvoiceDto.builder()
|
|
|
.name(UtilMap.getString(item, "SubTypeDescription"))
|
|
.name(UtilMap.getString(item, "SubTypeDescription"))
|
|
|
- .kindName(UtilMap.getString(item, "TypeDescription"))
|
|
|
|
|
|
|
+ .kindName(kind)
|
|
|
.kind(UtilMap.getInt(item, "Type"))
|
|
.kind(UtilMap.getInt(item, "Type"))
|
|
|
.code(UtilMap.getString(prop, "Code"))
|
|
.code(UtilMap.getString(prop, "Code"))
|
|
|
.serial(UtilMap.getString(prop, "Number"))
|
|
.serial(UtilMap.getString(prop, "Number"))
|
|
|
.date(UtilString.replaceDateZH_cn(UtilMap.getString(prop, "Date")))
|
|
.date(UtilString.replaceDateZH_cn(UtilMap.getString(prop, "Date")))
|
|
|
.checkCode(UtilMap.getString(prop, "CheckCode"))
|
|
.checkCode(UtilMap.getString(prop, "CheckCode"))
|
|
|
- // ppExt: 多明细行时, 优先取值合计 [全电票返回了subTotal字段, 但值为空]
|
|
|
|
|
- .amount(UtilNumber.setBigDecimal(UtilMap.getString_first(prop, "SubTotal", "Total")))
|
|
|
|
|
- .tax(UtilNumber.setBigDecimal(UtilMap.getString_first(prop, "SubTax", "Tax")))
|
|
|
|
|
|
|
+ // ppExt: 多明细行时, 优先取值合计 [全电票返回了subTotal字段, 但值为空] // 2025.5.12 去除小计金额,并去除发票编号重复数据
|
|
|
|
|
+ .amount(UtilNumber.setBigDecimal(UtilMap.getString_first(prop, "Total", "Fare"))) // "SubTotal",
|
|
|
|
|
+ .tax(UtilNumber.setBigDecimal(UtilMap.getString_first(prop, "Tax"))) // "SubTax",
|
|
|
.excludingTax(UtilNumber.setBigDecimal(UtilMap.getString(prop, "PretaxAmount")))
|
|
.excludingTax(UtilNumber.setBigDecimal(UtilMap.getString(prop, "PretaxAmount")))
|
|
|
- .buyerName(guyuanNameRepalce(UtilMap.getString(prop, "Buyer")))
|
|
|
|
|
|
|
+ .buyerName(StringUtils.isBlank(guyuanNameRepalce(UtilMap.getString(prop, "Buyer")))?"上海能辉科技股份有限公司":guyuanNameRepalce(UtilMap.getString(prop, "Buyer")))
|
|
|
// ppExt: 中央非税未返回税号官方说明: 非税发票理论是没有税号的,图片中属于信用代码
|
|
// ppExt: 中央非税未返回税号官方说明: 非税发票理论是没有税号的,图片中属于信用代码
|
|
|
- .buyerTaxId(UtilMap.getString(prop, "BuyerTaxID"))
|
|
|
|
|
|
|
+ .buyerTaxId(StringUtils.isBlank(UtilMap.getString(prop, "BuyerTaxID"))?"": UtilMap.getString(prop, "BuyerTaxID"))
|
|
|
.sellerName(guyuanNameRepalce(UtilMap.getString_first(prop, "Seller", "Issuer"))) // 行程单: 填开单位
|
|
.sellerName(guyuanNameRepalce(UtilMap.getString_first(prop, "Seller", "Issuer"))) // 行程单: 填开单位
|
|
|
.sellerTaxId(UtilMap.getString_first(prop, "SellerTaxID", "AgentCode")) // 行程单: 销售单位代号
|
|
.sellerTaxId(UtilMap.getString_first(prop, "SellerTaxID", "AgentCode")) // 行程单: 销售单位代号
|
|
|
.passengerName(UtilMap.getString_first(prop, "Name", "UserName")) // 火车票, 行程单
|
|
.passengerName(UtilMap.getString_first(prop, "Name", "UserName")) // 火车票, 行程单
|
|
@@ -199,7 +239,9 @@ public class IVController {
|
|
|
.constructionCosts(UtilNumber.setBigDecimal((UtilMap.getString(prop, "AirDevelopmentFund")))) // 行程单: 民航发展基金
|
|
.constructionCosts(UtilNumber.setBigDecimal((UtilMap.getString(prop, "AirDevelopmentFund")))) // 行程单: 民航发展基金
|
|
|
.build();
|
|
.build();
|
|
|
// ppExt: 机票行程单, 行程与座位信息在明细内
|
|
// ppExt: 机票行程单, 行程与座位信息在明细内
|
|
|
- if ("机票行程单".equals(item.get("TypeDescription"))) {
|
|
|
|
|
|
|
+ if ("机票行程单".equals(kind)) {
|
|
|
|
|
+ invoiceDto.setSellerName(UtilMap.getString_first(prop, "Issuer"));
|
|
|
|
|
+ invoiceDto.setSellerTaxId(UtilMap.getString_first(prop, "Seller"));
|
|
|
Map flight = (Map) UtilMap.getList(prop, "FlightItems").get(0);
|
|
Map flight = (Map) UtilMap.getList(prop, "FlightItems").get(0);
|
|
|
invoiceDto.setDepartureTime(UtilString.replaceDateZH_cn(UtilMap.getString(item, "DateGetOn")) + " " + UtilMap.getString(prop, "TimeGetOn"));
|
|
invoiceDto.setDepartureTime(UtilString.replaceDateZH_cn(UtilMap.getString(item, "DateGetOn")) + " " + UtilMap.getString(prop, "TimeGetOn"));
|
|
|
invoiceDto.setDeparturePort(UtilMap.getString(flight, "StationGetOn"));
|
|
invoiceDto.setDeparturePort(UtilMap.getString(flight, "StationGetOn"));
|
|
@@ -211,7 +253,7 @@ public class IVController {
|
|
|
invoiceDto.setDepartureTime(UtilMap.getString(prop, "TimeGetOn") + " ~ " + UtilMap.getString(prop, "TimeGetOff"));
|
|
invoiceDto.setDepartureTime(UtilMap.getString(prop, "TimeGetOn") + " ~ " + UtilMap.getString(prop, "TimeGetOff"));
|
|
|
}
|
|
}
|
|
|
return invoiceDto;
|
|
return invoiceDto;
|
|
|
- }).collect(Collectors.toList());
|
|
|
|
|
|
|
+ }).filter(item -> item!=null).collect(Collectors.toList());
|
|
|
return McR.success(McInvoiceDto.formatResponse(result));
|
|
return McR.success(McInvoiceDto.formatResponse(result));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -354,6 +396,9 @@ public class IVController {
|
|
|
@Autowired
|
|
@Autowired
|
|
|
private YDService ydService;
|
|
private YDService ydService;
|
|
|
|
|
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private IvYdService ivYdService;
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* 发票状态更新: 服务注册
|
|
* 发票状态更新: 服务注册
|
|
|
*/
|
|
*/
|
|
@@ -369,7 +414,7 @@ public class IVController {
|
|
|
List<String> associationForm = (List<String>) JSON.parse(UtilMap.getString(data, "multiAssociation"));
|
|
List<String> associationForm = (List<String>) JSON.parse(UtilMap.getString(data, "multiAssociation"));
|
|
|
List<String> formInstanceIds = new ArrayList<>();
|
|
List<String> formInstanceIds = new ArrayList<>();
|
|
|
for (String record : associationForm) {
|
|
for (String record : associationForm) {
|
|
|
- // 解析关联表单
|
|
|
|
|
|
|
+ // 解析关联表单 ['[{"formType":"receipt","formUuid":"FORM-W2A66Z910O9B3LP9C6IYUDPRVWY62DO0YHIILY", "subTitle": "21.16", "instanceId": "FINST-WJC66GC1E1KWXO0173ZVW56MUFHX2ULES5DCMZGA", "appType": "APP_FKRK7Y94DPI1S9DV1605","title":"电子发票(普通发票)"}]']
|
|
|
List<Map> associationData = (List<Map>) JSON.parse(record);
|
|
List<Map> associationData = (List<Map>) JSON.parse(record);
|
|
|
formInstanceIds.addAll(associationData.stream().map(form -> UtilMap.getString(form, "instanceId")).collect(Collectors.toList()));
|
|
formInstanceIds.addAll(associationData.stream().map(form -> UtilMap.getString(form, "instanceId")).collect(Collectors.toList()));
|
|
|
}
|
|
}
|
|
@@ -380,7 +425,7 @@ public class IVController {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// prd 9.10 更新报销单, 关联到发票:: ppExt 宜搭服务注册, 提交规则系统默认字段 [详见 YDService]
|
|
// prd 9.10 更新报销单, 关联到发票:: ppExt 宜搭服务注册, 提交规则系统默认字段 [详见 YDService]
|
|
|
- ydService.operateData2(data, update, YDParam.builder()
|
|
|
|
|
|
|
+ ivYdService.operateData(data, update, YDParam.builder()
|
|
|
.formUuid("FORM-W2A66Z910O9B3LP9C6IYUDPRVWY62DO0YHIILY")
|
|
.formUuid("FORM-W2A66Z910O9B3LP9C6IYUDPRVWY62DO0YHIILY")
|
|
|
.formInstanceIdList(formInstanceIds)
|
|
.formInstanceIdList(formInstanceIds)
|
|
|
.updateFormDataJson(JSON.toJSONString(update))
|
|
.updateFormDataJson(JSON.toJSONString(update))
|