123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239 |
- # -*- coding: utf-8 -*-
- # @Author: privacy
- # @Date: 2024-08-30 11:17:21
- # @Last Modified by: privacy
- # @Last Modified time: 2024-12-04 11:17:17
- """
- 商务部分
- """
- import re
- from typing import List, Optional
- from celery_tasks.LLMAgent import get_proj
- from celery_tasks.project_loc import extract_project
- from celery_tasks.text_extractor import similar_match
- from celery_tasks.extract_financial_report import extract_financial_report
- def get_score(comment: str, standard: str):
- if re.findall(r'A~D|A~D|A、B、C', standard):
- try:
- return re.findall('([A-D])级', comment).pop()
- except Exception:
- return 'B'
- elif re.findall(r'\d+\s?分', standard):
- try:
- return re.findall(r'(\d+)\s?分', comment).pop()
- except Exception:
- return "60"
- 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]]:
- """
- 投标商务部分定位
- Args:
- scrutinize_dict: 详细评审
- tender_file: 投标文件
- Returns:
- result: 商务部分详审结果
- """
- part = None
- # 从详审大纲中获取商务评分方法
- for key in scrutinize_dict.keys():
- if '商务' in key:
- part = key
- break
- # 没有找到商务评审方法则直接返回
- if not part:
- return None
- result = {
- 'writeName': '',
- 'scoringCriteria': []
- }
- for item in scrutinize_dict[key]:
- if '信用' in item['评分因素']:
- result['scoringCriteria'].append({
- 'scoringFactors': item['评分因素'],
- 'scoringStandard': item['评分标准'],
- 'percentage': item['权重'],
- 'expertAdvice': '',
- 'writeName': '',
- 'suppliers': [{
- 'expertAdvice': '',
- 'writeName': '',
- 'name': supplier,
- 'grade': get_score(comment="B级(70分)", standard=item['评分标准']),
- 'pages': []
- }]
- })
- elif '业绩' in item['评分因素']:
- # 项目业绩表查询
- proj_list = extract_project(table_list, instances=['合同金额', '合同价格', '发包人名称', '项目规模', '合同时间'])
- # 定位信息格式化
- title_sims = [{'fileName': file_name, 'conformFlag': 1, 'pageKey': '', 'pageStart': str(proj['page_numbers'][-1]), 'pageEnd': str(proj['page_numbers'][-1])} for proj in proj_list]
- # # 打分
- comment = get_proj(input_json=proj_list, standard=item['评分标准'])
- # 结果回传
- result['scoringCriteria'].append({
- 'scoringFactors': item['评分因素'],
- 'scoringStandard': item['评分标准'],
- 'percentage': item['权重'],
- 'expertAdvice': '',
- 'writeName': '',
- 'suppliers': [{
- 'expertAdvice': '',
- 'writeName': '',
- 'name': supplier,
- 'grade': get_score(comment=comment, standard=item['评分标准']),
- 'pages': title_sims
- }]
- })
- elif '财务' in item['评分因素']:
- financial_list = extract_financial_report(
- title_list=title_list,
- table_list=table_list,
- image_list=image_list,
- year=2022
- )
- title_sims = []
- starts = []
- for _ in financial_list:
- for page in _['pages']:
- starts.append(page[0])
- for page in set(starts):
- title_sims.append({
- "fileName": file_name,
- "conformFlag": 1,
- "pageKey": "",
- "pageEnd": page,
- "pageStart": page,
- })
- result['scoringCriteria'].append({
- 'scoringFactors': item['评分因素'],
- 'scoringStandard': item['评分标准'],
- 'percentage': item['权重'],
- 'expertAdvice': '',
- 'writeName': '',
- 'suppliers': [{
- 'expertAdvice': '',
- 'writeName': '',
- 'name': supplier,
- 'grade': 'B',
- 'supplier': '3个关键的财务指标',
- 'pages': title_sims
- }]
- })
- elif '报价' in item['评分因素']:
- result['scoringCriteria'].append({
- 'scoringFactors': item['评分因素'],
- 'scoringStandard': item['评分标准'],
- 'percentage': item['权重'],
- 'expertAdvice': '',
- 'writeName': '',
- 'suppliers': [{
- 'expertAdvice': '',
- 'writeName': '',
- 'name': supplier,
- 'grade': 'B',
- 'pages': []
- }]
- })
- elif '完整性' in item['评分因素']:
- result['scoringCriteria'].append({
- 'scoringFactors': item['评分因素'],
- 'scoringStandard': item['评分标准'],
- 'percentage': item['权重'],
- 'expertAdvice': '',
- 'writeName': '',
- 'suppliers': [{
- 'expertAdvice': '',
- 'writeName': '',
- 'name': supplier,
- 'grade': 'B',
- 'pages': []
- }]
- })
- elif '涉密' in item['评分因素']:
- result['scoringCriteria'].append({
- 'scoringFactors': item['评分因素'],
- 'scoringStandard': item['评分标准'],
- 'percentage': item['权重'],
- 'expertAdvice': '',
- 'writeName': '',
- 'suppliers': [{
- 'expertAdvice': '',
- 'writeName': '',
- 'name': supplier,
- 'grade': get_score(comment="A级(100分)", standard=item['评分标准']),
- 'pages': []
- }]
- })
- else:
- title_sims = similar_match(outline_dict, [item['评分因素']], key='title')
- pages = [{'fileName': file_name, 'conformFlag': 1, 'pageStart': str(sim['page_number']), 'pageEnd': str(sim['page_number']), 'pageKey': '', 'text': sim['title'], 'score': sim['相似度']} for sim in title_sims]
- result['scoringCriteria'].append({
- 'scoringFactors': item['评分因素'],
- 'scoringStandard': item['评分标准'],
- 'percentage': item['权重'],
- 'expertAdvice': '',
- 'writeName': '',
- 'suppliers': [{
- 'expertAdvice': '',
- 'writeName': '',
- 'name': supplier,
- 'grade': get_score(comment="B级(70分)", standard=item['评分标准']),
- 'pages': pages,
- }]
- })
- return result
- if __name__ == '__main__':
- import os
- import json
- from glob import glob
- from pprint import pprint
- with open('bidding_dataset.json', 'r', encoding='utf-8') as fp:
- scrutinizes = json.load(fp)
- for project in scrutinizes.keys():
- scrutinize_dict = scrutinizes[project]
- for file in glob(f'./data/0预审查初审详审测试数据/{project}/*/*-outline.json'):
- with open(file, 'r', encoding='utf-8') as fp:
- outline_dict = json.load(fp)
- if outline_dict == []:
- os.remove(file)
- continue
- with open(file.replace('outline.json', 'title.json'), 'r', encoding='utf-8') as fp:
- title_list = json.load(fp)
- with open(file.replace('outline.json', 'table.json'), 'r', encoding='utf-8') as fp:
- table_list = json.load(fp)
- with open(file.replace('outline.json', 'image.json'), 'r', encoding='utf-8') as fp:
- image_list = json.load(fp)
- supplier = file.split('\\')[-2]
- pprint(
- busi_loc(
- scrutinize_dict=scrutinize_dict,
- outline_dict=outline_dict,
- title_list=title_list,
- table_list=table_list,
- image_list=image_list,
- supplier=supplier,
- project=project,
- file_name=file
- )
- )
- exit(0)
|