compare update
Showing
4 changed files
with
171 additions
and
184 deletions
... | @@ -1018,61 +1018,69 @@ BASE_XML_TEXT = """<?xml version="1.0" encoding="utf-8"?> | ... | @@ -1018,61 +1018,69 @@ BASE_XML_TEXT = """<?xml version="1.0" encoding="utf-8"?> |
1018 | 1018 | ||
1019 | CDATA_TEXT = """<![CDATA[<Exec xmlns="http://tempuri.org/"><strXMLParm><Request><Framework><UserName>SFCHINA\qqcout0</UserName><GUID>70d0efcb-3bc2-4018-ac4e-681c8f3131b6</GUID><DetailedTracingEnabled>False</DetailedTracingEnabled><ServiceName>AMSWebService</ServiceName><SupportsRedirection>true</SupportsRedirection><ServiceType>Service</ServiceType></Framework><Parms><InputXML type="string">&lt;?xml version="1.0" encoding="utf-16"?&gt;&lt;InputXML&gt; &lt;Result&gt; {0} &lt;/Result&gt;&lt;AuthorizationData&gt;&lt;ServiceComponent&gt;OCR&lt;/ServiceComponent&gt;&lt;RoleId/&gt;&lt;CompanyId/&gt;&lt;/AuthorizationData&gt;&lt;/InputXML&gt;</InputXML></Parms></Request></strXMLParm></Exec>]]>""" | 1019 | CDATA_TEXT = """<![CDATA[<Exec xmlns="http://tempuri.org/"><strXMLParm><Request><Framework><UserName>SFCHINA\qqcout0</UserName><GUID>70d0efcb-3bc2-4018-ac4e-681c8f3131b6</GUID><DetailedTracingEnabled>False</DetailedTracingEnabled><ServiceName>AMSWebService</ServiceName><SupportsRedirection>true</SupportsRedirection><ServiceType>Service</ServiceType></Framework><Parms><InputXML type="string">&lt;?xml version="1.0" encoding="utf-16"?&gt;&lt;InputXML&gt; &lt;Result&gt; {0} &lt;/Result&gt;&lt;AuthorizationData&gt;&lt;ServiceComponent&gt;OCR&lt;/ServiceComponent&gt;&lt;RoleId/&gt;&lt;CompanyId/&gt;&lt;/AuthorizationData&gt;&lt;/InputXML&gt;</InputXML></Parms></Request></strXMLParm></Exec>]]>""" |
1020 | 1020 | ||
1021 | IC_OCR_FIELD = 'ic_ocr' | ||
1022 | RP_OCR_FIELD = 'rp_ocr' | ||
1023 | BL_OCR_FIELD = 'bl_ocr' | ||
1024 | EEP_OCR_FIELD = 'eep_ocr' | ||
1025 | DL_OCR_FIELD = 'dl_ocr' | ||
1026 | PP_OCR_FIELD = 'pp_ocr' | ||
1027 | MVC_OCR_FIELD = 'mvc_ocr' | ||
1028 | |||
1021 | RESULT_MAPPING = { | 1029 | RESULT_MAPPING = { |
1022 | # MVI_CLASSIFY: 'mvi_ocr', | 1030 | # MVI_CLASSIFY: 'mvi_ocr', |
1023 | IC_CLASSIFY: 'ic_ocr', | 1031 | IC_CLASSIFY: IC_OCR_FIELD, |
1024 | RP_CLASSIFY: 'rp_ocr', | 1032 | RP_CLASSIFY: RP_OCR_FIELD, |
1025 | # BC_CLASSIFY: 'bc_ocr', | 1033 | # BC_CLASSIFY: 'bc_ocr', |
1026 | BL_CLASSIFY: 'bl_ocr', | 1034 | BL_CLASSIFY: BL_OCR_FIELD, |
1027 | # UCI_CLASSIFY: 'uci_ocr', | 1035 | # UCI_CLASSIFY: 'uci_ocr', |
1028 | EEP_CLASSIFY: 'eep_ocr', | 1036 | EEP_CLASSIFY: EEP_OCR_FIELD, |
1029 | DL_CLASSIFY: 'dl_ocr', | 1037 | DL_CLASSIFY: DL_OCR_FIELD, |
1030 | PP_CLASSIFY: 'pp_ocr', | 1038 | PP_CLASSIFY: PP_OCR_FIELD, |
1031 | MVC_CLASSIFY: 'mvc_ocr', | 1039 | MVC_CLASSIFY: MVC_OCR_FIELD, |
1032 | # VAT_CLASSIFY: 'vat_ocr', | 1040 | # VAT_CLASSIFY: 'vat_ocr', |
1033 | } | 1041 | } |
1034 | 1042 | ||
1035 | COMPARE_FIELDS = ('ic_ocr', 'rp_ocr', 'bl_ocr', 'eep_ocr', 'dl_ocr', 'pp_ocr', 'mvc_ocr') | 1043 | COMPARE_FIELDS = (IC_OCR_FIELD, RP_OCR_FIELD, BL_OCR_FIELD, EEP_OCR_FIELD, DL_OCR_FIELD, PP_OCR_FIELD, MVC_OCR_FIELD) |
1036 | 1044 | ||
1037 | # 身份证 | 1045 | # 身份证 |
1038 | ITPRC = { | 1046 | ITPRC = [ |
1039 | 'customerChineseName': ('姓名', 'common_compare', {}), | 1047 | ('customerChineseName', '姓名', 'name_compare', {}), |
1040 | 'idNum': ('公民身份号码', 'common_compare', {}), | 1048 | ('idNum', '公民身份号码', 'common_compare', {}), |
1041 | # 20200410-20250410 OCR识别为长期,向GCAP发送:2099-12-31 00:00:00.0 | 1049 | # 20200410-20250410 OCR识别为长期,向GCAP发送:2099-12-31 00:00:00.0 |
1042 | 'idExpiryDate': ('有效期限', 'date_compare', {'long': True, 'ocr_split': True, 'input_replace': ''}), | 1050 | ('idExpiryDate', '有效期限', 'date_compare', {'long': True, 'ocr_split': True, 'input_replace': ''}), |
1043 | } | 1051 | ] |
1044 | 1052 | ||
1045 | # 护照 | 1053 | # 护照 |
1046 | ITPSP = { | 1054 | ITPSP = [ |
1047 | 'customerChineseName': ('英文姓名', 'common_compare', {}), | 1055 | ('customerChineseName', '英文姓名', 'name_compare', {'is_passport': True}), |
1048 | 'idNum': ('护照号码', 'common_compare', {}), | 1056 | ('idNum', '护照号码', 'common_compare', {}), |
1049 | 'idExpiryDate': ('有效期至', 'date_compare', {'input_replace': ''}), # 20250410 | 1057 | ('idExpiryDate', '有效期至', 'date_compare', {'input_replace': ''}), # 20250410 |
1050 | 'dateOfBirth': ('出生日期', 'date_compare', {'input_replace': ''}), # 20250410 | 1058 | ('dateOfBirth', '出生日期', 'date_compare', {'input_replace': ''}), # 20250410 |
1051 | } | 1059 | ] |
1052 | 1060 | ||
1053 | # 港澳台通行证 | 1061 | # 港澳台通行证 |
1054 | ITHKM_ITTID = { | 1062 | ITHKM_ITTID = [ |
1055 | 'customerChineseName': ('中文名', 'common_compare', {}), | 1063 | ('customerChineseName', '中文名', 'common_compare', {}), |
1056 | 'idNum': ('证件号码', 'common_compare', {}), | 1064 | ('idNum', '证件号码', 'common_compare', {}), |
1057 | 'idExpiryDate': ('有效期限', 'date_compare', {'ocr_split': True, 'input_replace': '.'}), # 2013.10.24-2023.10.23 | 1065 | ('idExpiryDate', '有效期限', 'date_compare', {'ocr_split': True, 'input_replace': '.'}), # 2013.10.24-2023.10.23 |
1058 | 'dateOfBirth': ('出生日期', 'date_compare', {'input_replace': '.'}), # 2023.10.23 | 1066 | ('dateOfBirth', '出生日期', 'date_compare', {'input_replace': '.'}), # 2023.10.23 |
1059 | # 'secondIdNum': '' | 1067 | # 'secondIdNum': '' |
1060 | } | 1068 | ] |
1061 | 1069 | ||
1062 | # 居住证 | 1070 | # 居住证 |
1063 | ITRES = { | 1071 | ITRES = [ |
1064 | 'customerChineseName': ('姓名', 'common_compare', {}), | 1072 | ('customerChineseName', '姓名', 'common_compare', {}), |
1065 | 'idNum': ('公民身份号码', 'common_compare', {}), | 1073 | ('idNum', '公民身份号码', 'common_compare', {}), |
1066 | 'idExpiryDate': ('有效期限', 'date_compare', {'ocr_split': True, 'input_replace': ''}), # 20200410-20250410 | 1074 | ('idExpiryDate', '有效期限', 'date_compare', {'ocr_split': True, 'input_replace': ''}), # 20200410-20250410 |
1067 | 'secondIdNum': ('通行证号码', 'common_compare', {}) | 1075 | ('secondIdNum', '通行证号码', 'common_compare', {}) |
1068 | } | 1076 | ] |
1069 | 1077 | ||
1070 | ID_TYPE_COMPARE = { | 1078 | ID_TYPE_COMPARE = { |
1071 | 'ITPRC': {'model_field': 'ic_ocr', 'compare_field': ITPRC}, | 1079 | 'ITPRC': [IC_OCR_FIELD, ITPRC], |
1072 | 'ITPSP': {'model_field': 'pp_ocr', 'compare_field': ITPSP}, | 1080 | 'ITPSP': [PP_OCR_FIELD, ITPSP], |
1073 | 'ITHKM': {'model_field': 'eep_ocr', 'compare_field': ITHKM_ITTID}, | 1081 | 'ITHKM': [EEP_OCR_FIELD, ITHKM_ITTID], |
1074 | 'ITTID': {'model_field': 'eep_ocr', 'compare_field': ITHKM_ITTID}, | 1082 | 'ITTID': [EEP_OCR_FIELD, ITHKM_ITTID], |
1075 | 'ITRES': {'model_field': 'rp_ocr', 'compare_field': ITRES}, | 1083 | 'ITRES': [RP_OCR_FIELD, ITRES], |
1076 | } | 1084 | } |
1077 | 1085 | ||
1078 | # 1. 分别对比 POS车架号 vs 车辆登记正,POS车架号 vs 行驶证 | 1086 | # 1. 分别对比 POS车架号 vs 车辆登记正,POS车架号 vs 行驶证 |
... | @@ -1080,37 +1088,35 @@ ID_TYPE_COMPARE = { | ... | @@ -1080,37 +1088,35 @@ ID_TYPE_COMPARE = { |
1080 | # b)其中一个 不一致:N,向GCAP发送:不一致的OCR识别结果 | 1088 | # b)其中一个 不一致:N,向GCAP发送:不一致的OCR识别结果 |
1081 | # c)两中比对 均不一致:N,向GCAP发送:车辆登记证 & 行驶证识别结果 | 1089 | # c)两中比对 均不一致:N,向GCAP发送:车辆登记证 & 行驶证识别结果 |
1082 | # 车辆登记证 | 1090 | # 车辆登记证 |
1083 | PCUSD_MVC = { | 1091 | PCUSD_MVC = [ |
1084 | 'vinNo': ('9.车辆识别代号/车架号', 'common_compare', {}), | 1092 | ('vinNo', '9.车辆识别代号/车架号', 'common_compare', {}), |
1085 | 'manufactureDate': ('32.车辆出厂日期', 'common_compare', {}), | 1093 | ('manufactureDate', '32.车辆出厂日期', 'common_compare', {}), |
1086 | 'firstRegistrationDate': ('3.登记日期', 'common_compare', {}), | 1094 | ('firstRegistrationDate', '3.登记日期', 'common_compare', {}), |
1087 | } | 1095 | ] |
1088 | 1096 | ||
1089 | # 行驶证 | 1097 | # 行驶证 |
1090 | PCUSD_DL = { | 1098 | PCUSD_DL = [ |
1091 | 'vinNo': ('车辆识别代码', 'common_compare', {}), | 1099 | ('vinNo', '车辆识别代码', 'common_compare', {}), |
1092 | # 'manufactureDate': '', | 1100 | ] |
1093 | # 'firstRegistrationDate': '', | ||
1094 | } | ||
1095 | 1101 | ||
1096 | # 营业执照 | 1102 | # 营业执照 |
1097 | TCCOR = { | 1103 | TCCOR = [ |
1098 | 'customerChineseName': ('企业名称', 'common_compare', {}), | 1104 | ('customerChineseName', '企业名称', 'common_compare', {}), |
1099 | 'legalRepName': ('经营者姓名', 'common_compare', {}), | 1105 | ('legalRepName', '经营者姓名', 'name_compare', {}), |
1100 | 'idNum': ('注册号', 'common_compare', {}), | 1106 | ('idNum', '注册号', 'common_compare', {}), |
1101 | 'businessLicenseNo': ('注册号', 'common_compare', {}), | 1107 | ('businessLicenseNo', '注册号', 'common_compare', {}), |
1102 | 'taxRegistrationCode': ('注册号', 'common_compare', {}), | 1108 | ('taxRegistrationCode', '注册号', 'common_compare', {}), |
1103 | 'incorporationDate': ('成立日期', 'date_compare', {'ocr_replace': True}), # 2017年07月11日 | 1109 | ('incorporationDate', '成立日期', 'date_compare', {'ocr_replace': True}), # 2017年07月11日 |
1104 | # 2017年07月11日至长期 1. OCR识别为长期,向GCAP发送:2099-12-31 00:00:00.0 | 1110 | # 2017年07月11日至长期 1. OCR识别为长期,向GCAP发送:2099-12-31 00:00:00.0 |
1105 | 'businessLicenseDueDate': ('营业期限', 'date_compare', {'long': True, 'ocr_replace': True}), | 1111 | ('businessLicenseDueDate', '营业期限', 'date_compare', {'long': True, 'ocr_replace': True}), |
1106 | 'capitalRegAmount': ('注册资本', 'rmb_compare', {}), # 壹拾万元整 将OCR识别结果(人民币大写)转化为数字 | 1112 | ('capitalRegAmount', '注册资本', 'rmb_compare', {}), # 壹拾万元整 将OCR识别结果(人民币大写)转化为数字 |
1107 | } | 1113 | ] |
1108 | 1114 | ||
1109 | TCSEP = { | 1115 | TCSEP = [ |
1110 | 'companyName': ('企业名称', 'common_compare', {}), | 1116 | ('companyName', '企业名称', 'common_compare', {}), |
1111 | 'registeredCapital': ('注册资本', 'rmb_compare', {}), # 壹拾万元整 将OCR识别结果(人民币大写)转化为数字 | 1117 | ('registeredCapital', '注册资本', 'rmb_compare', {}), # 壹拾万元整 将OCR识别结果(人民币大写)转化为数字 |
1112 | 'selfEmployedSubType': ('企业类型', 'type_compare', {}), # 有限责任公司 | 1118 | ('selfEmployedSubType', '企业类型', 'type_compare', {}) # 有限责任公司 |
1113 | } | 1119 | ] |
1114 | 1120 | ||
1115 | # 1. POS数据OCR识别结果对应关系如下: | 1121 | # 1. POS数据OCR识别结果对应关系如下: |
1116 | # a)Individual Businessman CSIBM => 个体工商户 | 1122 | # a)Individual Businessman CSIBM => 个体工商户 | ... | ... |
... | @@ -444,7 +444,7 @@ class DocView(GenericView, DocHandler): | ... | @@ -444,7 +444,7 @@ class DocView(GenericView, DocHandler): |
444 | file.close() | 444 | file.close() |
445 | # 1. 上传信息记录 | 445 | # 1. 上传信息记录 |
446 | # application_id = '{0}{1}'.format(consts.FIXED_APPLICATION_ID_PREFIX, metadata_version_id) | 446 | # application_id = '{0}{1}'.format(consts.FIXED_APPLICATION_ID_PREFIX, metadata_version_id) |
447 | application_id = 'CH-S200012772' | 447 | application_id = 'CH-S200012727' |
448 | upload_finish_time = timezone.now() | 448 | upload_finish_time = timezone.now() |
449 | document_scheme = random.choice(consts.DOC_SCHEME_LIST) | 449 | document_scheme = random.choice(consts.DOC_SCHEME_LIST) |
450 | data_source = random.choice(consts.DATA_SOURCE_LIST) | 450 | data_source = random.choice(consts.DATA_SOURCE_LIST) | ... | ... |
... | @@ -12,6 +12,29 @@ compare_log = logging.getLogger('compare') | ... | @@ -12,6 +12,29 @@ compare_log = logging.getLogger('compare') |
12 | log_base = '[CA Compare]' | 12 | log_base = '[CA Compare]' |
13 | 13 | ||
14 | 14 | ||
15 | def field_compare(info_dict, ocr_res_dict, ocr_field, compare_list, res_set): | ||
16 | is_find = False | ||
17 | ocr_res_str = ocr_res_dict.get(ocr_field) | ||
18 | if ocr_res_str is not None: | ||
19 | ocr_res_list = json.loads(ocr_res_str) | ||
20 | res_len = len(ocr_res_list) | ||
21 | for ocr_res in ocr_res_list: | ||
22 | if is_find: | ||
23 | break | ||
24 | for idx, compare_tuple in enumerate(compare_list): | ||
25 | compare_res = getattr(cp, compare_tuple[2])( | ||
26 | info_dict.get(compare_tuple[0]), ocr_res.get(compare_tuple[1]), **compare_tuple[3]) | ||
27 | if idx == 0 and compare_res == consts.RESULT_N and res_len != 1: | ||
28 | break | ||
29 | is_find = True | ||
30 | info_dict[compare_tuple[0] + 'Result'] = compare_res | ||
31 | res_set.add(compare_res) | ||
32 | if not is_find: | ||
33 | res_set.add(consts.RESULT_N) | ||
34 | for compare_tuple in compare_list: | ||
35 | info_dict[compare_tuple[0] + 'Result'] = consts.RESULT_N | ||
36 | |||
37 | |||
15 | @app.task | 38 | @app.task |
16 | def compare(application_id, application_entity, uniq_seq, ocr_res_id): | 39 | def compare(application_id, application_entity, uniq_seq, ocr_res_id): |
17 | # POS: application_id, application_entity, uniq_seq, None | 40 | # POS: application_id, application_entity, uniq_seq, None |
... | @@ -25,8 +48,7 @@ def compare(application_id, application_entity, uniq_seq, ocr_res_id): | ... | @@ -25,8 +48,7 @@ def compare(application_id, application_entity, uniq_seq, ocr_res_id): |
25 | last_obj = comparison_class.objects.filter(application_id=application_id).last() | 48 | last_obj = comparison_class.objects.filter(application_id=application_id).last() |
26 | if last_obj is None: | 49 | if last_obj is None: |
27 | compare_log.info('{0} [comparison info empty] [entity={1}] [id={2}] [uniq_seq={3}] [ocr_res_id={4}]'.format( | 50 | compare_log.info('{0} [comparison info empty] [entity={1}] [id={2}] [uniq_seq={3}] [ocr_res_id={4}]'.format( |
28 | log_base, application_entity, application_id, uniq_seq, ocr_res_id | 51 | log_base, application_entity, application_id, uniq_seq, ocr_res_id)) |
29 | )) | ||
30 | return | 52 | return |
31 | 53 | ||
32 | # 根据application_id查找OCR累计结果指定license字段,如果没有,结束 | 54 | # 根据application_id查找OCR累计结果指定license字段,如果没有,结束 |
... | @@ -42,6 +64,7 @@ def compare(application_id, application_entity, uniq_seq, ocr_res_id): | ... | @@ -42,6 +64,7 @@ def compare(application_id, application_entity, uniq_seq, ocr_res_id): |
42 | return | 64 | return |
43 | 65 | ||
44 | # 比对信息 | 66 | # 比对信息 |
67 | try: | ||
45 | comparison_res = { | 68 | comparison_res = { |
46 | 'OCR_Input': { | 69 | 'OCR_Input': { |
47 | 'uniqSeq': last_obj.uniq_seq, | 70 | 'uniqSeq': last_obj.uniq_seq, |
... | @@ -64,143 +87,66 @@ def compare(application_id, application_entity, uniq_seq, ocr_res_id): | ... | @@ -64,143 +87,66 @@ def compare(application_id, application_entity, uniq_seq, ocr_res_id): |
64 | individual_cus_info['customerType'] = last_obj.customer_type | 87 | individual_cus_info['customerType'] = last_obj.customer_type |
65 | # sep营业执照 | 88 | # sep营业执照 |
66 | if is_sep and individual_cus_info.get('companyName') is not None: | 89 | if is_sep and individual_cus_info.get('companyName') is not None: |
67 | sep_is_find = False | 90 | field_compare(individual_cus_info, ocr_res_dict, consts.BL_OCR_FIELD, consts.TCSEP, res_set) |
68 | sep_ocr_res_str = ocr_res_dict.get('bl_ocr') | ||
69 | if sep_ocr_res_str is not None: | ||
70 | sep_ocr_list = json.loads(sep_ocr_res_str) | ||
71 | for sep_ocr in sep_ocr_list: | ||
72 | company_name = sep_ocr.get(consts.TCSEP.get('companyName')[0]) | ||
73 | if company_name is None or company_name != individual_cus_info.get('companyName'): | ||
74 | continue | ||
75 | sep_is_find = True | ||
76 | for sep_field, sep_tuple in consts.TCSEP.items(): | ||
77 | sep_res = getattr(cp, sep_tuple[1])( | ||
78 | individual_cus_info.get(sep_field), sep_ocr.get(sep_tuple[0]), **sep_tuple[2]) | ||
79 | individual_cus_info[sep_field + 'Result'] = sep_res | ||
80 | res_set.add(sep_res) | ||
81 | break | ||
82 | if not sep_is_find: | ||
83 | res_set.add(consts.RESULT_N) | ||
84 | for field in consts.TCSEP.keys(): | ||
85 | individual_cus_info[field + 'Result'] = consts.RESULT_N | ||
86 | 91 | ||
87 | # 个人信息证件 | 92 | # 个人信息证件 |
88 | id_type = individual_cus_info.get('idType') | 93 | id_type = individual_cus_info.get('idType') |
89 | compare_target = consts.ID_TYPE_COMPARE.get(id_type) | 94 | compare_info_list = consts.ID_TYPE_COMPARE.get(id_type) |
90 | if compare_target is None: | 95 | if compare_info_list is None: |
91 | continue | ||
92 | is_find = False | ||
93 | ocr_res_str = ocr_res_dict.get(compare_target.get('model_field')) | ||
94 | if ocr_res_str is not None: | ||
95 | ocr_res_list = json.loads(ocr_res_str) | ||
96 | compare_target_dict = compare_target.get('compare_field') | ||
97 | for ocr_res in ocr_res_list: | ||
98 | base_name = ocr_res.get(compare_target_dict.get('customerChineseName')[0]) | ||
99 | if base_name is None or base_name != individual_cus_info.get('customerChineseName'): # TODO 特殊姓名比对 | ||
100 | continue | 96 | continue |
101 | is_find = True | 97 | field_compare(individual_cus_info, ocr_res_dict, compare_info_list[0], compare_info_list[1], res_set) |
102 | for compare_field, compare_tuple in compare_target.get('compare_field').items(): | ||
103 | compare_res = getattr(cp, compare_tuple[1])( | ||
104 | individual_cus_info.get(compare_field), ocr_res.get(compare_tuple[0]), **compare_tuple[2]) | ||
105 | individual_cus_info[compare_field + 'Result'] = compare_res | ||
106 | res_set.add(compare_res) | ||
107 | break | ||
108 | if not is_find: | ||
109 | res_set.add(consts.RESULT_N) | ||
110 | for field in compare_target.get('compare_field').keys(): | ||
111 | individual_cus_info[field + 'Result'] = consts.RESULT_N | ||
112 | 98 | ||
113 | comparison_res['OCR_Input']['individualCusInfo'] = individual_cus_info_list | 99 | comparison_res['OCR_Input']['individualCusInfo'] = individual_cus_info_list |
114 | 100 | ||
115 | if last_obj.corporate_cus_info is not None: | 101 | if last_obj.corporate_cus_info is not None: |
116 | corporate_cus_info = json.loads(last_obj.corporate_cus_info) | 102 | corporate_cus_info = json.loads(last_obj.corporate_cus_info) |
117 | corporate_cus_info['customerType'] = last_obj.customer_type | 103 | corporate_cus_info['customerType'] = last_obj.customer_type |
118 | 104 | field_compare(corporate_cus_info, ocr_res_dict, consts.BL_OCR_FIELD, consts.TCCOR, res_set) | |
119 | is_bl_find = False | ||
120 | bl_ocr_res_str = ocr_res_dict.get('bl_ocr') | ||
121 | if bl_ocr_res_str is not None: | ||
122 | bl_ocr_list = json.loads(bl_ocr_res_str) | ||
123 | for bl_ocr in bl_ocr_list: | ||
124 | company_name = bl_ocr.get(consts.TCCOR.get('customerChineseName')[0]) | ||
125 | if company_name is None or company_name != corporate_cus_info.get('customerChineseName'): | ||
126 | continue | ||
127 | is_bl_find = True | ||
128 | for bl_field, bl_tuple in consts.TCCOR.items(): | ||
129 | bl_res = getattr(cp, bl_tuple[1])( | ||
130 | corporate_cus_info.get(bl_field), bl_ocr.get(bl_tuple[0]), **bl_tuple[2]) | ||
131 | corporate_cus_info[bl_field + 'Result'] = bl_res | ||
132 | res_set.add(bl_res) | ||
133 | break | ||
134 | if not is_bl_find: | ||
135 | res_set.add(consts.RESULT_N) | ||
136 | for field in consts.TCCOR.keys(): | ||
137 | corporate_cus_info[field + 'Result'] = consts.RESULT_N | ||
138 | 105 | ||
139 | comparison_res['OCR_Input']['corporateCusInfo'] = corporate_cus_info | 106 | comparison_res['OCR_Input']['corporateCusInfo'] = corporate_cus_info |
140 | 107 | ||
141 | if last_obj.vehicle_status == consts.VEHICLE_STATUS[0] and last_obj.usedcar_info is not None: | 108 | if last_obj.vehicle_status == consts.VEHICLE_STATUS[0] and last_obj.usedcar_info is not None: |
142 | usedcar_info = json.loads(last_obj.usedcar_info) | 109 | usedcar_info = json.loads(last_obj.usedcar_info) |
143 | 110 | ||
144 | is_usedcar_find = False | 111 | field_compare(usedcar_info, ocr_res_dict, consts.MVC_OCR_FIELD, consts.PCUSD_MVC, res_set) |
145 | mvc_ocr_res_str = ocr_res_dict.get('mvc_ocr') | 112 | |
146 | if mvc_ocr_res_str is not None: | 113 | if usedcar_info[consts.PCUSD_MVC[0][0] + 'Result'] == consts.RESULT_Y: |
147 | mvc_ocr_list = json.loads(mvc_ocr_res_str) | 114 | field_compare(usedcar_info, ocr_res_dict, consts.DL_OCR_FIELD, consts.PCUSD_DL, res_set) |
148 | for mvc_ocr in mvc_ocr_list: | 115 | |
149 | vin_no = mvc_ocr.get(consts.PCUSD_MVC.get('vinNo')[0]) | ||
150 | if vin_no is None or vin_no != usedcar_info.get('vinNo'): | ||
151 | continue | ||
152 | is_usedcar_find = True | ||
153 | for mvc_field, mvc_tuple in consts.PCUSD_MVC.items(): | ||
154 | mvc_res = getattr(cp, mvc_tuple[1])( | ||
155 | usedcar_info.get(mvc_field), mvc_ocr.get(mvc_tuple[0]), **mvc_tuple[2]) | ||
156 | usedcar_info[mvc_field + 'Result'] = mvc_res | ||
157 | res_set.add(mvc_res) | ||
158 | |||
159 | dl_find = False | ||
160 | dl_ocr_res_str = ocr_res_dict.get('dl_ocr') | ||
161 | if dl_ocr_res_str is not None: | ||
162 | dl_ocr_list = json.loads(dl_ocr_res_str) | ||
163 | for dl_ocr in dl_ocr_list: | ||
164 | dl_vin_no = dl_ocr.get(consts.PCUSD_DL.get('vinNo')[0]) | ||
165 | if dl_vin_no is None or dl_vin_no != usedcar_info.get('vinNo'): | ||
166 | continue | ||
167 | dl_find = True | ||
168 | break | ||
169 | if not dl_find: | ||
170 | res_set.add(consts.RESULT_N) | ||
171 | usedcar_info['vinNo' + 'Result'] = consts.RESULT_N | ||
172 | break | ||
173 | if not is_usedcar_find: | ||
174 | res_set.add(consts.RESULT_N) | ||
175 | for field in consts.PCUSD_MVC.keys(): | ||
176 | usedcar_info[field + 'Result'] = consts.RESULT_N | ||
177 | comparison_res['OCR_Input']['usedCarInfo'] = usedcar_info | 116 | comparison_res['OCR_Input']['usedCarInfo'] = usedcar_info |
178 | 117 | ||
179 | comparison_res['OCR_Input']['wholeResult'] = consts.RESULT_N if consts.RESULT_N in res_set else consts.RESULT_Y | 118 | comparison_res['OCR_Input']['wholeResult'] = consts.RESULT_N if consts.RESULT_N in res_set else consts.RESULT_Y |
180 | print(comparison_res) | 119 | |
120 | except Exception as e: | ||
121 | compare_log.error('{0} [compare error] [entity={1}] [id={2}] [uniq_seq={3}] [ocr_res_id={4}] ' | ||
122 | '[error={5}]'.format(log_base, application_entity, application_id, uniq_seq, ocr_res_id, | ||
123 | traceback.format_exc())) | ||
124 | else: | ||
125 | compare_log.info('{0} [compare success] [entity={1}] [id={2}] [uniq_seq={3}] [ocr_res_id={4}]'.format( | ||
126 | log_base, application_entity, application_id, uniq_seq, ocr_res_id)) | ||
181 | 127 | ||
182 | # 将比对结果发送GCAP | 128 | # 将比对结果发送GCAP |
183 | # try: | 129 | try: |
184 | # data = gcap.dict_to_xml(comparison_res) | 130 | data = gcap.dict_to_xml(comparison_res) |
185 | # except Exception as e: | 131 | except Exception as e: |
186 | # compare_log.error('{0} [dict to xml failed] [entity={1}] [id={2}] [uniq_seq={3}] [ocr_res_id={4}] ' | 132 | compare_log.error('{0} [dict to xml failed] [entity={1}] [id={2}] [uniq_seq={3}] [ocr_res_id={4}] ' |
187 | # '[error={5}]'.format(log_base, application_entity, application_id, uniq_seq, ocr_res_id, | 133 | '[error={5}]'.format(log_base, application_entity, application_id, uniq_seq, ocr_res_id, |
188 | # traceback.format_exc())) | 134 | traceback.format_exc())) |
189 | # else: | 135 | else: |
190 | # try: | 136 | try: |
191 | # for times in range(consts.RETRY_TIMES): | 137 | for times in range(consts.RETRY_TIMES): |
192 | # try: | 138 | try: |
193 | # gcap.send(data) | 139 | gcap.send(data) |
194 | # except Exception as e: | 140 | except Exception as e: |
195 | # gcap_exc = str(e) | 141 | gcap_exc = str(e) |
196 | # else: | 142 | else: |
197 | # break | 143 | break |
198 | # else: | 144 | else: |
199 | # raise GCAPException(gcap_exc) | 145 | raise GCAPException(gcap_exc) |
200 | # except Exception as e: | 146 | except Exception as e: |
201 | # compare_log.error('{0} [gcap failed] [entity={1}] [id={2}] [uniq_seq={3}] [ocr_res_id={4}] ' | 147 | compare_log.error('{0} [gcap failed] [entity={1}] [id={2}] [uniq_seq={3}] [ocr_res_id={4}] ' |
202 | # '[error={5}]'.format(log_base, application_entity, application_id, uniq_seq, | 148 | '[error={5}]'.format(log_base, application_entity, application_id, uniq_seq, |
203 | # ocr_res_id, traceback.format_exc())) | 149 | ocr_res_id, traceback.format_exc())) |
204 | # else: | 150 | else: |
205 | # compare_log.info('{0} [task success] [entity={1}] [id={2}] [uniq_seq={3}] [ocr_res_id={4}]'.format( | 151 | compare_log.info('{0} [task success] [entity={1}] [id={2}] [uniq_seq={3}] [ocr_res_id={4}]'.format( |
206 | # log_base, application_entity, application_id, uniq_seq, ocr_res_id)) | 152 | log_base, application_entity, application_id, uniq_seq, ocr_res_id)) | ... | ... |
... | @@ -19,7 +19,13 @@ class Comparison: | ... | @@ -19,7 +19,13 @@ class Comparison: |
19 | 19 | ||
20 | self.RESULT_Y = 'Y' | 20 | self.RESULT_Y = 'Y' |
21 | self.RESULT_N = 'N' | 21 | self.RESULT_N = 'N' |
22 | self.RESULT_NA = 'NA' # TODO NA情况 | 22 | self.RESULT_NA = 'NA' |
23 | |||
24 | self.TRANS_MAP = { | ||
25 | ' ': '', | ||
26 | '·': '', | ||
27 | } | ||
28 | self.TRANS = str.maketrans(self.TRANS_MAP) | ||
23 | 29 | ||
24 | def build_res(self, result): | 30 | def build_res(self, result): |
25 | if result: | 31 | if result: |
... | @@ -28,9 +34,34 @@ class Comparison: | ... | @@ -28,9 +34,34 @@ class Comparison: |
28 | return self.RESULT_N | 34 | return self.RESULT_N |
29 | 35 | ||
30 | def common_compare(self, input_str, ocr_str, **kwargs): | 36 | def common_compare(self, input_str, ocr_str, **kwargs): |
37 | if not isinstance(input_str, str) or isinstance(ocr_str, str): | ||
38 | return self.RESULT_N | ||
31 | return self.build_res(input_str == ocr_str) | 39 | return self.build_res(input_str == ocr_str) |
32 | 40 | ||
41 | def name_compare(self, input_str, ocr_str, **kwargs): | ||
42 | if not isinstance(input_str, str) or isinstance(ocr_str, str): | ||
43 | return self.RESULT_N | ||
44 | if kwargs.get('is_passport'): | ||
45 | input_obj = re.search(r'[a-zA-Z]]!', input_str) | ||
46 | if input_obj: | ||
47 | input_s = input_obj.group() | ||
48 | ocr_obj = re.search(r'[a-zA-Z]]!', ocr_str) | ||
49 | if ocr_obj: | ||
50 | ocr_s = ocr_obj.group() | ||
51 | return self.build_res(input_s == ocr_s) | ||
52 | return self.RESULT_N | ||
53 | else: | ||
54 | return self.build_res((input_str == ocr_str)) | ||
55 | else: | ||
56 | if re.search(r'[a-zA-Z]]', input_str): | ||
57 | return self.RESULT_NA | ||
58 | input_s = input_str.translate(self.TRANS) | ||
59 | ocr_s = ocr_str.translate(self.TRANS) | ||
60 | return self.build_res(input_s == ocr_s) | ||
61 | |||
33 | def date_compare(self, input_str, ocr_str, **kwargs): | 62 | def date_compare(self, input_str, ocr_str, **kwargs): |
63 | if not isinstance(input_str, str) or isinstance(ocr_str, str): | ||
64 | return self.RESULT_N | ||
34 | if kwargs.get('long', False) and '长期' in ocr_str: | 65 | if kwargs.get('long', False) and '长期' in ocr_str: |
35 | return '2099-12-31' | 66 | return '2099-12-31' |
36 | if kwargs.get('ocr_split', False): | 67 | if kwargs.get('ocr_split', False): |
... | @@ -42,10 +73,14 @@ class Comparison: | ... | @@ -42,10 +73,14 @@ class Comparison: |
42 | return self.build_res(input_str == ocr_str) | 73 | return self.build_res(input_str == ocr_str) |
43 | 74 | ||
44 | def rmb_compare(self, input_str, ocr_str, **kwargs): | 75 | def rmb_compare(self, input_str, ocr_str, **kwargs): |
76 | if not isinstance(input_str, str) or isinstance(ocr_str, str): | ||
77 | return self.RESULT_N | ||
45 | input_rmb_upper = to_rmb_upper(float(input_str)) | 78 | input_rmb_upper = to_rmb_upper(float(input_str)) |
46 | return self.build_res(input_rmb_upper == ocr_str) | 79 | return self.build_res(input_rmb_upper == ocr_str) |
47 | 80 | ||
48 | def type_compare(self, input_str, ocr_str, **kwargs): | 81 | def type_compare(self, input_str, ocr_str, **kwargs): |
82 | if not isinstance(input_str, str) or isinstance(ocr_str, str): | ||
83 | return self.RESULT_N | ||
49 | for map_tuple in self.TYPE_MAPPING: | 84 | for map_tuple in self.TYPE_MAPPING: |
50 | if re.search(map_tuple[0], ocr_str) is not None: | 85 | if re.search(map_tuple[0], ocr_str) is not None: |
51 | compare_str = map_tuple[1] | 86 | compare_str = map_tuple[1] | ... | ... |
-
Please register or sign in to post a comment