tasks.py 9.71 KB
import json
import logging
import traceback
from . import app
from apps.doc.models import AFCOCRResult, HILOCRResult, AFCComparisonInfo, HILComparisonInfo
from apps.doc import consts
from apps.doc.ocr.gcap import gcap
from apps.doc.exceptions import GCAPException
from common.tools.comparison import cp

compare_log = logging.getLogger('compare')
log_base = '[CA Compare]'


@app.task
def compare(application_id, application_entity, uniq_seq, ocr_res_id):
    # POS: application_id, application_entity, uniq_seq, None
    # OCR: application_id, business_type(application_entity), None, ocr_res_id

    compare_log.info('{0} [receive task] [entity={1}] [id={2}] [uniq_seq={3}] [ocr_res_id={4}]'.format(
        log_base, application_entity, application_id, uniq_seq, ocr_res_id))

    # 根据application_id查找最新的比对信息,如果没有,结束
    comparison_class = HILComparisonInfo if application_entity == consts.HIL_PREFIX else AFCComparisonInfo
    last_obj = comparison_class.objects.filter(application_id=application_id).last()
    if last_obj is None:
        compare_log.info('{0} [comparison info empty] [entity={1}] [id={2}] [uniq_seq={3}] [ocr_res_id={4}]'.format(
            log_base, application_entity, application_id, uniq_seq, ocr_res_id
        ))
        return

    # 根据application_id查找OCR累计结果指定license字段,如果没有,结束
    result_class = HILOCRResult if application_entity == consts.HIL_PREFIX else AFCOCRResult
    if ocr_res_id is None:
        ocr_res_dict = result_class.objects.filter(application_id=application_id).values(*consts.COMPARE_FIELDS).first()
    else:
        ocr_res_dict = result_class.objects.filter(id=ocr_res_id).values(*consts.COMPARE_FIELDS).first()
    if ocr_res_dict is None:
        compare_log.info('{0} [ocr info empty] [entity={1}] [id={2}] [uniq_seq={3}] [ocr_res_id={4}]'.format(
            log_base, application_entity, application_id, uniq_seq, ocr_res_id
        ))
        return

    # 比对信息
    comparison_res = {
        'OCR_Input': {
            'uniqSeq': last_obj.uniq_seq,
            'applicationId': application_id,
            'applicationEntity': application_entity,
            'applicationVersion': last_obj.application_version,
            'vehicleStatus': last_obj.vehicle_status,
            # 'wholeResult': 'Y',
            'wholeResultMessage': '',
            'applicationLink': '',
        }
    }

    res_set = set()

    is_sep = True if last_obj.customer_type == consts.CUSTOMER_TYPE[5] else False

    individual_cus_info_list = json.loads(last_obj.individual_cus_info)
    for individual_cus_info in individual_cus_info_list:
        individual_cus_info['customerType'] = last_obj.customer_type
        # sep营业执照
        if is_sep and individual_cus_info.get('companyName') is not None:
            sep_is_find = False
            sep_ocr_res_str = ocr_res_dict.get('bl_ocr')
            if sep_ocr_res_str is not None:
                sep_ocr_list = json.loads(sep_ocr_res_str)
                for sep_ocr in sep_ocr_list:
                    company_name = sep_ocr.get(consts.TCSEP.get('companyName')[0])
                    if company_name is None or company_name != individual_cus_info.get('companyName'):
                        continue
                    sep_is_find = True
                    for sep_field, sep_tuple in consts.TCSEP.items():
                        sep_res = getattr(cp, sep_tuple[1])(
                            individual_cus_info.get(sep_field), sep_ocr.get(sep_tuple[0]), sep_tuple[2])
                        individual_cus_info[sep_field + 'Result'] = sep_res
                        res_set.add(sep_res)
                    break
            if not sep_is_find:
                res_set.add(consts.RESULT_N)
                for field in consts.TCSEP.keys():
                    individual_cus_info[field + 'Result'] = consts.RESULT_N

        # 个人信息证件
        id_type = individual_cus_info.get('idType')
        compare_target = consts.ID_TYPE_COMPARE.get(id_type)
        if compare_target is None:
            continue
        is_find = False
        ocr_res_str = ocr_res_dict.get(compare_target.get('model_field'))
        if ocr_res_str is not None:
            ocr_res_list = json.loads(ocr_res_str)
            compare_target_dict = compare_target.get('compare_field')
            for ocr_res in ocr_res_list:
                base_name = ocr_res.get(compare_target_dict.get('customerChineseName')[0])
                if base_name is None or base_name != individual_cus_info.get('customerChineseName'):  # TODO 特殊姓名比对
                    continue
                is_find = True
                for compare_field, compare_tuple in compare_target.get('compare_field').items():
                    compare_res = getattr(cp, compare_tuple[1])(
                        individual_cus_info.get(compare_field), ocr_res.get(compare_tuple[0]), compare_tuple[2])
                    individual_cus_info[compare_field + 'Result'] = compare_res
                    res_set.add(compare_res)
                break
        if not is_find:
            res_set.add(consts.RESULT_N)
            for field in compare_target.get('compare_field').keys():
                individual_cus_info[field + 'Result'] = consts.RESULT_N

    comparison_res['individualCusInfo'] = individual_cus_info_list

    if last_obj.corporate_cus_info is not None:
        corporate_cus_info = json.loads(last_obj.corporate_cus_info)
        corporate_cus_info['customerType'] = last_obj.customer_type

        is_bl_find = False
        bl_ocr_res_str = ocr_res_dict.get('bl_ocr')
        if bl_ocr_res_str is not None:
            bl_ocr_list = json.loads(bl_ocr_res_str)
            for bl_ocr in bl_ocr_list:
                company_name = bl_ocr.get(consts.TCCOR.get('customerChineseName')[0])
                if company_name is None or company_name != corporate_cus_info.get('customerChineseName'):
                    continue
                is_bl_find = True
                for bl_field, bl_tuple in consts.TCCOR.items():
                    bl_res = getattr(cp, bl_tuple[1])(
                        corporate_cus_info.get(bl_field), bl_ocr.get(bl_tuple[0]), bl_tuple[2])
                    corporate_cus_info[bl_field + 'Result'] = bl_res
                    res_set.add(bl_res)
                break
        if not is_bl_find:
            res_set.add(consts.RESULT_N)
            for field in consts.TCCOR.keys():
                corporate_cus_info[field + 'Result'] = consts.RESULT_N

        comparison_res['corporateCusInfo'] = corporate_cus_info

    if last_obj.vehicle_status == consts.VEHICLE_STATUS[0] and last_obj.usedcar_info is not None:
        usedcar_info = json.loads(last_obj.usedcar_info)

        is_usedcar_find = False
        mvc_ocr_res_str = ocr_res_dict.get('mvc_ocr')
        if mvc_ocr_res_str is not None:
            mvc_ocr_list = json.loads(mvc_ocr_res_str)
            for mvc_ocr in mvc_ocr_list:
                vin_no = mvc_ocr.get(consts.PCUSD_MVC.get('vinNo')[0])
                if vin_no is None or vin_no != usedcar_info.get('vinNo'):
                    continue
                is_usedcar_find = True
                for mvc_field, mvc_tuple in consts.PCUSD_MVC.items():
                    mvc_res = getattr(cp, mvc_tuple[1])(
                        usedcar_info.get(mvc_field), mvc_ocr.get(mvc_tuple[0]), mvc_tuple[2])
                    usedcar_info[mvc_field + 'Result'] = mvc_res
                    res_set.add(mvc_res)

                dl_find = False
                dl_ocr_res_str = ocr_res_dict.get('dl_ocr')
                if dl_ocr_res_str is not None:
                    dl_ocr_list = json.loads(dl_ocr_res_str)
                    for dl_ocr in dl_ocr_list:
                        dl_vin_no = dl_ocr.get(consts.PCUSD_DL.get('vinNo')[0])
                        if dl_vin_no is None or dl_vin_no != usedcar_info.get('vinNo'):
                            continue
                        dl_find = True
                        break
                if not dl_find:
                    res_set.add(consts.RESULT_N)
                    usedcar_info['vinNo' + 'Result'] = consts.RESULT_N
                break
        if not is_usedcar_find:
            res_set.add(consts.RESULT_N)
            for field in consts.PCUSD_MVC.keys():
                usedcar_info[field + 'Result'] = consts.RESULT_N
        comparison_res['usedCarInfo'] = usedcar_info

    comparison_res['wholeResult'] = consts.RESULT_N if consts.RESULT_N in res_set else consts.RESULT_Y
    print(comparison_res)

    # 将比对结果发送GCAP
    # try:
    #     data = gcap.dict_to_xml(comparison_res)
    # except Exception as e:
    #     compare_log.error('{0} [dict to xml failed] [entity={1}] [id={2}] [uniq_seq={3}] [ocr_res_id={4}] '
    #                       '[error={5}]'.format(log_base, application_entity, application_id, uniq_seq, ocr_res_id,
    #                                            traceback.format_exc()))
    # else:
    #     try:
    #         for times in range(consts.RETRY_TIMES):
    #             try:
    #                 gcap.send(data)
    #             except Exception as e:
    #                 gcap_exc = str(e)
    #             else:
    #                 break
    #         else:
    #             raise GCAPException(gcap_exc)
    #     except Exception as e:
    #         compare_log.error('{0} [gcap failed] [entity={1}] [id={2}] [uniq_seq={3}] [ocr_res_id={4}] '
    #                           '[error={5}]'.format(log_base, application_entity, application_id, uniq_seq,
    #                                                ocr_res_id, traceback.format_exc()))
    #     else:
    #         compare_log.info('{0} [task success] [entity={1}] [id={2}] [uniq_seq={3}] [ocr_res_id={4}]'.format(
    #             log_base, application_entity, application_id, uniq_seq, ocr_res_id))