VerifVATInvoice/alibabacloud_sample/service.py
liuxiaoqing 31404cf225 refactor(webapp): 优化发票验证流程和界面
- 修改验证流程初始步骤为第3步- 更新验证结果展示方式,使用 Ant Design Result 组件
-优化上传页面样式,增加顶部间距
- 调整验证接口返回格式,统一错误处理
2025-08-19 22:42:38 +08:00

149 lines
6.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# -*- coding: utf-8 -*-
# This file is auto-generated, don't edit it. Thanks.
import os
import statistics
import sys
from typing import List
from alibabacloud_credentials.models import Config
from alibabacloud_ocr_api20210707.client import Client as ocr_api20210707Client, Client
from alibabacloud_credentials.client import Client as CredentialClient
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_ocr_api20210707 import models as ocr_api_20210707_models
from alibabacloud_tea_util import models as util_models
from alibabacloud_tea_console.client import Client as ConsoleClient
from alibabacloud_tea_util.client import Client as UtilClient
from alibabacloud_darabonba_stream.client import Client as StreamClient
from flask import json
from alibabacloud_sample.dataservice import DataService
class Service:
def __init__(self):
pass
# 发票类型字典
typeDict = {
"增值税专用发票": 1,
"增值税普通发票": 4,
"增值税普通发票(电子)": 10,
"增值税普通发票(卷式)": 11,
"增值税普通发票(通行费)": 14,
"增值税电子专用发票": 20,
"数电发票(增值税专用发票)": 31,
"数电发票(增值税普通发票)": 32,
"数电发票(纸质专用发票)": 85,
"数电发票(纸质普通发票)": 86,
}
@staticmethod
def create_client() -> ocr_api20210707Client:
"""
使用凭据初始化账号Client
@return: Client
@throws Exception
"""
# 工程代码建议使用更安全的无AK方式凭据配置方式请参见https://help.aliyun.com/document_detail/378659.html。
# credential = CredentialClient()
# config = open_api_models.Config(
# credential=credential
# )
config = Config(
type='access_key',
access_key_id='LTAI5tHvCWb5uHZ9Q7iUJTLp',
access_key_secret='zKAL7WqvnJ0lN0GHsvJptAGRiuCOfM'
)
config.endpoint = f'ocr-api.cn-hangzhou.aliyuncs.com'
cred = CredentialClient(config)
cred.get_credential()
nconfig = open_api_models.Config(
credential=cred
)
# Endpoint 请参考 https://api.aliyun.com/product/ocr-api
nconfig.endpoint = f'ocr-api.cn-hangzhou.aliyuncs.com'
return ocr_api20210707Client(nconfig)
# 发票验证
@staticmethod
def verify(data: dict, file_path: str,reverify: bool = False):
dataservice = DataService()
# 复验
if not reverify:
data1 = dataservice.get_verify_log(file_path=file_path)
print(data1)
if data1 is not None and int(data1.get('inspectionAmount')) > 0:
return data1
client = Service.create_client()
type = Service.typeDict.get(data.get('invoiceType'))
sum = data.get('totalAmount')
if type == 1 or type == 20:
sum = data.get('totalAmountWithoutTax')
if data.get('checkCode') is not None:
verify_code = data.get('checkCode')[-6:]
else:
verify_code = None
date = data.get('invoiceDate').replace('', "").replace('', "").replace('', "")
verify_vatinvoice_request = ocr_api_20210707_models.VerifyVATInvoiceRequest(
invoice_no= data.get('invoiceNumber'),
invoice_code= data.get('invoiceCode'),
invoice_date= date,
invoice_sum= sum,
invoice_kind= type,
verify_code= verify_code,
)
runtime = util_models.RuntimeOptions()
try:
resp = client.verify_vatinvoice_with_options(verify_vatinvoice_request, runtime)
ConsoleClient.log(UtilClient.to_jsonstring(resp))
respjson = json.loads(UtilClient.to_jsonstring(resp.body.data))
code = respjson.get('code')
if code != '001':
return {'cyjgxx': respjson.get('msg'), 'inspectionAmount': -1,'status': 'fail'}
resdata = respjson.get('data')
if resdata is None:
resdata = {'cyjgxx': "未查询到发票信息", 'inspectionAmount': -1,'status': 'fail'}
else:
resdata.update({'status': 'success'})
resdata['status'] = 'success'
dataservice.insert_verify_log(resdata.get('inspectionAmount'), resdata.get('cyjgxx'), file_path)
dataservice.update_invoice_status(data.get('id'), resdata.get('status'), resdata.get('inspectionAmount'))
return resdata
except Exception as error:
# 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
# 错误 message
print(error)
# 诊断地址
print(error.data.get("Recommend"))
UtilClient.assert_as_string(error.message)
# 发票识别
@staticmethod
def recognize(file_path: str):
client = Service.create_client()
dataservice = DataService()
body_stream = StreamClient.read_from_file_path(file_path)
recognize_mixed_invoices_request = ocr_api_20210707_models.RecognizeMixedInvoicesRequest(
body=body_stream
)
runtime = util_models.RuntimeOptions()
try:
# 复制代码运行请自行打印 API 的返回值
res = client.recognize_mixed_invoices_with_options(recognize_mixed_invoices_request, runtime)
print(UtilClient.to_jsonstring(res.body.data))
data = json.loads(UtilClient.to_jsonstring(res.body.data)).get('subMsgs')[0].get('result').get('data')
data_id = dataservice.insert_invoice_log(data, file_path)
data.update({'id': data_id})
return data
except Exception as error:
# 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
# 错误 message
print(error.message)
# 诊断地址
print(error.data.get("Recommend"))
UtilClient.assert_as_string(error.message)
# 发票验证记录
@staticmethod
def get_verify_log_list(file_path):
dataservice = DataService()
return dataservice.get_verify_log_list(file_path)