From 95613b6ccbd6373d1a527ce6f59076559eeae643 Mon Sep 17 00:00:00 2001
From: zy123 <646228430@qq.com>
Date: Thu, 17 Oct 2024 20:57:13 +0800
Subject: [PATCH] =?UTF-8?q?10.17=20=E5=B0=8F=E8=A7=A3=E6=9E=90=E8=B4=A7?=
=?UTF-8?q?=E7=89=A9=E6=A0=87?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
flask_app/general/little_zbparse.py | 13 +-
flask_app/main/post_processing.py | 330 ++++++++++++++++++++++++++-
flask_app/main/start_up.py | 56 ++++-
flask_app/货物标/基础信息解析main.py | 8 +-
flask_app/货物标/技术要求提取.py | 8 +-
5 files changed, 397 insertions(+), 18 deletions(-)
diff --git a/flask_app/general/little_zbparse.py b/flask_app/general/little_zbparse.py
index 6238e41..aca9937 100644
--- a/flask_app/general/little_zbparse.py
+++ b/flask_app/general/little_zbparse.py
@@ -37,8 +37,8 @@ def merge(merged):
def get_goods_baseinfo(baseinfo_file_path):
file_id = upload_file(baseinfo_file_path)
- baseinfo_file_path='flask_app/static/提示词/基本信息货物标.txt'
- # baseinfo_file_path = 'D:\\flask_project\\flask_app\\static\\提示词\\基本信息货物标.txt'
+ # baseinfo_file_path='flask_app/static/提示词/基本信息货物标.txt'
+ baseinfo_file_path = 'D:\\flask_project\\flask_app\\static\\提示词\\基本信息货物标.txt'
questions = read_questions_from_file(baseinfo_file_path)
more_query = "请你根据招标文件信息,回答以下问题:是否需要递交投标保证金(或磋商保证金)?请按json格式给我提供信息,键名分为'是否递交投标保证金'(或'是否递交磋商保证金'),键值仅限于'是','否','未知',若存在矛盾信息,请回答'未知'。"
questions.append(more_query)
@@ -57,6 +57,8 @@ def get_goods_baseinfo(baseinfo_file_path):
baseinfo_list.append(merged)
return baseinfo_list
+def get_engineering_baseinfo(baseinfo_file_path):
+ return []
#货物标
def little_parse_goods(output_folder,file_path):
@@ -66,8 +68,9 @@ def little_parse_goods(output_folder,file_path):
return {"基础信息": aggregated_baseinfo}
def little_parse_engineering(output_folder,file_path):
files=truncate_pdf_specific_engineering(file_path,output_folder)
-
- return True
+ baseinfo_list=get_engineering_baseinfo(files[-1])
+ aggregated_baseinfo = aggregate_basic_info_goods(baseinfo_list)
+ return {"基础信息": aggregated_baseinfo}
def little_parse_main(output_folder, file_path, file_type,zb_type,unique_id):
"""
@@ -127,7 +130,7 @@ if __name__ == "__main__":
with open(final_json_path, 'r', encoding='utf-8') as f:
logger.info('final_json_path:' + final_json_path)
zbparse_data = json.load(f)
- json_str = json.dumps(zbparse_data, ensure_ascii=False)
+ json_str = json.dumps(zbparse_data, ensure_ascii=False,indent=4)
print(json_str)
end_time = time.time()
elapsed_time = end_time - start_time # 计算耗时
diff --git a/flask_app/main/post_processing.py b/flask_app/main/post_processing.py
index 1ddb82f..7a8e479 100644
--- a/flask_app/main/post_processing.py
+++ b/flask_app/main/post_processing.py
@@ -1,3 +1,5 @@
+# -*- encoding:utf-8 -*-
+import json
import re
@@ -91,7 +93,7 @@ def inner_post_processing(base_info):
"报名截止日期": [["关键时间/内容", "投标文件递交截止日期"]],
"招标项目预算": [["项目信息", "招标控制价"]],
"招标单位名称": [["招标人/代理信息", "招标人"]],
- "招标公告地址": [["关键时间/内容", "信息公示媒介"], ["关键时间/内容", "评标结果公示媒介"]]
+ "招标公告地址": [["关键时间/内容", "信息公示媒介"], ["关键时间/内容", "评标结果公示媒介"]],
}
# 提取并映射字段
@@ -154,13 +156,14 @@ def inner_post_processing(base_info):
def outer_post_processing(combined_data, includes):
"""
外层处理函数,调用内层 post_processing 处理 '基础信息',并构建 processed_data。
+ 额外提取 '采购要求' 下的 '技术要求' 内容。
参数:
combined_data (dict): 原始合并数据。
includes (list): 需要包含的键列表。
返回:
- tuple: (processed_data, extracted_info)
+ tuple: (processed_data, extracted_info, procurement_reqs)
"""
# 初始化结果字典,预设'其他'分类为空字典
processed_data = {"其他": {}}
@@ -168,6 +171,9 @@ def outer_post_processing(combined_data, includes):
# 初始化提取的信息字典
extracted_info = {}
+ # 初始化采购要求的技术要求
+ procurement_reqs = ""
+
# 检查 '基础信息' 是否在 includes 中
if "基础信息" in includes:
base_info = combined_data.get("基础信息", {})
@@ -176,6 +182,12 @@ def outer_post_processing(combined_data, includes):
# 将 '基础信息' 保留在处理后的数据中
processed_data["基础信息"] = base_info
+ # 提取 '采购要求' 下的 '技术要求'
+ procurement_reqs = base_info.get("采购要求", {}).get("技术要求", "")
+ if not procurement_reqs:
+ # 如果 '技术要求' 不存在或为空,可以根据需要设置默认值
+ procurement_reqs = "未提供" # 或者其他适当的默认值
+
# 遍历原始字典的每一个键值对
for key, value in combined_data.items():
if key in includes:
@@ -193,4 +205,316 @@ def outer_post_processing(combined_data, includes):
if not processed_data["其他"]:
del processed_data["其他"]
- return processed_data, extracted_info
\ No newline at end of file
+ return processed_data, extracted_info, procurement_reqs
+
+if __name__ == "__main__":
+ combined_data={
+ "基础信息": {
+ "招标人/代理信息": {
+ "招标人": "湖北广水农村商业银行股份有限公司",
+ "招标人联系方式": {
+ "名称": "湖北广水农村商业银行股份有限公司",
+ "联系电话": "18771377804",
+ "地址": "广水市永阳大道 46号"
+ },
+ "招标代理机构": "湖北兴立众工程咨询有限责任公司",
+ "招标代理机构联系方式": {
+ "名称": "湖北兴立众工程咨询有限责任公司",
+ "联系电话": "0722-6239009",
+ "地址": "广水市永阳大道 40号"
+ },
+ "项目联系方式": {
+ "名称": "付女士",
+ "联系电话": "0722-6239009"
+ }
+ },
+ "项目信息": {
+ "项目名称": "广水农商行门禁控制主机及基础验证设备采购项目(三次)",
+ "项目编号": "HBXLZ-2023-CS001",
+ "项目概况": "广水农商行门禁控制主机及基础验证设备采购项目(三次)的潜在供应商应在广水市永阳大道 40号六楼获取采购文件,2023年 5月 23日 9点 00分(北京时间)前提交响应文件。",
+ "项目基本情况": {
+ "项目编号": "HBXLZ-2023-CS001",
+ "项目名称": "广水农商行门禁控制主机及基础验证设备采购项目(三次)",
+ "采购方式": "竞争性磋商",
+ "预算金额": "51万元",
+ "最高限价": "51万元",
+ "采购需求": "采购监控中心平台 1套、安全门禁 82套,采购内容包括所需货物的生产、运输、安装、调试、检验以及售后服务等全部相关工作,详细技术参数及其它详见竞争性磋商文件第五部分采购要求及内容。",
+ "合同履行期限": "60日历天",
+ "本项目(是/否)接受联合体投标": "否"
+ },
+ "招标控制价": "51万元",
+ "投标竞争下浮率": "未知",
+ "是否接受联合体投标": "否",
+ "分包": "不允许"
+ },
+ "采购要求": {
+ "技术要求": {
+ "门禁管理系统": {
+ "门禁控制器": {
+ "技术参数": "1.系统采用 CS架构,支持 Web端登录,支持远程软硬件重启升级、维护、管理。2.★支持 TCP/IP、4G、RS485联网方式、有线与无线(WIFI)可自动切换 ,控制器支持百台到上千台设备组网,需满足大楼多门点的管理数量要求。3.★安装方式支持壁挂安装。4.★支持卡、密码、首卡、双卡、主卡/副卡、胁迫码、多卡分组、指纹识别+中心确认等开门方式。全面支持读卡器、指纹、人脸、指静脉、RS485识读设备的混合接入。5.支持胁迫报警、门未关妥报警、门被外力开起报警、开门等待超时报警、黑名单报警、非法卡超次报警、短信报警转发等功能。6.自动数据同步和断网断点数据补传,设备与服务器之间的数据可以自动同步,无论是设备上传状态事件信息还是服务器下载人员、权限数据等都支持网络恢复后自动补传,断点续传。7.★高性能、高安全性,符合国家标准 4级的要求,并提供公安部检测证明。8.★采用 ARM9 32位处理器,RAM:128MB,卡片容量:≥200000张卡片,支持脱机运行,脱机事件记录:≥1000000条,断电状态记录可保存 10年。9.开放 SKD,具有二次开发接口协议能力。10.★所投产品需提供公安部检测报告并加盖鲜章。",
+ "数量": "82"
+ },
+ "出门按钮": {
+ "技术参数": "1)标准 86底盒安装方式,支持常开,常闭方式 2)结构:塑料面板 3)性能:最大耐电流 1.25A电压 250V",
+ "数量": "82"
+ },
+ "单门电磁锁": {
+ "技术参数": "1)通电上锁,断电开锁,开门时间可调节。2)稳定性强,连续工作锁体无故障,使用更安全。3)安装方便、噪音低、寿命长、无剩磁、无机械故障,质保 3年起。4)★带门磁,具有信号反馈功能和指示灯指示。5)参数:开锁电压:DC12V,工作电流:450mA,0-255秒延时可调,额定拉力:280KG,工作环境:温度-10~+55℃,湿度 0~95%。6)★所投产品需提供公安部检测报告并加盖鲜章。",
+ "数量": "82"
+ },
+ "指纹仪": {
+ "技术参数": "1.先进半导体传感器,全面领先于普通光学识别技术,更好的判别假指纹、湿指、污损破皮手指。2.直观的 LCD液晶显示及语音验证提示,配针孔摄像机,实现视频联动抓拍,手动布撤防,实现与监控中心门禁系统实现对讲(外置语音盒)。3.支持 IC卡、指纹、卡加密码、编号多种组合验证方式。4.辨识率和校正、容错性能强,支持脱机运行和联网运行。5.支持指纹仪离线、非法指纹、胁迫指纹报警,具有防止恶意使用报警功能。技术参数:比对方式:1:N或 1:1,识别速度:< 2s(1000枚指纹 1:N)/射频卡识别< 150ms,采集时间:1s,存储容量:1000枚指纹,安全等级:1-5 级可调,分辨率:508dpi,认假率<0.001%(安全等级为 3时),拒真率:<1.0%(安全等级为 3时),工作电压:DC 12V,工作电流:500mA,工作环境:温度-20℃~55℃、湿度 10%~95%,尺寸规格: 197mm(L)×97mm(W)×40mm(D)。6.★所投产品需提供公安部检测报告并加盖鲜章。",
+ "数量": "82"
+ },
+ "门禁服务器": {
+ "技术参数": "CPU:1颗 intel至强系列处理器,核数≥12核,主频≥2.2GHz 内存:32G*2 DDR4,16根内存插槽,最大支持扩展至 2TB内存 硬盘:4块 600G 10K 2.5寸 SAS硬盘 阵列卡:SAS_HBA卡,支持 RAID 0/1/10 PCIE扩展:最大可支持 6个 PCIE扩展插槽 网口:2个千兆电口 其他接口:1个 RJ45管理接口,后置 2个 USB 3.0 接口,前置 2个 USB2.0接口,1个 VGA接口电源: 标配 550W(1+1)高效铂金 CRPS冗余电源",
+ "数量": "1"
+ }
+ }
+ },
+ "商务要求": "",
+ "服务要求": {
+ "全国联保": "产品需全国联保,享受三包服务,保修期:3年。",
+ "通讯加密": "通过网络抓包工具,对软件与设备之间的通讯进行抓包,加密前为明码,加密后为乱码。提供公安部检测报告复印件加盖原厂鲜章证明。",
+ "自动数据同步": "设备可脱机使用(不联网),设备联网后可自动同步数据。",
+ "扩展功能": "系统扩展性能良好,可提供详尽的数据接口、DLL动态链接库及相关数据接口说明文件,包括样板程序,方便用户二次开发。",
+ "门禁系统标准": "门禁系统必须满足公安部 GA38-2021文件标准中对银行业的要求。",
+ "高性能高安全性": "高性能、高安全性,符合国家标准 4级的要求,并提供公安部检测证明。",
+ "开放SDK": "开放 SKD,具有二次开发接口协议能力。",
+ "公安部检测报告": "所投产品需提供公安部检测报告并加盖鲜章。"
+ },
+ "其他要求": ""
+ },
+ "关键时间/内容": {
+ "投标文件递交截止日期": "2023年5月23日 9点00分",
+ "投标文件递交地点": "广水市应山府华美不动产隔壁",
+ "开标时间": "2023年 5月 23日 9点 00分",
+ "开标地点": "广水市应山府华美不动产隔壁",
+ "澄清招标文件的截止时间": "未知",
+ "投标有效期": "提交首次响应文件截止时间后 90日历天",
+ "信息公示媒介": "中国政府采购网:http://www.ccgp.gov.cn"
+ },
+ "保证金相关": {
+ "是否提交履约保证金": "未知",
+ "是否递交磋商保证金": "未知",
+ "是否递交投标保证金": "未知",
+ "质量保证金": "未知"
+ },
+ "其他信息": {
+ "投标费用承担": "供应商应自行承担所有与参加磋商有关的费用。不论磋商的结果如何,招标人和采购代理机构在任何情况下均无义务和责任承担这些费用。",
+ "招标代理服务费": {
+ "收费标准": "招标代理服务费金额按原国家计委计价格[2002]1980号 《招标代理服务收费管理暂行办法》和国家发展与改革委员会办公厅发改办价格[2003]857号文所规定的收费标准计取。"
+ },
+ "是否退还投标文件": "否",
+ "是否召开投标预备会": "未知",
+ "是否召开投标答疑会": "未知",
+ "偏离": {
+ "定义": "技术参数响应及偏离表是响应性文件的一部分,供应商须对本次采购项目要求的技术性能逐项作出实质性响应。",
+ "要求": "供应商必须保证其提供的相关资质证明文件的真实性、合法性、时效性,否则,磋商小组将不予推荐。",
+ "允许偏离项": "未知",
+ "偏离处理": "响应性文件应对竞争性磋商文件中各项做出实质性响应,否则该磋商将可能被拒绝。",
+ "其他": "供应商服务承诺书应按不低于竞争性磋商文件中的服务要求标准做出响应。"
+ },
+ "踏勘现场": "不组织"
+ }
+ },
+ "投标文件要求": {
+ "响应性文件的编写": {
+ "响应性文件的组成": {
+ "响应性文件包括以下内容": [
+ "(一)湖北省政府采购供应商信用承诺书(二)磋商响应函(三)法定代表人身份证明(四)法定代表人授权书(五)磋商一览表(六)投标货物(工程或服务)清单(七)技术参数响应及偏离表(八)供应商基本情况表(九)技术部分(十)售后服务承诺(十一)其他",
+ "商务部分指供应商提交的证明其有资格参加磋商和成交后有能力履行合同的文件;技术部分是能够证明磋商供应商提供的货物及服务符合竞争性磋商文件规定的文件,磋商供应商须对本次采购项目要求的技术性能逐项作出实质性响应,必须保证其提供的相关资质证明文件的真实性、合法性、时效性,否则,磋商小组将不予推荐。报价部分是指磋商供应商响应采购项目要求而作出的书面报价明细。",
+ "供应商技术文件规格幅面(A4)应与正文一致,按照竞争性磋商文件规定的顺序,统一编目编码装订。为方便评审,技术文件中的各项表格必须按照竞争性磋商文件格式要求制作。"
+ ],
+ "响应性文件中所涉及的货物,供应商应提供充分的证明资料证明所提供的货物是合格的,且符合竞争性磋商文件规定及磋商供应商认为需要加以说明的其他内容。": [],
+ "响应性文件及供应商与采购有关的来往通知、函件和所有文件必须使用简体中文。": []
+ },
+ "响应性文件格式": [
+ "供应商应按竞争性磋商文件中提供的响应性文件格式要求制作(见第七部分附件—响应性文件格式)。",
+ "响应性文件(正本、副本)应用A4纸打印,并按竞争性磋商文件第七部分要求的顺序依次装订成册,响应性文件首页应编制“文件目录”并标明页码。"
+ ],
+ "磋商报价": [
+ "所有价格均为人民币报价,报价应以人民币为结算货币。须由中标单位开具当地正式发票。",
+ "磋商报价是以人民币为单位的综合报价,供应商应根据控制价,结合本项目实际情况,提出不高于控制价的报价。任何有选择性的报价将不予接受,每轮只许有一个报价;",
+ "供应商应按照竞争性磋商文件提供的磋商报价表格式填写磋商报价;",
+ "磋商过程供应商按磋商小组要求不超过二轮报价(首次报价、最后报价);",
+ "供应商任何有选择的报价(首次报价、最后报价)将被拒绝,磋商报价不允许修正和涂改,出现错误或涂改的将以无效报价处理;",
+ "供应商不得以他人名义磋商或者以其他方式弄虚作假,骗取中标;",
+ "响应性文件应对竞争性磋商文件中各项做出实质性响应,否则该磋商将可能被拒绝。供应商服务承诺书应按不低于竞争性磋商文件中的服务要求标准做出响应;",
+ "磋商文件能够详细列明采购标的服务要求的,磋商结束后,磋商小组应当要求所有实质性响应的供应商在规定时间内提交最后报价。最后报价是供应商响应文件的有效组成部分。"
+ ],
+ "响应性文件有效期": {
+ "响应性文件有效期": "响应性文件从响应性文件递交的截止时间起,响应性文件有效期为60天,有效期短于这个规定期限的磋商,将被拒绝。"
+ },
+ "响应性文件的签署及规定": [
+ "响应性文件应按竞争性磋商文件规定加盖单位公章和供应商法定代表人或授权代表签字或盖章,否则,将被视为无效响应性文件;",
+ "除磋商供应商对错误作必要修改外,响应性文件中不许有加行、涂抹或改写,修改处须加盖磋商供应商单位公章;",
+ "响应性文件应以中文编制,计量单位以国家规定标准为准;",
+ "响应性文件应严格按照竞争性磋商文件的要求提交,并按规定的统一格式逐项填写,不准有空项;无相应内容可填的项应填写“无”等明确的回答文字,响应性文件未按规定提交,将被视为不完整响应的响应性文件,其响应文件有可能被拒绝;",
+ "供应商必须保证响应性文件所提供的全部资料真实可靠,并接受磋商小组对其中任何资料进一步审查的要求。项目结束后,采购单位保留对成交候选供应商投报货物及磋商情况核实的权利,如核实过程中有证据证明成交候选供应商存在有违反竞争性磋商文件规定行为的,采购人将取消其成交候选供应商资格。供应商必须保证响应性文件所提供的全部资料真实可靠,并接受磋商小组对其中任何资料进一步审查的要求。项目结束后,采购单位保留对成交候选供应商投报货物及磋商情况核实的权利,如核实过程中有证据证明成交候选供应商存在有违反竞争性磋商文件规定行为的,采购人将取消其成交候选供应商资格。"
+ ]
+ },
+ "响应性文件的递交": {
+ "响应性文件的密封和标记及递交": [
+ "响应性文件的正本和副本必须用封条密封在一个密封袋内,封条上加盖供应商公章,密封袋封面注明“在2023年月日时分(北京时间)前不准启封”(投标截止时间),正面应加盖供应商公章,并写明项目名称、供应商名称、地址,正本与副本如有差异的,评审时以正本为准。",
+ "供应商应当在磋商文件要求的截止时间前,将响应文件密封送达指定地点。在截止时间后送达的响应文件为无效文件,采购人、采购代理机构或者磋商小组应当拒收。",
+ "未按竞争性磋商文件要求密封的响应性文件,采购人或采购代理机构将不予接受。未按竞争性磋商文件要求密封的响应性文件,采购人或采购代理机构将不予接受。"
+ ]
+ }
+ },
+ "开评定标流程": {
+ "竞争性磋商文件内容、程序及相关说明": {
+ "磋商说明": [
+ "由采购人组织成立磋商小组,磋商小组成员由有关经济、技术方面的评审专家和采购人代表等组成,成员人数为3人,其中评审专家人数不得少于磋商小组成员总数的2。",
+ "磋商全过程中,供应商应委派法定代表人或委托(授权)代理人参加。"
+ ],
+ "磋商原则": [
+ "统一性原则:磋商小组将按照统一的磋商程序和磋商方法,用同一标准进行磋商;",
+ "独立性原则:磋商工作在磋商小组内部独立进行,不受外界任何因素的干扰和影响。磋商小组成员对出具的评审意见承担个人责任;",
+ "综合性原则:磋商小组将综合分析、评审磋商供应商的各项指标,磋商小组按照竞争性磋商文件规定的磋商办法和标准对各供应商进行综合评定;",
+ "保密性原则:采购人或采购代理机构将采取必要的措施,保证磋商在严格保密的情况下进行。"
+ ],
+ "磋商程序、内容": [
+ "供应商以随机抽取的方式确定进行首次报价的先后顺序,供应商自行对本项目货物首次报价;",
+ "首次报价结束后,磋商小组要对各供应商的资格性、递交的响应性文件的符合性进行审阅,以判定各供应商资格、响应性文件的有效性,审阅结束后,要确定进入最后报价磋商阶段的供应商名单;",
+ "磋商小组所有成员应当集中与单一供应商分别进行磋商,并给予所有参加磋商的供应商平等的磋商机会;",
+ "在磋商过程中,磋商小组可以根据磋商文件和磋商情况实质性变动采购需求中的技术、服务要求以及合同草案条款,但不得变动磋商文件中的其他内容。实质性变动的内容,须经采购人代表确认。对磋商文件作出的实质性变动是磋商文件的有效组成部分,磋商小组应当及时以书面形式同时通知所有参加磋商的供应商。供应商应当按照磋商文件的变动情况和磋商小组的要求重新提交响应文件,并由其法定代表人或授权代表签字或者加盖公章,由授权代表签字的,应当附法定代表人授权书;",
+ "磋商文件能够详细列明采购标的技术、服务要求的,磋商结束后,磋商小组应当要求所有实质性响应的供应商在规定时间内提交最后报价,提交最后报价的供应商不得少于3家,最后报价是供应商响应文件的有效组成部分;",
+ "已提交响应文件的供应商,在提交最后报价之前,可以根据磋商情况退出磋商;",
+ "经磋商确定最终采购需求和提交最后报价的供应商后,由磋商小组采用综合评分法对提交最后报价的供应商的响应文件和最后报价进行综合评分;",
+ "磋商小组根据综合评分情况,按照评审得分由高到低顺序推荐3名成交候选供应商,并编写评审报告。评审得分相同的,按照最后报价由低到高的顺序推荐。评审得分且最后报价相同的,按照技术指标优劣顺序推荐;",
+ "供需双方签订采购合同。"
+ ],
+ "响应性文件的澄清": [
+ "磋商小组在对响应文件有效性、完整性和响应程度进行审查时,可以要求供应商对响应性文件中含义不明确、对同类问题表述不一致或者有明显文字和计算错误的内容等作必要的澄清、说明或者更正,该澄清、说明或者更正应当采用书面形式,并由法定代表人或其授权代表签字或者加盖公章,由授权代表签字的,应当附法定代表人授权书。",
+ "澄清、说明或者更正将作为响应性文件内容的一部分。澄清、说明不得超出响应文件的范围或者改变响应性文件的实质性内容。供应商拒不按照要求对响应性文件进行澄清、说明的,磋商小组可拒绝该其响应文件。",
+ "如磋商小组一致认为某个供应商的报价明显不合理,有降低质量、不能诚信履行的可能时,磋商小组有权决定是否通知供应商限期进行书面解释或提供相关证明材料。若已要求,而该磋商供应商在规定期限内未做出解释、作出的解释不合理或不能提供证明材料的,经磋商小组取得一致意见后,可拒绝该报价。"
+ ],
+ "注意事项": [
+ "磋商供应商出现下列情形之一的,磋商小组可取消其磋商资格(1)未按竞争性磋商文件规定提交有关材料的;(2)有违反政府采购法律、法规行为的。",
+ "磋商供应商出现下列情形之一的,磋商小组在评审中按废标处理:(1)最后报价有选择性的;(2)不符合竞争性磋商文件中规定的其他实质性要求。",
+ "经查实,若磋商供应商有提供虚假证明文件的行为,采购人将视情节轻重和影响程度报政府相关监督管理部门处理。"
+ ],
+ "确定成交供应商的原则": [
+ "磋商小组将严格按照磋商文件的要求和条件进行比较并出具评审报告,评审报告应当由磋商小组全体人员签字认可。磋商小组成员对评审报告有异议的,磋商小组按照少数服从多数的原则推荐成交候选供应商,采购程序继续进行。对评审报告有异议的磋商小组成员,应当在报告上签署不同意见并说明理由,由磋商小组书面记录相关情况。磋商小组成员拒绝在报告上签字又不书面说明其不同意见和理由的,视为同意评审报告;",
+ "采购代理机构应当在评审结束后2个工作日内将评审报告送采购人确认,采购人应当在收到评审报告后2个工作日内,从评审报告提出的成交候选供应商中,按照排序由高到低的原则确定成交供应商,也可以书面授权磋商小组直接确定成交供应商。采购人逾期未确定成交供应商且不提出异议的,视为确定评审报告提出的排序第一的供应商为成交供应商;",
+ "采购人或者采购代理机构应当在成交供应商确定后2个工作日内,在省级以上财政部门指定的政府采购信息发布媒体上公告成交结果,同时向成交供应商发出成交通知书;",
+ "采购人与成交供应商应当在成交通知书发出之日起30日内,按照磋商文件确定的合同文本以及采购标的、规格型号、采购金额、采购数量、技术和服务要求等事项签订政府采购合同。采购人不得向成交供应商提出超出磋商文件以外的任何要求作为签订合同的条件,不得与成交供应商订立背离磋商文件确定的合同文本以及采购标的、规格型号、采购金额、采购数量、技术和服务要求等实质性内容的协议;",
+ "成交供应商拒绝签订政府采购合同的,采购人将把排名第二的成交候选供应商作为成交供应商并签订政府采购合同(以此类推),也可以重新开展采购活动。拒绝签订政府采购合同的成交供应商不得参加对该项目重新开展的采购活动。"
+ ],
+ "确定成交供应商的标准方法": {
+ "确定成交供应商的标准方法": "详见竞争性磋商文件第六部分“磋商办法”。确定成交供应商的标准方法
详见竞争性磋商文件第六部分“磋商办法”。"
+ }
+ }
+ },
+ "资格审查": {
+ "资格性审查": {
+ "满足《中华人民共和国政府采购法》第二十二条规定": [
+ "具有独立承担民事责任的能力",
+ "具有良好的商业信誉和健全的财务会计制度",
+ "具有履行合同所必需的设备和专业技术能力",
+ "有依法缴纳税收和社会保障资金的良好记录",
+ "参加政府采购活动前三年内,在经营活动中没有重大违法记录",
+ "法律、行政法规规定的其他条件"
+ ],
+ "未被列入“信用中国”网站(www.creditchina.gov.cn)重大税收违法失信主体、“中国执行信息公开网”网站(http://zxgk.court.gov.cn/shixin/)失信被执行人、和“中国政府采购网”网站(www.ccgp.gov.cn)政府采购严重违法失信行为记录名单": "(提供网络截图)",
+ "本项目的特定资格要求": "投标人具有独立法人资格,有相应的经营范围。",
+ "承诺书": "湖北省政府采购供应商信用承诺书",
+ "资格审查内容": "资格性审查内容应为清晰彩色影印件且加盖单位公章",
+ "授权书": "法定代表人身份证明或法定代表人授权委托书(委托代理人需提供劳动合同和社保证明)"
+ },
+ "符合性审查": {
+ "递交的响应文件": "响应性文件递交的正本和副本数量满足竞争性磋商文件要求。",
+ "响应文件": "响应性文件无活页或散页装订。",
+ "文件签章": "响应性文件签字和盖章齐全。",
+ "磋商有效期": "自响应性文件递交截止之日起 90天。",
+ "磋商报价": "供应商所提交的报价表未出现两个或两个以上的不同金额报价。"
+ }
+ },
+ "无效标与废标项": {
+ "否决和无效投标情形": [
+ "供应商应仔细阅读竞争性磋商文件的所有内容,按竞争性磋商文件的要求提供响应磋商文件内容的响应性文件且装订成册(响应性文件不得采用活页或散页装订,必须胶装),并保证所提供的全部资料的真实性、合法性,从而使其响应性文件对竞争性磋商文件做出实质性的响应,否则,其响应性文件将被拒绝。",
+ "供应商应当在磋商文件要求的截止时间前,将响应文件密封送达指定地点。在截止时间后送达的响应文件为无效文件,采购人、采购代理机构或者磋商小组应当拒收。",
+ "响应性文件从响应性文件递交的截止时间起,响应性文件有效期为60天,有效期短于这个规定期限的磋商,将被拒绝。",
+ "响应性文件应对竞争性磋商文件中各项做出实质性响应,否则该磋商将可能被拒绝。",
+ "以上资格性审查、符合性审查未通过的,其响应性文件为无效响应性文件。",
+ "响应性文件应按竞争性磋商文件规定加盖单位公章和供应商法定代表人或授权代表签字或盖章,否则,将被视为无效响应性文件;",
+ "采购拦标价: 人民币 51 万元。
供应商首次报价或最后报价超出本项目公布拦标价的, 按 照无效报价处理。",
+ "响应性文件应严格按照竞争性磋商文件的要求提交,并按规定的统一格式逐项填写,不准有空项;无相应内容可填的项应填写“无”等明确的回答文字,响应性文件未按规定提交,将被视为不完整响应的响应性文件,其响应文件有可能被拒绝;",
+ "在磋商评审期间,供应商试图影响采购单位和磋商小组的任何活动,将导致其报价被拒绝,并承担相应的法律责任。",
+ "份(响应文件封面须明确注明“正本”、“副本”字样)供应商提交的响应文件不符合本款要求的,按照无效响应文件处理。",
+ "供应商任何有选择的报价(首次报价、最后报价)将被拒绝,磋商报价不允许修正和涂改,出现错误或涂改的将以无效报价处理;",
+ "项关于磋商小组可以判定明显不合理,低于个别成本、有降低质量、不能诚信履约的最后报价为无效报价的规定。"
+ ],
+ "废标项": "",
+ "不得存在的情形": [
+ "供应商应仔细阅读竞争性磋商文件的所有内容,按竞争性磋商文件的要求提供响应磋商文件内容的响应性文件且装订成册(响应性文件不得采用活页或散页装订,必须胶装),并保证所提供的全部资料的真实性、合法性,从而使其响应性文件对竞争性磋商文件做出实质性的响应,否则,其响应性文件将被拒绝。",
+ "磋商文件能够详细列明采购标的技术、服务要求的,磋商结束后,磋商小组应当要求所有实质性响应的供应商在规定时间内提交最后报价,提交最后报价的供应商不得少于3家,最后报价是供应商响应文件的有效组成部分;",
+ "在磋商过程中,磋商小组可以根据磋商文件和磋商情况实质性变动采购需求中的技术、服务要求以及合同草案条款,但不得变动磋商文件中的其他内容。",
+ "磋商小组成员和参与评审活动有关的工作人员不得透漏对磋商文件的评审和比较、成交候选人的推荐情况以及与评审有关的其它情况。",
+ "供应商对磋商文件如有疑问,可以在磋商文件规定的询问或质疑截止时间之前,以书面形式(如电子邮件、传真、信件、电报等)向采购代理机构提交“询问函”或“质疑函”。采购代理机构对在此规定时间以前收到的、且需要做出澄清修改的问题,将以电子邮件、传真形式通知所有获取磋商文件的供应商作出澄清解释或补充说明,但不说明问题的来源,答复内容不得涉及商业秘密。",
+ "为确保评审工作顺利进行,磋商小组全体成员应关闭通讯工具;在评审工作结束前,磋商小组全体成员不得单独活动。",
+ "供应商不得以他人名义磋商或者以其他方式弄虚作假,骗取中标;",
+ "澄清、说明或者更正将作为响应性文件内容的一部分。澄清、说明不得超出响应文件的范围或者改变响应性文件的实质性内容。",
+ "在磋商期间,供应商不得向磋商小组成员或有关工作人员询问正在进行的磋商情况,不得进行在影响磋商结果的活动。",
+ "投标人必须据实填写,不得虚假响应,否则将取消其投标或中标资格,并按有关规定进行处罚。",
+ "磋商小组成员不得与任何磋商供应商或与采购结果有利害关系的人私下接触,不得收受磋商供应商、中介人及其它利害关系人的财物或其它好处。",
+ "磋商响应文件递交后,直接授予成交供应商合同止,凡与本次采购有关人员对属于审查、澄清、评价和比较报价的有关资料以及授标意向等,均不得向供应商或其他无关的人员透露。",
+ "在磋商过程中,参加磋商的任何一方不得透露与磋商有关的其他供应商的技术资料、价格和其他信息。",
+ "本项目不允许供应商拟在成交后将成交项目交由他人完成,成交供应商不得采用分包的形式履行合同。"
+ ]
+ },
+ "技术评分": {
+ "技术参数": {
+ "评分": "20分",
+ "要求": "1. 全部满足采购文件技术参数要求的得满分;2. 未带★条款的技术参数:有 1项负偏离的扣 1分,扣完本项得分为止。3. 带★参数及要求有一项不满足或负偏离扣 3分,扣完本项得分为止。"
+ },
+ "实施方案": {
+ "评分": "10分",
+ "要求": "项目组织实施计划完整可行,技术保障措施可靠,能够保证按期供货,项目管理人员配备合理等等,实施方案合理性、先进性、切实可行性综合评审。内容齐全完善、阐述清晰、详尽,有针对性的得 7-10分;内容阐述较清晰、合理可行、有针对性的得 4-6分,一般得 1-3分,不合理不得分。"
+ },
+ "安装调试验收方案": {
+ "评分": "5分",
+ "要求": "根据投标人针对本项目拟有完整且有效的安装调试验收方案,包括但不限于①对相关技术标准的说明、②安装调试验收工作程序安排、③落实措施、④产品安装调试验收的技术指导措施、⑤人员组织安排等内容进行评分:每有一项内容齐全完善、阐述清晰、详尽,有针对性的,得 1分;每有一项内容阐述比较清晰、比较合理可行、有针对性的,得 0.5分;每有一项内容不可行或未提供的,不得分。本项最高得 5分。"
+ },
+ "培训服务方案": {
+ "评分": "5分",
+ "要求": "根据投标人针对本项目拟有完整且有效的培训服务方案,包括但不限于①培训次数(不少于 3次技术培训服务)、②现场培训组织计划、③产品使用维护管理、④培训人员配备方案、⑤技术培训资料清单等内容进行评分:每有一项内容齐全完善、阐述清晰、详尽,有针对性的,得 1分;每有一项内容阐述比较清晰、比较合理可行、有针对性的,得 0.5分;每有一项内容不可行或未提供的,不得分。本项最高得 5分。"
+ }
+ },
+ "商务评分": {
+ "商务评分": {
+ "信誉": {
+ "评分": "2分",
+ "要求": "投标人具有 ISO9001质量管理体系认证且在有效期内得 2分。"
+ },
+ "系统保障": {
+ "评分": "2分",
+ "要求": "对应产品具有《计算机软件著作权登记证书》得 2分。"
+ },
+ "售后服务": {
+ "评分": "5分",
+ "要求": "根据投标人提供的售后服务计划及承诺,售后服务响应时间,故障应急维修方案等进行综合评审。合理得 4-5 分;较合理得 1-3分,不合理不得分。"
+ },
+ "业绩": {
+ "评分": "10分",
+ "要求": "投标人提供 2020年 3月至今类似项目业绩(以合同签订时间为准),每提供一个类似业绩得 2,最高 10分。响应性文件中须提供网页截图、中标通知书及合同,投标时需提供中标通知书及合同原件,否则不得分。"
+ },
+ "标书制作": {
+ "评分": "1分",
+ "要求": "响应性文件有详细目录、评分索引页,目录与有关材料装订顺序对应清晰,查阅方便,规范完整,0-1分。"
+ }
+ },
+ "投标报价评审": {
+ "投标报价": {
+ "评分": "40分",
+ "要求": "价格分采用低价优先法计算,即满足竞争性磋商文件要求且投标价格最低的投标报价为评标基准价,其价格分为满分 40分。其它合格投标人的报价分按:报价分=(评标基准价/投标报价)×40公式计算。"
+ }
+ }
+ }
+}
+ includes = ["基础信息", "资格审查", "商务评分", "技术评分", "无效标与废标项", "投标文件要求", "开评定标流程"]
+ res1,res2,res3=outer_post_processing(combined_data,includes)
+ print(json.dumps(res2,ensure_ascii=False,indent=4))
+
+
diff --git a/flask_app/main/start_up.py b/flask_app/main/start_up.py
index 83ed5ff..8f7c652 100644
--- a/flask_app/main/start_up.py
+++ b/flask_app/main/start_up.py
@@ -12,8 +12,8 @@ from flask_app.main.download import download_file
from flask_app.main.post_processing import outer_post_processing
from flask_app.main.招标文件解析 import engineering_bid_main
from flask_app.货物标.货物标解析main import goods_bid_main
-
-
+from flask_app.货物标.技术要求提取 import get_technical_requirements_main
+from flask_app.货物标.货物标截取pdf import truncate_pdf_main
app = Flask(__name__)
class CSTFormatter(logging.Formatter):
@@ -127,6 +127,47 @@ def validate_request(default_zb_type=1):
return jsonify({'error': 'Invalid zb_type provided'}), 400
return file_url, zb_type
+
+@app.route('/procurement_reqs', methods=['POST'])
+def get_procurement_reqs():
+ logger = g.logger
+ file_url, zb_type = validate_request()
+ if isinstance(file_url, tuple): # Check if the returned value is an error response
+ return file_url
+ try:
+ logger.info("starting parsing url:" + file_url)
+ if zb_type != 2:
+ logger.error(f"Invalid zb_type: {zb_type}. Expected zb_type: 2")
+ return jsonify({
+ 'error': 'Invalid zb_type',
+ 'message': 'This endpoint only supports zb_type 2 (procurement requirements)'
+ }), 400
+ else:
+ response = download_and_process_file_for_procurement(file_url)
+ return jsonify({
+ 'message': 'procurement_reqs processed successfully',
+ 'filename': "filename",
+ 'data': json.dumps(response, ensure_ascii=False)
+ })
+ except Exception as e:
+ logger.error('Exception occurred: ' + str(e)) # 使用全局 logger 记录
+ return jsonify({'error': str(e)}), 500
+
+def download_and_process_file_for_procurement(file_url):
+ logger = g.logger
+ unique_id = g.unique_id
+ output_folder = f"flask_app/static/output/{unique_id}" # 直接使用全局 unique_id 构建路径
+ filename = "ztbfile"
+ downloaded_filename = os.path.join(output_folder, filename)
+ # 下载文件,假设 download_file 函数已正确处理异常并返回文件路径
+ downloaded_filepath, file_type = download_file(file_url, downloaded_filename)
+ if downloaded_filepath is None or file_type == 4:
+ logger.error("Unsupported file type or failed to download file")
+ return None
+ logger.info("Local file path: " + downloaded_filepath)
+ res =get_technical_requirements_main(downloaded_filepath,output_folder)
+ return res
+
@app.route('/little_zbparse',methods=['POST'])
def little_zbparse():
logger=g.logger
@@ -173,7 +214,7 @@ def generate_response(final_json_path):
logger.error('final_json not found at path: ' + final_json_path)
return jsonify({'error': 'final_json not found'}), 404
with open(final_json_path, 'r', encoding='utf-8') as f:
- logger.info('final_json_path:' + final_json_path)
+ logger.info('extracted_info_path:' + final_json_path)
zbparse_data = json.load(f)
json_str = json.dumps(zbparse_data, ensure_ascii=False)
return jsonify({
@@ -292,7 +333,14 @@ def process_and_stream(file_url, zb_type):
output_json_path = os.path.join(output_folder, 'final_result.json')
extracted_info_path=os.path.join(output_folder, 'extracted_result.json')
includes = ["基础信息", "资格审查", "商务评分", "技术评分", "无效标与废标项", "投标文件要求", "开评定标流程"]
- final_result, extracted_info = outer_post_processing(combined_data, includes)
+ final_result, extracted_info,procurement_reqs = outer_post_processing(combined_data, includes)
+
+ procurement_reqs_response={
+ 'message': 'procurement_reqs',
+ 'filename': os.path.basename(downloaded_filepath),
+ 'data': json.dumps(procurement_reqs, ensure_ascii=False)
+ }
+ yield f"data: {json.dumps(procurement_reqs_response, ensure_ascii=False)}\n\n"
try:
with open(extracted_info_path, 'w', encoding='utf-8') as json_file:
diff --git a/flask_app/货物标/基础信息解析main.py b/flask_app/货物标/基础信息解析main.py
index 3dc0aad..a1ef05f 100644
--- a/flask_app/货物标/基础信息解析main.py
+++ b/flask_app/货物标/基础信息解析main.py
@@ -147,14 +147,14 @@ def combine_basic_info(baseinfo_file_path, procurement_file_path):
thread1.start()
# 等待一秒后启动获取采购需求的线程
time.sleep(1)
- # thread2 = threading.Thread(target=fetch_procurement_reqs_thread)
- # thread2.start()
+ thread2 = threading.Thread(target=fetch_procurement_reqs_thread)
+ thread2.start()
# 等待两个线程都完成
thread1.join()
- # thread2.join()
+ thread2.join()
# 合并结果
baseinfo_list += temp_list # temp_list 是一个列表
- # baseinfo_list.append(procurement_reqs) # procurement_reqs 是一个字典
+ baseinfo_list.append(procurement_reqs) # procurement_reqs 是一个字典
aggregated_baseinfo = aggregate_basic_info_goods(baseinfo_list)
return {"基础信息": aggregated_baseinfo}
diff --git a/flask_app/货物标/技术要求提取.py b/flask_app/货物标/技术要求提取.py
index a7ccf8f..c9206a1 100644
--- a/flask_app/货物标/技术要求提取.py
+++ b/flask_app/货物标/技术要求提取.py
@@ -5,7 +5,7 @@ import os
from flask_app.main.多线程提问 import multi_threading
from flask_app.main.通义千问long import qianwen_long, upload_file
from flask_app.main.json_utils import clean_json_string, combine_json_results
-
+from flask_app.货物标.货物标截取pdf import truncate_pdf_main
def generate_key_paths(data, parent_key=''):
key_paths = []
@@ -137,7 +137,11 @@ def test_all_files_in_folder(input_folder, output_folder):
except Exception as e:
print(f"处理文件 {file_path} 时出错: {e}")
-
+def get_technical_requirements_main(file_path,output_folder):
+ truncate_file=truncate_pdf_main(file_path,output_folder,1)[0]
+ file_id=upload_file(truncate_file)
+ res=get_technical_requirements(file_id)
+ return res
if __name__ == "__main__":
# truncate_file="C:\\Users\\Administrator\\Desktop\\货物标\\zboutpub\\广水农商行门禁控制主机及基础验证设备采购项目——磋商文件(定稿)(三次)_procurement.pdf"
truncate_file="D:\\flask_project\\flask_app\\static\\output\\71334d6b-9478-4e4d-abe0-a5cb3100d681\\ztbfile_procurement.pdf"