Browse Source

数据标准审批

master
si@aidatagov.com 2 weeks ago
parent
commit
7f313292fb
  1. 61
      vue-fastapi-backend/module_admin/controller/datastd_controller.py
  2. 81
      vue-fastapi-backend/module_admin/dao/datastd_dao.py
  3. 39
      vue-fastapi-backend/module_admin/entity/do/datastd_do.py
  4. 7
      vue-fastapi-backend/module_admin/entity/vo/datastd_vo.py
  5. 37
      vue-fastapi-backend/module_admin/service/approval_service.py
  6. 120
      vue-fastapi-backend/module_admin/service/datastd_service.py
  7. 22
      vue-fastapi-frontend/src/api/datastd/std.js
  8. 2
      vue-fastapi-frontend/src/views/datastd/main/index.vue
  9. 2
      vue-fastapi-frontend/src/views/system/flow/conf.vue
  10. 302
      vue-fastapi-frontend/src/views/system/flow/dataStdMainAppr.vue
  11. 15
      vue-fastapi-frontend/src/views/system/flow/index.vue

61
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(

81
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)

39
vue-fastapi-backend/module_admin/entity/do/datastd_do.py

@ -115,3 +115,42 @@ class DataStdMain(Base):
content_onum = Column(Integer, default=None, comment='分类')
std_src = Column(String(20), default=None, comment='标准来源')
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已取消)')

7
vue-fastapi-backend/module_admin/entity/vo/datastd_vo.py

@ -124,3 +124,10 @@ class DataStdMainPageQueryModel(DataStdMainModel):
"""
page_num: int = Field(default=1, description='当前页码')
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已取消)')

37
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,6 +126,38 @@ 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,

120
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:

22
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'
})
}

2
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(() => {});
};

2
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([])

302
vue-fastapi-frontend/src/views/system/flow/dataStdMainAppr.vue

@ -0,0 +1,302 @@
<template>
<el-table
v-loading="loading"
:data="tableData"
border
style="width: 100%"
>
<el-table-column prop="stdNum" label="标准编号" align="center" />
<el-table-column prop="stdCode" label="英文名" align="center" />
<el-table-column prop="stdName" label="中文名" align="center" />
<el-table-column label="类型" prop="stdType" width="150">
<template #default="scope">
<el-tag v-if="scope.row.stdType == '0'" type="primary">基础数据</el-tag>
<el-tag v-else type="warning">指标数据</el-tag>
</template>
</el-table-column>
<el-table-column prop="securityLevel" label="安全等级" align="center" />
<el-table-column prop="sourceSystem" label="来源系统" align="center" />
<el-table-column prop="codeNum" label="代码编号" align="center" />
<el-table-column label="变更类型" align="center">
<template #default="{ row }">
{{ changeTypeMap[row.changeType] || row.changeType }}
</template>
</el-table-column>
<el-table-column label="审批状态" align="center">
<template #default="{ row }">
{{ approStatusMap[row.approStatus] || row.approStatus }}
</template>
</el-table-column>
<el-table-column label="操作" width="100" align="center">
<template #default="scope">
<el-button @click="handleView(scope.row.id)" size="small" type="primary">查看详情</el-button>
</template>
</el-table-column>
</el-table>
<!-- 弹窗 -->
<el-dialog v-model="formVisible" title="标准详情" width="70%" @close="formData = {}">
<el-form :model="formData" label-position="left" ref="formRef" label-width="120px" class="custom-form-container">
<!-- 第一行3 -->
<el-row gutter="20">
<el-col :span="6">
<el-form-item prop="stdNum">
<template #label>
<span :class="{ 'changed-label': isChanged(formData.stdNum) }">标准编号</span>
</template>
<span :class="{ 'changed-value': isChanged(formData.stdNum) }">{{ formatValue(formData.stdNum) }}</span>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item prop="stdName">
<template #label>
<span :class="{ 'changed-label': isChanged(formData.stdName) }">标准中文名</span>
</template>
<span :class="{ 'changed-value': isChanged(formData.stdName) }">{{ formatValue(formData.stdName) }}</span>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item prop="stdCode">
<template #label>
<span :class="{ 'changed-label': isChanged(formData.stdCode) }">标准英文名</span>
</template>
<span :class="{ 'changed-value': isChanged(formData.stdCode) }">{{ formatValue(formData.stdCode) }}</span>
</el-form-item>
</el-col>
</el-row>
<!-- 第二行3 -->
<el-row gutter="20">
<el-col :span="6">
<el-form-item prop="stdMenu">
<template #label>
<span :class="{ 'changed-label': isChanged(formData.stdMenu) }">标准业务定义</span>
</template>
<span :class="{ 'changed-value': isChanged(formData.stdMenu) }">{{ formatValue(formData.stdMenu) }}</span>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item prop="stdType">
<template #label>
<span :class="{ 'changed-label': isChanged(formData.stdType) }">标准类型</span>
</template>
<span :class="{ 'changed-value': isChanged(formData.stdType) }">{{ formatValue(stdTypeMap[formData.stdType] || formData.stdType) }}</span>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item prop="stdSrc">
<template #label>
<span :class="{ 'changed-label': isChanged(formData.stdSrc) }">标准来源</span>
</template>
<span :class="{ 'changed-value': isChanged(formData.stdSrc) }">{{ formatValue(formData.stdSrc) }}</span>
</el-form-item>
</el-col>
</el-row>
<!-- 第三行4 -->
<el-row gutter="20">
<el-col :span="6">
<el-form-item prop="dataClas">
<template #label>
<span :class="{ 'changed-label': isChanged(formData.dataClas) }">数据类别</span>
</template>
<span :class="{ 'changed-value': isChanged(formData.dataClas) }">{{ formatValue(dataClasMap[formData.dataClas] || formData.dataClas) }}</span>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item prop="sourceSystem">
<template #label>
<span :class="{ 'changed-label': isChanged(formData.sourceSystem) }">来源系统</span>
</template>
<span :class="{ 'changed-value': isChanged(formData.sourceSystem) }">{{ formatValue(formData.sourceSystem) }}</span>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item prop="securityLevel">
<template #label>
<span :class="{ 'changed-label': isChanged(formData.securityLevel) }">安全等级</span>
</template>
<span :class="{ 'changed-value': isChanged(formData.securityLevel) }">{{ formatValue(formData.securityLevel) }}</span>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item prop="codeNum">
<template #label>
<span :class="{ 'changed-label': isChanged(formData.codeNum) }">代码编号</span>
</template>
<span :class="{ 'changed-value': isChanged(formData.codeNum) }">{{ formatValue(formData.codeNum) }}</span>
</el-form-item>
</el-col>
</el-row>
<!-- 第四行2 -->
<el-row gutter="20">
<el-col :span="12">
<el-form-item prop="bussDeptId">
<template #label>
<span :class="{ 'changed-label': isChanged(formData.bussDeptId) }">业务认责部门</span>
</template>
<span :class="{ 'changed-value': isChanged(formData.bussDeptId) }">{{ formatValue(formData.bussDeptId) }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="bussUser">
<template #label>
<span :class="{ 'changed-label': isChanged(formData.bussUser) }">业务认责人员</span>
</template>
<span :class="{ 'changed-value': isChanged(formData.bussUser) }">{{ formatValue(formData.bussUser) }}</span>
</el-form-item>
</el-col>
</el-row>
<!-- 第五行2 -->
<el-row gutter="20">
<el-col :span="12">
<el-form-item prop="techDeptId">
<template #label>
<span :class="{ 'changed-label': isChanged(formData.techDeptId) }">技术认责部门</span>
</template>
<span :class="{ 'changed-value': isChanged(formData.techDeptId) }">{{ formatValue(formData.techDeptId) }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item prop="techUser">
<template #label>
<span :class="{ 'changed-label': isChanged(formData.techUser) }">技术认责人员</span>
</template>
<span :class="{ 'changed-value': isChanged(formData.techUser) }">{{ formatValue(formData.techUser) }}</span>
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<el-button @click="formVisible = false">关闭</el-button>
</template>
</el-dialog>
</template>
<script setup>
import { ref, watch } from 'vue';
import { listStdMainAppr, getStdMainAppr } from '@/api/datastd/std';
const props = defineProps({
flowId: {
type: String,
required: true
}
});
const isChanged = (val) => typeof val === 'string' && val.includes('==>')
const formatValue = (val) => {
if (!val) return ''
if (isChanged(val)) {
const [oldVal, newVal] = val.split('==>')
return `${oldVal.trim()} ==> ${newVal.trim()}`
}
return val
}
const loading = ref(false);
const tableData = ref([]);
const changeTypeMap = {
add: '新增',
edit: '修改',
delete: '删除'
};
const approStatusMap = {
waiting: '待审核',
pending: '审核中',
succeed: '通过',
rejected: '拒绝',
canceled: '已取消'
};
const stdTypeMap = {
0: '基础数据',
1: '指标数据'
};
const dataClasMap = {
'日期类': '日期类',
'文本类': '文本类',
'数值类': '数值类',
'金额类': '金额类',
'编码类': '编码类',
'标志类': '标志类',
'码值类': '码值类'
};
const formVisible = ref(false);
const formData = ref({});
const getList = async () => {
loading.value = true;
try {
const params = { flowId: props.flowId };
const res = await listStdMainAppr(params);
tableData.value = res.data || [];
} catch (e) {
console.error('加载失败', e);
} finally {
loading.value = false;
}
};
watch(() => props.flowId, (newVal) => {
if (newVal) {
getList();
}
});
onMounted(() => {
if (props.flowId) {
getList();
}
});
const handleView = async (id) => {
try {
const res = await getStdMainAppr(id);
const data = res.data || {};
data.stdType = stdTypeMap[data.stdType] || data.stdType;
data.dataClas = dataClasMap[data.dataClas] || data.dataClas;
formData.value = data;
formVisible.value = true;
} catch (e) {
console.error('获取详情失败', e);
}
};
</script>
<style scoped>
.custom-form-container .el-form-item {
margin-bottom: 15px; /* 增加表单项间距 */
margin-left: 20px;
}
.changed-label,
.changed-value {
color: rgb(137, 189, 58) !important;;
font-weight: bold;
}
.custom-form-container .el-form-item .el-input,
.custom-form-container .el-form-item .el-select {
width: 100%; /* 输入框和选择框宽度填满 */
}
.custom-form-container .el-form-item span {
font-size: 14px; /* 字体大小 */
color: #333; /* 字体颜色 */
}
.custom-form-item label {
font-weight: bold; /* 加粗标签 */
margin-right: 10px; /* 为标签添加右侧间距 */
}
.el-dialog__footer {
text-align: center;
}
.dialog-footer-btn {
width: 100px; /* 按钮宽度 */
font-size: 14px;
}
</style>

15
vue-fastapi-frontend/src/views/system/flow/index.vue

@ -516,6 +516,10 @@
<el-table-column label="引用字典/标准" align="center"></el-table-column>
</el-table>
</div>
</el-dialog>
<!-- 弹窗 -->
<el-dialog v-model="stdMainVisible" title="数据标准变更详情" width="80%">
<DataStdMainTable :flowId="selectedFlowId" />
</el-dialog>
</div>
</template>
@ -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;
}
}

Loading…
Cancel
Save