diff --git a/flask_app/general/file2markdown.py b/flask_app/general/file2markdown.py index 6d636b8..271fc6c 100644 --- a/flask_app/general/file2markdown.py +++ b/flask_app/general/file2markdown.py @@ -60,7 +60,7 @@ def convert_pdf_to_markdown(file_path): if 'result' in data and 'markdown' in data['result']: markdown_content = data['result']['markdown'] # 定义输出文件名 - output_file = os.path.join(output_folder,"extract.txt") + output_file = os.path.join(output_folder,"extract1.txt") try: # 将 markdown 内容写入文件,使用 UTF-8 编码 with open(output_file, 'w', encoding='utf-8') as file: @@ -72,6 +72,6 @@ def convert_pdf_to_markdown(file_path): if __name__ == "__main__": - file_path=r"C:\Users\Administrator\Desktop\货物标\output1\招标文件(107国道)_procurement.pdf" + file_path=r"C:\Users\Administrator\Desktop\货物标\output3\ztbfile_qualification1.pdf" res=convert_pdf_to_markdown(file_path) print(res) \ No newline at end of file diff --git a/flask_app/货物标/货物标解析main.py b/flask_app/货物标/货物标解析main.py index 3a02e4b..ac45c5b 100644 --- a/flask_app/货物标/货物标解析main.py +++ b/flask_app/货物标/货物标解析main.py @@ -241,7 +241,9 @@ def goods_bid_main(output_folder, file_path, file_type, unique_id): #TODO:考虑把解析失败的调用豆包,全文上传。 #TODO:写个脚本确保技术参数没有嵌套 +#TODO: start up 结构优化 #TODO:C:\Users\Administrator\Desktop\fsdownload\16fd6b4e-3975-4c83-8ba6-1bc9263a6a5b 符合性审查未找到 +# 小解析也更新偏离表 #商务标这里改为列表最里层 #good_list 金额 截取上下文 if __name__ == "__main__": diff --git a/flask_app/货物标/资格审查main.py b/flask_app/货物标/资格审查main.py index a7d2a35..a6b49d9 100644 --- a/flask_app/货物标/资格审查main.py +++ b/flask_app/货物标/资格审查main.py @@ -376,20 +376,55 @@ def process_additional_queries(combined_res, match_keys, output_folder, notice_p def combine_qualification_review(invalid_path, qualification_path, notice_path): detailed_res = {} - + together_ask = False # 初始化无效文件ID invalid_file_id = None first_res = {} + if qualification_path: # 上传资格文件并获取文件ID qualification_file_id = upload_file(qualification_path) - # 定义第一个查询,用于检查资格性审查和符合性审查是否存在 first_query = """ - 该文档中是否有关于资格性审查标准的具体内容,是否有关于符合性审查标准的具体内容?请以json格式给出回答,外键分别为'资格性审查'和'符合性审查',键值仅限于'是','否',输出格式示例如下: + 该文档中是否有关于资格性审查标准的具体内容,是否有关于符合性审查标准的具体内容?若两者都有,你还需要判断资格性审查和符合性审查的内容是否在同一张表中且没有明确的条款名称区分二者?请以json格式给出回答,外键分别为'资格性审查'和'符合性审查'和'无法区分',键值仅限于'是','否'。 + + 要求与指南: + "无法区分"的键值默认是'否',仅当该文档同时满足以下条件时,它的键值才是'是'。 + 1. 既有资格性审查内容,也有符合性审查内容时 + 2. 它们的内容在同一张表格中 + 3. 表中没有两个合并单元格内容为'资格性审查'和'符合性审查'类似的表述,只有'资格性审查和符合性审查'的合并表述。 + 4. 表头 + + 以下为示例表格1, + | 序号 | 资格性检查和符合性检查内容 | + | -- | -- | + | 1 | 供应商应具备《政府采购法》第二十二条规定的条件,提供相关材料。 | + | 1 | 1)法人或者其他组织的营业执照等证明文件,自然人的身份证明; | + | 1 | 2)财务状况报告,依法缴纳税收和社会保障资金的声明函; | + | 1 | 3)具备履行合同所必需的设备和专业技术能力的证明材料; | + | 2 | 供应商应提供经营场所标识标牌、经营场地及经营设备、产品等相关图片; | + | 3 | 按优惠率进行报价,其优惠率应不低于市场价格5%; | + 对应输出示例如下: { "资格性审查":"是", - "符合性审查":"是" + "符合性审查":"是", + "无法区分":"是" + } + + 以下为示例表格2, + | 条款 | 评审因素 | 评审标准 | 备注 | + | -- | -- | -- | -- | + | 资格评审标准 | 满足《中华人民共和国政府采购法》第二十二条规定 | 1、具有独立承担民事责任的能力;2、具有良好的商业信誉和健全的财务会计制度;3、具有履行合同所必需的设备和专业技术能力;4、有依法缴纳税收和社会保障资金的良好记录;5、参加政府采购活动前三年内,在经营活动中没有重大违法记录;6、法律、行政法规规定的其他条件。 | | + | 资格评审标准 | 单位负责人 | 提交“未与单位负责人为同一人或者存在直接控股、管理关系的它投标人,参加同一合同项下的政府采购活动声明函”。 | | + | 资格评审标准 | 提供服务 | 提交“未为本采购项目提供整体设计、规范编制或者项目管理、理、检测等服务的声明函”。 | | + | 符合评审标准 | 递交的响应文件 | 符合竞争性磋商文件第一部分竞争性磋商公告“六、其它补充事宜”第1、2 条要求。 | | + | 符合评审标准 | 文件签章 | 响应性文件签字和盖章齐全。 | | + | 符合评审标准 | 磋商有效期 | 满足磋商有效期。 | | + 对应输出示例如下: + { + "资格性审查":"是", + "符合性审查":"是", + "无法区分":"否" } """ @@ -400,6 +435,9 @@ def combine_qualification_review(invalid_path, qualification_path, notice_path): # 判断是否存在资格性和符合性审查 zige_file_id = qualification_file_id if first_res.get("资格性审查") == "是" else None fuhe_file_id = qualification_file_id if first_res.get("符合性审查") == "是" else None + if first_res.get("资格性审查") == '是' and first_res.get("符合性审查") == '是' and first_res.get( + "无法区分") == "是": + together_ask = True # 设置是否需要联合查询 # 如果需要,上传无效文件 if zige_file_id is None or fuhe_file_id is None: @@ -414,81 +452,125 @@ def combine_qualification_review(invalid_path, qualification_path, notice_path): # 如果 qualification_path 为空,直接使用无效文件 zige_file_id = fuhe_file_id = upload_file(invalid_path) - # 定义第二组查询 - second_query = [ - { - "key": "资格性审查", - "query": ''' - 问题:该招标文件中规定的资格性审查标准是什么的? - 输出要求: - 1.请以json格式给出,外层为'资格性审查',最内层的值需要用列表包裹。 - 2.一层嵌套内的键需要总结分类为某类评审因素。 - 3.你的回答要与原文完全一致,不要回答有关符合性审查的内容。 - 4.仔细检查你所选取的标准,若发现这些标准实际上是在描述不允许出现的资格性审查情况,则将外键替换为'资格性审查(以下情况不得出现)',并将这些标准写入其中。 - 5.最大细分为二层嵌套即可。 - 输出示例1: - { - "资格性审查": { #一层嵌套 - "某类评审因素": [ #二层嵌套 - "因素1", - "因素2" - ] - ... + # 根据 together_ask 决定第二组查询的内容 + if together_ask: + second_query = [ + { + "key": "资格性和符合性审查", + "query": ''' + 问题:该招标文件中规定的资格性和符合性审查标准是什么的? + 输出要求: + 1.请以json格式给出,外层为'资格性和符合性审查',最内层的值需要用列表包裹。 + 2.一层嵌套内的键需要总结分类为某类评审因素或是直接使用原文中的评审因素字段、标题。 + 3.你的回答要与原文完全一致。 + 4.最大细分为二层嵌套即可。 + 输出示例: + { + "资格性和符合性审查": { #一层嵌套 + "某类评审因素": [ #二层嵌套 + "因素1", + "因素2" + ] + ... + } + } + ''' + } + ] + else: + second_query = [ + { + "key": "资格性审查", + "query": ''' + 问题:该招标文件中规定的资格性审查标准是什么的? + 输出要求: + 1.请以json格式给出,外层为'资格性审查',最内层的值需要用列表包裹。 + 2.一层嵌套内的键需要总结分类为某类评审因素。 + 3.你的回答要与原文完全一致,不要回答有关符合性审查的内容。 + 4.仔细检查你所选取的标准,若发现这些标准实际上是在描述不允许出现的资格性审查情况,则将外键替换为'资格性审查(以下情况不得出现)',并将这些标准写入其中。 + 5.最大细分为二层嵌套即可。 + 输出示例1: + { + "资格性审查": { #一层嵌套 + "某类评审因素": [ #二层嵌套 + "因素1", + "因素2" + ] + ... + } } - } - 输出示例2: - { - "资格性审查(以下情况不得出现)": { #若发现文中出现均为反向标准,用像该示例一样的处理 - "某类不允许的评审因素": [ #二层嵌套 - "因素1", - "因素2" - ] - ... + 输出示例2: + { + "资格性审查(以下情况不得出现)": { #若发现文中出现均为反向标准,用像该示例一样的处理 + "某类不允许的评审因素": [ #二层嵌套 + "因素1", + "因素2" + ] + ... + } } - } - ''' - }, - { - "key": "符合性审查", - "query": ''' - 问题:该招标文件中规定的符合性审查标准是什么的? - 输出要求: - 1.请以json格式给出,外层为'符合性审查',最内层的值需要用列表包裹。 - 2.一层嵌套内的键需要总结分类为某类评审因素。 - 3.你的回答要与原文完全一致,也不要回答有关资格性审查的内容。 - 4.仔细检查你所选取的标准,若发现这些标准实际上是在描述不允许出现的符合性审查情况,则将外键替换为'符合性审查(以下情况不得出现)',并将这些标准写入其中。 - 5.最大细分为二层嵌套即可。 - 输出示例1: - { - "符合性审查": { #一层嵌套 - "某类评审因素": [ #二层嵌套 - "因素1", - "因素2" - ] - ... + ''' + }, + { + "key": "符合性审查", + "query": ''' + 问题:该招标文件中规定的符合性审查标准是什么的? + 输出要求: + 1.请以json格式给出,外层为'符合性审查',最内层的值需要用列表包裹。 + 2.一层嵌套内的键需要总结分类为某类评审因素或是直接使用原文中的评审因素字段、标题。 + 3.你的回答要与原文完全一致,也不要回答有关资格性审查的内容。 + 4.仔细检查你所选取的标准,若发现这些标准实际上是在描述不允许出现的符合性审查情况,则将外键替换为'符合性审查(以下情况不得出现)',并将这些标准写入其中。 + 5.最大细分为二层嵌套即可。 + 输出示例1: + { + "符合性审查": { #一层嵌套 + "某类评审因素": [ #二层嵌套 + "因素1", + "因素2" + ] + ... + } } - } - 输出示例2: - { - "符合性审查(以下情况不得出现)": { #若发现文中出现均为反向标准,用像该示例一样的处理 - "某类不允许的评审因素": [ #二层嵌套 - "因素1", - "因素2" - ] - ... + 输出示例2: + { + "符合性审查(以下情况不得出现)": { #若发现文中出现均为反向标准,用像该示例一样的处理 + "某类不允许的评审因素": [ #二层嵌套 + "因素1", + "因素2" + ] + ... + } } - } - ''' - } - ] + ''' + } + ] # 定义任务函数 def process_second_query(key, query, file_id): - print("call second_query") + print(f"call {key}") try: res = qianwen_long(file_id, query) cleaned_res = clean_json_string(res) - return key, cleaned_res.get(key, "未找到相关内容") + + # 初始化结果和外键 + result = None + selected_key = key # 默认外键为 key + + if key in cleaned_res: + result = cleaned_res[key] + else: + # 尝试匹配带 "(以下情况不得出现)" 后缀的键 + alternate_key = f"{key}(以下情况不得出现)" + if alternate_key in cleaned_res: + result = cleaned_res[alternate_key] + selected_key = alternate_key # 外键需要切换为 alternate_key + + # 如果结果仍为空,返回默认值 + if result is None: + result = "未找到相关内容" + + # 返回匹配到的外键以及对应的结果 + return selected_key, result except Exception as e: print(f"执行查询 '{key}' 时出错: {e}") return key, "查询失败" @@ -527,7 +609,15 @@ def combine_qualification_review(invalid_path, qualification_path, notice_path): for query_info in second_query: key = query_info["key"] query = query_info["query"] - current_file_id = zige_file_id if key == "资格性审查" else fuhe_file_id + if key == "资格性和符合性审查": + current_file_id = qualification_file_id # 联合查询使用资格文件ID + elif key == "资格性审查": + current_file_id = zige_file_id + elif key == "符合性审查": + current_file_id = fuhe_file_id + else: + current_file_id = zige_file_id # 默认使用资格文件ID + # print(f"Submitting query for key: {key}, file_id: {current_file_id}") future = executor.submit(process_second_query, key, query, current_file_id) future_to_key[future] = key @@ -536,7 +626,7 @@ def combine_qualification_review(invalid_path, qualification_path, notice_path): future = executor.submit(process_notice, notice_path) future_to_key[future] = "申请人资格要求" else: - future=executor.submit(process_notice,invalid_path) + future = executor.submit(process_notice, invalid_path) future_to_key[future] = "申请人资格要求" # 收集结果(按完成顺序) @@ -545,12 +635,18 @@ def combine_qualification_review(invalid_path, qualification_path, notice_path): detailed_res[key] = result # 定义所需的顺序 - desired_order = [ - "申请人资格要求", - ["资格性审查", "资格性审查(以下情况不得出现)"], - ["符合性审查", "符合性审查(以下情况不得出现)"] - ] - # print(json.dumps(detailed_res,ensure_ascii=False,indent=4)) + if together_ask: + desired_order = [ + "申请人资格要求", + "资格性和符合性审查" + ] + else: + desired_order = [ + "申请人资格要求", + ["资格性审查", "资格性审查(以下情况不得出现)"], + ["符合性审查", "符合性审查(以下情况不得出现)"] + ] + # 创建一个新的有序字典 ordered_res = {} for item in desired_order: @@ -558,7 +654,7 @@ def combine_qualification_review(invalid_path, qualification_path, notice_path): for key in item: if key in detailed_res: ordered_res[key] = detailed_res[key] - break # 只添加第一个匹配的键,"资格性审查"和 "资格性审查(以下情况不得出现)"互斥 + break # 只添加第一个匹配的键,互斥 else: if item in detailed_res: ordered_res[item] = detailed_res[item]