121 lines
5.2 KiB
Python
121 lines
5.2 KiB
Python
from concurrent.futures import ThreadPoolExecutor, as_completed
|
||
from flask_app.general.通义千问long import upload_file, qianwen_long
|
||
from flask_app.general.json_utils import clean_json_string
|
||
def combine_qualification_new(invalid_path, qualification_path,notice_path):
|
||
detailed_res = {}
|
||
# 初始化无效文件ID
|
||
invalid_file_id = None
|
||
if qualification_path:
|
||
# 上传资格文件并获取文件ID
|
||
qualification_file_id = upload_file(qualification_path)
|
||
|
||
# 定义第一个查询,用于检查资格性审查是否存在
|
||
first_query = """
|
||
该文档中是否有关于资格性审查标准的具体内容?请以json格式给出回答,外键为'资格性审查',键值仅限于'是','否',输出格式示例如下:
|
||
{
|
||
"资格性审查":"是"
|
||
}
|
||
"""
|
||
|
||
# 执行第一个查询并清洗返回的JSON字符串
|
||
print("call first_query")
|
||
first_res = clean_json_string(qianwen_long(qualification_file_id, first_query))
|
||
# 判断是否存在资格性审查
|
||
zige_file_id = qualification_file_id if first_res.get("资格性审查") == "是" else None
|
||
|
||
# 如果需要,上传无效文件
|
||
if zige_file_id is None:
|
||
if invalid_file_id is None:
|
||
invalid_file_id = upload_file(invalid_path)
|
||
zige_file_id = invalid_file_id
|
||
|
||
else:
|
||
# 如果 qualification_path 为空,直接使用无效文件
|
||
zige_file_id = upload_file(invalid_path)
|
||
|
||
# 定义第二组查询,仅包含资格性审查
|
||
second_query = [
|
||
{
|
||
"key": "资格性审查",
|
||
"query": "该招标文件中规定的资格性审查标准是怎样的?请以json格式给出,外层为'资格性审查',你的回答要与原文完全一致,不可擅自总结删减,也不要回答有关符合性审查的内容。"
|
||
}
|
||
]
|
||
|
||
# 定义任务函数
|
||
def process_second_query(key, query, file_id):
|
||
print("call second_query")
|
||
try:
|
||
res = qianwen_long(file_id, query)
|
||
cleaned_res = clean_json_string(res)
|
||
return key, cleaned_res.get(key, "未找到相关内容")
|
||
except Exception as e:
|
||
print(f"执行查询 '{key}' 时出错: {e}")
|
||
return key, "查询失败"
|
||
|
||
def process_notice(notice_path):
|
||
print("call notice_path")
|
||
try:
|
||
# 上传通知文件并获取文件ID
|
||
file_id1 = upload_file(notice_path)
|
||
|
||
# 定义用户查询,提取申请人资格要求
|
||
user_query1 = """
|
||
第一章招标公告(投标邀请书)中说明的申请人资格要求是怎样的?请以json格式给出回答,外键为'申请人资格要求',键值为字符串列表,其中每个字符串对应原文中的一条要求,你的回答与原文内容一致,不要擅自总结删减。输出格式示例如下:
|
||
{
|
||
"申请人资格要求":[
|
||
"1.满足《中华人民共和国政府采购法》第二十二条规定;",
|
||
"1.1 法人或者其他组织的营业执照等证明文件,如供应商是自然人的提供身份证明材料;",
|
||
"2.未被列入“信用中国”网站(www.creditchina.gov.cn)信用服务栏失信被执行人、重大税收违法案件当事人名单;"
|
||
]
|
||
}
|
||
"""
|
||
|
||
# 执行查询并清洗结果
|
||
res1 = clean_json_string(qianwen_long(file_id1, user_query1))
|
||
|
||
# 提取申请人资格要求
|
||
requirements = res1.get("申请人资格要求", "未找到相关内容")
|
||
return "申请人资格要求", requirements
|
||
except Exception as e:
|
||
print(f"处理申请人资格要求时出错: {e}")
|
||
return "申请人资格要求", "处理失败"
|
||
|
||
# 初始化 ThreadPoolExecutor
|
||
with ThreadPoolExecutor(max_workers=2) as executor:
|
||
future_to_key = {}
|
||
|
||
# 提交第二组查询
|
||
for query_info in second_query:
|
||
key = query_info["key"]
|
||
query = query_info["query"]
|
||
current_file_id = zige_file_id
|
||
future = executor.submit(process_second_query, key, query, current_file_id)
|
||
future_to_key[future] = key
|
||
|
||
# 有条件地提交通知处理
|
||
if notice_path:
|
||
future = executor.submit(process_notice, notice_path)
|
||
future_to_key[future] = "申请人资格要求"
|
||
else:
|
||
future = executor.submit(process_notice, invalid_path)
|
||
future_to_key[future] = "申请人资格要求"
|
||
|
||
# 收集结果(按完成顺序)
|
||
for future in as_completed(future_to_key):
|
||
key, result = future.result()
|
||
detailed_res[key] = result
|
||
|
||
# 定义所需的顺序
|
||
desired_order = ["申请人资格要求", "资格性审查"]
|
||
# print(json.dumps(detailed_res,ensure_ascii=False,indent=4))
|
||
# 创建一个新的有序字典
|
||
ordered_res = {}
|
||
for key in desired_order:
|
||
if key in detailed_res:
|
||
ordered_res[key] = detailed_res[key]
|
||
|
||
# 最终处理结果,例如打印或保存
|
||
return {"资格审查": ordered_res}
|
||
|
||
|