上传代码

This commit is contained in:
chentianrui
2025-09-08 17:58:02 +08:00
parent be848c3e78
commit f5f26c5cf8
76 changed files with 839039 additions and 2695 deletions
+89 -22
View File
@@ -6,32 +6,89 @@ import uuid
def _determine_project_type(data):
"""
根据division字段判断工程类型
:param data: 项目数据
:return: 主网, 配网, 技改
根据basicData中的"软件类别""软件名称"判断工程类型
:param data: 项目数据,包含 basicData 字段
:return: 主网, 配网, 技改;如果无法匹配则返回 None
"""
# 软件类别名称映射字典,将各种变体映射到标准类别
CATEGORY_MAPPING = {
# 主网及其变体
"主网": "主网",
"主网工程": "主网",
"主网项目": "主网",
# 配网及其变体
"配网": "配网",
"配网造价": "配网",
"配网清单": "配网",
# 技改及其变体
"技改": "技改",
"技改工程": "技改",
"技改项目": "技改",
"技改造价": "技改",
"技改清单": "技改",
}
# 尝试从数据中获取division字段
division = None
if "division" in data:
division = data["division"]
# 获取 basicData
basic_data = data.get("basicData") or {}
# 如果找到division字段
if division:
# 去掉"主网-"前缀
if "-" in division:
division_type = division.split("-")[0]
else:
division_type = division
# 尝试获取 "软件类别",若不存在则尝试获取 "软件名称"
category = basic_data.get("软件类别") or basic_data.get("软件名称")
if division_type in ["主网", "主网线路"]:
return "主网"
elif division_type in ["配网", "配网造价", "配网清单"]:
return "配网"
elif division_type in ["技改", "技改造价", "技改清单"]:
return "技改"
if not category:
return None
return None
# 去除前后空格并查找映射
category = category.strip()
return CATEGORY_MAPPING.get(category)
# 新增:按工程类型为 projectData.projectInfo 增补键值对的映射与函数
# 可按需扩展不同工程类型需要自动补充的字段
PROJECT_INFO_ADDITIONS = {
# 主网:如需新增字段,请在此处补充,示例:"示例字段": "" 或默认值
"主网": {
# 在此处按需添加主网专属字段,例如:
# "主网示例字段": ""
},
# 配网:如需新增字段,请在此处补充
"配网": {
# "配网示例字段": ""
},
# 技改:需求示例——同时支持以下两个字段,缺哪个补哪个
"技改": {
"建筑材机按系数调差": "",
"建筑修缮材机按系数调差": "",
},
}
def add_project_info_fields(data):
"""
根据工程类型(主网/配网/技改),为 data["projectData"]["projectInfo"] 增补字段。
- 若 projectInfo 不存在则创建。
- 仅在键不存在时补充,不覆盖已有值。
"""
try:
project_type = _determine_project_type(data)
except Exception:
project_type = None
if not project_type:
return
additions = PROJECT_INFO_ADDITIONS.get(project_type) or {}
if not additions:
return
project_data = data.setdefault("projectData", {})
project_info = project_data.get("projectInfo")
if not isinstance(project_info, dict):
project_info = {}
project_data["projectInfo"] = project_info
for k, v in additions.items():
if k not in project_info:
project_info[k] = v
def transform_expense_preview(input_file, output_file):
@@ -235,6 +292,9 @@ def transform_expense_preview(input_file, output_file):
# 更新data中的expensePreview
data["projectData"]["expensePreview"] = new_expense_preview
# 新增:按工程类型为 projectInfo 补充字段
add_project_info_fields(data)
# 保存转换后的文件
print(f"正在保存文件: {output_file}")
with open(output_file, "w", encoding="utf-8") as f:
@@ -572,6 +632,10 @@ def transform_json_types(input_file_path, output_file_path=None):
if device_type in device_type_mapping:
obj["设备类型"] = device_type_mapping[device_type]
# 若节点存在“类型”但没有“type”,则补充一个“type”属性,其值等于当前“类型”的值
if "类型" in obj and "type" not in obj:
obj["type"] = obj["类型"]
# 递归处理所有值
for value in obj.values():
traverse(value)
@@ -582,6 +646,9 @@ def transform_json_types(input_file_path, output_file_path=None):
# 执行转换
traverse(data)
# 新增:按工程类型为 projectInfo 补充字段
add_project_info_fields(data)
# 确定输出路径
if output_file_path is None:
output_file_path = input_file_path
@@ -731,5 +798,5 @@ if __name__ == "__main__":
# traceback.print_exc()
# 批量处理目录
json_directory = "project2json/outputs/json"
json_directory = "data/output/json"
process_directory(json_directory)