From 943152894b91cc9b028bc5d72b1235846914ee67 Mon Sep 17 00:00:00 2001 From: dongxiaoke <1910333201@qq.com> Date: Fri, 7 Apr 2023 10:48:51 +0800 Subject: [PATCH] =?UTF-8?q?=E9=94=80=E9=A1=B9=E5=90=88=E5=B9=B6=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E6=8E=A5=E5=8F=A3=E5=90=88=E5=B9=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../http/invoice/v1/InvoiceController.java | 303 +++++++++++++++++- .../invoice/service/IInvoiceApiService.java | 71 +++- .../AisinoConsoleInvoiceApiServiceImpl.java | 40 +++ .../api/ElephantInvoiceApiServiceImpl.java | 40 +++ .../impl/api/JcskInvoiceApiServiceImpl.java | 40 +++ 5 files changed, 492 insertions(+), 2 deletions(-) diff --git a/jianshui-admin/src/main/java/com/jianshui/api/controller/http/invoice/v1/InvoiceController.java b/jianshui-admin/src/main/java/com/jianshui/api/controller/http/invoice/v1/InvoiceController.java index 34ca321..0e0d879 100644 --- a/jianshui-admin/src/main/java/com/jianshui/api/controller/http/invoice/v1/InvoiceController.java +++ b/jianshui-admin/src/main/java/com/jianshui/api/controller/http/invoice/v1/InvoiceController.java @@ -17,6 +17,13 @@ import com.jianshui.invoice.factory.IInvoiceResponseFactory; import com.jianshui.invoice.factory.IInvoiceServiceFactory; import com.jianshui.invoice.service.IInvoiceResponseService; import com.jianshui.invoice.utils.ApiRequestUtils; +import com.jianshui.invoiceall.domain.dto.InvoiceAllFileAcquisitionDTO; +import com.jianshui.invoiceall.domain.dto.InvoiceAllFileAcquisitionOnDTO; +import com.jianshui.invoiceall.domain.dto.InvoiceAllKshcDTO; +import com.jianshui.invoiceall.domain.dto.InvoiceAllShhzDTO; +import com.jianshui.invoiceall.service.IInvoiceAll; +import com.jianshui.invoiceall.service.IInvoiceAllRequestService; +import com.jianshui.invoiceall.service.IInvoiceAllResponseService; import com.jianshui.system.service.ICompanyserviceService; import com.jianshui.system.service.IServiceManageService; import io.swagger.annotations.*; @@ -843,8 +850,302 @@ public class InvoiceController { HXResponse result = invoiceService.createESeal(billInfo, companyservice); return result; } - return null; } + + // TODO: 2023/4/6 全电接口 + + @ApiOperation("获取发票下载地址") + @ApiImplicitParams({ + @ApiImplicitParam(name = "", value = "身份认证", dataType = "string", example = "1130", required = true), + @ApiImplicitParam(name = "order", value = "请求体", required = true)}) + @PostMapping({"/api/invoice_all/v1/getFileUrl/{identity}", "/api/invoice_all/v1/getFileUrl"}) + public Object getFileUrl(HttpServletRequest request, String identity) throws Exception { + if (StringUtils.isEmpty(identity)) { + return AjaxResult.error(ErrorCode.EMPTY_IDENTITY); + } + + Companyservice companyservice = iCompanyserviceService.selectCompanyserviceByIdentity(identity); + if (companyservice == null) { + return AjaxResult.error(ErrorCode.COMPANY_NOT_FOUND); + } + + // 获得入口报文适配器 + String requestAdapterKey = serviceManageService.getRequestAdapterKey("invoice", companyservice.getCompanyid()); + IInvoiceRequestService invoiceRequestService = invoiceRequestFactory.getService(requestAdapterKey); + JSONObject decryptResult = invoiceRequestService.decrypt(request, companyservice, ""); + + // 获得请求实例,并且进行扣费 + String serviceKey = serviceManageService.getCompanyServiceSupplier("invoice", companyservice.getCompanyid()); + serviceManageService.companyConsume("invoice", companyservice.getCompanyid()); + + IInvoiceApiService invoiceService = invoiceServiceFactory.getService(serviceKey); + HXResponse result = invoiceService.getFileUrl(decryptResult, companyservice); + + String responseAdapterKey = serviceManageService.getResponseAdapterKey("invoice", companyservice.getCompanyid()); + IInvoiceResponseService invoiceResponseService = invoiceResponseFactory.getService(responseAdapterKey); + + return invoiceResponseService.response(result, companyservice, ""); + } + + + @ApiOperation("全电文件获取") + @ApiImplicitParams({ + @ApiImplicitParam(name = "", value = "身份认证", dataType = "string", example = "1130", required = true), + @ApiImplicitParam(name = "order", value = "请求体", required = true)}) + @PostMapping({"/api/invoice_all/v1/getFileAcquisition/{identity}", "/api/invoice_all/v1/getFileAcquisition"}) + public Object getFileAcquisition(HttpServletRequest request, String identity) throws Exception { + + // TODO: 2023/4/6 getFileAcquisitionOn + if (StringUtils.isEmpty(identity)) { + return AjaxResult.error(ErrorCode.EMPTY_IDENTITY); + } + + Companyservice companyservice = iCompanyserviceService.selectCompanyserviceByIdentity(identity); + if (companyservice == null) { + return AjaxResult.error(ErrorCode.COMPANY_NOT_FOUND); + } + + // 获得入口报文适配器 + String requestAdapterKey = serviceManageService.getRequestAdapterKey("invoice", companyservice.getCompanyid()); + IInvoiceRequestService invoiceRequestService = invoiceRequestFactory.getService(requestAdapterKey); + JSONObject decryptResult = invoiceRequestService.decrypt(request, companyservice, ""); + + // 获得请求实例,并且进行扣费 + String serviceKey = serviceManageService.getCompanyServiceSupplier("invoice", companyservice.getCompanyid()); + serviceManageService.companyConsume("invoice", companyservice.getCompanyid()); + + IInvoiceApiService invoiceService = invoiceServiceFactory.getService(serviceKey); + HXResponse result = invoiceService.getFileAcquisitionOn(decryptResult, companyservice); + + String responseAdapterKey = serviceManageService.getResponseAdapterKey("invoice", companyservice.getCompanyid()); + IInvoiceResponseService invoiceResponseService = invoiceResponseFactory.getService(responseAdapterKey); + + return invoiceResponseService.response(result, companyservice, ""); + + + } + + @ApiOperation("获取人脸识别二维码") + @ApiImplicitParams({ + @ApiImplicitParam(name = "", value = "身份认证", dataType = "string", example = "1130", required = true), + @ApiImplicitParam(name = "order", value = "请求体", required = true)}) + @PostMapping({"/api/invoice_all/v1/qrcode/{identity}", "/api/invoice_all/v1/qrcode"}) + public Object qrcode(HttpServletRequest request, String identity) throws Exception { + + // qrcode + if (StringUtils.isEmpty(identity)) { + return AjaxResult.error(ErrorCode.EMPTY_IDENTITY); + } + + Companyservice companyservice = iCompanyserviceService.selectCompanyserviceByIdentity(identity); + if (companyservice == null) { + return AjaxResult.error(ErrorCode.COMPANY_NOT_FOUND); + } + + // 获得入口报文适配器 + String requestAdapterKey = serviceManageService.getRequestAdapterKey("invoice", companyservice.getCompanyid()); + IInvoiceRequestService invoiceRequestService = invoiceRequestFactory.getService(requestAdapterKey); + JSONObject decryptResult = invoiceRequestService.decrypt(request, companyservice, ""); + + // 获得请求实例,并且进行扣费 + String serviceKey = serviceManageService.getCompanyServiceSupplier("invoice", companyservice.getCompanyid()); + serviceManageService.companyConsume("invoice", companyservice.getCompanyid()); + + IInvoiceApiService invoiceService = invoiceServiceFactory.getService(serviceKey); + HXResponse result = invoiceService.qrcode(decryptResult, companyservice); + + String responseAdapterKey = serviceManageService.getResponseAdapterKey("invoice", companyservice.getCompanyid()); + IInvoiceResponseService invoiceResponseService = invoiceResponseFactory.getService(responseAdapterKey); + + return invoiceResponseService.response(result, companyservice, ""); + + } + + @ApiOperation("发票查询") + @ApiImplicitParams({ + @ApiImplicitParam(name = "", value = "身份认证", dataType = "string", example = "1130", required = true), + @ApiImplicitParam(name = "order", value = "请求体", required = true)}) + @PostMapping({"/api/invoice_all/v1/query/{identity}", "/api/invoice_all/v1/query"}) + public Object query(HttpServletRequest request, String identity) throws Exception { + // query + + if (StringUtils.isEmpty(identity)) { + return AjaxResult.error(ErrorCode.EMPTY_IDENTITY); + } + + Companyservice companyservice = iCompanyserviceService.selectCompanyserviceByIdentity(identity); + if (companyservice == null) { + return AjaxResult.error(ErrorCode.COMPANY_NOT_FOUND); + } + + // 获得入口报文适配器 + String requestAdapterKey = serviceManageService.getRequestAdapterKey("invoice", companyservice.getCompanyid()); + IInvoiceRequestService invoiceRequestService = invoiceRequestFactory.getService(requestAdapterKey); + JSONObject decryptResult = invoiceRequestService.decrypt(request, companyservice, ""); + + // 获得请求实例,并且进行扣费 + String serviceKey = serviceManageService.getCompanyServiceSupplier("invoice", companyservice.getCompanyid()); + serviceManageService.companyConsume("invoice", companyservice.getCompanyid()); + + IInvoiceApiService invoiceService = invoiceServiceFactory.getService(serviceKey); + HXResponse result = invoiceService.query(decryptResult, companyservice); + + String responseAdapterKey = serviceManageService.getResponseAdapterKey("invoice", companyservice.getCompanyid()); + IInvoiceResponseService invoiceResponseService = invoiceResponseFactory.getService(responseAdapterKey); + + return invoiceResponseService.response(result, companyservice, ""); + + } + + @ApiOperation("获取发票打印XML") + @ApiImplicitParams({ + @ApiImplicitParam(name = "", value = "身份认证", dataType = "string", example = "1130", required = true), + @ApiImplicitParam(name = "order", value = "请求体", required = true)}) + @PostMapping({"/api/invoice_all/v1/print_xml/{identity}", "/api/invoice_all/v1/print_xml"}) + public Object printXmlml(HttpServletRequest request, String identity) throws Exception { +// getPrintXML + + if (StringUtils.isEmpty(identity)) { + return AjaxResult.error(ErrorCode.EMPTY_IDENTITY); + } + + Companyservice companyservice = iCompanyserviceService.selectCompanyserviceByIdentity(identity); + if (companyservice == null) { + return AjaxResult.error(ErrorCode.COMPANY_NOT_FOUND); + } + + // 获得入口报文适配器 + String requestAdapterKey = serviceManageService.getRequestAdapterKey("invoice", companyservice.getCompanyid()); + IInvoiceRequestService invoiceRequestService = invoiceRequestFactory.getService(requestAdapterKey); + JSONObject decryptResult = invoiceRequestService.decrypt(request, companyservice, ""); + + // 获得请求实例,并且进行扣费 + String serviceKey = serviceManageService.getCompanyServiceSupplier("invoice", companyservice.getCompanyid()); + serviceManageService.companyConsume("invoice", companyservice.getCompanyid()); + + IInvoiceApiService invoiceService = invoiceServiceFactory.getService(serviceKey); + HXResponse result = invoiceService.getPrintXML(decryptResult, companyservice); + + String responseAdapterKey = serviceManageService.getResponseAdapterKey("invoice", companyservice.getCompanyid()); + IInvoiceResponseService invoiceResponseService = invoiceResponseFactory.getService(responseAdapterKey); + + return invoiceResponseService.response(result, companyservice, ""); + + } + + @ApiOperation("快速红冲") + @ApiImplicitParams({ + @ApiImplicitParam(name = "", value = "身份认证", dataType = "string", example = "1130", required = true), + @ApiImplicitParam(name = "order", value = "请求体", required = true)}) + @PostMapping({"/api/invoice_all/v1/issueFastRedInvoice/{identity}", "/api/invoice_all/v1/issueFastRedInvoice"}) + public Object issueFastRedInvoice(HttpServletRequest request, String identity) throws Exception { +// issueFastRedInvoice + + if (StringUtils.isEmpty(identity)) { + return AjaxResult.error(ErrorCode.EMPTY_IDENTITY); + } + + Companyservice companyservice = iCompanyserviceService.selectCompanyserviceByIdentity(identity); + if (companyservice == null) { + return AjaxResult.error(ErrorCode.COMPANY_NOT_FOUND); + } + + // 获得入口报文适配器 + String requestAdapterKey = serviceManageService.getRequestAdapterKey("invoice", companyservice.getCompanyid()); + IInvoiceRequestService invoiceRequestService = invoiceRequestFactory.getService(requestAdapterKey); + JSONObject decryptResult = invoiceRequestService.decrypt(request, companyservice, ""); + + // 获得请求实例,并且进行扣费 + String serviceKey = serviceManageService.getCompanyServiceSupplier("invoice", companyservice.getCompanyid()); + serviceManageService.companyConsume("invoice", companyservice.getCompanyid()); + + IInvoiceApiService invoiceService = invoiceServiceFactory.getService(serviceKey); + HXResponse result = invoiceService.issueFastRedInvoice(decryptResult, companyservice); + + String responseAdapterKey = serviceManageService.getResponseAdapterKey("invoice", companyservice.getCompanyid()); + IInvoiceResponseService invoiceResponseService = invoiceResponseFactory.getService(responseAdapterKey); + + return invoiceResponseService.response(result, companyservice, ""); + + } + + + @ApiOperation("蓝字发票统计") + @ApiImplicitParams({ + @ApiImplicitParam(name = "", value = "身份认证", dataType = "string", example = "1130", required = true), + @ApiImplicitParam(name = "order", value = "请求体", required = true)}) + @PostMapping({"/api/invoice_all/v1/invoice_statistics/{identity}", "/api/invoice_all/v1/invoice_statistics"}) + public Object invoiceStatistics(HttpServletRequest request, String identity) throws Exception { +// invoiceStatic + + if (StringUtils.isEmpty(identity)) { + return AjaxResult.error(ErrorCode.EMPTY_IDENTITY); + } + + Companyservice companyservice = iCompanyserviceService.selectCompanyserviceByIdentity(identity); + if (companyservice == null) { + return AjaxResult.error(ErrorCode.COMPANY_NOT_FOUND); + } + + // 获得入口报文适配器 + String requestAdapterKey = serviceManageService.getRequestAdapterKey("invoice", companyservice.getCompanyid()); + IInvoiceRequestService invoiceRequestService = invoiceRequestFactory.getService(requestAdapterKey); + JSONObject decryptResult = invoiceRequestService.decrypt(request, companyservice, ""); + + // 获得请求实例,并且进行扣费 + String serviceKey = serviceManageService.getCompanyServiceSupplier("invoice", companyservice.getCompanyid()); + serviceManageService.companyConsume("invoice", companyservice.getCompanyid()); + + IInvoiceApiService invoiceService = invoiceServiceFactory.getService(serviceKey); + HXResponse result = invoiceService.invoiceStatic(decryptResult, companyservice); + + String responseAdapterKey = serviceManageService.getResponseAdapterKey("invoice", companyservice.getCompanyid()); + IInvoiceResponseService invoiceResponseService = invoiceResponseFactory.getService(responseAdapterKey); + + return invoiceResponseService.response(result, companyservice, ""); + + } + + @ApiOperation("审核红字信息表") + @ApiImplicitParams({ + @ApiImplicitParam(name = "", value = "身份认证", dataType = "string", example = "1130", required = true), + @ApiImplicitParam(name = "order", value = "请求体", required = true)}) + @PostMapping({"/api/invoice_all/v1/auditRedInfo/{identity}", "/api/invoice_all/v1/auditRedInfo"}) + public Object auditRedInfo(HttpServletRequest request, String identity) throws Exception { +// auditRedInfo + + if (StringUtils.isEmpty(identity)) { + return AjaxResult.error(ErrorCode.EMPTY_IDENTITY); + } + + Companyservice companyservice = iCompanyserviceService.selectCompanyserviceByIdentity(identity); + if (companyservice == null) { + return AjaxResult.error(ErrorCode.COMPANY_NOT_FOUND); + } + + // 获得入口报文适配器 + String requestAdapterKey = serviceManageService.getRequestAdapterKey("invoice", companyservice.getCompanyid()); + IInvoiceRequestService invoiceRequestService = invoiceRequestFactory.getService(requestAdapterKey); + JSONObject decryptResult = invoiceRequestService.decrypt(request, companyservice, ""); + + // 获得请求实例,并且进行扣费 + String serviceKey = serviceManageService.getCompanyServiceSupplier("invoice", companyservice.getCompanyid()); + serviceManageService.companyConsume("invoice", companyservice.getCompanyid()); + + IInvoiceApiService invoiceService = invoiceServiceFactory.getService(serviceKey); + HXResponse result = invoiceService.auditRedInfo(decryptResult, companyservice); + + String responseAdapterKey = serviceManageService.getResponseAdapterKey("invoice", companyservice.getCompanyid()); + IInvoiceResponseService invoiceResponseService = invoiceResponseFactory.getService(responseAdapterKey); + + return invoiceResponseService.response(result, companyservice, ""); + + } + + + + + } diff --git a/jianshui-invoice/src/main/java/com/jianshui/invoice/service/IInvoiceApiService.java b/jianshui-invoice/src/main/java/com/jianshui/invoice/service/IInvoiceApiService.java index 6ee0ac7..31c7473 100644 --- a/jianshui-invoice/src/main/java/com/jianshui/invoice/service/IInvoiceApiService.java +++ b/jianshui-invoice/src/main/java/com/jianshui/invoice/service/IInvoiceApiService.java @@ -9,7 +9,6 @@ import com.jianshui.invoice.domain.Redinfo; import com.jianshui.invoice.domain.dto.*; import javax.servlet.http.HttpServletRequest; -import java.util.List; /** * 发票服务接口 @@ -187,4 +186,74 @@ public interface IInvoiceApiService { * @return */ public Object decryptCallback(HttpServletRequest request); + + /** 全电新增接口 **/ + + /** + * 全电发票文件获取 + * @param decryptResult + * @param companyservice + * @return + */ + HXResponse getFileUrl(JSONObject decryptResult, Companyservice companyservice); + + /** + * 全电发票文件获取 + * @param decryptResult + * @param companyservice + * @return + */ + HXResponse getFileAcquisitionOn(JSONObject decryptResult, Companyservice companyservice); + + /** + *获取人脸二维码 + * @param decryptResult + * @param companyservice + * @return + */ + HXResponse qrcode(JSONObject decryptResult, Companyservice companyservice); + + /** + *获取人脸二维码 + * @param decryptResult + * @param companyservice + * @return + */ + HXResponse query(JSONObject decryptResult, Companyservice companyservice); + + /** + *获取发票打印XML + * @param decryptResult + * @param companyservice + * @return + */ + HXResponse getPrintXML(JSONObject decryptResult, Companyservice companyservice); + + /** + *快速红冲 + * @param decryptResult + * @param companyservice + * @return + */ + HXResponse issueFastRedInvoice(JSONObject decryptResult, Companyservice companyservice); + + /** + *蓝字发票统计 + * @param decryptResult + * @param companyservice + * @return + */ + HXResponse invoiceStatic(JSONObject decryptResult, Companyservice companyservice); + + /** + *审核红字信息表 + * @param decryptResult + * @param companyservice + * @return + */ + HXResponse auditRedInfo(JSONObject decryptResult, Companyservice companyservice); + + + + } diff --git a/jianshui-invoice/src/main/java/com/jianshui/invoice/service/impl/api/AisinoConsoleInvoiceApiServiceImpl.java b/jianshui-invoice/src/main/java/com/jianshui/invoice/service/impl/api/AisinoConsoleInvoiceApiServiceImpl.java index 986d6f8..cd9de95 100644 --- a/jianshui-invoice/src/main/java/com/jianshui/invoice/service/impl/api/AisinoConsoleInvoiceApiServiceImpl.java +++ b/jianshui-invoice/src/main/java/com/jianshui/invoice/service/impl/api/AisinoConsoleInvoiceApiServiceImpl.java @@ -931,4 +931,44 @@ public class AisinoConsoleInvoiceApiServiceImpl implements IInvoiceApiService { public Object decryptCallback(HttpServletRequest request) { return null; } + + @Override + public HXResponse getFileUrl(JSONObject decryptResult, Companyservice companyservice) { + return null; + } + + @Override + public HXResponse getFileAcquisitionOn(JSONObject decryptResult, Companyservice companyservice) { + return null; + } + + @Override + public HXResponse qrcode(JSONObject decryptResult, Companyservice companyservice) { + return null; + } + + @Override + public HXResponse query(JSONObject decryptResult, Companyservice companyservice) { + return null; + } + + @Override + public HXResponse getPrintXML(JSONObject decryptResult, Companyservice companyservice) { + return null; + } + + @Override + public HXResponse issueFastRedInvoice(JSONObject decryptResult, Companyservice companyservice) { + return null; + } + + @Override + public HXResponse invoiceStatic(JSONObject decryptResult, Companyservice companyservice) { + return null; + } + + @Override + public HXResponse auditRedInfo(JSONObject decryptResult, Companyservice companyservice) { + return null; + } } diff --git a/jianshui-invoice/src/main/java/com/jianshui/invoice/service/impl/api/ElephantInvoiceApiServiceImpl.java b/jianshui-invoice/src/main/java/com/jianshui/invoice/service/impl/api/ElephantInvoiceApiServiceImpl.java index 1e7b433..01fedb4 100644 --- a/jianshui-invoice/src/main/java/com/jianshui/invoice/service/impl/api/ElephantInvoiceApiServiceImpl.java +++ b/jianshui-invoice/src/main/java/com/jianshui/invoice/service/impl/api/ElephantInvoiceApiServiceImpl.java @@ -1737,4 +1737,44 @@ public class ElephantInvoiceApiServiceImpl implements IInvoiceApiService { resp.put("ZFFPXX", respArray); return resp; } + + @Override + public HXResponse getFileUrl(JSONObject decryptResult, Companyservice companyservice) { + return null; + } + + @Override + public HXResponse getFileAcquisitionOn(JSONObject decryptResult, Companyservice companyservice) { + return null; + } + + @Override + public HXResponse qrcode(JSONObject decryptResult, Companyservice companyservice) { + return null; + } + + @Override + public HXResponse query(JSONObject decryptResult, Companyservice companyservice) { + return null; + } + + @Override + public HXResponse getPrintXML(JSONObject decryptResult, Companyservice companyservice) { + return null; + } + + @Override + public HXResponse issueFastRedInvoice(JSONObject decryptResult, Companyservice companyservice) { + return null; + } + + @Override + public HXResponse invoiceStatic(JSONObject decryptResult, Companyservice companyservice) { + return null; + } + + @Override + public HXResponse auditRedInfo(JSONObject decryptResult, Companyservice companyservice) { + return null; + } } diff --git a/jianshui-invoice/src/main/java/com/jianshui/invoice/service/impl/api/JcskInvoiceApiServiceImpl.java b/jianshui-invoice/src/main/java/com/jianshui/invoice/service/impl/api/JcskInvoiceApiServiceImpl.java index 8ac5936..00ad2f2 100644 --- a/jianshui-invoice/src/main/java/com/jianshui/invoice/service/impl/api/JcskInvoiceApiServiceImpl.java +++ b/jianshui-invoice/src/main/java/com/jianshui/invoice/service/impl/api/JcskInvoiceApiServiceImpl.java @@ -909,6 +909,46 @@ public class JcskInvoiceApiServiceImpl implements IInvoiceApiService { return null; } + @Override + public HXResponse getFileUrl(JSONObject decryptResult, Companyservice companyservice) { + return null; + } + + @Override + public HXResponse getFileAcquisitionOn(JSONObject decryptResult, Companyservice companyservice) { + return null; + } + + @Override + public HXResponse qrcode(JSONObject decryptResult, Companyservice companyservice) { + return null; + } + + @Override + public HXResponse query(JSONObject decryptResult, Companyservice companyservice) { + return null; + } + + @Override + public HXResponse getPrintXML(JSONObject decryptResult, Companyservice companyservice) { + return null; + } + + @Override + public HXResponse issueFastRedInvoice(JSONObject decryptResult, Companyservice companyservice) { + return null; + } + + @Override + public HXResponse invoiceStatic(JSONObject decryptResult, Companyservice companyservice) { + return null; + } + + @Override + public HXResponse auditRedInfo(JSONObject decryptResult, Companyservice companyservice) { + return null; + } + /** * 简税和金财数科 发票类型互换