Browse Source

元数据标签计算配置

master
xueyinfei 3 weeks ago
parent
commit
e64e14a5af
  1. 66
      vue-fastapi-backend/module_admin/controller/metadata_config_controller.py
  2. 48
      vue-fastapi-backend/module_admin/dao/batch_label_config_dao.py
  3. 20
      vue-fastapi-backend/module_admin/entity/do/metadata_config_do.py
  4. 127
      vue-fastapi-backend/module_admin/entity/vo/metadata_config_vo.py
  5. 132
      vue-fastapi-backend/module_admin/service/batch_label_config_service.py
  6. 17
      vue-fastapi-frontend/src/api/metadataConfig/metadataConfig.js
  7. 179
      vue-fastapi-frontend/src/views/metadataConfig/metaclas/index.vue

66
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
)
)

48
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]):

20
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='更新时间')

127
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='每页记录数')
page_size: int = Field(default=10, description='每页记录数')

132
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="无效的编号列表")

17
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) {

179
vue-fastapi-frontend/src/views/metadataConfig/metaclas/index.vue

@ -3,8 +3,8 @@
<el-row :gutter="10" class="mb8">
<el-form :inline="true" :model="queryForm">
<el-form-item label="归属系统">
<el-select v-model="queryForm.ssysCd" placeholder="请选择系统" clearable allow-create filterable style="width: 180px">
<el-option v-for="item in dsSysList" :key="item.id" :label="item.name" :value="item.name" />
<el-select v-model="queryForm.ssysId" placeholder="请选择系统" clearable allow-create filterable style="width: 180px">
<el-option v-for="item in dsSysList" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="模式名">
@ -61,13 +61,13 @@
<el-tab-pane label="字段处理类型参数调整" name="columnType">
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="openAddDialog2">新增</el-button>
<el-button type="primary" plain icon="Plus" @click="openAddDialog3">新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="selectedRows2.length !== 1" @click="openEditDialog2(selectedRows2[0])">修改</el-button>
<el-button type="success" plain icon="Edit" :disabled="selectedRows3.length !== 1" @click="openEditDialog3(selectedRows3[0])">修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="selectedRows2.length === 0" @click="deleteSelected2">删除</el-button>
<el-button type="danger" plain icon="Delete" :disabled="selectedRows3.length === 0" @click="deleteSelected3">删除</el-button>
</el-col>
</el-row>
<el-table v-loading="loading" :data="configList3" @selection-change="handleSelectionChange3" style="width: 100%" height="400" border stripe>
@ -81,15 +81,6 @@
</el-table>
</el-tab-pane>
</el-tabs>
<el-dialog :title="title" v-model="open1" width="500px" append-to-body :before-close="handleClose1">
<el-form ref="clasFormRef1" :model="form1" :rules="rules1" label-width="120px" >
<el-form-item label="值类型" prop="datatype">
@ -122,6 +113,34 @@
<el-button type="primary" @click="submitForm2">保存</el-button>
</template>
</el-dialog>
<el-dialog :title="title" v-model="open3" width="500px" append-to-body :before-close="handleClose3">
<el-form ref="clasFormRef3" :model="form3" :rules="rules3" label-width="120px">
<el-form-item label="处理类型" prop="opType">
<el-input v-model="form3.opType" autocomplete="off" />
</el-form-item>
<el-form-item label="字段类型" prop="regexPattern">
<el-input v-model="form3.colType" autocomplete="off" />
</el-form-item>
<el-form-item label="字段属性" prop="regexPattern">
<el-input v-model="form3.colAttr" autocomplete="off" />
</el-form-item>
<el-form-item label="阈值" prop="ratio">
<el-input v-model.number="form3.ratio" autocomplete="off" />
</el-form-item>
<el-form-item label="所属系统" prop="ssysId">
<el-select v-model="form3.ssysId" placeholder="请选择系统" clearable allow-create filterable style="width: 350px">
<el-option v-for="item in dsSysList" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="所属模式" prop="mdlName">
<el-input v-model="form3.mdlName" autocomplete="off" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="open3 = false">取消</el-button>
<el-button type="primary" @click="submitForm3">保存</el-button>
</template>
</el-dialog>
</div>
</template>
@ -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();

Loading…
Cancel
Save