09d71c76 by 冯轩

Merge branch 'feature/CHINARPA-4660' into feature/uat-tmp

2 parents 885bf854 1fe3d253
...@@ -1247,6 +1247,7 @@ FSM_CONTRACT_WEP_FIELD = 'fsm_wep_ocr' ...@@ -1247,6 +1247,7 @@ FSM_CONTRACT_WEP_FIELD = 'fsm_wep_ocr'
1247 FSM_CONTRACT_MSI_FIELD = 'fsm_msi_ocr' 1247 FSM_CONTRACT_MSI_FIELD = 'fsm_msi_ocr'
1248 FSM_CONTRACT_SC_FIELD = 'fsm_sc_ocr' 1248 FSM_CONTRACT_SC_FIELD = 'fsm_sc_ocr'
1249 FSM_CONTRACT_SC2_FIELD = 'fsm_sc2_ocr' 1249 FSM_CONTRACT_SC2_FIELD = 'fsm_sc2_ocr'
1250 FS_FIELD = 'fs_ocr'
1250 1251
1251 1252
1252 BS_CLASSIFY = 10089 1253 BS_CLASSIFY = 10089
...@@ -1303,6 +1304,7 @@ COMPARE_FIELDS = ( ...@@ -1303,6 +1304,7 @@ COMPARE_FIELDS = (
1303 HIL_CONTRACT_1_FIELD, 1304 HIL_CONTRACT_1_FIELD,
1304 HIL_CONTRACT_2_FIELD, 1305 HIL_CONTRACT_2_FIELD,
1305 HIL_CONTRACT_3_FIELD, 1306 HIL_CONTRACT_3_FIELD,
1307 FS_FIELD,
1306 ) 1308 )
1307 1309
1308 PRE_COMPARE_FIELDS = ( 1310 PRE_COMPARE_FIELDS = (
...@@ -1504,6 +1506,7 @@ SE_BD_FIELD = ['被保险人姓名', '被保险人证件号码', '车架号', ' ...@@ -1504,6 +1506,7 @@ SE_BD_FIELD = ['被保险人姓名', '被保险人证件号码', '车架号', '
1504 JDMPV_VALUE = ['-', '--', '0%', '0.00', '/', '0', ''] 1506 JDMPV_VALUE = ['-', '--', '0%', '0.00', '/', '0', '']
1505 JYPZ_TYPE_1 = ['二手车交易凭证'] 1507 JYPZ_TYPE_1 = ['二手车交易凭证']
1506 JYPZ_TYPE_2 = ['BMW官方认证二手车交易凭证', '二手车交易凭证'] 1508 JYPZ_TYPE_2 = ['BMW官方认证二手车交易凭证', '二手车交易凭证']
1509 SE_FS_FIELD = ['Hash值', '公章', '财年', '资产负债表内容', '利润表内容']
1507 1510
1508 SE_BANK_FIELD = ['accountNo', 'bankName'] 1511 SE_BANK_FIELD = ['accountNo', 'bankName']
1509 SE_DDA_FIELD = ['applicationId(1)', 'applicationId(2)', 'bankName', 'companyName', 'customerName', 'idNum', 'accountHolderName', 'accountNo'] 1512 SE_DDA_FIELD = ['applicationId(1)', 'applicationId(2)', 'bankName', 'companyName', 'customerName', 'idNum', 'accountHolderName', 'accountNo']
...@@ -1817,8 +1820,11 @@ BS_EN = 'Bank Statement' ...@@ -1817,8 +1820,11 @@ BS_EN = 'Bank Statement'
1817 HIL_CONTRACT_1_EN = '售后回租合同' 1820 HIL_CONTRACT_1_EN = '售后回租合同'
1818 HIL_CONTRACT_2_EN = '车辆租赁抵押合同' 1821 HIL_CONTRACT_2_EN = '车辆租赁抵押合同'
1819 HIL_CONTRACT_3_EN = '车辆处置协议' 1822 HIL_CONTRACT_3_EN = '车辆处置协议'
1823 FS_EN = 'Financial Statement'
1824 FSS_EN = 'Financial Statement Supplementary'
1820 1825
1821 DDA_NO_FIND = '需人工查看DDA或截图' 1826 DDA_NO_FIND = '需人工查看DDA或截图'
1827 FS_NO_FIND = '未提供财报或财报不完整'
1822 1828
1823 SKIP_CARD = {SME_BL_EN} 1829 SKIP_CARD = {SME_BL_EN}
1824 1830
...@@ -2159,6 +2165,15 @@ HT_COMPARE_LOGIC = { ...@@ -2159,6 +2165,15 @@ HT_COMPARE_LOGIC = {
2159 '无ASP产品': ('无ASP产品', 'se_self_compare_other_asp', {}, GZS_REASON_1), 2165 '无ASP产品': ('无ASP产品', 'se_self_compare_other_asp', {}, GZS_REASON_1),
2160 } 2166 }
2161 2167
2168 # 格式:'excel字段名':('数据库字段名','比对逻辑','特殊处理可以忽略','比对不合格时的返回内容')
2169 FS_COMPARE_LOGIC = {
2170 'Hash值': ('code', 'hash_code_compare', {}, '财报Hash值与系统不一致'),
2171 '公章': ('stamp', 'stamp_dict_compare', {}, '财报无公章'),
2172 '财年': ('财年', 'fiscal_year_compare', {}, '财报所属财年错误'),
2173 '资产负债表内容': ('资产负债表内容', 'input_list_not_zero_compare', {}, '财报资产负债表为空'),
2174 '利润表内容': ('利润表内容', 'input_list_not_zero_compare', {}, '财报利润表为空'),
2175 }
2176
2162 AFC_HT_DATE_FIELDS = ['主借人日期', '共借人日期', '保证人日期1', '保证人日期2'] 2177 AFC_HT_DATE_FIELDS = ['主借人日期', '共借人日期', '保证人日期1', '保证人日期2']
2163 2178
2164 # MVC_OCR_FIELD = 'mvc_ocr' 2179 # MVC_OCR_FIELD = 'mvc_ocr'
...@@ -2187,6 +2202,7 @@ SE_COMPARE_FIELD = { ...@@ -2187,6 +2202,7 @@ SE_COMPARE_FIELD = {
2187 HIL_CONTRACT_1_EN: (HIL_CONTRACT_1_FIELD, HIL_CONTRACT_1_COMPARE_LOGIC, False), 2202 HIL_CONTRACT_1_EN: (HIL_CONTRACT_1_FIELD, HIL_CONTRACT_1_COMPARE_LOGIC, False),
2188 HIL_CONTRACT_2_EN: (HIL_CONTRACT_2_FIELD, HIL_CONTRACT_2_COMPARE_LOGIC, False), 2203 HIL_CONTRACT_2_EN: (HIL_CONTRACT_2_FIELD, HIL_CONTRACT_2_COMPARE_LOGIC, False),
2189 HIL_CONTRACT_3_EN: (HIL_CONTRACT_3_FIELD, HIL_CONTRACT_3_COMPARE_LOGIC, False), 2204 HIL_CONTRACT_3_EN: (HIL_CONTRACT_3_FIELD, HIL_CONTRACT_3_COMPARE_LOGIC, False),
2205 FS_EN: (FS_FIELD, FS_COMPARE_LOGIC, False),
2190 } 2206 }
2191 2207
2192 SE_COMPARE_FIELD_AUTO = { 2208 SE_COMPARE_FIELD_AUTO = {
......
...@@ -336,6 +336,8 @@ class AFCOCRResult(models.Model): ...@@ -336,6 +336,8 @@ class AFCOCRResult(models.Model):
336 fsm_sc_ocr = models.TextField(null=True, verbose_name="汽车销售合同") 336 fsm_sc_ocr = models.TextField(null=True, verbose_name="汽车销售合同")
337 fsm_sc2_ocr = models.TextField(null=True, verbose_name="汽车销售合同补充合同") 337 fsm_sc2_ocr = models.TextField(null=True, verbose_name="汽车销售合同补充合同")
338 fsm_activited = models.IntegerField(null=False, default=0, verbose_name="fsm激活状态 1:激活") 338 fsm_activited = models.IntegerField(null=False, default=0, verbose_name="fsm激活状态 1:激活")
339 fs_ocr = models.TextField(null=True, verbose_name="财务报表")
340 fss_ocr = models.TextField(null=True, verbose_name="财务情况说明书")
339 341
340 342
341 update_time = models.DateTimeField(auto_now=True, verbose_name='修改时间') 343 update_time = models.DateTimeField(auto_now=True, verbose_name='修改时间')
...@@ -379,6 +381,8 @@ class HILOCRResult(models.Model): ...@@ -379,6 +381,8 @@ class HILOCRResult(models.Model):
379 fsm_sc_ocr = models.TextField(null=True, verbose_name="汽车销售合同") 381 fsm_sc_ocr = models.TextField(null=True, verbose_name="汽车销售合同")
380 fsm_sc2_ocr = models.TextField(null=True, verbose_name="汽车销售合同补充合同") 382 fsm_sc2_ocr = models.TextField(null=True, verbose_name="汽车销售合同补充合同")
381 fsm_activited = models.IntegerField(null=False, default=0, verbose_name="fsm激活状态 1:激活") 383 fsm_activited = models.IntegerField(null=False, default=0, verbose_name="fsm激活状态 1:激活")
384 fs_ocr = models.TextField(null=True, verbose_name="财务报表")
385 fss_ocr = models.TextField(null=True, verbose_name="财务情况说明书")
382 386
383 update_time = models.DateTimeField(auto_now=True, verbose_name='修改时间') 387 update_time = models.DateTimeField(auto_now=True, verbose_name='修改时间')
384 create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') 388 create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
...@@ -420,6 +424,8 @@ class AFCSEOCRResult(models.Model): ...@@ -420,6 +424,8 @@ class AFCSEOCRResult(models.Model):
420 fsm_sc_ocr = models.TextField(null=True, verbose_name="汽车销售合同") 424 fsm_sc_ocr = models.TextField(null=True, verbose_name="汽车销售合同")
421 fsm_sc2_ocr = models.TextField(null=True, verbose_name="汽车销售合同补充合同") 425 fsm_sc2_ocr = models.TextField(null=True, verbose_name="汽车销售合同补充合同")
422 fsm_activited = models.IntegerField(null=False, default=0, verbose_name="fsm激活状态 1:激活") 426 fsm_activited = models.IntegerField(null=False, default=0, verbose_name="fsm激活状态 1:激活")
427 fs_ocr = models.TextField(null=True, verbose_name="财务报表")
428 fss_ocr = models.TextField(null=True, verbose_name="财务情况说明书")
423 429
424 update_time = models.DateTimeField(auto_now=True, verbose_name='修改时间') 430 update_time = models.DateTimeField(auto_now=True, verbose_name='修改时间')
425 create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') 431 create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
...@@ -461,6 +467,8 @@ class HILSEOCRResult(models.Model): ...@@ -461,6 +467,8 @@ class HILSEOCRResult(models.Model):
461 fsm_sc_ocr = models.TextField(null=True, verbose_name="汽车销售合同") 467 fsm_sc_ocr = models.TextField(null=True, verbose_name="汽车销售合同")
462 fsm_sc2_ocr = models.TextField(null=True, verbose_name="汽车销售合同补充合同") 468 fsm_sc2_ocr = models.TextField(null=True, verbose_name="汽车销售合同补充合同")
463 fsm_activited = models.IntegerField(null=False, default=0, verbose_name="fsm激活状态 1:激活") 469 fsm_activited = models.IntegerField(null=False, default=0, verbose_name="fsm激活状态 1:激活")
470 fs_ocr = models.TextField(null=True, verbose_name="财务报表")
471 fss_ocr = models.TextField(null=True, verbose_name="财务情况说明书")
464 472
465 update_time = models.DateTimeField(auto_now=True, verbose_name='修改时间') 473 update_time = models.DateTimeField(auto_now=True, verbose_name='修改时间')
466 create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') 474 create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
......
...@@ -953,6 +953,12 @@ def get_se_cms_compare_info_auto(application_id, last_obj, application_entity, d ...@@ -953,6 +953,12 @@ def get_se_cms_compare_info_auto(application_id, last_obj, application_entity, d
953 if individual_info['applicantType'] == consts.APPLICANT_TYPE_ORDER[0] and not is_corporate: 953 if individual_info['applicantType'] == consts.APPLICANT_TYPE_ORDER[0] and not is_corporate:
954 is_cdfl_bo = True 954 is_cdfl_bo = True
955 955
956 # CHINARPA-4660 是否公户判断
957 is_bo_tccor = False
958 customersubType = individual_info.get('customersubType', '')
959 if individual_info['applicantType'] == consts.APPLICANT_TYPE_ORDER[0] and customersubType == 'TCCOR':
960 is_bo_tccor = True
961
956 for id_info in individual_info.get('IDInformation', []): 962 for id_info in individual_info.get('IDInformation', []):
957 if id_info.get('idType') in consts.SE_CMS_FIRST_ID_FIELD_MAPPING: 963 if id_info.get('idType') in consts.SE_CMS_FIRST_ID_FIELD_MAPPING:
958 license_en, is_prc = consts.SE_CMS_FIRST_ID_FIELD_MAPPING[id_info['idType']] 964 license_en, is_prc = consts.SE_CMS_FIRST_ID_FIELD_MAPPING[id_info['idType']]
...@@ -966,25 +972,28 @@ def get_se_cms_compare_info_auto(application_id, last_obj, application_entity, d ...@@ -966,25 +972,28 @@ def get_se_cms_compare_info_auto(application_id, last_obj, application_entity, d
966 license_dict[license_en] = field_input 972 license_dict[license_en] = field_input
967 all_id_num.append(id_num) 973 all_id_num.append(id_num)
968 # 营业执照 -------------------------------------------------------------------------------------------------- 974 # 营业执照 --------------------------------------------------------------------------------------------------
969 elif id_info.get('idType') in ['Unified Social Credit Code', 'Tax Number', 'Business License Number']: 975 # 4660 修改比对营业执照文档必要性的判断条件
976 # elif id_info.get('idType') in ['Unified Social Credit Code', 'Tax Number', 'Business License Number']:
977 elif is_bo_tccor:
970 # ['companyName', 'legalRepName', 'businessLicenseNo', 'organizationCreditCode', 978 # ['companyName', 'legalRepName', 'businessLicenseNo', 'organizationCreditCode',
971 # 'taxRegistrationCertificateNo', 'establishmentDate', 'businessLicenseDueDate'] 979 # 'taxRegistrationCertificateNo', 'establishmentDate', 'businessLicenseDueDate']
972 id_num = decode_des(id_info.get('idNum', ''), des_key) 980 id_num = decode_des(id_info.get('idNum', ''), des_key)
973 # bl_field_input = [ 981 bl_field_input = [
974 # ('companyName', customer_name), 982 ('companyName', customer_name),
975 # ('legalRepName', legal_name), 983 ('legalRepName', legal_name),
976 # ('businessLicenseNo', id_num), 984 ('businessLicenseNo', id_num),
977 # ('organizationCreditCode', id_num), 985 ('organizationCreditCode', id_num),
978 # ('taxRegistrationCertificateNo', id_num), 986 ('taxRegistrationCertificateNo', id_num),
979 # ('businessLicenseDueDate', id_info.get('idExpiryDate', '')), 987 ('businessLicenseDueDate', id_info.get('idExpiryDate', '')),
980 # ] 988 ]
981 989
982 if is_corporate: 990 if is_corporate:
983 company_info_list.append((customer_name, id_num, legal_name)) 991 company_info_list.append((customer_name, id_num, legal_name))
984 # else: 992 else:
985 # bl_field_input.append(('establishmentDate', establishment_date)) 993 bl_field_input.append(('establishmentDate', establishment_date))
986 994
987 # license_dict[consts.BL_EN] = bl_field_input 995 compare_log.info('{0} [bl_field_input] [{1}]'.format(log_base, bl_field_input))
996 license_dict[consts.BL_EN] = bl_field_input
988 all_id_num.append(id_num) 997 all_id_num.append(id_num)
989 998
990 # SME营业执照--------------------------------------------------------------------------------------------------- 999 # SME营业执照---------------------------------------------------------------------------------------------------
...@@ -1000,6 +1009,7 @@ def get_se_cms_compare_info_auto(application_id, last_obj, application_entity, d ...@@ -1000,6 +1009,7 @@ def get_se_cms_compare_info_auto(application_id, last_obj, application_entity, d
1000 (customer_name, '、'.join(all_id_num), all_id_num[0]) 1009 (customer_name, '、'.join(all_id_num), all_id_num[0])
1001 ) 1010 )
1002 1011
1012 compare_log.info('{0} [license_dict] [{1}]'.format(log_base, license_dict))
1003 if len(license_dict) > 0: 1013 if len(license_dict) > 0:
1004 individual_info_dict.setdefault(individual_info['applicantType'], []).append(license_dict) 1014 individual_info_dict.setdefault(individual_info['applicantType'], []).append(license_dict)
1005 1015
...@@ -1120,6 +1130,25 @@ def get_se_cms_compare_info_auto(application_id, last_obj, application_entity, d ...@@ -1120,6 +1130,25 @@ def get_se_cms_compare_info_auto(application_id, last_obj, application_entity, d
1120 # vehicle_info[consts.UCI_EN] = vehicle_field_input 1130 # vehicle_info[consts.UCI_EN] = vehicle_field_input
1121 compare_info['vehicleInfo'] = vehicle_info 1131 compare_info['vehicleInfo'] = vehicle_info
1122 1132
1133 # 公户财务报表-------------------------------------------------------------------------------------------------
1134 financial_statement_info = {}
1135 financial_statement_input = []
1136 corporateFinancialInformation = cms_info.get('corporateFinancialInformation', {})
1137 hashCode = corporateFinancialInformation.get('hashCode', '')
1138 fiscalYear = corporateFinancialInformation.get('fiscalYear', '')
1139 totalAssets = corporateFinancialInformation.get('totalAssets', 0)
1140 totalLiabilitiesAndOwnersEquity = corporateFinancialInformation.get('totalLiabilitiesAndOwnersEquity', 0)
1141 netProfit = corporateFinancialInformation.get('netProfit', 0)
1142 if is_bo_tccor:
1143 financial_statement_input.append((consts.SE_FS_FIELD[0], hashCode))
1144 financial_statement_input.append((consts.SE_FS_FIELD[1], consts.SE_STAMP_VALUE))
1145 financial_statement_input.append((consts.SE_FS_FIELD[2], fiscalYear))
1146 financial_statement_input.append((consts.SE_FS_FIELD[3], [totalAssets, totalLiabilitiesAndOwnersEquity]))
1147 financial_statement_input.append((consts.SE_FS_FIELD[4], netProfit))
1148 financial_statement_info[consts.FS_EN] = financial_statement_input
1149 compare_info['financialStatementInfo'] = financial_statement_info
1150
1151
1123 # 银行卡------------------------------------------------------------------------------------------------------- 1152 # 银行卡-------------------------------------------------------------------------------------------------------
1124 bank_info = {} 1153 bank_info = {}
1125 bank_name = cms_info.get('bankAccountDetails', {}).get('bankName', '') 1154 bank_name = cms_info.get('bankAccountDetails', {}).get('bankName', '')
...@@ -1375,7 +1404,10 @@ def get_se_cms_compare_info_auto(application_id, last_obj, application_entity, d ...@@ -1375,7 +1404,10 @@ def get_se_cms_compare_info_auto(application_id, last_obj, application_entity, d
1375 if len(main_role_info[app_type]) >= id_idx+1: 1404 if len(main_role_info[app_type]) >= id_idx+1:
1376 is_find = True 1405 is_find = True
1377 if isinstance(field_idx, int): 1406 if isinstance(field_idx, int):
1378 hil_contract_1_input.append((key, main_role_info[app_type][id_idx][field_idx])) 1407 if key == '承租人签字' and is_bo_tccor:
1408 hil_contract_1_input.append((key, legal_name))
1409 else:
1410 hil_contract_1_input.append((key, main_role_info[app_type][id_idx][field_idx]))
1379 else: 1411 else:
1380 hil_contract_1_input.append((key, field_idx)) 1412 hil_contract_1_input.append((key, field_idx))
1381 if not is_find and is_force: 1413 if not is_find and is_force:
...@@ -1417,7 +1449,10 @@ def get_se_cms_compare_info_auto(application_id, last_obj, application_entity, d ...@@ -1417,7 +1449,10 @@ def get_se_cms_compare_info_auto(application_id, last_obj, application_entity, d
1417 if len(main_role_info[app_type]) >= id_idx+1: 1449 if len(main_role_info[app_type]) >= id_idx+1:
1418 is_find = True 1450 is_find = True
1419 if isinstance(field_idx, int): 1451 if isinstance(field_idx, int):
1420 hil_contract_2_input.append((key, main_role_info[app_type][id_idx][field_idx])) 1452 if key == '抵押人签字' and is_bo_tccor:
1453 hil_contract_2_input.append((key, legal_name))
1454 else:
1455 hil_contract_2_input.append((key, main_role_info[app_type][id_idx][field_idx]))
1421 else: 1456 else:
1422 hil_contract_2_input.append((key, field_idx)) 1457 hil_contract_2_input.append((key, field_idx))
1423 if not is_find and is_force: 1458 if not is_find and is_force:
...@@ -1484,7 +1519,10 @@ def get_se_cms_compare_info_auto(application_id, last_obj, application_entity, d ...@@ -1484,7 +1519,10 @@ def get_se_cms_compare_info_auto(application_id, last_obj, application_entity, d
1484 if len(main_role_info[app_type]) >= id_idx+1: 1519 if len(main_role_info[app_type]) >= id_idx+1:
1485 is_find = True 1520 is_find = True
1486 if isinstance(field_idx, int): 1521 if isinstance(field_idx, int):
1487 afc_contract_input.append((key, main_role_info[app_type][id_idx][field_idx])) 1522 if (key == '借款人签字及时间' or key == '主借人签字') and is_bo_tccor:
1523 afc_contract_input.append((key, legal_name))
1524 else:
1525 afc_contract_input.append((key, main_role_info[app_type][id_idx][field_idx]))
1488 else: 1526 else:
1489 afc_contract_input.append((key, field_idx)) 1527 afc_contract_input.append((key, field_idx))
1490 if not is_find and is_force: 1528 if not is_find and is_force:
...@@ -1554,6 +1592,12 @@ def get_se_cms_compare_info(application_id, last_obj, application_entity, detect ...@@ -1554,6 +1592,12 @@ def get_se_cms_compare_info(application_id, last_obj, application_entity, detect
1554 if individual_info['applicantType'] == consts.APPLICANT_TYPE_ORDER[0] and not is_corporate: 1592 if individual_info['applicantType'] == consts.APPLICANT_TYPE_ORDER[0] and not is_corporate:
1555 is_cdfl_bo = True 1593 is_cdfl_bo = True
1556 1594
1595 # CHINARPA-4660 是否公户判断
1596 is_bo_tccor = False
1597 customersubType = individual_info.get('customersubType', '')
1598 if individual_info['applicantType'] == consts.APPLICANT_TYPE_ORDER[0] and customersubType == 'TCCOR':
1599 is_bo_tccor = True
1600
1557 for id_info in individual_info.get('IDInformation', []): 1601 for id_info in individual_info.get('IDInformation', []):
1558 if id_info.get('idType') in consts.SE_CMS_FIRST_ID_FIELD_MAPPING: 1602 if id_info.get('idType') in consts.SE_CMS_FIRST_ID_FIELD_MAPPING:
1559 license_en, is_prc = consts.SE_CMS_FIRST_ID_FIELD_MAPPING[id_info['idType']] 1603 license_en, is_prc = consts.SE_CMS_FIRST_ID_FIELD_MAPPING[id_info['idType']]
...@@ -1567,7 +1611,9 @@ def get_se_cms_compare_info(application_id, last_obj, application_entity, detect ...@@ -1567,7 +1611,9 @@ def get_se_cms_compare_info(application_id, last_obj, application_entity, detect
1567 license_dict[license_en] = field_input 1611 license_dict[license_en] = field_input
1568 all_id_num.append(id_num) 1612 all_id_num.append(id_num)
1569 # 营业执照 -------------------------------------------------------------------------------------------------- 1613 # 营业执照 --------------------------------------------------------------------------------------------------
1570 elif id_info.get('idType') in ['Unified Social Credit Code', 'Tax Number', 'Business License Number']: 1614 # 4660 修改比对营业执照文档必要性的判断条件
1615 # elif id_info.get('idType') in ['Unified Social Credit Code', 'Tax Number', 'Business License Number']:
1616 elif is_bo_tccor:
1571 # ['companyName', 'legalRepName', 'businessLicenseNo', 'organizationCreditCode', 1617 # ['companyName', 'legalRepName', 'businessLicenseNo', 'organizationCreditCode',
1572 # 'taxRegistrationCertificateNo', 'establishmentDate', 'businessLicenseDueDate'] 1618 # 'taxRegistrationCertificateNo', 'establishmentDate', 'businessLicenseDueDate']
1573 id_num = decode_des(id_info.get('idNum', ''), des_key) 1619 id_num = decode_des(id_info.get('idNum', ''), des_key)
...@@ -1585,6 +1631,7 @@ def get_se_cms_compare_info(application_id, last_obj, application_entity, detect ...@@ -1585,6 +1631,7 @@ def get_se_cms_compare_info(application_id, last_obj, application_entity, detect
1585 else: 1631 else:
1586 bl_field_input.append(('establishmentDate', establishment_date)) 1632 bl_field_input.append(('establishmentDate', establishment_date))
1587 1633
1634 compare_log.info('{0} [bl_field_input] [{1}]'.format(log_base, bl_field_input))
1588 license_dict[consts.BL_EN] = bl_field_input 1635 license_dict[consts.BL_EN] = bl_field_input
1589 all_id_num.append(id_num) 1636 all_id_num.append(id_num)
1590 1637
...@@ -1601,6 +1648,7 @@ def get_se_cms_compare_info(application_id, last_obj, application_entity, detect ...@@ -1601,6 +1648,7 @@ def get_se_cms_compare_info(application_id, last_obj, application_entity, detect
1601 (customer_name, '、'.join(all_id_num), all_id_num[0]) 1648 (customer_name, '、'.join(all_id_num), all_id_num[0])
1602 ) 1649 )
1603 1650
1651 compare_log.info('{0} [license_dict] [{1}]'.format(log_base, license_dict))
1604 if len(license_dict) > 0: 1652 if len(license_dict) > 0:
1605 individual_info_dict.setdefault(individual_info['applicantType'], []).append(license_dict) 1653 individual_info_dict.setdefault(individual_info['applicantType'], []).append(license_dict)
1606 1654
...@@ -1721,6 +1769,25 @@ def get_se_cms_compare_info(application_id, last_obj, application_entity, detect ...@@ -1721,6 +1769,25 @@ def get_se_cms_compare_info(application_id, last_obj, application_entity, detect
1721 vehicle_info[consts.UCI_EN] = vehicle_field_input 1769 vehicle_info[consts.UCI_EN] = vehicle_field_input
1722 compare_info['vehicleInfo'] = vehicle_info 1770 compare_info['vehicleInfo'] = vehicle_info
1723 1771
1772 # 公户财务报表-------------------------------------------------------------------------------------------------
1773 financial_statement_info = {}
1774 financial_statement_input = []
1775 corporateFinancialInformation = cms_info.get('corporateFinancialInformation', {})
1776 hashCode = corporateFinancialInformation.get('hashCode', '')
1777 fiscalYear = corporateFinancialInformation.get('fiscalYear', '')
1778 totalAssets = corporateFinancialInformation.get('totalAssets', 0)
1779 totalLiabilitiesAndOwnersEquity = corporateFinancialInformation.get('totalLiabilitiesAndOwnersEquity', 0)
1780 netProfit = corporateFinancialInformation.get('netProfit', 0)
1781 if is_bo_tccor:
1782 financial_statement_input.append((consts.SE_FS_FIELD[0], hashCode))
1783 financial_statement_input.append((consts.SE_FS_FIELD[1], consts.SE_STAMP_VALUE))
1784 financial_statement_input.append((consts.SE_FS_FIELD[2], fiscalYear))
1785 financial_statement_input.append((consts.SE_FS_FIELD[3], [totalAssets, totalLiabilitiesAndOwnersEquity]))
1786 financial_statement_input.append((consts.SE_FS_FIELD[4], netProfit))
1787 financial_statement_info[consts.FS_EN] = financial_statement_input
1788 compare_info['financialStatementInfo'] = financial_statement_info
1789
1790
1724 # 银行卡------------------------------------------------------------------------------------------------------- 1791 # 银行卡-------------------------------------------------------------------------------------------------------
1725 bank_info = {} 1792 bank_info = {}
1726 bank_name = cms_info.get('bankAccountDetails', {}).get('bankName', '') 1793 bank_name = cms_info.get('bankAccountDetails', {}).get('bankName', '')
...@@ -1939,7 +2006,10 @@ def get_se_cms_compare_info(application_id, last_obj, application_entity, detect ...@@ -1939,7 +2006,10 @@ def get_se_cms_compare_info(application_id, last_obj, application_entity, detect
1939 if len(main_role_info[app_type]) >= id_idx+1: 2006 if len(main_role_info[app_type]) >= id_idx+1:
1940 is_find = True 2007 is_find = True
1941 if isinstance(field_idx, int): 2008 if isinstance(field_idx, int):
1942 hil_contract_1_input.append((key, main_role_info[app_type][id_idx][field_idx])) 2009 if key == '承租人签字' and is_bo_tccor:
2010 hil_contract_1_input.append((key, legal_name))
2011 else:
2012 hil_contract_1_input.append((key, main_role_info[app_type][id_idx][field_idx]))
1943 else: 2013 else:
1944 hil_contract_1_input.append((key, field_idx)) 2014 hil_contract_1_input.append((key, field_idx))
1945 if not is_find and is_force: 2015 if not is_find and is_force:
...@@ -1958,7 +2028,10 @@ def get_se_cms_compare_info(application_id, last_obj, application_entity, detect ...@@ -1958,7 +2028,10 @@ def get_se_cms_compare_info(application_id, last_obj, application_entity, detect
1958 (consts.SE_HIL_CON_3_FIELD[6], main_id), 2028 (consts.SE_HIL_CON_3_FIELD[6], main_id),
1959 ] 2029 ]
1960 if online_sign: 2030 if online_sign:
1961 hil_contract_3_input.append((consts.SE_HIL_CON_3_FIELD[7], main_name)) 2031 if is_bo_tccor:
2032 hil_contract_3_input.append((consts.SE_HIL_CON_3_FIELD[7], legal_name))
2033 else:
2034 hil_contract_3_input.append((consts.SE_HIL_CON_3_FIELD[7], main_name))
1962 contract_info[consts.HIL_CONTRACT_3_EN] = hil_contract_3_input 2035 contract_info[consts.HIL_CONTRACT_3_EN] = hil_contract_3_input
1963 2036
1964 # HIL合同 车辆租赁抵押合同 -------------------------------------------------------------------------------------- 2037 # HIL合同 车辆租赁抵押合同 --------------------------------------------------------------------------------------
...@@ -1981,7 +2054,10 @@ def get_se_cms_compare_info(application_id, last_obj, application_entity, detect ...@@ -1981,7 +2054,10 @@ def get_se_cms_compare_info(application_id, last_obj, application_entity, detect
1981 if len(main_role_info[app_type]) >= id_idx+1: 2054 if len(main_role_info[app_type]) >= id_idx+1:
1982 is_find = True 2055 is_find = True
1983 if isinstance(field_idx, int): 2056 if isinstance(field_idx, int):
1984 hil_contract_2_input.append((key, main_role_info[app_type][id_idx][field_idx])) 2057 if key == '抵押人签字' and is_bo_tccor:
2058 hil_contract_2_input.append((key, legal_name))
2059 else:
2060 hil_contract_2_input.append((key, main_role_info[app_type][id_idx][field_idx]))
1985 else: 2061 else:
1986 hil_contract_2_input.append((key, field_idx)) 2062 hil_contract_2_input.append((key, field_idx))
1987 if not is_find and is_force: 2063 if not is_find and is_force:
...@@ -2048,7 +2124,10 @@ def get_se_cms_compare_info(application_id, last_obj, application_entity, detect ...@@ -2048,7 +2124,10 @@ def get_se_cms_compare_info(application_id, last_obj, application_entity, detect
2048 if len(main_role_info[app_type]) >= id_idx+1: 2124 if len(main_role_info[app_type]) >= id_idx+1:
2049 is_find = True 2125 is_find = True
2050 if isinstance(field_idx, int): 2126 if isinstance(field_idx, int):
2051 afc_contract_input.append((key, main_role_info[app_type][id_idx][field_idx])) 2127 if (key == '借款人签字及时间' or key == '主借人签字') and is_bo_tccor:
2128 afc_contract_input.append((key, legal_name))
2129 else:
2130 afc_contract_input.append((key, main_role_info[app_type][id_idx][field_idx]))
2052 else: 2131 else:
2053 afc_contract_input.append((key, field_idx)) 2132 afc_contract_input.append((key, field_idx))
2054 if not is_find and is_force: 2133 if not is_find and is_force:
...@@ -2523,6 +2602,113 @@ def se_compare_license(license_en, ocr_res_dict, field_list): ...@@ -2523,6 +2602,113 @@ def se_compare_license(license_en, ocr_res_dict, field_list):
2523 2602
2524 return result_field_list, no_ocr_result, field_img_path_dict 2603 return result_field_list, no_ocr_result, field_img_path_dict
2525 2604
2605 def se_fs_compare(license_en, ocr_res_dict, field_list):
2606 compare_log.info('{0} [se_fs_compare] start'.format(log_base))
2607 ocr_field, compare_logic, special_expiry_date = consts.SE_COMPARE_FIELD[license_en]
2608
2609 is_find = False
2610 no_ocr_result = False
2611 special_expiry_date_slice = False
2612 result_field_list = []
2613 section_img_info = dict()
2614 field_img_path_dict = dict()
2615 ocr_res_str = ocr_res_dict.get(ocr_field)
2616 compare_log.info('{0} [se_fs_compare] ocr_res:{1}'.format(log_base, ocr_res_str))
2617 if ocr_res_str is not None:
2618 ocr_res_list = json.loads(ocr_res_str)
2619
2620 length = len(ocr_res_list)
2621
2622 last_ocr_str = ocr_res_list[length-1]
2623 compare_log.info('{0} [se_fs_compare] [code len {1}] [stamp len {2}] ]'.format(log_base, len(last_ocr_str.get('code',{})), len(last_ocr_str.get('stamp',{}))))
2624
2625 if len(last_ocr_str.get('code',{})) != 3 or len(last_ocr_str.get('stamp',{})) != 3:
2626 # 先判断最后一次上传的文件是不是包括3个,如果不是直接返回"未提供财报或财报不完整"
2627 compare_log.info('{0} [se_fs_compare error] last ocr result len < 3'.format(log_base))
2628 else:
2629 for res_idx in range(length-1, -1, -1):
2630 if is_find:
2631 break
2632
2633 for idx, (name, value) in enumerate(field_list):
2634 compare_log.info('{0} [se_fs_compare for ... in] [idx:{1}] [name:{2}] [value:{3}]'.format(log_base, idx, name, value))
2635 ocr_str = ocr_res_list[res_idx].get(compare_logic[name][0])
2636 compare_log.info('{0} [se_fs_compare ocr_str] [ocr_str:{1}]'.format(log_base, ocr_str))
2637 #财年/资产负债表内容/利润表内容 不需要ocr结果,所以即使为空也可以进入比对
2638 if isinstance(ocr_str, str) or isinstance(ocr_str, dict) or compare_logic[name][0] == '财年' or compare_logic[name][0] == '资产负债表内容' or compare_logic[name][0] == '利润表内容':
2639 result = getattr(cp, compare_logic[name][1])(value, ocr_str, **compare_logic[name][2])
2640 compare_log.info('{0} [se_fs_compare result:{1}]'.format(log_base, result))
2641 no_key = False
2642 else:
2643 result = consts.RESULT_N
2644 ocr_str = empty_str
2645 no_key = True
2646
2647 if idx == 0 and result == consts.RESULT_N and length > 1:
2648 break
2649
2650 is_find = True
2651 section_img_info[consts.SECTION_IMG_PATH_KEY] = ocr_res_list[res_idx].get(consts.SECTION_IMG_PATH_KEY, '')
2652 section_img_info[consts.ALL_POSITION_KEY] = ocr_res_list[res_idx].get(consts.ALL_POSITION_KEY, {})
2653 if special_expiry_date:
2654 section_img_info[consts.SECTION_IMG_PATH_KEY_2] = ocr_res_list[res_idx].get(
2655 consts.SECTION_IMG_PATH_KEY_2, '')
2656 section_img_info[consts.ALL_POSITION_KEY_2] = ocr_res_list[res_idx].get(consts.ALL_POSITION_KEY_2, {})
2657
2658 img_path = ocr_res_list[res_idx].get(consts.IMG_PATH_KEY, '') if result == consts.RESULT_N else empty_str
2659 if isinstance(value, list):
2660 value = json.dumps(value, ensure_ascii=False)
2661 error_type = empty_error_type if result == consts.RESULT_Y else ErrorType.OCR.value
2662 result_field_list.append((name, value, result, ocr_str, img_path, error_type, compare_logic[name][3]))
2663 else:
2664 no_ocr_result = True
2665
2666 if not is_find:
2667 for name, value in field_list:
2668 if isinstance(value, list):
2669 value = json.dumps(value, ensure_ascii=False)
2670 no_find_str = consts.FS_NO_FIND
2671 result_field_list.append((name, value, consts.RESULT_N, empty_str, empty_str, ErrorType.NF.value, no_find_str))
2672
2673 if is_find:
2674 section_img_path = section_img_info.get(consts.SECTION_IMG_PATH_KEY, '')
2675 if os.path.exists(section_img_path):
2676 failed_field = []
2677 base_img_path = empty_str
2678 for name, _, result, _, img_path, _, _ in result_field_list:
2679 if result == consts.RESULT_N:
2680 if special_expiry_date_slice and name == 'idExpiryDate':
2681 continue
2682 failed_field.append(name)
2683 if base_img_path == empty_str:
2684 base_img_path = img_path
2685 if len(failed_field) > 0:
2686 info = section_img_info.get(consts.ALL_POSITION_KEY, {})
2687 section_position = info.get(consts.POSITION_KEY, {})
2688 section_angle = info.get(consts.ANGLE_KEY, 0)
2689 try:
2690 last_img = img_process(section_img_path, section_position, section_angle)
2691 except Exception as e:
2692 for field in failed_field:
2693 field_img_path_dict[field] = base_img_path
2694 else:
2695 pre, suf = os.path.splitext(section_img_path)
2696 for field in failed_field:
2697 try:
2698 res_field = compare_logic[field][0]
2699 is_valid, coord_tuple = field_build_coordinates(info.get(res_field, {}))
2700 if is_valid:
2701 save_path = '{0}_{1}{2}'.format(pre, field, suf)
2702 field_img = last_img[coord_tuple[0]:coord_tuple[1], coord_tuple[2]:coord_tuple[3], :]
2703 cv2.imwrite(save_path, field_img)
2704 field_img_path_dict[field] = save_path
2705 else:
2706 field_img_path_dict[field] = base_img_path
2707 except Exception as e:
2708 field_img_path_dict[field] = base_img_path
2709
2710 return result_field_list, field_img_path_dict
2711
2526 2712
2527 def se_compare_license_id(license_en, id_res_list, field_list, is_auto): 2713 def se_compare_license_id(license_en, id_res_list, field_list, is_auto):
2528 if is_auto: 2714 if is_auto:
...@@ -3023,9 +3209,11 @@ def se_compare_process(compare_info, ocr_res_dict, is_gsyh, is_auto, id_res_list ...@@ -3023,9 +3209,11 @@ def se_compare_process(compare_info, ocr_res_dict, is_gsyh, is_auto, id_res_list
3023 rpa_failure_reason = {} 3209 rpa_failure_reason = {}
3024 field_result_dict = {} 3210 field_result_dict = {}
3025 3211
3212 # compare_info 格式: {'financialStatementInfo': {'Financial Statement': [('11', '22'), ('111', '222'), ('1111', '2222')]}}
3026 for info_key, info_value in compare_info.items(): 3213 for info_key, info_value in compare_info.items():
3027 if info_key in ['individualCusInfo', 'applicantInformation']: 3214 if info_key in ['individualCusInfo', 'applicantInformation']:
3028 for idx, license_list in info_value.items(): 3215 for idx, license_list in info_value.items():
3216 compare_log.info('{0} [compare license_list] [entity={1}]'.format(log_base, license_list))
3029 for license_dict in license_list: 3217 for license_dict in license_list:
3030 for license_en, field_list in license_dict.items(): 3218 for license_en, field_list in license_dict.items():
3031 strip_list = [] 3219 strip_list = []
...@@ -3081,6 +3269,7 @@ def se_compare_process(compare_info, ocr_res_dict, is_gsyh, is_auto, id_res_list ...@@ -3081,6 +3269,7 @@ def se_compare_process(compare_info, ocr_res_dict, is_gsyh, is_auto, id_res_list
3081 each_license_failed_count, len(result_field_list))) 3269 each_license_failed_count, len(result_field_list)))
3082 else: 3270 else:
3083 for license_en, field_list in info_value.items(): 3271 for license_en, field_list in info_value.items():
3272 compare_log.info('{0} [compare license_en] [entity={1}]'.format(log_base, license_en))
3084 strip_list = [] 3273 strip_list = []
3085 for a, b in field_list: 3274 for a, b in field_list:
3086 if isinstance(b, str): 3275 if isinstance(b, str):
...@@ -3104,6 +3293,8 @@ def se_compare_process(compare_info, ocr_res_dict, is_gsyh, is_auto, id_res_list ...@@ -3104,6 +3293,8 @@ def se_compare_process(compare_info, ocr_res_dict, is_gsyh, is_auto, id_res_list
3104 result_field_list, field_img_path_dict = se_contract_qrs_compare(license_en, ocr_res_dict, strip_list) 3293 result_field_list, field_img_path_dict = se_contract_qrs_compare(license_en, ocr_res_dict, strip_list)
3105 elif license_en == consts.BS_EN: 3294 elif license_en == consts.BS_EN:
3106 result_field_list, field_img_path_dict = se_bs_compare(license_en, ocr_res_dict, strip_list, is_auto, aa_type) 3295 result_field_list, field_img_path_dict = se_bs_compare(license_en, ocr_res_dict, strip_list, is_auto, aa_type)
3296 elif license_en == consts.FS_EN:
3297 result_field_list, field_img_path_dict = se_fs_compare(license_en, ocr_res_dict, strip_list)
3107 else: 3298 else:
3108 result_field_list, _, field_img_path_dict = se_compare_license(license_en, ocr_res_dict, strip_list) 3299 result_field_list, _, field_img_path_dict = se_compare_license(license_en, ocr_res_dict, strip_list)
3109 3300
......
...@@ -701,5 +701,49 @@ class Comparison: ...@@ -701,5 +701,49 @@ class Comparison:
701 except Exception as e: 701 except Exception as e:
702 return self.RESULT_N 702 return self.RESULT_N
703 703
704 def hash_code_compare(self, input_str, ocr_dict, **kwargs):
705 try:
706 balance_sheet_hash = ocr_dict.get('balance_sheet','')
707 income_statement_hash = ocr_dict.get('income_statement','')
708 cash_flow_statement_hash = ocr_dict.get('cash_flow_statement','')
709 if balance_sheet_hash != input_str or income_statement_hash != input_str or cash_flow_statement_hash != input_str:
710 return self.RESULT_N
711 else:
712 return self.RESULT_Y
713 except Exception as e:
714 return self.RESULT_N
715
716 def stamp_dict_compare(self, input_str, ocr_dict, **kwargs):
717 try:
718 balance_sheet_stamp = ocr_dict.get('balance_sheet','')
719 income_statement_stamp = ocr_dict.get('income_statement','')
720 cash_flow_statement_stamp = ocr_dict.get('cash_flow_statement','')
721 if balance_sheet_stamp != 1 or income_statement_stamp != 1 or cash_flow_statement_stamp != 1:
722 return self.RESULT_N
723 else:
724 return self.RESULT_Y
725 except Exception as e:
726 return self.RESULT_N
727
728 def fiscal_year_compare(self, input_str, ocr_list, **kwargs):
729 try:
730 this_year_str = datetime.now().strftime('%Y')
731 this_year = int(this_year_str)
732 last_year = this_year - 1
733 if str(input_str) != str(this_year) and str(input_str) != str(last_year):
734 return self.RESULT_N
735 return self.RESULT_Y
736 except Exception as e:
737 return self.RESULT_N
738
739 def input_list_not_zero_compare(self, input_list, ocr_list, **kwargs):
740 try:
741 for item in input_list:
742 if float(item) <= 0:
743 return self.RESULT_N
744 return self.RESULT_Y
745 except Exception as e:
746 return self.RESULT_N
747
704 748
705 cp = Comparison() 749 cp = Comparison()
......
1 import pyodbc
2
3 hil_sql = """
4 ALTER TABLE hil_ocr_result ADD fs_ocr nvarchar(max);
5 ALTER TABLE hil_se_ocr_result ADD fs_ocr nvarchar(max);
6 ALTER TABLE hil_ocr_result ADD fss_ocr nvarchar(max);
7 ALTER TABLE hil_se_ocr_result ADD fss_ocr nvarchar(max);
8 """
9
10 afc_sql = """
11 ALTER TABLE afc_ocr_result ADD fs_ocr nvarchar(max);
12 ALTER TABLE afc_se_ocr_result ADD fs_ocr nvarchar(max);
13 ALTER TABLE afc_ocr_result ADD fss_ocr nvarchar(max);
14 ALTER TABLE afc_se_ocr_result ADD fss_ocr nvarchar(max);
15 """
16
17 hil_cnxn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};', autocommit=True)
18
19 hil_cursor = hil_cnxn.cursor()
20 hil_cursor.execute(hil_sql)
21
22 hil_cursor.close()
23 hil_cnxn.close()
24
25 afc_cnxn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};', autocommit=True)
26
27 afc_cursor = afc_cnxn.cursor()
28 afc_cursor.execute(afc_sql)
29
30 afc_cursor.close()
31 afc_cnxn.close()
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!