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 8198c75..c1f5b45 100644 --- a/vue-fastapi-backend/module_admin/controller/metadata_config_controller.py +++ b/vue-fastapi-backend/module_admin/controller/metadata_config_controller.py @@ -2,7 +2,19 @@ from datetime import datetime from fastapi import APIRouter, Depends, Request, Form from pydantic_validation_decorator import ValidateFields from sqlalchemy.ext.asyncio import AsyncSession -from module_admin.entity.vo.metadata_config_vo import MetadataClasModel, MetadataClasPageQueryModel,MetadataSecModel,MetadataSecPageQueryModel +from module_admin.entity.vo.metadata_config_vo import ( + MetadataClasModel, + MetadataClasPageQueryModel, + MetadataSecModel, + MetadataSecPageQueryModel, + SecuBizConfigModel, + SecuBizConfigPageQueryModel, + SecuBizConfigQueryModel, + SecuBizPermiConfigModel, + SecuBizPermiConfigBatchModel, + SecuBizPermiConfigPageQueryModel, + SecuBizPermiConfigQueryModel +) from module_admin.service.metadata_config_service import MetadataConfigService from config.get_db import get_db from utils.response_util import ResponseUtil @@ -142,4 +154,104 @@ async def get_metadata_sec_detail( ): result = await MetadataConfigService.get_metadata_sec_detail_services(query_db, sec_id) logger.info(f"获取数据安全配置 onum={sec_id} 详情成功") - return ResponseUtil.success(data=result) \ No newline at end of file + return ResponseUtil.success(data=result) + +# ---------- t_secu_biz_config 接口(改造后) ---------- + +@metadataConfigController.get("/bizConfig/list", response_model=PageResponseModel) +async def get_biz_config_list( + request: Request, + query: SecuBizConfigQueryModel = Depends(SecuBizConfigPageQueryModel.as_query), + db: AsyncSession = Depends(get_db), +): + result = await MetadataConfigService.get_biz_config_list_services(db, query, is_page=True) + return ResponseUtil.success(model_content=result) +@metadataConfigController.get("/bizConfig/listall") +async def get_biz_config_list_all( + request: Request, + query: SecuBizConfigQueryModel = Depends(SecuBizConfigPageQueryModel.as_query), + db: AsyncSession = Depends(get_db), +): + result = await MetadataConfigService.get_biz_config_list_services(db, query, is_page=False) + return ResponseUtil.success(data=result) + +@metadataConfigController.post("/bizConfig/add") +@ValidateFields(["bizModule", "configType", "securityLevel", "applyType"]) +async def add_biz_config( + item: SecuBizConfigModel, + db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), +): + item.create_by = current_user.user.user_name + item.create_time = datetime.now() + result = await MetadataConfigService.add_biz_config_services(db, item) + return ResponseUtil.success(msg=result.message) + + +@metadataConfigController.post("/bizConfig/edit") +@ValidateFields(["onum"]) +async def edit_biz_config( + item: SecuBizConfigModel, + db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), +): + item.update_by = current_user.user.user_name + item.update_time = datetime.now() + result = await MetadataConfigService.edit_biz_config_services(db, item) + return ResponseUtil.success(msg=result.message) + + +@metadataConfigController.delete("/bizConfig/delete") +async def delete_biz_config(onums: str, db: AsyncSession = Depends(get_db)): + result = await MetadataConfigService.delete_biz_config_services(db, onums) + return ResponseUtil.success(msg=result.message) + + +@metadataConfigController.get("/bizConfig/detail") +async def get_biz_config_detail(onum: str, db: AsyncSession = Depends(get_db)): + data = await MetadataConfigService.get_biz_config_detail_services(db, onum) + return ResponseUtil.success(data=data) + + +# ---------- t_secu_biz_permi_config 接口 ---------- + +@metadataConfigController.get("/bizPermiConfig/list", response_model=PageResponseModel) +async def get_biz_permi_config_list( + request: Request, + query: SecuBizConfigModel = Depends(SecuBizPermiConfigPageQueryModel.as_query), + query_db: AsyncSession = Depends(get_db), +): + result = await MetadataConfigService.get_biz_permi_config_list_services(query_db, query, is_page=True) + return ResponseUtil.success(model_content=result) + +@metadataConfigController.post("/bizPermiConfig/add") +async def add_biz_permi_config( + item: SecuBizPermiConfigBatchModel, + db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user) +): + create_by = current_user.user.user_name + create_time = datetime.now() + result = await MetadataConfigService.add_biz_permi_config_services(db, item, create_by, create_time) + return ResponseUtil.success(msg=result.message) + +@metadataConfigController.post("/bizPermiConfig/edit") +@ValidateFields(["onum"]) +async def edit_biz_permi_config(item: SecuBizPermiConfigModel, db: AsyncSession = Depends(get_db), current_user: CurrentUserModel = Depends(LoginService.get_current_user)): + item.update_by = current_user.user.user_name + item.update_time = datetime.now() + + result = await MetadataConfigService.edit_biz_permi_config_services(db, item) + return ResponseUtil.success(msg=result.message) + + +@metadataConfigController.delete("/bizPermiConfig/delete") +async def delete_biz_permi_config(onums: str, db: AsyncSession = Depends(get_db)): + result = await MetadataConfigService.delete_biz_permi_config_services(db, onums) + return ResponseUtil.success(msg=result.message) + + +@metadataConfigController.get("/bizPermiConfig/detail") +async def get_biz_permi_config_detail(onum: str, db: AsyncSession = Depends(get_db)): + data = await MetadataConfigService.get_biz_permi_config_detail_services(db, onum) + return ResponseUtil.success(data=data) \ No newline at end of file diff --git a/vue-fastapi-backend/module_admin/dao/datastd_dao.py b/vue-fastapi-backend/module_admin/dao/datastd_dao.py index 42642bf..81a2a0b 100644 --- a/vue-fastapi-backend/module_admin/dao/datastd_dao.py +++ b/vue-fastapi-backend/module_admin/dao/datastd_dao.py @@ -337,10 +337,8 @@ class DataStdDao: DataStdMain.data_std_busi_ownership_prsn.label("data_std_busi_ownership_prsn") ) - .outerjoin( # 使用left outer join确保即使没有关联code也能返回主表数据 - DataStdDict, - DataStdMain.data_std_no == DataStdDict.data_std_no - ) + .outerjoin(DataStdMain, DataStdDict.data_std_no == DataStdMain.data_std_no) # 正确方向的左连接 + .where(*filters) .order_by(desc(DataStdDict.create_time)) # 按创建时间降序排序 ) diff --git a/vue-fastapi-backend/module_admin/dao/metadata_config_dao.py b/vue-fastapi-backend/module_admin/dao/metadata_config_dao.py index 282f5b0..59dc645 100644 --- a/vue-fastapi-backend/module_admin/dao/metadata_config_dao.py +++ b/vue-fastapi-backend/module_admin/dao/metadata_config_dao.py @@ -1,9 +1,12 @@ from datetime import datetime, time -from sqlalchemy import delete, select, update +from sqlalchemy import delete, select, update,and_ from sqlalchemy.ext.asyncio import AsyncSession from module_admin.entity.do.meta_do import MetadataClas # ORM 类 -from module_admin.entity.do.metadata_config_do import MetadataSec # ORM 类 - +from module_admin.entity.do.metadata_config_do import MetadataSec,SecuBizConfig,SecuBizPermiConfig # ORM 类 +from typing import List +from sqlalchemy.orm import joinedload +from sqlalchemy.sql import true +from utils.page_util import PageUtil class MetadataConfigDao: """ @@ -49,7 +52,6 @@ class MetadataConfigDao: if query_object.begin_time and query_object.end_time else True, ).order_by(MetadataClas.clas_onum).distinct() - from utils.page_util import PageUtil return await PageUtil.paginate(db, query, query_object.page_num, query_object.page_size, is_page) @classmethod @@ -113,4 +115,131 @@ class MetadataConfigDao: @classmethod async def delete_metadata_sec_dao(cls, db: AsyncSession, onum_list: list[str]): - await db.execute(delete(MetadataSec).where(MetadataSec.onum.in_(onum_list))) \ No newline at end of file + await db.execute(delete(MetadataSec).where(MetadataSec.onum.in_(onum_list))) + # ------------- t_secu_biz_config 相关方法 -------------- + + @classmethod + async def get_biz_config_detail_by_id(cls, db: AsyncSession, onum: int): + result = await db.execute(select(SecuBizConfig).where(SecuBizConfig.onum == onum)) + return result.scalars().first() + + @classmethod + async def get_biz_config_list(cls, db: AsyncSession, query_object, is_page: bool = False): + query = select(SecuBizConfig).where( + SecuBizConfig.risk_lvl.like(f"%{query_object.risk_lvl}%") if query_object.risk_lvl else True, + SecuBizConfig.isStop == query_object.isStop if query_object.isStop is not None else True, + SecuBizConfig.create_time.between( + datetime.combine(datetime.strptime(query_object.begin_time, '%Y-%m-%d'), time.min), + datetime.combine(datetime.strptime(query_object.end_time, '%Y-%m-%d'), time.max), + ) if query_object.begin_time and query_object.end_time else True, + ).order_by(SecuBizConfig.create_time.desc()) + + from utils.page_util import PageUtil + return await PageUtil.paginate(db, query, query_object.page_num, query_object.page_size, is_page) + + @classmethod + async def add_biz_config(cls, db: AsyncSession, obj): + db_obj = SecuBizConfig(**obj.model_dump()) + db.add(db_obj) + await db.flush() + return db_obj + + @classmethod + async def edit_biz_config(cls, db: AsyncSession, onum: int, update_data: dict): + await db.execute( + update(SecuBizConfig).where(SecuBizConfig.onum == onum).values(**update_data) + ) + + @classmethod + async def delete_biz_config(cls, db: AsyncSession, onum_list: list[int]): + await db.execute(delete(SecuBizConfig).where(SecuBizConfig.onum.in_(onum_list))) + @classmethod + async def add_biz_permi_config_batch(cls, db: AsyncSession, records: List[SecuBizPermiConfig]): + orm_objs = [] + for rec in records: + orm_obj = SecuBizPermiConfig( + biz_onum=rec.biz_onum, + obj_type=rec.obj_type, + obj_value=rec.obj_value, + obj_name=rec.obj_name, + isStop=rec.isStop, + create_by=rec.create_by, + create_time=rec.create_time, + update_by=rec.update_by, + update_time=rec.update_time, + ) + orm_objs.append(orm_obj) + db.add_all(orm_objs) + # ------------- t_secu_biz_permi_config 相关方法 -------------- + + @classmethod + async def get_biz_permi_config_detail_by_id(cls, db: AsyncSession, onum: int): + result = await db.execute(select(SecuBizPermiConfig).where(SecuBizPermiConfig.onum == onum)) + return result.scalars().first() + + # @classmethod + # async def get_biz_permi_config_list(cls, db: AsyncSession, query_object, is_page: bool = False): + # query = select(SecuBizPermiConfig).where( + # SecuBizPermiConfig.obj_value.like(f"%{query_object.obj_value}%") if query_object.obj_value else True, + # SecuBizPermiConfig.obj_type == query_object.obj_type if query_object.obj_type else True, + # SecuBizPermiConfig.isStop == query_object.isStop if query_object.isStop is not None else True, + # SecuBizPermiConfig.create_time.between( + # datetime.combine(datetime.strptime(query_object.begin_time, '%Y-%m-%d'), time.min), + # datetime.combine(datetime.strptime(query_object.end_time, '%Y-%m-%d'), time.max), + # ) if query_object.begin_time and query_object.end_time else True, + # ).order_by(SecuBizPermiConfig.create_time.desc()) + + # from utils.page_util import PageUtil + # return await PageUtil.paginate(db, query, query_object.page_num, query_object.page_size, is_page) + @classmethod + async def get_biz_permi_config_list(cls, db: AsyncSession, query_object, is_page: bool = False): + # 构建基础查询 + query = ( + select( + SecuBizPermiConfig.onum, + SecuBizPermiConfig.biz_onum, + SecuBizPermiConfig.obj_type, + SecuBizPermiConfig.obj_value, + SecuBizPermiConfig.obj_name, + SecuBizPermiConfig.isStop, + SecuBizPermiConfig.create_by, + SecuBizPermiConfig.create_time, + SecuBizPermiConfig.update_by, + SecuBizPermiConfig.update_time, + SecuBizConfig.biz_name, + MetadataSec.sec_level_summary + ) + .join(SecuBizConfig, SecuBizPermiConfig.biz_onum == SecuBizConfig.onum, isouter=True) + .join(MetadataSec, SecuBizConfig.risk_lvl == MetadataSec.onum, isouter=True) + .where( + SecuBizPermiConfig.obj_value.like(f"%{query_object.obj_value}%") if query_object.obj_value else true(), + SecuBizPermiConfig.obj_name.like(f"%{query_object.obj_name}%") if query_object.obj_name else true(), + SecuBizPermiConfig.obj_type == query_object.obj_type if query_object.obj_type else true(), + SecuBizPermiConfig.isStop == query_object.isStop if query_object.isStop is not None else true(), + SecuBizPermiConfig.create_time.between( + datetime.combine(datetime.strptime(query_object.begin_time, '%Y-%m-%d'), time.min), + datetime.combine(datetime.strptime(query_object.end_time, '%Y-%m-%d'), time.max), + ) if query_object.begin_time and query_object.end_time else true() + ) + .order_by(SecuBizPermiConfig.create_time.desc()) + ) + + return await PageUtil.paginate( + db, query, query_object.page_num, query_object.page_size, is_page + ) + @classmethod + async def add_biz_permi_config(cls, db: AsyncSession, obj): + db_obj = SecuBizPermiConfig(**obj.model_dump()) + db.add(db_obj) + await db.flush() + return db_obj + + @classmethod + async def edit_biz_permi_config(cls, db: AsyncSession, onum: int, update_data: dict): + await db.execute( + update(SecuBizPermiConfig).where(SecuBizPermiConfig.onum == onum).values(**update_data) + ) + + @classmethod + async def delete_biz_permi_config(cls, db: AsyncSession, onum_list: list[int]): + await db.execute(delete(SecuBizPermiConfig).where(SecuBizPermiConfig.onum.in_(onum_list))) \ No newline at end of file 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 23c6a56..162f306 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 @@ -1,5 +1,5 @@ from datetime import datetime -from sqlalchemy import Column, String, Integer, DateTime, TIMESTAMP, func +from sqlalchemy import Column, String, Integer, DateTime, TIMESTAMP,Boolean, func from config.database import Base @@ -30,4 +30,31 @@ class MetadataSec(Base): upd_time = Column(TIMESTAMP, default=func.now(), onupdate=func.now(), nullable=True, comment='更新时间') sec_level_name = Column(String(50), default=None, comment='等级名称') sec_level_desc = Column(String(200), default=None, comment='等级说明') - sec_level_summary = Column(String(200), comment='等级简介') \ No newline at end of file + sec_level_summary = Column(String(200), comment='等级简介') + + +class SecuBizPermiConfig(Base): + __tablename__ = "t_secu_biz_permi_config" + + onum = Column(Integer, primary_key=True, autoincrement=True, comment="序号") + biz_onum = Column(Integer, nullable=True, comment="业务域的序号,可关联业务域定义表") + obj_type = Column(String(1), nullable=True, comment="对象类型(0:角色 1:用户)") + obj_value = Column(String(50), nullable=True, comment="角色值") + obj_name = Column(String(50), nullable=True, comment="角色值") + isStop = Column(Boolean, nullable=True, comment="是否停用(0:运行 1:停用)") + create_by = Column(String(20), nullable=True, comment="创建者") + create_time = Column(DateTime, nullable=True, comment="创建时间") + update_by = Column(String(20), nullable=True, comment="更新者") + update_time = Column(DateTime, nullable=True, comment="更新时间") + +class SecuBizConfig(Base): + __tablename__ = "t_secu_biz_config" + + onum = Column(Integer, primary_key=True, autoincrement=True, comment="序号") + biz_name = Column(String(255), nullable=True, comment="业务域名称") # 这里你给的是int,实际是否应该varchar? + risk_lvl = Column(String(50), nullable=True, comment="可关联安全等级序号") + isStop = Column(Boolean, nullable=True, comment="是否停用(0:运行 1:停用)") + create_by = Column(String(20), nullable=True, comment="创建者") + create_time = Column(DateTime, nullable=True, comment="创建时间") + update_by = Column(String(20), nullable=True, comment="更新者") + update_time = Column(DateTime, nullable=True, comment="更新时间") \ No newline at end of file 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 fa17988..60027f7 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 +from typing import Literal, Optional,List from module_admin.annotation.pydantic_annotation import as_query @@ -103,4 +103,111 @@ class MetadataSecPageQueryModel(MetadataSecQueryModel): """ page_num: int = Field(default=1, description='当前页码') page_size: int = Field(default=10, description='每页记录数') - \ No newline at end of file + + +# ----------- t_secu_biz_config 表对应模型 -------------- + +class SecuBizConfigModel(BaseModel): + """ + 业务域配置对应 Pydantic 模型 + """ + model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) + + onum: Optional[int] = Field(default=None, description='序号') + biz_name: Optional[str] = Field(default=None, description='业务域名称') + risk_lvl: Optional[str] = Field(default=None, description='可关联安全等级序号') + isStop: Optional[Literal[0, 1]] = Field(default=None, description='是否停用(0:运行 1:停用)') + create_by: Optional[str] = Field(default=None, description='创建者') + create_time: Optional[datetime] = Field(default=None, description='创建时间') + update_by: Optional[str] = Field(default=None, description='更新者') + update_time: Optional[datetime] = Field(default=None, description='更新时间') + + @NotBlank(field_name='risk_lvl', message='安全等级不能为空') + @Size(field_name='risk_lvl', max_length=50, message='安全等级长度不能超过50') + def get_risk_lvl(self): + return self.risk_lvl + + def validate_fields(self): + self.get_risk_lvl() + +class DeleteSecuBizConfigModel(BaseModel): + """ + 删除业务域配置模型 + """ + model_config = ConfigDict(alias_generator=to_camel) + onums: str = Field(..., description='需要删除的唯一编号(多个用逗号分隔)') + +class SecuBizConfigQueryModel(SecuBizConfigModel): + """ + 业务域配置不分页查询模型 + """ + begin_time: Optional[str] = Field(default=None, description='开始时间') + end_time: Optional[str] = Field(default=None, description='结束时间') + +@as_query +class SecuBizConfigPageQueryModel(SecuBizConfigQueryModel): + """ + 业务域配置分页查询模型 + """ + page_num: int = Field(default=1, description='当前页码') + page_size: int = Field(default=10, description='每页记录数') + + +# ----------- t_secu_biz_permi_config 表对应模型 -------------- + +class SecuBizPermiConfigModel(BaseModel): + """ + 业务域权限配置对应 Pydantic 模型 + """ + model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) + + onum: Optional[int] = Field(default=None, description='序号') + biz_onum: Optional[int] = Field(default=None, description='业务域的序号,可关联业务域定义表') + obj_type: Optional[str] = Field(default=None, description='对象类型(0:角色 1:用户)') + obj_value: Optional[str] = Field(default=None, description='角色值') + obj_name: Optional[str] = Field(default=None, description='角色名称') + isStop: Optional[bool] = Field(default=None, description='是否停用(false:运行 true:停用)') + create_by: Optional[str] = Field(default=None, description='创建者') + 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) + + biz_onum_list: List[int] = Field(..., description='业务域编号列表') + obj_type: str = Field(..., description='对象类型(0:角色 1:用户)') + obj_value: Optional[str] = Field(default=None, description='角色值') + 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): + return self.obj_name + + def validate_fields(self): + self.get_obj_name() + +class DeleteSecuBizPermiConfigModel(BaseModel): + """ + 删除业务域权限配置模型 + """ + model_config = ConfigDict(alias_generator=to_camel) + onums: str = Field(..., description='需要删除的唯一编号(多个用逗号分隔)') + +class SecuBizPermiConfigQueryModel(SecuBizPermiConfigModel): + """ + 业务域权限配置不分页查询模型 + """ + begin_time: Optional[str] = Field(default=None, description='开始时间') + end_time: Optional[str] = Field(default=None, description='结束时间') + +@as_query +class SecuBizPermiConfigPageQueryModel(SecuBizPermiConfigQueryModel): + """ + 业务域权限配置分页查询模型 + """ + page_num: int = Field(default=1, description='当前页码') + page_size: int = Field(default=10, description='每页记录数') \ No newline at end of file diff --git a/vue-fastapi-backend/module_admin/service/metadata_config_service.py b/vue-fastapi-backend/module_admin/service/metadata_config_service.py index 62a0ec4..b5911a4 100644 --- a/vue-fastapi-backend/module_admin/service/metadata_config_service.py +++ b/vue-fastapi-backend/module_admin/service/metadata_config_service.py @@ -1,10 +1,12 @@ from sqlalchemy.ext.asyncio import AsyncSession from module_admin.dao.metadata_config_dao import MetadataConfigDao from module_admin.entity.vo.common_vo import CrudResponseModel -from module_admin.entity.vo.metadata_config_vo import MetadataClasModel, MetadataClasPageQueryModel,MetadataSecModel,MetadataSecPageQueryModel +from module_admin.entity.vo.metadata_config_vo import MetadataClasModel, SecuBizPermiConfigBatchModel,MetadataClasPageQueryModel,MetadataSecModel,MetadataSecPageQueryModel,SecuBizConfigModel ,SecuBizConfigQueryModel,SecuBizPermiConfigModel, SecuBizPermiConfigQueryModel from utils.common_util import CamelCaseUtil from exceptions.exception import ServiceException import uuid +from typing import List +from datetime import datetime class MetadataConfigService: """ @@ -159,4 +161,139 @@ class MetadataConfigService: if result: return MetadataSecModel(**CamelCaseUtil.transform_result(result)) else: - return MetadataSecModel(**dict()) \ No newline at end of file + return MetadataSecModel(**dict()) + # ----------- t_secu_biz_config 服务方法 ----------- + + @classmethod + async def get_biz_config_list_services( + cls, db: AsyncSession, query_object: SecuBizConfigQueryModel, is_page: bool = False + ): + result = await MetadataConfigDao.get_biz_config_list(db, query_object, is_page) + return result + + @classmethod + async def add_biz_config_services(cls, db: AsyncSession, page_object: SecuBizConfigModel): + try: + await MetadataConfigDao.add_biz_config(db, page_object) + await db.commit() + return CrudResponseModel(is_success=True, message="新增成功") + except Exception as e: + await db.rollback() + raise e + + @classmethod + async def edit_biz_config_services(cls, db: AsyncSession, page_object: SecuBizConfigModel): + edit_data = page_object.model_dump(exclude_unset=True) + info = await cls.get_biz_config_detail_services(db, page_object.onum) + if info.onum: + try: + await MetadataConfigDao.edit_biz_config(db, page_object.onum, edit_data) + await db.commit() + return CrudResponseModel(is_success=True, message="更新成功") + except Exception as e: + await db.rollback() + raise e + else: + raise ServiceException(message="业务配置不存在") + + @classmethod + async def delete_biz_config_services(cls, db: AsyncSession, onum_list: str): + if not onum_list: + raise ServiceException(message="传入的编号为空") + + id_list = [onum.strip() for onum in onum_list.split(",") if onum.strip()] + if not id_list: + raise ServiceException(message="无效的编号列表") + + try: + await MetadataConfigDao.delete_biz_config(db, id_list) + await db.commit() + return CrudResponseModel(is_success=True, message="删除成功") + except Exception as e: + await db.rollback() + raise e + + @classmethod + async def get_biz_config_detail_services(cls, db: AsyncSession, onum: str): + result = await MetadataConfigDao.get_biz_config_detail_by_id(db, onum) + if result: + return SecuBizConfigModel(**CamelCaseUtil.transform_result(result)) + else: + return SecuBizConfigModel(**dict()) + + + # ----------- t_secu_biz_permi_config 服务方法 ----------- + + @classmethod + async def get_biz_permi_config_list_services( + cls, db: AsyncSession, query_object: SecuBizPermiConfigQueryModel, is_page: bool = False + ): + result = await MetadataConfigDao.get_biz_permi_config_list(db, query_object, is_page) + return result + @classmethod + async def add_biz_permi_config_services( + cls, + db: AsyncSession, + batch_model: SecuBizPermiConfigBatchModel, + create_by: str, + create_time: datetime + ) -> CrudResponseModel: + try: + records: List[SecuBizPermiConfigModel] = [] + for biz_onum in batch_model.biz_onum_list: + record = SecuBizPermiConfigModel() + record.biz_onum = biz_onum + record.obj_type = batch_model.obj_type + record.obj_value = batch_model.obj_value + record.obj_name = batch_model.obj_name + record.isStop = batch_model.isStop + record.create_by = create_by + record.create_time = create_time + records.append(record) + + await MetadataConfigDao.add_biz_permi_config_batch(db, records) + await db.commit() + return CrudResponseModel(is_success=True, message="新增成功") + except Exception as e: + await db.rollback() + raise e + + @classmethod + async def edit_biz_permi_config_services(cls, db: AsyncSession, page_object: SecuBizPermiConfigModel): + edit_data = page_object.model_dump(exclude_unset=True) + info = await cls.get_biz_permi_config_detail_services(db, page_object.onum) + if info.onum: + try: + await MetadataConfigDao.edit_biz_permi_config(db, page_object.onum, edit_data) + await db.commit() + return CrudResponseModel(is_success=True, message="更新成功") + except Exception as e: + await db.rollback() + raise e + else: + raise ServiceException(message="权限配置不存在") + + @classmethod + async def delete_biz_permi_config_services(cls, db: AsyncSession, onum_list: str): + if not onum_list: + raise ServiceException(message="传入的编号为空") + + id_list = [onum.strip() for onum in onum_list.split(",") if onum.strip()] + if not id_list: + raise ServiceException(message="无效的编号列表") + + try: + await MetadataConfigDao.delete_biz_permi_config(db, id_list) + await db.commit() + return CrudResponseModel(is_success=True, message="删除成功") + except Exception as e: + await db.rollback() + raise e + + @classmethod + async def get_biz_permi_config_detail_services(cls, db: AsyncSession, onum: str): + result = await MetadataConfigDao.get_biz_permi_config_detail_by_id(db, onum) + if result: + return SecuBizPermiConfigModel(**CamelCaseUtil.transform_result(result)) + else: + return SecuBizPermiConfigModel(**dict()) \ No newline at end of file diff --git a/vue-fastapi-frontend/src/api/metadataConfig/metadataConfig.js b/vue-fastapi-frontend/src/api/metadataConfig/metadataConfig.js index 0491c4a..57fcab0 100644 --- a/vue-fastapi-frontend/src/api/metadataConfig/metadataConfig.js +++ b/vue-fastapi-frontend/src/api/metadataConfig/metadataConfig.js @@ -85,4 +85,98 @@ export function delMetadataSec(secIds) { url: '/default-api/metadataConfig/sec/' + secIds, method: 'delete' }) -} \ No newline at end of file +} +// 查询业务配置列表,带分页 +export function listBizConfigAll(query) { + return request({ + url: '/default-api/metadataConfig/bizConfig/listall', + method: 'get', + params: query + }) +} +export function listBizConfig(query) { + return request({ + url: '/default-api/metadataConfig/bizConfig/list', + method: 'get', + params: query + }) +} +// 查询业务配置详情 +export function getBizConfig(onum) { + return request({ + url: '/default-api/metadataConfig/bizConfig/detail', + method: 'get', + params: { onum } + }) +} + +// 新增业务配置 +export function addBizConfig(data) { + return request({ + url: '/default-api/metadataConfig/bizConfig/add', + method: 'post', + data: data + }) +} + +// 修改业务配置 +export function updateBizConfig(data) { + return request({ + url: '/default-api/metadataConfig/bizConfig/edit', + method: 'post', + data: data + }) +} + +// 删除业务配置(支持批量,逗号分隔) +export function delBizConfig(onumStr) { + return request({ + url: '/default-api/metadataConfig/bizConfig/delete', + method: 'delete', + params: { onums: onumStr } + }) +} +// 查询权限配置列表,带分页 +export function listBizPermiConfig(query) { + return request({ + url: '/default-api/metadataConfig/bizPermiConfig/list', + method: 'get', + params: query + }) +} + +// 查询权限配置详情 +export function getBizPermiConfig(onum) { + return request({ + url: '/default-api/metadataConfig/bizPermiConfig/detail', + method: 'get', + params: { onum } + }) +} + +// 新增权限配置 +export function addBizPermiConfig(data) { + return request({ + url: '/default-api/metadataConfig/bizPermiConfig/add', + method: 'post', + data: data + }) +} + +// 修改权限配置 +export function updateBizPermiConfig(data) { + return request({ + url: '/default-api/metadataConfig/bizPermiConfig/edit', + method: 'post', + data: data + }) +} + +// 删除权限配置(支持批量,逗号分隔) +export function delBizPermiConfig(onumStr) { + return request({ + url: '/default-api/metadataConfig/bizPermiConfig/delete', + method: 'delete', + params: { onums: onumStr } + }) +} diff --git a/vue-fastapi-frontend/src/views/datastd/stdcode/index.vue b/vue-fastapi-frontend/src/views/datastd/stdcode/index.vue index 60a07b9..f85c1c3 100644 --- a/vue-fastapi-frontend/src/views/datastd/stdcode/index.vue +++ b/vue-fastapi-frontend/src/views/datastd/stdcode/index.vue @@ -148,7 +148,7 @@ - + @@ -214,11 +214,7 @@ const defaultProps = { const dialogVisible2 = ref(false); const dialogTitle2 = ref('标准代码'); const selectedRow = ref(null); // 传递给 codeItem 组件的数据 -const handlePagination = (pageNum, pageSize) => { - queryParams.value.pageNum = pageNum; - queryParams.value.pageSize = pageSize; - handleQuery(); -}; + const getSrcSysName = (id) => { const match = dbResourceOldList.value.find(item => item.id === id); return match ? match.name : id; diff --git a/vue-fastapi-frontend/src/views/datastd/stddict/AddEditForm.vue b/vue-fastapi-frontend/src/views/datastd/stddict/AddEditForm.vue index f9dd7f0..92a0ed3 100644 --- a/vue-fastapi-frontend/src/views/datastd/stddict/AddEditForm.vue +++ b/vue-fastapi-frontend/src/views/datastd/stddict/AddEditForm.vue @@ -31,8 +31,8 @@ > - - + + @@ -108,7 +108,7 @@ const props = defineProps({ // 定义表单校验规则 const formRules = ref({ dataDictVest: [{ required: true, message: '请选择字典归属', trigger: 'blur' }], - dictType: [{ required: true, message: '请选择数据字典类型', trigger: 'blur' }], + dataDictType: [{ required: true, message: '请选择数据字典类型', trigger: 'blur' }], dataStdBusiOwnershipDept: [{ required: true, message: '请选择业务认责部门', trigger: 'blur' }], dataStdItOwnershipDept: [{ required: true, message: '请选择技术认责部门', trigger: 'blur' }], dataDictNo: [{ required: true, message: '请输入数据字典编号', trigger: 'blur' }], @@ -172,6 +172,8 @@ const handleSubmit = () => { const apiCall = props.isEdit ? updateStdDict(formData.value) : addStdDict(formData.value); apiCall .then(() => { + proxy.$modal.msgSuccess("提交审批流程成功!"); + emit('refresh'); handleClose(); }) diff --git a/vue-fastapi-frontend/src/views/datastd/stddict/index.vue b/vue-fastapi-frontend/src/views/datastd/stddict/index.vue index 60f2428..c5bfc03 100644 --- a/vue-fastapi-frontend/src/views/datastd/stddict/index.vue +++ b/vue-fastapi-frontend/src/views/datastd/stddict/index.vue @@ -105,7 +105,7 @@ @@ -212,7 +212,7 @@ :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" - @pagination="handlePagination" + @pagination="getList" /> @@ -258,7 +258,7 @@ const { std_code_status, std_code_appr } = proxy.useDict( const queryParams = ref({ dataDictNo: "", dataDictCnName: "", - dictType: "", + dataDictType: "", sysName: "", classId: "dict", sysId: "", @@ -296,11 +296,6 @@ const handleStdClick = (code) => { }); }; -const handlePagination = (pageNum, pageSize) => { - queryParams.value.pageNum = pageNum; - queryParams.value.pageSize = pageSize; - handleQuery(); -}; const transCodetoId = (dataStdNo) => { const match = stdList.value.find(item => item.dataStdNo === dataStdNo); @@ -346,7 +341,7 @@ const resetQuery = () => { queryParams.value = { dataDictNo: "", dataDictCnName: "", - dictType: "", + dataDictType: "", sysName: "", sysId: undefined, pageNum: 1, @@ -380,7 +375,7 @@ const handleAdd = () => { dataDictVest: "company", sysId: 10000, sysName: "公司级", - dictType: "", + dataDictType: "", dataDictNo: "", dataDictEngName: "", dataDictCnName: "", diff --git a/vue-fastapi-frontend/src/views/metadataConfig/bizConfig/index.vue b/vue-fastapi-frontend/src/views/metadataConfig/bizConfig/index.vue new file mode 100644 index 0000000..5e51b19 --- /dev/null +++ b/vue-fastapi-frontend/src/views/metadataConfig/bizConfig/index.vue @@ -0,0 +1,272 @@ + + + + + diff --git a/vue-fastapi-frontend/src/views/metadataConfig/bizPermiConfig/index.vue b/vue-fastapi-frontend/src/views/metadataConfig/bizPermiConfig/index.vue new file mode 100644 index 0000000..f6e0266 --- /dev/null +++ b/vue-fastapi-frontend/src/views/metadataConfig/bizPermiConfig/index.vue @@ -0,0 +1,392 @@ + + + + +