|
|
@ -1734,9 +1734,9 @@ class DataStdService: |
|
|
|
|
|
|
|
:return: 用户导入模板excel的二进制数据 |
|
|
|
""" |
|
|
|
header_list = ['标准归属', '来源系统', '标准编号', '标准中文名', '标准英文名', '标准业务定义', '标准类型', '标准来源', '数据类别', '标准业务定义', '安全等级', '代码编号', '业务认则部门', '业务认则人员', '技术认则部门', '技术认则人员'] |
|
|
|
header_list = ['标准归属', '来源系统', '标准编号', '标准中文名', '标准英文名', '标准业务定义', '标准类型', '标准来源', '数据类别', '标准业务定义', '安全等级', '代码编号', '标准目录','业务认则部门', '业务认则人员', '技术认则部门', '技术认则人员'] |
|
|
|
selector_header_list = ['标准归属', '标准类型',"标准来源"] |
|
|
|
option_list = [{'标准归属': ['公司级', '系统级']}, {'标准类型': ['基础数据', '指标数据']}, {'标准来源': ['行业标准', '自建标准']}] |
|
|
|
option_list = [{'标准归属': ['公司级', '系统级']}, {'标准类型': ['基础数据', '指标数据']}, {'标准来源': ['行业标准', '自建标准','自建标准-智能']}] |
|
|
|
binary_data = get_excel_template( |
|
|
|
header_list=header_list, selector_header_list=selector_header_list, option_list=option_list |
|
|
|
) |
|
|
@ -1800,10 +1800,12 @@ class DataStdService: |
|
|
|
'数据类别': 'data_category', |
|
|
|
'安全等级': 'security_level', |
|
|
|
'代码编号': 'code_no', |
|
|
|
'标准目录': 'std_dir', |
|
|
|
'业务认则部门': 'biz_dept', |
|
|
|
'业务认则人员': 'biz_person', |
|
|
|
'技术认则部门': 'tech_dept', |
|
|
|
'技术认则人员': 'tech_person', |
|
|
|
|
|
|
|
} |
|
|
|
df.rename(columns=header_dict, inplace=True) |
|
|
|
# ds系统列表 |
|
|
@ -1824,7 +1826,29 @@ class DataStdService: |
|
|
|
# 获取来源系统字段 |
|
|
|
input_src_sys = row.get("std_source_system") |
|
|
|
matched_source = next((ds for ds in data_tree_result if ds.name == input_src_sys or str(ds.id) == str(input_src_sys)), None) |
|
|
|
|
|
|
|
# === 获取标准目录树 === |
|
|
|
catalog_result = await cls.get_catalog_list_services(query_db, query_object=None, user_id=current_user.user.user_id, is_page=True) |
|
|
|
|
|
|
|
# 将目录树展开成 { "一级目录/二级目录": contentOnum } 结构 |
|
|
|
def build_catalog_mapping(node, path="", mapping=None): |
|
|
|
if mapping is None: |
|
|
|
mapping = {} |
|
|
|
current_path = f"{path}/{node['contentName']}" if path else node['contentName'] |
|
|
|
mapping[current_path] = node['contentOnum'] |
|
|
|
for child in node.get("children", []): |
|
|
|
build_catalog_mapping(child, current_path, mapping) |
|
|
|
return mapping |
|
|
|
|
|
|
|
catalog_mapping = build_catalog_mapping(catalog_result.rows[0]) |
|
|
|
# === 处理标准目录 === |
|
|
|
input_dir = row.get("std_dir") |
|
|
|
if not input_dir or str(input_dir).strip() == "": |
|
|
|
belt_content_onum = 2 |
|
|
|
else: |
|
|
|
input_dir = input_dir.strip() |
|
|
|
if input_dir not in catalog_mapping: |
|
|
|
raise HTTPException(status_code=400, detail=f"第 {idx + 2} 行导入失败,标准目录 [{input_dir}] 不存在") |
|
|
|
belt_content_onum = catalog_mapping[input_dir] |
|
|
|
# 如果能匹配到系统,则使用 id;否则判断是否为空 |
|
|
|
if matched_source: |
|
|
|
src_sys_id = matched_source.id |
|
|
@ -1832,7 +1856,10 @@ class DataStdService: |
|
|
|
src_sys_id = 10000 |
|
|
|
else: |
|
|
|
raise HTTPException(status_code=400, detail=f"第 {idx + 2} 行导入失败,来源系统 [{input_src_sys}] 不存在") |
|
|
|
|
|
|
|
def safe_str(val): |
|
|
|
if pd.isna(val): |
|
|
|
return "" |
|
|
|
return str(val).strip() |
|
|
|
# 如果存在,使用对应 onum 作为 cdId |
|
|
|
cd_id = matched_code.onum if matched_code else None |
|
|
|
vo = DataStdMainModel( |
|
|
@ -1847,11 +1874,11 @@ class DataStdService: |
|
|
|
dataClas=row.get('data_category'), |
|
|
|
dataSecLvl=str(row.get('security_level')), |
|
|
|
cdId=cd_id, |
|
|
|
dataStdBusiOwnershipDept=row.get('biz_dept'), |
|
|
|
dataStdBusiOwnershipPrsn=row.get('biz_person'), |
|
|
|
dataStdItOwnershipDept=row.get('tech_dept'), |
|
|
|
dataStdItOwnershipPrsn=row.get('tech_person'), |
|
|
|
beltDataStdContent=2, # 固定值 |
|
|
|
dataStdBusiOwnershipDept=safe_str(row.get('biz_dept')), |
|
|
|
dataStdBusiOwnershipPrsn=safe_str(row.get('biz_person')), |
|
|
|
dataStdItOwnershipDept=safe_str(row.get('tech_dept')), |
|
|
|
dataStdItOwnershipPrsn=safe_str(row.get('tech_person')), |
|
|
|
beltDataStdContent=belt_content_onum, # 固定值 |
|
|
|
) |
|
|
|
except Exception as ve: |
|
|
|
raise HTTPException(status_code=400, detail=f"第 {idx + 2} 行数据校验失败: {ve}") |
|
|
@ -1864,7 +1891,6 @@ class DataStdService: |
|
|
|
model = DataStdMainModel(**vo.model_dump(exclude_unset=True, by_alias=True)) |
|
|
|
model.create_by = current_user.user.user_name |
|
|
|
model.std_status = "1" |
|
|
|
model.belt_data_std_content = 2 |
|
|
|
model.create_time = datetime.now() |
|
|
|
|
|
|
|
if exist_model: |
|
|
|