VerifVATInvoice/alibabacloud_sample/service.py

148 lines
6.2 KiB
Python
Raw Normal View History

# -*- 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)
# 诊断地址
UtilClient.assert_as_string(error)
# 发票验证记录
@staticmethod
def get_verify_log_list(file_path):
dataservice = DataService()
return dataservice.get_verify_log_list(file_path)