views.py 5.81 KB
from common.mixins import GenericView
from webargs.djangoparser import use_args, parser
from webargs import fields, validate
from apps.doc.views import CustomDecimal, CustomDate
from common import response
from apps.doc.mixins import PosHandler
from common.tools.comparison import cp
from common.mixins import LoggerMixin
from rest_framework.permissions import IsAuthenticated
from apps.account.authentication import OAuth2AuthenticationWithUser
from apps.doc.models import NscInvoice
import json
from datetime import datetime

params = {
    'invoiceCode': fields.Str(required=True, validate=validate.Length(max=128)),
    'invoiceNumber': fields.Str(required=True, validate=validate.Length(max=64)),
    'issueDate': CustomDate(required=True),
    'buyerName': fields.Str(required=True, validate=validate.Length(max=64)),
    "buyerId": fields.Str(required=True, validate=validate.Length(max=64)),
    'vin': fields.Str(required=True, validate=validate.Length(max=128)),
    'dealer': fields.Str(required=False, validate=validate.Length(max=64)),
    'priceWithVat': CustomDecimal(required=True),
    'priceNoVat': CustomDecimal(required=True),
    'priceInCapitals': fields.Str(required=False),
    'vat': CustomDecimal(required=True),
    'vatRate': CustomDecimal(required=False),
}

input_args = {
    'content': fields.Nested(params, required=True)
}


# pos 接口接收NSC 发票信息
class NSCInvoiceView(GenericView):
    permission_classes = [IsAuthenticated]
    authentication_classes = [OAuth2AuthenticationWithUser]

    @use_args(input_args, location='data')
    def post(self, request, args):  # interface_report mpos to ocr
        content = args.get('content', {})
        invoice_code = content.get('invoiceCode', '')
        invoice_number = content.get('invoiceNumber', '')
        issue_date = content.get('issueDate', None)
        buyer_name = content.get('buyerName', '')
        buyer_id = content.get('buyerId', 0)
        vin = content.get('vin', '')
        dealer = content.get('dealer', '')
        price_with_vat = content.get('priceWithVat', 0.0)
        price_no_vat = content.get('priceNoVat', 0.0)
        price_in_capitals = content.get('priceInCapitals', '')
        vat = content.get('vat', 0.0)
        vat_rate = content.get('vatRate', 0.0)

        NscInvoice.objects.create(vin=vin, content=json.dumps(content), create_time=datetime.now())
        return response.ok()


file_param = {
    'documentType': fields.Str(required=True, validate=validate.Length(max=20)),
    'fileBase64': fields.Str(required=True),
}

de_mortgage_args = {
    'customerName': fields.Str(required=True, validate=validate.Length(max=64)),
    'applicationName': fields.Str(required=True, validate=validate.Length(max=64)),
    'deMortgageDate': fields.Str(required=True),
    'files': fields.List(fields.Nested(file_param))
}


de_mortgage_comments = {
    'customerName': '机动车所有人识别不一致',
    'applicationName': '抵押权人姓名/名称识别不一致',
    'deMortgageDate': '解除抵押日期不一致'
}


# 解除抵押识别处理
class DeMortgageView(GenericView):
    permission_classes = [IsAuthenticated]
    authentication_classes = [OAuth2AuthenticationWithUser]

    @use_args(de_mortgage_args, location='data')
    def post(self, request, args):  # interface_report mpos to ocr
        files = args.get('files', [])
        customer_name = args.get('customerName', '')
        application_name = args.get('applicationName', '')
        de_mortgage_date = args.get('deMortgageDate')

        fields_input = {
            'customerName': customer_name,
            'applicationName': application_name,
            'deMortgageDate': de_mortgage_date
        }
        de_mortgage_info = {'customer_name':'','applicationName':'','deMortgageDate':''}
        # 绿本必须分开ocr
        for file_obj in files:
            info = PosHandler.de_mortgage_ocr_process1(file_obj)
            if info.get('customerName') is not '':
                de_mortgage_info['customerName'] = info.get('customerName')
            if info.get('applicationName') is not '':
                de_mortgage_info['applicationName'] = info.get('applicationName')
            if info.get('deMortgageDate') is not '':
                de_mortgage_info['deMortgageDate'] = info.get('deMortgageDate')    
            #de_mortgage_info.update(info)

        request_pass = True
        fields_result = []
        for field_name, input_val in fields_input.items():
            field_result = {
                "name": field_name,
                "input": input_val,
                "ocr": de_mortgage_info.get(field_name, ''),
                "field_is_pass": False,
                "comments": ''
            }
            result, _ = cp.common_compare(field_result['input'], field_result['ocr'], None)
            LoggerMixin.running_log.info(
                "[DeMortgageView common_compare] input: %s, ocr: %s, result:%s ",
                field_result['input'], field_result['ocr'], result)
            if result == cp.RESULT_Y:
                field_result['field_is_pass'] = True

            else:
                request_pass = False
                field_result['comments'] = de_mortgage_comments.get(field_name, '')

            fields_result.append(field_result)

        result = {
            "is_pass": request_pass,
            "fields": fields_result
        }
        return response.ok(data=result)


class DeMortgageView1(GenericView):
    permission_classes = [IsAuthenticated]
    authentication_classes = [OAuth2AuthenticationWithUser]

    @use_args(de_mortgage_args, location='data')
    def post(self, request, args):  # interface_report mpos to ocr
        files = args.get('files', [])
        customer_name = args.get('customerName', '')
        application_name = args.get('applicationName', '')
        de_mortgage_date = args.get('deMortgageDate')

        return response.ok(data=args)