e34beaaf by 周伟奇

Merge branch 'feature/se' into feature/1223

2 parents c3e66f31 8b3fd09a
...@@ -1178,6 +1178,9 @@ DDA_OCR_FIELD = 'bs_ocr' ...@@ -1178,6 +1178,9 @@ DDA_OCR_FIELD = 'bs_ocr'
1178 HMH_OCR_FIELD = 'hmh_ocr' 1178 HMH_OCR_FIELD = 'hmh_ocr'
1179 JYPZ_OCR_FIELD = 'jypz_ocr' 1179 JYPZ_OCR_FIELD = 'jypz_ocr'
1180 HT_FIELD = 'ht_ocr' 1180 HT_FIELD = 'ht_ocr'
1181 BD_FIELD = 'bd_ocr'
1182 BS_FIELD = 'bss_ocr'
1183 BS_CLASSIFY = 10087
1181 1184
1182 RESULT_MAPPING = { 1185 RESULT_MAPPING = {
1183 MVI_CLASSIFY: MVI_OCR_FIELD, 1186 MVI_CLASSIFY: MVI_OCR_FIELD,
...@@ -1195,9 +1198,11 @@ RESULT_MAPPING = { ...@@ -1195,9 +1198,11 @@ RESULT_MAPPING = {
1195 HMH_CLASSIFY: HMH_OCR_FIELD, 1198 HMH_CLASSIFY: HMH_OCR_FIELD,
1196 JYPZ_CLASSIFY: JYPZ_OCR_FIELD, 1199 JYPZ_CLASSIFY: JYPZ_OCR_FIELD,
1197 CONTRACT_CLASSIFY: HT_FIELD, 1200 CONTRACT_CLASSIFY: HT_FIELD,
1201 INSURANCE_CLASSIFY: BD_FIELD,
1202 BS_CLASSIFY: BS_FIELD,
1198 } 1203 }
1199 1204
1200 CA_ADD_COMPARE_FIELDS = (IC_OCR_FIELD, BL_OCR_FIELD) 1205 CA_ADD_COMPARE_FIELDS = (IC_OCR_FIELD, BL_OCR_FIELD, BS_FIELD)
1201 1206
1202 COMPARE_FIELDS = (MVI_OCR_FIELD, 1207 COMPARE_FIELDS = (MVI_OCR_FIELD,
1203 IC_OCR_FIELD, 1208 IC_OCR_FIELD,
...@@ -1213,6 +1218,8 @@ COMPARE_FIELDS = (MVI_OCR_FIELD, ...@@ -1213,6 +1218,8 @@ COMPARE_FIELDS = (MVI_OCR_FIELD,
1213 HMH_OCR_FIELD, 1218 HMH_OCR_FIELD,
1214 JYPZ_OCR_FIELD, 1219 JYPZ_OCR_FIELD,
1215 HT_FIELD, 1220 HT_FIELD,
1221 BD_FIELD,
1222 BS_FIELD,
1216 ) 1223 )
1217 1224
1218 # 身份证 1225 # 身份证
...@@ -1393,7 +1400,10 @@ SE_STAMP_VALUE = '有' ...@@ -1393,7 +1400,10 @@ SE_STAMP_VALUE = '有'
1393 SE_LAYOUT_VALUE = '旧版-旧打印、新版-新打印' 1400 SE_LAYOUT_VALUE = '旧版-旧打印、新版-新打印'
1394 SE_GB_NEW_FIELD = ['vinNo'] 1401 SE_GB_NEW_FIELD = ['vinNo']
1395 SE_GB_USED_FIELD = ['customerName', 'idNum', 'date'] 1402 SE_GB_USED_FIELD = ['customerName', 'idNum', 'date']
1403 SE_BS_FIELD = ['户名', '打印日期', '流水日期', '(担保人)户名', '(担保人)打印日期', '(担保人)流水日期']
1396 SE_HMH_FIELD = ['借款人/承租人姓名', '借款人/承租人证件号', '申请号', '渠道', '签字'] 1404 SE_HMH_FIELD = ['借款人/承租人姓名', '借款人/承租人证件号', '申请号', '渠道', '签字']
1405 SE_BD_FIELD = ['被保险人姓名', '被保险人证件号码', '车架号', '机动车损失保险金额', '第三者责任保险金额', '绝对免赔率', '保险起始日期', '保险截止日期', '保单章', '第一受益人', '保险费合计']
1406 JDMPV_VALUE = ['-', '--', '0%', '0.00', '/', '0']
1397 1407
1398 SE_BANK_FIELD = ['accountNo', 'bankName'] 1408 SE_BANK_FIELD = ['accountNo', 'bankName']
1399 SE_DDA_FIELD = ['applicationId(1)', 'applicationId(2)', 'bankName', 'companyName', 'customerName', 'idNum', 'accountHolderName', 'accountNo'] 1409 SE_DDA_FIELD = ['applicationId(1)', 'applicationId(2)', 'bankName', 'companyName', 'customerName', 'idNum', 'accountHolderName', 'accountNo']
...@@ -1502,6 +1512,8 @@ DDA_EN = 'DDA' ...@@ -1502,6 +1512,8 @@ DDA_EN = 'DDA'
1502 HMH_EN = 'Mortgage Waiver Letter' 1512 HMH_EN = 'Mortgage Waiver Letter'
1503 JYPZ_EN = 'Used Car Document' 1513 JYPZ_EN = 'Used Car Document'
1504 AFC_CONTRACT_EN = 'AFC Contract' 1514 AFC_CONTRACT_EN = 'AFC Contract'
1515 BD_EN = 'Insurance'
1516 BS_EN = 'Bank Statement'
1505 1517
1506 SKIP_CARD = {SME_BL_EN} 1518 SKIP_CARD = {SME_BL_EN}
1507 1519
...@@ -1643,6 +1655,31 @@ HMH_COMPARE_LOGIC = { ...@@ -1643,6 +1655,31 @@ HMH_COMPARE_LOGIC = {
1643 '签字': ('借款人签字/盖章', 'se_common_compare', {}, '抵押登记豁免函签字需人工核查'), 1655 '签字': ('借款人签字/盖章', 'se_common_compare', {}, '抵押登记豁免函签字需人工核查'),
1644 } 1656 }
1645 1657
1658 BD_COMPARE_LOGIC = {
1659 '被保险人姓名': ('被保险人姓名', 'se_name_compare', {}, '保单被保险人姓名与系统不一致'),
1660 '被保险人证件号码': ('被保险人证件号码', 'se_common_compare', {}, '保单被保险人证件号码与系统不一致'),
1661 '车架号': ('车架号', 'se_common_compare', {}, '保单车架号与系统不一致'),
1662 '机动车损失保险金额': ('机动车损失保险金额', 'se_amount_lte_compare', {}, '保单车损险异常'),
1663 '第三者责任保险金额': ('机动车第三者责任保险金额', 'se_amount_lte_compare', {}, '保单三者险异常'),
1664 '绝对免赔率': ('机动车损失保险绝对免赔率/绝对免赔额', 'se_one_compare', {}, '保单无绝对免赔项'),
1665 '保险起始日期': ('保险起始日期', 'se_bd_date_compare', {'start': True}, '保单起始时间有误'),
1666 '保险截止日期': ('保险截止日期', 'se_bd_date_compare', {}, '保单截止时间有误'),
1667 '保单章': ('保单章', 'se_common_compare', {}, '保单无保单章'),
1668 '第一受益人': ('特别约定第一受益人', 'se_common_compare', {}, '保单第一受益人有误,需人工核查'),
1669 '保险费合计': ('保险费合计', 'se_amount_compare', {}, '保单保费疑似无法覆盖ASP保险融资'),
1670 }
1671
1672 BS_COMPARE_LOGIC = {
1673 '户名': ('role', 'se_one_compare', {}, '主共借人未提供银行流水'),
1674 '(担保人)户名': ('role', 'se_one_compare', {}, '担保人未提供银行流水,需人工查看直系亲属关系'),
1675 '打印日期': ('print_time', 'se_bs_print_date_compare', {}, '主共借人银行流水打印日期异常'),
1676 '(担保人)打印日期': ('print_time', 'se_bs_print_date_compare', {}, '担保人银行流水打印日期异常'),
1677 '流水日期': ('date', 'se_bs_date_compare', {}, '主共借人银行流水日期异常'),
1678 '(担保人)流水日期': ('date', 'se_bs_date_compare', {}, '担保人银行流水日期异常'),
1679 }
1680
1681 SPECIAL_REASON = '主共借人未提供银行流水,含担保人需人工查看直系亲属关系'
1682
1646 HT_COMPARE_LOGIC = { 1683 HT_COMPARE_LOGIC = {
1647 '合同编号-每页': ('合同编号-每页', 'se_list_compare', {}, '合同编号与系统不一致'), 1684 '合同编号-每页': ('合同编号-每页', 'se_list_compare', {}, '合同编号与系统不一致'),
1648 '所购车辆价格-小写-重要条款': ('所购车辆价格-小写-重要条款', 'se_amount_str_compare', {}, '合同首页中车辆价格与系统不一致'), 1685 '所购车辆价格-小写-重要条款': ('所购车辆价格-小写-重要条款', 'se_amount_str_compare', {}, '合同首页中车辆价格与系统不一致'),
...@@ -1710,7 +1747,9 @@ SE_COMPARE_FIELD = { ...@@ -1710,7 +1747,9 @@ SE_COMPARE_FIELD = {
1710 DDA_EN: (DDA_OCR_FIELD, DDA_COMPARE_LOGIC, False), 1747 DDA_EN: (DDA_OCR_FIELD, DDA_COMPARE_LOGIC, False),
1711 HMH_EN: (HMH_OCR_FIELD, HMH_COMPARE_LOGIC, False), 1748 HMH_EN: (HMH_OCR_FIELD, HMH_COMPARE_LOGIC, False),
1712 JYPZ_EN: (JYPZ_OCR_FIELD, JYPZ_COMPARE_LOGIC, False), 1749 JYPZ_EN: (JYPZ_OCR_FIELD, JYPZ_COMPARE_LOGIC, False),
1713 AFC_CONTRACT_EN: (HT_FIELD, HT_COMPARE_LOGIC, False) 1750 AFC_CONTRACT_EN: (HT_FIELD, HT_COMPARE_LOGIC, False),
1751 BD_EN: (BD_FIELD, BD_COMPARE_LOGIC, False),
1752 BS_EN: (BS_FIELD, BS_COMPARE_LOGIC, False),
1714 } 1753 }
1715 1754
1716 1755
......
...@@ -872,6 +872,43 @@ class Command(BaseCommand, LoggerMixin): ...@@ -872,6 +872,43 @@ class Command(BaseCommand, LoggerMixin):
872 summary['role'] = self.get_most(summary['role']) 872 summary['role'] = self.get_most(summary['role'])
873 return bs_summary 873 return bs_summary
874 874
875 def rebuild_bs(self, bs_summary):
876 # bs_summary = {
877 # '卡号': {
878 # 'classify': 0,
879 # 'confidence': 0.9,
880 # 'role': '柳雪',
881 # 'code': [('page', 'code'), ],
882 # 'verify': [(pno, ino, reason_str), ]
883 # 'print_time': 'datetime',
884 # 'start_date': 'datetime',
885 # 'end_date': 'datetime',
886 # 'sheet': ['sheet_name']
887 # }
888 # }
889 res = []
890 for bs_info in bs_summary.values():
891 try:
892 print_date = bs_info.get('print_time', '').strftime("%Y-%m-%d")
893 except Exception as e:
894 print_date = ''
895 try:
896 start_date = bs_info.get('start_date', '').strftime("%Y-%m-%d")
897 except Exception as e:
898 start_date = ''
899 try:
900 end_date = bs_info.get('end_date', '').strftime("%Y-%m-%d")
901 except Exception as e:
902 end_date = ''
903 res.append(
904 {
905 'role': bs_info.get('role', ''),
906 'print_time': print_date,
907 'date': [start_date, end_date],
908 }
909 )
910 return res
911
875 def rebuild_contract(self, contract_result_compare): 912 def rebuild_contract(self, contract_result_compare):
876 res_list = [] 913 res_list = []
877 for classify, page_info_dict in contract_result_compare.items(): 914 for classify, page_info_dict in contract_result_compare.items():
...@@ -1626,6 +1663,10 @@ class Command(BaseCommand, LoggerMixin): ...@@ -1626,6 +1663,10 @@ class Command(BaseCommand, LoggerMixin):
1626 if len(contract_result_compare_rebuild) > 0: 1663 if len(contract_result_compare_rebuild) > 0:
1627 license_summary[consts.CONTRACT_CLASSIFY] = contract_result_compare_rebuild 1664 license_summary[consts.CONTRACT_CLASSIFY] = contract_result_compare_rebuild
1628 1665
1666 bs_rebuild = self.rebuild_bs(merged_bs_summary)
1667 if len(bs_rebuild) > 0:
1668 license_summary[consts.BS_CLASSIFY] = bs_rebuild
1669
1629 # 比对 1670 # 比对
1630 if len(license_summary) > 0 and doc.document_scheme != consts.DOC_SCHEME_LIST[2]: 1671 if len(license_summary) > 0 and doc.document_scheme != consts.DOC_SCHEME_LIST[2]:
1631 try: 1672 try:
......
...@@ -314,6 +314,8 @@ class AFCOCRResult(models.Model): ...@@ -314,6 +314,8 @@ class AFCOCRResult(models.Model):
314 hmh_ocr = models.TextField(null=True, verbose_name="豁免函") 314 hmh_ocr = models.TextField(null=True, verbose_name="豁免函")
315 jypz_ocr = models.TextField(null=True, verbose_name="二手车交易凭证") 315 jypz_ocr = models.TextField(null=True, verbose_name="二手车交易凭证")
316 ht_ocr = models.TextField(null=True, verbose_name="AFC合同") 316 ht_ocr = models.TextField(null=True, verbose_name="AFC合同")
317 bd_ocr = models.TextField(null=True, verbose_name="保单")
318 bss_ocr = models.TextField(null=True, verbose_name="银行流水")
317 319
318 update_time = models.DateTimeField(auto_now=True, verbose_name='修改时间') 320 update_time = models.DateTimeField(auto_now=True, verbose_name='修改时间')
319 create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') 321 create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
...@@ -344,6 +346,8 @@ class HILOCRResult(models.Model): ...@@ -344,6 +346,8 @@ class HILOCRResult(models.Model):
344 hmh_ocr = models.TextField(null=True, verbose_name="豁免函") 346 hmh_ocr = models.TextField(null=True, verbose_name="豁免函")
345 jypz_ocr = models.TextField(null=True, verbose_name="二手车交易凭证") 347 jypz_ocr = models.TextField(null=True, verbose_name="二手车交易凭证")
346 ht_ocr = models.TextField(null=True, verbose_name="AFC合同") 348 ht_ocr = models.TextField(null=True, verbose_name="AFC合同")
349 bd_ocr = models.TextField(null=True, verbose_name="保单")
350 bss_ocr = models.TextField(null=True, verbose_name="银行流水")
347 351
348 update_time = models.DateTimeField(auto_now=True, verbose_name='修改时间') 352 update_time = models.DateTimeField(auto_now=True, verbose_name='修改时间')
349 create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') 353 create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
...@@ -373,6 +377,8 @@ class AFCSEOCRResult(models.Model): ...@@ -373,6 +377,8 @@ class AFCSEOCRResult(models.Model):
373 hmh_ocr = models.TextField(null=True, verbose_name="豁免函") 377 hmh_ocr = models.TextField(null=True, verbose_name="豁免函")
374 jypz_ocr = models.TextField(null=True, verbose_name="二手车交易凭证") 378 jypz_ocr = models.TextField(null=True, verbose_name="二手车交易凭证")
375 ht_ocr = models.TextField(null=True, verbose_name="AFC合同") 379 ht_ocr = models.TextField(null=True, verbose_name="AFC合同")
380 bd_ocr = models.TextField(null=True, verbose_name="保单")
381 bss_ocr = models.TextField(null=True, verbose_name="银行流水")
376 382
377 update_time = models.DateTimeField(auto_now=True, verbose_name='修改时间') 383 update_time = models.DateTimeField(auto_now=True, verbose_name='修改时间')
378 create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') 384 create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
...@@ -403,6 +409,8 @@ class HILSEOCRResult(models.Model): ...@@ -403,6 +409,8 @@ class HILSEOCRResult(models.Model):
403 hmh_ocr = models.TextField(null=True, verbose_name="豁免函") 409 hmh_ocr = models.TextField(null=True, verbose_name="豁免函")
404 jypz_ocr = models.TextField(null=True, verbose_name="二手车交易凭证") 410 jypz_ocr = models.TextField(null=True, verbose_name="二手车交易凭证")
405 ht_ocr = models.TextField(null=True, verbose_name="AFC合同") 411 ht_ocr = models.TextField(null=True, verbose_name="AFC合同")
412 bd_ocr = models.TextField(null=True, verbose_name="保单")
413 bss_ocr = models.TextField(null=True, verbose_name="银行流水")
406 414
407 update_time = models.DateTimeField(auto_now=True, verbose_name='修改时间') 415 update_time = models.DateTimeField(auto_now=True, verbose_name='修改时间')
408 create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') 416 create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
......
...@@ -363,6 +363,15 @@ class Comparison: ...@@ -363,6 +363,15 @@ class Comparison:
363 input_tmp = input_str.replace('元', '').replace(',', '') 363 input_tmp = input_str.replace('元', '').replace(',', '')
364 return self.build_res(ocr_tmp == input_tmp) 364 return self.build_res(ocr_tmp == input_tmp)
365 365
366 def se_amount_lte_compare(self, input_str, ocr_str, **kwargs):
367 try:
368 float_input = float(input_str)
369 float_ocr = float(ocr_str)
370 except Exception as e:
371 return self.RESULT_N
372 else:
373 return self.build_res(float_ocr >= float_input)
374
366 def se_amount_compare(self, input_str, ocr_str, **kwargs): 375 def se_amount_compare(self, input_str, ocr_str, **kwargs):
367 if input_str == ocr_str: 376 if input_str == ocr_str:
368 return self.RESULT_Y 377 return self.RESULT_Y
...@@ -375,6 +384,12 @@ class Comparison: ...@@ -375,6 +384,12 @@ class Comparison:
375 else: 384 else:
376 return self.build_res(float_ocr == float_input) 385 return self.build_res(float_ocr == float_input)
377 386
387 def se_one_compare(self, input_list, ocr_str, **kwargs):
388 if isinstance(input_list, list):
389 if ocr_str in input_list:
390 return self.RESULT_Y
391 return self.RESULT_N
392
378 def se_company_compare(self, input_str, ocr_str, **kwargs): 393 def se_company_compare(self, input_str, ocr_str, **kwargs):
379 input_tmp = re.sub(self.re_obj, '', input_str).strip() 394 input_tmp = re.sub(self.re_obj, '', input_str).strip()
380 ocr_tmp = re.sub(self.re_obj, '', ocr_str).strip() 395 ocr_tmp = re.sub(self.re_obj, '', ocr_str).strip()
...@@ -439,6 +454,46 @@ class Comparison: ...@@ -439,6 +454,46 @@ class Comparison:
439 else: 454 else:
440 return self.build_res(compare_date <= ocr_date) 455 return self.build_res(compare_date <= ocr_date)
441 456
457 def se_bd_date_compare(self, input_str, ocr_str, **kwargs):
458 try:
459 input_date = datetime.strptime(input_str, "%Y-%m-%d").date()
460 ocr_date = datetime.strptime(ocr_str, "%Y-%m-%d").date()
461 if kwargs.get('start', False):
462 if input_date != ocr_date:
463 return self.RESULT_N
464
465 six_month_date = (datetime.today() - relativedelta(months=6)).date()
466 today_date = datetime.today().date()
467 return self.build_res(six_month_date <= ocr_date <= today_date)
468 else:
469 if input_date == ocr_date or ocr_date == input_date + relativedelta(days=1):
470 return self.RESULT_Y
471 return self.RESULT_N
472 except Exception as e:
473 return self.RESULT_N
474
475 def se_bs_print_date_compare(self, input_str, ocr_str, **kwargs):
476 try:
477 input_date = datetime.strptime(input_str, "%Y-%m-%d")
478 ocr_date = datetime.strptime(ocr_str, "%Y-%m-%d")
479 if ocr_date >= input_date - relativedelta(days=15):
480 return self.RESULT_Y
481 return self.RESULT_N
482 except Exception as e:
483 return self.RESULT_N
484
485 def se_bs_date_compare(self, input_str, ocr_str_list, **kwargs):
486 if isinstance(ocr_str_list, list) and len(ocr_str_list) == 2:
487 try:
488 start_date = datetime.strptime(ocr_str_list[0], "%Y-%m-%d")
489 end_date = datetime.strptime(ocr_str_list[1], "%Y-%m-%d")
490 if end_date >= start_date + relativedelta(months=3):
491 return self.RESULT_Y
492 return self.RESULT_N
493 except Exception as e:
494 return self.RESULT_N
495 return self.RESULT_N
496
442 497
443 cp = Comparison() 498 cp = Comparison()
444 499
......
1 import pyodbc
2
3 hil_sql = """
4 ALTER TABLE hil_ocr_result ADD bd_ocr nvarchar(max);
5 ALTER TABLE hil_ocr_result ADD bss_ocr nvarchar(max);
6 ALTER TABLE hil_se_ocr_result ADD bd_ocr nvarchar(max);
7 ALTER TABLE hil_se_ocr_result ADD bss_ocr nvarchar(max);
8 """
9
10 afc_sql = """
11 ALTER TABLE afc_ocr_result ADD bd_ocr nvarchar(max);
12 ALTER TABLE afc_ocr_result ADD bss_ocr nvarchar(max);
13 ALTER TABLE afc_se_ocr_result ADD bss_ocr nvarchar(max);
14 ALTER TABLE afc_se_ocr_result ADD bd_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!