d2a1f3f2 by chenyao

添加财报情况说明的内容存储到数据库和生成到Excel中

1 parent efad9db2
...@@ -2538,4 +2538,9 @@ FSM_ACTIVITED_STATUS = { ...@@ -2538,4 +2538,9 @@ FSM_ACTIVITED_STATUS = {
2538 # 财务报表分类标签 2538 # 财务报表分类标签
2539 FINANCIAL_STATEMENT_CLASSIFY_LIST = [97, 98, 99] 2539 FINANCIAL_STATEMENT_CLASSIFY_LIST = [97, 98, 99]
2540 # 财务报表sheet名称 2540 # 财务报表sheet名称
2541 FINANCIAL_SHEET_NAME = "财务报表"
...\ No newline at end of file ...\ No newline at end of file
2541 FINANCIAL_SHEET_NAME = "财务报表"
2542
2543 # 财报情况说明分类标签
2544 FINANCIAL_EXPLANATION_CLASSIFY_LIST = [100]
2545 # 财报情况说明sheet名称
2546 FINANCIAL_EXPLANATION_SHEET_NAME = "财报情况说明"
...\ No newline at end of file ...\ No newline at end of file
......
...@@ -1726,6 +1726,8 @@ class Command(BaseCommand, LoggerMixin): ...@@ -1726,6 +1726,8 @@ class Command(BaseCommand, LoggerMixin):
1726 contract_result_compare = {} 1726 contract_result_compare = {}
1727 # 添加财报三个报表的处理 1727 # 添加财报三个报表的处理
1728 financial_statement_dict = {} 1728 financial_statement_dict = {}
1729 # 添加财报情况说明的处理
1730 financial_explanation_dict = {}
1729 res_list = [] 1731 res_list = []
1730 interest_keyword = Keywords.objects.filter( 1732 interest_keyword = Keywords.objects.filter(
1731 type=KeywordsType.INTEREST.value, on_off=True).values_list('keyword', flat=True) 1733 type=KeywordsType.INTEREST.value, on_off=True).values_list('keyword', flat=True)
...@@ -1778,6 +1780,21 @@ class Command(BaseCommand, LoggerMixin): ...@@ -1778,6 +1780,21 @@ class Command(BaseCommand, LoggerMixin):
1778 if "stamp" in ocr_data: 1780 if "stamp" in ocr_data:
1779 stamp = ocr_data.get("stamp", "") 1781 stamp = ocr_data.get("stamp", "")
1780 financial_statement_dict["stamp"][financial_statement_table_name] = stamp 1782 financial_statement_dict["stamp"][financial_statement_table_name] = stamp
1783 elif classify in consts.FINANCIAL_EXPLANATION_CLASSIFY_LIST:
1784 # 添加到 res_list 中
1785 res_list.append((pno, ino, part_idx, consts.RES_SUCCESS_FINANCIAL_STATEMENT))
1786 # 只要分类为财报情况说明的,就在 financial_explanation_dict 中添加对应的 title 和 stamp 两个dict
1787 if "title" not in financial_explanation_dict:
1788 financial_explanation_dict["title"] = {}
1789 if "stamp" not in financial_explanation_dict:
1790 financial_explanation_dict["stamp"] = {}
1791
1792 if "title" in ocr_data:
1793 title = ocr_data.get("title", "")
1794 financial_explanation_dict["title"] = title
1795 if "stamp" in ocr_data:
1796 stamp = ocr_data.get("stamp", "")
1797 financial_explanation_dict["stamp"] = stamp
1781 elif classify in consts.OTHER_CLASSIFY_SET: # 其他类 1798 elif classify in consts.OTHER_CLASSIFY_SET: # 其他类
1782 res_list.append((pno, ino, part_idx, consts.RES_SUCCESS_OTHER)) 1799 res_list.append((pno, ino, part_idx, consts.RES_SUCCESS_OTHER))
1783 continue 1800 continue
...@@ -1964,7 +1981,7 @@ class Command(BaseCommand, LoggerMixin): ...@@ -1964,7 +1981,7 @@ class Command(BaseCommand, LoggerMixin):
1964 # src_excel_path = os.path.join(doc_data_path, 'src.xlsx') 1981 # src_excel_path = os.path.join(doc_data_path, 'src.xlsx')
1965 # wb.save(src_excel_path) 1982 # wb.save(src_excel_path)
1966 #need_follow表示在上传edms时文件名是否要添加"关注"两字 1983 #need_follow表示在上传edms时文件名是否要添加"关注"两字
1967 count_list, need_follow = wb.rebuild(merged_bs_summary, license_summary, res_list, doc.document_scheme, contract_result, doc.metadata, financial_statement_dict) 1984 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)
1968 wb.save(excel_path) 1985 wb.save(excel_path)
1969 1986
1970 except Exception as e: 1987 except Exception as e:
...@@ -2073,10 +2090,10 @@ class Command(BaseCommand, LoggerMixin): ...@@ -2073,10 +2090,10 @@ class Command(BaseCommand, LoggerMixin):
2073 # 更新OCR累计识别结果表 2090 # 更新OCR累计识别结果表
2074 if business_type == consts.HIL_PREFIX: 2091 if business_type == consts.HIL_PREFIX:
2075 result_class = HILOCRResult if is_ca else HILSEOCRResult 2092 result_class = HILOCRResult if is_ca else HILSEOCRResult
2076 res_obj = atomicSaveDBHIL(self,result_class,doc,license_summary,ic_merge,rp_merge, task_str, financial_statement_dict) 2093 res_obj = atomicSaveDBHIL(self,result_class,doc,license_summary,ic_merge,rp_merge, task_str, financial_statement_dict, financial_explanation_dict)
2077 else: 2094 else:
2078 result_class = AFCOCRResult if is_ca else AFCSEOCRResult 2095 result_class = AFCOCRResult if is_ca else AFCSEOCRResult
2079 res_obj = atomicSaveDBAFC(self,result_class,doc,license_summary,ic_merge,rp_merge, task_str, financial_statement_dict) 2096 res_obj = atomicSaveDBAFC(self,result_class,doc,license_summary,ic_merge,rp_merge, task_str, financial_statement_dict, financial_explanation_dict)
2080 2097
2081 except Exception as e: 2098 except Exception as e:
2082 self.online_log.error( 2099 self.online_log.error(
...@@ -2115,10 +2132,10 @@ class Command(BaseCommand, LoggerMixin): ...@@ -2115,10 +2132,10 @@ class Command(BaseCommand, LoggerMixin):
2115 # 更新OCR累计识别结果表 2132 # 更新OCR累计识别结果表
2116 if business_type == consts.HIL_PREFIX: 2133 if business_type == consts.HIL_PREFIX:
2117 result_class = HILOCRResult if is_ca else HILSEOCRResult 2134 result_class = HILOCRResult if is_ca else HILSEOCRResult
2118 res_obj = atomicSaveDBHIL(self,result_class,doc,license_summary,ic_merge,rp_merge, task_str, financial_statement_dict) 2135 res_obj = atomicSaveDBHIL(self,result_class,doc,license_summary,ic_merge,rp_merge, task_str, financial_statement_dict, financial_explanation_dict)
2119 else: 2136 else:
2120 result_class = AFCOCRResult if is_ca else AFCSEOCRResult 2137 result_class = AFCOCRResult if is_ca else AFCSEOCRResult
2121 res_obj = atomicSaveDBAFC(self,result_class,doc,license_summary,ic_merge,rp_merge, task_str, financial_statement_dict) 2138 res_obj = atomicSaveDBAFC(self,result_class,doc,license_summary,ic_merge,rp_merge, task_str, financial_statement_dict, financial_explanation_dict)
2122 except Exception as e: 2139 except Exception as e:
2123 self.online_log.error( 2140 self.online_log.error(
2124 '{0} [process error (ocr result save)] [task={1}] [error={2}]'.format( 2141 '{0} [process error (ocr result save)] [task={1}] [error={2}]'.format(
...@@ -2469,7 +2486,7 @@ class Command(BaseCommand, LoggerMixin): ...@@ -2469,7 +2486,7 @@ class Command(BaseCommand, LoggerMixin):
2469 self.online_log.info('{0} [stop safely]'.format(self.log_base)) 2486 self.online_log.info('{0} [stop safely]'.format(self.log_base))
2470 2487
2471 @transaction.atomic 2488 @transaction.atomic
2472 def atomicSaveDBAFC(self,result_class,doc,license_summary,ic_merge,rp_merge,task_str, financial_statement_dict): 2489 def atomicSaveDBAFC(self,result_class,doc,license_summary,ic_merge,rp_merge,task_str, financial_statement_dict, financial_explanation_dict):
2473 with transaction.atomic('afc'): 2490 with transaction.atomic('afc'):
2474 res_obj = result_class.objects.using('afc').select_for_update().filter(application_id=doc.application_id).first() 2491 res_obj = result_class.objects.using('afc').select_for_update().filter(application_id=doc.application_id).first()
2475 self.online_log.info('{0} [sql lock AFC application_id={1} doc_id={2}]'.format(self.log_base, doc.application_id,doc.id)) 2492 self.online_log.info('{0} [sql lock AFC application_id={1} doc_id={2}]'.format(self.log_base, doc.application_id,doc.id))
...@@ -2477,9 +2494,14 @@ def atomicSaveDBAFC(self,result_class,doc,license_summary,ic_merge,rp_merge,task ...@@ -2477,9 +2494,14 @@ def atomicSaveDBAFC(self,result_class,doc,license_summary,ic_merge,rp_merge,task
2477 res_obj = result_class() 2494 res_obj = result_class()
2478 res_obj.application_id = doc.application_id 2495 res_obj.application_id = doc.application_id
2479 self.online_log.info('{0} [res_obj is None application_id={1} doc_id={2}]'.format(self.log_base, doc.application_id,doc.id)) 2496 self.online_log.info('{0} [res_obj is None application_id={1} doc_id={2}]'.format(self.log_base, doc.application_id,doc.id))
2497 # 财务报表存入数据库
2480 if res_obj is not None: 2498 if res_obj is not None:
2481 if financial_statement_dict: 2499 if financial_statement_dict:
2482 res_obj.fs_ocr = json.dumps([financial_statement_dict]) 2500 res_obj.fs_ocr = json.dumps([financial_statement_dict])
2501 # 财报情况说明存入数据库
2502 if res_obj is not None:
2503 if financial_explanation_dict:
2504 res_obj.fss_ocr = json.dumps([financial_explanation_dict])
2483 for classify, field in consts.RESULT_MAPPING.items(): 2505 for classify, field in consts.RESULT_MAPPING.items():
2484 if not hasattr(res_obj, field): 2506 if not hasattr(res_obj, field):
2485 continue 2507 continue
...@@ -2505,7 +2527,7 @@ def atomicSaveDBAFC(self,result_class,doc,license_summary,ic_merge,rp_merge,task ...@@ -2505,7 +2527,7 @@ def atomicSaveDBAFC(self,result_class,doc,license_summary,ic_merge,rp_merge,task
2505 return res_obj 2527 return res_obj
2506 2528
2507 @transaction.atomic 2529 @transaction.atomic
2508 def atomicSaveDBHIL(self,result_class,doc,license_summary,ic_merge,rp_merge, task_str, financial_statement_dict): 2530 def atomicSaveDBHIL(self,result_class,doc,license_summary,ic_merge,rp_merge, task_str, financial_statement_dict, financial_explanation_dict):
2509 with transaction.atomic('default'): 2531 with transaction.atomic('default'):
2510 res_obj = result_class.objects.using('default').select_for_update().filter(application_id=doc.application_id).first() 2532 res_obj = result_class.objects.using('default').select_for_update().filter(application_id=doc.application_id).first()
2511 self.online_log.info('{0} [sql lock HIL application_id={1} doc_id={2}]'.format(self.log_base, doc.application_id,doc.id)) 2533 self.online_log.info('{0} [sql lock HIL application_id={1} doc_id={2}]'.format(self.log_base, doc.application_id,doc.id))
...@@ -2513,9 +2535,14 @@ def atomicSaveDBHIL(self,result_class,doc,license_summary,ic_merge,rp_merge, tas ...@@ -2513,9 +2535,14 @@ def atomicSaveDBHIL(self,result_class,doc,license_summary,ic_merge,rp_merge, tas
2513 res_obj = result_class() 2535 res_obj = result_class()
2514 res_obj.application_id = doc.application_id 2536 res_obj.application_id = doc.application_id
2515 self.online_log.info('{0} [res_obj is None application_id={1} doc_id={2}]'.format(self.log_base, doc.application_id,doc.id)) 2537 self.online_log.info('{0} [res_obj is None application_id={1} doc_id={2}]'.format(self.log_base, doc.application_id,doc.id))
2538 # 财务报表三个表存入数据库
2516 if res_obj is not None: 2539 if res_obj is not None:
2517 if financial_statement_dict: 2540 if financial_statement_dict:
2518 res_obj.fs_ocr = json.dumps([financial_statement_dict]) 2541 res_obj.fs_ocr = json.dumps([financial_statement_dict])
2542 # 财报情况说明存入数据库
2543 if res_obj is not None:
2544 if financial_explanation_dict:
2545 res_obj.fss_ocr = json.dumps([financial_explanation_dict])
2519 for classify, field in consts.RESULT_MAPPING.items(): 2546 for classify, field in consts.RESULT_MAPPING.items():
2520 if not hasattr(res_obj, field): 2547 if not hasattr(res_obj, field):
2521 continue 2548 continue
......
...@@ -853,6 +853,27 @@ class BSWorkbook(Workbook): ...@@ -853,6 +853,27 @@ class BSWorkbook(Workbook):
853 ws.append(row) 853 ws.append(row)
854 854
855 855
856 def financial_explanation_rebuild(self, financial_explanation_dict):
857 """
858 Desc:
859 重构财报情况说明sheet
860 """
861 # 如果 financial_explanation_dict 为空,则不创建sheet
862 if not financial_explanation_dict:
863 return
864 # 如果 financial_explanation_dict 不为空, 则创建sheet
865 ws = self.create_sheet(consts.FINANCIAL_EXPLANATION_SHEET_NAME)
866 for fin_key, fin_value in financial_explanation_dict.items():
867 table_str = "公司名称"
868 if fin_key == "title":
869 table_str = "公司名称"
870 elif fin_key == "stamp":
871 table_str = "印章"
872
873 row = ["财报情况说明" + table_str, str(fin_value)]
874 ws.append(row)
875
876
856 @staticmethod 877 @staticmethod
857 def remove_yuan(amount_key_set, key, src_str): 878 def remove_yuan(amount_key_set, key, src_str):
858 if key in amount_key_set and isinstance(src_str, str): 879 if key in amount_key_set and isinstance(src_str, str):
...@@ -952,7 +973,7 @@ class BSWorkbook(Workbook): ...@@ -952,7 +973,7 @@ class BSWorkbook(Workbook):
952 if len(self.sheetnames) > 1: 973 if len(self.sheetnames) > 1:
953 self.remove(self.get_sheet_by_name('Sheet')) 974 self.remove(self.get_sheet_by_name('Sheet'))
954 975
955 def rebuild(self, bs_summary, license_summary, res_list, document_scheme, contract_result, metadata, financial_statement_dict): 976 def rebuild(self, bs_summary, license_summary, res_list, document_scheme, contract_result, metadata, financial_statement_dict, financial_explanation_dict):
956 res_count_tuple = self.res_sheet(res_list) 977 res_count_tuple = self.res_sheet(res_list)
957 978
958 count_list = [(consts.MODEL_FIELD_BS, len(bs_summary))] 979 count_list = [(consts.MODEL_FIELD_BS, len(bs_summary))]
...@@ -961,11 +982,13 @@ class BSWorkbook(Workbook): ...@@ -961,11 +982,13 @@ class BSWorkbook(Workbook):
961 self.contract_rebuild(contract_result) 982 self.contract_rebuild(contract_result)
962 self.bs_rebuild(bs_summary, res_count_tuple, metadata) 983 self.bs_rebuild(bs_summary, res_count_tuple, metadata)
963 self.financial_rebuild(financial_statement_dict) 984 self.financial_rebuild(financial_statement_dict)
985 self.financial_explanation_rebuild(financial_explanation_dict)
964 else: 986 else:
965 self.bs_rebuild(bs_summary, res_count_tuple, metadata) 987 self.bs_rebuild(bs_summary, res_count_tuple, metadata)
966 self.license_rebuild(license_summary, document_scheme, count_list) 988 self.license_rebuild(license_summary, document_scheme, count_list)
967 self.contract_rebuild(contract_result, True) 989 self.contract_rebuild(contract_result, True)
968 self.financial_rebuild(financial_statement_dict) 990 self.financial_rebuild(financial_statement_dict)
991 self.financial_explanation_rebuild(financial_explanation_dict)
969 self.move_res_sheet() 992 self.move_res_sheet()
970 self.remove_base_sheet() 993 self.remove_base_sheet()
971 return count_list, self.need_follow 994 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!