From 7f313292fbfe9538523c426851354fa21da1cb7f Mon Sep 17 00:00:00 2001 From: "si@aidatagov.com" Date: Sat, 12 Apr 2025 04:01:39 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=A0=87=E5=87=86=E5=AE=A1?= =?UTF-8?q?=E6=89=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/datastd_controller.py | 61 +++- .../module_admin/dao/datastd_dao.py | 81 ++++- .../module_admin/entity/do/datastd_do.py | 41 ++- .../module_admin/entity/vo/datastd_vo.py | 9 +- .../module_admin/service/approval_service.py | 37 +++ .../module_admin/service/datastd_service.py | 120 ++++++- vue-fastapi-frontend/src/api/datastd/std.js | 22 +- .../src/views/datastd/main/index.vue | 2 +- .../src/views/system/flow/conf.vue | 2 +- .../src/views/system/flow/dataStdMainAppr.vue | 302 ++++++++++++++++++ .../src/views/system/flow/index.vue | 15 +- 11 files changed, 675 insertions(+), 17 deletions(-) create mode 100644 vue-fastapi-frontend/src/views/system/flow/dataStdMainAppr.vue diff --git a/vue-fastapi-backend/module_admin/controller/datastd_controller.py b/vue-fastapi-backend/module_admin/controller/datastd_controller.py index e7fb71c..921dc33 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 +from module_admin.entity.vo.datastd_vo import DataStdCodeModel, 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 @@ -393,6 +393,17 @@ async def get_std_main_list( main_page_query_result = await DataStdService.get_std_main_list(query_db, main_page_query, is_page=True) logger.info('获取数据标准列表成功') return ResponseUtil.success(model_content=main_page_query_result) +@datastdController.get( + '/stdmain/main/listappr', response_model=PageResponseModel, dependencies=[Depends(CheckUserInterfaceAuth('datastd:stdmain:main:list'))] +) +async def get_std_main_appr_list( + request: Request, + main_page_query: DataStdMainApprModel= Depends(DataStdMainApprModel), + query_db: AsyncSession = Depends(get_db), +): + main_page_query_result = await DataStdService.get_std_main_appr_list(query_db, main_page_query, is_page=True) + logger.info('获取数据标准列表成功') + return ResponseUtil.success(data=main_page_query_result) @datastdController.get( '/stdmain/main/selectlist', response_model=PageResponseModel, dependencies=[Depends(CheckUserInterfaceAuth('datastd:stdmain:main:list'))] ) @@ -413,6 +424,14 @@ async def query_detail_main(request: Request, id: str, query_db: AsyncSession = logger.info(f'获取数据标准ID为{id}的信息成功') return ResponseUtil.success(data=config_detail_result) +@datastdController.get( + '/stdmain/mainappr/{id}', response_model=DataStdMainModel, dependencies=[Depends(CheckUserInterfaceAuth('datastd:stdmain:main:list'))] +) +async def query_detail_main_appr(request: Request, id: str, query_db: AsyncSession = Depends(get_db)): + config_detail_result = await DataStdService.get_std_main_change_by_id(query_db, id) + logger.info(f'获取数据标准ID为{id}的信息成功') + + return ResponseUtil.success(data=config_detail_result) @datastdController.post('/stdmain/main', dependencies=[Depends(CheckUserInterfaceAuth('datastd:stdmain:main:add'))]) @@ -431,6 +450,22 @@ async def add_std_main( logger.info(add_std_main_result.message) return ResponseUtil.success(msg=add_std_main_result.message) +@datastdController.post('/stdmain/mainAppr', dependencies=[Depends(CheckUserInterfaceAuth('datastd:stdmain:main:add'))]) +@Log(title='数据标准', business_type=BusinessType.INSERT) +async def add_std_main_appr( + request: Request, + add_std_main: DataStdMainModel, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), +): + add_std_main.create_by = current_user.user.user_name + add_std_main.create_time = datetime.now() + add_std_main.update_by = current_user.user.user_name + add_std_main.update_time = datetime.now() + add_std_main_result = await DataStdService.add_std_main_appr(query_db, add_std_main) + logger.info(add_std_main_result.message) + return ResponseUtil.success(msg=add_std_main_result.message) + @datastdController.put('/stdmain/main', dependencies=[Depends(CheckUserInterfaceAuth('datastd:stdmain:main:edit'))]) @Log(title='数据标准', business_type=BusinessType.UPDATE) @@ -445,7 +480,19 @@ async def edit_std_main( edit_std_main_result = await DataStdService.edit_std_main(query_db, edit_std_main) logger.info(edit_std_main_result.message) return ResponseUtil.success(msg=edit_std_main_result.message) - +@datastdController.put('/stdmain/mainAppr', dependencies=[Depends(CheckUserInterfaceAuth('datastd:stdmain:main:edit'))]) +@Log(title='数据标准', business_type=BusinessType.UPDATE) +async def edit_std_main_appr( + request: Request, + edit_std_main: DataStdMainModel, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), +): + edit_std_main.update_by = current_user.user.user_name + edit_std_main.update_time = datetime.now() + edit_std_main_result = await DataStdService.edit_std_main_appr(query_db, edit_std_main) + logger.info(edit_std_main_result.message) + return ResponseUtil.success(msg=edit_std_main_result.message) @datastdController.delete('/stdmain/main/{id}', dependencies=[Depends(CheckUserInterfaceAuth('datastd:stdmain:main:remove'))]) @Log(title='数据标准', business_type=BusinessType.DELETE) @@ -457,6 +504,16 @@ async def delete_std_main( delete_std_main_result = await DataStdService.delete_std_main(query_db, id) logger.info(delete_std_main_result.message) return ResponseUtil.success(msg=delete_std_main_result.message) +@datastdController.delete('/stdmain/mainAppr/{id}', dependencies=[Depends(CheckUserInterfaceAuth('datastd:stdmain:main:remove'))]) +@Log(title='数据标准', business_type=BusinessType.DELETE) +async def delete_std_main_Appr( + request: Request, + id: str, + query_db: AsyncSession = Depends(get_db), +): + delete_std_main_result = await DataStdService.delete_std_main_Appr(query_db, id) + logger.info(delete_std_main_result.message) + return ResponseUtil.success(msg=delete_std_main_result.message) @datastdController.put('/stdmain/mainonum', dependencies=[Depends(CheckUserInterfaceAuth('datastd:stdmain:main:remove'))]) @Log(title='数据标准', business_type=BusinessType.DELETE) async def change_std_main_onum( diff --git a/vue-fastapi-backend/module_admin/dao/datastd_dao.py b/vue-fastapi-backend/module_admin/dao/datastd_dao.py index 758add3..8a26852 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 -from module_admin.entity.vo.datastd_vo import DataStdCodeModel,DataStdDictModel,DataStdMainModel +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.dept_do import SysDept from utils.page_util import PageUtil from sqlalchemy.orm import aliased @@ -705,14 +705,20 @@ class DataStdDao: db.add(col) await db.flush() return col - + @classmethod + async def add_std_main_appr(cls, db: AsyncSession, model: DataStdMainApprModel): + col = DataStdMainAppr(**model.model_dump()) + db.add(col) + await db.flush() + return col @classmethod async def delete_std_main(cls, db: AsyncSession, Id: str): await db.execute(delete(DataStdMain).where(DataStdMain.id == Id)) @classmethod async def update_std_main(cls, db: AsyncSession, update_data: DataStdMainModel): - await db.execute(update(DataStdMain), [update_data]) + update_dict = update_data.model_dump(exclude_unset=True) + await db.execute(update(DataStdMain), [update_dict]) await db.flush() @classmethod @@ -734,4 +740,71 @@ class DataStdDao: ) ) return col.scalars().first() + @classmethod + async def get_std_main_appr_list_all(cls, db: AsyncSession, query_object: DataStdMainApprModel): + filters = [] + + if query_object.std_name: + filters.append(DataStdMainAppr.std_name.like(f"%{query_object.std_name}%")) + if query_object.std_code: + filters.append(DataStdMainAppr.std_code.like(f"%{query_object.std_code}%")) + if query_object.sys_id: + filters.append(DataStdMainAppr.sys_id == query_object.sys_id) + if query_object.code_id: + filters.append(DataStdMainAppr.code_id == query_object.code_id) + if query_object.flowId: + filters.append(DataStdMainAppr.flowId == query_object.flowId) + if query_object.std_type: + filters.append(DataStdMainAppr.std_type == query_object.std_type) + if query_object.std_status: + filters.append(DataStdMainAppr.std_status == query_object.std_status) + query = select(DataStdMainAppr).where(*filters).order_by(desc(DataStdMainAppr.create_time)) + return await PageUtil.paginate(db, query, 0, 0, False) + + @classmethod + async def get_std_main_appr_list(cls, flowId:str,db: AsyncSession): + 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) + @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_last_std_main_appr_by_id(cls,db: AsyncSession, Id: str ): + result = await db.execute( + select(DataStdMainAppr) + .where( + DataStdMainAppr.oldInstId == Id, + DataStdMainAppr.approStatus == "succeed" + ) + .order_by(DataStdMainAppr.update_time.desc()) + .limit(1) + ) + return result.scalar_one_or_none() + + @classmethod + async def update_std_main_appr(cls, db: AsyncSession, update_data: DataStdMainApprModel): + update_dict = update_data.model_dump(exclude_unset=True) + await db.execute(update(DataStdMainAppr), [update_dict]) + await db.flush() + + @classmethod + async def check_std_main_waiting(cls, oldInstId: str, db: AsyncSession): + filters = [ + DataStdMainAppr.oldInstId == oldInstId, + or_( + DataStdMainAppr.approStatus == "waiting", + DataStdMainAppr.approStatus == "pending" + ) + ] + + query = ( + select(DataStdMainAppr) + .where(*filters) + .order_by(desc(DataStdMainAppr.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 48ed6fd..373fcd6 100644 --- a/vue-fastapi-backend/module_admin/entity/do/datastd_do.py +++ b/vue-fastapi-backend/module_admin/entity/do/datastd_do.py @@ -114,4 +114,43 @@ class DataStdMain(Base): tech_user = Column(String(20), default=None, comment='技术认责人员') content_onum = Column(Integer, default=None, comment='分类') std_src = Column(String(20), default=None, comment='标准来源') - data_clas = Column(String(20), default=None, comment='数据类别') \ No newline at end of file + data_clas = Column(String(20), default=None, comment='数据类别') + + +class DataStdMainAppr(Base): + """ + 数据标准表 + """ + __tablename__ = 't_datastd_main_appr' + + id = Column(String(50), primary_key=True, comment='标准代码Id') + create_by = Column(String(20), default='', comment='创建者') + create_time = Column(DateTime, nullable=True, default=None, comment='创建时间') + update_by = Column(String(20), default='', comment='更新者') + update_time = Column(DateTime, nullable=True, default=None, comment='更新时间') + std_num = Column(String(50), default=None, comment='标准编号') + std_code = Column(String(50), default=None, comment='标准英文名') + std_name = Column(String(200), default=None, comment='标准中文名') + std_type = Column(String(1), default=None, comment='标准类型(0:基础数据 1:指标数据)') + securityLevel = Column(String(1), default=None, comment='安全等级') + sourceSystem = Column(String(50), default=None, comment='来源系统') + sys_name = Column(String(50), default=None, comment='归属系统') + sys_id = Column(Integer, default=None, comment='归属系统Id') + std_menu = Column(String(200), default=None, comment='标准业务定义') + code_num = Column(String(50), default=None, comment='代码编号') + code_id = Column(String(50), default=None, comment='代码id') + std_status = Column(String(1), default=None, comment='标准状态(1:有效 0:无效)') + buss_dept_id = Column(BigInteger, default=None, comment='业务认责部门') + tech_dept_id = Column(BigInteger, default=None, comment='技术认责部门') + buss_user = Column(String(20), default=None, comment='业务认责人员') + tech_user = Column(String(20), default=None, comment='技术认责人员') + content_onum = Column(Integer, default=None, comment='分类') + std_src = Column(String(20), default=None, comment='标准来源') + data_clas = Column(String(20), default=None, comment='数据类别') + 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已取消)') + \ No newline at end of file diff --git a/vue-fastapi-backend/module_admin/entity/vo/datastd_vo.py b/vue-fastapi-backend/module_admin/entity/vo/datastd_vo.py index 7f4c609..5f38f25 100644 --- a/vue-fastapi-backend/module_admin/entity/vo/datastd_vo.py +++ b/vue-fastapi-backend/module_admin/entity/vo/datastd_vo.py @@ -123,4 +123,11 @@ class DataStdMainPageQueryModel(DataStdMainModel): 元数据任务分页查询模型 """ page_num: int = Field(default=1, description='当前页码') - page_size: int = Field(default=10, description='每页记录数') \ No newline at end of file + page_size: int = Field(default=10, description='每页记录数') +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 79a9800..58642dd 100644 --- a/vue-fastapi-backend/module_admin/service/approval_service.py +++ b/vue-fastapi-backend/module_admin/service/approval_service.py @@ -13,6 +13,8 @@ from utils.common_util import CamelCaseUtil 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 class ApprovalService: @@ -89,6 +91,9 @@ class ApprovalService: edit.approvalFlow = json.dumps(array) if flow_approval.businessType == 'metaDataInfo': await cls.syncSuppInfo(result_db, flow_approval.businessId, edit.status) + # 数据标准审批 + elif flow_approval.businessType == 'dataStdMain': + await cls.syncStdMainInfo(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='操作成功') @@ -121,7 +126,39 @@ class ApprovalService: else: await MetaDao.updateMetadataSuppInfo(suppTable.onum, table, result_db) return CrudResponseModel(is_success=True, message='操作成功') + @classmethod + async def syncStdMainInfo(cls, result_db: AsyncSession, suppId: str, operateType: str): + apprList = await DataStdDao.get_std_main_appr_list(suppId, result_db) + + for appr in apprList: + # 将 SQLAlchemy 模型实例转换为 Pydantic 模型实例 + appr_model = DataStdMainApprModel.model_validate(appr) + + change_type = appr_model.changeType + if operateType =='succeed': + if change_type == "add": + # 将 DataStdMainApprModel 转换为 DataStdMainModel + main_model = DataStdMainModel(**appr_model.model_dump(exclude_unset=True, by_alias=True)) + await DataStdDao.add_std_main(result_db, main_model) + + elif change_type == "edit": + # 使用 oldInstId 作为主键 + main_model = DataStdMainModel(**appr_model.model_dump(exclude_unset=True, by_alias=True)) + main_model.id = appr_model.oldInstId + await DataStdDao.update_std_main(result_db, main_model) + + elif change_type == "delete": + await DataStdDao.delete_std_main(result_db, appr_model.oldInstId) + + # 更新 approStatus 状态 + appr_model.approStatus = operateType + await DataStdDao.update_std_main_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, current_user: CurrentUserModel): diff --git a/vue-fastapi-backend/module_admin/service/datastd_service.py b/vue-fastapi-backend/module_admin/service/datastd_service.py index 10df044..eff8b07 100644 --- a/vue-fastapi-backend/module_admin/service/datastd_service.py +++ b/vue-fastapi-backend/module_admin/service/datastd_service.py @@ -3,9 +3,11 @@ 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 +from module_admin.entity.vo.datastd_vo import DataStdCodeModel,DeleteDataStdModel,DataStdDictModel,DataStdMainModel,DataStdMainApprModel from utils.common_util import CamelCaseUtil import uuid +from module_admin.entity.vo.approval_vo import ApplyModel +from module_admin.service.approval_service import ApprovalService from collections import defaultdict from datetime import datetime from config.constant import CommonConstant @@ -767,6 +769,9 @@ class DataStdService: async def get_std_main_list(cls, query_db: AsyncSession, query_object: DataStdMainModel, is_page: bool = False): return await DataStdDao.get_std_main_list(query_db, query_object, is_page) @classmethod + async def get_std_main_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_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 @@ -779,6 +784,41 @@ class DataStdService: else: return DataStdMainModel(**dict()) + + @classmethod + async def get_std_main_appr_by_id(cls, query_db: AsyncSession, id: str): + mainstd= await DataStdDao.get_std_main_appr_by_id(query_db, id) + if mainstd: + return DataStdMainModel(**CamelCaseUtil.transform_result(mainstd)) + + else: + return DataStdMainModel(**dict()) + @classmethod + async def get_std_main_change_by_id(cls, query_db: AsyncSession, id: str): + mainstd= await DataStdDao.get_std_main_appr_by_id(query_db, id) + if mainstd: + if mainstd.changeType == "edit": + compareMainstd = await DataStdDao.get_std_main_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 DataStdMainModel(**CamelCaseUtil.transform_result(mainstd)) + + else: + return DataStdMainModel(**dict()) @classmethod async def add_std_main(cls, query_db: AsyncSession, model: DataStdMainModel): if not await cls.check_std_num_unique(query_db, model): @@ -789,6 +829,7 @@ class DataStdService: await DataStdDao.add_std_main(query_db, model) return CrudResponseModel(is_success=True, message='新增标准成功') + @classmethod async def edit_std_main(cls, query_db: AsyncSession, model: DataStdMainModel): if not await cls.check_std_num_unique(query_db, model): @@ -799,7 +840,82 @@ class DataStdService: return CrudResponseModel(is_success=True, message='编辑标准成功') else: raise ServiceException(message=f'标准 {model.id} 不存在') - + @classmethod + async def add_std_main_appr(cls, query_db: AsyncSession, model: DataStdMainModel): + if not await cls.check_std_num_unique(query_db, model): + raise ServiceException(message=f"标准编号 {model.std_num} 已存在") + model.id=str(uuid.uuid4()) + model.std_status="9" + model.content_onum=2 + # 将 DataStdMainModel 转换为 DataStdMainApprModel,保留字段原始名 + apprModel = DataStdMainApprModel(**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_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') + 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): + raise ServiceException(message=f"标准编号 {model.std_num} 已存在") + model.std_status="9" + # 将 DataStdMainModel 转换为 DataStdMainApprModel,保留字段原始名 + + watingList=await DataStdDao.check_std_main_waiting(model.id, query_db) + if len(watingList)>0 : # 如果 watingList 存在,意味着标准正在审批中 + raise ServiceException(message="标准正在审批中,请等待审批完成") + lastAppr =await DataStdDao.get_last_std_main_appr_by_id(query_db,model.id) + apprModel = DataStdMainApprModel(**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_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') + 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_main(cls, query_db: AsyncSession, ids: str): if ids: diff --git a/vue-fastapi-frontend/src/api/datastd/std.js b/vue-fastapi-frontend/src/api/datastd/std.js index e5ccaa9..28c2e2d 100644 --- a/vue-fastapi-frontend/src/api/datastd/std.js +++ b/vue-fastapi-frontend/src/api/datastd/std.js @@ -189,6 +189,14 @@ export function listStdMain(query) { params: query }) } + +export function listStdMainAppr(query) { + return request({ + url: '/default-api/datastd/stdmain/main/listappr', + method: 'get', + params: query + }) +} // 查询数据标准列表 export function listStdMainSelect(query) { return request({ @@ -207,12 +215,18 @@ export function getStdMain(colId) { method: 'get' }) } - +export function getStdMainAppr(colId) { + return request({ + url: '/default-api/datastd/stdmain/mainappr/' + parseStrEmpty(colId), + method: 'get' + }) +} // 新增数据标准 export function addStdMain(data) { return request({ - url: '/default-api/datastd/stdmain/main', + url: '/default-api/datastd/stdmain/mainAppr', + // url: '/default-api/datastd/stdmain/mainAppr', 不带审批 method: 'post', data: data }) @@ -223,7 +237,7 @@ export function addStdMain(data) { // 修改数据标准 export function updateStdMain(data) { return request({ - url: '/default-api/datastd/stdmain/main', + url: '/default-api/datastd/stdmain/mainAppr', method: 'put', data: data }) @@ -233,7 +247,7 @@ export function updateStdMain(data) { // 删除数据标准 export function deleteStdMain(colId) { return request({ - url: '/default-api/datastd/stdmain/main/' + colId, + url: '/default-api/datastd/stdmain/mainAppr/' + colId, method: 'delete' }) } diff --git a/vue-fastapi-frontend/src/views/datastd/main/index.vue b/vue-fastapi-frontend/src/views/datastd/main/index.vue index f97efec..ce170d5 100644 --- a/vue-fastapi-frontend/src/views/datastd/main/index.vue +++ b/vue-fastapi-frontend/src/views/datastd/main/index.vue @@ -498,7 +498,7 @@ const handleRemove = (row) => { }) .then(() => { handleQuery(); - proxy.$modal.msgSuccess("删除成功"); + proxy.$modal.msgSuccess("提交删除审批成功"); }) .catch(() => {}); }; diff --git a/vue-fastapi-frontend/src/views/system/flow/conf.vue b/vue-fastapi-frontend/src/views/system/flow/conf.vue index e078ee3..38ab0e6 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':'other','text':'其他模块(敬请期待)'}]) +const moduleList = ref([{'module':'metaDataInfo','text':'元数据'},{'module':'dataStdMain','text':'数据标准'},{'module':'other','text':'其他模块(敬请期待)'}]) let graph = null const roleList = ref([]) const data = ref([]) diff --git a/vue-fastapi-frontend/src/views/system/flow/dataStdMainAppr.vue b/vue-fastapi-frontend/src/views/system/flow/dataStdMainAppr.vue new file mode 100644 index 0000000..773a55c --- /dev/null +++ b/vue-fastapi-frontend/src/views/system/flow/dataStdMainAppr.vue @@ -0,0 +1,302 @@ + + + + + \ No newline at end of file diff --git a/vue-fastapi-frontend/src/views/system/flow/index.vue b/vue-fastapi-frontend/src/views/system/flow/index.vue index aaa710c..5084820 100644 --- a/vue-fastapi-frontend/src/views/system/flow/index.vue +++ b/vue-fastapi-frontend/src/views/system/flow/index.vue @@ -516,6 +516,10 @@ + + + + @@ -524,13 +528,17 @@ import {getFlowConfList, getApprovalList, operateProcess, cancelMyFlow } from "@/api/flow/flow" import { getMetaInfoApplyBusinessDetail } from "@/api/meta/metaInfo" import {v4 as uuid} from 'uuid' +import DataStdMainTable from './dataStdMainAppr.vue'; // 路径根据实际调整 +const stdMainVisible = ref(false); const { proxy } = getCurrentInstance(); import { ref, nextTick, computed, watch, reactive, onMounted } from 'vue' import {getWaitingFlowCount} from "../../../api/flow/flow.js"; import cache from "../../../plugins/cache.js"; import {Graph} from "@antv/x6"; const flowTab = ref('waiting') +const selectedFlowId = ref(''); + const data = reactive({ queryParams: { pageNum: 1, @@ -806,8 +814,9 @@ function resetQuery(){ getList() } function showBusinessDataDialog(row){ - businessDialog.value = true + if (row.businessType === 'metaDataInfo'){ + businessDialog.value = true let param = { businessId: row.businessId } @@ -952,6 +961,10 @@ function showBusinessDataDialog(row){ } } }) + }else if(row.businessType ==="dataStdMain"){ + + selectedFlowId.value = row.businessId; + stdMainVisible.value = true; } }