From 84aef606187ed15073607e504ea0029df5595537 Mon Sep 17 00:00:00 2001 From: "si@aidatagov.com" Date: Sun, 24 Aug 2025 20:42:43 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=A0=87=E5=87=86=E5=85=AC?= =?UTF-8?q?=E5=8F=B8=E7=BA=A7=E6=98=A0=E5=B0=84=E9=97=AE=E9=A2=98=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/datastd_controller.py | 6 ++- .../module_admin/dao/datastd_dao.py | 18 ++++++++ .../module_admin/entity/do/datastd_do.py | 4 +- .../module_admin/entity/vo/datastd_vo.py | 1 + .../module_admin/service/datastd_service.py | 38 +++++++++++++--- .../datastd/main/components/AddEditForm.vue | 45 +++++++++++++++++-- .../src/views/datastd/main/index.vue | 16 +++++++ 7 files changed, 114 insertions(+), 14 deletions(-) diff --git a/vue-fastapi-backend/module_admin/controller/datastd_controller.py b/vue-fastapi-backend/module_admin/controller/datastd_controller.py index c3789d9..a27c742 100644 --- a/vue-fastapi-backend/module_admin/controller/datastd_controller.py +++ b/vue-fastapi-backend/module_admin/controller/datastd_controller.py @@ -639,7 +639,7 @@ async def get_std_main_appr_list( ) async def get_std_main_select_list( request: Request, - main_page_query: DataStdMainModel = Depends(DataStdMainModel), + main_page_query: DataStdMainPageQueryModel = Depends(DataStdMainPageQueryModel.as_query), # 关键 query_db: AsyncSession = Depends(get_db), ): main_query_result = await DataStdService.get_std_main_list_all(query_db, main_page_query) @@ -811,8 +811,10 @@ async def get_code_map_list2( request: Request, id: str, query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), + ): - code_page_query_result = await DataStdService.get_code_map_list2(request,query_db, id) + code_page_query_result = await DataStdService.get_code_map_list2(request,query_db, id,current_user) logger.info('获取列配置列表成功') return ResponseUtil.success(data=code_page_query_result) @datastdController.get( diff --git a/vue-fastapi-backend/module_admin/dao/datastd_dao.py b/vue-fastapi-backend/module_admin/dao/datastd_dao.py index b0519f7..6b9d6a0 100644 --- a/vue-fastapi-backend/module_admin/dao/datastd_dao.py +++ b/vue-fastapi-backend/module_admin/dao/datastd_dao.py @@ -518,6 +518,20 @@ class DataStdDao: ) ).scalars().all() return List + @classmethod + async def get_data_main_list_by_info(cls, db: AsyncSession, query_object: DataStdMain): + stmt = select(DataStdMain) + + # 动态拼接条件 + if query_object.data_std_no: + stmt = stmt.where(DataStdMain.data_std_no == query_object.data_std_no) + + if query_object.company_level_data_std_no: + stmt = stmt.where(DataStdMain.company_level_data_std_no == query_object.company_level_data_std_no) + + result = await db.execute(stmt) + return result.scalars().all() + @classmethod async def get_meta_field_list_by_onum(cls, db: AsyncSession, onum: str): @@ -1045,6 +1059,10 @@ class DataStdDao: filters.append(DataStdMain.data_std_no.like(f"%{query_object.data_std_no}%")) if query_object.src_sys: filters.append(DataStdMain.src_sys == query_object.src_sys) + if query_object.company_level_data_std_no: + filters.append(DataStdMain.company_level_data_std_no == query_object.company_level_data_std_no) + if query_object.data_std_vest: + filters.append(DataStdMain.data_std_vest == query_object.data_std_vest) if query_object.cd_id: filters.append(DataStdMain.cd_id == query_object.cd_id) if query_object.data_std_type: diff --git a/vue-fastapi-backend/module_admin/entity/do/datastd_do.py b/vue-fastapi-backend/module_admin/entity/do/datastd_do.py index b0e85dc..10eaf5a 100644 --- a/vue-fastapi-backend/module_admin/entity/do/datastd_do.py +++ b/vue-fastapi-backend/module_admin/entity/do/datastd_do.py @@ -164,6 +164,7 @@ class DataStdMain(Base): data_std_src = Column(String(20), default=None, comment='标准来源') data_clas = Column(String(20), default=None, comment='数据类别') typical_fld = Column(String(500), default=None, comment='典型字段') + company_level_data_std_no = Column(String(50), default=None, comment='所属公司级数据标准编号') class DataStdMainAppr(Base): @@ -200,4 +201,5 @@ class DataStdMainAppr(Base): oldInstId = Column(String(50), default=None, comment='原始正式id') compareId = Column(String(50), default=None, comment='原始数据id(用于对比差异)') approStatus = Column(String(10), default=None, - comment='审批状态(waiting,申请中,pending审核中,succeed,rejected已审核,canceled已取消)') + comment='审批状态(waiting,申请中,pending审核中,succeed,rejected已审核,canceled已取消)') + company_level_data_std_no = Column(String(50), default=None, comment='所属公司级数据标准编号') diff --git a/vue-fastapi-backend/module_admin/entity/vo/datastd_vo.py b/vue-fastapi-backend/module_admin/entity/vo/datastd_vo.py index 79b9e0f..7198cd0 100644 --- a/vue-fastapi-backend/module_admin/entity/vo/datastd_vo.py +++ b/vue-fastapi-backend/module_admin/entity/vo/datastd_vo.py @@ -130,6 +130,7 @@ class DataStdMainModel(BaseModel): data_std_src: Optional[str] = Field(default=None, description='标准来源') data_clas: Optional[str] = Field(default=None, description='数据类别') typical_fld: Optional[str] = Field(default=None, description='典型字段') + company_level_data_std_no: Optional[str] = Field(default=None, description='公司级数据标准编号') @as_query diff --git a/vue-fastapi-backend/module_admin/service/datastd_service.py b/vue-fastapi-backend/module_admin/service/datastd_service.py index 52b02a0..d915740 100644 --- a/vue-fastapi-backend/module_admin/service/datastd_service.py +++ b/vue-fastapi-backend/module_admin/service/datastd_service.py @@ -1240,7 +1240,8 @@ class DataStdService: raise ServiceException(message=f"标准编号 {model.data_std_no} 已存在") model.onum=str(uuid.uuid4()) model.std_status="1" - model.belt_data_std_content=2 + if not model.belt_data_std_content or model.belt_data_std_content == 1: + model.belt_data_std_content = 2 await DataStdDao.add_std_main(query_db, model) return CrudResponseModel(is_success=True, message='新增标准成功') @@ -1261,7 +1262,8 @@ class DataStdService: raise ServiceException(message=f"标准编号 {model.data_std_no} 已存在") model.onum=str(uuid.uuid4()) model.std_status="1" - model.belt_data_std_content=2 + if model.belt_data_std_content is None or model.belt_data_std_content == 1: + model.belt_data_std_content = 2 # 将 DataStdMainModel 转换为 DataStdMainApprModel,保留字段原始名 apprModel = DataStdMainApprModel(**model.model_dump(exclude_unset=True, by_alias=True)) apprModel.changeType="add" @@ -1608,9 +1610,32 @@ class DataStdService: # "children": children # } @classmethod - async def get_code_map_list2(cls, request: Request, query_db: AsyncSession, id: str): + async def get_code_map_list2(cls, request: Request, query_db: AsyncSession, id: str,current_user: CurrentUserModel): check_model = DataStdDictModel() + table_data = [] # 存储表格数据 + children = [] # 存储图谱数据 dataStdNo = await DataStdDao.get_std_main_by_id(query_db, id) + if dataStdNo.data_std_vest == 'company': + check_data_std = DataStdMainModel() + check_data_std.company_level_data_std_no=dataStdNo.data_std_no + data_tree_result = await MetataskService.get_data_source_tree( request,current_user) + sys_map = {str(item.id): item.name for item in data_tree_result} + main_query_result= await DataStdDao.get_data_main_list_by_info(query_db, check_data_std) + if main_query_result: + for main in main_query_result: + sys_name = sys_map.get(str(main.src_sys), str(main.src_sys)) # 找不到时就用id + sys_main_node = { + "id": f"dict_{main.onum}", + "name": main.data_std_cn_name, + "label": main.data_std_eng_name, + "rate": 1.0, + "status": "G", + "variableValue": "系统级标准:"+sys_name, + + "variableUp": True, + "children": [], + } + children.append(sys_main_node) cd_type = dataStdNo.src_sys check_model.data_std_no = dataStdNo.onum @@ -1618,14 +1643,13 @@ class DataStdService: hasDict = await request.app.state.redis.get(f'{RedisInitKeyConfig.SYS_CONFIG.key}:sys.std.dict') hasDict = hasDict.decode() if isinstance(hasDict, bytes) else hasDict - table_data = [] # 存储表格数据 - children = [] # 存储图谱数据 + if hasDict == "是": # 获取字典列表 main_list = await DataStdDao.get_data_dict_list_by_info(query_db, check_model) if not main_list: - return {"children": []} + return {"children": children} for main in main_list: dict_node = { @@ -1683,7 +1707,7 @@ class DataStdService: # 获取该字典直接引用的元数据列表 meta_list = await DataStdDao.get_meta_field_list_by_onum(query_db, id) if not meta_list: - return {"children": []} + return {"children": children} children = [] for meta in meta_list: diff --git a/vue-fastapi-frontend/src/views/datastd/main/components/AddEditForm.vue b/vue-fastapi-frontend/src/views/datastd/main/components/AddEditForm.vue index c078f00..6e9b2bd 100644 --- a/vue-fastapi-frontend/src/views/datastd/main/components/AddEditForm.vue +++ b/vue-fastapi-frontend/src/views/datastd/main/components/AddEditForm.vue @@ -42,6 +42,22 @@ /> + + + + + [] } }) // 表单数据(完整映射所有数据库字段) const formData = ref({ ...props.data }); - +const filterStdList = (query) => { + searchQuery.value = query; // 更新搜索词 +}; // 初始化表单数据 watch(() => props.data, (newVal) => { if (newVal) { -formData.value=props.data + formData.value=props.data + if (formData.value.dataStdVest !== "company") { + showSys.value = true + } else { + showSys.value = false + } } }, { immediate: true }) +const searchQuery = ref(''); // 存储用户输入的搜索词 +const filteredStdList = computed(() => { + if (!searchQuery.value) return props.stdList; // 如果没有输入,返回全部 + const query = searchQuery.value.toLowerCase(); + return props.stdList.filter(dict => + dict.dataStdNo.toLowerCase().includes(query) || + dict.dataStdEngName.toLowerCase().includes(query) || + dict.dataStdCnName.toLowerCase().includes(query) + ); +}); // 表单验证规则 const formRules = ref({ dataStdNo: [{ required: true, message: '请输入标准编号', trigger: 'blur' }], @@ -261,8 +298,8 @@ const formRules = ref({ dataStdType: [{ required: true, message: '请选择标准类型', trigger: 'change' }], dataStdSrc: [{ required: true, message: '请选择标准来源', trigger: 'change' }], dataClas: [{ required: true, message: '请选择数据类别', trigger: 'change' }], - dataStdBusiOwnershipDept: [{ required: true, message: '请选择业务认责部门', trigger: 'change' }], - dataStdItOwnershipDept: [{ required: true, message: '请选择技术认责部门', trigger: 'change' }] + // dataStdBusiOwnershipDept: [{ required: true, message: '请选择业务认责部门', trigger: 'change' }], + // dataStdItOwnershipDept: [{ required: true, message: '请选择技术认责部门', trigger: 'change' }] }) // 组件状态 diff --git a/vue-fastapi-frontend/src/views/datastd/main/index.vue b/vue-fastapi-frontend/src/views/datastd/main/index.vue index 6cec359..6e9e515 100644 --- a/vue-fastapi-frontend/src/views/datastd/main/index.vue +++ b/vue-fastapi-frontend/src/views/datastd/main/index.vue @@ -377,6 +377,7 @@ { upload.isUploading = true; }; + const handleFileSuccess = (response, file, fileList) => { upload.open = false; upload.isUploading = false; @@ -532,6 +535,9 @@ const getSrcSysName = (id) => { const match = dbResourceOldList.value.find(item => item.id === id); return match ? match.name : "公司级"; }; +const queryStd = ref({ + dataStdVest: "company", +}); const single = ref(true); const multiple = ref(true); const dialogVisible = ref(false); @@ -560,6 +566,12 @@ const handleMapCodeClick = (row) => { codeMapId.value=row.onum mapVisible.value = true; +}; +const getStdMainSelect = async () => { + const response = await listStdMainSelect(queryStd.value); + + stdList.value = response.data; + }; const resetQuery = () => { queryParams.value = { dataStdNo: '', dataStdBusiDefn: '' , pageNum: 1, @@ -630,6 +642,7 @@ const handleRemove = (row) => { .catch(() => {}); }; const dbResourceOldList = ref([]); +const stdList = ref([]); const handleAdd = () => { isEdit.value = false; @@ -641,11 +654,13 @@ const handleAdd = () => { dataStdEngName: '', dataStdType: '0', dataStdBusiDefn: '', + beltDataStdContent:queryParams.value.beltDataStdContent, dataStdSrc: '', dataClas: '', dataSecLvl: '1', dataStdVest: '', typicalFld: '', + companyLevelDataStdNo: '', // 系统关联 srcSys: null, @@ -870,6 +885,7 @@ onMounted(() => { }); getList(); + getStdMainSelect(); });