diff --git a/vue-fastapi-backend/module_admin/controller/datastd_controller.py b/vue-fastapi-backend/module_admin/controller/datastd_controller.py index 7e806e6..2ff3d66 100644 --- a/vue-fastapi-backend/module_admin/controller/datastd_controller.py +++ b/vue-fastapi-backend/module_admin/controller/datastd_controller.py @@ -6,7 +6,7 @@ from config.get_db import get_db from module_admin.entity.vo.user_vo import CurrentUserModel from module_admin.annotation.log_annotation import Log from module_admin.aspect.interface_auth import CheckUserInterfaceAuth -from module_admin.entity.vo.datastd_vo import DataStdCodeModel, DataStdCodePageQueryModel, DeleteDataStdModel,DataStdDictModel,DataStdDictPageQueryModel,DataStdMainModel,DataStdMainPageQueryModel,DataStdMainApprModel +from module_admin.entity.vo.datastd_vo import DataStdCodeModel,DataStdDictApprModel, DataStdCodePageQueryModel, DeleteDataStdModel,DataStdDictModel,DataStdDictPageQueryModel,DataStdMainModel,DataStdMainPageQueryModel,DataStdMainApprModel from module_admin.service.datastd_service import DataStdService from module_admin.service.login_service import LoginService from utils.log_util import logger @@ -141,7 +141,16 @@ async def edit_std_code_with_items( # ----------------------------------------------------------------数据字典---------------------------------------------------------------------------------------------------- - +@datastdController.get('/stddict/dict/listappr', response_model=PageResponseModel, dependencies=[Depends(CheckUserInterfaceAuth('datastd:stddict:dict:list'))] +) +async def get_std_dict_appr_list( + request: Request, + main_page_query: DataStdDictApprModel= Depends(DataStdDictApprModel), + query_db: AsyncSession = Depends(get_db), +): + main_page_query_result = await DataStdService.get_std_dict_appr_list(query_db, main_page_query, is_page=True) + logger.info('获取数据标准列表成功') + return ResponseUtil.success(data=main_page_query_result) @datastdController.get( '/stddict/dict/list', response_model=PageResponseModel, dependencies=[Depends(CheckUserInterfaceAuth('datastd:stddict:dict:list'))] @@ -163,7 +172,7 @@ async def query_detail_dict(request: Request, id: str, query_db: AsyncSession = return ResponseUtil.success(data=config_detail_result) @datastdController.post('/stddict/dict', dependencies=[Depends(CheckUserInterfaceAuth('datastd:stddict:dict:add'))]) -@Log(title='代码管理', business_type=BusinessType.INSERT) +@Log(title='数据字典', business_type=BusinessType.INSERT) async def add_std_dict( request: Request, add_std_dict: DataStdDictModel, @@ -181,7 +190,7 @@ async def add_std_dict( @datastdController.put('/stddict/dict', dependencies=[Depends(CheckUserInterfaceAuth('datastd:stddict:dict:edit'))]) -@Log(title='代码管理', business_type=BusinessType.UPDATE) +@Log(title='数据字典', business_type=BusinessType.UPDATE) async def edit_std_dict( request: Request, edit_std_dict: DataStdDictModel, @@ -196,7 +205,7 @@ async def edit_std_dict( @datastdController.delete('/stddict/dict/{ids}', dependencies=[Depends(CheckUserInterfaceAuth('datastd:stddict:dict:remove'))]) -@Log(title='代码管理', business_type=BusinessType.DELETE) +@Log(title='数据字典', business_type=BusinessType.DELETE) async def delete_std_dict( request: Request, ids: str, @@ -206,8 +215,53 @@ async def delete_std_dict( delete_std_dict_result = await DataStdService.delete_std_dict_services(request, query_db, delete_std_dict) logger.info(delete_std_dict_result.message) return ResponseUtil.success(msg=delete_std_dict_result.message) +# 字典审批接口 - +@datastdController.get( + '/stddict/dictappr/{id}', response_model=DataStdDictModel, dependencies=[Depends(CheckUserInterfaceAuth('datastd:stdmain:main:list'))] +) +async def query_detail_dict_appr(request: Request, id: str, query_db: AsyncSession = Depends(get_db)): + config_detail_result = await DataStdService.get_std_dict_change_by_id(query_db, id) + logger.info(f'获取数据标准ID为{id}的信息成功') + return ResponseUtil.success(data=config_detail_result) +@datastdController.post('/stddict/dictappr', dependencies=[Depends(CheckUserInterfaceAuth('datastd:stdmain:main:add'))]) +@Log(title='数据字典', business_type=BusinessType.INSERT) +async def add_std_dict_appr( + request: Request, + add_std_dict: DataStdDictModel, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), +): + add_std_dict.create_by = current_user.user.user_name + add_std_dict.create_time = datetime.now() + add_std_dict.update_by = current_user.user.user_name + add_std_dict.update_time = datetime.now() + add_std_dict_result = await DataStdService.add_std_dict_appr(query_db, add_std_dict) + logger.info(add_std_dict_result.message) + return ResponseUtil.success(msg=add_std_dict_result.message) +@datastdController.put('/stddict/dictappr', dependencies=[Depends(CheckUserInterfaceAuth('datastd:stdmain:main:edit'))]) +@Log(title='数据字典', business_type=BusinessType.UPDATE) +async def edit_std_dict_appr( + request: Request, + edit_std_dict: DataStdDictModel, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), +): + edit_std_dict.update_by = current_user.user.user_name + edit_std_dict.update_time = datetime.now() + edit_std_dict_result = await DataStdService.edit_std_dict_appr(query_db, edit_std_dict) + logger.info(edit_std_dict_result.message) + return ResponseUtil.success(msg=edit_std_dict_result.message) +@datastdController.delete('/stddict/dictappr/{id}', dependencies=[Depends(CheckUserInterfaceAuth('datastd:stdmain:main:remove'))]) +@Log(title='数据字典', business_type=BusinessType.DELETE) +async def delete_std_dict_Appr( + request: Request, + id: str, + query_db: AsyncSession = Depends(get_db), +): + delete_std_dict_result = await DataStdService.delete_std_dict_Appr(query_db, id) + logger.info(delete_std_dict_result.message) + return ResponseUtil.success(msg=delete_std_dict_result.message) diff --git a/vue-fastapi-backend/module_admin/dao/datastd_dao.py b/vue-fastapi-backend/module_admin/dao/datastd_dao.py index 14e355f..c78a6bf 100644 --- a/vue-fastapi-backend/module_admin/dao/datastd_dao.py +++ b/vue-fastapi-backend/module_admin/dao/datastd_dao.py @@ -1,7 +1,7 @@ from sqlalchemy import delete, select, update, desc,or_,not_ from sqlalchemy.ext.asyncio import AsyncSession -from module_admin.entity.do.datastd_do import DataStdCode,DataStdDict,DataAstContent,DataAstContentRela,DataStdMain,DataStdMainAppr -from module_admin.entity.vo.datastd_vo import DataStdCodeModel,DataStdDictModel,DataStdMainModel,DataStdMainApprModel +from module_admin.entity.do.datastd_do import DataStdCode,DataStdDict,DataAstContent,DataAstContentRela,DataStdMain,DataStdMainAppr,DataStdDictAppr +from module_admin.entity.vo.datastd_vo import DataStdCodeModel,DataStdDictModel,DataStdMainModel,DataStdMainApprModel,DataStdDictApprModel from module_admin.entity.do.dept_do import SysDept from utils.page_util import PageUtil from sqlalchemy.orm import aliased @@ -714,14 +714,28 @@ class DataStdDao: await db.flush() return col @classmethod + async def add_std_dict_appr(cls, db: AsyncSession, model: DataStdDictApprModel): + col = DataStdDictAppr(**model.model_dump()) + db.add(col) + await db.flush() + return col + @classmethod async def delete_std_main(cls, db: AsyncSession, Id: str): await db.execute(delete(DataStdMain).where(DataStdMain.id == Id)) + @classmethod + async def delete_std_dict_appr(cls, db: AsyncSession, Id: str): + await db.execute(delete(DataStdDictAppr).where(DataStdDictAppr.id == Id)) @classmethod async def update_std_main(cls, db: AsyncSession, update_data: DataStdMainModel): update_dict = update_data.model_dump(exclude_unset=True) await db.execute(update(DataStdMain), [update_dict]) await db.flush() + @classmethod + async def update_std_dict_appr(cls, db: AsyncSession, update_data: DataStdDictApprModel): + update_dict = update_data.model_dump(exclude_unset=True) + await db.execute(update(DataStdDictAppr), [update_dict]) + await db.flush() @classmethod async def get_std_main_by_id(cls, db: AsyncSession, Id: str): @@ -768,12 +782,22 @@ class DataStdDao: filters = [] filters.append(DataStdMainAppr.flowId == flowId) query = select(DataStdMainAppr).where(*filters).order_by(desc(DataStdMainAppr.create_time)) - return await PageUtil.paginate(db, query, 0, 0, False) + return await PageUtil.paginate(db, query, 0, 0, False) + @classmethod + async def get_std_dict_appr_list(cls, flowId:str,db: AsyncSession): + filters = [] + filters.append(DataStdDictAppr.flowId == flowId) + query = select(DataStdDictAppr).where(*filters).order_by(desc(DataStdDictAppr.create_time)) + return await PageUtil.paginate(db, query, 0, 0, False) @classmethod async def get_std_main_appr_by_id(cls, db: AsyncSession, Id: str): col = await db.execute(select(DataStdMainAppr).where(DataStdMainAppr.id == Id)) return col.scalars().first() @classmethod + async def get_std_dict_appr_by_id(cls, db: AsyncSession, Id: str): + col = await db.execute(select(DataStdDictAppr).where(DataStdDictAppr.id == Id)) + return col.scalars().first() + @classmethod async def get_last_std_main_appr_by_id(cls,db: AsyncSession, Id: str ): result = await db.execute( select(DataStdMainAppr) @@ -785,6 +809,18 @@ class DataStdDao: .limit(1) ) return result.scalar_one_or_none() + @classmethod + async def get_last_std_dict_appr_by_id(cls,db: AsyncSession, Id: str ): + result = await db.execute( + select(DataStdDictAppr) + .where( + DataStdDictAppr.oldInstId == Id, + DataStdDictAppr.approStatus == "succeed" + ) + .order_by(DataStdDictAppr.update_time.desc()) + .limit(1) + ) + return result.scalar_one_or_none() @classmethod async def update_std_main_appr(cls, db: AsyncSession, update_data: DataStdMainApprModel): @@ -809,4 +845,21 @@ class DataStdDao: ) return await PageUtil.paginate(db, query, 0, 0, False) + @classmethod + async def check_std_dict_waiting(cls, oldInstId: str, db: AsyncSession): + filters = [ + DataStdDictAppr.oldInstId == oldInstId, + or_( + DataStdDictAppr.approStatus == "waiting", + DataStdDictAppr.approStatus == "pending" + ) + ] + + query = ( + select(DataStdDictAppr) + .where(*filters) + .order_by(desc(DataStdDictAppr.create_time)) + ) + + return await PageUtil.paginate(db, query, 0, 0, False) \ No newline at end of file diff --git a/vue-fastapi-backend/module_admin/entity/do/datastd_do.py b/vue-fastapi-backend/module_admin/entity/do/datastd_do.py index 373fcd6..d36f1a2 100644 --- a/vue-fastapi-backend/module_admin/entity/do/datastd_do.py +++ b/vue-fastapi-backend/module_admin/entity/do/datastd_do.py @@ -55,6 +55,38 @@ class DataStdDict(Base): tech_dept_id = Column(BigInteger, default=None, comment='技术认责部门') buss_user = Column(String(20), default=None, comment='业务认责人员') tech_user = Column(String(20), default=None, comment='技术认责人员') +class DataStdDictAppr(Base): + """ + 标准字典审批表 (Standard Code Table) + """ + __tablename__ = 't_datastd_dict_appr' # 表名为 t_datastd_dict + + id = Column(String(50), primary_key=True, comment='标准代码Id') + create_by = Column(String(20), default='', comment='创建者') + create_time = Column(DateTime, nullable=True, default=None, comment='创建时间') + update_by = Column(String(20), default='', comment='更新者') + update_time = Column(DateTime, nullable=True, default=None, comment='更新时间') + dict_num = Column(String(50), default=None, comment='字典编号') + dict_code = Column(String(50), default=None, comment='字典英文名') + dict_name = Column(String(200), default=None, comment='字典中文名') + dict_level = Column(String(10), default=None, comment='字典归属(sys:系统级 company:公司级)') + dict_type = Column(String(1), default=None, comment='字典类型(0:基础数据 1:指标数据)') + sys_name = Column(String(50), default=None, comment='归属系统') + sys_id = Column(Integer, default=None, comment='归属系统Id') + dict_menu = Column(String(200), default=None, comment='字典业务定义') + data_type = Column(String(20), default=None, comment='数据类型') + std_code = Column(String(50), default=None, comment='数据标准编号') + std_name = Column(String(50), default=None, comment='数据标准名称') + dict_status = Column(String(1), default=None, comment='字典状态(1:有效 0:无效)') + buss_dept_id = Column(BigInteger, default=None, comment='业务认责部门') + tech_dept_id = Column(BigInteger, default=None, comment='技术认责部门') + buss_user = Column(String(20), default=None, comment='业务认责人员') + tech_user = Column(String(20), default=None, comment='技术认责人员') + changeType = Column(String(10), default=None, comment='变更类型') + flowId = Column(String(50), default=None, comment='审批Id') + oldInstId = Column(String(50), default=None, comment='原始正式id') + compareId = Column(String(50), default=None, comment='原始数据id(用于对比差异)') + approStatus = Column(String(10), default=None, comment='审批状态(waiting,申请中,pending审核中,succeed,rejected已审核,canceled已取消)') class DataAstContent(Base): __tablename__ = "t_data_std_content" @@ -149,7 +181,6 @@ class DataStdMainAppr(Base): data_clas = Column(String(20), default=None, comment='数据类别') changeType = Column(String(10), default=None, comment='变更类型') flowId = Column(String(50), default=None, comment='审批Id') - approResult = Column(String(20), default=None, comment='审批结果') oldInstId = Column(String(50), default=None, comment='原始正式id') compareId = Column(String(50), default=None, comment='原始数据id(用于对比差异)') approStatus = Column(String(10), default=None, comment='审批状态(waiting,申请中,pending审核中,succeed,rejected已审核,canceled已取消)') diff --git a/vue-fastapi-backend/module_admin/entity/vo/datastd_vo.py b/vue-fastapi-backend/module_admin/entity/vo/datastd_vo.py index 5f38f25..3327943 100644 --- a/vue-fastapi-backend/module_admin/entity/vo/datastd_vo.py +++ b/vue-fastapi-backend/module_admin/entity/vo/datastd_vo.py @@ -87,6 +87,12 @@ class DataStdDictPageQueryModel(DataStdDictModel): """ page_num: int = Field(default=1, description='当前页码') page_size: int = Field(default=10, description='每页记录数') +class DataStdDictApprModel(DataStdDictModel): + changeType: Optional[str] = Field(default=None, description='变更类型') + flowId: Optional[str] = Field(default=None, description='审批Id') + oldInstId: Optional[str] = Field(default=None, description='原始正式id') + compareId: Optional[str] = Field(default=None, description='原始数据id(用于对比差异)') + approStatus: Optional[str] = Field(default=None, description='审批状态(waiting,申请中,pending审核中,succeed,rejected已审核,canceled已取消)') class DataStdMainModel(BaseModel): """ 标准代码表对应Pydantic模型 (Standard Code Table Pydantic Model) @@ -127,7 +133,6 @@ class DataStdMainPageQueryModel(DataStdMainModel): class DataStdMainApprModel(DataStdMainModel): changeType: Optional[str] = Field(default=None, description='变更类型') flowId: Optional[str] = Field(default=None, description='审批Id') - approResult: Optional[str] = Field(default=None, description='审批结果') oldInstId: Optional[str] = Field(default=None, description='原始正式id') compareId: Optional[str] = Field(default=None, description='原始数据id(用于对比差异)') approStatus: Optional[str] = Field(default=None, description='审批状态(waiting,申请中,pending审核中,succeed,rejected已审核,canceled已取消)') \ No newline at end of file diff --git a/vue-fastapi-backend/module_admin/service/approval_service.py b/vue-fastapi-backend/module_admin/service/approval_service.py index 58642dd..5e7fad0 100644 --- a/vue-fastapi-backend/module_admin/service/approval_service.py +++ b/vue-fastapi-backend/module_admin/service/approval_service.py @@ -14,7 +14,7 @@ from module_admin.dao.approval_dao import ApprovalDao from module_admin.dao.user_dao import UserDao from module_admin.dao.meta_dao import MetaDao from module_admin.dao.datastd_dao import DataStdDao -from module_admin.entity.vo.datastd_vo import DataStdCodeModel,DataStdDictModel,DataStdMainModel,DataStdMainApprModel +from module_admin.entity.vo.datastd_vo import DataStdCodeModel,DataStdDictModel,DataStdMainModel,DataStdMainApprModel,DataStdDictApprModel,DataStdDictModel class ApprovalService: @@ -94,6 +94,9 @@ class ApprovalService: # 数据标准审批 elif flow_approval.businessType == 'dataStdMain': await cls.syncStdMainInfo(result_db, flow_approval.businessId, edit.status) + # 数据字典审批 + elif flow_approval.businessType == 'dataStdDict': + await cls.syncStdDictInfo(result_db, flow_approval.businessId, edit.status) await ApprovalDao.edit_flow_approval(result_db, edit.model_dump(exclude_unset=True)) await result_db.commit() return CrudResponseModel(is_success=True, message='操作成功') @@ -158,6 +161,39 @@ class ApprovalService: return CrudResponseModel(is_success=True, message='操作成功') + @classmethod + async def syncStdDictInfo(cls, result_db: AsyncSession, suppId: str, operateType: str): + apprList = await DataStdDao.get_std_dict_appr_list(suppId, result_db) + + for appr in apprList: + # 将 SQLAlchemy 模型实例转换为 Pydantic 模型实例 + appr_model = DataStdDictApprModel.model_validate(appr) + + change_type = appr_model.changeType + if operateType =='succeed': + if change_type == "add": + # 将 DataStdDictApprModel 转换为 DataStdDictModel + main_model = DataStdDictModel(**appr_model.model_dump(exclude_unset=True, by_alias=True)) + + await DataStdDao.add_std_dict(result_db, main_model) + + elif change_type == "edit": + # 使用 oldInstId 作为主键 + main_model = DataStdDictModel(**appr_model.model_dump(exclude_unset=True, by_alias=True)) + + main_model.id = appr_model.oldInstId + await DataStdDao.update_std_dict(result_db, main_model.model_dump(exclude_unset=True)) + + elif change_type == "delete": + await DataStdDao.delete_std_dict(result_db, appr_model.oldInstId) + + # 更新 approStatus 状态 + appr_model.approStatus = operateType + await DataStdDao.update_std_dict_appr(result_db, appr_model) + + + return CrudResponseModel(is_success=True, message='操作成功') + @classmethod async def get_flow_list_services(cls, query_db: AsyncSession, query_param: ApprovalQueryObject, diff --git a/vue-fastapi-backend/module_admin/service/datastd_service.py b/vue-fastapi-backend/module_admin/service/datastd_service.py index eee9dd3..40be264 100644 --- a/vue-fastapi-backend/module_admin/service/datastd_service.py +++ b/vue-fastapi-backend/module_admin/service/datastd_service.py @@ -3,7 +3,7 @@ from sqlalchemy.ext.asyncio import AsyncSession from exceptions.exception import ServiceException from module_admin.dao.datastd_dao import DataStdDao from module_admin.entity.vo.common_vo import CrudResponseModel -from module_admin.entity.vo.datastd_vo import DataStdCodeModel,DeleteDataStdModel,DataStdDictModel,DataStdMainModel,DataStdMainApprModel +from module_admin.entity.vo.datastd_vo import DataStdCodeModel,DeleteDataStdModel,DataStdDictModel,DataStdMainModel,DataStdMainApprModel,DataStdDictApprModel from utils.common_util import CamelCaseUtil import uuid from module_admin.entity.vo.approval_vo import ApplyModel @@ -772,6 +772,9 @@ class DataStdService: async def get_std_main_appr_list(cls, query_db: AsyncSession, query_object: DataStdMainApprModel, is_page: bool = False): return await DataStdDao.get_std_main_appr_list(query_object.flowId, query_db) @classmethod + async def get_std_dict_appr_list(cls, query_db: AsyncSession, query_object: DataStdDictApprModel, is_page: bool = False): + return await DataStdDao.get_std_dict_appr_list(query_object.flowId, query_db) + @classmethod async def get_std_main_list_all(cls, query_db: AsyncSession, query_object: DataStdMainModel): main_query_result= await DataStdDao.get_std_main_list_all(query_db, query_object) return main_query_result @@ -820,6 +823,32 @@ class DataStdService: else: return DataStdMainModel(**dict()) @classmethod + async def get_std_dict_change_by_id(cls, query_db: AsyncSession, id: str): + mainstd= await DataStdDao.get_std_dict_appr_by_id(query_db, id) + if mainstd: + if mainstd.changeType == "edit": + compareMainstd = await DataStdDao.get_std_dict_appr_by_id(query_db, mainstd.compareId) + + # 将对象转成 dict,驼峰转小写风格字段 + new_data = CamelCaseUtil.transform_result(mainstd) + old_data = CamelCaseUtil.transform_result(compareMainstd) if compareMainstd else {} + + result_dict = {} + for key, new_value in new_data.items(): + old_value = old_data.get(key) + + if new_value != old_value and old_value is not None: + # 有变化,拼接 "旧值 ==> 新值" + result_dict[key] = f"{old_value} ==> {new_value}" + else: + result_dict[key] = new_value + + return result_dict # 返回 dict,不是 DataStdMainModel 实例 + return DataStdDictModel(**CamelCaseUtil.transform_result(mainstd)) + + else: + return DataStdDictModel(**dict()) + @classmethod async def add_std_main(cls, query_db: AsyncSession, model: DataStdMainModel): if not await cls.check_std_num_unique(query_db, model): raise ServiceException(message=f"标准编号 {model.std_num} 已存在") @@ -860,7 +889,27 @@ class DataStdService: applyModel.businessId = apprModel.flowId applyModel.applicant = apprModel.create_by await ApprovalService.apply_services(query_db, applyModel, 'dataStdMain') - return CrudResponseModel(is_success=True, message='新增标准成功') + return CrudResponseModel(is_success=True, message='新增标准成功') + @classmethod + async def add_std_dict_appr(cls, query_db: AsyncSession, model: DataStdDictModel): + if not await cls.check_dict_unique_services(query_db, model): + raise ServiceException(message=f"字典编号 {model.dict_num} 已存在") + model.id=str(uuid.uuid4()) + model.dict_status="9" + # 将 DataStdMainModel 转换为 DataStdMainApprModel,保留字段原始名 + apprModel = DataStdDictApprModel(**model.model_dump(exclude_unset=True, by_alias=True)) + apprModel.changeType="add" + apprModel.compareId=model.id + apprModel.oldInstId=model.id + apprModel.approStatus="waiting" + apprModel.flowId=str(uuid.uuid4()) + await DataStdDao.add_std_dict_appr(query_db, apprModel) + applyModel = ApplyModel() + applyModel.businessType = "dataStdDict" + applyModel.businessId = apprModel.flowId + applyModel.applicant = apprModel.create_by + await ApprovalService.apply_services(query_db, applyModel, 'dataStdDict') + return CrudResponseModel(is_success=True, message='新增标准成功') @classmethod async def edit_std_main_appr(cls, query_db: AsyncSession, model: DataStdMainModel): if not await cls.check_std_num_unique(query_db, model): @@ -887,30 +936,84 @@ class DataStdService: await ApprovalService.apply_services(query_db, applyModel, 'dataStdMain') return CrudResponseModel(is_success=True, message='修改标准成功') @classmethod + async def edit_std_dict_appr(cls, query_db: AsyncSession, model: DataStdDictModel): + if not await cls.check_dict_unique_services(query_db, model): + raise ServiceException(message=f"字典编号 {model.c} 已存在") + model.dict_status="9" + + watingList=await DataStdDao.check_std_dict_waiting(model.id, query_db) + if len(watingList)>0 : # 如果 watingList 存在,意味着标准正在审批中 + raise ServiceException(message="标准正在审批中,请等待审批完成") + lastAppr =await DataStdDao.get_last_std_dict_appr_by_id(query_db,model.id) + apprModel = DataStdDictApprModel(**model.model_dump(exclude_unset=True, by_alias=True)) + apprModel.changeType="edit" + apprModel.id=str(uuid.uuid4()) + apprModel.oldInstId=model.id + apprModel.compareId=lastAppr.id + apprModel.approStatus="waiting" + apprModel.flowId=str(uuid.uuid4()) + await DataStdDao.add_std_dict_appr(query_db, apprModel) + applyModel = ApplyModel() + applyModel.businessType = "dataStdDict" + applyModel.businessId = apprModel.flowId + applyModel.applicant = apprModel.create_by + await ApprovalService.apply_services(query_db, applyModel, 'dataStdDict') + return CrudResponseModel(is_success=True, message='修改标准成功') + @classmethod async def delete_std_main_Appr(cls, query_db: AsyncSession, ids: str): + if ids: + col_id_list = ids.split(',') + try: + for col_id in col_id_list: + col_info = await cls.get_std_main_by_id(query_db, col_id) + if col_info: + watingList=await DataStdDao.check_std_main_waiting(col_info.id,query_db ) + if len(watingList)>0 : # 如果 watingList 存在,意味着标准正在审批中 + raise ServiceException(message="标准正在审批中,请等待审批完成") + apprModel = DataStdMainApprModel(**col_info.model_dump(exclude_unset=True, by_alias=True)) + apprModel.changeType="delete" + apprModel.id=str(uuid.uuid4()) + apprModel.oldInstId=col_info.id + apprModel.approStatus="waiting" + apprModel.flowId=str(uuid.uuid4()) + await DataStdDao.add_std_main_appr(query_db, apprModel) + applyModel = ApplyModel() + applyModel.businessType = "dataStdMain" + applyModel.businessId = apprModel.flowId + applyModel.applicant = apprModel.create_by + await ApprovalService.apply_services(query_db, applyModel, 'dataStdMain') + await query_db.commit() + return CrudResponseModel(is_success=True, message='提交删除标准审批成功') + except Exception as e: + await query_db.rollback() + raise e + else: + raise ServiceException(message='传入标准ID为空') + @classmethod + async def delete_std_dict_Appr(cls, query_db: AsyncSession, ids: str): if ids: col_id_list = ids.split(',') try: for col_id in col_id_list: - col_info = await cls.get_std_main_by_id(query_db, col_id) + col_info = await cls.get_std_dict_by_id_services(query_db, col_id) if col_info: - watingList=await DataStdDao.check_std_main_waiting(col_info.id,query_db ) + watingList=await DataStdDao.check_std_dict_waiting(col_info.id,query_db ) if len(watingList)>0 : # 如果 watingList 存在,意味着标准正在审批中 raise ServiceException(message="标准正在审批中,请等待审批完成") - apprModel = DataStdMainApprModel(**col_info.model_dump(exclude_unset=True, by_alias=True)) + apprModel = DataStdDictApprModel(**col_info.model_dump(exclude_unset=True, by_alias=True)) apprModel.changeType="delete" apprModel.id=str(uuid.uuid4()) apprModel.oldInstId=col_info.id apprModel.approStatus="waiting" apprModel.flowId=str(uuid.uuid4()) - await DataStdDao.add_std_main_appr(query_db, apprModel) + await DataStdDao.add_std_dict_appr(query_db, apprModel) applyModel = ApplyModel() - applyModel.businessType = "dataStdMain" + applyModel.businessType = "dataStdDict" applyModel.businessId = apprModel.flowId applyModel.applicant = apprModel.create_by - await ApprovalService.apply_services(query_db, applyModel, 'dataStdMain') + await ApprovalService.apply_services(query_db, applyModel, 'dataStdDict') await query_db.commit() - return CrudResponseModel(is_success=True, message='提交删除标准审批成功') + return CrudResponseModel(is_success=True, message='提交删除字典审批成功') except Exception as e: await query_db.rollback() raise e diff --git a/vue-fastapi-frontend/src/api/datastd/std.js b/vue-fastapi-frontend/src/api/datastd/std.js index 28c2e2d..4483590 100644 --- a/vue-fastapi-frontend/src/api/datastd/std.js +++ b/vue-fastapi-frontend/src/api/datastd/std.js @@ -146,7 +146,7 @@ export function getStdDict(colId) { // 新增标准代码 export function addStdDict(data) { return request({ - url: '/default-api/datastd/stddict/dict', + url: '/default-api/datastd/stddict/dictappr', method: 'post', data: data }) @@ -157,7 +157,7 @@ export function addStdDict(data) { // 修改标准代码 export function updateStdDict(data) { return request({ - url: '/default-api/datastd/stddict/dict', + url: '/default-api/datastd/stddict/dictappr', method: 'put', data: data }) @@ -167,7 +167,7 @@ export function updateStdDict(data) { // 删除标准代码 export function deleteStdDict(colId) { return request({ - url: '/default-api/datastd/stddict/dict/' + colId, + url: '/default-api/datastd/stddict/dictappr/' + colId, method: 'delete' }) } @@ -177,7 +177,7 @@ export function deleteStdDict(colId) { // 批量删除标准代码 export function deleteStdDicts(colIds) { return request({ - url: '/default-api/datastd/stddict/dict/' + colIds, + url: '/default-api/datastd/stddict/dictappr/' + colIds, method: 'delete' }) } @@ -197,6 +197,13 @@ export function listStdMainAppr(query) { params: query }) } +export function listStdDictAppr(query) { + return request({ + url: '/default-api/datastd/stddict/dict/listappr', + method: 'get', + params: query + }) +} // 查询数据标准列表 export function listStdMainSelect(query) { return request({ @@ -221,7 +228,12 @@ export function getStdMainAppr(colId) { method: 'get' }) } - +export function getStdDictAppr(colId) { + return request({ + url: '/default-api/datastd/stddict/dictappr/' + parseStrEmpty(colId), + method: 'get' + }) +} // 新增数据标准 export function addStdMain(data) { return request({ diff --git a/vue-fastapi-frontend/src/views/system/flow/conf.vue b/vue-fastapi-frontend/src/views/system/flow/conf.vue index 38ab0e6..04dd203 100644 --- a/vue-fastapi-frontend/src/views/system/flow/conf.vue +++ b/vue-fastapi-frontend/src/views/system/flow/conf.vue @@ -62,7 +62,7 @@ import { listRole } from "@/api/system/role"; import {getFlowConfList,saveFlowConfig } from "@/api/flow/flow"; const { proxy } = getCurrentInstance(); -const moduleList = ref([{'module':'metaDataInfo','text':'元数据'},{'module':'dataStdMain','text':'数据标准'},{'module':'other','text':'其他模块(敬请期待)'}]) +const moduleList = ref([{'module':'metaDataInfo','text':'元数据'},{'module':'dataStdMain','text':'数据标准'},{'module':'dataStdDict','text':'数据字典'},{'module':'other','text':'其他模块(敬请期待)'}]) let graph = null const roleList = ref([]) const data = ref([]) diff --git a/vue-fastapi-frontend/src/views/system/flow/dataStdDictAppr.vue b/vue-fastapi-frontend/src/views/system/flow/dataStdDictAppr.vue new file mode 100644 index 0000000..6c8df57 --- /dev/null +++ b/vue-fastapi-frontend/src/views/system/flow/dataStdDictAppr.vue @@ -0,0 +1,420 @@ + + + + + \ No newline at end of file diff --git a/vue-fastapi-frontend/src/views/system/flow/dataStdMainAppr.vue b/vue-fastapi-frontend/src/views/system/flow/dataStdMainAppr.vue index 773a55c..ad905e0 100644 --- a/vue-fastapi-frontend/src/views/system/flow/dataStdMainAppr.vue +++ b/vue-fastapi-frontend/src/views/system/flow/dataStdMainAppr.vue @@ -4,6 +4,8 @@ :data="tableData" border style="width: 100%" + :row-class-name="tableRowClassName" + > @@ -183,6 +185,11 @@ const props = defineProps({ flowId: { type: String, required: true + }, + stdMainVisible:{ + type: Boolean, + required: true + } }); const isChanged = (val) => typeof val === 'string' && val.includes('==>') @@ -196,7 +203,18 @@ const formatValue = (val) => { } const loading = ref(false); const tableData = ref([]); - +function tableRowClassName({ row }) { + switch (row.changeType) { + case 'add': + return 'row-add' + case 'edit': + return 'row-edit' + case 'delete': + return 'row-delete' + default: + return '' + } +} const changeTypeMap = { add: '新增', edit: '修改', @@ -242,7 +260,7 @@ const getList = async () => { } }; -watch(() => props.flowId, (newVal) => { +watch(() => props.stdMainVisible, (newVal) => { if (newVal) { getList(); } @@ -294,7 +312,15 @@ const handleView = async (id) => { .el-dialog__footer { text-align: center; } - +::v-deep(.row-add) { + background-color: #bae7ff !important; +} +::v-deep(.row-edit) { + background-color: #d9f7be !important; +} +::v-deep(.row-delete) { + background-color: #ffa39e !important; +} .dialog-footer-btn { width: 100px; /* 按钮宽度 */ font-size: 14px; diff --git a/vue-fastapi-frontend/src/views/system/flow/index.vue b/vue-fastapi-frontend/src/views/system/flow/index.vue index 5084820..e11d0ab 100644 --- a/vue-fastapi-frontend/src/views/system/flow/index.vue +++ b/vue-fastapi-frontend/src/views/system/flow/index.vue @@ -519,7 +519,10 @@ - + + + + @@ -529,8 +532,10 @@ import {getFlowConfList, getApprovalList, operateProcess, cancelMyFlow } from "@ import { getMetaInfoApplyBusinessDetail } from "@/api/meta/metaInfo" import {v4 as uuid} from 'uuid' import DataStdMainTable from './dataStdMainAppr.vue'; // 路径根据实际调整 +import DataStdDictTable from './dataStdDictAppr.vue'; // 路径根据实际调整 const stdMainVisible = ref(false); +const stdDictVisible = ref(false); const { proxy } = getCurrentInstance(); import { ref, nextTick, computed, watch, reactive, onMounted } from 'vue' import {getWaitingFlowCount} from "../../../api/flow/flow.js"; @@ -962,10 +967,15 @@ function showBusinessDataDialog(row){ } }) }else if(row.businessType ==="dataStdMain"){ + console.log("打开标准1111") selectedFlowId.value = row.businessId; stdMainVisible.value = true; - } + }else if(row.businessType ==="dataStdDict"){ +console.log("打开字典222") +selectedFlowId.value = row.businessId; +stdDictVisible.value = true; +} } function agree(row){