diff --git a/vue-fastapi-backend/module_admin/controller/datastd_controller.py b/vue-fastapi-backend/module_admin/controller/datastd_controller.py
index 921dc33..63b0e07 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
@@ -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/codeappr/{ids}', 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,9 +169,41 @@ 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'))]
+)
+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 +224,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 +242,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 +257,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 +267,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)
@@ -527,7 +633,7 @@ async def change_std_main_onum(
# 标准代码映射图谱
@datastdController.get(
- '/stdcode/code/mapstdlist/{id}', response_model=PageResponseModel, dependencies=[Depends(CheckUserInterfaceAuth('datastd:stdcode:code:list'))]
+ '/stdcode/code/mapstdlistOld/{id}', response_model=PageResponseModel, dependencies=[Depends(CheckUserInterfaceAuth('datastd:stdcode:code:list'))]
)
async def get_code_std_map_list(
request: Request,
@@ -536,4 +642,17 @@ async def get_code_std_map_list(
):
code_page_query_result = await DataStdService.get_code_std_map_list_services(query_db, id)
logger.info('获取列配置列表成功')
+ return ResponseUtil.success(data=code_page_query_result)
+
+
+@datastdController.get(
+ '/stdcode/code/mapstdlist/{id}', response_model=PageResponseModel, dependencies=[Depends(CheckUserInterfaceAuth('datastd:stdcode:code:list'))]
+)
+async def get_code_map_list(
+ request: Request,
+ id: str,
+ query_db: AsyncSession = Depends(get_db),
+):
+ code_page_query_result = await DataStdService.get_code_map_list(query_db, id)
+ logger.info('获取列配置列表成功')
return ResponseUtil.success(data=code_page_query_result)
\ No newline at end of file
diff --git a/vue-fastapi-backend/module_admin/dao/approval_dao.py b/vue-fastapi-backend/module_admin/dao/approval_dao.py
index 615f5ff..2bb088d 100644
--- a/vue-fastapi-backend/module_admin/dao/approval_dao.py
+++ b/vue-fastapi-backend/module_admin/dao/approval_dao.py
@@ -45,7 +45,7 @@ class ApprovalDao:
(FlowApproval.businessType == query_param.businessType) if query_param.businessType else True,
or_(*[FlowApproval.nextStepRole.like(f'%{role}%') for role in roleList],
FlowApproval.nextStepUser.like(f'%{current_user.user.user_name}%')),
- ).order_by(FlowApproval.applyTime)
+ ).order_by(FlowApproval.applyTime.desc())
.distinct())
# 注意:这里不执行查询,而是将查询对象传递给 paginate 方法
result = await PageUtil.paginate(db, query, query_param.page_num, query_param.page_size, True)
@@ -61,7 +61,7 @@ class ApprovalDao:
(FlowApproval.businessType == query_param.businessType) if query_param.businessType else True,
FlowApproval.approvalFlow.like(f'%{current_user.user.user_name}%')
)
- .order_by(FlowApproval.applyTime)
+ .order_by(FlowApproval.applyTime.desc())
.distinct()
)
# 注意:这里不执行查询,而是将查询对象传递给 paginate 方法
@@ -77,7 +77,7 @@ class ApprovalDao:
FlowApproval.applicant == current_user.user.user_name,
(FlowApproval.businessType == query_param.businessType) if query_param.businessType else True,
)
- .order_by(FlowApproval.applyTime)
+ .order_by(FlowApproval.applyTime.desc())
.distinct()
)
# 注意:这里不执行查询,而是将查询对象传递给 paginate 方法
diff --git a/vue-fastapi-backend/module_admin/dao/datastd_dao.py b/vue-fastapi-backend/module_admin/dao/datastd_dao.py
index 8a26852..34d3882 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,DataStdCodeAppr
+from module_admin.entity.vo.datastd_vo import DataStdCodeModel,DataStdDictModel,DataStdMainModel,DataStdMainApprModel,DataStdDictApprModel,DataStdCodeApprModel
from module_admin.entity.do.dept_do import SysDept
from utils.page_util import PageUtil
from sqlalchemy.orm import aliased
@@ -57,6 +57,18 @@ class DataStdDao:
)
return col_list
@classmethod
+ async def get_last_std_code_appr_by_id(cls,db: AsyncSession, Id: str ):
+ result = await db.execute(
+ select(DataStdCodeAppr)
+ .where(
+ DataStdCodeAppr.oldInstId == Id,
+ DataStdCodeAppr.approStatus == "succeed"
+ )
+ .order_by(DataStdCodeAppr.update_time.desc())
+ .limit(1)
+ )
+ return result.scalar_one_or_none()
+ @classmethod
async def get_std_code_map_list(cls, db: AsyncSession, query_object: DataStdCodeModel, is_page: bool = False):
# 构建查询条件
filters = []
@@ -106,9 +118,11 @@ class DataStdDao:
select(DataStdCode)
.where(
DataStdCode.code_name == query_object.code_name if query_object.code_name else True,
+ DataStdCode.id == query_object.id if query_object.id else True,
DataStdCode.code_status == query_object.code_status if query_object.code_status else True,
DataStdCode.sys_id == query_object.sys_id if query_object.sys_id else True,
DataStdCode.code_type == query_object.code_type if query_object.code_type else True,
+ DataStdCode.code_map_id == query_object.code_map_id if query_object.code_map_id else True,
DataStdCode.parent_id == query_object.parent_id if query_object.parent_id else True,
DataStdCode.class_id == query_object.class_id if query_object.class_id else True
)
@@ -152,10 +166,23 @@ class DataStdDao:
await db.flush()
return col
+ @classmethod
+ async def add_std_code_appr(cls, db: AsyncSession,model:DataStdCodeApprModel):
+ col = DataStdCodeAppr(
+ **model.model_dump()
+ )
+ db.add(col)
+ await db.flush()
+ return col
+
@classmethod
async def delete_std_code(cls, db: AsyncSession, Id: str):
await db.execute(delete(DataStdCode).where(DataStdCode.id == Id))
-
+ @classmethod
+ async def update_std_code_appr(cls, db: AsyncSession, update_data: DataStdCodeApprModel):
+
+ await db.execute(update(DataStdCodeAppr), [update_data])
+ await db.flush()
@classmethod
async def update_std_code(cls, db: AsyncSession, update_data: DataStdCodeModel):
@@ -712,14 +739,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):
@@ -766,12 +807,28 @@ 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_code_appr_list(cls, flowId:str,db: AsyncSession):
+ filters = []
+ filters.append(DataStdCodeAppr.flowId == flowId)
+ query = select(DataStdCodeAppr).where(*filters).order_by(desc(DataStdCodeAppr.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)
@@ -783,6 +840,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):
@@ -807,4 +876,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..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):
"""
@@ -55,6 +81,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 +207,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..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):
@@ -87,6 +92,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 +138,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..8804b15 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,DataStdCodeApprModel
class ApprovalService:
@@ -94,6 +94,12 @@ 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)
+ # 标准代码审批
+ elif flow_approval.businessType == 'dataStdCode':
+ await cls.syncStdCodeInfo(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 +164,72 @@ 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 syncStdCodeInfo(cls, result_db: AsyncSession, suppId: str, operateType: str):
+ apprList = await DataStdDao.get_std_code_appr_list(suppId, result_db)
+
+ for appr in apprList:
+ # 将 SQLAlchemy 模型实例转换为 Pydantic 模型实例
+ appr_model = DataStdCodeApprModel.model_validate(appr)
+
+ change_type = appr_model.changeType
+ if operateType =='succeed':
+ if change_type == "add":
+ main_model = DataStdCodeModel(**appr_model.model_dump(exclude_unset=True, by_alias=True))
+
+ await DataStdDao.add_std_code(result_db, main_model)
+
+ elif change_type == "update":
+ # 使用 oldInstId 作为主键
+ main_model = DataStdCodeModel(**appr_model.model_dump(exclude_unset=True, by_alias=True))
+
+ main_model.id = appr_model.oldInstId
+ await DataStdDao.update_std_code(result_db, main_model.model_dump(exclude_unset=True))
+
+ elif change_type == "delete":
+ await DataStdDao.delete_std_code(result_db, appr_model.oldInstId)
+
+ # 更新 approStatus 状态
+ appr_model.approStatus = operateType
+ main_appro_model = DataStdCodeApprModel(**appr_model.model_dump(exclude_unset=True, by_alias=True))
+
+ await DataStdDao.update_std_code_appr(result_db, main_appro_model.model_dump(exclude_unset=True))
+
+ 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 eff8b07..6283137 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,DataStdCodeApprModel,DataStdCodePageQueryModel
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:
"""
@@ -84,7 +85,7 @@ class DataStdService:
except Exception as e:
await query_db.rollback()
raise e
-
+
@classmethod
async def code_detail_services(cls, query_db: AsyncSession, col: str):
@@ -125,7 +126,55 @@ class DataStdService:
else:
raise ServiceException(message=f'标准代码{page_object.id}不存在')
-
+ @classmethod
+ async def delete_std_code_with_items_appr(
+ cls,
+ ids: str,
+ query_db: AsyncSession,
+ current_user: CurrentUserModel
+ ):
+ """
+ 批量删除标准代码及其代码项的审批流程。
+ :param ids: 多个标准代码ID,用逗号分隔
+ """
+ try:
+ id_list = [i.strip() for i in ids.split(',') if i.strip()]
+ if not id_list:
+ raise ServiceException(message="请提供有效的标准代码ID列表")
+
+ for std_id in id_list:
+ std_code = await DataStdDao.get_std_code_by_id(query_db, std_id)
+ if not std_code:
+ raise ServiceException(message=f"ID 为 {std_id} 的标准代码不存在,无法提交删除审批")
+
+
+ flow_id = str(uuid.uuid4())
+ last_appr= await DataStdDao.get_last_std_code_appr_by_id(query_db,std_id)
+
+ # 标准代码审批记录
+ std_code_appr = DataStdCodeApprModel(**std_code.model_dump(exclude_unset=True, by_alias=True))
+ std_code_appr.changeType = "delete"
+ std_code_appr.compareId = last_appr.id
+ std_code_appr.oldInstId = std_code.id
+ std_code_appr.approStatus = "waiting"
+ std_code_appr.code_status = "9"
+ std_code_appr.flowId = flow_id
+ std_code_appr.update_by = current_user.user.user_name
+ std_code_appr.update_time = datetime.now()
+ await DataStdDao.add_std_code_appr(query_db, std_code_appr)
+ # 发起审批流程(每个标准代码一条审批)
+ apply_model = ApplyModel()
+ apply_model.businessType = "dataStdCode"
+ apply_model.businessId = flow_id
+ apply_model.applicant = current_user.user.user_name
+ await ApprovalService.apply_services(query_db, apply_model, 'dataStdCode')
+
+ return CrudResponseModel(is_success=True, message="批量提交删除标准代码审批成功!")
+
+ except Exception as e:
+ await query_db.rollback()
+ raise ServiceException(message=f"提交删除标准代码审批失败: {str(e)}")
+
@classmethod
async def delete_std_code_services(cls, request: Request, query_db: AsyncSession, page_object: DeleteDataStdModel):
"""
@@ -146,12 +195,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]):
@@ -191,6 +240,69 @@ class DataStdService:
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 not await cls.check_code_unique_services(query_db, code):
+ 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.code_status="9"
+ appr_model.approStatus = "waiting"
+ appr_model.flowId = str(uuid.uuid4()) # 新生成 Flow ID
+
+ # 将标准代码添加到审批表
+ await DataStdDao.add_std_code_appr(query_db, appr_model)
+ # 同时处理代码项的添加
+ 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 not await cls.check_code_unique_services(query_db, item):
+ 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 = 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')
+
+ 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]):
"""
修改标准代码和对应的代码项。如果code_item.id为0,则执行新增操作,否则执行更新操作。
@@ -232,7 +344,116 @@ class DataStdService:
return CrudResponseModel(is_success=True, message='标准代码和代码项修改成功')
except Exception as e:
await query_db.rollback()
- raise ServiceException(message=f"修改标准代码失败: {str(e)}")
+ raise ServiceException(message=f"修改标准代码失败: {str(e)}")
+
+
+ @classmethod
+ async def edit_std_code_with_items_appr(
+ cls,
+ code: DataStdCodeModel,
+ code_item_list: list[DataStdCodeModel],
+ query_db: AsyncSession,
+ current_user: CurrentUserModel
+ ):
+ """
+ 修改标准代码及其代码项的审批流程(修改审批)。
+ code_item.id 存在为修改,若为空则为新增。
+ """
+ # 更新时间及人
+ 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 not await cls.check_code_unique_services(query_db, code):
+ raise ServiceException(message=f'标准代码{code.code_num}不存在或已存在,无法提交修改审批')
+
+ # 创建标准代码的审批记录(changeType 为 update)
+ appr_model = DataStdCodeApprModel(**code.model_dump(exclude_unset=True, by_alias=True))
+ last_appr= await DataStdDao.get_last_std_code_appr_by_id(query_db,code.id)
+ appr_model.changeType = "update"
+ appr_model.compareId = last_appr.id # 对比对象为正式表的 ID
+ appr_model.oldInstId = code.id
+ appr_model.code_status = "9"
+ appr_model.approStatus = "waiting"
+ appr_model.flowId = str(uuid.uuid4()) # flowId 共用
+ appr_model.id = str(uuid.uuid4()) # flowId 共用
+
+ await DataStdDao.add_std_code_appr(query_db, appr_model)
+
+ # query_object.
+ query_object = DataStdCodePageQueryModel(
+ )
+ query_object.parent_id=code.id
+ query_object.class_id="codeItem"
+ query_object.page_size=100
+ query_object.page_num=1
+ code_item_list_old = await DataStdDao.get_std_code_list(query_db, query_object, False)
+ new_ids = {item.id for item in code_item_list if item.id}
+
+ # 同步处理代码项
+ for item in code_item_list:
+ item.parent_id = code.id
+ 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
+
+ if item.id: # 修改项
+ if not await cls.check_code_unique_services(query_db, item):
+ raise ServiceException(message=f'父级代码{code.code_num}下代码项{item.code_num}重复,无法提交修改审批')
+
+ item_appr_model = DataStdCodeApprModel(**item.model_dump(exclude_unset=True, by_alias=True))
+ last_item_appr= await DataStdDao.get_last_std_code_appr_by_id(query_db,item_appr_model.id)
+ item_appr_model.changeType = "update"
+ item_appr_model.compareId = last_item_appr.id
+ item_appr_model.oldInstId = item.id
+ item_appr_model.approStatus = "waiting"
+ item_appr_model.flowId = appr_model.flowId
+ item_appr_model.id = str(uuid.uuid4()) # flowId 共用
+
+ await DataStdDao.add_std_code_appr(query_db, item_appr_model)
+
+ else: # 新增项
+ item.id = str(uuid.uuid4())
+ item.create_by = current_user.user.user_name
+ item.create_time = datetime.now()
+
+ if not await cls.check_code_unique_services(query_db, item):
+ raise ServiceException(message=f'父级代码{code.code_num}下代码项{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
+
+ await DataStdDao.add_std_code_appr(query_db, item_appr_model)
+ for old_item in code_item_list_old:
+ if old_item["id"] not in new_ids:
+ # 创建“删除”审批记录
+ delete_appr_model = DataStdCodeApprModel(**old_item)
+ delete_appr_model.changeType = "delete"
+ last_appr= await DataStdDao.get_last_std_code_appr_by_id(query_db,old_item["id"])
+ delete_appr_model.compareId = last_appr.id
+ delete_appr_model.oldInstId = old_item["id"]
+ delete_appr_model.approStatus = "waiting"
+ delete_appr_model.flowId = appr_model.flowId
+ delete_appr_model.id = str(uuid.uuid4())
+
+ delete_appr_model.update_by = current_user.user.user_name
+ delete_appr_model.update_time = datetime.now()
+
+ await DataStdDao.add_std_code_appr(query_db, delete_appr_model)
+ # 创建审批流程
+ apply_model = ApplyModel()
+ apply_model.businessType = "dataStdCode"
+ apply_model.businessId = appr_model.flowId
+ apply_model.applicant = appr_model.update_by
+ await ApprovalService.apply_services(query_db, apply_model, 'dataStdCode')
+
+ return CrudResponseModel(is_success=True, message='提交修改标准代码审批成功!')
+
@classmethod
async def check_code_unique_services(cls, query_db: AsyncSession, page_object: DataStdCodeModel):
"""
@@ -772,6 +993,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 +1044,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 +1110,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 +1157,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
@@ -1028,3 +1352,46 @@ class DataStdService:
"tableData": table_data,
"children": children
}
+ @classmethod
+ async def get_code_map_list(cls, query_db: AsyncSession, id: str):
+ check_model = DataStdCodeModel()
+ stdCode=await DataStdDao.get_std_code_by_id(query_db, id)
+ code_type="公司级"
+ if stdCode.code_type=='sys':
+ if stdCode.code_map_id:
+ check_model.id=stdCode.code_map_id
+ else:
+ check_model.id="no"
+ else:
+ check_model.code_map_id = id
+ code_type="系统级"
+
+ main_list = await DataStdDao.get_data_code_list_by_info(query_db, check_model)
+
+ if not main_list:
+ return { "children": []} # 如果 A 表没有数据,返回空结构
+
+ table_data = [] # 存储表格数据
+ children = [] # 存储图谱数据
+
+ for main in main_list:
+ # 组织图谱数据(A 表作为父节点)
+ node = {
+ "id": f"node_{main.id}", # 使用 get() 方法访问字段
+ "name": main.code_name, # 使用 get() 方法访问字段
+ "label": main.code_num, # 使用 get() 方法访问字段
+ "rate": 1.0,
+ "status": "B",
+ # "currency": main.get('stdNum'), # 使用 get() 方法访问字段
+ "variableValue": code_type,
+ "variableUp": True,
+ "children": [],
+ }
+
+
+ children.append(node)
+
+ return {
+ "tableData": table_data,
+ "children": children
+ }
\ No newline at end of file
diff --git a/vue-fastapi-frontend/src/api/datastd/std.js b/vue-fastapi-frontend/src/api/datastd/std.js
index 28c2e2d..40d0d0d 100644
--- a/vue-fastapi-frontend/src/api/datastd/std.js
+++ b/vue-fastapi-frontend/src/api/datastd/std.js
@@ -58,7 +58,7 @@ export function getStdCodeMap(rowId) {
// 新增标准代码
export function addStdCode(data) {
return request({
- url: '/default-api/datastd/stdcode/codeWithItems',
+ url: '/default-api/datastd/stdcode/codeWithItems/appr',
method: 'post',
data: data
})
@@ -76,7 +76,7 @@ export function addStdCodeItem(data) {
// 修改标准代码
export function updateStdCode(data) {
return request({
- url: '/default-api/datastd/stdcode/codeWithItems',
+ url: '/default-api/datastd/stdcode/codeWithItems/appr',
method: 'put',
data: data
})
@@ -94,7 +94,7 @@ export function updateStdCodeItem(data) {
// 删除标准代码
export function deleteStdCode(colId) {
return request({
- url: '/default-api/datastd/stdcode/code/' + colId,
+ url: '/default-api/datastd/stdcodeappr/code/' + colId,
method: 'delete'
})
}
@@ -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/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
});
diff --git a/vue-fastapi-frontend/src/views/datastd/stdcode/codeMap.vue b/vue-fastapi-frontend/src/views/datastd/stdcode/codeMap.vue
index 1ff392c..9a56acc 100644
--- a/vue-fastapi-frontend/src/views/datastd/stdcode/codeMap.vue
+++ b/vue-fastapi-frontend/src/views/datastd/stdcode/codeMap.vue
@@ -1,5 +1,11 @@
+
-
+
+
+
+
+
+
@@ -20,24 +26,7 @@
-
-
+
@@ -116,12 +105,13 @@
-
+
+
-
diff --git a/vue-fastapi-frontend/src/views/datastd/stdcode/index.vue b/vue-fastapi-frontend/src/views/datastd/stdcode/index.vue
index 9efe84a..7e25836 100644
--- a/vue-fastapi-frontend/src/views/datastd/stdcode/index.vue
+++ b/vue-fastapi-frontend/src/views/datastd/stdcode/index.vue
@@ -105,7 +105,7 @@
/>
-
+
diff --git a/vue-fastapi-frontend/src/views/system/flow/conf.vue b/vue-fastapi-frontend/src/views/system/flow/conf.vue
index 38ab0e6..e6d296e 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':'dataStdCode','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 @@
+
+
+
+
+
+
+ {{
+ row.dictLevel === 'company'
+ ? '公司级'
+ : '系统级(' + row.sysName + ')'
+ }}
+
+
+
+
+
+ {{ row.dictType == 0 ? '基础数据' : '指标数据' }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ transIdtoCode(row.stdCode) }}
+
+
+
+
+
+ {{ changeTypeMap[row.changeType] || row.changeType }}
+
+
+
+
+
+ {{ approStatusMap[row.approStatus] || row.approStatus }}
+
+
+
+
+
+
+
+ 查看
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 字典归属:
+
+
+
+ {{ formatValue(formData.dictLevel === 'company' ? '公司级' : '系统级(' + formData.sysName + ')') }}
+
+
+
+
+
+
+
+ 来源系统:
+
+
+
+ {{ formatValue(formData.sysName) }}
+
+
+
+
+
+
+
+ 数据字典类型:
+
+
+
+ {{ formatValue(formData.dictType == 0 ? '基础数据' : '指标数据') }}
+
+
+
+
+
+
+
+
+
+
+
+ 数据字典编号:
+
+
+
+ {{ formatValue(formData.dictNum) }}
+
+
+
+
+
+
+
+ 字典英文名:
+
+
+
+ {{ formatValue(formData.dictCode) }}
+
+
+
+
+
+
+
+ 字典中文名:
+
+
+
+ {{ formatValue(formData.dictName) }}
+
+
+
+
+
+
+
+
+
+
+
+ 字典业务定义:
+
+
+
+ {{ formatValue(formData.dictMenu) }}
+
+
+
+
+
+
+
+ 数据类型:
+
+
+
+ {{ formatValue(formData.dataType) }}
+
+
+
+
+
+
+
+ 数据标准:
+
+
+
+ {{ formatValue(transIdtoCode(formData.stdCode)) }}
+
+
+
+
+
+
+
+
+
+
+
+
+ 业务认责部门:
+
+
+
+ {{ formatValue(formData.bussDeptName) }}
+
+
+
+
+
+
+
+ 业务认责人员:
+
+
+
+ {{ formatValue(formData.bussUser) }}
+
+
+
+
+
+
+
+
+
+
+
+ 技术认责部门:
+
+
+
+ {{ formatValue(formData.techDeptName) }}
+
+
+
+
+
+
+
+ 技术认责人员:
+
+
+
+ {{ formatValue(formData.techUser) }}
+
+
+
+
+
+
+
+ 关闭
+
+
+
+
+
+
+
\ 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){