e9b50624 by 冯轩

test alipay

1 parent bc8c9e4a
...@@ -99,6 +99,7 @@ RES_SUCCESS = '识别成功' ...@@ -99,6 +99,7 @@ RES_SUCCESS = '识别成功'
99 RES_SUCCESS_OTHER = '识别成功(其他类)' 99 RES_SUCCESS_OTHER = '识别成功(其他类)'
100 RES_SUCCESS_EMPTY = '识别成功(空数据)' 100 RES_SUCCESS_EMPTY = '识别成功(空数据)'
101 RES_SUCCESS_FINANCIAL_STATEMENT = '识别成功(财务报表类)' 101 RES_SUCCESS_FINANCIAL_STATEMENT = '识别成功(财务报表类)'
102 RES_SUCCESS_DOWN_PAYMENT = '识别成功(首付款支付承诺书类)'
102 RES_FAILED = '识别失败' 103 RES_FAILED = '识别失败'
103 RES_FAILED_1 = '识别失败(阶段1)' 104 RES_FAILED_1 = '识别失败(阶段1)'
104 RES_FAILED_2 = '识别失败(阶段2)' 105 RES_FAILED_2 = '识别失败(阶段2)'
...@@ -2572,6 +2573,11 @@ FINANCIAL_EXPLANATION_CLASSIFY_LIST = [100] ...@@ -2572,6 +2573,11 @@ FINANCIAL_EXPLANATION_CLASSIFY_LIST = [100]
2572 # 财报情况说明sheet名称 2573 # 财报情况说明sheet名称
2573 FINANCIAL_EXPLANATION_SHEET_NAME = "财报情况说明" 2574 FINANCIAL_EXPLANATION_SHEET_NAME = "财报情况说明"
2574 2575
2576 # 首付款支付承诺书分类标签
2577 DOWN_PAYMENT_CLASSIFY_LIST = [96]
2578 # 首付款支付承诺书sheet名称
2579 DOWN_PAYMENT_SHEET_NAME = "首付款支付承诺书"
2580
2575 # Jira-4562 - 银行流水首页提取关键词 2581 # Jira-4562 - 银行流水首页提取关键词
2576 INCOME_KEYWORDS_LIST = ["养老金", "社保", "代发工资", "工资入账", "奖金", "养老保险", "代发", "工资"] 2582 INCOME_KEYWORDS_LIST = ["养老金", "社保", "代发工资", "工资入账", "奖金", "养老保险", "代发", "工资"]
2577 INCOME_KEYWORDS_DICT = { 2583 INCOME_KEYWORDS_DICT = {
......
...@@ -1768,6 +1768,8 @@ class Command(BaseCommand, LoggerMixin): ...@@ -1768,6 +1768,8 @@ class Command(BaseCommand, LoggerMixin):
1768 financial_statement_dict = {} 1768 financial_statement_dict = {}
1769 # 添加财报情况说明的处理 1769 # 添加财报情况说明的处理
1770 financial_explanation_dict = {} 1770 financial_explanation_dict = {}
1771 # 添加首付款支付承诺书的处理
1772 down_payment_dict = {}
1771 res_list = [] 1773 res_list = []
1772 interest_keyword = Keywords.objects.filter( 1774 interest_keyword = Keywords.objects.filter(
1773 type=KeywordsType.INTEREST.value, on_off=True).values_list('keyword', flat=True) 1775 type=KeywordsType.INTEREST.value, on_off=True).values_list('keyword', flat=True)
...@@ -1835,6 +1837,31 @@ class Command(BaseCommand, LoggerMixin): ...@@ -1835,6 +1837,31 @@ class Command(BaseCommand, LoggerMixin):
1835 if "stamp" in ocr_data: 1837 if "stamp" in ocr_data:
1836 stamp = ocr_data.get("stamp", "") 1838 stamp = ocr_data.get("stamp", "")
1837 financial_explanation_dict["stamp"] = stamp 1839 financial_explanation_dict["stamp"] = stamp
1840 elif classify in consts.DOWN_PAYMENT_CLASSIFY_LIST:
1841 # 添加到 res_list 中
1842 res_list.append((pno, ino, part_idx, consts.RES_SUCCESS_DOWN_PAYMENT))
1843 # 1-金融机构名称
1844 financial_org_name = ocr_data.get("financial_org_name", "")
1845 down_payment_dict["financial_org_name"] = financial_org_name
1846 # 2-主借人姓名
1847 main_borrower_name = ocr_data.get("main_borrower_name", "")
1848 down_payment_dict["main_borrower_name"] = main_borrower_name
1849 # 3-主借人证件号码
1850 main_borrower_id_no = ocr_data.get("main_borrower_id_no", "")
1851 down_payment_dict["main_borrower_id_no"] = main_borrower_id_no
1852 # 4-申请编号
1853 apply_no = ocr_data.get("apply_no", "")
1854 down_payment_dict["apply_no"] = apply_no
1855 # 5-抵押/租赁合同名称
1856 contract_name = ocr_data.get("contract_name", "")
1857 down_payment_dict["contract_name"] = contract_name
1858 # 6-承诺人签字
1859 promisor_signature = ocr_data.get("promisor_signature", "")
1860 down_payment_dict["promisor_signature"] = promisor_signature
1861 # 7-承诺人签字日期
1862 promisor_signature_date = ocr_data.get("promisor_signature_date", "")
1863 down_payment_dict["promisor_signature_date"] = promisor_signature_date
1864
1838 elif classify in consts.OTHER_CLASSIFY_SET: # 其他类 1865 elif classify in consts.OTHER_CLASSIFY_SET: # 其他类
1839 res_list.append((pno, ino, part_idx, consts.RES_SUCCESS_OTHER)) 1866 res_list.append((pno, ino, part_idx, consts.RES_SUCCESS_OTHER))
1840 continue 1867 continue
...@@ -2021,7 +2048,7 @@ class Command(BaseCommand, LoggerMixin): ...@@ -2021,7 +2048,7 @@ class Command(BaseCommand, LoggerMixin):
2021 # src_excel_path = os.path.join(doc_data_path, 'src.xlsx') 2048 # src_excel_path = os.path.join(doc_data_path, 'src.xlsx')
2022 # wb.save(src_excel_path) 2049 # wb.save(src_excel_path)
2023 #need_follow表示在上传edms时文件名是否要添加"关注"两字 2050 #need_follow表示在上传edms时文件名是否要添加"关注"两字
2024 count_list, need_follow = wb.rebuild(merged_bs_summary, license_summary, res_list, doc.document_scheme, contract_result, doc.metadata, financial_statement_dict, financial_explanation_dict) 2051 count_list, need_follow = wb.rebuild(merged_bs_summary, license_summary, res_list, doc.document_scheme, contract_result, doc.metadata, financial_statement_dict, financial_explanation_dict, down_payment_dict)
2025 wb.save(excel_path) 2052 wb.save(excel_path)
2026 2053
2027 except Exception as e: 2054 except Exception as e:
...@@ -2130,10 +2157,10 @@ class Command(BaseCommand, LoggerMixin): ...@@ -2130,10 +2157,10 @@ class Command(BaseCommand, LoggerMixin):
2130 # 更新OCR累计识别结果表 2157 # 更新OCR累计识别结果表
2131 if business_type == consts.HIL_PREFIX: 2158 if business_type == consts.HIL_PREFIX:
2132 result_class = HILOCRResult if is_ca else HILSEOCRResult 2159 result_class = HILOCRResult if is_ca else HILSEOCRResult
2133 res_obj = atomicSaveDBHIL(self,result_class,doc,license_summary,ic_merge,rp_merge, task_str, financial_statement_dict, financial_explanation_dict) 2160 res_obj = atomicSaveDBHIL(self,result_class,doc,license_summary,ic_merge,rp_merge, task_str, financial_statement_dict, financial_explanation_dict, down_payment_dict)
2134 else: 2161 else:
2135 result_class = AFCOCRResult if is_ca else AFCSEOCRResult 2162 result_class = AFCOCRResult if is_ca else AFCSEOCRResult
2136 res_obj = atomicSaveDBAFC(self,result_class,doc,license_summary,ic_merge,rp_merge, task_str, financial_statement_dict, financial_explanation_dict) 2163 res_obj = atomicSaveDBAFC(self,result_class,doc,license_summary,ic_merge,rp_merge, task_str, financial_statement_dict, financial_explanation_dict, down_payment_dict)
2137 2164
2138 except Exception as e: 2165 except Exception as e:
2139 self.online_log.error( 2166 self.online_log.error(
...@@ -2172,10 +2199,10 @@ class Command(BaseCommand, LoggerMixin): ...@@ -2172,10 +2199,10 @@ class Command(BaseCommand, LoggerMixin):
2172 # 更新OCR累计识别结果表 2199 # 更新OCR累计识别结果表
2173 if business_type == consts.HIL_PREFIX: 2200 if business_type == consts.HIL_PREFIX:
2174 result_class = HILOCRResult if is_ca else HILSEOCRResult 2201 result_class = HILOCRResult if is_ca else HILSEOCRResult
2175 res_obj = atomicSaveDBHIL(self,result_class,doc,license_summary,ic_merge,rp_merge, task_str, financial_statement_dict, financial_explanation_dict) 2202 res_obj = atomicSaveDBHIL(self,result_class,doc,license_summary,ic_merge,rp_merge, task_str, financial_statement_dict, financial_explanation_dict, down_payment_dict)
2176 else: 2203 else:
2177 result_class = AFCOCRResult if is_ca else AFCSEOCRResult 2204 result_class = AFCOCRResult if is_ca else AFCSEOCRResult
2178 res_obj = atomicSaveDBAFC(self,result_class,doc,license_summary,ic_merge,rp_merge, task_str, financial_statement_dict, financial_explanation_dict) 2205 res_obj = atomicSaveDBAFC(self,result_class,doc,license_summary,ic_merge,rp_merge, task_str, financial_statement_dict, financial_explanation_dict, down_payment_dict)
2179 except Exception as e: 2206 except Exception as e:
2180 self.online_log.error( 2207 self.online_log.error(
2181 '{0} [process error (ocr result save)] [task={1}] [error={2}]'.format( 2208 '{0} [process error (ocr result save)] [task={1}] [error={2}]'.format(
...@@ -2527,7 +2554,7 @@ class Command(BaseCommand, LoggerMixin): ...@@ -2527,7 +2554,7 @@ class Command(BaseCommand, LoggerMixin):
2527 self.online_log.info('{0} [stop safely]'.format(self.log_base)) 2554 self.online_log.info('{0} [stop safely]'.format(self.log_base))
2528 2555
2529 @transaction.atomic 2556 @transaction.atomic
2530 def atomicSaveDBAFC(self,result_class,doc,license_summary,ic_merge,rp_merge,task_str, financial_statement_dict, financial_explanation_dict): 2557 def atomicSaveDBAFC(self,result_class,doc,license_summary,ic_merge,rp_merge,task_str, financial_statement_dict, financial_explanation_dict, down_payment_dict):
2531 with transaction.atomic('afc'): 2558 with transaction.atomic('afc'):
2532 res_obj = result_class.objects.using('afc').select_for_update().filter(application_id=doc.application_id).first() 2559 res_obj = result_class.objects.using('afc').select_for_update().filter(application_id=doc.application_id).first()
2533 self.online_log.info('{0} [sql lock AFC application_id={1} doc_id={2}]'.format(self.log_base, doc.application_id,doc.id)) 2560 self.online_log.info('{0} [sql lock AFC application_id={1} doc_id={2}]'.format(self.log_base, doc.application_id,doc.id))
...@@ -2543,6 +2570,10 @@ def atomicSaveDBAFC(self,result_class,doc,license_summary,ic_merge,rp_merge,task ...@@ -2543,6 +2570,10 @@ def atomicSaveDBAFC(self,result_class,doc,license_summary,ic_merge,rp_merge,task
2543 if res_obj is not None: 2570 if res_obj is not None:
2544 if financial_explanation_dict: 2571 if financial_explanation_dict:
2545 res_obj.fss_ocr = json.dumps([financial_explanation_dict]) 2572 res_obj.fss_ocr = json.dumps([financial_explanation_dict])
2573 # 首付款支付承诺书存入数据库
2574 if res_obj is not None:
2575 if down_payment_dict:
2576 res_obj.dp_ocr = json.dumps([down_payment_dict])
2546 for classify, field in consts.RESULT_MAPPING.items(): 2577 for classify, field in consts.RESULT_MAPPING.items():
2547 if not hasattr(res_obj, field): 2578 if not hasattr(res_obj, field):
2548 continue 2579 continue
...@@ -2568,7 +2599,7 @@ def atomicSaveDBAFC(self,result_class,doc,license_summary,ic_merge,rp_merge,task ...@@ -2568,7 +2599,7 @@ def atomicSaveDBAFC(self,result_class,doc,license_summary,ic_merge,rp_merge,task
2568 return res_obj 2599 return res_obj
2569 2600
2570 @transaction.atomic 2601 @transaction.atomic
2571 def atomicSaveDBHIL(self,result_class,doc,license_summary,ic_merge,rp_merge, task_str, financial_statement_dict, financial_explanation_dict): 2602 def atomicSaveDBHIL(self,result_class,doc,license_summary,ic_merge,rp_merge, task_str, financial_statement_dict, financial_explanation_dict, down_payment_dict):
2572 with transaction.atomic('default'): 2603 with transaction.atomic('default'):
2573 res_obj = result_class.objects.using('default').select_for_update().filter(application_id=doc.application_id).first() 2604 res_obj = result_class.objects.using('default').select_for_update().filter(application_id=doc.application_id).first()
2574 self.online_log.info('{0} [sql lock HIL application_id={1} doc_id={2}]'.format(self.log_base, doc.application_id,doc.id)) 2605 self.online_log.info('{0} [sql lock HIL application_id={1} doc_id={2}]'.format(self.log_base, doc.application_id,doc.id))
...@@ -2584,6 +2615,10 @@ def atomicSaveDBHIL(self,result_class,doc,license_summary,ic_merge,rp_merge, tas ...@@ -2584,6 +2615,10 @@ def atomicSaveDBHIL(self,result_class,doc,license_summary,ic_merge,rp_merge, tas
2584 if res_obj is not None: 2615 if res_obj is not None:
2585 if financial_explanation_dict: 2616 if financial_explanation_dict:
2586 res_obj.fss_ocr = json.dumps([financial_explanation_dict]) 2617 res_obj.fss_ocr = json.dumps([financial_explanation_dict])
2618 # 首付款支付承诺书存入数据库
2619 if res_obj is not None:
2620 if down_payment_dict:
2621 res_obj.dp_ocr = json.dumps([down_payment_dict])
2587 for classify, field in consts.RESULT_MAPPING.items(): 2622 for classify, field in consts.RESULT_MAPPING.items():
2588 if not hasattr(res_obj, field): 2623 if not hasattr(res_obj, field):
2589 continue 2624 continue
......
...@@ -338,6 +338,7 @@ class AFCOCRResult(models.Model): ...@@ -338,6 +338,7 @@ class AFCOCRResult(models.Model):
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="财务报表") 339 fs_ocr = models.TextField(null=True, verbose_name="财务报表")
340 fss_ocr = models.TextField(null=True, verbose_name="财务情况说明书") 340 fss_ocr = models.TextField(null=True, verbose_name="财务情况说明书")
341 dp_ocr = models.TextField(null=True, verbose_name="首付款支付承诺书")
341 342
342 343
343 update_time = models.DateTimeField(auto_now=True, verbose_name='修改时间') 344 update_time = models.DateTimeField(auto_now=True, verbose_name='修改时间')
...@@ -383,6 +384,7 @@ class HILOCRResult(models.Model): ...@@ -383,6 +384,7 @@ class HILOCRResult(models.Model):
383 fsm_activited = models.IntegerField(null=False, default=0, verbose_name="fsm激活状态 1:激活") 384 fsm_activited = models.IntegerField(null=False, default=0, verbose_name="fsm激活状态 1:激活")
384 fs_ocr = models.TextField(null=True, verbose_name="财务报表") 385 fs_ocr = models.TextField(null=True, verbose_name="财务报表")
385 fss_ocr = models.TextField(null=True, verbose_name="财务情况说明书") 386 fss_ocr = models.TextField(null=True, verbose_name="财务情况说明书")
387 dp_ocr = models.TextField(null=True, verbose_name="首付款支付承诺书")
386 388
387 update_time = models.DateTimeField(auto_now=True, verbose_name='修改时间') 389 update_time = models.DateTimeField(auto_now=True, verbose_name='修改时间')
388 create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') 390 create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
...@@ -426,6 +428,7 @@ class AFCSEOCRResult(models.Model): ...@@ -426,6 +428,7 @@ class AFCSEOCRResult(models.Model):
426 fsm_activited = models.IntegerField(null=False, default=0, verbose_name="fsm激活状态 1:激活") 428 fsm_activited = models.IntegerField(null=False, default=0, verbose_name="fsm激活状态 1:激活")
427 fs_ocr = models.TextField(null=True, verbose_name="财务报表") 429 fs_ocr = models.TextField(null=True, verbose_name="财务报表")
428 fss_ocr = models.TextField(null=True, verbose_name="财务情况说明书") 430 fss_ocr = models.TextField(null=True, verbose_name="财务情况说明书")
431 dp_ocr = models.TextField(null=True, verbose_name="首付款支付承诺书")
429 432
430 update_time = models.DateTimeField(auto_now=True, verbose_name='修改时间') 433 update_time = models.DateTimeField(auto_now=True, verbose_name='修改时间')
431 create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') 434 create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
...@@ -469,6 +472,7 @@ class HILSEOCRResult(models.Model): ...@@ -469,6 +472,7 @@ class HILSEOCRResult(models.Model):
469 fsm_activited = models.IntegerField(null=False, default=0, verbose_name="fsm激活状态 1:激活") 472 fsm_activited = models.IntegerField(null=False, default=0, verbose_name="fsm激活状态 1:激活")
470 fs_ocr = models.TextField(null=True, verbose_name="财务报表") 473 fs_ocr = models.TextField(null=True, verbose_name="财务报表")
471 fss_ocr = models.TextField(null=True, verbose_name="财务情况说明书") 474 fss_ocr = models.TextField(null=True, verbose_name="财务情况说明书")
475 dp_ocr = models.TextField(null=True, verbose_name="首付款支付承诺书")
472 476
473 update_time = models.DateTimeField(auto_now=True, verbose_name='修改时间') 477 update_time = models.DateTimeField(auto_now=True, verbose_name='修改时间')
474 create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') 478 create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
......
...@@ -874,6 +874,33 @@ class BSWorkbook(Workbook): ...@@ -874,6 +874,33 @@ class BSWorkbook(Workbook):
874 ws.append(row) 874 ws.append(row)
875 875
876 876
877 def down_payment_rebuild(self, down_payment_dict):
878 """
879 Desc:
880 重构首付款支付承诺书sheet
881 """
882 # 如果 down_payment_dict 为空, 则不创建sheet
883 if not down_payment_dict:
884 return
885 # 如果 down_payment_dict 不为空, 则创建sheet
886 ws = self.create_sheet(consts.DOWN_PAYMENT_SHEET_NAME)
887 english_chinese_dict = {
888 "financial_org_name": "渠道",
889 "main_borrower_name": "姓名",
890 "main_borrower_id_no": "证件号码",
891 "apply_no": "合同编号",
892 "contract_name": "合同名称",
893 "promisor_signature": "承诺人签字-电子",
894 "promisor_signature_date": "承诺人签字日期-电子"
895 }
896 for dp_key, dp_value in down_payment_dict.items():
897 if dp_key in english_chinese_dict.keys():
898 row = [english_chinese_dict[dp_key], str(dp_value)]
899 ws.append(row)
900 else:
901 row = [english_chinese_dict[dp_key], ""]
902 ws.append(row)
903
877 @staticmethod 904 @staticmethod
878 def remove_yuan(amount_key_set, key, src_str): 905 def remove_yuan(amount_key_set, key, src_str):
879 if key in amount_key_set and isinstance(src_str, str): 906 if key in amount_key_set and isinstance(src_str, str):
...@@ -973,7 +1000,7 @@ class BSWorkbook(Workbook): ...@@ -973,7 +1000,7 @@ class BSWorkbook(Workbook):
973 if len(self.sheetnames) > 1: 1000 if len(self.sheetnames) > 1:
974 self.remove(self.get_sheet_by_name('Sheet')) 1001 self.remove(self.get_sheet_by_name('Sheet'))
975 1002
976 def rebuild(self, bs_summary, license_summary, res_list, document_scheme, contract_result, metadata, financial_statement_dict, financial_explanation_dict): 1003 def rebuild(self, bs_summary, license_summary, res_list, document_scheme, contract_result, metadata, financial_statement_dict, financial_explanation_dict, down_payment_dict):
977 res_count_tuple = self.res_sheet(res_list) 1004 res_count_tuple = self.res_sheet(res_list)
978 1005
979 count_list = [(consts.MODEL_FIELD_BS, len(bs_summary))] 1006 count_list = [(consts.MODEL_FIELD_BS, len(bs_summary))]
...@@ -983,12 +1010,14 @@ class BSWorkbook(Workbook): ...@@ -983,12 +1010,14 @@ class BSWorkbook(Workbook):
983 self.bs_rebuild(bs_summary, res_count_tuple, metadata) 1010 self.bs_rebuild(bs_summary, res_count_tuple, metadata)
984 self.financial_rebuild(financial_statement_dict) 1011 self.financial_rebuild(financial_statement_dict)
985 self.financial_explanation_rebuild(financial_explanation_dict) 1012 self.financial_explanation_rebuild(financial_explanation_dict)
1013 self.down_payment_rebuild(down_payment_dict)
986 else: 1014 else:
987 self.bs_rebuild(bs_summary, res_count_tuple, metadata) 1015 self.bs_rebuild(bs_summary, res_count_tuple, metadata)
988 self.license_rebuild(license_summary, document_scheme, count_list) 1016 self.license_rebuild(license_summary, document_scheme, count_list)
989 self.contract_rebuild(contract_result, True) 1017 self.contract_rebuild(contract_result, True)
990 self.financial_rebuild(financial_statement_dict) 1018 self.financial_rebuild(financial_statement_dict)
991 self.financial_explanation_rebuild(financial_explanation_dict) 1019 self.financial_explanation_rebuild(financial_explanation_dict)
1020 self.down_payment_rebuild(down_payment_dict)
992 self.move_res_sheet() 1021 self.move_res_sheet()
993 self.remove_base_sheet() 1022 self.remove_base_sheet()
994 return count_list, self.need_follow 1023 return count_list, self.need_follow
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!