diff --git a/vue-fastapi-backend/module_admin/controller/datastd_controller.py b/vue-fastapi-backend/module_admin/controller/datastd_controller.py index 173597d..9fa4ff2 100644 --- a/vue-fastapi-backend/module_admin/controller/datastd_controller.py +++ b/vue-fastapi-backend/module_admin/controller/datastd_controller.py @@ -6,13 +6,15 @@ from config.get_db import get_db from module_admin.entity.vo.user_vo import CurrentUserModel from module_admin.annotation.log_annotation import Log from module_admin.aspect.interface_auth import CheckUserInterfaceAuth -from module_admin.entity.vo.datastd_vo import DataStdCodeModel, DataStdCodePageQueryModel, DeleteDataStdModel,DataStdDictModel,DataStdDictPageQueryModel +from module_admin.entity.vo.datastd_vo import DataStdCodeModel, DataStdCodePageQueryModel, DeleteDataStdModel,DataStdDictModel,DataStdDictPageQueryModel,DataStdMainModel,DataStdMainPageQueryModel from module_admin.service.datastd_service import DataStdService from module_admin.service.login_service import LoginService from utils.log_util import logger from utils.page_util import PageResponseModel from utils.response_util import ResponseUtil import uuid +from module_admin.entity.vo.data_ast_content_vo import DataCatalogPageQueryModel, DeleteDataCatalogModel,DataCatalogResponseWithChildren,DataAssetCatalogTreeResponse,DataCatalogMovedRequest,DataCatalogMergeRequest,DataCatalogChild,DataCatalogMoverelRequest +from pydantic_validation_decorator import ValidateFields datastdController = APIRouter(prefix='/datastd', dependencies=[Depends(LoginService.get_current_user)]) @@ -210,6 +212,238 @@ async def delete_std_dict( + # ----------------------------------------------------------------标准目录---------------------------------------------------------------------------------------------------- +@datastdController.get( + '/cata/list', response_model=PageResponseModel, dependencies=[Depends(CheckUserInterfaceAuth('system:data_catalog:list'))] +) +async def get_data_catalog_list( + request: Request, + catalog_page_query: DataCatalogPageQueryModel = Depends(DataCatalogPageQueryModel.as_query), + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), +): + + #设置字段 + user_id = current_user.user.user_id + # 获取分页数据 + catalog_page_query_result = await DataStdService.get_catalog_list_services(query_db, catalog_page_query, user_id, is_page=True) + logger.info('获取成功') + + + + return ResponseUtil.success(model_content=catalog_page_query_result) + + +@datastdController.get( + '/cata/atree',response_model=DataAssetCatalogTreeResponse,dependencies=[Depends(CheckUserInterfaceAuth('system:data_catalog:atree'))],summary="Data Asset Tree Query" +) +async def get_data_asset_catalog_tree(query_db: AsyncSession = Depends(get_db)): + try: + logger.debug("开始获取数据资产目录树") + catalog_tree_result = await DataStdService.get_data_asset_catalog_tree_services(query_db) + logger.info('数据资产树获取成功') + return ResponseUtil.success(data=catalog_tree_result) + except Exception as e: + logger.error(f"数据资产树获取失败: {str(e)}", exc_info=True) + return ResponseUtil.error(msg="数据查询异常,请联系管理员") + +@datastdController.post('/cata', dependencies=[Depends(CheckUserInterfaceAuth('system:data_catalog:add'))]) +@ValidateFields(validate_model='add_data_catalog') +@Log(title='标准分类管理', business_type=BusinessType.INSERT) +async def add_data_catalog( + request: Request, + add_catalog: DataCatalogResponseWithChildren, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), +): + # 设置字段 + add_catalog.upd_prsn = current_user.user.user_name + + # 调用服务层方法 + add_result = await DataStdService.add_catalog_services(query_db, add_catalog) + logger.info(add_result.message) + + # 新增成功后,更新新增数据目录的父亲节点的叶子标志为0 + if add_result.is_success: + if add_catalog.supr_content_onum is not None: + supr_content_onum = add_catalog.supr_content_onum + await DataStdService.edit_catalog_leaf_services(query_db,supr_content_onum, 0) + else: + logger.error(add_result.message) + # 返回标准化响应 + return ResponseUtil.success( + msg=add_result.message + ) + +@datastdController.put('/cata/edit', dependencies=[Depends(CheckUserInterfaceAuth('system:data_catalog:edit'))]) +@ValidateFields(validate_model='edit_data_catalog') +@Log(title='标准分类管理', business_type=BusinessType.UPDATE) +async def edit_data_catalog( + request: Request, + edit_catalog: DataCatalogResponseWithChildren, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), +): + # 设置审计字段 + edit_catalog.upd_prsn = current_user.user.user_name + + + # 调用服务层方法 + edit_result = await DataStdService.edit_catalog_child_services(query_db, edit_catalog) + logger.info(edit_result.message) + + # 返回标准化响应 + return ResponseUtil.success( + msg=edit_result.message + ) + + +@datastdController.put('/cata/moved', dependencies=[Depends(CheckUserInterfaceAuth('system:data_catalog:edit'))]) +@ValidateFields(validate_model='moved_data_catalog') +@Log(title='标准分类管理', business_type=BusinessType.UPDATE) +async def moved_data_catalog( + request: Request, + moved_catalog: DataCatalogMovedRequest, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), +): + # 调用服务层方法 + moved_result = await DataStdService.moved_catalog_instr_services(query_db, moved_catalog) + logger.info(moved_result.message) + + # 返回标准化响应 + return ResponseUtil.success( + msg=moved_result.message + ) + + +@datastdController.put('/cata/merge', dependencies=[Depends(CheckUserInterfaceAuth('system:data_catalog:edit'))]) +@ValidateFields(validate_model='merge_data_catalog') +@Log(title='标准分类管理', business_type=BusinessType.UPDATE) +async def moved_data_catalog( + request: Request, + merge_catalog: DataCatalogMergeRequest, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), +): + # 调用服务层方法 + merge_result = await DataStdService.merge_catalog_instr_services(query_db, merge_catalog) + logger.info(merge_result.message) + + # 返回标准化响应 + return ResponseUtil.success( + msg=merge_result.message + ) +@datastdController.put('/cata/removerel', dependencies=[Depends(CheckUserInterfaceAuth('system:data_catalog:edit'))]) +@ValidateFields(validate_model='removerel_data_ast_catalog') +@Log(title='标准分类管理', business_type=BusinessType.UPDATE) +async def removerel_data_ast_catalog( + request: Request, + removerel_catalog: DataCatalogChild, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), +): + # 调用服务层方法 + removerel_result = await DataStdService.removerel_data_ast_catalog_services(query_db, removerel_catalog) + logger.info(removerel_result.message) + + # 返回标准化响应 + return ResponseUtil.success() + +@datastdController.put('/cata/moverel', dependencies=[Depends(CheckUserInterfaceAuth('system:data_catalog:edit'))]) +@ValidateFields(validate_model='moverel_data_ast_catalog') +@Log(title='标准分类管理', business_type=BusinessType.UPDATE) +async def moverel_data_ast_catalog( + request: Request, + moverel_catalog: DataCatalogMoverelRequest, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), +): + # 调用服务层方法 + moverel_result = await DataStdService.moverel_data_ast_catalog_services(query_db, moverel_catalog) + logger.info(moverel_result.message) + + # 返回标准化响应 + return ResponseUtil.success() + + + +@datastdController.delete('/cata/{content_onums}', dependencies=[Depends(CheckUserInterfaceAuth('system:data_catalog:remove'))]) +@Log(title='标准分类管理', business_type=BusinessType.DELETE) +async def delete_data_catalog(request: Request, content_onums: str, query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), + ): + delete_catalog = DeleteDataCatalogModel(content_onums=content_onums) + delete_catalog_result = await DataStdService.delete_catalog_services(query_db, delete_catalog,user_id=current_user.user.user_id) + logger.info(delete_catalog_result.message) + + return ResponseUtil.success(msg=delete_catalog_result.message) +#----------------------------------------------数据标准-------------------------------------------------------------------------------------------------------------------------- +@datastdController.get( + '/stdmain/main/list', response_model=PageResponseModel, dependencies=[Depends(CheckUserInterfaceAuth('datastd:stdmain:main:list'))] +) +async def get_std_main_list( + request: Request, + main_page_query: DataStdMainPageQueryModel = Depends(DataStdMainPageQueryModel.as_query), + query_db: AsyncSession = Depends(get_db), +): + main_page_query_result = await DataStdService.get_std_main_list(query_db, main_page_query, is_page=True) + logger.info('获取数据标准列表成功') + return ResponseUtil.success(model_content=main_page_query_result) + + +@datastdController.get( + '/stdmain/main/{id}', response_model=DataStdMainModel, dependencies=[Depends(CheckUserInterfaceAuth('datastd:stdmain:main:list'))] +) +async def query_detail_main(request: Request, id: str, query_db: AsyncSession = Depends(get_db)): + config_detail_result = await DataStdService.get_std_main_by_id(query_db, id) + logger.info(f'获取数据标准ID为{id}的信息成功') + + return ResponseUtil.success(data=config_detail_result) + + +@datastdController.post('/stdmain/main', dependencies=[Depends(CheckUserInterfaceAuth('datastd:stdmain:main:add'))]) +@Log(title='数据标准', business_type=BusinessType.INSERT) +async def add_std_main( + request: Request, + add_std_main: DataStdMainModel, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), +): + add_std_main.create_by = current_user.user.user_name + add_std_main.create_time = datetime.now() + add_std_main.update_by = current_user.user.user_name + add_std_main.update_time = datetime.now() + add_std_main_result = await DataStdService.add_std_main(query_db, add_std_main) + logger.info(add_std_main_result.message) + return ResponseUtil.success(msg=add_std_main_result.message) + + +@datastdController.put('/stdmain/main', dependencies=[Depends(CheckUserInterfaceAuth('datastd:stdmain:main:edit'))]) +@Log(title='数据标准', business_type=BusinessType.UPDATE) +async def edit_std_main( + request: Request, + edit_std_main: DataStdMainModel, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), +): + edit_std_main.update_by = current_user.user.user_name + edit_std_main.update_time = datetime.now() + edit_std_main_result = await DataStdService.edit_std_main(query_db, edit_std_main) + logger.info(edit_std_main_result.message) + return ResponseUtil.success(msg=edit_std_main_result.message) + + +@datastdController.delete('/stdmain/main/{id}', dependencies=[Depends(CheckUserInterfaceAuth('datastd:stdmain:main:remove'))]) +@Log(title='数据标准', business_type=BusinessType.DELETE) +async def delete_std_main( + request: Request, + id: str, + query_db: AsyncSession = Depends(get_db), +): + delete_std_main_result = await DataStdService.delete_std_main(query_db, id) + logger.info(delete_std_main_result.message) + return ResponseUtil.success(msg=delete_std_main_result.message) diff --git a/vue-fastapi-backend/module_admin/dao/datastd_dao.py b/vue-fastapi-backend/module_admin/dao/datastd_dao.py index ba3bce3..5a51867 100644 --- a/vue-fastapi-backend/module_admin/dao/datastd_dao.py +++ b/vue-fastapi-backend/module_admin/dao/datastd_dao.py @@ -1,10 +1,12 @@ -from sqlalchemy import delete, select, update, desc,or_ +from sqlalchemy import delete, select, update, desc,or_,not_ from sqlalchemy.ext.asyncio import AsyncSession -from module_admin.entity.do.datastd_do import DataStdCode,DataStdDict -from module_admin.entity.vo.datastd_vo import DataStdCodeModel,DataStdDictModel +from module_admin.entity.do.datastd_do import DataStdCode,DataStdDict,DataAstContent,DataAstContentRela,DataStdMain +from module_admin.entity.vo.datastd_vo import DataStdCodeModel,DataStdDictModel,DataStdMainModel from module_admin.entity.do.dept_do import SysDept from utils.page_util import PageUtil from sqlalchemy.orm import aliased +from module_admin.entity.vo.data_ast_content_vo import DataCatalogPageQueryModel, DeleteDataCatalogModel,DataCatalogChild +from datetime import datetime class DataStdDao: @@ -282,4 +284,427 @@ class DataStdDao: ) ) ).scalars().first() - return List \ No newline at end of file + return List + # 数据标准目录 + + @classmethod + async def get_catalog_by_id(cls, db: AsyncSession, content_onum: int): + """ + 根据目录ID获取目录详细信息 + + :param db: orm对象 + :param content_onum: 目录ID + :return: 目录信息对象 + """ + catalog_info = ( + (await db.execute(select(DataAstContent).where(DataAstContent.content_onum == content_onum , DataAstContent.content_stat == 1))) + .scalars() + .first() + ) + + return catalog_info + + @classmethod + async def get_catalog_detail_by_info(cls, db: AsyncSession, catalog: DataCatalogPageQueryModel): + """ + 根据目录参数获取目录信息 + + :param db: orm对象 + :param catalog: 目录参数对象 + :return: 目录信息对象 + """ + catalog_info = ( + ( + await db.execute( + select(DataAstContent).where( + DataAstContent.content_name == catalog.content_name if catalog.content_name else True, + DataAstContent.content_stat == catalog.content_stat if catalog.content_stat else True, + DataAstContent.content_pic == catalog.content_pic if catalog.content_pic else True, + DataAstContent.content_stat == 1, + ) + ) + ) + .scalars() + .first() + ) + + return catalog_info + + @classmethod + async def update_leaf_node_flag(cls, db: AsyncSession): + """ + 更新leaf_node_flag字段 + """ + # 创建别名对象 + t2 = aliased(DataAstContent, name='t2') # 正确使用aliased创建别名 + subquery = ( + select(DataAstContent.content_onum) + .where( + DataAstContent.content_stat == '1', + DataAstContent.leaf_node_flag == 0, + not_( + select(1) + .select_from(t2) # 使用别名后的表 + .where( + t2.supr_content_onum == DataAstContent.content_onum, + t2.content_stat == '1' + ) + .exists() # 添加exists()方法 + ) + ) + ).alias('temp') + + stmt = ( + update(DataAstContent) + .where(DataAstContent.content_onum.in_(subquery)) + .values(leaf_node_flag=1, upd_time=datetime.now()) + ) + await db.execute(stmt) + + @classmethod + async def add_catalog_dao(cls, db: AsyncSession, catalog1: dict, catalog2: dict): + """ + 新增目录数据库操作 + + :param db: orm对象 + :param catalog: 目录对象 + :return: + """ + db_catalog = DataAstContent(**catalog1) + db.add(db_catalog) + await db.flush() + + + # 处理子关系(统一转换为 ORM 模型) + for child in catalog2.get('children', []): + # 如果是 Pydantic 模型实例,先转换为字典 + if isinstance(child, DataCatalogChild): + child_dict = child.model_dump() + elif isinstance(child, dict): + child_dict = child + else: + raise TypeError("不支持的子关系数据类型") + + # 创建 ORM 模型实例 + processed_child = dict(child_dict) + processed_child['content_onum'] = db_catalog.content_onum + db_child = DataAstContentRela(**processed_child) + + db.add(db_child) + await db.flush() + + return db_catalog + @classmethod + async def edit_catalog_leaf_dao(cls, db: AsyncSession, catalog: dict): + """ + 编辑叶子节点目录数据库操作 + + :param db: orm对象 + :param catalog: 需要更新的目录字典 + :return: + """ + content_onum = catalog['content_onum'] + stmt = ( + update(DataAstContent) + .where(DataAstContent.content_onum == content_onum) + .values( + leaf_node_flag=catalog['leaf_node_flag'] + ) + ) + + await db.execute(stmt) + @classmethod + async def edit_catalog_child_dao(cls, db: AsyncSession, catalog: dict): + """ + 编辑目录数据库操作 + + :param db: orm对象 + :param catalog: 需要更新的目录字典 + :return: + """ + content_onum = catalog['content_onum'] + + stmt = ( + update(DataAstContent) + .where(DataAstContent.content_onum == content_onum) + .values( + content_name=catalog['content_name'], + content_stat=catalog['content_stat'], + content_intr=catalog['content_intr'], + content_pic=catalog['content_pic'], + supr_content_onum=catalog['supr_content_onum'], + leaf_node_flag=catalog['leaf_node_flag'], + upd_prsn=catalog['upd_prsn'], + upd_time=datetime.now() + ) ) + + await db.execute(stmt) + + # 处理子关系 + for child in catalog.get('children', []): + rela_onum = child.get('rela_onum') + if rela_onum: + st = ( + update(DataAstContentRela) + .where(DataAstContentRela.rela_onum == rela_onum) + .values( + content_onum=child.get('content_onum'), + ast_onum=child.get('ast_onum'), + rela_type=child.get('rela_type'), + rela_eff_begn_date=child.get('rela_eff_begn_date'), + rela_eff_end_date=child.get('rela_eff_end_date'), + upd_prsn=child.get('upd_prsn')) + ) + + await db.execute(st) + await cls.update_leaf_node_flag(db) + else: + child['content_onum'] = content_onum + db_child = DataAstContentRela(**child) + db.add(db_child) + await db.flush() + await cls.update_leaf_node_flag(db) + + @classmethod + async def delete_catalog_dao(cls, db: AsyncSession, catalog: DeleteDataCatalogModel): + """ + 删除目录数据库操作 + + :param db: orm对象 + :param catalog: 目录对象 + :content_stat=0 作废 + :return: + """ + content_onums = catalog.content_onums.split(',') + await db.execute( + update(DataAstContentRela) + .where(DataAstContentRela.content_onum.in_(content_onums)) + .values( + rela_status=0, + rela_eff_end_date=datetime.now() + ) + ) + await db.execute( + update(DataAstContent) + .where(DataAstContent.content_onum.in_(content_onums)) + .values( + content_stat=0, + upd_time=datetime.now() + ) + ) + + + await cls.update_leaf_node_flag(db) + + @classmethod + async def moved_catalog_instr_dao(cls, db: AsyncSession, moved_catalog_data: dict): + """ + 编辑目录数据库操作 + + :param db: orm对象 + :param catalog: 需要更新的目录字典 + :return: + """ + # content_onum = moved_catalog_data['content_onum'] + + stmt = ( + update(DataAstContent) + .where(DataAstContent.content_onum == moved_catalog_data['content_onum'] , DataAstContent.supr_content_onum == moved_catalog_data['supr_content_onum']) + .values( + supr_content_onum=moved_catalog_data['supr_content_onum_after'], + upd_time=datetime.now() + ) ) + + await db.execute(stmt) + await cls.update_leaf_node_flag(db) + + @classmethod + async def merge_catalog_instr_dao(cls, db: AsyncSession, merge_catalog_data: dict): + """ + 编辑目录数据库操作 + + :param db: orm对象 + :param catalog: 需要更新的目录字典 + :return: + """ + + # stmt = ( + # update(DataAstContent) + # .where(DataAstContent.content_onum == merge_catalog_data['content_onum'] , DataAstContent.supr_content_onum == merge_catalog_data['supr_content_onum']) + # .values( + # content_onum=merge_catalog_data['content_onum_after'], + # supr_content_onum=merge_catalog_data['supr_content_onum_after'], + # upd_time=datetime.now() + # ) ) + + # await db.execute(stmt) + stmt1 = ( + update(DataAstContentRela) + .where( DataAstContentRela.content_onum == merge_catalog_data['content_onum'] and DataAstContentRela.rela_status == 1 ) + .values( + content_onum=merge_catalog_data['content_onum_after'], + rela_eff_begn_date=datetime.now() + ) + ) + await db.execute(stmt1) + + stmt2 = ( + update(DataAstContent) + .where(DataAstContent.content_onum == merge_catalog_data['content_onum'] , DataAstContent.supr_content_onum == merge_catalog_data['supr_content_onum']) + .values( content_stat = '0' ) + ) + await db.execute(stmt2) + + await cls.update_leaf_node_flag(db) + @classmethod + async def removerel_data_ast_catalog_dao(cls, db: AsyncSession, removerel_catalog_data: dict): + """ + 编辑资产关系数据库操作 + + :param db: orm对象 + :param catalog: 需要更新的目录字典 + :return: + """ + + stmt = ( + update(DataAstContentRela) + .where(DataAstContentRela.rela_onum == removerel_catalog_data['rela_onum'] , DataAstContentRela.content_onum == removerel_catalog_data['content_onum']) + .values( + rela_status=removerel_catalog_data['rela_status'] + ) ) + + await db.execute(stmt) + await cls.update_leaf_node_flag(db) + + + @classmethod + async def moverel_data_ast_catalog_dao(cls, db: AsyncSession, moverel_catalog_data: dict): + """ + 编辑资产关系数据库操作 + + :param db: orm对象 + :param catalog: 需要更新的目录字典 + :return: + """ + + stmt = ( + update(DataAstContentRela) + .where(DataAstContentRela.rela_onum == moverel_catalog_data['rela_onum'] , DataAstContentRela.content_onum == moverel_catalog_data['content_onum']) + .values( + content_onum=moverel_catalog_data['content_onum_after'], + rela_eff_end_date=datetime.now() + ) ) + + await db.execute(stmt) + await cls.update_leaf_node_flag(db) + @classmethod + async def get_catalog_list(cls, db: AsyncSession, query_object: DataCatalogPageQueryModel, user_id: int, is_page: bool = False): + """ + 根据查询参数获取数据资产目录列表 + + :param db: 异步会话对象 + :param query_object: 分页查询参数对象 + :param is_page: 是否分页 + :return: 数据资产目录分页列表 + """ + + + # 修改子查询部分 + subquery_t1 = ( + select(DataAstContentRela) + .where(DataAstContentRela.upd_prsn == query_object.upd_prsn, DataAstContentRela.content_onum == '2' and DataAstContentRela.rela_status == '1') + .union_all( + select(DataAstContentRela) + .where(DataAstContentRela.content_onum != '2' and DataAstContentRela.rela_status == '1') + ) + ).alias('subquery_t1') # 为子查询分配唯一别名 + + query = ( + select( + DataAstContent.content_onum, + DataAstContent.content_name, + DataAstContent.content_stat, + DataAstContent.content_intr, + DataAstContent.content_pic, + DataAstContent.supr_content_onum, + DataAstContent.leaf_node_flag, + DataAstContent.upd_prsn, + DataAstContent.upd_time, + + subquery_t1.c.rela_onum, # 明确指定子查询的字段 + subquery_t1.c.ast_onum, + subquery_t1.c.rela_type, + subquery_t1.c.rela_eff_begn_date, + subquery_t1.c.rela_eff_end_date, + subquery_t1.c.upd_prsn, + ) + .distinct() + .select_from(DataAstContent) + .outerjoin(subquery_t1, DataAstContent.content_onum == subquery_t1.c.content_onum) # 明确使用子查询别名 + .where(DataAstContent.content_stat == 1) + .order_by(DataAstContent.content_onum) + ) + + # 使用分页工具进行查询 + data_ast_list = await PageUtil.paginate( + db, + query, + page_num=query_object.page_num, + page_size=query_object.page_size, + is_page=is_page + ) + + return data_ast_list +#------------------------------------------------------------数据标准(658行)------------------------------------------------------------------------------------------------- + @classmethod + async def get_std_main_list(cls, db: AsyncSession, query_object: DataStdMainModel, is_page: bool = False): + filters = [] + if query_object.std_name: + filters.append(DataStdMain.std_name.like(f"%{query_object.std_name}%")) + if query_object.std_code: + filters.append(DataStdMain.std_code.like(f"%{query_object.std_code}%")) + if query_object.sys_id: + filters.append(DataStdMain.sys_id == query_object.sys_id) + if query_object.std_type: + filters.append(DataStdMain.std_type == query_object.std_type) + if query_object.std_status: + filters.append(DataStdMain.std_status == query_object.std_status) + + query = select(DataStdMain).where(*filters).order_by(desc(DataStdMain.create_time)) + return await PageUtil.paginate(db, query, query_object.page_num, query_object.page_size, is_page) + + @classmethod + async def add_std_main(cls, db: AsyncSession, model: DataStdMainModel): + col = DataStdMain(**model.model_dump()) + db.add(col) + await db.flush() + return col + + @classmethod + async def delete_std_main(cls, db: AsyncSession, Id: str): + await db.execute(delete(DataStdMain).where(DataStdMain.id == Id)) + + @classmethod + async def update_std_main(cls, db: AsyncSession, update_data: DataStdMainModel): + await db.execute(update(DataStdMain).where(DataStdMain.id == update_data.id).values(**update_data.model_dump())) + await db.flush() + + @classmethod + async def get_std_main_by_id(cls, db: AsyncSession, Id: str): + col = await db.execute(select(DataStdMain).where(DataStdMain.id == Id)) + return col.scalars().first() + + @classmethod + async def get_data_main_by_info(cls, db: AsyncSession, query_object: DataStdMainModel): + col = await db.execute( + select(DataStdMain).where( + DataStdMain.std_name == query_object.std_name if query_object.std_name else True, + DataStdMain.std_code == query_object.std_code if query_object.std_code else True, + DataStdMain.std_num == query_object.std_num if query_object.std_num else True, + DataStdMain.sys_id == query_object.sys_id if query_object.sys_id else True, + DataStdMain.std_type == query_object.std_type if query_object.std_type else True, + DataStdMain.std_status == query_object.std_status if query_object.std_status else True + ) + ) + return col.scalars().first() + \ No newline at end of file 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 4bfbe5e..6eb4a2a 100644 --- a/vue-fastapi-backend/module_admin/entity/do/datastd_do.py +++ b/vue-fastapi-backend/module_admin/entity/do/datastd_do.py @@ -1,5 +1,6 @@ -from sqlalchemy import Column, Integer, String, DateTime, Boolean,BigInteger +from sqlalchemy import Column, Integer, String, DateTime,Text, DateTime,Date, BigInteger from config.database import Base +from datetime import datetime # 数据标准模块相关表 @@ -54,3 +55,60 @@ class DataStdDict(Base): tech_dept_id = Column(BigInteger, default=None, comment='技术认责部门') buss_user = Column(String(20), default=None, comment='业务认责人员') tech_user = Column(String(20), default=None, comment='技术认责人员') + +class DataAstContent(Base): + __tablename__ = "t_data_std_content" + + content_onum = Column(Integer, primary_key=True, autoincrement=True, comment='目录序号') + content_name = Column(String(255), nullable=False, comment='目录名称') + content_stat = Column(String(10), nullable=False, comment='目录状态(有效/废弃/停用)') + content_intr = Column(Text, comment='目录简介') + content_pic = Column(String(255), comment='目录负责人') + supr_content_onum = Column(Integer, comment='上级目录序号') + leaf_node_flag = Column(Integer, default=1, comment='叶子节点标志') + upd_prsn = Column(String(255), nullable=False, comment='更新人员') + upd_time = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment='更新时间') + + + + +class DataAstContentRela(Base): + __tablename__ = "t_data_std_content_rela" + + rela_onum = Column(Integer, primary_key=True, autoincrement=True, comment='关系序号') + content_onum = Column(Integer, nullable=False, comment='目录序号') + ast_onum = Column(Integer, nullable=False, comment='资产序号') + rela_type = Column(String(50), default='归属关系', comment='关系类型') + rela_eff_begn_date = Column(Date, nullable=True, comment='关系生效开始日期') + rela_eff_end_date = Column(Date, nullable=True, comment='关系生效结束日期') + upd_prsn = Column(String(255), nullable=False, comment='更新人员') + rela_status = Column(String(18), nullable=True, comment='关系状态') + + +class DataStdMain(Base): + """ + 数据标准表 + """ + __tablename__ = 't_datastd_main' + + id = Column(String(50), primary_key=True, comment='标准代码Id') + create_by = Column(String(20), default='', comment='创建者') + create_time = Column(DateTime, nullable=True, default=None, comment='创建时间') + update_by = Column(String(20), default='', comment='更新者') + update_time = Column(DateTime, nullable=True, default=None, comment='更新时间') + std_num = Column(String(50), default=None, comment='标准编号') + std_code = Column(String(50), default=None, comment='标准英文名') + std_name = Column(String(200), default=None, comment='标准中文名') + std_type = Column(String(1), default=None, comment='标准类型(0:基础数据 1:指标数据)') + sys_name = Column(String(50), default=None, comment='归属系统') + sys_id = Column(Integer, default=None, comment='归属系统Id') + std_menu = Column(String(200), default=None, comment='标准业务定义') + code_num = Column(String(50), default=None, comment='代码编号') + std_status = Column(String(1), default=None, comment='标准状态(1:有效 0:无效)') + buss_dept_id = Column(BigInteger, default=None, comment='业务认责部门') + tech_dept_id = Column(BigInteger, default=None, comment='技术认责部门') + buss_user = Column(String(20), default=None, comment='业务认责人员') + tech_user = Column(String(20), default=None, comment='技术认责人员') + content_onum = Column(Integer, default=None, comment='分类') + std_src = Column(String(20), default=None, comment='标准来源') + data_clas = Column(String(20), default=None, comment='数据类别') \ No newline at end of file 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 1f2a0a7..403afa6 100644 --- a/vue-fastapi-backend/module_admin/entity/vo/datastd_vo.py +++ b/vue-fastapi-backend/module_admin/entity/vo/datastd_vo.py @@ -82,6 +82,40 @@ class DataStdDictModel(BaseModel): tech_user: Optional[str] = Field(default=None, description='技术认责人员') @as_query class DataStdDictPageQueryModel(DataStdDictModel): + """ + 元数据任务分页查询模型 + """ + page_num: int = Field(default=1, description='当前页码') + page_size: int = Field(default=10, description='每页记录数') +class DataStdMainModel(BaseModel): + """ + 标准代码表对应Pydantic模型 (Standard Code Table Pydantic Model) + """ + model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) + + id: Optional[str] = Field(default=None, description='标准代码Id') + create_by: Optional[str] = Field(default='', description='创建者') + create_time: Optional[datetime] = Field(default=None, description='创建时间') + update_by: Optional[str] = Field(default='', description='更新者') + update_time: Optional[datetime] = Field(default=None, description='更新时间') + std_num: Optional[str] = Field(default=None, description='标准编号') + std_code: Optional[str] = Field(default=None, description='标准英文名') + std_name: Optional[str] = Field(default=None, description='标准中文名') + std_type: Optional[str] = Field(default=None, description='标准类型(0:基础数据 1:指标数据)') + sys_name: Optional[str] = Field(default=None, description='归属系统') + sys_id: Optional[int] = Field(default=None, description='归属系统Id') + std_menu: Optional[str] = Field(default=None, description='标准业务定义') + code_num: Optional[str] = Field(default=None, description='代码编号') + std_status: Optional[str] = Field(default=None, description='标准状态(1:有效 0:无效)') + buss_dept_id: Optional[int] = Field(default=None, description='业务认责部门') + tech_dept_id: Optional[int] = Field(default=None, description='技术认责部门') + buss_user: Optional[str] = Field(default=None, description='业务认责人员') + tech_user: Optional[str] = Field(default=None, description='技术认责人员') + content_onum: Optional[int] = Field(default=None, description='分类') + std_src: Optional[str] = Field(default=None, description='标准来源') + data_clas: Optional[str] = Field(default=None, description='数据类别') +@as_query +class DataStdMainPageQueryModel(DataStdMainModel): """ 元数据任务分页查询模型 """ diff --git a/vue-fastapi-backend/module_admin/service/datastd_service.py b/vue-fastapi-backend/module_admin/service/datastd_service.py index 33b7fec..bddd863 100644 --- a/vue-fastapi-backend/module_admin/service/datastd_service.py +++ b/vue-fastapi-backend/module_admin/service/datastd_service.py @@ -3,10 +3,13 @@ from sqlalchemy.ext.asyncio import AsyncSession from exceptions.exception import ServiceException from module_admin.dao.datastd_dao import DataStdDao from module_admin.entity.vo.common_vo import CrudResponseModel -from module_admin.entity.vo.datastd_vo import DataStdCodeModel,DeleteDataStdModel,DataStdDictModel +from module_admin.entity.vo.datastd_vo import DataStdCodeModel,DeleteDataStdModel,DataStdDictModel,DataStdMainModel from utils.common_util import CamelCaseUtil import uuid +from collections import defaultdict +from datetime import datetime from config.constant import CommonConstant +from module_admin.entity.vo.data_ast_content_vo import DataCatalogPageQueryModel, DeleteDataCatalogModel,DataCatalogResponseWithChildren,DataCatalogMovedRequest,DataCatalogMergeRequest,DataCatalogChild,DataCatalogMoverelRequest class DataStdService: """ @@ -391,4 +394,419 @@ class DataStdService: ) if dict_type and dict_type.id != id: return CommonConstant.NOT_UNIQUE - return CommonConstant.UNIQUE \ No newline at end of file + return CommonConstant.UNIQUE + # ----------------------------------------------------------------数据标准分类---------------------------------------------------------------------------------------------------- + @classmethod + async def get_catalog_list_services( + cls, query_db: AsyncSession, query_object: DataCatalogPageQueryModel, user_id: int, is_page: bool = False + ): + """ + 获取数据目录列表信息service + + :param query_db: orm对象 + :param query_object: 查询参数对象 + :param is_page: 是否开启分页 + :return: 数据目录列表信息对象 + """ + catalog_list_result = await DataStdDao.get_catalog_list(query_db, query_object, user_id, is_page) + + # 按contentOnum分组 + grouped = defaultdict(list) + for item in catalog_list_result.rows: + grouped[item['contentOnum']].append(item) + + nodes = {} # 存储所有处理后的节点 + + # 处理每个组,生成节点 + for content_onum, items in grouped.items(): + first_item = items[0] + is_leaf = first_item['leafNodeFlag'] == 1 + rela_onum = first_item['relaOnum'] is not None + + # 公共字段提取 + common_fields = { + 'contentOnum': first_item['contentOnum'], + 'contentName': first_item['contentName'], + 'contentStat': first_item['contentStat'], + 'contentIntr': first_item['contentIntr'], + 'contentPic': first_item['contentPic'], + 'suprContentOnum': first_item['suprContentOnum'], + 'leafNodeFlag': first_item['leafNodeFlag'], + 'updPrsn': first_item['updPrsn'], + 'updTime': first_item['updTime'], + 'children': [] + } + + nodes[content_onum] = common_fields + + + # 构建父子关系 + root = None + for content_onum, node in nodes.items(): + supr = node['suprContentOnum'] + if supr is None: + root = node + else: + parent = nodes.get(supr) + if parent: + parent['children'].append(node) + + # 对每个父节点的children进行排序,将'临时的节点'放到最后 + for content_onum, node in nodes.items(): + if 'children' in node: + # 排序时,'临时的节点'会被放到最后 + node['children'] = sorted( + node['children'], + key=lambda x: x['contentName'] == '临时', + reverse=False # True会将'临时的节点'排在最前面,False是排在最后 + ) + + print('获取数据清单内容:',root) + + catalog_list_result.rows = [root] + + return catalog_list_result + + @classmethod + async def get_catalog_detail_services(cls, query_db: AsyncSession, content_onum: int): + """ + 获取数据目录详细信息service + + :param query_db: orm对象 + :param content_onum: 数据目录ID + :return: 数据目录详细信息对象 + """ + + catalog_detail_result = await DataStdDao.get_catalog_by_id(query_db, content_onum) + + return catalog_detail_result + + @classmethod + async def add_catalog_services(cls, query_db: AsyncSession, request: DataCatalogResponseWithChildren): + """ + 新增数据目录信息service + + :param query_db: orm对象 + :param request: 新增数据目录请求对象 + :return: 新增目录操作结果 + """ + catalog_data1 = { + 'content_name': request.content_name, + 'content_stat': request.content_stat, + 'content_intr': request.content_intr, + 'content_pic': request.content_pic, + 'supr_content_onum': request.supr_content_onum, + 'leaf_node_flag': request.leaf_node_flag, + 'upd_prsn': request.upd_prsn + } + catalog_data2 = { + 'content_name': request.content_name, + 'content_stat': request.content_stat, + 'content_intr': request.content_intr, + 'content_pic': request.content_pic, + 'supr_content_onum': request.supr_content_onum, + 'leaf_node_flag': request.leaf_node_flag, + 'upd_prsn': request.upd_prsn, + 'children': [child.model_dump() for child in request.children] # 将 children 转换为字典列表 + } + + + try: + for child in catalog_data2["children"]: + child["rela_eff_begn_date"] = datetime.now().strftime("%Y-%m-%d %H:%M:%S"), # 设置默认值,当前时间 + child["rela_eff_end_date"] = datetime(year=2999, month=12, day=31, hour=0, minute=0, second=0).strftime("%Y-%m-%d %H:%M:%S"), # 设置默认值,2999-12-31 + child["upd_prsn"] = request.upd_prsn, + child["rela_status"] = "1" + + new_catalog = await DataStdDao.add_catalog_dao(query_db, catalog_data1, catalog_data2) + await query_db.commit() + return CrudResponseModel(is_success=True, message='新增成功', data=new_catalog) + except Exception as e: + await query_db.rollback() + raise ServiceException(message=f"创建目录时发生错误: {str(e)}") + + @classmethod + async def edit_catalog_leaf_services(cls, query_db: AsyncSession,content_onum : int, leaf_node_flag : int): + """ + 编辑数据目录信息service + + :param query_db: orm对象 + :param request: 编辑数据目录请求对象 + :return: 编辑目录操作结果 + """ + catalog_data1 = { + 'content_onum': content_onum, + 'leaf_node_flag': leaf_node_flag + } + try: + await DataStdDao.edit_catalog_leaf_dao(query_db, catalog_data1) + await query_db.commit() + return CrudResponseModel(is_success=True, message='更新成功') + except Exception as e: + await query_db.rollback() + raise ServiceException(message=f"更新目录时发生错误: {str(e)}") + + + @classmethod + async def edit_catalog_child_services(cls, query_db: AsyncSession, request: DataCatalogResponseWithChildren): + """ + 编辑数据目录信息service + + :param query_db: orm对象 + :param request: 编辑数据目录请求对象 + :return: 编辑目录操作结果 + """ + + catalog_data = { + 'content_onum': request.content_onum, + 'content_name': request.content_name, + 'content_stat': request.content_stat, + 'content_intr': request.content_intr, + 'content_pic': request.content_pic, + 'supr_content_onum': request.supr_content_onum, + 'leaf_node_flag': request.leaf_node_flag, + 'upd_prsn': request.upd_prsn, + 'children': [child.model_dump() for child in request.children] # 将 children 转换为字典列表 + } + + try: + for child in catalog_data["children"]: + # 设置 rela_eff_begn_date + if child.get("rela_eff_begn_date"): + child["rela_eff_begn_date"] = child["rela_eff_begn_date"].strftime("%Y-%m-%d %H:%M:%S") + else: + child["rela_eff_begn_date"] = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + + # 设置 rela_eff_end_date + if child.get("rela_eff_end_date"): + child["rela_eff_end_date"] = child["rela_eff_end_date"].strftime("%Y-%m-%d %H:%M:%S") + else: + child["rela_eff_end_date"] = datetime(year=2999, month=12, day=31, hour=0, minute=0, second=0).strftime("%Y-%m-%d %H:%M:%S") + + child["upd_prsn"] = request.upd_prsn + child["rela_status"] = "1" + await DataStdDao.edit_catalog_child_dao(query_db, catalog_data) + await query_db.commit() + return CrudResponseModel(is_success=True, message='更新成功') + except Exception as e: + await query_db.rollback() + raise ServiceException(message=f"更新目录时发生错误: {str(e)}") + + @classmethod + async def delete_catalog_services(cls, query_db: AsyncSession, request: DeleteDataCatalogModel,user_id): + """ + 删除数据目录信息service + + :param query_db: orm对象 + :param request: 删除数据目录请求对象 + :return: 删除目录操作结果 + """ + if request.content_onums: + content_onum_list = request.content_onums.split(',') + try: + for content_onum in content_onum_list: + catalog = await cls.get_catalog_detail_services(query_db, int(content_onum)) + if not catalog: + raise ServiceException(message=f'目录ID {content_onum} 不存在') + await DataStdDao.delete_catalog_dao(query_db, DeleteDataCatalogModel(content_onums=content_onum)) + # await DataStdDao.delete_ast_book_mark_rela_by_content_onum(query_db, int(content_onum), user_id) + await query_db.commit() + return CrudResponseModel(is_success=True, message='删除成功') + except Exception as e: + await query_db.rollback() + raise e + else: + raise ServiceException(message='传入目录id为空') + + + + + @classmethod + async def get_data_asset_catalog_tree_services(cls, query_db: AsyncSession): + """ + 获取数据资产树信息service + + :param query_db: orm对象 + :return: 数据资产树信息对象 + """ + # 从 DAO 层获取数据 + rows = await DataStdDao.get_data_asset_catalog_tree(query_db) + # 使用字典暂存分组数据 + sys_groups = {} + + for item in rows: + sys_name, eng_name, cn_name, ast_no = item + # 创建或获取系统分组 + if sys_name not in sys_groups: + sys_groups[sys_name] = { + "dataAssetSysName": sys_name, + "children": [] + } + + # 添加子节点 + sys_groups[sys_name]["children"].append({ + "dataAssetCatalogNo": eng_name, + "dataAssetCatalogName": cn_name, + "dataAssetCatalogAstno": ast_no + }) + results = list(sys_groups.values()) + # 转换为最终列表格式 + return results + + @classmethod + async def moved_catalog_instr_services(cls, query_db: AsyncSession, request: DataCatalogMovedRequest): + + """ + 移动数据目录service + """ + + moved_catalog_data = { + 'content_onum': request.content_onum, + 'supr_content_onum': request.supr_content_onum, + 'supr_content_onum_after': request.supr_content_onum_after + } + + + try: + await DataStdDao.moved_catalog_instr_dao(query_db, moved_catalog_data) + await query_db.commit() + return CrudResponseModel(is_success=True, message='目录移动成功') + except Exception as e: + await query_db.rollback() + raise ServiceException(message=f"移动目录时发生错误: {str(e)}") + + + + + @classmethod + async def merge_catalog_instr_services(cls, query_db: AsyncSession, request: DataCatalogMergeRequest): + + """ + 移动数据目录service + """ + + merge_catalog_data = { + 'content_onum': request.content_onum, + 'supr_content_onum': request.supr_content_onum, + 'content_onum_after': request.content_onum_after, + 'supr_content_onum_after': request.supr_content_onum_after + } + try: + await DataStdDao.merge_catalog_instr_dao(query_db, merge_catalog_data) + await query_db.commit() + return CrudResponseModel(is_success=True, message='目录合并成功') + except Exception as e: + await query_db.rollback() + raise ServiceException(message=f"目录合并时发生错误: {str(e)}") + + + @classmethod + async def removerel_data_ast_catalog_services(cls, query_db: AsyncSession, request: DataCatalogChild): + + """ + 移除数据资产目录service + """ + + removerel_catalog_data = { + 'rela_onum': request.rela_onum, + 'content_onum': request.content_onum, + 'ast_onum': request.ast_onum, + 'rela_type': request.rela_type, + 'rela_eff_begn_date': request.rela_eff_begn_date, + 'rela_eff_end_date': request.rela_eff_end_date, + 'upd_prsn': request.upd_prsn, + 'rela_status': request.rela_status + } + + + try: + await DataStdDao.removerel_data_ast_catalog_dao(query_db, removerel_catalog_data) + await query_db.commit() + return CrudResponseModel(is_success=True, message='资产移除成功') + except Exception as e: + await query_db.rollback() + raise ServiceException(message=f"移除资产时发生错误: {str(e)}") + + + + @classmethod + async def moverel_data_ast_catalog_services(cls, query_db: AsyncSession, request: DataCatalogMoverelRequest): + + """ + 移动数据目录service + """ + + moverel_catalog_data = { + 'rela_onum': request.rela_onum, + 'content_onum': request.content_onum, + 'content_onum_after': request.content_onum_after + } + + + try: + await DataStdDao.moverel_data_ast_catalog_dao(query_db, moverel_catalog_data) + await query_db.commit() + return CrudResponseModel(is_success=True, message='资产移动成功') + except Exception as e: + await query_db.rollback() + raise ServiceException(message=f"资产移动时发生错误: {str(e)}") +#------------------------------------------------------------数据标准-------------------------------------------------------------------------------------------------------------- + @classmethod + async def check_std_num_unique(cls, query_db: AsyncSession, model: DataStdMainModel): + """ + 校验标准编号是否唯一 + """ + id = '-1' if model.id is None else model.id + check_model = DataStdMainModel() + check_model.std_num=model.std_num + existing = await DataStdDao.get_data_main_by_info(query_db, check_model) + return CommonConstant.NOT_UNIQUE if existing and existing.id != id else CommonConstant.UNIQUE + + @classmethod + async def get_std_main_list(cls, query_db: AsyncSession, query_object: DataStdMainModel, is_page: bool = False): + return await DataStdDao.get_std_main_list(query_db, query_object, is_page) + + @classmethod + async def get_std_main_by_id(cls, query_db: AsyncSession, id: str): + mainstd= await DataStdDao.get_std_main_by_id(query_db, id) + if mainstd: + return DataStdMainModel(**CamelCaseUtil.transform_result(mainstd)) + + else: + return DataStdMainModel(**dict()) + @classmethod + async def add_std_main(cls, query_db: AsyncSession, model: DataStdMainModel): + if not await cls.check_std_num_unique(query_db, model): + raise ServiceException(message=f"标准编号 {model.std_num} 已存在") + model.id=str(uuid.uuid4()) + await DataStdDao.add_std_main(query_db, model) + return CrudResponseModel(is_success=True, message='新增标准成功') + + @classmethod + async def edit_std_main(cls, query_db: AsyncSession, model: DataStdMainModel): + if not await cls.check_std_num_unique(query_db, model): + raise ServiceException(message=f"标准编号 {model.std_num} 已存在") + existing = await cls.get_std_main_by_id(query_db, model.id) + if existing: + await DataStdDao.update_std_main(query_db, model.model_dump(exclude_unset=True)) + return CrudResponseModel(is_success=True, message='编辑标准成功') + else: + raise ServiceException(message=f'标准 {model.id} 不存在') + + @classmethod + async def delete_std_main(cls, query_db: AsyncSession, ids: str): + if ids: + col_id_list = ids.split(',') + try: + for col_id in col_id_list: + col_info = await cls.get_std_main_by_id(query_db, col_id) + if col_info: + # 校验不能删除的系统内置列 + await DataStdDao.delete_std_main(query_db, col_id) + await query_db.commit() + return CrudResponseModel(is_success=True, message='删除标准成功') + except Exception as e: + await query_db.rollback() + raise e + else: + raise ServiceException(message='传入标准ID为空') \ No newline at end of file diff --git a/vue-fastapi-frontend/src/api/datastd/directory.js b/vue-fastapi-frontend/src/api/datastd/directory.js new file mode 100644 index 0000000..164ec33 --- /dev/null +++ b/vue-fastapi-frontend/src/api/datastd/directory.js @@ -0,0 +1,110 @@ +import request from '@/utils/request' + +export function getDirectoryTree(params) { + return request({ + url: '/default-api/datastd/cata/list', + method: 'get', + params, + }) +} + +export function getDirectory(id) { + return request({ + url: `/default-api/datastd/cata/${id}`, + method: 'get', + }) +} + +export function addDirectory(data) { + return request({ + url: '/default-api/datastd/cata', + method: 'post', + data, + }) +} + +export function updateDirectory(data) { + return request({ + url: `/default-api/datastd/cata/edit`, + method: 'put', + data, + }) +} + +export function delDirectory(id) { + return request({ + url: `/default-api/datastd/cata/${id}`, + method: 'delete', + }) +} + +export function addDirectoryCollection(data) { + return request({ + url: '/default-api/datastd/cata/bookmark ', + method: 'post', + data, + }) +} + +export function cancelDirectoryCollection(id) { + return request({ + url: `/default-api/datastd/cata/bookmark/${id}`, + method: 'delete', + }) +} + +export function delDirectoryCollection(data) { + return request({ + url: '/default-api/system/delete_data_asset_collection', + method: 'delete', + data, + }) +} + +export function moveDirectory(data) { + return request({ + url: '/default-api/datastd/cata/moved', + method: 'put', + data, + }) +} + +export function mergeDirectory(data) { + return request({ + url: '/default-api/datastd/cata/merge', + method: 'put', + data, + }) +} + +export function delDirectoryAsset(data) { + return request({ + url: '/default-api/datastd/cata/removerel', + method: 'put', + data, + }) +} + +export function moveDirectoryAsset(data) { + return request({ + url: '/default-api/datastd/cata/moverel', + method: 'put', + data, + }) +} + +export function getDirectoryAsset(params) { + return request({ + url: '/default-api/datastd/cata/atree', + method: 'get', + params, + }) +} + +export function getHtmlString(params) { + return request({ + url: '/default-api/datastd/cata/indx/list', + method: 'get', + params, + }) +} diff --git a/vue-fastapi-frontend/src/api/datastd/std.js b/vue-fastapi-frontend/src/api/datastd/std.js index dc8d968..9dfb816 100644 --- a/vue-fastapi-frontend/src/api/datastd/std.js +++ b/vue-fastapi-frontend/src/api/datastd/std.js @@ -174,4 +174,54 @@ export function deleteStdDicts(colIds) { method: 'delete' }) } +// 查询数据标准列表 +export function listStdMain(query) { + return request({ + url: '/default-api/datastd/stdmain/main/list', + method: 'get', + params: query + }) +} + + + +// 查询数据标准详情 +export function getStdMain(colId) { + return request({ + url: '/default-api/datastd/stdmain/main/' + parseStrEmpty(colId), + method: 'get' + }) +} + + +// 新增数据标准 +export function addStdMain(data) { + return request({ + url: '/default-api/datastd/stdmain/main', + method: 'post', + data: data + }) +} + + + +// 修改数据标准 +export function updateStdMain(data) { + return request({ + url: '/default-api/datastd/stdmain/main', + method: 'put', + data: data + }) +} + + +// 删除数据标准 +export function deleteStdMain(colId) { + return request({ + url: '/default-api/datastd/stdmain/main/' + colId, + method: 'delete' + }) +} + + diff --git a/vue-fastapi-frontend/src/views/datastd/main/components/AddEditForm.vue b/vue-fastapi-frontend/src/views/datastd/main/components/AddEditForm.vue new file mode 100644 index 0000000..abcecab --- /dev/null +++ b/vue-fastapi-frontend/src/views/datastd/main/components/AddEditForm.vue @@ -0,0 +1,203 @@ + + + diff --git a/vue-fastapi-frontend/src/views/datastd/main/components/AssetMoveDialog.vue b/vue-fastapi-frontend/src/views/datastd/main/components/AssetMoveDialog.vue new file mode 100644 index 0000000..f152fcf --- /dev/null +++ b/vue-fastapi-frontend/src/views/datastd/main/components/AssetMoveDialog.vue @@ -0,0 +1,171 @@ + + + + + diff --git a/vue-fastapi-frontend/src/views/datastd/main/components/FormDialog.vue b/vue-fastapi-frontend/src/views/datastd/main/components/FormDialog.vue new file mode 100644 index 0000000..36a1398 --- /dev/null +++ b/vue-fastapi-frontend/src/views/datastd/main/components/FormDialog.vue @@ -0,0 +1,193 @@ + + + diff --git a/vue-fastapi-frontend/src/views/datastd/main/components/MergerDialog.vue b/vue-fastapi-frontend/src/views/datastd/main/components/MergerDialog.vue new file mode 100644 index 0000000..305cd4e --- /dev/null +++ b/vue-fastapi-frontend/src/views/datastd/main/components/MergerDialog.vue @@ -0,0 +1,175 @@ + + + + + diff --git a/vue-fastapi-frontend/src/views/datastd/main/components/MoveDialog.vue b/vue-fastapi-frontend/src/views/datastd/main/components/MoveDialog.vue new file mode 100644 index 0000000..1bb5956 --- /dev/null +++ b/vue-fastapi-frontend/src/views/datastd/main/components/MoveDialog.vue @@ -0,0 +1,173 @@ + + + + + diff --git a/vue-fastapi-frontend/src/views/datastd/main/index.vue b/vue-fastapi-frontend/src/views/datastd/main/index.vue new file mode 100644 index 0000000..5bdb643 --- /dev/null +++ b/vue-fastapi-frontend/src/views/datastd/main/index.vue @@ -0,0 +1,651 @@ + + + + + diff --git a/vue-fastapi-frontend/src/views/datastd/stddict/index.vue b/vue-fastapi-frontend/src/views/datastd/stddict/index.vue index 67a1be1..ee35c15 100644 --- a/vue-fastapi-frontend/src/views/datastd/stddict/index.vue +++ b/vue-fastapi-frontend/src/views/datastd/stddict/index.vue @@ -35,9 +35,14 @@ - + - + 搜索 重置 @@ -53,7 +58,8 @@ icon="Plus" @click="handleAdd" v-hasPermi="['meta:metaSecurityCol:add']" - >新增 + >新增 修改 + >修改 删除 + >删除 - + - - - - - - + + + + + + - - - - + + + + @@ -105,52 +141,104 @@ /> - - - - - - + + + + + + - + - + :data="selectedRow" + :isEdit="isEdit" + :dbResourceOldList="dbResourceOldList" + v-model:visible="dialogVisible" + @refresh="getList" + />