diff --git a/src/apps/doc/mixins.py b/src/apps/doc/mixins.py index 462c295..66d13bd 100644 --- a/src/apps/doc/mixins.py +++ b/src/apps/doc/mixins.py @@ -5,6 +5,7 @@ from .named_enum import DocStatus from .models import HILDoc, AFCDoc, AFCSEOCRResult, AFCOCRResult, HILSEOCRResult, HILOCRResult from . import consts from prese.compare import pre_compare, get_empty_result +from common.mixins import LoggerMixin class MPOSHandler: @@ -170,3 +171,38 @@ class PreSEHandler: rebuild_compare_result = pre_compare(pos_content, ocr_res_dict, id_res_list) return rebuild_compare_result + + +class PosHandler: + VehicleRegArea_fields = ['抵押权人姓名/名称', '解除抵押日期'] + VehicleRCI_fields = ['1.机动车所有人/身份证名称/号码'] + + @staticmethod + def de_mortgage_ocr_process(img_base64): + result_obj = {} + url = 'http://file-classification.situdata.com/bs/all' + json_data = {"file": img_base64, "classify": consts.MVC_CLASSIFY} + try: + response = requests.post(url, json=json_data) + ocr_res = response.json() + results = ocr_res.get('results') + if ocr_res.get('page', '') == 'VehicleRegArea': + register_infos = results.get('register_info', []) + for register_info in register_infos: + if register_info.get('register_type', -1) == 1: + info = register_info.get('解除抵押日期', {}) + result_obj['deMortgageDate'] = info.get('words', '') + elif register_info.get('register_type', -1) == 0: + info = register_info.get('抵押权人姓名/名称', {}) + result_obj['application'] = info.get('words', '') + elif ocr_res.get('page', '') == 'VehicleRCI': + info = results.get('1.机动车所有人/身份证名称/号码', {}) + result_obj['customerName'] = info.get('words', '').split('/')[0] + except Exception as e: + LoggerMixin.running_log.error('[PosHandler de_mortgage_ocr_process] [error={0}]'.format(e.format_exc())) + result_obj = { + 'customerName': '', + 'application': '', + 'deMortgageDate': '' + } + return result_obj diff --git a/src/apps/doc/views.py b/src/apps/doc/views.py index 9a5661a..edecdb6 100644 --- a/src/apps/doc/views.py +++ b/src/apps/doc/views.py @@ -55,7 +55,7 @@ from . import consts from apps.account.authentication import OAuth2AuthenticationWithUser from celery_compare.tasks import compare - +import time class CustomDate(fields.Date): def _deserialize(self, value, attr, data, **kwargs): @@ -804,6 +804,8 @@ class SECompareView(GenericView, PreSEHandler): # SE preSettlement @use_args(se_compare_args, location='data') def post(self, request, args): # interface_report pos to ocr + # 模拟耗时操作 + time.sleep(25) start_time = time.time() log_base = '[prese]' # 存库 diff --git a/src/apps/urls.py b/src/apps/urls.py index 6437c78..9058ab8 100644 --- a/src/apps/urls.py +++ b/src/apps/urls.py @@ -26,7 +26,7 @@ urlpatterns = [ path(r'api/compare/', include('apps.doc.compare_urls')), path(r'api/doc/', include('apps.doc.internal_urls')), path(r'api/mpos/', include('apps.doc.mpos_urls')), - path(r'api/pos/', include('apps.doc.pos_urls')), + path(r'api/poss/', include('apps.doc.pos_urls')), path(r'api/go/', include('apps.doc.go_urls')), path('api/oauth/', include('oauth2_provider.urls', namespace='oauth2_provider')), ] diff --git a/src/pos/__init__.py b/src/pos/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/src/pos/__init__.py diff --git a/src/pos/views.py b/src/pos/views.py index 0602194..3868f86 100644 --- a/src/pos/views.py +++ b/src/pos/views.py @@ -3,8 +3,8 @@ 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.models import HILSEOCRResult, HILOCRResult, AFCSEOCRResult, AFCOCRResult -from prese import consts +from apps.doc.mixins import PosHandler +from common.tools.comparison import cp params = { 'invoiceCode': fields.Str(required=True, validate=validate.Length(max=128)), @@ -26,7 +26,7 @@ input_args = { } -# pos 接口接收NSC 发票信息 +# poss 接口接收NSC 发票信息 class NSCInvoiceView(GenericView): @use_args(input_args, location='data') def post(self, request, args): # interface_report mpos to ocr @@ -47,12 +47,18 @@ class NSCInvoiceView(GenericView): return response.ok() -de_mortgage_params = { - +de_mortgage_args = { + 'customerName': fields.Str(required=True, validate=validate.Length(max=64)), + 'application': fields.Str(required=True, validate=validate.Length(max=64)), + 'deMortgageDate': fields.Date(required=True), + 'file_base64': fields.List(fields.Str(), required=True, validate=validate.Length(min=1)), } -de_mortgage_args = { - 'content': fields.Nested(de_mortgage_params, required=True) + +de_mortgage_comments = { + 'customerName': ('机动车所有人识别不一致', ), + 'application': ('抵押权人姓名/名称识别不一致', ), + 'deMortgageDate': ('解除抵押日期不一致', ) } @@ -60,46 +66,43 @@ de_mortgage_args = { class DeMortgageView(GenericView): @use_args(de_mortgage_args, location='data') def post(self, request, args): # interface_report mpos to ocr - content = args.get('content', {}) - application_id = content['applicationId'] - customer_name = content['customerName'] - application_entity = content['applicationEntity'] - de_mortgage_date = content['deMortgageDate'] - - # ocr 检测 - # 根据application_id查找OCR累计结果指定license字段,如果没有,结束 - result_class = HILSEOCRResult if application_entity in consts.HIL_SET else AFCSEOCRResult - ca_result_class = HILOCRResult if application_entity in consts.HIL_SET else AFCOCRResult - - ca_ocr_res_dict = ca_result_class.objects.filter(application_id=application_id).values( - *consts.CA_ADD_COMPARE_FIELDS_PRE).first() - ocr_res_dict = result_class.objects.filter(application_id=application_id).values( - *consts.PRE_COMPARE_FIELDS).first() - # if ocr_res_dict is None: - # return get_empty_result() - - ic_res_list = [] - ic_res_list.append(ca_ocr_res_dict.get(consts.IC_OCR_FIELD) if isinstance(ca_ocr_res_dict, dict) else None) - ic_res_list.append(ocr_res_dict.get(consts.IC_OCR_FIELD) if isinstance(ca_ocr_res_dict, dict) else None) - - field_name, compare_logic, args, comment = consts.ID_COMPARE_LOGIC.get(consts.ID_FIELDS[0]) - for ic_res in ic_res_list: - if ic_res: - value = ic_res.get(field_name, '') - compare_logic + img_files = args.get('file_base64', []) + customer_name = args.get('customerName', '') + application = args.get('application', '') + de_mortgage_date = args.get('deMortgageDate') + + fields_input = { + 'customerName': customer_name, + 'application': application, + 'deMortgageDate': de_mortgage_date + } + de_mortgage_info = {} + # 绿本必须分开ocr + for img_file in img_files: + info = PosHandler.de_mortgage_ocr_process(img_file) + de_mortgage_info.update(info) + + request_pass = True + fields_result = [] + for field_name, input_val in enumerate(fields_input): + 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']) + if result == cp.RESULT_Y: + fields_result['field_is_pass'] = result + else: + request_pass = False + fields_result['comments'] = de_mortgage_comments.get(field_name, '') + + fields_result.append(field_result) result = { - "is_pass": True, - "fields": [{ - "name": "", - "input": "张三", - "ocr": "张三", - "field_is_pass": True, - "comments": "身份证姓名与系统不一致" - }] - # "customer_name": True, - # "application_entity": True, - # "de_mortgage_date": True + "is_pass": request_pass, + "fields": fields_result } return response.ok(data=result) -