diff --git a/vue-fastapi-backend/module_admin/controller/datastd_controller.py b/vue-fastapi-backend/module_admin/controller/datastd_controller.py
index a27c742..5ca8c28 100644
--- a/vue-fastapi-backend/module_admin/controller/datastd_controller.py
+++ b/vue-fastapi-backend/module_admin/controller/datastd_controller.py
@@ -871,4 +871,11 @@ async def export_std_dict_template(request: Request, query_db: AsyncSession = De
dict_import_template_result = await DataStdService.get_dict_import_template_services()
logger.info('获取成功')
- return ResponseUtil.streaming(data=bytes2file_response(dict_import_template_result))
\ No newline at end of file
+ return ResponseUtil.streaming(data=bytes2file_response(dict_import_template_result))
+@datastdController.post("/stdmain/saveStdStatus")
+async def save_tsmcb(request: Request,
+ saveSscfModel: DataStdMainModel,
+ query_db: AsyncSession = Depends(get_db),
+ current_user: CurrentUserModel = Depends(LoginService.get_current_user)):
+ result = await DataStdService.edit_std_main_status(query_db, saveSscfModel)
+ return ResponseUtil.success(msg=result.message)
\ No newline at end of file
diff --git a/vue-fastapi-backend/module_admin/dao/metadata_config_dao.py b/vue-fastapi-backend/module_admin/dao/metadata_config_dao.py
index d27b2f3..4b1c833 100644
--- a/vue-fastapi-backend/module_admin/dao/metadata_config_dao.py
+++ b/vue-fastapi-backend/module_admin/dao/metadata_config_dao.py
@@ -13,7 +13,7 @@ from sqlalchemy.sql import true
from utils.page_util import PageUtil
from module_admin.entity.vo.data_ast_content_vo import DataCatalogPageQueryModel, DeleteDataCatalogModel, \
DataCatalogChild
-from sqlalchemy import delete, select, update, desc, or_, not_, and_
+from sqlalchemy import delete, select, update, desc, or_, not_, and_,func
from exceptions.exception import ServiceException,ServiceWarning
class MetadataConfigDao:
@@ -159,18 +159,55 @@ class MetadataConfigDao:
result = await db.execute(select(SecuBizConfig).where(SecuBizConfig.onum == onum))
return result.scalars().first()
+ # @classmethod
+ # async def get_biz_config_list(cls, db: AsyncSession, query_object, is_page: bool = False):
+ # query = select(SecuBizConfig).where(
+ # SecuBizConfig.risk_lvl.like(f"%{query_object.risk_lvl}%") if query_object.risk_lvl else True,
+ # SecuBizConfig.isStop == query_object.isStop if query_object.isStop is not None else True,
+ # SecuBizConfig.create_time.between(
+ # datetime.combine(datetime.strptime(query_object.begin_time, '%Y-%m-%d'), time.min),
+ # datetime.combine(datetime.strptime(query_object.end_time, '%Y-%m-%d'), time.max),
+ # ) if query_object.begin_time and query_object.end_time else True,
+ # ).order_by(SecuBizConfig.create_time.desc())
+
+ # from utils.page_util import PageUtil
+ # return await PageUtil.paginate(db, query, query_object.page_num, query_object.page_size, is_page)
@classmethod
async def get_biz_config_list(cls, db: AsyncSession, query_object, is_page: bool = False):
- query = select(SecuBizConfig).where(
- SecuBizConfig.risk_lvl.like(f"%{query_object.risk_lvl}%") if query_object.risk_lvl else True,
- SecuBizConfig.isStop == query_object.isStop if query_object.isStop is not None else True,
- SecuBizConfig.create_time.between(
- datetime.combine(datetime.strptime(query_object.begin_time, '%Y-%m-%d'), time.min),
- datetime.combine(datetime.strptime(query_object.end_time, '%Y-%m-%d'), time.max),
- ) if query_object.begin_time and query_object.end_time else True,
- ).order_by(SecuBizConfig.create_time.desc())
+ # === 副表数量子查询 ===
+ subquery = (
+ select(
+ SecuBizConfigRela.biz_onum.label("biz_onum"),
+ func.count(SecuBizConfigRela.onum).label("rela_count")
+ )
+ .group_by(SecuBizConfigRela.biz_onum)
+ .subquery()
+ )
- from utils.page_util import PageUtil
+ # === 主查询,LEFT JOIN 子查询 ===
+ query = (
+ select(
+ SecuBizConfig.biz_name,
+ SecuBizConfig.onum,
+ SecuBizConfig.risk_lvl,
+ SecuBizConfig.update_by,
+ SecuBizConfig.update_time,
+ SecuBizConfig.isStop,
+ SecuBizConfig.create_by,
+ SecuBizConfig.create_time,
+ func.coalesce(subquery.c.rela_count, 0).label("rela_count") # 无关联时为 0
+ )
+ .outerjoin(subquery, SecuBizConfig.onum == subquery.c.biz_onum)
+ .where(
+ SecuBizConfig.risk_lvl.like(f"%{query_object.risk_lvl}%") if query_object.risk_lvl else True,
+ SecuBizConfig.isStop == query_object.isStop if query_object.isStop is not None else True,
+ SecuBizConfig.create_time.between(
+ datetime.combine(datetime.strptime(query_object.begin_time, '%Y-%m-%d'), time.min),
+ datetime.combine(datetime.strptime(query_object.end_time, '%Y-%m-%d'), time.max),
+ ) if query_object.begin_time and query_object.end_time else True,
+ )
+ .order_by(SecuBizConfig.create_time.desc())
+ )
return await PageUtil.paginate(db, query, query_object.page_num, query_object.page_size, is_page)
@classmethod
diff --git a/vue-fastapi-backend/module_admin/service/datastd_service.py b/vue-fastapi-backend/module_admin/service/datastd_service.py
index 15e34a5..0e20de1 100644
--- a/vue-fastapi-backend/module_admin/service/datastd_service.py
+++ b/vue-fastapi-backend/module_admin/service/datastd_service.py
@@ -1257,6 +1257,16 @@ class DataStdService:
else:
raise ServiceException(message=f'标准 {model.onum} 不存在')
@classmethod
+ async def edit_std_main_status(cls, query_db: AsyncSession, model: DataStdMainModel):
+ existing = await cls.get_std_main_by_id(query_db, model.onum)
+ if existing:
+ existing.std_status=model.std_status
+ await DataStdDao.update_std_main(query_db, existing)
+ await query_db.commit()
+ return CrudResponseModel(is_success=True, message='编辑标准成功')
+ else:
+ raise ServiceException(message=f'标准 {model.onum} 不存在')
+ @classmethod
async def add_std_main_appr(cls, query_db: AsyncSession, model: DataStdMainModel):
if not await cls.check_std_num_unique(query_db, model):
raise ServiceException(message=f"标准编号 {model.data_std_no} 已存在")
@@ -1767,15 +1777,19 @@ class DataStdService:
file: UploadFile,
current_user: CurrentUserModel
):
+ """
+ 批量导入标准信息
+ """
# Step 1: 读取 Excel
content = await file.read()
try:
df = pd.read_excel(io.BytesIO(content))
except Exception:
raise HTTPException(status_code=400, detail="Excel 文件解析失败")
-
+
if df.empty:
raise HTTPException(status_code=400, detail="导入文件内容为空")
+
std_type_mapping = {
'基础数据': '0',
'指标数据': '1'
@@ -1784,10 +1798,11 @@ class DataStdService:
'公司级': 'company',
'系统级': 'sys'
}
+
# 获取全量标准代码
std_code_list = await DataStdDao.get_std_code_list_all(query_db)
-
- # Step 2: 表头映射(中文转英文字段名)
+
+ # Step 2: 表头映射
header_dict = {
'标准归属': 'data_std_vest',
'来源系统': 'std_source_system',
@@ -1805,104 +1820,137 @@ class DataStdService:
'业务认责人员': 'biz_person',
'技术认责部门': 'tech_dept',
'技术认责人员': 'tech_person',
-
}
df.rename(columns=header_dict, inplace=True)
- # ds系统列表
- data_tree_result = await MetataskService.get_data_source_tree( request,current_user)
-
+
+ # 获取 DS 系统列表
+ data_tree_result = await MetataskService.get_data_source_tree(request, current_user)
+
# Step 3: 生成统一 flowId
batch_flow_id = str(uuid.uuid4())
-
+
+ # 统一字符串清洗函数
+ def safe_str(val):
+ if pd.isna(val):
+ return ""
+ return str(val).strip()
+
try:
for idx, row in df.iterrows():
- # VO 数据校验
try:
- input_code_no = row.get('code_no')
- matched_code = next((item for item in std_code_list if item.cd_no == input_code_no), None)
-
- if input_code_no and not matched_code:
- raise HTTPException(status_code=400, detail=f"第 {idx + 2} 行导入失败,代码编号 [{input_code_no}] 在系统中不存在")
- # 获取来源系统字段
- 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
- elif not input_src_sys or str(input_src_sys).strip() == "":
- 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(
- dataStdVest=std_vest_mapping.get(row.get('data_std_vest'), 'company'), # 默认转为 'company',
- srcSys=src_sys_id,
- dataStdNo=row.get('data_std_no'),
- dataStdCnName=row.get('std_name_zh'),
- dataStdEngName=row.get('std_name_en'),
- dataStdBusiDefn=row.get('std_definition'),
- dataStdType=std_type_mapping.get(row.get('std_type'), '1'), # 默认转为 '1',
- dataStdSrc=row.get('std_source'),
- dataClas=row.get('data_category'),
- dataSecLvl=str(row.get('security_level')),
- cdId=cd_id,
- 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, # 固定值
- )
+ # === 基础字段取值 ===
+ input_code_no = safe_str(row.get('code_no'))
+ input_src_sys = safe_str(row.get('std_source_system'))
+ input_std_vest = safe_str(row.get('data_std_vest'))
+ input_std_type = safe_str(row.get('std_type'))
+ input_dir = safe_str(row.get('std_dir'))
+ input_data_std_no = safe_str(row.get('data_std_no'))
+ input_std_name_zh = safe_str(row.get('std_name_zh'))
+ input_std_name_en = safe_str(row.get('std_name_en'))
+ input_std_definition = safe_str(row.get('std_definition'))
+ input_std_source = safe_str(row.get('std_source'))
+ input_data_category = safe_str(row.get('data_category'))
+ input_security_level = safe_str(row.get('security_level'))
+ input_biz_dept = safe_str(row.get('biz_dept'))
+ input_biz_person = safe_str(row.get('biz_person'))
+ input_tech_dept = safe_str(row.get('tech_dept'))
+ input_tech_person = safe_str(row.get('tech_person'))
+
+ # === 校验标准代码编号 ===
+ matched_code = next(
+ (item for item in std_code_list if item.cd_no == input_code_no),
+ None
+ )
+ if input_code_no and not matched_code:
+ raise HTTPException(status_code=400, detail=f"第 {idx + 2} 行导入失败:代码编号 [{input_code_no}] 在系统中不存在")
+
+ # === 来源系统匹配 ===
+ matched_source = next(
+ (ds for ds in data_tree_result if ds.name == input_src_sys or str(ds.id) == 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
+ )
+
+ # 构建目录映射
+ 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])
+
+ # === 处理标准目录 ===
+ if not input_dir:
+ belt_content_onum = 2
+ else:
+ 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
+ elif not input_src_sys:
+ src_sys_id = 10000
+ else:
+ raise HTTPException(status_code=400, detail=f"第 {idx + 2} 行导入失败:来源系统 [{input_src_sys}] 不存在")
+
+ # === cdId ===
+ cd_id = matched_code.onum if matched_code else None
+
+ # === 构造 VO ===
+ vo = DataStdMainModel(
+ dataStdVest=std_vest_mapping.get(input_std_vest, 'company'),
+ srcSys=src_sys_id,
+ dataStdNo=input_data_std_no,
+ dataStdCnName=input_std_name_zh,
+ dataStdEngName=input_std_name_en,
+ dataStdBusiDefn=input_std_definition,
+ dataStdType=std_type_mapping.get(input_std_type, '1'),
+ dataStdSrc=input_std_source,
+ dataClas=input_data_category,
+ dataSecLvl=input_security_level,
+ cdId=cd_id,
+ dataStdBusiOwnershipDept=input_biz_dept,
+ dataStdBusiOwnershipPrsn=input_biz_person,
+ dataStdItOwnershipDept=input_tech_dept,
+ dataStdItOwnershipPrsn=input_tech_person,
+ beltDataStdContent=belt_content_onum,
+ )
+
except Exception as ve:
- raise HTTPException(status_code=400, detail=f"第 {idx + 2} 行数据校验失败: {ve}")
-
- # 构造查询对象并检查是否存在
+ raise HTTPException(status_code=400, detail=f"第 {idx + 2} 行数据校验失败:{ve}")
+
+ # === 查询是否存在 ===
query_obj = DataStdMainModel(dataStdNo=vo.data_std_no)
exist_model = await DataStdDao.get_data_main_by_info(query_db, query_obj)
-
- # 构造审批模型(无论新增/修改)
+
+ # === 构造审批模型 ===
model = DataStdMainModel(**vo.model_dump(exclude_unset=True, by_alias=True))
model.create_by = current_user.user.user_name
model.std_status = "1"
model.create_time = datetime.now()
-
+
if exist_model:
- # === 修改审批逻辑 ===
- # 标准正在审批中则抛错
+ # 修改审批逻辑
wating_list = await DataStdDao.check_std_main_waiting(exist_model.onum, query_db)
if wating_list:
raise ServiceException(message=f"第 {idx + 2} 行数据标准正在审批中,请等待审批完成")
-
+
last_appr = await DataStdDao.get_last_std_main_appr_by_id(query_db, exist_model.onum)
model.onum = exist_model.onum
-
+
appr_model = DataStdMainApprModel(**model.model_dump(exclude_unset=True, by_alias=True))
appr_model.changeType = "edit"
appr_model.onum = str(uuid.uuid4())
@@ -1911,33 +1959,31 @@ class DataStdService:
appr_model.approStatus = "waiting"
appr_model.flowId = batch_flow_id
else:
- # === 新增审批逻辑 ===
+ # 新增审批逻辑
model.onum = str(uuid.uuid4())
appr_model = DataStdMainApprModel(**model.model_dump(exclude_unset=True, by_alias=True))
appr_model.changeType = "add"
appr_model.compareId = model.onum
appr_model.oldInstId = model.onum
- appr_model.oldInstId = model.onum
appr_model.approStatus = "waiting"
appr_model.flowId = batch_flow_id
-
+
# 保存审批数据
await DataStdDao.add_std_main_appr(query_db, appr_model)
-
- # 全部处理完成后统一发起审批流程
+
+ # === 批量发起审批 ===
apply_model = ApplyModel()
apply_model.businessType = "dataStdMain"
apply_model.businessId = batch_flow_id
apply_model.applicant = current_user.user.user_name
await ApprovalService.apply_services(query_db, apply_model, 'dataStdMain')
-
+
await query_db.commit()
return CrudResponseModel(is_success=True, message="批量导入标准成功")
-
+
except Exception as e:
await query_db.rollback()
- raise ServiceException(message=f"导入失败:{str(e)}")
-
+ raise ServiceException(message=f"导入失败:{str(e)}")
@classmethod
async def batch_import_dict_services(
cls,
@@ -1946,15 +1992,19 @@ class DataStdService:
file: UploadFile,
current_user: CurrentUserModel
):
+ """
+ 批量导入数据字典服务
+ """
# Step 1: 读取 Excel
content = await file.read()
try:
df = pd.read_excel(io.BytesIO(content))
except Exception:
raise HTTPException(status_code=400, detail="Excel 文件解析失败")
-
+
if df.empty:
raise HTTPException(status_code=400, detail="导入文件内容为空")
+
std_type_mapping = {
'基础数据': '0',
'指标数据': '1'
@@ -1963,10 +2013,11 @@ class DataStdService:
'公司级': 'company',
'系统级': 'sys'
}
- # 获取全量标准代码
+
+ # 获取全量标准主表数据
std_list = await DataStdDao.get_std_main_list_import(query_db)
-
- # Step 2: 表头映射(中文转英文字段名)
+
+ # Step 2: 表头映射(中文 -> 英文字段名)
header_dict = {
'字典归属': 'data_dict_vest',
'来源系统': 'source_system',
@@ -1978,72 +2029,75 @@ class DataStdService:
'数据类型': 'data_type',
'数据标准': 'data_std'
}
-
df.rename(columns=header_dict, inplace=True)
- # ds系统列表
- data_tree_result = await MetataskService.get_data_source_tree( request,current_user)
-
+
+ # ds 系统树
+ data_tree_result = await MetataskService.get_data_source_tree(request, current_user)
+
# Step 3: 生成统一 flowId
batch_flow_id = str(uuid.uuid4())
-
+
+ # 安全字符串函数
+ def safe_str(val):
+ if pd.isna(val):
+ return ""
+ return str(val).strip()
+
try:
for idx, row in df.iterrows():
- # VO 数据校验
try:
- input_code_no = row.get('data_std')
- matched_code = next((item for item in std_list if item.data_std_no == input_code_no), None)
-
- if input_code_no and not matched_code:
- raise HTTPException(status_code=400, detail=f"第 {idx + 2} 行导入失败,数据标准 [{input_code_no}] 在系统中不存在")
- # 获取来源系统字段
- input_src_sys = row.get("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)
-
- # 如果能匹配到系统,则使用 id;否则判断是否为空
- if matched_source:
- src_sys_id = matched_source.id
- elif not input_src_sys or str(input_src_sys).strip() == "":
- src_sys_id = 10000
- else:
- raise HTTPException(status_code=400, detail=f"第 {idx + 2} 行导入失败,来源系统 [{input_src_sys}] 不存在")
-
- # 如果存在,使用对应 onum 作为 cdId
- cd_id = matched_code.data_std_no if matched_code else None
- vo = DataStdDictModel(
- dataDictVest=std_vest_mapping.get(row.get('data_dict_vest'), 'company'), # 默认转为 'company',
- srcSys=str(src_sys_id),
- dataDictNo=row.get('dict_no'),
- dataDictCnName=row.get('dict_name_zh'),
- dataDictEngName=row.get('dict_name_en'),
- dataDictBusiMean=row.get('dict_definition'),
- dataDictType=std_type_mapping.get(row.get('dict_type'), '1'), # 默认转为 '1',
- dataDictDataType=str(row.get('data_type')),
- dataStdNo=cd_id,
- dataDictStat="1", # 固定值
- )
+ # === 1. 校验数据标准 ===
+ input_code_no = safe_str(row.get('data_std'))
+ matched_code = next((item for item in std_list if item.data_std_no == input_code_no), None)
+ if input_code_no and not matched_code:
+ raise HTTPException(status_code=400, detail=f"第 {idx + 2} 行导入失败,数据标准 [{input_code_no}] 在系统中不存在")
+
+ # === 2. 来源系统匹配 ===
+ input_src_sys = safe_str(row.get("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)
+
+ if matched_source:
+ src_sys_id = matched_source.id
+ elif not input_src_sys:
+ src_sys_id = 10000
+ else:
+ raise HTTPException(status_code=400, detail=f"第 {idx + 2} 行导入失败,来源系统 [{input_src_sys}] 不存在")
+
+ # === 3. 构造 VO ===
+ cd_id = matched_code.data_std_no if matched_code else None
+ vo = DataStdDictModel(
+ dataDictVest=std_vest_mapping.get(safe_str(row.get('data_dict_vest')), 'company'),
+ srcSys=str(src_sys_id),
+ dataDictNo=safe_str(row.get('dict_no')),
+ dataDictCnName=safe_str(row.get('dict_name_zh')),
+ dataDictEngName=safe_str(row.get('dict_name_en')),
+ dataDictBusiMean=safe_str(row.get('dict_definition')),
+ dataDictType=std_type_mapping.get(safe_str(row.get('dict_type')), '1'),
+ dataDictDataType=safe_str(row.get('data_type')),
+ dataStdNo=cd_id,
+ dataDictStat="1",
+ )
except Exception as ve:
raise HTTPException(status_code=400, detail=f"第 {idx + 2} 行数据校验失败: {ve}")
-
- # 构造查询对象并检查是否存在
+
+ # === 4. 判断是否已存在 ===
query_obj = DataStdDictModel(dataDictNo=vo.data_dict_no)
exist_model = await DataStdDao.get_data_dict_by_info(query_db, query_obj)
-
- # 构造审批模型(无论新增/修改)
+
+ # === 5. 构造审批数据 ===
model = DataStdDictModel(**vo.model_dump(exclude_unset=True, by_alias=True))
model.create_by = current_user.user.user_name
-
model.create_time = datetime.now()
-
+
if exist_model:
- # === 修改审批逻辑 ===
- # 标准正在审批中则抛错
- wating_list = await DataStdDao.check_std_dict_waiting(exist_model.onum, query_db)
- if wating_list:
+ # 修改审批逻辑
+ waiting_list = await DataStdDao.check_std_dict_waiting(exist_model.onum, query_db)
+ if waiting_list:
raise ServiceException(message=f"第 {idx + 2} 行数据字典正在审批中,请等待审批完成")
-
+
last_appr = await DataStdDao.get_last_std_dict_appr_by_id(query_db, exist_model.onum)
model.onum = exist_model.onum
-
+
appr_model = DataStdDictApprModel(**model.model_dump(exclude_unset=True, by_alias=True))
appr_model.changeType = "edit"
appr_model.onum = str(uuid.uuid4())
@@ -2052,30 +2106,30 @@ class DataStdService:
appr_model.approStatus = "waiting"
appr_model.flowId = batch_flow_id
else:
- # === 新增审批逻辑 ===
+ # 新增审批逻辑
model.onum = str(uuid.uuid4())
appr_model = DataStdDictApprModel(**model.model_dump(exclude_unset=True, by_alias=True))
appr_model.changeType = "add"
appr_model.compareId = model.onum
appr_model.oldInstId = model.onum
- appr_model.oldInstId = model.onum
appr_model.approStatus = "waiting"
appr_model.flowId = batch_flow_id
-
+
# 保存审批数据
await DataStdDao.add_std_dict_appr(query_db, appr_model)
-
- # 全部处理完成后统一发起审批流程
+
+ # === 6. 发起审批流程 ===
apply_model = ApplyModel()
apply_model.businessType = "dataStdDict"
apply_model.businessId = batch_flow_id
apply_model.applicant = current_user.user.user_name
await ApprovalService.apply_services(query_db, apply_model, 'dataStdDict')
-
+
await query_db.commit()
return CrudResponseModel(is_success=True, message="批量导入字典成功")
-
+
except Exception as e:
await query_db.rollback()
raise ServiceException(message=f"导入失败:{str(e)}")
-
\ No newline at end of file
+
+
\ No newline at end of file
diff --git a/vue-fastapi-backend/module_admin/service/metatask_service.py b/vue-fastapi-backend/module_admin/service/metatask_service.py
index 4449d60..d4dfe6b 100644
--- a/vue-fastapi-backend/module_admin/service/metatask_service.py
+++ b/vue-fastapi-backend/module_admin/service/metatask_service.py
@@ -214,7 +214,7 @@ class MetataskService:
for config in processConfigList:
# mysql表字段
if config.ac_target=='0':
- modified_json_str = config.taskDefinitionJson.replace("16199683466336", str_list[0]).replace("16199683466337", str_list[1]).replace("16199683466338", str_list[2]).replace("11 as ssys_id", f"{page_object.dbRCode} as ssys_id")
+ modified_json_str = config.taskDefinitionJson.replace("16199683466336", str_list[0]).replace("16199683466337", str_list[1]).replace("16199683466338", str_list[2]).replace("2 as ssys_id", f"{page_object.dbRCode} as ssys_id").replace("ssys_id = 2", f"ssys_id = {page_object.dbRCode}")
if page_object.dbSName:
modified_json_str=modified_json_str.replace("'dash_test_w'", f"'{page_object.dbSName}'")
else:
@@ -505,7 +505,7 @@ class MetataskService:
# oracl表字段
if config.ac_target=='0':
# modified_json_str = config.taskDefinitionJson.replace("16699723296864", str_list[0]).replace("16699723296865", str_list[1]).replace("16699723296866", str_list[2]).replace("'ORCL_USER'", f"'{page_object.dbSName}'").replace("'orcl_conn'", f"'{page_object.dbRName}'")
- modified_json_str = config.taskDefinitionJson.replace("16699723296864", str_list[0]).replace("16699723296865", str_list[1]).replace("16699723296866", str_list[2]).replace("'ORCL_USER'", f"'{page_object.dbSName}'").replace("11 as ssys_id", f"{page_object.dbRCode} as ssys_id")
+ modified_json_str = config.taskDefinitionJson.replace("16699723296864", str_list[0]).replace("16699723296865", str_list[1]).replace("16699723296866", str_list[2]).replace("'ORCL_USER'", f"'{page_object.dbSName}'").replace("4 as ssys_id", f"{page_object.dbRCode} as ssys_id").replace("ssys_id = 4", f"ssys_id = {page_object.dbRCode}")
if page_object.dbSName:
modified_json_str=modified_json_str.replace("'ORCL_USER'", f"'{page_object.dbSName}'")
else:
@@ -602,7 +602,7 @@ class MetataskService:
for config in processConfigList:
# db2表字段
if config.ac_target=='0':
- modified_json_str = config.taskDefinitionJson.replace("16699625480160", str_list[0]).replace("16699625480161", str_list[1]).replace("16699625480162", str_list[2]).replace("'db2_conn'", f"'{page_object.dbRName}'")
+ modified_json_str = config.taskDefinitionJson.replace("16699625480160", str_list[0]).replace("16699625480161", str_list[1]).replace("16699625480162", str_list[2]).replace("'db2_conn'", f"'{page_object.dbRName}'").replace("6 as ssys_id", f"{page_object.dbRCode} as ssys_id").replace("6 AS SSYS_ID", f"{page_object.dbRCode} as ssys_id").replace("ssys_id = 6", f"ssys_id = {page_object.dbRCode}")
if page_object.dbSName:
modified_json_str=modified_json_str.replace("'MYSCHEMA'", f"'{page_object.dbSName}'")
else:
@@ -797,11 +797,11 @@ class MetataskService:
# POSTGRESQL表字段
if config.ac_target=='0':
# modified_json_str = config.taskDefinitionJson.replace("16688213802592", str_list[0]).replace("16688213802593", str_list[1]).replace("16688213802594", str_list[2]).replace("'pg_conn'", f"'{page_object.dbRName}'")
- modified_json_str = config.taskDefinitionJson.replace("16688213802592", str_list[0]).replace("16688213802593", str_list[1]).replace("16688213802594", str_list[2]).replace("11 as ssys_id", f"{page_object.dbRCode} as ssys_id")
+ modified_json_str = config.taskDefinitionJson.replace("16688213802592", str_list[0]).replace("16688213802593", str_list[1]).replace("16688213802594", str_list[2]).replace("11 as ssys_id", f"{page_object.dbRCode} as ssys_id").replace("ssys_id = 11", f"ssys_id = {page_object.dbRCode}")
if page_object.dbSName:
- modified_json_str=modified_json_str.replace("'public'", f"'{page_object.dbSName}'")
+ modified_json_str=modified_json_str.replace("'jydb_stk'", f"'{page_object.dbSName}'")
else:
- modified_json_str=modified_json_str.replace("n.nspname = 'public'", "1=1")
+ modified_json_str=modified_json_str.replace("n.nspname = 'jydb_stk'", "1=1")
modified_json_str2=config.taskRelationJson.replace("16688213802592", str_list[0]).replace("16688213802593", str_list[1]).replace("16688213802594", str_list[2])
modified_json_str3=config.locations.replace("16688213802592", str_list[0]).replace("16688213802593", str_list[1]).replace("16688213802594", str_list[2])
metaprocessconfig_dict = MetaprocessconfigModel(taskDefinitionJson=modified_json_str,# 替换taskDefinitionJson
diff --git a/vue-fastapi-frontend/src/api/datastd/std.js b/vue-fastapi-frontend/src/api/datastd/std.js
index ece12d1..58968e1 100644
--- a/vue-fastapi-frontend/src/api/datastd/std.js
+++ b/vue-fastapi-frontend/src/api/datastd/std.js
@@ -254,6 +254,7 @@ export function listStdCodeAppr(query) {
params: query
})
}
+
// 查询数据标准列表
export function listStdMainSelect(query) {
return request({
@@ -262,7 +263,13 @@ export function listStdMainSelect(query) {
params: query
})
}
-
+export function saveStdStatus(data){
+ return request({
+ url: '/default-api/datastd/stdmain/saveStdStatus',
+ method: 'post',
+ data: data
+ })
+}
// 查询数据标准详情
diff --git a/vue-fastapi-frontend/src/views/datastd/main/index.vue b/vue-fastapi-frontend/src/views/datastd/main/index.vue
index 6e9e515..48448fc 100644
--- a/vue-fastapi-frontend/src/views/datastd/main/index.vue
+++ b/vue-fastapi-frontend/src/views/datastd/main/index.vue
@@ -309,6 +309,13 @@
+
+
+
+
+
@@ -482,6 +489,7 @@ import {
getStdMain,
deleteStdMain,
listStdMainSelect,
+ saveStdStatus,
changeStdMainOum
} from "@/api/datastd/std"; // 更新为新的接口
import useUserStore from '@/store/modules/user'
@@ -504,6 +512,16 @@ const currentNode = ref({})
const handleTargetCatalogNodeClick = (data) => {
chooseOnumNum.value=data.contentOnum
}
+function changeStatus(row){
+ let param = {
+ onum: row.onum,
+ stdStatus: row.stdStatus
+ }
+ saveStdStatus(param).then(res=>{
+ proxy.$modal.msgSuccess("操作成功");
+ getList()
+ })
+}
const codeMapId = ref(null);
const mapVisible = ref(false);
/**文件上传中处理 */
diff --git a/vue-fastapi-frontend/src/views/metadataConfig/bizConfig/index.vue b/vue-fastapi-frontend/src/views/metadataConfig/bizConfig/index.vue
index f87bbe9..6d90ab3 100644
--- a/vue-fastapi-frontend/src/views/metadataConfig/bizConfig/index.vue
+++ b/vue-fastapi-frontend/src/views/metadataConfig/bizConfig/index.vue
@@ -59,6 +59,7 @@
+
{{ getSecLevelName(row.riskLvl) }}
diff --git a/vue-fastapi-frontend/src/views/metadataConfig/taskBizConfig/index.vue b/vue-fastapi-frontend/src/views/metadataConfig/taskBizConfig/index.vue
index 8b0eb63..ee20b4d 100644
--- a/vue-fastapi-frontend/src/views/metadataConfig/taskBizConfig/index.vue
+++ b/vue-fastapi-frontend/src/views/metadataConfig/taskBizConfig/index.vue
@@ -265,7 +265,7 @@
placeholder="请选择系统"
clearable
filterable
- style="width: 180px"
+ style="width: 100px"
>
+
+
+
@@ -309,13 +317,17 @@
-
+
+
+
+
@@ -431,6 +443,7 @@ const queryForm = reactive({
const leftQueryForm = reactive({
ssysId: '',
tabName: '',
+ mdlName: '',
pageNum: 1,
pageSize: 10,
})
@@ -809,4 +822,7 @@ const logdialog = ref(null)
justify-content: center;
align-items: center;
}
+
+
+