239 lines
15 KiB
Python
Raw Normal View History

2024-11-01 17:55:26 +08:00
# -*- encoding:utf-8 -*-
import json
import re
def is_numeric_key(key):
# 这个正则表达式匹配由数字、点、括号中的数字或单个字母(小写或大写)组成的字符串,
# 字母后跟数字,或数字后跟字母,单个字母后跟点,但不能是字母-数字-字母的组合
pattern = r'^[\d.]+$|^\(\d+\)$|^\d+$|^[a-zA-Z]$|^[a-zA-Z]\d+$|^\d+[a-zA-Z]$|^[a-zA-Z]\.$'
return re.match(pattern, key) is not None
def contains_number_or_index(key, value):
# 判断值是否是数字或数字字符串
is_number = isinstance(value, (int, float)) or (isinstance(value, str) and value.isdigit())
# 判断键是否包含 "序号"
contains_index = '序号' in key
# 判断值中是否包含数字
contains_digit = isinstance(value, str) and re.search(r'\d+', value)
# 判断值中是否包含中文字符
contains_chinese = isinstance(value, str) and re.search(r'[\u4e00-\u9fff]', value)
# 如果值中包含数字但也有中文字符,则保留(返回 False
if contains_digit and contains_chinese:
return False
# 如果值是数字或包含数字,且不包含中文字符,或者键包含 "序号",返回 True
return is_number or contains_index or contains_digit
def process_dict(data):
2024-10-27 12:08:54 +08:00
"""
2024-11-01 17:55:26 +08:00
递归处理字典将符合条件的键值对进行转换
如果键是数字或特定格式的字符串则将其值放入 'items' 列表中并排序
对于非数字键如果对应的值是列表且列表中只有一个元素则将其展平为单个元素
2024-09-20 18:01:48 +08:00
2024-11-01 17:55:26 +08:00
Args:
data (dict): 输入的字典数据
2024-09-27 15:00:30 +08:00
2024-11-01 17:55:26 +08:00
Returns:
dict list 原始数据类型: 处理后的数据结构
2024-10-28 17:40:02 +08:00
"""
2024-11-01 17:55:26 +08:00
if not isinstance(data, dict):
return data
result = {}
numeric_keys = []
non_numeric_keys = {}
# 分类键为数字键和非数字键
for key, value in data.items():
if is_numeric_key(key):
numeric_keys.append((key, value))
else:
non_numeric_keys[key] = value
# 处理数字键,将其值递归处理后放入 'items' 列表中
if numeric_keys:
def sort_key(item):
key = item[0]
if re.match(r'^\d+$', key): # 纯整数
return (int(key),)
elif re.match(r'^\d+\.\d+$', key): # 单层小数点
return (float(key),)
else: # 多层序号,按字符串处理
2024-11-07 15:46:24 +08:00
try:
return tuple(int(part) for part in key.split('.') if part.isdigit())
except ValueError:
# 处理无法转换的部分,例如返回一个默认值或记录错误
return ()
2024-11-01 17:55:26 +08:00
# 按键排序,确保顺序一致
numeric_keys_sorted = sorted(numeric_keys, key=sort_key)
result['items'] = [process_dict(item[1]) for item in numeric_keys_sorted]
# 处理非数字键
for key, value in non_numeric_keys.items():
if isinstance(value, list):
processed_list = []
for item in value:
if isinstance(item, dict):
# 处理字典中只有一个键值对的情况
if len(item) == 1:
processed_item = process_dict(list(item.values())[0])
else:
processed_item = process_dict(item)
else:
processed_item = process_dict(item)
# 如果处理后的项是只包含一个元素的列表,则展平它
if isinstance(processed_item, list) and len(processed_item) == 1:
processed_item = processed_item[0]
processed_list.append(processed_item)
2024-10-28 17:40:02 +08:00
2024-11-01 17:55:26 +08:00
# 新增逻辑:如果 processed_list 只有一个元素,则将其展平为单个元素
if len(processed_list) == 1:
result[key] = processed_list[0]
else:
result[key] = processed_list
else:
# 如果值不是列表,直接递归处理
result[key] = process_dict(value)
2024-10-28 17:40:02 +08:00
2024-11-01 17:55:26 +08:00
# 如果结果只有一个键 'items',则直接返回 'items' 列表
if len(result) == 1 and 'items' in result:
return result['items']
2024-10-28 17:40:02 +08:00
2024-11-01 17:55:26 +08:00
# 检查如果所有键对应的值都是空列表,则将键名转换成列表项
if all(isinstance(v, list) and not v for v in result.values()):
return list(result.keys())
2024-10-28 17:40:02 +08:00
2024-11-01 17:55:26 +08:00
return result
2024-11-07 15:46:24 +08:00
def preprocess_dict(data):
if isinstance(data, dict):
if len(data) > 1:
# 检查是否所有值都是 "" 或 "/"
if all(v == "" or v == "/" or (isinstance(v, list) and not v) for v in data.values()):
return list(data.keys())
else:
processed = {}
for k, v in data.items():
if not contains_number_or_index(k, v):
processed_v = preprocess_dict(v)
if processed_v != "": # 只添加非空值
processed[k] = processed_v
return processed
else:
return {k: preprocess_dict(v) for k, v in data.items()}
elif isinstance(data, list):
return [preprocess_dict(item) for item in data]
else:
return data
2024-10-28 17:40:02 +08:00
data={
2024-11-07 15:46:24 +08:00
"符合性审查": {
"1": {
"投标报价": {
"审查内容": "1投标报价没有超过项目采购包预算金额或最高限价\n2投标报价不存在缺项、漏项。"
}
},
"2": {
"投标文件签署": {
"审查内容": "按照招标文件要求签署、盖章。"
}
},
"3": {
"强制采购节能产品": {
"审查内容": "依据财库[2019]9号文的规定如属于强制节能产品须提供国家确定的认证机构出具的、处于有效期内的节能产品认证证书或中国政府采购网节能产品查询截图未提供的视为无效响应认证证书或查询截图的产品型号与所投产品不一致的视为未提供"
}
},
"4": {
"进口产品": {
"审查内容": "招标文件不接受进口产品投标时,投标人所投产品不是通过中国海关报关验放进入中国境内且产自关境外的。"
}
},
"5": {
"实质性要求": {
"审查内容": "1满足招标文件第三章“项目采购需求”中要求的实质性条款\n2投标有效期满足招标文件要求\n3没有采购人不能接受的附加条件。"
}
},
"6": {
"围标串标情形": {
"审查内容": "投标人不存在下列任一情形:\n1不同投标人的投标文件由同一单位或者个人编制\n2不同投标人委托同一单位或者个人办理投标事宜\n3不同投标人的投标文件载明的项目管理成员或者联系人员为同一人\n4不同投标人的投标文件异常一致或者投标报价呈规律性差异\n5不同投标人的投标文件相互混装\n6不同投标人使用同一电脑机器特征值一致如 MAC地址等或使用同一电子密钥编制或上传电子投标文件。"
}
},
"7": {
"其他无效情形": {
"审查内容": "不存在法律、法规和招标文件规定的其他无效投标情形。"
}
}
},
"资格性审查": {
"1": {
"资格要求": "具有独立承担民事责任的能力",
"审查内容": "法人或者其他组织的营业执照等证明文件自然人的身份证明。1企业应提供“营业执照” 2事业单位应提供“事业单位法人证书” 3非企业专业服务机构应提供执业许可证等证明文件 4个体工商户应提供“个体工商户营业执照” 5自然人应提供自然人身份证明。"
},
"2": {
"资格要求": "具有良好的商业信誉和健全的财务会计制度",
"审查内容": "由投标人对以下内容提供书面承诺或声明或提供相应证明材料。1投标人是法人的应具有上一年度__ 年度或_____年度经审计的财务报告或其基本开户银行出具的资信证明。其他组织和自然人没有经审计的财务报告应具有银行出具的资信证明。2有专业担保机构对投标人进行资信审查后出具投标担保函的可以不用具备经审计的财务报告和银行资信证明文件。"
},
"3": {
"资格要求": "具有履行合同所必需的设备和专业技术能力",
"审查内容": "由投标人提供书面承诺或声明,或提供相应证明材料。"
},
"4": {
"资格要求": "有依法缴纳税收和社会保障资金的良好记录",
"审查内容": "由投标人对以下内容提供书面承诺或声明或提供相应证明材料。1投标人依法缴纳税收本项目公告发布时间前 12个月内至少有 1个月缴纳税收的凭据完税证、缴款书、印花税票、银行代扣代缴转账凭证等均可 2投标人依法缴纳社会保障资金本项目公告发布时间前 12个月内至少有 1个月缴纳社会保险的凭据专用收据或社会保险交纳清单 3投标人为其他组织或自然人的也应满足以上要求 4递交投标文件截止时间的当月成立但因税务机关原因导致其尚未依法缴纳税收的投标人提供将依法缴纳税收承诺书原件格式自拟该承诺书视同税收缴纳凭据 5递交投标文件截止时间的当月成立但因社会保障资金管理机关原因导致其尚未依法缴纳社会保障资金的投标人提供将依法缴纳社会保障资金承诺书原件格式自拟该承诺书视同社会保险凭据 6依法免税或不需要缴纳社会保障资金的投标人具有相应文件证明其依法免税或不需要交纳社会保障资金。"
},
"5": {
"资格要求": "参加政府采购活动前三年内,在经营活动中没有重大违法记录",
"审查内容": "由投标人提供书面承诺或声明,或提供相应证明材料。"
},
"6": {
"资格要求": "法律、行政法规规定的其他条件",
"审查内容": "由投标人提供书面承诺或声明,或提供相应证明材料。"
},
"7": {
"资格要求": "单位负责人为同一人或者存在直接控股、管理关系的不同投标人,不得参加本项目同一合同项下的政府采购活动",
"审查内容": "由投标人在《投标函》中声明"
},
"8": {
"资格要求": "为本采购项目提供整体设计、规范编制或者项目管理、监理、检测等服务的,不得再参加本项目的其他招标采购活动。",
"审查内容": "由投标人在《投标函》中声明"
},
"9": {
"资格要求": "未被列入失信被执行人、“重大税收违法失信主体”,未被列入政府采购严重违法失信行为记录名单。",
"审查内容": "以采购人和采购代理机构在投标截止日在 “信用中国”网站www.creditchina.gov.cn 及中国政府采购网(www.ccgp.gov.cn)查询的投标人参加政府采购活动前三年内的结果为准 (采购人和采购代理机构对信用信息查询记录和证据截图或下载存档)。"
},
"10": {
"资格要求": "落实政府采购政策需满足的资格要求",
"审查内容": "☐支持中小企业发展资格要求:提供《中小企业声明函》,本项目投标人属于监狱企业或者残疾人福利性单位的,同时提供监狱企业证明材料或者《残疾人福利性单位声明函》; ☑其他政府采购政策需满足的资格要求:/"
},
"11": {
"资格要求": "本项目的特定资格要求",
"审查内容": "详见第一章“投标邀请”投标人特定资格要求。"
}
},
"申请人资格要求": [
"1.满足《中华人民共和国政府采购法》第二十二条规定,即:",
"1具有独立承担民事责任的能力",
"2具有良好的商业信誉和健全的财务会计制度",
"3具有履行合同所必需的设备和专业技术能力",
"4有依法缴纳税收和社会保障资金的良好记录",
"5参加政府采购活动前三年内在经营活动中没有重大违法记录",
"2.未被列入失信被执行人、“重大税收违法失信主体”,未被列入政府采购严重违法失信行为记录名单。",
"3.落实政府采购政策需满足的资格要求:无",
"4.投标人特定资格要求:",
"1投标人须在中国工商行政管理机关注册登记并取得营业执照具有独立承担民事责任的能力。",
"2投标人须提供近三年完整的财务审计报告成立未满三年的提供自成立之日起至今的财务审计报告成立未满一年的提供银行资信证明以及近 6个月由税务部门出具的纳税证明材料零申报提供零申报证明如有减、免、缓交的须提供相应证明材料和社保缴纳证明",
"3投标人须出具在参加本项目投标活动前三年内在经营活动中无重大违法记录且遵守有关的国家法律、法令、条例和政府采购有关制度一旦参加投标则应承担相关法律责任的承诺函",
"4投标截止时间前有相关任何一条以下不良记录及重大违法记录政府采购法第二十二条第一款第五项所称重大违法记录是指供应商因违法经营受到刑事处罚或责令停产停业、吊销许可证或执照、较大数额罚款等行政处罚。的供应商将被拒绝",
"①在信用中国网站http://www.creditchina.gov.cn )查询“失信被执行人”和“重大税收违法失信主体”和“政府采购严重违法失信行为记录名单”的加盖公司公章的证明材料;",
"②中国政府采购网http://www.ccgp.gov.cn/cr/list查询“政府采购严重违法失信行为信息记录”的加盖公司公章的截图证明材料",
"③国家企业信用信息公示系统 http://www.gsxt.gov.cn/corp-query-homepage.html )查询“行政处罚信息”、“列入经营异常名录信息”、“列入严重违法失信企业名单(黑名单)信息”的加盖公司公章的证明材料;",
"5提供“中国裁判文书网”近三年内参与投标的供应商企业、法定代表人在经营活动中没有行贿犯罪记录查询函公告发布起查询网上自查加盖公章"
]
2024-10-28 17:40:02 +08:00
}
2024-11-07 15:46:24 +08:00
# print(json.dumps(data,ensure_ascii=False,indent=4))
res1=preprocess_dict(data)
# print(json.dumps(res1,ensure_ascii=False,indent=4))
res2=process_dict(res1)
print(json.dumps(res2,ensure_ascii=False,indent=4))