busi_instance.py 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. # -*- coding: utf-8 -*-
  2. # @Author: privacy
  3. # @Date: 2024-08-30 11:17:21
  4. # @Last Modified by: privacy
  5. # @Last Modified time: 2024-09-26 14:32:39
  6. """
  7. 商务部分
  8. """
  9. import re
  10. from typing import List, Optional
  11. from celery_tasks.LLMAgent import get_proj
  12. from celery_tasks.project_loc import extract_project
  13. from celery_tasks.text_extractor import similar_match
  14. from celery_tasks.extract_financial_report import extract_financial_report
  15. def get_score(comment: str, standard: str):
  16. if re.findall(r'A~D|A~D|A、B、C', standard):
  17. try:
  18. return re.findall('([A-D])级', comment).pop()
  19. except Exception:
  20. return 'B'
  21. elif re.findall(r'\d+\s?分', standard):
  22. try:
  23. return re.findall(r'(\d+)\s?分', comment).pop()
  24. except Exception:
  25. return "60"
  26. def busi_loc(scrutinize_dict: dict, outline_dict: List[dict], title_list: List[dict], table_list: List[dict], image_list: List[dict], supplier: str, project: str = None, file_name: str = None) -> Optional[List[dict]]:
  27. """
  28. 投标商务部分定位
  29. Args:
  30. scrutinize_dict: 详细评审
  31. tender_file: 投标文件
  32. Returns:
  33. result: 商务部分详审结果
  34. """
  35. part = None
  36. # 从详审大纲中获取商务评分方法
  37. for key in scrutinize_dict.keys():
  38. if '商务' in key:
  39. part = key
  40. break
  41. # 没有找到商务评审方法则直接返回
  42. if not part:
  43. return None
  44. result = {
  45. 'scoringCriteria': []
  46. }
  47. for item in scrutinize_dict[key]:
  48. if '信用' in item['评分因素']:
  49. result['scoringCriteria'].append({
  50. 'scoringFactors': item['评分因素'],
  51. 'scoringStandard': item['评分标准'],
  52. 'percentage': item['权重'],
  53. 'suppliers': [{
  54. 'name': supplier,
  55. 'grade': get_score(comment="B级(70分)", standard=item['评分标准']),
  56. 'pages': []
  57. }]
  58. })
  59. elif '业绩' in item['评分因素']:
  60. # 项目业绩表查询
  61. proj_list = extract_project(table_list, instances=['合同金额', '合同价格', '发包人名称', '项目规模', '合同时间'])
  62. # 定位信息格式化
  63. title_sims = [{'fileName': file_name, 'pageKey': '', 'pageStart': str(proj['page_numbers'][-1]), 'pageEnd': str(proj['page_numbers'][-1])} for proj in proj_list]
  64. # # 打分
  65. comment = get_proj(input_json=proj_list, standard=item['评分标准'])
  66. # 结果回传
  67. result['scoringCriteria'].append({
  68. 'scoringFactors': item['评分因素'],
  69. 'scoringStandard': item['评分标准'],
  70. 'percentage': item['权重'],
  71. 'suppliers': [{
  72. 'name': supplier,
  73. 'grade': get_score(comment=comment, standard=item['评分标准']),
  74. 'pages': title_sims
  75. }]
  76. })
  77. elif '财务' in item['评分因素']:
  78. financial_list = extract_financial_report(
  79. title_list=title_list,
  80. table_list=table_list,
  81. image_list=image_list,
  82. year=2022
  83. )
  84. title_sims = []
  85. starts = []
  86. for _ in financial_list:
  87. for page in _['pages']:
  88. starts.append(page[0])
  89. for page in set(starts):
  90. title_sims.append({
  91. "fileName": file_name,
  92. "pageKey": "",
  93. "pageEnd": page,
  94. "pageStart": page,
  95. })
  96. result['scoringCriteria'].append({
  97. 'scoringFactors': item['评分因素'],
  98. 'scoringStandard': item['评分标准'],
  99. 'percentage': item['权重'],
  100. 'suppliers': [{
  101. 'name': supplier,
  102. 'grade': 'B',
  103. 'supplier': '3个关键的财务指标',
  104. 'pages': title_sims
  105. }]
  106. })
  107. elif '报价' in item['评分因素']:
  108. result['scoringCriteria'].append({
  109. 'scoringFactors': item['评分因素'],
  110. 'scoringStandard': item['评分标准'],
  111. 'percentage': item['权重'],
  112. 'suppliers': [{
  113. 'name': supplier,
  114. 'grade': 'B',
  115. 'pages': []
  116. }]
  117. })
  118. elif '完整性' in item['评分因素']:
  119. result['scoringCriteria'].append({
  120. 'scoringFactors': item['评分因素'],
  121. 'scoringStandard': item['评分标准'],
  122. 'percentage': item['权重'],
  123. 'suppliers': [{
  124. 'name': supplier,
  125. 'grade': 'B',
  126. 'pages': []
  127. }]
  128. })
  129. elif '涉密' in item['评分因素']:
  130. result['scoringCriteria'].append({
  131. 'scoringFactors': item['评分因素'],
  132. 'scoringStandard': item['评分标准'],
  133. 'percentage': item['权重'],
  134. 'suppliers': [{
  135. 'name': supplier,
  136. 'grade': get_score(comment="A级(100分)", standard=item['评分标准']),
  137. 'pages': []
  138. }]
  139. })
  140. else:
  141. title_sims = similar_match(outline_dict, [item['评分因素']], key='title')
  142. pages = [{'fileName': file_name, 'pageStart': str(sim['page_number']), 'pageEnd': str(sim['page_number']), 'pageKey': '', 'text': sim['title'], 'score': sim['相似度']} for sim in title_sims]
  143. result['scoringCriteria'].append({
  144. 'scoringFactors': item['评分因素'],
  145. 'scoringStandard': item['评分标准'],
  146. 'percentage': item['权重'],
  147. 'suppliers': [{
  148. 'name': supplier,
  149. 'grade': get_score(comment="B级(70分)", standard=item['评分标准']),
  150. 'pages': pages,
  151. }]
  152. })
  153. return result
  154. if __name__ == '__main__':
  155. import os
  156. import json
  157. from glob import glob
  158. from pprint import pprint
  159. with open('bidding_dataset.json', 'r', encoding='utf-8') as fp:
  160. scrutinizes = json.load(fp)
  161. for project in scrutinizes.keys():
  162. scrutinize_dict = scrutinizes[project]
  163. for file in glob(f'./data/0预审查初审详审测试数据/{project}/*/*-outline.json'):
  164. with open(file, 'r', encoding='utf-8') as fp:
  165. outline_dict = json.load(fp)
  166. if outline_dict == []:
  167. os.remove(file)
  168. continue
  169. with open(file.replace('outline.json', 'title.json'), 'r', encoding='utf-8') as fp:
  170. title_list = json.load(fp)
  171. with open(file.replace('outline.json', 'table.json'), 'r', encoding='utf-8') as fp:
  172. table_list = json.load(fp)
  173. with open(file.replace('outline.json', 'image.json'), 'r', encoding='utf-8') as fp:
  174. image_list = json.load(fp)
  175. supplier = file.split('\\')[-2]
  176. pprint(
  177. busi_loc(
  178. scrutinize_dict=scrutinize_dict,
  179. outline_dict=outline_dict,
  180. title_list=title_list,
  181. table_list=table_list,
  182. image_list=image_list,
  183. supplier=supplier,
  184. project=project,
  185. file_name=file
  186. )
  187. )
  188. exit(0)