151 lines
6.3 KiB
Python
151 lines
6.3 KiB
Python
# -*- 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='LTAI5t7481fKEcZjrvWyZp48',
|
||
access_key_secret='FwRfm4gst2Dk10tbXeJl0OV7EzL6qM'
|
||
|
||
# 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)
|