diff --git a/vue-fastapi-backend/module_admin/controller/datastd_controller.py b/vue-fastapi-backend/module_admin/controller/datastd_controller.py index 2ff3d66..561af2d 100644 --- a/vue-fastapi-backend/module_admin/controller/datastd_controller.py +++ b/vue-fastapi-backend/module_admin/controller/datastd_controller.py @@ -96,7 +96,19 @@ async def delete_std_code( delete_std_code_result = await DataStdService.delete_std_code_services(request, query_db, delete_std_code) logger.info(delete_std_code_result.message) return ResponseUtil.success(msg=delete_std_code_result.message) - +@datastdController.delete('/stdcode/codeWithItems/appr', dependencies=[Depends(CheckUserInterfaceAuth('datastd:stdcode:codeWithItems:delete'))]) +@Log(title='标准代码与代码项管理', business_type=BusinessType.DELETE) +async def delete_std_code_with_items_appr( + request: Request, + ids: str, + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), +): + try: + await DataStdService.delete_std_code_with_items_appr(ids, query_db, current_user) + return ResponseUtil.success(msg="提交删除标准代码审批成功") + except Exception as e: + return ResponseUtil.error(msg=str(e)) @datastdController.post('/stdcode/codeWithItems', dependencies=[Depends(CheckUserInterfaceAuth('datastd:stdcode:codeWithItems:add'))]) @Log(title='标准代码与代码项管理', business_type=BusinessType.INSERT) async def add_std_code_with_items( @@ -118,6 +130,23 @@ async def add_std_code_with_items( # 返回响应 logger.info(result.message) return ResponseUtil.success(msg=result.message) +@datastdController.post('/stdcode/codeWithItems/appr', dependencies=[Depends(CheckUserInterfaceAuth('datastd:stdcode:codeWithItems:add'))]) +@Log(title='标准代码与代码项管理', business_type=BusinessType.INSERT) +async def add_std_code_with_items_appr( + request: Request, + code: DataStdCodeModel, + code_item_list: list[DataStdCodeModel] = [], + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), +): + try: + # 调用 service 层的业务逻辑 + await DataStdService.add_std_code_with_items_appr( + code, code_item_list, query_db, current_user + ) + return ResponseUtil.success(msg="标准代码及代码项添加成功,等待审批") + except Exception as e: + return ResponseUtil.error(msg=str(e)) @datastdController.put('/stdcode/codeWithItems', dependencies=[Depends(CheckUserInterfaceAuth('datastd:stdcode:codeWithItems:add'))]) @Log(title='标准代码与代码项管理', business_type=BusinessType.INSERT) async def edit_std_code_with_items( @@ -140,6 +169,29 @@ async def edit_std_code_with_items( + + +@datastdController.put('/stdcode/codeWithItems/appr', dependencies=[Depends(CheckUserInterfaceAuth('datastd:stdcode:codeWithItems:edit'))]) +@Log(title='标准代码与代码项管理', business_type=BusinessType.UPDATE) +async def edit_std_code_with_items_appr( + request: Request, + code: DataStdCodeModel, + code_item_list: list[DataStdCodeModel], + query_db: AsyncSession = Depends(get_db), + current_user: CurrentUserModel = Depends(LoginService.get_current_user), +): + try: + await DataStdService.edit_std_code_with_items_appr( + code, code_item_list, query_db, current_user + ) + return ResponseUtil.success(msg="标准代码及代码项修改成功,等待审批") + except Exception as e: + return ResponseUtil.error(msg=str(e)) + + + + + # ----------------------------------------------------------------数据字典---------------------------------------------------------------------------------------------------- @datastdController.get('/stddict/dict/listappr', response_model=PageResponseModel, dependencies=[Depends(CheckUserInterfaceAuth('datastd:stddict:dict:list'))] ) 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 d36f1a2..ce28b0d 100644 --- a/vue-fastapi-backend/module_admin/entity/do/datastd_do.py +++ b/vue-fastapi-backend/module_admin/entity/do/datastd_do.py @@ -26,7 +26,33 @@ class DataStdCode(Base): code_map_id = Column(String(50), default=None,comment='标准代码Id') code_map_num = Column(String(50), default=None, comment='标准代码编号') code_map_name = Column(String(200), default=None, comment='标准代码值') +class DataStdCodeAppr(Base): + """ + 标准代码表 (Standard Code Table) + """ + __tablename__ = 't_datastd_code_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='更新时间') + code_num = Column(String(50), default=None, comment='标准代码编号') + code_name = Column(String(200), default=None, comment='标准代码值') + code_type = Column(String(10), default=None, comment='标准代码类型(sys:系统级 company:公司级)') + code_status = Column(String(1), default=None, comment='代码状态(0:有效 1:无效)') + sys_name = Column(String(50), default=None, comment='归属系统') + sys_id = Column(Integer, default=None, comment='归属系统Id') + class_id = Column(String(10), default=None, comment='代码类型(code:代码 codeItem:代码项)') + parent_id = Column(String(50), default=None, comment='父id') + code_map_id = Column(String(50), default=None,comment='标准代码Id') + code_map_num = Column(String(50), default=None, comment='标准代码编号') + code_map_name = Column(String(200), 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 DataStdDict(Base): """ 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 3327943..7bdc602 100644 --- a/vue-fastapi-backend/module_admin/entity/vo/datastd_vo.py +++ b/vue-fastapi-backend/module_admin/entity/vo/datastd_vo.py @@ -35,7 +35,12 @@ class DataStdCodeModel(BaseModel): code_map_num: Optional[str] = Field(default=None, description='标准代码编号(映射)') code_map_name: Optional[str] = Field(default=None, description='标准代码名称(映射)') - +class DataStdCodeApprModel(DataStdCodeModel): + 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已取消)') @as_query class DataStdCodePageQueryModel(DataStdCodeModel): diff --git a/vue-fastapi-backend/module_admin/service/datastd_service.py b/vue-fastapi-backend/module_admin/service/datastd_service.py index 40be264..0e8be16 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,DataStdDictApprModel +from module_admin.entity.vo.datastd_vo import DataStdCodeModel,DeleteDataStdModel,DataStdDictModel,DataStdMainModel,DataStdMainApprModel,DataStdDictApprModel,DataStdCodeApprModel from utils.common_util import CamelCaseUtil import uuid from module_admin.entity.vo.approval_vo import ApplyModel @@ -12,6 +12,7 @@ from collections import defaultdict from datetime import datetime from config.constant import CommonConstant from module_admin.entity.vo.data_ast_content_vo import DataCatalogPageQueryModel, DeleteDataCatalogModel,DataCatalogResponseWithChildren,DataCatalogMovedRequest,DataCatalogMergeRequest,DataCatalogChild,DataCatalogMoverelRequest +from module_admin.entity.vo.user_vo import CurrentUserModel class DataStdService: """ @@ -146,12 +147,12 @@ class DataStdService: 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 else: - raise ServiceException(message='传入列配置ID为空') + raise ServiceException(message='传入标准代码ID为空') @classmethod async def add_std_code_with_items_services(cls, request, query_db: AsyncSession, code: DataStdCodeModel, code_item_list: list[DataStdCodeModel]): @@ -190,6 +191,76 @@ class DataStdService: except Exception as e: await query_db.rollback() raise ServiceException(message=f"新增标准代码失败: {str(e)}") + @classmethod + async def add_std_code_with_items_appr( + cls, + code: DataStdCodeModel, + code_item_list: list[DataStdCodeModel], + query_db: AsyncSession, + current_user: CurrentUserModel + ): + # 设置标准代码的创建和更新时间 + code.id = str(uuid.uuid4()) # 新生成 ID + code.create_by = current_user.user.user_name + code.create_time = datetime.now() + code.update_by = current_user.user.user_name + code.update_time = datetime.now() + code.sys_name = '公司级' if 'company' == code.code_type else code.sys_name + + # 校验标准代码是否已存在于正式表中 + if await cls.check_code_exists_in_official(query_db, code.code_num): + raise ServiceException(message=f'标准代码{code.code_num}已经存在于正式表中,无法新增') + + # 先创建标准代码的审批记录 + appr_model = DataStdCodeApprModel(**code.model_dump(exclude_unset=True, by_alias=True)) + appr_model.changeType = "add" + appr_model.compareId = code.id + appr_model.oldInstId = code.id + appr_model.approStatus = "waiting" + appr_model.flowId = str(uuid.uuid4()) # 新生成 Flow ID + + # 将标准代码添加到审批表 + await DataStdDao.add_std_code_appr(query_db, appr_model) + + # 创建审批申请 + apply_model = ApplyModel() + apply_model.businessType = "dataStdCode" + apply_model.businessId = appr_model.flowId + apply_model.applicant = appr_model.create_by + await ApprovalService.apply_services(query_db, apply_model, 'dataStdCode') + + # 同时处理代码项的添加 + for item in code_item_list: + item.id = str(uuid.uuid4()) # 新生成 ID + item.create_by = current_user.user.user_name + item.create_time = datetime.now() + item.update_by = current_user.user.user_name + item.update_time = datetime.now() + item.sys_name = '公司级' if 'company' == item.code_type else item.sys_name + item.parent_id = code.id # 设置父级 ID + + # 校验代码项是否已存在于正式表中 + if await cls.check_code_exists_in_official(query_db, item.code_num): + raise ServiceException(message=f'代码项{item.code_num}已经存在于正式表中,无法新增') + + # 同样需要创建审批记录 + item_appr_model = DataStdCodeApprModel(**item.model_dump(exclude_unset=True, by_alias=True)) + item_appr_model.changeType = "add" + item_appr_model.compareId = item.id + item_appr_model.oldInstId = item.id + item_appr_model.approStatus = "waiting" + item_appr_model.flowId = appr_model.flowId # 使用相同的 Flow ID + + await DataStdDao.add_std_code_appr(query_db, item_appr_model) + + # 创建代码项的审批申请 + apply_model.businessId = item_appr_model.flowId + await ApprovalService.apply_services(query_db, apply_model, 'dataStdCode') + + return CrudResponseModel(is_success=True, message='新增标准代码和代码项成功') + + + @classmethod async def edit_std_code_with_items_services(cls, request, query_db: AsyncSession, code: DataStdCodeModel, code_item_list: list[DataStdCodeModel]): """ diff --git a/vue-fastapi-frontend/src/views/datastd/stdcode/codeItem.vue b/vue-fastapi-frontend/src/views/datastd/stdcode/codeItem.vue index 0799e33..c9c410d 100644 --- a/vue-fastapi-frontend/src/views/datastd/stdcode/codeItem.vue +++ b/vue-fastapi-frontend/src/views/datastd/stdcode/codeItem.vue @@ -387,9 +387,31 @@ const handleSave = async () => { } }; +const selectedRows = ref([]); // 保存当前勾选的行 + const handleSelectionChange = (selection) => { - multiple.value = selection.length > 0; + selectedRows.value = selection; + multiple.value = selection.length === 0; }; +const handleRemove = () => { + if (selectedRows.value.length === 0) { + proxy.$modal.msgWarning("请先选择要删除的行"); + return; + } + + // 标记为已删除(可用于回传给后端处理) + selectedRows.value.forEach(row => { + row._deleted = true; + }); + + // 从展示数据中过滤已删除的 + tableData.value = tableData.value.filter(row => !row._deleted); + + // 清空选择 + selectedRows.value = []; + multiple.value = true; +}; + @@ -412,11 +434,7 @@ const handleAdd = () => { tableData.value.push(newRow); }; -// 删除选中行 -const handleRemove = () => { - const selectedRows = tableData.value.filter(row => row.isSelected); - tableData.value = tableData.value.filter(row => !row.isSelected); -}; + defineExpose({ handleSave });