company_court_open_announcement.py 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. # -*- coding: utf-8 -*-
  2. # @Time : 2023/7/20 16:27
  3. # @Author : XuJiakai
  4. # @File : company_court_open_announcement
  5. # @Software: PyCharm
  6. import os
  7. from data_clean.api.hbase_api import bulk_get
  8. from data_clean.api.mongo_api import insert_one
  9. from data_clean.dim_handle_registry import get_dim_handle
  10. from data_clean.env.const import mongo_table_prefix
  11. from data_clean.exception.ruler_validation_exception import RulerValidationException
  12. from data_clean.utils.base_utils import *
  13. from data_clean.utils.case_utils import case_no_year_datetime
  14. from data_clean.utils.case_utils import get_case_party
  15. from data_clean.utils.date_utils import str_2_date_time, get_update_time, establish_state_time
  16. from data_clean.utils.party_name_verify_utils import person_name_list_verify, remove_null_party
  17. from data_clean.utils.str_utils import json_str_2_list
  18. # 必须命名为dim_handle
  19. dim_handle = get_dim_handle(os.path.basename(__file__))
  20. @dim_handle.registry_prefix_func
  21. async def prefix_func(dim_data: list):
  22. for row_data in dim_data:
  23. row_data['plaintiff_info'] = remove_null_party(row_data['plaintiff_info'])
  24. row_data['defendant_info'] = remove_null_party(row_data['defendant_info'])
  25. row_data['litigant_info'] = remove_null_party(row_data['litigant_info'])
  26. pass
  27. @dim_handle.registry_postfix_func()
  28. async def post_func(dim_data: list):
  29. # print("后置程序:", dim_data)
  30. for r in dim_data:
  31. r['update_time'] = get_update_time()
  32. pass
  33. pass
  34. @dim_handle.registry_row_func
  35. async def party_intersect(row_data: dict) -> dict:
  36. # 判断当事人有交叉
  37. if 'case_no' in row_data:
  38. case_no = row_data['case_no']
  39. if case_no and '破' in case_no:
  40. # 破产案件,允许当事人有交叉。即债务人审请自己破产
  41. return row_data
  42. plaintiff_info = json_str_2_list(row_data['plaintiff_info'], "name")
  43. defendant_info = json_str_2_list(row_data['defendant_info'], "name")
  44. inter = list(set(plaintiff_info).intersection(set(defendant_info)))
  45. if len(inter) == 0:
  46. return row_data
  47. else:
  48. raise RulerValidationException("ccoa_001", "当事人有交叉:%s" % inter)
  49. pass
  50. async def _get_max_establish_date(company_ids: list):
  51. company_ids = [i for i in company_ids if i]
  52. res = await bulk_get('ng_rt_company', company_ids)
  53. res = [str_2_date_time(i['ESTIBLISH_TIME']) for i in res if 'ESTIBLISH_TIME' in i and i['ESTIBLISH_TIME']]
  54. if not res:
  55. return None
  56. return max(res)
  57. pass
  58. # 开庭时间相关过滤
  59. @dim_handle.registry_row_func
  60. async def open_ann_date(row_data: dict) -> dict:
  61. import datetime
  62. now = datetime.datetime.now()
  63. delta = datetime.timedelta(days=730) # 两年后
  64. max_date = now + delta
  65. start_date = get_or_none(row_data, 'start_date')
  66. case_no = get_or_none(row_data, 'case_no')
  67. if case_no is None and start_date is None:
  68. raise RulerValidationException("ccoa_007", "案号和开庭时间均为空")
  69. if start_date is None:
  70. return row_data
  71. try:
  72. this_date = str_2_date_time(row_data['start_date'])
  73. if this_date < establish_state_time:
  74. raise RulerValidationException("ccoa_002", "开庭时间早于建国时间:%s" % row_data['start_date'])
  75. if this_date > max_date:
  76. raise RulerValidationException("ccoa_006", "开庭时间在两年后:%s" % row_data['start_date'])
  77. part_keyno = json_str_2_list(row_data['plaintiff_info'], 'litigant_id') + json_str_2_list(
  78. row_data['defendant_info'], 'litigant_id')
  79. part_keyno = [i for i in part_keyno if i and len(i) == 32]
  80. max_establish_date = await _get_max_establish_date(part_keyno)
  81. if max_establish_date and this_date < max_establish_date:
  82. raise RulerValidationException("ccoa_004", "开庭时有公司未成立,最晚一个公司成立日期:%s,开庭时间:%s" % (
  83. max_establish_date, row_data['start_date']))
  84. case_no_year_dt = case_no_year_datetime(case_no)
  85. if case_no_year_dt and this_date < case_no_year_dt:
  86. raise RulerValidationException("ccoa_005", "案号大于开庭时间年份,案号:%s,开庭时间:%s" % (
  87. case_no, row_data['start_date']))
  88. except RulerValidationException as ex:
  89. if case_no is None:
  90. raise ex
  91. await insert_one(mongo_table_prefix + 'info_cooa_start_date_set_none', {
  92. "content": {
  93. "data": {
  94. "company_court_open_announcement": [row_data]
  95. },
  96. }
  97. })
  98. row_data['start_date'] = None
  99. pass
  100. return row_data
  101. pass
  102. @dim_handle.registry_row_func
  103. async def party_unknown(row_data: dict) -> dict:
  104. # 过滤当事人名字异常,Z某某、xxx
  105. plaintiff_info = json_str_2_list(row_data['plaintiff_info'], "name")
  106. defendant_info = json_str_2_list(row_data['defendant_info'], "name")
  107. li = plaintiff_info + defendant_info
  108. flag, error_name = person_name_list_verify(li)
  109. if not flag:
  110. result = await get_case_party(row_data['case_no'], source='open_court')
  111. if result:
  112. rowkey = row_data['rowkey'] if 'rowkey' in row_data else None
  113. tmp_plaintiff_info = remove_null_party(result['plaintiff_info'])
  114. tmp_defendant_info = remove_null_party(result['defendant_info'])
  115. tmp_litigant_info = remove_null_party(result['litigant_info'])
  116. tmp_plaintiff = result['plaintiff']
  117. tmp_defendant = result['defendant']
  118. tmp_litigant = result['litigant']
  119. await insert_one(mongo_table_prefix + 'info_cooa_party_set_value', {
  120. "rowkey": rowkey,
  121. "org_party": {
  122. 'plaintiff_info': row_data['plaintiff_info'],
  123. 'defendant_info': row_data['defendant_info'],
  124. 'litigant_info': row_data['litigant_info'],
  125. 'plaintiff': row_data['plaintiff'],
  126. 'defendant': row_data['defendant'],
  127. 'litigant': row_data['litigant'],
  128. },
  129. "new_party": {
  130. 'plaintiff_info': tmp_plaintiff_info,
  131. 'defendant_info': tmp_defendant_info,
  132. 'litigant_info': tmp_litigant_info,
  133. 'plaintiff': tmp_plaintiff,
  134. 'defendant': tmp_defendant,
  135. 'litigant': tmp_litigant,
  136. }
  137. })
  138. row_data['plaintiff_info'] = tmp_plaintiff_info
  139. row_data['defendant_info'] = tmp_defendant_info
  140. row_data['litigant_info'] = tmp_litigant_info
  141. row_data['plaintiff'] = tmp_plaintiff
  142. row_data['defendant'] = tmp_defendant
  143. row_data['litigant'] = tmp_litigant
  144. pass
  145. else:
  146. raise RulerValidationException("ccoa_003", "人名不符合规范:%s" % error_name)
  147. pass
  148. return row_data
  149. async def test():
  150. res = await _get_max_establish_date(
  151. ['b13955ebaa99b06456803041e73c3888', ])
  152. print(res)
  153. pass
  154. if __name__ == '__main__':
  155. row_data = {"rowkey": "a"}
  156. rowkey = row_data['rowkey'] if 'rowkey' in row_data else None
  157. print(rowkey)
  158. # import asyncio
  159. # asyncio.run(test())
  160. pass