From e64e14a5af1c03f9679f23d5591fd8ac911e45e3 Mon Sep 17 00:00:00 2001 From: xueyinfei <1207092115@qq.com> Date: Sat, 23 Aug 2025 16:28:32 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=83=E6=95=B0=E6=8D=AE=E6=A0=87=E7=AD=BE?= =?UTF-8?q?=E8=AE=A1=E7=AE=97=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/metadata_config_controller.py | 66 +++---- .../dao/batch_label_config_dao.py | 48 +++-- .../entity/do/metadata_config_do.py | 20 +- .../entity/vo/metadata_config_vo.py | 127 +++++++------ .../service/batch_label_config_service.py | 132 ++++--------- .../src/api/metadataConfig/metadataConfig.js | 17 +- .../views/metadataConfig/metaclas/index.vue | 179 +++++++++++++----- 7 files changed, 317 insertions(+), 272 deletions(-) diff --git a/vue-fastapi-backend/module_admin/controller/metadata_config_controller.py b/vue-fastapi-backend/module_admin/controller/metadata_config_controller.py index a95a041..eaab5d6 100644 --- a/vue-fastapi-backend/module_admin/controller/metadata_config_controller.py +++ b/vue-fastapi-backend/module_admin/controller/metadata_config_controller.py @@ -21,11 +21,10 @@ from module_admin.entity.vo.metadata_config_vo import ( SecuBizPermiConfigBatchModel, SecuBizPermiConfigPageQueryModel, BatchBusiLabelConfigModel, - BatchDataopLabelConfigModel, BatchDatatypeLabelConfigModel, - BatchBusiLabelConfigPageQueryModel, + ColOpTypeLabelPageQueryModel, BatchDataopLabelConfigModelVo, - BatchDataopLabelModelPageQueryModel, + BatchBusiLabelConfigPageQueryModel, BatchDatatypeLabelConfigPageQueryModel, DatasecConfigPageQueryModel, DatasecConfigModel, @@ -325,6 +324,17 @@ async def get_busi_label_list( return ResponseUtil.success(data=result) +@metadataConfigController.get('/colOpTypeLabel/list', response_model=PageResponseModel) +async def get_col_optype_label_list( + request: Request, + query: ColOpTypeLabelPageQueryModel = Depends(ColOpTypeLabelPageQueryModel.as_query), + query_db: AsyncSession = Depends(get_db), +): + result = await BatchLabelConfigService.get_col_optype_list_services(query_db, query, False) + logger.info('获取业务标签配置列表成功') + return ResponseUtil.success(data=result) + + @metadataConfigController.post('/busiLabel') @ValidateFields(validate_model='add_busi_label') async def add_busi_label( @@ -379,17 +389,6 @@ async def get_busi_label_detail( return ResponseUtil.success(data=result) -@metadataConfigController.get('/dataopLabel/list', response_model=PageResponseModel) -async def get_dataop_label_list( - request: Request, - query: BatchDataopLabelConfigModel = Depends(BatchDataopLabelModelPageQueryModel.as_query), - query_db: AsyncSession = Depends(get_db), -): - result = await BatchLabelConfigService.get_dataop_vo_services(query_db, query, is_page=True) - logger.info('获取操作标签配置列表成功') - return ResponseUtil.success(data=result) - - @metadataConfigController.post('/dataopLabel') @ValidateFields(validate_model='add_dataop_label') async def add_dataop_label( @@ -397,7 +396,6 @@ async def add_dataop_label( model: BatchDataopLabelConfigModelVo, query_db: AsyncSession = Depends(get_db), current_user: CurrentUserModel = Depends(LoginService.get_current_user), - ): model.upd_by = current_user.user.user_name model.upd_time = datetime.now() @@ -410,7 +408,7 @@ async def add_dataop_label( @ValidateFields(validate_model='edit_dataop_label') async def edit_dataop_label( request: Request, - model: BatchDataopLabelConfigModel, + model: BatchDataopLabelConfigModelVo, query_db: AsyncSession = Depends(get_db), current_user: CurrentUserModel = Depends(LoginService.get_current_user), @@ -433,17 +431,6 @@ async def delete_dataop_label( return ResponseUtil.success(msg=result.message) -@metadataConfigController.get('/dataopLabel/{onum}', response_model=BatchDataopLabelConfigModel) -async def get_dataop_label_detail( - request: Request, - onum: str, - query_db: AsyncSession = Depends(get_db), -): - result = await BatchLabelConfigService.get_dataop_detail_services(query_db, onum) - logger.info(f'获取操作标签配置 onum={onum} 详情成功') - return ResponseUtil.success(data=result) - - @metadataConfigController.get('/datatypeLabel/list', response_model=PageResponseModel) async def get_datatype_label_list( request: Request, @@ -751,6 +738,8 @@ async def task_biz_DS_meta_metatask_delete( edit_config_result = await MetadataConfigService.ds_metatask_delete(request, query_db, process, current_user) return ResponseUtil.success(msg=edit_config_result) + + # --------------------------------------------------------------------------------标签树--------------------------------------------------- @metadataConfigController.get( '/cata/list', response_model=PageResponseModel) @@ -763,23 +752,28 @@ async def get_data_catalog_list( # 设置字段 user_id = current_user.user.user_id # 获取分页数据 - catalog_page_query_result = await MetadataConfigService.get_catalog_list_services(query_db, catalog_page_query, user_id, - is_page=True) + catalog_page_query_result = await MetadataConfigService.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) + + @metadataConfigController.delete('/cata/{content_onums}', - ) + ) @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 MetadataConfigService.delete_catalog_services(query_db, delete_catalog, - user_id=current_user.user.user_id) + user_id=current_user.user.user_id) logger.info(delete_catalog_result.message) return ResponseUtil.success(msg=delete_catalog_result.message) + + @metadataConfigController.put('/cata/removerel') @ValidateFields(validate_model='removerel_data_ast_catalog') @Log(title='标准分类管理', business_type=BusinessType.UPDATE) @@ -795,6 +789,8 @@ async def removerel_data_ast_catalog( # 返回标准化响应 return ResponseUtil.success() + + @metadataConfigController.put('/cata/moved') @ValidateFields(validate_model='moved_data_catalog') @Log(title='标准分类管理', business_type=BusinessType.UPDATE) @@ -831,6 +827,8 @@ async def moved_data_catalog( return ResponseUtil.success( msg=merge_result.message ) + + @metadataConfigController.put('/cata/moverel') @ValidateFields(validate_model='moverel_data_ast_catalog') @Log(title='标准分类管理', business_type=BusinessType.UPDATE) @@ -846,6 +844,8 @@ async def moverel_data_ast_catalog( # 返回标准化响应 return ResponseUtil.success() + + @metadataConfigController.put('/cata/edit') @ValidateFields(validate_model='edit_data_catalog') @Log(title='标准分类管理', business_type=BusinessType.UPDATE) @@ -866,6 +866,8 @@ async def edit_data_catalog( return ResponseUtil.success( msg=edit_result.message ) + + @metadataConfigController.post('/cata') @ValidateFields(validate_model='add_data_catalog') @Log(title='标准分类管理', business_type=BusinessType.INSERT) @@ -892,4 +894,4 @@ async def add_data_catalog( # 返回标准化响应 return ResponseUtil.success( msg=add_result.message - ) \ No newline at end of file + ) diff --git a/vue-fastapi-backend/module_admin/dao/batch_label_config_dao.py b/vue-fastapi-backend/module_admin/dao/batch_label_config_dao.py index 8ea6cc4..478b6c9 100644 --- a/vue-fastapi-backend/module_admin/dao/batch_label_config_dao.py +++ b/vue-fastapi-backend/module_admin/dao/batch_label_config_dao.py @@ -1,9 +1,11 @@ -from sqlalchemy import delete, select, update,and_ +from sqlalchemy import delete, select, update, and_ from sqlalchemy.ext.asyncio import AsyncSession -from module_admin.entity.do.metadata_config_do import BatchBusiLabelConfig,BatchDataopLabelConfig,BatchDatatypeLabelConfig +from module_admin.entity.do.metadata_config_do import BatchBusiLabelConfig, BatchDataopLabelConfig, \ + BatchDatatypeLabelConfig from utils.page_util import PageUtil + class BatchLabelConfigDAO: # region === BatchBusiLabelConfig === @@ -17,11 +19,20 @@ class BatchLabelConfigDAO: async def get_busi_list(cls, db: AsyncSession, query_object, is_page: bool = False): query = select(BatchBusiLabelConfig).where( BatchBusiLabelConfig.mdl_name == query_object.mdl_name if query_object.mdl_name else True, - BatchBusiLabelConfig.ssys_cd == query_object.ssys_cd if query_object.ssys_cd else True, + BatchBusiLabelConfig.ssys_id == query_object.ssys_id if query_object.ssys_id else True, ).order_by(BatchBusiLabelConfig.upd_time.desc()) return await PageUtil.paginate(db, query, query_object.page_num, query_object.page_size, is_page) + @classmethod + async def get_col_optype_list(cls, db: AsyncSession, query_object, is_page: bool = False): + query = select(BatchDataopLabelConfig).where( + BatchDataopLabelConfig.mdl_name.like(f'%{query_object.mdl_name}%') if query_object.mdl_name else True, + BatchDataopLabelConfig.ssys_id == query_object.ssys_id if query_object.ssys_id else True, + ).order_by(BatchDataopLabelConfig.upd_time.desc()) + + return await PageUtil.paginate(db, query, query_object.page_num, query_object.page_size, is_page) + @classmethod async def add_busi(cls, db: AsyncSession, obj): db_obj = BatchBusiLabelConfig(**obj.model_dump()) @@ -50,35 +61,21 @@ class BatchLabelConfigDAO: async def get_dataop_list(cls, db: AsyncSession, query_object, is_page: bool = False): query = select(BatchDataopLabelConfig).where( BatchDataopLabelConfig.mdl_name == query_object.mdl_name if query_object.mdl_name else True, - BatchDataopLabelConfig.ssys_cd == query_object.ssys_cd if query_object.ssys_cd else True, + BatchDataopLabelConfig.ssys_id == query_object.ssys_id if query_object.ssys_id else True, ) - + return await PageUtil.paginate(db, query, query_object.page_num, query_object.page_size, is_page) - @classmethod - async def get_dataop_list_all(cls, db: AsyncSession, query_object): - conditions = [] - - if query_object.mdl_name: - conditions.append(BatchDataopLabelConfig.mdl_name == query_object.mdl_name) - - if query_object.ssys_cd: - conditions.append(BatchDataopLabelConfig.ssys_cd == query_object.ssys_cd) - - stmt = select(BatchDataopLabelConfig).where(*conditions) - - result = await db.execute(stmt) - return result.scalars().all() @classmethod async def add_dataop(cls, db: AsyncSession, obj): - db_obj = BatchDataopLabelConfig(**obj.model_dump()) - db.add(db_obj) + db.add(obj) await db.flush() - return db_obj + return obj @classmethod async def edit_dataop(cls, db: AsyncSession, onum: int, update_data: dict): - await db.execute(update(BatchDataopLabelConfig).where(BatchDataopLabelConfig.onum == onum).values(**update_data)) + await db.execute( + update(BatchDataopLabelConfig).where(BatchDataopLabelConfig.onum == onum).values(**update_data)) @classmethod async def delete_dataop(cls, db: AsyncSession, onum_list: list[int]): @@ -97,7 +94,7 @@ class BatchLabelConfigDAO: async def get_datatype_list(cls, db: AsyncSession, query_object, is_page: bool = False): query = select(BatchDatatypeLabelConfig).where( BatchDatatypeLabelConfig.mdl_name == query_object.mdl_name if query_object.mdl_name else True, - BatchDatatypeLabelConfig.ssys_cd == query_object.ssys_cd if query_object.ssys_cd else True, + BatchDatatypeLabelConfig.ssys_id == query_object.ssys_id if query_object.ssys_id else True, ).order_by(BatchDatatypeLabelConfig.upd_time.desc()) return await PageUtil.paginate(db, query, query_object.page_num, query_object.page_size, is_page) @@ -111,7 +108,8 @@ class BatchLabelConfigDAO: @classmethod async def edit_datatype(cls, db: AsyncSession, onum: int, update_data: dict): - await db.execute(update(BatchDatatypeLabelConfig).where(BatchDatatypeLabelConfig.onum == onum).values(**update_data)) + await db.execute( + update(BatchDatatypeLabelConfig).where(BatchDatatypeLabelConfig.onum == onum).values(**update_data)) @classmethod async def delete_datatype(cls, db: AsyncSession, onum_list: list[int]): diff --git a/vue-fastapi-backend/module_admin/entity/do/metadata_config_do.py b/vue-fastapi-backend/module_admin/entity/do/metadata_config_do.py index 5fc0a53..46994ce 100644 --- a/vue-fastapi-backend/module_admin/entity/do/metadata_config_do.py +++ b/vue-fastapi-backend/module_admin/entity/do/metadata_config_do.py @@ -114,7 +114,7 @@ class BatchBusiLabelConfig(Base): onum = Column(Integer, primary_key=True, autoincrement=True, comment="唯一编号") regex_name = Column(String(255), nullable=True, comment="正则表达式名称") regex_pattern = Column(String(255), nullable=True, comment="正则表达式") - ssys_cd = Column(String(50), nullable=True) + ssys_id = Column(Integer, nullable=True) mdl_name = Column(String(50), nullable=True) ratio = Column(DECIMAL(10, 4), nullable=True) upd_by = Column(String(50), nullable=True) @@ -125,18 +125,14 @@ class BatchDataopLabelConfig(Base): """ 批处理数据操作标签配置表 ORM 映射类,对应表 t_batch_dataop_label_config """ - __tablename__ = "t_batch_dataop_label_config" + __tablename__ = "t_batch_dataoptype_label_config" onum = Column(Integer, primary_key=True, autoincrement=True, comment="唯一编号") - optype = Column(String(50), nullable=True, comment="唯一类型,忽略类型") - config1 = Column(DECIMAL(10, 4), nullable=True, comment="参数1") - config2 = Column(DECIMAL(10, 4), nullable=True, comment="参数2") - config3 = Column(DECIMAL(10, 4), nullable=True, comment="参数3") - config4 = Column(DECIMAL(10, 4), nullable=True, comment="参数4") - config5 = Column(DECIMAL(10, 4), nullable=True, comment="参数5") - config6 = Column(DECIMAL(10, 4), nullable=True, comment="参数6") - config7 = Column(DECIMAL(10, 4), nullable=True, comment="参数7") - ssys_cd = Column(String(50), nullable=True) + op_type = Column(String(50), nullable=True, comment="唯一类型,忽略类型") + col_type = Column(String(50), nullable=True, comment="字段类型") + col_attr = Column(String(50), nullable=True, comment="字段属性") + ratio = Column(DECIMAL(10, 4), nullable=True, comment="阈值") + ssys_id = Column(Integer, nullable=True) mdl_name = Column(String(50), nullable=True) upd_by = Column(String(50), nullable=True) upd_time = Column(DateTime, nullable=True, comment='更新时间') @@ -151,7 +147,7 @@ class BatchDatatypeLabelConfig(Base): onum = Column(Integer, primary_key=True, autoincrement=True, comment="唯一编号") datatype = Column(String(100), nullable=True, comment="字段类型") ratio = Column(DECIMAL(10, 4), nullable=True, comment="比率") - ssys_cd = Column(String(50), nullable=True) + ssys_id = Column(Integer, nullable=True) mdl_name = Column(String(50), nullable=True) upd_by = Column(String(50), nullable=True) upd_time = Column(DateTime, nullable=True, comment='更新时间') diff --git a/vue-fastapi-backend/module_admin/entity/vo/metadata_config_vo.py b/vue-fastapi-backend/module_admin/entity/vo/metadata_config_vo.py index 15a178c..96300c9 100644 --- a/vue-fastapi-backend/module_admin/entity/vo/metadata_config_vo.py +++ b/vue-fastapi-backend/module_admin/entity/vo/metadata_config_vo.py @@ -2,7 +2,7 @@ from datetime import datetime from pydantic import BaseModel, ConfigDict, Field from pydantic.alias_generators import to_camel from pydantic_validation_decorator import NotBlank, Size -from typing import Literal, Optional,List +from typing import Literal, Optional, List from module_admin.annotation.pydantic_annotation import as_query @@ -39,7 +39,6 @@ class MetadataClasQueryModel(MetadataClasModel): end_time: Optional[str] = Field(default=None, description='结束时间') - @as_query class MetadataClasPageQueryModel(MetadataClasQueryModel): """ @@ -58,6 +57,7 @@ class DeleteMetadataClasModel(BaseModel): clas_onums: str = Field(description='需要删除的标签主键(多个用逗号分隔)') + class MetadataSecModel(BaseModel): """ 数据安全配置表对应 Pydantic 模型 @@ -80,6 +80,8 @@ class MetadataSecModel(BaseModel): def validate_fields(self): self.get_sec_level_name() + + class DeleteMetadataSecModel(BaseModel): """ 删除数据安全配置模型 @@ -88,13 +90,16 @@ class DeleteMetadataSecModel(BaseModel): model_config = ConfigDict(alias_generator=to_camel) onums: str = Field(description='需要删除的唯一编号(多个用逗号分隔)') + + class MetadataSecQueryModel(MetadataSecModel): """ 数据安全配置不分页查询模型 """ begin_time: Optional[str] = Field(default=None, description='开始时间') end_time: Optional[str] = Field(default=None, description='结束时间') - + + @as_query class MetadataSecPageQueryModel(MetadataSecQueryModel): """ @@ -102,8 +107,8 @@ class MetadataSecPageQueryModel(MetadataSecQueryModel): """ page_num: int = Field(default=1, description='当前页码') page_size: int = Field(default=10, description='每页记录数') - - + + # ----------- t_secu_biz_config 表对应模型 -------------- class SecuBizConfigRelaModel(BaseModel): @@ -116,6 +121,8 @@ class SecuBizConfigRelaModel(BaseModel): tab_onum: Optional[int] = Field(default=None, description="表ID") create_by: Optional[str] = Field(default=None, description="创建者") create_time: Optional[datetime] = Field(default=None, description="创建时间") + + class TaskBizConfigRelaModel(BaseModel): """ 业务域配置关联表对应 Pydantic 模型 @@ -125,7 +132,8 @@ class TaskBizConfigRelaModel(BaseModel): biz_onum: Optional[int] = Field(default=None, description="业务域ID") tab_onum: Optional[int] = Field(default=None, description="表ID") create_by: Optional[str] = Field(default=None, description="创建者") - create_time: Optional[datetime] = Field(default=None, description="创建时间") + create_time: Optional[datetime] = Field(default=None, description="创建时间") + class SecuBizConfigAddModel(BaseModel): """ @@ -141,7 +149,9 @@ class SecuBizConfigAddModel(BaseModel): create_time: Optional[datetime] = Field(default=None, description='创建时间') update_by: Optional[str] = Field(default=None, description='更新者') update_time: Optional[datetime] = Field(default=None, description='更新时间') - tab_onum_list: List[int] = Field(default=None, description='表id列表') + tab_onum_list: List[int] = Field(default=None, description='表id列表') + + class SecuBizConfigModel(BaseModel): """ 业务域配置对应 Pydantic 模型 @@ -165,6 +175,7 @@ class SecuBizConfigModel(BaseModel): def validate_fields(self): self.get_risk_lvl() + class DeleteSecuBizConfigModel(BaseModel): """ 删除业务域配置模型 @@ -172,6 +183,7 @@ class DeleteSecuBizConfigModel(BaseModel): model_config = ConfigDict(alias_generator=to_camel) onums: str = Field(..., description='需要删除的唯一编号(多个用逗号分隔)') + class SecuBizConfigQueryModel(SecuBizConfigModel): """ 业务域配置不分页查询模型 @@ -179,6 +191,7 @@ class SecuBizConfigQueryModel(SecuBizConfigModel): begin_time: Optional[str] = Field(default=None, description='开始时间') end_time: Optional[str] = Field(default=None, description='结束时间') + @as_query class SecuBizConfigPageQueryModel(SecuBizConfigQueryModel): """ @@ -206,6 +219,8 @@ class SecuBizPermiConfigModel(BaseModel): create_time: Optional[datetime] = Field(default=None, description='创建时间') update_by: Optional[str] = Field(default=None, description='更新者') update_time: Optional[datetime] = Field(default=None, description='更新时间') + + class SecuBizPermiConfigBatchModel(BaseModel): model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) @@ -215,8 +230,6 @@ class SecuBizPermiConfigBatchModel(BaseModel): obj_name: str = Field(..., description='角色名称') isStop: Optional[bool] = Field(default=False, description='是否停用(false:运行 true:停用)') - - @NotBlank(field_name='obj_name', message='角色名称不能为空') @Size(field_name='obj_name', max_length=50, message='角色名称长度不能超过50个字符') def get_obj_name(self): @@ -225,6 +238,7 @@ class SecuBizPermiConfigBatchModel(BaseModel): def validate_fields(self): self.get_obj_name() + class DeleteSecuBizPermiConfigModel(BaseModel): """ 删除业务域权限配置模型 @@ -232,6 +246,7 @@ class DeleteSecuBizPermiConfigModel(BaseModel): model_config = ConfigDict(alias_generator=to_camel) onums: str = Field(..., description='需要删除的唯一编号(多个用逗号分隔)') + class SecuBizPermiConfigQueryModel(SecuBizPermiConfigModel): """ 业务域权限配置不分页查询模型 @@ -239,6 +254,7 @@ class SecuBizPermiConfigQueryModel(SecuBizPermiConfigModel): begin_time: Optional[str] = Field(default=None, description='开始时间') end_time: Optional[str] = Field(default=None, description='结束时间') + @as_query class SecuBizPermiConfigPageQueryModel(SecuBizPermiConfigQueryModel): """ @@ -246,56 +262,40 @@ class SecuBizPermiConfigPageQueryModel(SecuBizPermiConfigQueryModel): """ page_num: int = Field(default=1, description='当前页码') page_size: int = Field(default=10, description='每页记录数') -class BatchDataopLabelConfigModel(BaseModel): + + +class BatchDatatypeLabelConfigModel(BaseModel): """ - 批处理数据操作标签配置 Pydantic 模型 + 批处理字段类型标签配置 Pydantic 模型 """ model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) onum: Optional[int] = Field(default=None, description='唯一编号') - optype: Optional[str] = Field(default=None, description='唯一类型,忽略类型') - config1: Optional[float] = Field(default=None, description='参数1') - config2: Optional[float] = Field(default=None, description='参数2') - config3: Optional[float] = Field(default=None, description='参数3') - config4: Optional[float] = Field(default=None, description='参数4') - config5: Optional[float] = Field(default=None, description='参数5') - config6: Optional[float] = Field(default=None, description='参数6') - config7: Optional[float] = Field(default=None, description='参数7') - ssys_cd: Optional[str] = Field(default=None, description='系统代码') + datatype: Optional[str] = Field(default=None, description='字段类型') + ratio: Optional[float] = Field(default=None, description='比率') + ssys_id: Optional[int] = Field(default=None, description='系统代码') mdl_name: Optional[str] = Field(default=None, description='模块名称') upd_by: Optional[str] = Field(default=None, description='更新人员') upd_time: Optional[datetime] = Field(default=None, description='更新时间') + class BatchDataopLabelConfigModelVo(BaseModel): - """ - 批处理数据操作标签配置 Pydantic 模型 - """ - model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) - config1: Optional[float] = Field(default=None, description='参数1') - config2: Optional[float] = Field(default=None, description='参数2') - config3: Optional[float] = Field(default=None, description='参数3') - config4: Optional[float] = Field(default=None, description='参数4') - config5: Optional[float] = Field(default=None, description='参数5') - config6: Optional[float] = Field(default=None, description='参数6') - config7: Optional[float] = Field(default=None, description='参数7') - ssys_cd: Optional[str] = Field(default=None, description='系统代码') - mdl_name: Optional[str] = Field(default=None, description='模块名称') - upd_by: Optional[str] = Field(default=None, description='更新人员') - upd_time: Optional[datetime] = Field(default=None, description='更新时间') -class BatchDatatypeLabelConfigModel(BaseModel): """ 批处理字段类型标签配置 Pydantic 模型 """ model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) onum: Optional[int] = Field(default=None, description='唯一编号') - datatype: Optional[str] = Field(default=None, description='字段类型') - ratio: Optional[float] = Field(default=None, description='比率') - ssys_cd: Optional[str] = Field(default=None, description='系统代码') + op_type: Optional[str] = Field(default=None, description='处理类型') + col_type: Optional[str] = Field(default=None, description='字段类型') + col_attr: Optional[str] = Field(default=None, description='字段属性') + ratio: Optional[float] = Field(default=None, description='阈值') + ssys_id: Optional[int] = Field(default=None, description='系统代码') mdl_name: Optional[str] = Field(default=None, description='模块名称') upd_by: Optional[str] = Field(default=None, description='更新人员') upd_time: Optional[datetime] = Field(default=None, description='更新时间') + class BatchBusiLabelConfigModel(BaseModel): """ 批处理业务标签配置 Pydantic 模型 @@ -305,24 +305,34 @@ class BatchBusiLabelConfigModel(BaseModel): onum: Optional[int] = Field(default=None, description='唯一编号') regex_name: Optional[str] = Field(default=None, description='正则表达式名称') regex_pattern: Optional[str] = Field(default=None, description='正则表达式') - ssys_cd: Optional[str] = Field(default=None, description='系统代码') + ssys_id: Optional[int] = Field(default=None, description='系统代码') mdl_name: Optional[str] = Field(default=None, description='模块名称') ratio: Optional[float] = Field(default=None, description='比率') upd_by: Optional[str] = Field(default=None, description='更新人员') - upd_time: Optional[datetime] = Field(default=None, description='更新时间') + upd_time: Optional[datetime] = Field(default=None, description='更新时间') + + @as_query -class BatchDataopLabelModelPageQueryModel(BatchDataopLabelConfigModel): +class ColOpTypeLabelPageQueryModel(BaseModel): + model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) + ssys_id: Optional[int] = Field(default=None, description='系统名称') + mdl_name: Optional[str] = Field(default=None, description='模式名称') + page_num: Optional[int] = Field(default=None, description='当前页码') + page_size: Optional[int] = Field(default=None, description='每页记录数') + - page_num: int = Field(default=1, description='当前页码') - page_size: int = Field(default=10, description='每页记录数') @as_query class BatchDatatypeLabelConfigPageQueryModel(BatchDatatypeLabelConfigModel): page_num: int = Field(default=1, description='当前页码') - page_size: int = Field(default=10, description='每页记录数') + page_size: int = Field(default=10, description='每页记录数') + + @as_query class BatchBusiLabelConfigPageQueryModel(BatchBusiLabelConfigModel): page_num: int = Field(default=1, description='当前页码') - page_size: int = Field(default=10, description='每页记录数') + page_size: int = Field(default=10, description='每页记录数') + + class DatasecConfigModel(BaseModel): """ 数据安全任务配置 Pydantic 模型(对应表 t_datasec_config) @@ -339,13 +349,16 @@ class DatasecConfigModel(BaseModel): status: Optional[str] = Field(default=None, description="状态") ds_time: Optional[datetime] = Field(default=None, description="调度时间") ds_ids: Optional[str] = Field(default=None, description="任务ID") - schId: Optional[str] = Field(default=None, description="调度id") + schId: Optional[str] = Field(default=None, description="调度id") + + @as_query class DatasecConfigPageQueryModel(DatasecConfigModel): page_num: int = Field(default=1, description='当前页码') - page_size: int = Field(default=10, description='每页记录数') - begin_time: Optional[str]= Field(default=None, description='开始时间') - end_time: Optional[str]= Field(default=None, description='结束时间') + page_size: int = Field(default=10, description='每页记录数') + begin_time: Optional[str] = Field(default=None, description='开始时间') + end_time: Optional[str] = Field(default=None, description='结束时间') + class TaskBizConfigAddModel(BaseModel): """ @@ -364,8 +377,10 @@ class TaskBizConfigAddModel(BaseModel): status: Optional[str] = Field(default="OFFLINE", description="状态") ds_time: Optional[datetime] = Field(default=None, description="调度时间") ds_ids: Optional[str] = Field(default=None, description="任务ID") - schId: Optional[str] = Field(default=None, description="调度id") - tab_onum_list: List[int] = Field(default=None, description='表id列表') + schId: Optional[str] = Field(default=None, description="调度id") + tab_onum_list: List[int] = Field(default=None, description='表id列表') + + class TaskBizConfigModel(BaseModel): """ 标签任务配置对应 Pydantic 模型 @@ -383,7 +398,8 @@ class TaskBizConfigModel(BaseModel): status: Optional[str] = Field(default="OFFLINE", description="状态") ds_time: Optional[datetime] = Field(default=None, description="调度时间") ds_ids: Optional[str] = Field(default=None, description="任务ID") - schId: Optional[str] = Field(default=None, description="调度id") + schId: Optional[str] = Field(default=None, description="调度id") + @NotBlank(field_name='risk_lvl', message='安全等级不能为空') @Size(field_name='risk_lvl', max_length=50, message='安全等级长度不能超过50') def get_risk_lvl(self): @@ -392,6 +408,7 @@ class TaskBizConfigModel(BaseModel): def validate_fields(self): self.get_risk_lvl() + class DeleteTaskBizConfigModel(BaseModel): """ 删除业务域配置模型 @@ -399,6 +416,7 @@ class DeleteTaskBizConfigModel(BaseModel): model_config = ConfigDict(alias_generator=to_camel) onums: str = Field(..., description='需要删除的唯一编号(多个用逗号分隔)') + class TaskBizConfigQueryModel(TaskBizConfigModel): """ 业务域配置不分页查询模型 @@ -406,10 +424,11 @@ class TaskBizConfigQueryModel(TaskBizConfigModel): begin_time: Optional[str] = Field(default=None, description='开始时间') end_time: Optional[str] = Field(default=None, description='结束时间') + @as_query class TaskBizConfigPageQueryModel(TaskBizConfigQueryModel): """ 业务域配置分页查询模型 """ page_num: int = Field(default=1, description='当前页码') - page_size: int = Field(default=10, description='每页记录数') \ No newline at end of file + page_size: int = Field(default=10, description='每页记录数') diff --git a/vue-fastapi-backend/module_admin/service/batch_label_config_service.py b/vue-fastapi-backend/module_admin/service/batch_label_config_service.py index ab75c45..322afb5 100644 --- a/vue-fastapi-backend/module_admin/service/batch_label_config_service.py +++ b/vue-fastapi-backend/module_admin/service/batch_label_config_service.py @@ -1,7 +1,8 @@ from sqlalchemy.ext.asyncio import AsyncSession from module_admin.dao.batch_label_config_dao import BatchLabelConfigDAO from module_admin.entity.vo.common_vo import CrudResponseModel -from module_admin.entity.vo.metadata_config_vo import BatchBusiLabelConfigModel,BatchDataopLabelConfigModel,BatchDatatypeLabelConfigModel,BatchDataopLabelConfigModelVo +from module_admin.entity.vo.metadata_config_vo import BatchBusiLabelConfigModel, BatchDatatypeLabelConfigModel +from module_admin.entity.do.metadata_config_do import BatchDataopLabelConfig from exceptions.exception import ServiceException import uuid from utils.common_util import CamelCaseUtil @@ -17,6 +18,10 @@ class BatchLabelConfigService: async def get_busi_list_services(cls, db: AsyncSession, query_object, is_page: bool = False): return await BatchLabelConfigDAO.get_busi_list(db, query_object, is_page) + @classmethod + async def get_col_optype_list_services(cls, db: AsyncSession, query_object, is_page: bool = False): + return await BatchLabelConfigDAO.get_col_optype_list(db, query_object, is_page) + @classmethod async def add_busi_services(cls, db: AsyncSession, page_object): try: @@ -44,7 +49,7 @@ class BatchLabelConfigService: @classmethod async def delete_busi_services(cls, db: AsyncSession, onum_list: str): - id_list = [x.strip() for x in onum_list.split(",") if x.strip()] + id_list = [int(x.strip()) for x in onum_list.split(",") if x.strip()] if not id_list: raise ServiceException(message="无效的编号列表") @@ -70,95 +75,37 @@ class BatchLabelConfigService: @classmethod async def get_dataop_list_services(cls, db: AsyncSession, query_object, is_page: bool = False): return await BatchLabelConfigDAO.get_dataop_list(db, query_object, is_page) - @classmethod - async def get_dataop_vo_services(cls, db: AsyncSession, query_object, is_page: bool = False): - result = BatchDataopLabelConfigModelVo() # 自定义返回 VO 对象 - resultList = await BatchLabelConfigDAO.get_dataop_list_all(db, query_object) - if resultList: - for item in resultList: - if item.optype == "唯一类型": - result.config1 = item.config1 - result.config2 = item.config2 - result.config3 = item.config3 - result.config4 = item.config4 - result.ssys_cd = item.ssys_cd - result.mdl_name = item.mdl_name - result.upd_by = item.upd_by - result.upd_time = item.upd_time - - elif item.optype == "忽略类型": - result.config5 = item.config1 # 注意:忽略类型只有 config1, config2 - result.config6 = item.config2 - # 其他公共字段,如果你也想覆盖可再写一次: - result.ssys_cd = item.ssys_cd - result.mdl_name = item.mdl_name - result.upd_by = item.upd_by - result.upd_time = item.upd_time - - return result - @classmethod async def add_dataop_services(cls, db: AsyncSession, page_object): try: - - resultList = await BatchLabelConfigDAO.get_dataop_list_all(db, page_object) - - # 唯一类型对象 - onopLabel = BatchDataopLabelConfigModel( - optype="唯一类型", - config1=page_object.config1, - config2=page_object.config2, - config3=page_object.config3, - config4=page_object.config4, - ssysCd=page_object.ssys_cd, - mdlName=page_object.mdl_name, - updBy=page_object.upd_by, - updTime=page_object.upd_time - ) - - # 忽略类型对象 - inopLabel = BatchDataopLabelConfigModel( - optype="忽略类型", - config1=page_object.config5, - config2=page_object.config6, - ssysCd=page_object.ssys_cd, - mdlName=page_object.mdl_name, - updBy=page_object.upd_by, - updTime=page_object.upd_time - ) - - if resultList: - for item in resultList: - if item.optype == "唯一类型": - update_data = { - "config1": onopLabel.config1, - "config2": onopLabel.config2, - "config3": onopLabel.config3, - "config4": onopLabel.config4, - "ssys_cd": onopLabel.ssys_cd, - "mdl_name": onopLabel.mdl_name, - "upd_by": onopLabel.upd_by, - "upd_time": onopLabel.upd_time - } - elif item.optype == "忽略类型": - update_data = { - "config1": inopLabel.config1, - "config2": inopLabel.config2, - "ssys_cd": inopLabel.ssys_cd, - "mdl_name": inopLabel.mdl_name, - "upd_by": inopLabel.upd_by, - "upd_time": inopLabel.upd_time - } - else: - continue # 忽略未知类型 - await BatchLabelConfigDAO.edit_dataop(db, item.onum, update_data) + if page_object.onum: + # edit + conf = BatchDataopLabelConfig() + conf.op_type = page_object.op_type + conf.col_type = page_object.col_type + conf.col_attr = page_object.col_attr + conf.ratio = page_object.ratio + conf.ssys_id = page_object.ssys_id + conf.mdl_name = page_object.mdl_name + conf.upd_by = page_object.upd_by + conf.upd_time = page_object.upd_time + dic = conf.model_dump(exclude_unset=True) + await BatchLabelConfigDAO.edit_dataop(db, page_object.onum, dic) else: - await BatchLabelConfigDAO.add_dataop(db, onopLabel) - await BatchLabelConfigDAO.add_dataop(db, inopLabel) - + # add + conf = BatchDataopLabelConfig() + conf.op_type = page_object.op_type + conf.col_type = page_object.col_type + conf.col_attr = page_object.col_attr + conf.ratio = page_object.ratio + conf.ssys_id = page_object.ssys_id + conf.mdl_name = page_object.mdl_name + conf.upd_by = page_object.upd_by + conf.upd_time = page_object.upd_time + await BatchLabelConfigDAO.add_dataop(db, conf) await db.commit() - return CrudResponseModel(is_success=True, message="新增或更新成功") + return CrudResponseModel(is_success=True, message="操作成功") except Exception as e: await db.rollback() raise e @@ -166,8 +113,8 @@ class BatchLabelConfigService: @classmethod async def edit_dataop_services(cls, db: AsyncSession, page_object): edit_data = page_object.model_dump(exclude_unset=True) - info = await cls.get_dataop_detail_services(db, page_object.onum) - if info.onum: + result = await BatchLabelConfigDAO.get_dataop_detail_by_id(db, page_object.onum) + if result.onum: try: await BatchLabelConfigDAO.edit_dataop(db, page_object.onum, edit_data) await db.commit() @@ -180,7 +127,7 @@ class BatchLabelConfigService: @classmethod async def delete_dataop_services(cls, db: AsyncSession, onum_list: str): - id_list = [x.strip() for x in onum_list.split(",") if x.strip()] + id_list = [int(x.strip()) for x in onum_list.split(",") if x.strip()] if not id_list: raise ServiceException(message="无效的编号列表") @@ -192,13 +139,6 @@ class BatchLabelConfigService: await db.rollback() raise e - @classmethod - async def get_dataop_detail_services(cls, db: AsyncSession, onum: str): - result = await BatchLabelConfigDAO.get_dataop_detail_by_id(db, onum) - if result: - return BatchDataopLabelConfigModel(**CamelCaseUtil.transform_result(result)) - return BatchDataopLabelConfigModel(**dict()) - # endregion # region === BatchDatatypeLabelConfig === @@ -234,7 +174,7 @@ class BatchLabelConfigService: @classmethod async def delete_datatype_services(cls, db: AsyncSession, onum_list: str): - id_list = [x.strip() for x in onum_list.split(",") if x.strip()] + id_list = [int(x.strip()) for x in onum_list.split(",") if x.strip()] if not id_list: raise ServiceException(message="无效的编号列表") diff --git a/vue-fastapi-frontend/src/api/metadataConfig/metadataConfig.js b/vue-fastapi-frontend/src/api/metadataConfig/metadataConfig.js index 7f51f3a..f2771ab 100644 --- a/vue-fastapi-frontend/src/api/metadataConfig/metadataConfig.js +++ b/vue-fastapi-frontend/src/api/metadataConfig/metadataConfig.js @@ -206,6 +206,15 @@ export function getBusiLabelList(data) { }) } +// 获取业务标签列表(分页) +export function getColOpTypeLabelList(data) { + return request({ + url: '/default-api/metadataConfig/colOpTypeLabel/list', + method: 'get', + params: data + }) +} + // 新增业务标签 export function addBusiLabel(data) { return request({ @@ -239,14 +248,6 @@ export function getBusiLabelDetail(onum) { method: 'get' }) } -// 获取操作标签列表(分页) -export function getDataopLabelList(data) { - return request({ - url: '/default-api/metadataConfig/dataopLabel/list', - method: 'get', - params: data - }) -} // 新增操作标签 export function addDataopLabel(data) { diff --git a/vue-fastapi-frontend/src/views/metadataConfig/metaclas/index.vue b/vue-fastapi-frontend/src/views/metadataConfig/metaclas/index.vue index 764da91..3c77d6e 100644 --- a/vue-fastapi-frontend/src/views/metadataConfig/metaclas/index.vue +++ b/vue-fastapi-frontend/src/views/metadataConfig/metaclas/index.vue @@ -3,8 +3,8 @@ - - + + @@ -61,13 +61,13 @@ - 新增 + 新增 - 修改 + 修改 - 删除 + 删除 @@ -81,15 +81,6 @@ - - - - - - - - - @@ -122,6 +113,34 @@ 保存 + + + + + + + + + + + + + + + + + + + + + + + + + @@ -137,17 +156,19 @@ import { deleteBusiLabel, editBusiLabel, addBusiLabel, + getBusiLabelList, + deleteDataopLabel, + editDataopLabel, addDataopLabel, - getDataopLabelList, - getBusiLabelList + getColOpTypeLabelList, } from "@/api/metadataConfig/metadataConfig"; import useUserStore from '@/store/modules/user'; // 注意路径是否正确 const userStore = useUserStore(); // 正确调用 const dsSysList = userStore.dsSysList; // 访问属性 const queryForm = reactive({ - ssysCd: "*", - mdlName: "*", + ssysId: undefined, + mdlName: "", }); const activeTab = ref('valueType'); const configList1 = ref([]); // 值类型参数数据 @@ -157,10 +178,12 @@ const loading = ref(false); const open1 = ref(false); // 值类型弹窗开关 const open2 = ref(false); // 业务类型弹窗开关 +const open3 = ref(false); // 字段处理类型弹窗开关 const title = ref(""); const clasFormRef1 = ref(null); // 值类型 formRef const clasFormRef2 = ref(null); // 业务类型 formRef +const clasFormRef3 = ref(null); // 字段处理类型 formRef const form1 = reactive({ datatype: "", @@ -172,13 +195,12 @@ const form2 = reactive({ ratio: null, }); const form3 = reactive({ - config1: null, - config2: null, - config3: null, - config4: null, - config5: null, - config6: null, - config7: null, + opType: "", + colType: "", + colAttr: "", + ssysId: undefined, + mdlName: "", + ratio: null, }); const rules1 = { @@ -190,6 +212,12 @@ const rules2 = { regexPattern: [{ required: true, message: "请输入正则表达式", trigger: "blur" }], ratio: [{ required: true, message: "请输入阈值", trigger: "blur" }], }; +const rules3 = { + opType: [{ required: true, message: "请输入处理类型", trigger: "blur" }], + colType: [{ required: true, message: "请输入字段类型", trigger: "blur" }], + colAttr: [{ required: true, message: "请输入字段属", trigger: "blur" }], + ratio: [{ required: true, message: "请输入阈值", trigger: "blur" }], +}; const selectedRows1 = ref([]); const selectedRows2 = ref([]); @@ -229,16 +257,20 @@ async function getList2() { } } async function getList3() { - - const res = await getDataopLabelList(queryForm); - Object.assign(form3, res.data); - - + loading.value = true; + try { + const res = await getColOpTypeLabelList(queryForm); + configList3.value = res.data || []; + } catch (error) { + ElMessage.error("获取字段处理类型列表失败"); + } finally { + loading.value = false; + } } function resetQuery() { - queryForm.ssysCd = "*"; - queryForm.mdlName = "*"; + queryForm.ssysId = undefined; + queryForm.mdlName = ""; getList1(); getList2(); getList3(); @@ -270,7 +302,7 @@ function openEditDialog1(row) { function submitForm1() { clasFormRef1.value.validate(async (valid) => { if (!valid) return; - const submitData = { ...form1,ssysCd:queryForm.ssysCd,mdlName:queryForm.mdlName }; + const submitData = { ...form1,ssysId:queryForm.ssysId,mdlName:queryForm.mdlName }; try { if (title.value.includes("新增")) { await addDatatypeLabel(submitData); @@ -286,17 +318,6 @@ function submitForm1() { } }); } -async function submitForm3() { - - const submitData = { ...form3,ssysCd:queryForm.ssysCd,mdlName:queryForm.mdlName }; - try { - await addDataopLabel(submitData); - ElMessage.success("编辑成功"); - - } catch (error) { - ElMessage.error("操作失败,请重试"); - } -} function deleteSelected1() { if (selectedRows1.value.length === 0) { ElMessage.warning("请至少选择一条记录删除"); @@ -334,6 +355,18 @@ function openAddDialog2() { }); open2.value = true; } +function openAddDialog3() { + title.value = "新增字段处理类型参数"; + Object.assign(form3, { + opType: "", + colType: "", + colAttr: "", + ssysId: queryForm.ssysId, + mdlName: queryForm.mdlName, + ratio: null, + }); + open3.value = true; +} function openEditDialog2(row) { if (!row) { @@ -345,10 +378,20 @@ function openEditDialog2(row) { open2.value = true; } +function openEditDialog3(row) { + if (!row) { + ElMessage.warning("请选择一条记录进行编辑"); + return; + } + title.value = "编辑字段处理类型参数"; + Object.assign(form3, row); + open3.value = true; +} + function submitForm2() { clasFormRef2.value.validate(async (valid) => { if (!valid) return; - const submitData = { ...form2,ssysCd:queryForm.ssysCd,mdlName:queryForm.mdlName}; + const submitData = { ...form2,ssysId:queryForm.ssysId,mdlName:queryForm.mdlName}; try { if (title.value.includes("新增")) { await addBusiLabel(submitData); @@ -364,6 +407,25 @@ function submitForm2() { } }); } +function submitForm3() { + clasFormRef3.value.validate(async (valid) => { + if (!valid) return; + const submitData = { ...form3}; + try { + if (title.value.includes("新增")) { + await addDataopLabel(submitData); + ElMessage.success("新增成功"); + } else { + await editDataopLabel(submitData); + ElMessage.success("编辑成功"); + } + open3.value = false; + await getList3(); + } catch { + ElMessage.error("操作失败,请重试"); + } + }); +} function deleteSelected2() { if (selectedRows2.value.length === 0) { @@ -387,11 +449,38 @@ function deleteSelected2() { }); } +function deleteSelected3() { + if (selectedRows3.value.length === 0) { + ElMessage.warning("请至少选择一条记录删除"); + return; + } + ElMessageBox.confirm( + `确定删除选中的 ${selectedRows3.value.length} 条字段处理类型参数吗?`, + "提示", + { type: "warning" } + ).then(async () => { + try { + for (const row of selectedRows3.value) { + await deleteDataopLabel(row.onum); + } + ElMessage.success("删除成功"); + getList3(); + } catch { + ElMessage.error("删除失败,请重试"); + } + }); +} + function handleClose2(done) { clasFormRef2.value.resetFields(); done(); } +function handleClose3(done) { + clasFormRef3.value.resetFields(); + done(); +} + onMounted(() => { getList1(); getList2();