29 changed files with 2275 additions and 36 deletions
@ -0,0 +1,57 @@ |
|||
import json |
|||
import os |
|||
import shutil |
|||
from fastapi import APIRouter, Depends, Request, UploadFile, File, Form |
|||
from sqlalchemy.ext.asyncio import AsyncSession |
|||
from config.get_db import get_db |
|||
from module_admin.entity.vo.user_vo import CurrentUserModel |
|||
from module_admin.entity.vo.approval_vo import ApplyModel, OperateModel, ApprovalQueryObject |
|||
from module_admin.service.login_service import LoginService |
|||
from module_admin.service.approval_service import ApprovalService |
|||
from utils.log_util import logger |
|||
from utils.response_util import ResponseUtil |
|||
|
|||
approvalController = APIRouter(prefix='/approval', dependencies=[Depends(LoginService.get_current_user)]) |
|||
|
|||
|
|||
@approvalController.post("/apply") |
|||
async def flow_apply(request: Request, |
|||
apply: ApplyModel, |
|||
query_db: AsyncSession = Depends(get_db)): |
|||
apply_result = await ApprovalService.apply_services(query_db, apply) |
|||
return ResponseUtil.success(msg=apply_result.message) |
|||
|
|||
|
|||
@approvalController.post("/operate") |
|||
async def flow_operate(request: Request, |
|||
operate: OperateModel, |
|||
query_db: AsyncSession = Depends(get_db), |
|||
current_user: CurrentUserModel = Depends(LoginService.get_current_user)): |
|||
operate_result = await ApprovalService.operate_services(query_db, operate, current_user) |
|||
return ResponseUtil.success(msg=operate_result.message) |
|||
|
|||
|
|||
@approvalController.get("/list") |
|||
async def flow_list(request: Request, |
|||
query_param: ApprovalQueryObject = Depends(ApprovalQueryObject.as_query), |
|||
query_db: AsyncSession = Depends(get_db), |
|||
current_user: CurrentUserModel = Depends(LoginService.get_current_user)): |
|||
meta_query_result = await ApprovalService.get_flow_list_services(query_db, query_param, current_user) |
|||
return ResponseUtil.success(data=meta_query_result) |
|||
|
|||
|
|||
@approvalController.get("/waitingTotal") |
|||
async def getWaitingTotal(request: Request, |
|||
query_db: AsyncSession = Depends(get_db), |
|||
current_user: CurrentUserModel = Depends(LoginService.get_current_user)): |
|||
meta_query_result = await ApprovalService.get_waiting_total_services(query_db, current_user) |
|||
return ResponseUtil.success(data=meta_query_result) |
|||
|
|||
|
|||
@approvalController.post("/cancelApply/{flow_id}") |
|||
async def cancel_apply(request: Request, |
|||
flow_id: str, |
|||
query_db: AsyncSession = Depends(get_db), |
|||
current_user: CurrentUserModel = Depends(LoginService.get_current_user)): |
|||
operate_result = await ApprovalService.cancel_apply_services(query_db, flow_id, current_user) |
|||
return ResponseUtil.success(msg=operate_result.message) |
@ -0,0 +1,41 @@ |
|||
from fastapi import APIRouter, Depends, Request |
|||
from sqlalchemy.ext.asyncio import AsyncSession |
|||
from config.get_db import get_db |
|||
from module_admin.entity.vo.user_vo import CurrentUserModel |
|||
from module_admin.service.login_service import LoginService |
|||
from utils.response_util import ResponseUtil |
|||
|
|||
from module_admin.service.meta_service import MetaService |
|||
from module_admin.entity.vo.meta_vo import MetaPageObject, MetaColObject, SuppleModel |
|||
|
|||
metaController = APIRouter(prefix='/dasset', dependencies=[Depends(LoginService.get_current_user)]) |
|||
|
|||
|
|||
@metaController.get("/meta/get") |
|||
async def get_meta_list(request: Request, meta_query: MetaPageObject = Depends(MetaPageObject.as_query), |
|||
query_db: AsyncSession = Depends(get_db), |
|||
current_user: CurrentUserModel = Depends(LoginService.get_current_user)): |
|||
meta_query_result = await MetaService.get_meta_list_services(query_db, meta_query, current_user) |
|||
return ResponseUtil.success(data=meta_query_result) |
|||
|
|||
|
|||
@metaController.get("/meta/column/list") |
|||
async def get_meta_list(request: Request, meta_query: MetaColObject = Depends(MetaColObject.as_query), |
|||
query_db: AsyncSession = Depends(get_db)): |
|||
meta_query_result = await MetaService.get_meta_col_list_services(query_db, meta_query) |
|||
return ResponseUtil.success(data=meta_query_result) |
|||
|
|||
|
|||
@metaController.get("/meta/clas/list") |
|||
async def get_meta_clas_list(request: Request, query_db: AsyncSession = Depends(get_db)): |
|||
result = await MetaService.get_meta_clas_list_services(query_db) |
|||
return ResponseUtil.success(data=result) |
|||
|
|||
|
|||
@metaController.post("/meta/supp") |
|||
async def meta_supp(request: Request, |
|||
supple: SuppleModel, |
|||
query_db: AsyncSession = Depends(get_db), |
|||
current_user: CurrentUserModel = Depends(LoginService.get_current_user)): |
|||
result = await MetaService.meta_supp(query_db, supple, current_user) |
|||
return ResponseUtil.success(msg=result.message) |
@ -0,0 +1,78 @@ |
|||
from sqlalchemy import desc, delete, func, select, update |
|||
from sqlalchemy.ext.asyncio import AsyncSession |
|||
from module_admin.entity.do.approval_do import FlowApproval |
|||
from module_admin.entity.vo.approval_vo import ApprovalQueryObject |
|||
from module_admin.entity.vo.user_vo import CurrentUserModel |
|||
from sqlalchemy import select, text, cast, Integer, and_, or_, outerjoin, func, join |
|||
from utils.page_util import PageUtil |
|||
|
|||
|
|||
class ApprovalDao: |
|||
""" |
|||
菜单管理模块数据库操作层 |
|||
""" |
|||
|
|||
@classmethod |
|||
async def add_flow_approval(cls, db: AsyncSession, flow_approval: FlowApproval): |
|||
db.add(flow_approval) |
|||
await db.flush() |
|||
return flow_approval |
|||
|
|||
@classmethod |
|||
async def get_flow_by_id(cls, db: AsyncSession, flowId: str): |
|||
result = ( |
|||
( |
|||
await db.execute( |
|||
select(FlowApproval).where( |
|||
FlowApproval.id == flowId |
|||
) |
|||
) |
|||
) |
|||
.scalars() |
|||
.first() |
|||
) |
|||
return result |
|||
|
|||
@classmethod |
|||
async def edit_flow_approval(cls, db: AsyncSession, flow: dict): |
|||
await db.execute(update(FlowApproval), [flow]) |
|||
|
|||
@classmethod |
|||
async def get_flow_list(cls, db: AsyncSession, query_param: ApprovalQueryObject, current_user: CurrentUserModel): |
|||
query = ( |
|||
select(FlowApproval) |
|||
.where( |
|||
(FlowApproval.applicant == query_param.status) if query_param.applicant else True, |
|||
(FlowApproval.businessType == query_param.businessType) if query_param.businessType else True, |
|||
or_( |
|||
FlowApproval.approver == current_user.user.user_name, |
|||
FlowApproval.approver.in_(current_user.roles) |
|||
) if current_user.user.user_name != 'admin' else True |
|||
) |
|||
.order_by(FlowApproval.applyTime) |
|||
.distinct() |
|||
) |
|||
# 注意:这里不执行查询,而是将查询对象传递给 paginate 方法 |
|||
result = await PageUtil.paginate(db, query, query_param.page_num, query_param.page_size, True) |
|||
return result |
|||
|
|||
@classmethod |
|||
async def get_waiting_total(cls, db: AsyncSession, current_user: CurrentUserModel): |
|||
return (await db.execute(select(func.count()).select_from(FlowApproval) |
|||
.where(FlowApproval.approver == current_user.user.user_name))).scalar() |
|||
|
|||
@classmethod |
|||
async def get_flow_by_idAndUser(cls, db: AsyncSession, flow_id: str, username: str): |
|||
result = ( |
|||
( |
|||
await db.execute( |
|||
select(FlowApproval).where( |
|||
FlowApproval.id == flow_id, |
|||
FlowApproval.applicant == username |
|||
) |
|||
) |
|||
) |
|||
.scalars() |
|||
.first() |
|||
) |
|||
return result |
@ -0,0 +1,321 @@ |
|||
from sqlalchemy.ext.asyncio import AsyncSession |
|||
from sqlalchemy import select, text, cast, Integer, and_, or_, outerjoin, func, join, update, desc |
|||
from module_admin.entity.vo.meta_vo import MetaPageObject, MetaColObject |
|||
from module_admin.entity.do.meta_do import MetadataExtractInfo, MetadataSuppInfo, MetadataFldTabExtractInfo, \ |
|||
MetadataFldSuppInfo, MetadataClas, MetadataSuppInfoVett, MetadataFldSuppInfoVett |
|||
import json |
|||
import re |
|||
from utils.time_format_util import object_format_datetime, list_format_datetime, format_datetime_dict_list |
|||
from datetime import datetime, time |
|||
from typing import Union, List |
|||
from utils.log_util import logger |
|||
import uuid |
|||
import datetime |
|||
from utils.page_util import PageUtil |
|||
|
|||
|
|||
class MetaDao: |
|||
|
|||
@classmethod |
|||
async def get_meta_rel_list(cls, db: AsyncSession, query_object: MetaPageObject): |
|||
""" |
|||
根据查询参数获取用户列表信息 |
|||
""" |
|||
# 主查询 |
|||
query = ( |
|||
select( |
|||
MetadataExtractInfo.onum.label('extract_onum'), |
|||
MetadataExtractInfo.extract_ver_num, |
|||
MetadataExtractInfo.ver_desc.label('extract_ver_desc'), |
|||
MetadataExtractInfo.ssys_cd, |
|||
MetadataExtractInfo.data_whs_name, |
|||
MetadataExtractInfo.mdl_name, |
|||
MetadataExtractInfo.tab_no, |
|||
MetadataExtractInfo.tab_type, |
|||
MetadataExtractInfo.tab_eng_name, |
|||
MetadataExtractInfo.tab_cn_name, |
|||
MetadataExtractInfo.tab_rec_num, |
|||
MetadataExtractInfo.upd_time.label('extract_upd_time'), |
|||
MetadataSuppInfo.onum.label('supp_onum'), |
|||
MetadataSuppInfo.crrct_ver_num.label('supp_crrct_ver_num'), |
|||
MetadataSuppInfo.tab_crrct_name, |
|||
MetadataSuppInfo.tab_desc, |
|||
MetadataSuppInfo.pic, |
|||
MetadataSuppInfo.gov_flag, |
|||
MetadataSuppInfo.rec_stat.label('supp_rec_stat'), |
|||
MetadataSuppInfo.tab_clas, |
|||
MetadataSuppInfo.rec_subm_prsn, |
|||
MetadataSuppInfo.upd_time.label('supp_upd_time') |
|||
).join(MetadataSuppInfo, |
|||
and_( |
|||
MetadataExtractInfo.ssys_cd == MetadataSuppInfo.ssys_cd, |
|||
MetadataExtractInfo.mdl_name == MetadataSuppInfo.mdl_name, |
|||
MetadataExtractInfo.tab_eng_name == MetadataSuppInfo.tab_eng_name |
|||
), isouter=True) |
|||
.join( |
|||
MetadataFldTabExtractInfo, |
|||
and_( |
|||
MetadataExtractInfo.ssys_cd == MetadataFldTabExtractInfo.ssys_cd, |
|||
MetadataExtractInfo.mdl_name == MetadataFldTabExtractInfo.mdl_name, |
|||
MetadataExtractInfo.tab_eng_name == MetadataFldTabExtractInfo.tab_eng_name |
|||
), isouter=True) |
|||
.join( |
|||
MetadataFldSuppInfo, |
|||
and_( |
|||
MetadataExtractInfo.ssys_cd == MetadataFldSuppInfo.ssys_cd, |
|||
MetadataExtractInfo.mdl_name == MetadataFldSuppInfo.mdl_name, |
|||
MetadataExtractInfo.tab_eng_name == MetadataFldSuppInfo.tab_eng_name |
|||
), isouter=True) |
|||
.where( |
|||
MetadataExtractInfo.ssys_cd == query_object.ssys_cd if query_object.ssys_cd else True, |
|||
MetadataExtractInfo.mdl_name == query_object.mdl_name if query_object.mdl_name else True, |
|||
or_(MetadataExtractInfo.tab_eng_name.like(f'%{query_object.tab_name}%'), |
|||
MetadataExtractInfo.tab_cn_name.like(f'%{query_object.tab_name}%'), |
|||
MetadataSuppInfo.tab_eng_name.like(f'%{query_object.tab_name}%'), |
|||
MetadataSuppInfo.tab_crrct_name.like(f'%{query_object.tab_name}%'), |
|||
) if query_object.tab_name else True, |
|||
or_( |
|||
MetadataFldTabExtractInfo.fld_eng_name.like(f'%{query_object.col_name}%'), |
|||
MetadataFldTabExtractInfo.fld_cn_name.like(f'%{query_object.col_name}%'), |
|||
MetadataFldSuppInfo.fld_eng_name.like(f'%{query_object.col_name}%'), |
|||
MetadataFldSuppInfo.fld_crrct_name.like(f'%{query_object.col_name}%'), |
|||
) if query_object.col_name else True, |
|||
MetadataExtractInfo.tab_type == query_object.tab_type if query_object.tab_type else True, |
|||
MetadataExtractInfo.rec_stat == query_object.rec_stat if query_object.rec_stat else True, |
|||
).distinct() |
|||
) |
|||
result = await PageUtil.paginate(db, query, query_object.page_num, query_object.page_size, True) |
|||
return result |
|||
|
|||
@classmethod |
|||
async def get_meta_col_list(cls, db: AsyncSession, query_object: MetaColObject): |
|||
query_result = ( |
|||
( |
|||
await db.execute( |
|||
select( |
|||
MetadataFldTabExtractInfo.onum.label('extract_onum'), |
|||
MetadataFldTabExtractInfo.extract_ver_num, |
|||
MetadataFldTabExtractInfo.ssys_cd, |
|||
MetadataFldTabExtractInfo.data_whs_name, |
|||
MetadataFldTabExtractInfo.mdl_name, |
|||
MetadataFldTabExtractInfo.tab_no, |
|||
MetadataFldTabExtractInfo.tab_eng_name, |
|||
MetadataFldTabExtractInfo.fld_no, |
|||
MetadataFldTabExtractInfo.fld_eng_name, |
|||
MetadataFldTabExtractInfo.fld_cn_name, |
|||
MetadataFldTabExtractInfo.fld_type, |
|||
MetadataFldTabExtractInfo.pk_flag, |
|||
MetadataFldTabExtractInfo.require_flag, |
|||
MetadataFldTabExtractInfo.idx_flag, |
|||
MetadataFldTabExtractInfo.upd_time.label('extract_upd_time'), |
|||
MetadataFldSuppInfo.onum.label('supp_onum'), |
|||
MetadataFldSuppInfo.crrct_ver_num, |
|||
MetadataFldSuppInfo.fld_crrct_name, |
|||
MetadataFldSuppInfo.crrct_pk_flag, |
|||
MetadataFldSuppInfo.fld_desc, |
|||
MetadataFldSuppInfo.pic, |
|||
MetadataFldSuppInfo.fld_clas, |
|||
MetadataFldSuppInfo.fld_null_rate, |
|||
MetadataFldSuppInfo.rec_stat.label('supp_rec_stat'), |
|||
MetadataFldSuppInfo.upd_time.label('supp_upd_time') |
|||
).select_from( |
|||
join( |
|||
MetadataFldTabExtractInfo, |
|||
MetadataFldSuppInfo, |
|||
and_( |
|||
MetadataFldTabExtractInfo.ssys_cd == MetadataFldSuppInfo.ssys_cd, |
|||
MetadataFldTabExtractInfo.mdl_name == MetadataFldSuppInfo.mdl_name, |
|||
MetadataFldTabExtractInfo.tab_eng_name == MetadataFldSuppInfo.tab_eng_name, |
|||
MetadataFldTabExtractInfo.fld_eng_name == MetadataFldSuppInfo.fld_eng_name |
|||
), isouter=True |
|||
) |
|||
).where( |
|||
MetadataFldTabExtractInfo.ssys_cd == query_object.ssys_cd, |
|||
MetadataFldTabExtractInfo.mdl_name == query_object.mdl_name, |
|||
MetadataFldTabExtractInfo.tab_eng_name == query_object.tab_name |
|||
).distinct() |
|||
) |
|||
).all() |
|||
) |
|||
return [row._asdict() for row in query_result] |
|||
|
|||
@classmethod |
|||
async def get_meta_clas_list(cls, db: AsyncSession): |
|||
query_result = ( |
|||
( |
|||
await db.execute( |
|||
select(MetadataClas).where(MetadataClas.clas_eff_flag == 1).distinct() |
|||
) |
|||
).scalars().all() |
|||
) |
|||
return query_result |
|||
|
|||
@classmethod |
|||
async def get_lastest_meta_data_supp_vett(cls, db: AsyncSession, ssys_cd: str, mdl_name: str, tab_eng_name: str): |
|||
query_result = ( |
|||
( |
|||
await db.execute( |
|||
select(MetadataSuppInfoVett).where(MetadataSuppInfoVett.ssys_cd == ssys_cd, |
|||
MetadataSuppInfoVett.mdl_name == mdl_name, |
|||
MetadataSuppInfoVett.tab_eng_name == tab_eng_name) |
|||
.order_by(desc(MetadataSuppInfoVett.apply_time)) |
|||
.distinct().limit(1) |
|||
) |
|||
).scalars().first() |
|||
) |
|||
return query_result |
|||
|
|||
@classmethod |
|||
async def insertMetadataSuppInfoVett(cls, table: MetadataSuppInfoVett, db: AsyncSession): |
|||
db.add(table) |
|||
await db.flush() |
|||
return table |
|||
|
|||
@classmethod |
|||
async def updateMetadataSuppInfoVett(cls, onum: str, operateType: str, db: AsyncSession): |
|||
table = dict( |
|||
onum=onum, |
|||
apply_status=operateType |
|||
) |
|||
await db.execute(update(MetadataSuppInfoVett), [table]) |
|||
|
|||
@classmethod |
|||
async def insertMetadataSuppInfo(cls, table: MetadataSuppInfoVett, db: AsyncSession): |
|||
suppTable = MetadataSuppInfo() |
|||
suppTable.onum = uuid.uuid4() |
|||
suppTable.ssys_cd = table.ssys_cd |
|||
suppTable.mdl_name = table.mdl_name |
|||
suppTable.tab_eng_name = table.tab_eng_name |
|||
suppTable.tab_crrct_name = table.tab_crrct_name |
|||
suppTable.tab_desc = table.tab_desc |
|||
suppTable.pic = table.pic |
|||
suppTable.gov_flag = table.gov_flag |
|||
suppTable.rec_stat = table.rec_stat |
|||
suppTable.tab_clas = table.tab_clas |
|||
suppTable.rec_subm_prsn = table.rec_subm_prsn |
|||
suppTable.upd_time = table.upd_time |
|||
db.add(suppTable) |
|||
await db.flush() |
|||
return suppTable |
|||
|
|||
@classmethod |
|||
async def updateMetadataSuppInfo(cls, onum: str, table: MetadataSuppInfoVett, db: AsyncSession): |
|||
suppTable = dict( |
|||
onum=onum, |
|||
tab_crrct_name=table.tab_crrct_name, |
|||
tab_desc=table.tab_desc, |
|||
pic=table.pic, |
|||
gov_flag=table.gov_flag, |
|||
rec_stat=table.rec_stat, |
|||
tab_clas=table.tab_clas, |
|||
rec_subm_prsn=table.rec_subm_prsn, |
|||
upd_time=table.upd_time |
|||
) |
|||
await db.execute(update(MetadataSuppInfo), [suppTable]) |
|||
|
|||
@classmethod |
|||
async def get_supp_table_vett_by_id(cls, suppId: str, db: AsyncSession): |
|||
query_result = ( |
|||
( |
|||
await db.execute( |
|||
select(MetadataSuppInfoVett).where(MetadataSuppInfoVett.onum == suppId).distinct() |
|||
) |
|||
).scalars().first() |
|||
) |
|||
return query_result |
|||
|
|||
@classmethod |
|||
async def get_supp_table_by_vett(cls, sysCode: str, mdlName: str, tableName: str, db: AsyncSession): |
|||
query_result = ( |
|||
( |
|||
await db.execute( |
|||
select(MetadataSuppInfo).where(MetadataSuppInfo.ssys_cd == sysCode, |
|||
MetadataSuppInfo.mdl_name == mdlName, |
|||
MetadataSuppInfo.tab_eng_name == tableName).distinct() |
|||
) |
|||
).scalars().first() |
|||
) |
|||
return query_result |
|||
|
|||
@classmethod |
|||
async def insertMetadataFldSuppInfoVett(cls, column: MetadataFldSuppInfoVett, db: AsyncSession): |
|||
db.add(column) |
|||
await db.flush() |
|||
return column |
|||
|
|||
@classmethod |
|||
async def updateMetadataFldSuppInfoVett(cls, onum: str, operateType: str, db: AsyncSession): |
|||
updateColumn = dict( |
|||
onum=onum, apply_status=operateType |
|||
) |
|||
await db.execute(update(MetadataFldSuppInfoVett), [updateColumn]) |
|||
|
|||
@classmethod |
|||
async def updateMetadataFldSuppInfo(cls, onum: str, column: MetadataFldSuppInfoVett, db: AsyncSession): |
|||
updateColumn = dict( |
|||
onum=onum, |
|||
fld_crrct_name=column.fld_crrct_name, |
|||
crrct_pk_flag=column.crrct_pk_flag, |
|||
fld_desc=column.fld_desc, |
|||
pic=column.pic, |
|||
fld_clas=column.fld_clas, |
|||
fld_null_rate=column.fld_null_rate, |
|||
rec_stat=column.rec_stat, |
|||
upd_time=column.upd_time, |
|||
) |
|||
await db.execute(update(MetadataFldSuppInfo), [updateColumn]) |
|||
|
|||
@classmethod |
|||
async def insertMetadataFldSuppInfo(cls, column: MetadataFldSuppInfoVett, db: AsyncSession): |
|||
suppColumn = MetadataFldSuppInfo() |
|||
suppColumn.onum = uuid.uuid4() |
|||
suppColumn.ssys_cd = column.ssys_cd |
|||
suppColumn.mdl_name = column.mdl_name |
|||
suppColumn.tab_eng_name = column.tab_eng_name |
|||
suppColumn.fld_eng_name = column.fld_eng_name |
|||
suppColumn.fld_crrct_name = column.fld_crrct_name |
|||
suppColumn.crrct_pk_flag = column.crrct_pk_flag |
|||
suppColumn.fld_desc = column.fld_desc |
|||
suppColumn.pic = column.pic |
|||
suppColumn.fld_clas = column.fld_clas |
|||
suppColumn.fld_null_rate = column.fld_null_rate |
|||
suppColumn.rec_stat = column.rec_stat |
|||
suppColumn.upd_time = column.upd_time |
|||
db.add(suppColumn) |
|||
await db.flush() |
|||
return suppColumn |
|||
|
|||
@classmethod |
|||
async def get_meta_col_supp_vett(cls, table: MetadataSuppInfoVett, db: AsyncSession): |
|||
sql_query = text("select max(apply_time) from t_metadata_fld_supp_info_vett where ssys_cd ='" + table.ssys_cd + |
|||
"' and mdl_name = '" + table.mdl_name + "' and tab_eng_name = '" + table.tab_eng_name + |
|||
"'") |
|||
maxTime = (await db.execute(sql_query)).scalar() |
|||
|
|||
query_result = ( |
|||
( |
|||
await db.execute( |
|||
select(MetadataFldSuppInfoVett) |
|||
.where(MetadataFldSuppInfoVett.ssys_cd == table.ssys_cd, |
|||
MetadataFldSuppInfoVett.mdl_name == table.mdl_name, |
|||
MetadataFldSuppInfoVett.tab_eng_name == table.tab_eng_name, |
|||
MetadataFldSuppInfoVett.apply_time == maxTime).distinct() |
|||
) |
|||
).scalars().all() |
|||
) |
|||
return query_result |
|||
|
|||
@classmethod |
|||
async def get_supp_column_by_vett(cls, column: MetadataFldSuppInfoVett, db: AsyncSession): |
|||
query_result = ( |
|||
( |
|||
await db.execute( |
|||
select(MetadataFldSuppInfo) |
|||
.where(MetadataFldSuppInfo.ssys_cd == column.ssys_cd, |
|||
MetadataFldSuppInfo.mdl_name == column.mdl_name, |
|||
MetadataFldSuppInfo.tab_eng_name == column.tab_eng_name, |
|||
MetadataFldSuppInfo.fld_eng_name == column.fld_eng_name).distinct() |
|||
) |
|||
).scalars().first() |
|||
) |
|||
return query_result |
@ -0,0 +1,20 @@ |
|||
from sqlalchemy import Column, Integer, String, DateTime, Boolean, Text |
|||
from config.database import Base |
|||
from datetime import datetime |
|||
|
|||
|
|||
class FlowApproval(Base): |
|||
""" |
|||
流程审批表 |
|||
""" |
|||
__tablename__ = 'flow_approval' |
|||
|
|||
id = Column(String(50), primary_key=True, comment='id') |
|||
businessType = Column(String(50), default='', comment='业务审批模块') |
|||
businessId = Column(String(255), default='', comment='业务id串') |
|||
applicant = Column(String(50), default=None, comment='申请人') |
|||
applyTime = Column(String(50), default=None, comment='审批时间') |
|||
approver = Column(String(50), default=None, comment='下一步审批人') |
|||
nextStep = Column(Integer, default=None, comment="下一步编号") |
|||
status = Column(String(10), default=None, comment='状态') |
|||
approvalFlow = Column(Text, default=None, comment='审批流') # [{审批人:‘’,审批时间:‘’,'审批结果':‘’,审批意见:''},{}]数组 |
@ -0,0 +1,156 @@ |
|||
from sqlalchemy import Column, Float, Integer, String, Text, DateTime, Boolean, ForeignKey, UniqueConstraint, Index, \ |
|||
text |
|||
from config.database import Base |
|||
from datetime import datetime |
|||
|
|||
|
|||
class MetadataExtractInfo(Base): |
|||
""" |
|||
元数据采集信息表 |
|||
""" |
|||
__tablename__ = 't_metadata_extract_info' |
|||
|
|||
onum = Column(Integer, primary_key=True, comment='唯一编号') |
|||
extract_ver_num = Column(String(50, collation='utf8_general_ci'), comment='采集版本号') |
|||
ver_desc = Column(String(250, collation='utf8_general_ci'), comment='版本描述') |
|||
ssys_cd = Column(String(50, collation='utf8_general_ci'), comment='系统代码') |
|||
data_whs_name = Column(String(50, collation='utf8_general_ci'), comment='数据仓库名称') |
|||
mdl_name = Column(String(50, collation='utf8_general_ci'), comment='模式名称') |
|||
tab_no = Column(Integer, comment='表编号') |
|||
tab_type = Column(String(50, collation='utf8_general_ci'), comment='表类型') |
|||
tab_eng_name = Column(String(250, collation='utf8_general_ci'), comment='表英文名称') |
|||
tab_cn_name = Column(String(250, collation='utf8_general_ci'), comment='表中文名称') |
|||
tab_rec_num = Column(Integer, comment='记录数') |
|||
upd_time = Column(DateTime, comment='更新时间') |
|||
|
|||
|
|||
class MetadataSuppInfo(Base): |
|||
""" |
|||
元数据补充信息表 |
|||
""" |
|||
__tablename__ = 't_metadata_supp_info' |
|||
|
|||
# onum = Column(Integer, primary_key=True, comment='唯一编号') |
|||
onum = Column(String(36, collation='utf8mb4_unicode_ci'), primary_key=True, comment='唯一编号') |
|||
crrct_ver_num = Column(String(50, collation='utf8_general_ci'), comment='补录版本号') |
|||
ssys_cd = Column(String(50, collation='utf8_general_ci'), comment='系统代码') |
|||
mdl_name = Column(String(50, collation='utf8_general_ci'), comment='模型名称') |
|||
tab_eng_name = Column(String(250, collation='utf8_general_ci'), comment='表英文名称') |
|||
tab_crrct_name = Column(String(250, collation='utf8_general_ci'), comment='表补录名称') |
|||
tab_desc = Column(String(500, collation='utf8_general_ci'), comment='表描述') |
|||
pic = Column(String(64, collation='utf8_general_ci'), comment='表图片') |
|||
gov_flag = Column(String(1, collation='utf8_general_ci'), default='0', comment='治理标志(0否 1是)') |
|||
rec_stat = Column(String(1, collation='utf8_general_ci'), default='0', comment='记录状态(0有效 1无效)') |
|||
tab_clas = Column(Text, comment='表分类') |
|||
rec_subm_prsn = Column(String(255, collation='utf8_general_ci'), comment='记录提交人') |
|||
upd_time = Column(DateTime, comment='更新时间') |
|||
|
|||
|
|||
class MetadataSuppInfoVett(Base): |
|||
""" |
|||
元数据补充信息审批表 |
|||
""" |
|||
__tablename__ = 't_metadata_supp_info_vett' |
|||
|
|||
# onum = Column(Integer, primary_key=True, comment='唯一编号') |
|||
onum = Column(String(36, collation='utf8mb4_unicode_ci'), primary_key=True, comment='唯一编号') |
|||
crrct_ver_num = Column(String(50, collation='utf8_general_ci'), comment='补录版本号') |
|||
ssys_cd = Column(String(50, collation='utf8_general_ci'), comment='系统代码') |
|||
mdl_name = Column(String(50, collation='utf8_general_ci'), comment='模型名称') |
|||
tab_eng_name = Column(String(250, collation='utf8_general_ci'), comment='表英文名称') |
|||
tab_crrct_name = Column(String(250, collation='utf8_general_ci'), comment='表补录名称') |
|||
tab_desc = Column(String(500, collation='utf8_general_ci'), comment='表描述') |
|||
pic = Column(String(64, collation='utf8_general_ci'), comment='表图片') |
|||
gov_flag = Column(String(1, collation='utf8_general_ci'), default='0', comment='治理标志(0否 1是)') |
|||
rec_stat = Column(String(1, collation='utf8_general_ci'), default='0', comment='记录状态(0有效 1无效)') |
|||
tab_clas = Column(Text, comment='表分类') |
|||
rec_subm_prsn = Column(String(255, collation='utf8_general_ci'), comment='记录提交人') |
|||
apply_time = Column(String(255, collation='utf8_general_ci'), comment='申请时间') |
|||
apply_status = Column(String(255, collation='utf8_general_ci'), comment='申请状态') |
|||
upd_time = Column(String(255, collation='utf8_general_ci'), comment='更新时间') |
|||
|
|||
|
|||
class MetadataClas(Base): |
|||
""" |
|||
元数据分类表 |
|||
""" |
|||
__tablename__ = 't_metadata_clas' |
|||
|
|||
clas_onum = Column(Integer, primary_key=True, comment='分类编号') |
|||
clas_pri_clas = Column(String(50, collation='utf8_general_ci'), comment='一级分类') |
|||
clas_scd_clas = Column(String(50, collation='utf8_general_ci'), comment='二级分类') |
|||
clas_thre_clas = Column(String(50, collation='utf8_general_ci'), comment='三级分类') |
|||
clas_name = Column(String(255, collation='utf8_general_ci'), comment='分类名称') |
|||
clas_eff_flag = Column(String(1, collation='utf8_general_ci'), default='0', comment='生效标志(0有效 1无效)') |
|||
rec_subm_prsn = Column(String(255, collation='utf8_general_ci'), comment='记录提交人') |
|||
upd_time = Column(DateTime, comment='更新时间') |
|||
|
|||
|
|||
class MetadataFldTabExtractInfo(Base): |
|||
""" |
|||
字段采集信息表 |
|||
""" |
|||
__tablename__ = 't_metadata_fld_tab_extract_info' |
|||
|
|||
onum = Column(Integer, primary_key=True, comment='唯一编号') |
|||
extract_ver_num = Column(String(50, collation='utf8_general_ci'), comment='采集版本号') |
|||
ssys_cd = Column(String(50, collation='utf8_general_ci'), comment='系统代码') |
|||
data_whs_name = Column(String(255, collation='utf8_general_ci'), comment='数据仓库名称') |
|||
mdl_name = Column(String(255, collation='utf8_general_ci'), comment='模块名称') |
|||
tab_no = Column(String(50, collation='utf8_general_ci'), comment='表编号') |
|||
tab_eng_name = Column(String(250, collation='utf8_general_ci'), comment='表英文名称') |
|||
fld_no = Column(Integer, comment='字段编号') |
|||
fld_eng_name = Column(String(255, collation='utf8_general_ci'), comment='字段英文名称') |
|||
fld_cn_name = Column(String(255, collation='utf8_general_ci'), comment='字段中文名称') |
|||
fld_type = Column(String(50, collation='utf8_general_ci'), comment='字段类型') |
|||
pk_flag = Column(Boolean, default=False, comment='是否为主键') #待确认字段类型 |
|||
require_flag = Column(Boolean, default=False, comment='是否必填') |
|||
idx_flag = Column(Boolean, default=False, comment='是否为索引') |
|||
upd_time = Column(DateTime, comment='更新时间') |
|||
|
|||
|
|||
class MetadataFldSuppInfo(Base): |
|||
""" |
|||
字段补充信息表 |
|||
""" |
|||
__tablename__ = 't_metadata_fld_supp_info' |
|||
|
|||
onum = Column(String(50, collation='utf8_general_ci'), primary_key=True, comment='唯一编号') |
|||
crrct_ver_num = Column(String(50, collation='utf8_general_ci'), comment='补充版本号') |
|||
ssys_cd = Column(String(50, collation='utf8_general_ci'), comment='系统代码') |
|||
mdl_name = Column(String(255, collation='utf8_general_ci'), comment='模块名称') |
|||
tab_eng_name = Column(String(250, collation='utf8_general_ci'), comment='表英文名称') |
|||
fld_eng_name = Column(String(255, collation='utf8_general_ci'), comment='字段英文名称') |
|||
fld_crrct_name = Column(String(255, collation='utf8_general_ci'), comment='补充字段名称') |
|||
crrct_pk_flag = Column(Boolean, default=False, comment='是否为主键') |
|||
fld_desc = Column(String(255, collation='utf8_general_ci'), comment='字段描述') |
|||
pic = Column(String(255, collation='utf8_general_ci'), comment='图片字段') |
|||
fld_clas = Column(Text, comment='字段分类') |
|||
fld_null_rate = Column(String(50, collation='utf8_general_ci'), comment='字段空值率') |
|||
rec_stat = Column(String(50, collation='utf8_general_ci'), comment='记录状态') |
|||
upd_time = Column(DateTime, comment='更新时间') |
|||
|
|||
|
|||
class MetadataFldSuppInfoVett(Base): |
|||
""" |
|||
字段补充信息表 |
|||
""" |
|||
__tablename__ = 't_metadata_fld_supp_info_vett' |
|||
|
|||
onum = Column(String(50, collation='utf8_general_ci'), primary_key=True, comment='唯一编号') |
|||
crrct_ver_num = Column(String(50, collation='utf8_general_ci'), comment='补充版本号') |
|||
ssys_cd = Column(String(50, collation='utf8_general_ci'), comment='系统代码') |
|||
mdl_name = Column(String(255, collation='utf8_general_ci'), comment='模块名称') |
|||
tab_eng_name = Column(String(250, collation='utf8_general_ci'), comment='表英文名称') |
|||
fld_eng_name = Column(String(255, collation='utf8_general_ci'), comment='字段英文名称') |
|||
fld_crrct_name = Column(String(255, collation='utf8_general_ci'), comment='补充字段名称') |
|||
crrct_pk_flag = Column(Boolean, default=False, comment='是否为主键') |
|||
fld_desc = Column(String(255, collation='utf8_general_ci'), comment='字段描述') |
|||
pic = Column(String(255, collation='utf8_general_ci'), comment='图片字段') |
|||
fld_clas = Column(Text, comment='字段分类') |
|||
fld_null_rate = Column(String(50, collation='utf8_general_ci'), comment='字段空值率') |
|||
rec_stat = Column(String(50, collation='utf8_general_ci'), comment='记录状态') |
|||
upd_time = Column(DateTime, comment='更新时间') |
|||
rec_subm_prsn = Column(String(255, collation='utf8_general_ci'), comment='记录提交人') |
|||
apply_time = Column(String(255, collation='utf8_general_ci'), comment='申请时间') |
|||
apply_status = Column(String(255, collation='utf8_general_ci'), comment='申请状态') |
@ -0,0 +1,34 @@ |
|||
from pydantic import BaseModel |
|||
from typing import Union, Optional, List |
|||
from module_admin.annotation.pydantic_annotation import as_query |
|||
from pydantic import BaseModel, ConfigDict, Field, model_validator |
|||
from pydantic.alias_generators import to_camel |
|||
|
|||
|
|||
class ApplyModel(BaseModel): |
|||
businessType: Optional[str] = None |
|||
businessId: Optional[str] = None |
|||
applicant: Optional[str] = None |
|||
|
|||
|
|||
class OperateModel(BaseModel): |
|||
flowId: Optional[str] = None # 流程编号 |
|||
operateType: Optional[str] = None # 操作:驳回,同意:reject, success |
|||
operateComment: Optional[str] = None # 审批意见 |
|||
|
|||
|
|||
@as_query |
|||
class ApprovalQueryObject(BaseModel): |
|||
model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) |
|||
page_num: int |
|||
page_size: int |
|||
applicant: Optional[str] = None |
|||
businessType: Optional[str] = None |
|||
|
|||
|
|||
class EditObjectModel(BaseModel): |
|||
id: Optional[str] = None |
|||
status: Optional[str] = None |
|||
approver: Optional[str] = None |
|||
nextStep: Optional[int] = None |
|||
approvalFlow: Optional[str] = None |
@ -0,0 +1,56 @@ |
|||
from typing import Union, Optional, List |
|||
from datetime import datetime |
|||
from module_admin.annotation.pydantic_annotation import as_query |
|||
from pydantic import BaseModel, ConfigDict, Field, model_validator |
|||
from pydantic.alias_generators import to_camel |
|||
|
|||
|
|||
class MetaModel(BaseModel): |
|||
model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) |
|||
ssys_cd: Optional[str] = Field(default=None, description='系统名称') |
|||
mdl_name: Optional[str] = Field(default=None, description='模式名称') |
|||
tab_name: Optional[str] = Field(default=None, description='表名') |
|||
tab_type: Optional[str] = Field(default=None, description='表类型') |
|||
col_name: Optional[str] = Field(default=None, description='字段名称') |
|||
tag_name: Optional[str] = Field(default=None, description='标签名称') |
|||
rec_stat: Optional[str] = Field(default=None, description='补录状态') |
|||
|
|||
|
|||
@as_query |
|||
class MetaPageObject(MetaModel): |
|||
page_num: int |
|||
page_size: int |
|||
|
|||
|
|||
@as_query |
|||
class MetaColObject(BaseModel): |
|||
model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) |
|||
ssys_cd: Optional[str] = Field(default=None, description='系统名称') |
|||
mdl_name: Optional[str] = Field(default=None, description='模式名称') |
|||
tab_name: Optional[str] = Field(default=None, description='表名') |
|||
|
|||
|
|||
class ColumnSuppleModel(BaseModel): |
|||
model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) |
|||
fld_eng_name: Optional[str] = None |
|||
fld_crrct_name: Optional[str] = None |
|||
crrct_pk_flag: Optional[int] = None |
|||
fld_desc: Optional[str] = None |
|||
pic: Optional[str] = None |
|||
fld_clas: Optional[str] = None |
|||
fld_null_rate: Optional[str] = None |
|||
rec_stat: Optional[str] = None |
|||
|
|||
|
|||
class SuppleModel(BaseModel): |
|||
model_config = ConfigDict(alias_generator=to_camel, from_attributes=True) |
|||
ssys_cd: Optional[str] = None |
|||
mdl_name: Optional[str] = None |
|||
tab_eng_name: Optional[str] = None |
|||
tab_crrct_name: Optional[str] = None |
|||
tab_desc: Optional[str] = None |
|||
pic: Optional[str] = None |
|||
gov_flag: Optional[str] = None |
|||
rec_stat: Optional[str] = None |
|||
tab_clas: Optional[str] = None |
|||
columnInfo: Optional[List[ColumnSuppleModel]] = None |
@ -0,0 +1,121 @@ |
|||
import json |
|||
import uuid |
|||
|
|||
from typing import Optional |
|||
from sqlalchemy.ext.asyncio import AsyncSession |
|||
from module_admin.entity.vo.common_vo import CrudResponseModel |
|||
from module_admin.entity.vo.approval_vo import ApplyModel, OperateModel, ApprovalQueryObject, EditObjectModel |
|||
from module_admin.entity.vo.user_vo import CurrentUserModel |
|||
from module_admin.entity.do.approval_do import FlowApproval |
|||
from exceptions.exception import ServiceException, ServiceWarning |
|||
from datetime import datetime |
|||
from utils.common_util import CamelCaseUtil |
|||
from module_admin.dao.approval_dao import ApprovalDao |
|||
from module_admin.dao.meta_dao import MetaDao |
|||
|
|||
|
|||
class ApprovalService: |
|||
""" |
|||
智能问答服务层 |
|||
""" |
|||
|
|||
@classmethod |
|||
async def apply_services(cls, result_db: AsyncSession, apply: ApplyModel): |
|||
flow_approval = FlowApproval() |
|||
flow_approval.id = uuid.uuid4() |
|||
flow_approval.businessType = apply.businessType |
|||
flow_approval.businessId = apply.businessId |
|||
flow_approval.applicant = apply.applicant |
|||
flow_approval.applyTime = datetime.now().strftime("%Y-%m-%d %H:%M:%S") |
|||
flow_approval.status = 'waiting' |
|||
# todo 后期进行流程配置,角色 or 人员 下一步审批人 |
|||
flow_approval.approver = 'admin' |
|||
flow_approval.nextStep = '1' |
|||
await ApprovalDao.add_flow_approval(result_db, flow_approval) |
|||
await result_db.commit() |
|||
return CrudResponseModel(is_success=True, message='申请成功') |
|||
|
|||
@classmethod |
|||
async def operate_services(cls, result_db: AsyncSession, operate: OperateModel, current_user: CurrentUserModel): |
|||
flow_approval = await ApprovalDao.get_flow_by_id(result_db, operate.flowId) |
|||
if flow_approval is None: |
|||
raise ServiceException(message=f'所操作的流程不存在') |
|||
if flow_approval.status == 'succeed' or flow_approval.status == 'rejected': |
|||
raise ServiceException(message='所操作的流程已结束') |
|||
if flow_approval.status == 'canceled': |
|||
raise ServiceException(message='所操作的流程已撤回') |
|||
array = [] |
|||
if flow_approval.approvalFlow is not None: |
|||
array = json.loads(flow_approval.approvalFlow) |
|||
array.append({'operator': current_user.user.user_name, |
|||
'operateTime': datetime.now().strftime("%Y-%m-%d %H:%M:%S"), |
|||
'operate': operate.operateType, |
|||
'operateComment': operate.operateComment, |
|||
}) |
|||
edit = EditObjectModel() |
|||
edit.id = flow_approval.id |
|||
edit.approvalFlow = json.dumps(array) |
|||
if operate.operateType == 'success': |
|||
# todo 增加流程配置,并查询出下一步操作人以及步骤 |
|||
edit.status = 'succeed' # 有下一步执行人,则设置为 pending |
|||
edit.approver = None |
|||
edit.nextStep = -1 |
|||
if operate.operateType == 'reject': |
|||
edit.status = 'rejected' |
|||
edit.approver = None |
|||
edit.nextStep = -1 |
|||
if flow_approval.businessType == 't_metadata_supp_info': |
|||
await cls.syncSuppInfo(result_db, flow_approval.businessId, operate.operateType) |
|||
await ApprovalDao.edit_flow_approval(result_db, edit.model_dump(exclude_unset=True)) |
|||
await result_db.commit() |
|||
return CrudResponseModel(is_success=True, message='操作成功') |
|||
|
|||
@classmethod |
|||
async def syncSuppInfo(cls, result_db: AsyncSession, suppId: str, operateType: str): |
|||
table = await MetaDao.get_supp_table_vett_by_id(suppId, result_db) |
|||
if table is None: |
|||
raise ServiceException(message='所查询的业务数据不存在') |
|||
if table.apply_status == 'succeed' or table.apply_status == 'rejected': |
|||
raise ServiceException(message='所改业务已审核完毕') |
|||
column_list = await MetaDao.get_meta_col_supp_vett(table, result_db) |
|||
if column_list is not None and len(column_list) > 0: |
|||
for column in column_list: |
|||
column.apply_status = operateType |
|||
suppColumn = await MetaDao.get_supp_column_by_vett(column, result_db) |
|||
await MetaDao.updateMetadataFldSuppInfoVett(column.onum, operateType, result_db) |
|||
if suppColumn is None: |
|||
await MetaDao.insertMetadataFldSuppInfo(column, result_db) |
|||
else: |
|||
await MetaDao.updateMetadataFldSuppInfo(suppColumn.onum, column, result_db) |
|||
suppTable = await MetaDao.get_supp_table_by_vett(table.ssys_cd, table.mdl_name, table.tab_eng_name, result_db) |
|||
await MetaDao.updateMetadataSuppInfoVett(table.onum, operateType, result_db) |
|||
if suppTable is None: |
|||
await MetaDao.insertMetadataSuppInfo(table, result_db) |
|||
else: |
|||
await MetaDao.updateMetadataSuppInfo(suppTable.onum, table, result_db) |
|||
return CrudResponseModel(is_success=True, message='操作成功') |
|||
|
|||
@classmethod |
|||
async def get_flow_list_services(cls, query_db: AsyncSession, query_param: ApprovalQueryObject, |
|||
current_user: CurrentUserModel): |
|||
result = await ApprovalDao.get_flow_list(query_db, query_param, current_user) |
|||
return result |
|||
|
|||
@classmethod |
|||
async def get_waiting_total_services(cls, query_db: AsyncSession, current_user: CurrentUserModel): |
|||
result = await ApprovalDao.get_waiting_total(query_db, current_user) |
|||
return result |
|||
|
|||
@classmethod |
|||
async def cancel_apply_services(cls, query_db: AsyncSession, flow_id: str, |
|||
current_user: CurrentUserModel): |
|||
flow = await ApprovalDao.get_flow_by_idAndUser(flow_id, current_user.user.user_name) |
|||
if flow is None: |
|||
raise ServiceException(message=f'所操作的流程不存在') |
|||
if flow.status == 'succeed' or flow.status == 'rejected': |
|||
raise ServiceException(message='所操作的流程已结束,无需撤回') |
|||
if flow.status == 'canceled': |
|||
raise ServiceException(message='所操作的流程已撤回,无需重复操作') |
|||
flow.status = 'canceled' |
|||
await ApprovalDao.edit_flow_approval(query_db, flow) |
|||
return CrudResponseModel(is_success=True, message='操作成功') |
@ -0,0 +1,126 @@ |
|||
import uuid |
|||
|
|||
from module_admin.entity.vo.meta_vo import MetaPageObject, MetaColObject, SuppleModel |
|||
from module_admin.entity.do.meta_do import MetadataSuppInfo, MetadataFldSuppInfo, MetadataSuppInfoVett, \ |
|||
MetadataFldSuppInfoVett |
|||
from module_admin.dao.meta_dao import MetaDao |
|||
from datetime import datetime |
|||
from module_admin.entity.vo.user_vo import CurrentUserModel |
|||
from module_admin.entity.vo.approval_vo import ApplyModel |
|||
from sqlalchemy.ext.asyncio import AsyncSession |
|||
from exceptions.exception import ServiceException, ServiceWarning |
|||
from utils.pwd_util import * |
|||
from utils.common_util import * |
|||
from utils.log_util import logger |
|||
from module_admin.service.login_service import LoginService |
|||
from module_admin.service.approval_service import ApprovalService |
|||
|
|||
from module_admin.entity.vo.common_vo import CrudResponseModel |
|||
from module_admin.entity.vo.user_vo import CurrentUserModel |
|||
from utils.common_util import CamelCaseUtil |
|||
import re |
|||
|
|||
|
|||
class MetaService: |
|||
|
|||
@classmethod |
|||
async def get_meta_list_services(cls, result_db: AsyncSession, query_object: MetaPageObject, |
|||
current_user: CurrentUserModel): |
|||
""" |
|||
获取元信息service |
|||
:param result_db: orm对象 |
|||
:param query_object: 查询参数对象 |
|||
:param data_scope_sql: 数据权限对应的查询sql语句 |
|||
:return: 用户列表信息对象 |
|||
""" |
|||
# print("********") |
|||
# 0,正常,1已发布,2审核中,3已审核,4已作废 |
|||
if 'admin' in current_user.roles: |
|||
meta_rel_list = await MetaDao.get_meta_rel_list(result_db, query_object) |
|||
return meta_rel_list |
|||
else: |
|||
# meta_rel_list = MetaDao.get_meta_rel_list(result_db, query_object, data_scope_sql) |
|||
return None |
|||
|
|||
@classmethod |
|||
async def get_meta_col_list_services(cls, result_db: AsyncSession, query_object: MetaColObject): |
|||
meta_result = await MetaDao.get_meta_col_list(result_db, query_object) |
|||
return cls.convert_json_keys(meta_result) |
|||
|
|||
@classmethod |
|||
async def get_meta_clas_list_services(cls, result_db: AsyncSession): |
|||
result = await MetaDao.get_meta_clas_list(result_db) |
|||
return CamelCaseUtil.transform_result(result) |
|||
|
|||
@classmethod |
|||
async def meta_supp(cls, result_db: AsyncSession, supple: SuppleModel, current_user: CurrentUserModel): |
|||
# 0,暂存 waiting,申请中,pending审核中,succeed,rejected已审核,canceled已取消 |
|||
hasTable = await MetaDao.get_lastest_meta_data_supp_vett(result_db, supple.ssys_cd, supple.mdl_name, |
|||
supple.tab_eng_name) |
|||
tableOnum = uuid.uuid4() |
|||
if hasTable is not None: |
|||
if hasTable.apply_status == 'waiting': |
|||
raise ServiceException(message=f'所补录对象已存在补录待审核记录,请等待审批完成或撤回申请后,再行补录') |
|||
if hasTable.apply_status == 'pending': |
|||
raise ServiceException(message=f'所补录对象已存在待审核记录,请等待审批完成后,再行补录') |
|||
suppTableInfo = MetadataSuppInfoVett() |
|||
suppTableInfo.onum = tableOnum |
|||
suppTableInfo.ssys_cd = supple.ssys_cd |
|||
suppTableInfo.mdl_name = supple.mdl_name |
|||
suppTableInfo.tab_eng_name = supple.tab_eng_name |
|||
suppTableInfo.tab_crrct_name = supple.tab_crrct_name |
|||
suppTableInfo.tab_desc = supple.tab_desc |
|||
suppTableInfo.pic = supple.pic |
|||
suppTableInfo.gov_flag = supple.gov_flag |
|||
suppTableInfo.tab_clas = supple.tab_clas |
|||
suppTableInfo.rec_subm_prsn = current_user.user.user_name |
|||
suppTableInfo.apply_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") |
|||
suppTableInfo.apply_status = 'waiting' |
|||
await MetaDao.insertMetadataSuppInfoVett(suppTableInfo, result_db) |
|||
await result_db.commit() |
|||
if supple.columnInfo is not None and len(supple.columnInfo) > 0: |
|||
for column in supple.columnInfo: |
|||
suppColumnInfo = MetadataFldSuppInfoVett() |
|||
suppColumnInfo.onum = uuid.uuid4() |
|||
suppColumnInfo.ssys_cd = supple.ssys_cd |
|||
suppColumnInfo.mdl_name = supple.mdl_name |
|||
suppColumnInfo.tab_eng_name = supple.tab_eng_name |
|||
suppColumnInfo.fld_eng_name = column.fld_eng_name |
|||
suppColumnInfo.fld_crrct_name = column.fld_crrct_name |
|||
suppColumnInfo.crrct_pk_flag = column.crrct_pk_flag |
|||
suppColumnInfo.fld_desc = column.fld_desc |
|||
suppColumnInfo.pic = column.pic |
|||
suppColumnInfo.fld_clas = column.fld_clas |
|||
suppColumnInfo.fld_null_rate = column.fld_null_rate |
|||
suppColumnInfo.rec_stat = column.rec_stat |
|||
suppColumnInfo.rec_subm_prsn = current_user.user.user_name |
|||
suppColumnInfo.apply_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") |
|||
suppColumnInfo.apply_status = 'waiting' |
|||
await MetaDao.insertMetadataFldSuppInfoVett(suppColumnInfo, result_db) |
|||
await result_db.commit() |
|||
applyModel = ApplyModel() |
|||
applyModel.businessType = "t_metadata_supp_info" |
|||
applyModel.businessId = tableOnum |
|||
applyModel.applicant = current_user.user.user_name |
|||
await ApprovalService.apply_services(result_db, applyModel) |
|||
return CrudResponseModel(is_success=True, message='操作成功') |
|||
|
|||
@classmethod |
|||
def snake_to_camel(cls, snake_str: str): |
|||
# 将字符串按下划线分割成列表 |
|||
components = snake_str.split('_') |
|||
# 第一个单词保持小写,后续单词首字母大写 |
|||
camel_str = components[0] + ''.join(word.capitalize() for word in components[1:]) |
|||
return camel_str |
|||
|
|||
@classmethod |
|||
def convert_json_keys(cls, data): |
|||
if isinstance(data, dict): |
|||
# 如果数据是字典,则转换键名并递归处理值 |
|||
return {cls.snake_to_camel(k): cls.convert_json_keys(v) for k, v in data.items()} |
|||
elif isinstance(data, list): |
|||
# 如果数据是列表,则递归处理列表中的每个元素 |
|||
return [cls.convert_json_keys(element) for element in data] |
|||
else: |
|||
# 如果数据不是字典或列表,则直接返回(即基本数据类型,如字符串、数字等) |
|||
return data |
@ -0,0 +1,25 @@ |
|||
import request from '@/utils/request' |
|||
|
|||
|
|||
export function getApprovalList(data) { |
|||
return request({ |
|||
url: '/default-api/approval/list', |
|||
method: 'get', |
|||
params: data |
|||
}) |
|||
} |
|||
|
|||
export function getWaitingFlowCount() { |
|||
return request({ |
|||
url: '/default-api/approval/waitingTotal', |
|||
method: 'get' |
|||
}) |
|||
} |
|||
|
|||
export function operateProcess(data) { |
|||
return request({ |
|||
url: '/default-api/approval/operate', |
|||
method: 'post', |
|||
data: data |
|||
}) |
|||
} |
@ -0,0 +1,46 @@ |
|||
import request from '@/utils/request' |
|||
|
|||
// 查询参数列表
|
|||
export function getDataSourceList(query) { |
|||
return request({ |
|||
url: '/ds-api/dolphinscheduler/datasources?pageNo=1&pageSize=100', |
|||
method: 'get', |
|||
headers: {dashUserName:query.userName,dashPassword:query.password} |
|||
}) |
|||
} |
|||
// 查询参数列表
|
|||
export function getMetaDataList(query) { |
|||
return request({ |
|||
url: '/default-api/dasset/meta/get', |
|||
method: 'get', |
|||
params: query |
|||
}) |
|||
} |
|||
|
|||
export function getColumnList(query){ |
|||
return request({ |
|||
url:'/default-api/dasset/meta/column/list', |
|||
method: 'get', |
|||
params: query |
|||
}) |
|||
} |
|||
|
|||
export function getMetaClasList(){ |
|||
return request({ |
|||
url:'/default-api/dasset/meta/clas/list', |
|||
method: 'get', |
|||
}) |
|||
} |
|||
|
|||
export function postMetaSupp(data){ |
|||
return request({ |
|||
url:'/default-api/dasset/meta/supp', |
|||
method: 'post', |
|||
data: data |
|||
}) |
|||
} |
|||
|
|||
|
|||
|
|||
|
|||
|
@ -0,0 +1,72 @@ |
|||
<template> |
|||
<codemirror v-model:value="value" :options="sqlOptions" /> |
|||
</template> |
|||
|
|||
<script setup> |
|||
// sql 编辑器 |
|||
import * as sqlFormatter from "sql-formatter"; |
|||
import Codemirror from 'codemirror-editor-vue3'; |
|||
import 'codemirror/mode/sql/sql.js'; |
|||
import "codemirror/mode/javascript/javascript.js"; |
|||
// language |
|||
import 'codemirror/mode/javascript/javascript.js'; |
|||
// theme 主题 |
|||
import 'codemirror/theme/monokai.css'; |
|||
// 折叠功能 |
|||
import 'codemirror/addon/fold/foldcode.js'; |
|||
import 'codemirror/addon/fold/foldgutter.js'; |
|||
import 'codemirror/addon/fold/foldgutter.css'; |
|||
import 'codemirror/addon/fold/brace-fold.js'; |
|||
// 自动提示 |
|||
import 'codemirror/addon/hint/show-hint.js'; |
|||
import 'codemirror/addon/hint/show-hint.css'; |
|||
import 'codemirror/addon/hint/javascript-hint.js'; |
|||
// 代码校验 lint |
|||
import 'codemirror/addon/lint/lint.js'; |
|||
import 'codemirror/addon/lint/lint.css'; |
|||
import 'codemirror/addon/lint/json-lint'; |
|||
|
|||
// 其他 |
|||
import 'codemirror/addon/edit/matchbrackets.js'; |
|||
import 'codemirror/addon/edit/closebrackets.js'; |
|||
import "codemirror/addon/lint/json-lint.js"; |
|||
import {watch,ref} from "vue"; |
|||
|
|||
const props = defineProps({ |
|||
data: String, |
|||
}) |
|||
const sqlOptions = { |
|||
autorefresh: true, // 是否自动刷新 |
|||
smartIndent: true, // 自动缩进 |
|||
tabSize: 4, // 缩进单元格为 4 个空格 |
|||
mode: 'sql', //编辑器的编程语言 |
|||
line: true, // 是否显示行数 |
|||
viewportMargin: Infinity, // 高度自适应 |
|||
highlightDifferences: true, |
|||
autofocus: false, |
|||
indentUnit: 2, |
|||
readOnly: true, // 只读 |
|||
showCursorWhenSelecting: true, |
|||
firstLineNumber: 1, |
|||
matchBrackets: true,//括号匹配 |
|||
lineWrapping: true, //是否折叠 |
|||
gutters: [ |
|||
"CodeMirror-linenumbers", |
|||
"CodeMirror-foldgutter", |
|||
"CodeMirror-lint-markers", |
|||
], |
|||
lineNumbers: true, //是否显示左边换行数字 |
|||
lint: true, // 打开json校验 |
|||
} |
|||
const value = ref("") |
|||
watch(() => props.data, |
|||
(val) =>{ |
|||
value.value = sqlFormatter.format(val) |
|||
} |
|||
) |
|||
|
|||
</script> |
|||
|
|||
<style scoped lang="scss"> |
|||
|
|||
</style> |
@ -0,0 +1,885 @@ |
|||
<template> |
|||
<div class="app-container"> |
|||
<el-row :gutter="20"> |
|||
<el-col :span="4" :xs="24"> |
|||
<div class="head-container"> |
|||
<el-input |
|||
v-model="database" |
|||
placeholder="请输入搜索系统名/模式名" |
|||
clearable |
|||
prefix-icon="Search" |
|||
style="margin-bottom: 20px" |
|||
/> |
|||
</div> |
|||
<div class="head-container"> |
|||
<el-tree |
|||
:data="databaseList" |
|||
:props="{ label: 'name', children: 'children' }" |
|||
:expand-on-click-node="false" |
|||
:filter-node-method="filterNode" |
|||
ref="databaseTreeRef" |
|||
node-key="id" |
|||
highlight-current |
|||
default-expand-all |
|||
@node-click="handleNodeClick" |
|||
/> |
|||
</div> |
|||
</el-col> |
|||
<el-col :span="20" :xs="24"> |
|||
<el-form :model="queryParams" :inline="true" label-width="75px"> |
|||
<el-form-item label="对象名称:" prop="userName"> |
|||
<el-input |
|||
v-model="queryParams.tabName" |
|||
placeholder="请输入搜索表中文/英文名" |
|||
clearable |
|||
style="width: 240px" |
|||
@keyup.enter="handleQuery" |
|||
/> |
|||
</el-form-item> |
|||
<el-form-item label="列名称:"> |
|||
<el-input |
|||
v-model="queryParams.colName" |
|||
placeholder="请输入搜索字段中文/英文名" |
|||
clearable |
|||
style="width: 240px" |
|||
@keyup.enter="handleQuery" |
|||
/> |
|||
</el-form-item> |
|||
<el-form-item label="对象类型:"> |
|||
<el-select |
|||
v-model="queryParams.tabType" |
|||
placeholder="请输入数据类型" |
|||
clearable |
|||
style="width: 240px" |
|||
> |
|||
<el-option key="TABLE" value="TABLE" label="表"/> |
|||
<el-option key="VIEW" value="VIEW" label="视图"/> |
|||
<el-option key="PROCEDURE" value="PROCEDURE" label="存储过程"/> |
|||
<el-option key="FUNCTION" value="FUNCTION" label="函数"/> |
|||
</el-select> |
|||
</el-form-item> |
|||
<el-form-item label="标签名称:"> |
|||
<el-input |
|||
v-model="queryParams.tagName" |
|||
placeholder="请输入搜索标签名称" |
|||
clearable |
|||
style="width: 240px" |
|||
@keyup.enter="handleQuery" |
|||
/> |
|||
</el-form-item> |
|||
<el-form-item label="补录状态:"> |
|||
<el-input |
|||
v-model="queryParams.recStat" |
|||
placeholder="请输入搜索状态" |
|||
clearable |
|||
style="width: 240px" |
|||
@keyup.enter="handleQuery" |
|||
/> |
|||
</el-form-item> |
|||
<el-form-item> |
|||
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button> |
|||
<el-button icon="Refresh" @click="resetQuery">重置</el-button> |
|||
</el-form-item> |
|||
</el-form> |
|||
<el-row :gutter="10" class="mb8"> |
|||
<el-col :span="1.5"> |
|||
<el-button |
|||
type="primary" |
|||
plain |
|||
icon="Download" |
|||
@click="exportData" |
|||
>导出</el-button> |
|||
</el-col> |
|||
</el-row> |
|||
<el-table v-loading="loading" :data="dataList" @selection-change="handleSelectionChange"> |
|||
<el-table-column type="selection" width="50" align="center" /> |
|||
<el-table-column label="系统英文名" width="100" align="center" prop="ssysCd"></el-table-column> |
|||
<el-table-column label="模式名称" align="center" prop="mdlName"></el-table-column> |
|||
<el-table-column label="对象英文名" width="170" align="center" prop="tabEngName" > |
|||
<template #default="scope"> |
|||
<el-link type="primary" @click="showColumnDialog(scope.row)" :underline="false">{{ scope.row.tabEngName }}</el-link> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column label="对象中文名" width="100" align="center" prop="tabCnName"></el-table-column> |
|||
<el-table-column label="对象标签" width="250" align="center" prop="clasNames"></el-table-column> |
|||
<el-table-column label="记录数" width="80" align="center" prop="tabRecNum"></el-table-column> |
|||
<el-table-column label="补录对象名称" width="150" align="center" prop="tabCrrctName"></el-table-column> |
|||
<el-table-column label="补录对象描述" width="150" align="center" prop="tabDesc"></el-table-column> |
|||
<el-table-column label="对象类型" align="center" prop="tabType"></el-table-column> |
|||
<el-table-column label="对象治理标志" width="120" align="center" prop="govFlag"></el-table-column> |
|||
<el-table-column label="补录审批状态" width="120" align="center" prop="recStat"></el-table-column> |
|||
<el-table-column label="负责人" align="center" prop="pic"></el-table-column> |
|||
<el-table-column label="采集时间" width="200" align="center" prop="extractUpdTime"> |
|||
<template #default="scope"> |
|||
<span>{{scope.row.extractUpdTime.replace("T"," ")}}</span> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column label="补录时间" align="center" prop="suppUpdTime"></el-table-column> |
|||
</el-table> |
|||
<pagination |
|||
v-show="total > 0" |
|||
:total="total" |
|||
v-model:page="queryParams.pageNum" |
|||
v-model:limit="queryParams.pageSize" |
|||
@pagination="getList" |
|||
/> |
|||
</el-col> |
|||
</el-row> |
|||
<el-drawer v-model="drawer" size="80%" :show-close="false"> |
|||
<template #header> |
|||
<h3>元数据信息</h3> |
|||
<div style="flex: none"> |
|||
<el-button @click="cancel">取消</el-button> |
|||
<el-button type="primary" @click="submit">提交</el-button> |
|||
</div> |
|||
</template> |
|||
<template #default> |
|||
<el-row :gutter="20"> |
|||
<el-col :span="12" :xs="24"> |
|||
<el-form :model="currentMetaData" :inline="true" label-width="120px"> |
|||
<el-form-item label="对象英文名"> |
|||
<el-input |
|||
v-model="currentMetaData.tabEngName" |
|||
disabled |
|||
/> |
|||
</el-form-item> |
|||
<el-form-item label="对象中文名"> |
|||
<el-input |
|||
v-model="currentMetaData.tabCnName" |
|||
disabled |
|||
/> |
|||
</el-form-item> |
|||
<el-form-item label="所属系统"> |
|||
<el-input |
|||
v-model="currentMetaData.ssysCd" |
|||
disabled |
|||
/> |
|||
</el-form-item> |
|||
<el-form-item label="所属SCHEMA"> |
|||
<el-input |
|||
v-model="currentMetaData.mdlName" |
|||
disabled |
|||
/> |
|||
</el-form-item> |
|||
<el-form-item label="补录对象名称"> |
|||
<el-input |
|||
v-model="currentMetaData.tabCrrctName" |
|||
placeholder="补录对象名称" |
|||
clearable |
|||
/> |
|||
</el-form-item> |
|||
<el-form-item label="补录对象描述"> |
|||
<el-input |
|||
v-model="currentMetaData.tabDesc" |
|||
placeholder="请输入描述内容" |
|||
clearable |
|||
/> |
|||
</el-form-item> |
|||
<el-form-item label="对象治理标志"> |
|||
<el-select |
|||
v-model="currentMetaData.govFlag" |
|||
placeholder="请输入数据类型" |
|||
clearable |
|||
style="width: 192px" |
|||
> |
|||
<el-option key="0" :value="'0'" label="是"/> |
|||
<el-option key="1" :value="'1'" label="否"/> |
|||
</el-select> |
|||
</el-form-item> |
|||
<el-form-item label="对象负责人"> |
|||
<el-input |
|||
v-model="currentMetaData.pic" |
|||
placeholder="请输入搜索状态" |
|||
clearable |
|||
/> |
|||
</el-form-item> |
|||
</el-form> |
|||
</el-col> |
|||
<el-col :span="12" :xs="24"> |
|||
<el-divider content-position="left">对象标签集合 |
|||
<el-button icon="Plus" type="primary" text @click="openTableTagsDialog">新增</el-button> |
|||
</el-divider> |
|||
<el-tag style="margin-left: 10px;margin-top: 10px" v-for="tag in currentMetaData.tags" :key="tag.tagName +'-'+tag.tagValue" size="large" closable type="primary" @close="handleTableTagClose(tag)"> |
|||
{{ tag.tagName }} |
|||
</el-tag> |
|||
</el-col> |
|||
</el-row> |
|||
<el-row :gutter="20"> |
|||
<el-col :span="24"> |
|||
<el-tabs v-model="activeColumnTab" type="border-card" class="full-height-tabs" @tab-change="changeColumnTab"> |
|||
<el-tab-pane label="字段信息" name="column"> |
|||
<div class="table-container"> |
|||
<el-table :data="columnList" height="100%"> |
|||
<el-table-column label="字段英文名" width="100" align="center" prop="fldEngName"> |
|||
<template #default="scope"> |
|||
<el-link type="primary" @click="openEditColumnDialog(scope.row,scope.$index)" :underline="false">{{ scope.row.fldEngName }}</el-link> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column label="字段中文名" align="center" prop="fldCnName"></el-table-column> |
|||
<el-table-column label="字段类型" width="170" align="center" prop="fldType" ></el-table-column> |
|||
<el-table-column label="主键标志" width="100" align="center" prop="pkFlag"> |
|||
<template #default="scope"> |
|||
<span v-if="scope.row.pkFlag === '1' || scope.row.pkFlag === 'Y' || scope.row.pkFlag === true">是</span> |
|||
<span v-else>否</span> |
|||
</template> |
|||
</el-table-column> |
|||
<!-- <el-table-column label="字段描述" width="250" align="center" prop="fldDesc"></el-table-column>--> |
|||
<el-table-column label="是否必填" width="70" align="center" prop="requireFlag"> |
|||
<template #default="scope"> |
|||
<span v-if="scope.row.requireFlag === '1' || scope.row.requireFlag === 'Y' || scope.row.requireFlag === true">是</span> |
|||
<span v-else>否</span> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column label="是否索引" width="150" align="center" prop="idxFlag"> |
|||
<template #default="scope"> |
|||
<span v-if="scope.row.idxFlag === '1' || scope.row.idxFlag === 'Y' || scope.row.idxFlag === true">是</span> |
|||
<span v-else>否</span> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column label="字段补录名" width="150" align="center" prop="fldCrrctName"> |
|||
<template #default="scope"> |
|||
<span v-if="oldColumnsData[scope.$index].fldCrrctName" style="color:#67C23A">{{scope.row.fldCrrctName}}</span> |
|||
<span v-else>{{scope.row.fldCrrctName}}</span> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column label="补录主键" align="center" prop="crrctPkFlag"> |
|||
<template #default="scope"> |
|||
<span v-if="oldColumnsData[scope.$index].crrctPkFlag" style="color:#67C23A">{{scope.row.crrctPkFlag}}</span> |
|||
<span v-else>{{scope.row.crrctPkFlag}}</span> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column label="补录字段描述" align="center" prop="fldDesc"> |
|||
<template #default="scope"> |
|||
<span v-if="oldColumnsData[scope.$index].fldDesc" style="color:#67C23A">{{scope.row.fldDesc}}</span> |
|||
<span v-else>{{scope.row.fldDesc}}</span> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column label="状态" width="120" align="center" prop="suppRecStat"> |
|||
<template #default="scope"> |
|||
<span v-if="oldColumnsData[scope.$index].suppRecStat" style="color:#67C23A">{{scope.row.suppRecStat}}</span> |
|||
<span v-else>{{scope.row.suppRecStat}}</span> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column label="负责人" align="center" prop="pic"> |
|||
<template #default="scope"> |
|||
<span v-if="oldColumnsData[scope.$index].pic" style="color:#67C23A">{{scope.row.pic}}</span> |
|||
<span v-else>{{scope.row.pic}}</span> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column label="字段标签" width="150" align="center" prop="fldClas"> |
|||
<template #default="scope"> |
|||
<el-tag v-for="item in JSON.parse(scope.row.fldClas)">{{item.tagName}}</el-tag> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column label="字段空值率" align="center" prop="fldNullRate"> |
|||
<template #default="scope"> |
|||
<span v-if="oldColumnsData[scope.$index].fldNullRate" style="color:#67C23A">{{scope.row.fldNullRate}}</span> |
|||
<span v-else>{{scope.row.fldNullRate}}</span> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column label="引用字典/标准" align="center" prop="suppUpdTime"></el-table-column> |
|||
<el-table-column label="更新时间" align="center" prop="suppUpdTime"></el-table-column> |
|||
</el-table> |
|||
</div> |
|||
</el-tab-pane> |
|||
<el-tab-pane label="业务关系" name="businessRelation">Config</el-tab-pane> |
|||
<el-tab-pane label="血缘关系" name="bloodRelation">Role</el-tab-pane> |
|||
<el-tab-pane label="存储过程" name="proc"> |
|||
<SQLCodeMirror :data="procStr"></SQLCodeMirror> |
|||
</el-tab-pane> |
|||
</el-tabs> |
|||
</el-col> |
|||
</el-row> |
|||
</template> |
|||
</el-drawer> |
|||
<el-dialog |
|||
v-model="tableTagDialog" |
|||
title="配置标签分类" |
|||
width="1100" |
|||
> |
|||
<el-form :model="currentTableTag" :inline="true" label-width="75px"> |
|||
<el-form-item label="一级分类:" prop="userName"> |
|||
<el-input |
|||
v-model="currentTableTag.clasPriClas" |
|||
disabled |
|||
style="width: 240px" |
|||
/> |
|||
</el-form-item> |
|||
<el-form-item label="二级分类:"> |
|||
<el-input |
|||
v-model="currentTableTag.clasScdClas" |
|||
disabled |
|||
style="width: 240px" |
|||
/> |
|||
</el-form-item> |
|||
<el-form-item label="三级分类:"> |
|||
<el-input |
|||
v-model="currentTableTag.clasThreClas" |
|||
disabled |
|||
style="width: 240px" |
|||
></el-input> |
|||
</el-form-item> |
|||
<el-form-item label="选择标签:"> |
|||
<el-select |
|||
v-model="currentTableTag.clasOnum" |
|||
filterable |
|||
style="width: 240px" |
|||
@change="changeTableTag" |
|||
> |
|||
<el-option v-for="item in metaClasList" :key="item.clasOnum" :value="item.clasOnum" :label="item.clasOnum+' - '+item.clasName"/> |
|||
</el-select> |
|||
</el-form-item> |
|||
<el-form-item> |
|||
<el-button type="primary" icon="Plus" @click="addTableTag">新增</el-button> |
|||
</el-form-item> |
|||
</el-form> |
|||
<el-table v-loading="loading" :data="tableTags"> |
|||
<el-table-column label="标签编号" width="80" align="center" prop="tagOnum"></el-table-column> |
|||
<el-table-column label="标签名称" width="120" align="center" prop="tagName"></el-table-column> |
|||
<el-table-column label="标签值" width="170" align="center" prop="tagValue" > |
|||
<template #default="scope"> |
|||
<el-input v-model="scope.row.tagValue"></el-input> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column label="标签值说明" width="170" align="center" prop="tagRemark"> |
|||
<template #default="scope"> |
|||
<el-input v-model="scope.row.tagRemark"></el-input> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column label="标签状态" align="center" prop="tagStatus"> |
|||
<template #default="scope"> |
|||
<el-input v-model="scope.row.tagStatus"></el-input> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column label="设置方式" width="80" align="center" prop="tagSource"></el-table-column> |
|||
<el-table-column label="设置对象" width="80" align="center" prop="setUser"></el-table-column> |
|||
<el-table-column label="设置时间" width="150" align="center" prop="setTime"></el-table-column> |
|||
<el-table-column label="操作" align="center" width="80"> |
|||
<template #default="scope"> |
|||
<el-button link type="primary" icon="Delete" @click.prevent="deleteTableTag(scope.$index)">删除</el-button> |
|||
</template> |
|||
</el-table-column> |
|||
</el-table> |
|||
|
|||
<template #footer> |
|||
<div class="dialog-footer"> |
|||
<el-button @click="tableTagDialog = false">取消</el-button> |
|||
<el-button type="primary" @click="confirmTableTags"> |
|||
确定 |
|||
</el-button> |
|||
</div> |
|||
</template> |
|||
</el-dialog> |
|||
<el-dialog |
|||
v-model="columnInfoDialog" |
|||
title="字段信息" |
|||
width="1100" |
|||
> |
|||
<el-form :model="currentColumnData" :inline="true" label-width="100px"> |
|||
<el-form-item label="字段英文名"> |
|||
<el-input disabled v-model="currentColumnData.fldEngName"></el-input> |
|||
</el-form-item> |
|||
<el-form-item label="字段中文名"> |
|||
<el-input disabled v-model="currentColumnData.fldCnName"></el-input> |
|||
</el-form-item> |
|||
<el-form-item label="字段类型"> |
|||
<el-input disabled v-model="currentColumnData.fldType"></el-input> |
|||
</el-form-item> |
|||
<el-form-item label="主键标志"> |
|||
<template v-if="currentColumnData.pkFlag === '1' || currentColumnData.pkFlag === 'Y' || currentColumnData.pkFlag === true"> |
|||
<el-input disabled :model-value="'是'"></el-input> |
|||
</template> |
|||
<template v-else> |
|||
<el-input disabled :model-value="'否'"></el-input> |
|||
</template> |
|||
</el-form-item> |
|||
<el-form-item label="是否必填"> |
|||
<template v-if="currentColumnData.requireFlag === '1' || currentColumnData.requireFlag === 'Y' || currentColumnData.requireFlag === true"> |
|||
<el-input disabled :model-value="'是'"></el-input> |
|||
</template> |
|||
<template v-else> |
|||
<el-input disabled :model-value="'否'"></el-input> |
|||
</template> |
|||
</el-form-item> |
|||
<el-form-item label="是否索引"> |
|||
<template v-if="currentColumnData.idxFlag === '1' || currentColumnData.idxFlag === 'Y' || currentColumnData.idxFlag === true"> |
|||
<el-input disabled :model-value="'是'"></el-input> |
|||
</template> |
|||
<template v-else> |
|||
<el-input disabled :model-value="'否'"></el-input> |
|||
</template> |
|||
</el-form-item> |
|||
<el-form-item label="字段补录名"> |
|||
<el-input v-model="currentColumnData.fldCrrctName"></el-input> |
|||
</el-form-item> |
|||
<el-form-item label="补录字段描述"> |
|||
<el-input v-model="currentColumnData.fldDesc"/> |
|||
</el-form-item> |
|||
<el-form-item label="补录主键"> |
|||
<div style="width: 192px"> |
|||
<el-switch v-model="currentColumnData.crrctPkFlag"/> |
|||
</div> |
|||
</el-form-item> |
|||
<el-form-item label="状态"> |
|||
<el-input v-model="currentColumnData.suppRecStat"/> |
|||
</el-form-item> |
|||
<el-form-item label="负责人"> |
|||
<el-input v-model="currentColumnData.pic"/> |
|||
</el-form-item> |
|||
<el-form-item label="字段空值率"> |
|||
<el-input v-model="currentColumnData.fldNullRate"/> |
|||
</el-form-item> |
|||
</el-form> |
|||
<el-form :model="currentColumnTag" :inline="true" label-width="100px"> |
|||
<el-form-item label="一级分类:" prop="userName"> |
|||
<el-input |
|||
v-model="currentColumnTag.clasPriClas" |
|||
disabled |
|||
/> |
|||
</el-form-item> |
|||
<el-form-item label="二级分类:"> |
|||
<el-input |
|||
v-model="currentColumnTag.clasScdClas" |
|||
disabled |
|||
/> |
|||
</el-form-item> |
|||
<el-form-item label="三级分类:"> |
|||
<el-input |
|||
v-model="currentColumnTag.clasThreClas" |
|||
disabled |
|||
></el-input> |
|||
</el-form-item> |
|||
<el-form-item label="选择标签:"> |
|||
<el-select |
|||
v-model="currentColumnTag.clasOnum" |
|||
filterable |
|||
style="width: 192px" |
|||
@change="changeColumnTag" |
|||
> |
|||
<el-option v-for="item in metaClasList" :key="item.clasOnum" :value="item.clasOnum" :label="item.clasOnum+' - '+item.clasName"/> |
|||
</el-select> |
|||
</el-form-item> |
|||
<el-form-item> |
|||
<el-button type="primary" icon="Plus" @click="addColumnTag">新增</el-button> |
|||
</el-form-item> |
|||
</el-form> |
|||
<el-table :data="currentColumnData.fldClas"> |
|||
<el-table-column label="标签编号" width="80" align="center" prop="tagOnum"></el-table-column> |
|||
<el-table-column label="标签名称" width="120" align="center" prop="tagName"></el-table-column> |
|||
<el-table-column label="标签值" width="170" align="center" prop="tagValue" > |
|||
<template #default="scope"> |
|||
<el-input v-model="scope.row.tagValue"></el-input> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column label="标签值说明" width="170" align="center" prop="tagRemark"> |
|||
<template #default="scope"> |
|||
<el-input v-model="scope.row.tagRemark"></el-input> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column label="标签状态" align="center" prop="tagStatus"> |
|||
<template #default="scope"> |
|||
<el-input v-model="scope.row.tagStatus"></el-input> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column label="设置方式" width="80" align="center" prop="tagSource"></el-table-column> |
|||
<el-table-column label="设置对象" width="80" align="center" prop="setUser"></el-table-column> |
|||
<el-table-column label="设置时间" width="150" align="center" prop="setTime"></el-table-column> |
|||
<el-table-column label="操作" align="center" width="80"> |
|||
<template #default="scope"> |
|||
<el-button link type="primary" icon="Delete" @click.prevent="deleteColumnTag(scope.$index)">删除</el-button> |
|||
</template> |
|||
</el-table-column> |
|||
</el-table> |
|||
<template #footer> |
|||
<div class="dialog-footer"> |
|||
<el-button @click="columnInfoDialog = false">取消</el-button> |
|||
<el-button type="primary" @click="confirmColumn"> |
|||
确定 |
|||
</el-button> |
|||
</div> |
|||
</template> |
|||
</el-dialog> |
|||
</div> |
|||
</template> |
|||
|
|||
<script setup name="Meta"> |
|||
import {getDataSourceList, getMetaDataList, getColumnList, getMetaClasList, postMetaSupp} from "@/api/meta/metaInfo.js" |
|||
import { ref, nextTick, computed, watch, reactive, onMounted } from 'vue' |
|||
import SQLCodeMirror from "@/components/codemirror/SQLCodeMirror.vue"; |
|||
import cache from "@/plugins/cache.js"; |
|||
|
|||
|
|||
const data = reactive({ |
|||
queryParams:{ |
|||
ssysCd:'', |
|||
mdlName:'', |
|||
tabName:'', |
|||
colName:'', |
|||
tabType:'', |
|||
tagName:'', |
|||
recStat:'', |
|||
pageNum:1, |
|||
pageSize:10 |
|||
}, |
|||
currentMetaData: { |
|||
tabEngName:'', |
|||
tabCnName:'', |
|||
ssysCd:'', |
|||
mdlName:'', |
|||
tabCrrctName:'', |
|||
tabDesc:'', |
|||
govFlag:null, |
|||
pic:'', |
|||
tags:[] |
|||
} |
|||
}) |
|||
const { queryParams, currentMetaData } = toRefs(data); |
|||
const loading = ref(true); |
|||
const drawer = ref(false); |
|||
const dataList = ref([]); |
|||
const columnList = ref([]); |
|||
const tableTagDialog = ref(false); |
|||
const metaClasList = ref([]); |
|||
const columnInfoDialog = ref(false); |
|||
const currentColumnData = ref({}); |
|||
const oldColumnsData = ref([]); |
|||
const currentTableTag = ref({ |
|||
"clasThreClas": "", |
|||
"clasOnum": null, |
|||
"clasName": "", |
|||
"recSubmPrsn": "", |
|||
"clasPriClas": "", |
|||
"clasScdClas": "" |
|||
}); |
|||
const currentColumnTag = ref({ |
|||
"clasThreClas": "", |
|||
"clasOnum": null, |
|||
"clasName": "", |
|||
"recSubmPrsn": "", |
|||
"clasPriClas": "", |
|||
"clasScdClas": "" |
|||
}); |
|||
const columnParam = ref({ |
|||
total:0, |
|||
pageNum:1, |
|||
pageSize:10 |
|||
}); |
|||
const total = ref(0); |
|||
const databaseList = ref([]); |
|||
const tableTags = ref([]); |
|||
const database = ref(""); |
|||
const procStr = ref(""); |
|||
const activeColumnTab = ref("column"); |
|||
const { proxy } = getCurrentInstance(); |
|||
const changedColumns = ref([]) |
|||
function changeColumnTab(){ |
|||
if (activeColumnTab.value === 'proc'){ |
|||
procStr.value = "--基金量化产品监管报送存储过程:ADS.SP_ADS_SAC_QNTPRD_ALL\n" + |
|||
"CREATE OR REPLACE PROCEDURE ADS.SP_ADS_SAC_QNTPRD_ALL(I_BUSI_DATE VARCHAR2, O_RET_CODE OUT NUMBER, O_RET_MSG OUT VARCHAR2) AS V_STATUS NUMBER DEFAULT 0; --状态,0:成功,-1失败 \n V_ETL_NAME VARCHAR2(50) DEFAULT 'ADS.SP_ADS_SAC_QNTPRD_ALL'; V_ETL_NAME_CN VARCHAR2(100) DEFAULT '量化产品监管报送报表总调度'; ----ETL中文名称 V_ETL_TYPE NUMBER DEFAULT 1; --ETL类型,0:采集,1:转换 V_START_TIME DATE DEFAULT SYSDATE; --开始时间 V_MSG VARCHAR2(1000) DEFAULT '成功'; ----ETL信息 V_SOURCE_TABLE VARCHAR2(200) DEFAULT 'ADS.SP_ADS_SAC_QNTPRD_DTL,ADS.SP_ADS_SAC_QNTPRD_AGGR'; V_DEST_TABLE VARCHAR2(200) DEFAULT 'ADS.T_ADS_SAC_QNTPRD_DTL_M_M_OC,ADS.T_ADS_SAC_QNTPRD_AGGR_M_M_OC'; V_SRC_CNT NUMBER DEFAULT 0; --源数据量 V_DEST_CNT NUMBER DEFAULT 0; --目标新增数据量 V_CNT NUMBER; V_SOURCE_CODE VARCHAR2(4) ; V_DATE DATE DEFAULT TO_DATE(I_BUSI_DATE,'YYYY-MM-DD'); --每月第一个交易日 V_RET_CODE NUMBER; V_RET_MSG VARCHAR2(4000); BEGIN O_RET_CODE := 0; O_RET_MSG := 'SUCCESS'; --每个月第一个交易日更新数据 SELECT T.TM_SH_FST_TRDY_FLAG INTO V_CNT FROM DWS.T_DWS_DIM_DATE_OC T WHERE T.D_DATE= V_DATE; IF V_CNT = 0 THEN RETURN; END IF; --加载明细表数据 ADS.SP_ADS_SAC_QNTPRD_DTL (I_BUSI_DATE => I_BUSI_DATE, --每月第一个交易日 O_RET_CODE => V_RET_CODE, O_RET_MSG => V_RET_MSG ) ; IF V_RET_CODE <> 0 THEN O_RET_CODE := V_RET_CODE; O_RET_MSG := V_RET_MSG; RETURN; END IF; --加载汇总表数据 ADS.SP_ADS_SAC_QNTPRD_AGGR(I_BUSI_DATE => I_BUSI_DATE, --每月第一个交易日 O_RET_CODE => V_RET_CODE, O_RET_MSG => V_RET_MSG ) ; IF V_RET_CODE <> 0 THEN O_RET_CODE := V_RET_CODE; O_RET_MSG := V_RET_MSG; RETURN; END IF; --日志:判断是否源表目标表的数量是否相同,如不相同则修改日志校验MSG --日志:写日志 DWS.SP_DWT_LOG(I_ETL_NAME => V_ETL_NAME, I_ETL_NAME_CN => V_ETL_NAME_CN, I_ETL_TYPE => V_ETL_TYPE, I_START_TIME => V_START_TIME, I_END_TIME => SYSDATE, I_STATUS => V_STATUS, I_MSG => V_MSG, I_SOURCE_TABLES => V_SOURCE_TABLE, I_DEST_TABLES => V_DEST_TABLE, I_SRC_CNT => V_SRC_CNT, I_DEST_CNT => V_DEST_CNT, I_VERI_SRC_CNT => NULL, I_VERI_DEST_CNT => NULL, I_VERI_MSG => NULL, I_VERI_STATUS => NULL, I_BUSI_DATE => I_BUSI_DATE); EXCEPTION WHEN OTHERS THEN O_RET_CODE := -1; O_RET_MSG := SQLCODE || ',' || SQLERRM; ROLLBACK; V_STATUS := -1; V_MSG := O_RET_MSG; DWS.SP_DWT_LOG(I_ETL_NAME => V_ETL_NAME, I_ETL_NAME_CN => V_ETL_NAME_CN, I_ETL_TYPE => V_ETL_TYPE, I_START_TIME => V_START_TIME, I_END_TIME => SYSDATE, I_STATUS => V_STATUS, I_MSG => V_MSG, I_SOURCE_TABLES => V_SOURCE_TABLE, I_DEST_TABLES => V_DEST_TABLE, I_SRC_CNT => V_SRC_CNT, I_DEST_CNT => V_DEST_CNT, I_VERI_SRC_CNT => NULL, I_VERI_DEST_CNT => NULL, I_VERI_MSG => NULL, I_VERI_STATUS => NULL, I_BUSI_DATE => I_BUSI_DATE); END;" |
|||
} |
|||
} |
|||
function confirmTableTags(){ |
|||
currentMetaData.value.tags = JSON.parse(JSON.stringify(tableTags.value)) |
|||
tableTagDialog.value = false |
|||
} |
|||
function confirmColumn(){ |
|||
for (let i = 0; i < columnList.value.length; i++) { |
|||
if (columnList.value[i].fldEngName === currentColumnData.value.fldEngName){ |
|||
if (columnList.value[i].fldCrrctName !== currentColumnData.value.fldCrrctName){ |
|||
columnList.value[i].fldCrrctName = currentColumnData.value.fldCrrctName |
|||
oldColumnsData.value[i].fldCrrctName = true |
|||
} |
|||
if (columnList.value[i].fldDesc !== currentColumnData.value.fldDesc){ |
|||
columnList.value[i].fldDesc = currentColumnData.value.fldDesc |
|||
oldColumnsData.value[i].fldDesc = true |
|||
} |
|||
if (columnList.value[i].crrctPkFlag !== currentColumnData.value.crrctPkFlag){ |
|||
columnList.value[i].crrctPkFlag = currentColumnData.value.crrctPkFlag |
|||
oldColumnsData.value[i].crrctPkFlag = true |
|||
} |
|||
if (columnList.value[i].suppRecStat !== currentColumnData.value.suppRecStat){ |
|||
columnList.value[i].suppRecStat = currentColumnData.value.suppRecStat |
|||
oldColumnsData.value[i].suppRecStat = true |
|||
} |
|||
if (columnList.value[i].pic !== currentColumnData.value.pic){ |
|||
columnList.value[i].pic = currentColumnData.value.pic |
|||
oldColumnsData.value[i].pic = true |
|||
} |
|||
if (columnList.value[i].fldNullRate !== currentColumnData.value.fldNullRate){ |
|||
columnList.value[i].fldNullRate = currentColumnData.value.fldNullRate |
|||
oldColumnsData.value[i].fldNullRate = true |
|||
} |
|||
if (columnList.value[i].fldClas !== null && columnList.value[i].fldClas !== ''){ |
|||
if (JSON.parse(columnList.value[i].fldClas) !== currentColumnData.value.fldClas){ |
|||
columnList.value[i].fldClas = JSON.stringify(currentColumnData.value.fldClas) |
|||
oldColumnsData.value[i].fldClas = true |
|||
} |
|||
}else { |
|||
if (currentColumnData.value.fldClas.length > 0){ |
|||
columnList.value[i].fldClas = JSON.stringify(currentColumnData.value.fldClas) |
|||
oldColumnsData.value[i].fldClas = true |
|||
} |
|||
} |
|||
} |
|||
} |
|||
columnInfoDialog.value = false |
|||
changedColumns.value.push(currentColumnData.value) |
|||
} |
|||
function addTableTag(){ |
|||
let json = JSON.parse(JSON.stringify(currentTableTag.value)) |
|||
if (json.clasOnum !== null){ |
|||
tableTags.value.push({ |
|||
tagOnum: json.clasOnum, |
|||
tagName: json.clasName, |
|||
tagValue: '', |
|||
tagRemark:'', |
|||
tagStatus:'', |
|||
tagSource:'手工', |
|||
setUser: cache.local.get("username"), |
|||
setTime: getNowDateTime() |
|||
}) |
|||
} else { |
|||
proxy.$modal.msgWarning("请选择一个标签"); |
|||
} |
|||
|
|||
} |
|||
function addColumnTag(){ |
|||
let json = JSON.parse(JSON.stringify(currentColumnTag.value)) |
|||
if (json.clasOnum !== null){ |
|||
currentColumnData.value.fldClas.push({ |
|||
tagOnum: json.clasOnum, |
|||
tagName: json.clasName, |
|||
tagValue: '', |
|||
tagRemark:'', |
|||
tagStatus:'', |
|||
tagSource:'手工', |
|||
setUser: cache.local.get("username"), |
|||
setTime: getNowDateTime() |
|||
}) |
|||
} else { |
|||
proxy.$modal.msgWarning("请选择一个标签"); |
|||
} |
|||
|
|||
} |
|||
function getNowDateTime(){ |
|||
const now = new Date(); |
|||
const year = now.getFullYear(); |
|||
const month = String(now.getMonth() + 1).padStart(2, '0'); |
|||
const day = String(now.getDate()).padStart(2, '0'); |
|||
const hours = String(now.getHours()).padStart(2, '0'); |
|||
const minutes = String(now.getMinutes()).padStart(2, '0'); |
|||
const seconds = String(now.getSeconds()).padStart(2, '0'); |
|||
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; |
|||
|
|||
} |
|||
function deleteTableTag(index){ |
|||
tableTags.value.splice(index,1) |
|||
} |
|||
function deleteColumnTag(index){ |
|||
currentColumnData.value.fldClas.splice(index,1) |
|||
} |
|||
function changeTableTag(){ |
|||
if (typeof currentTableTag.value.clasOnum !== null){ |
|||
for (let i = 0; i <metaClasList.value.length; i++) { |
|||
let item = metaClasList.value[i] |
|||
if (item.clasOnum === currentTableTag.value.clasOnum){ |
|||
currentTableTag.value = item |
|||
} |
|||
} |
|||
} |
|||
} |
|||
function changeColumnTag(){ |
|||
if (typeof currentColumnTag.value.clasOnum !== null){ |
|||
for (let i = 0; i <metaClasList.value.length; i++) { |
|||
let item = metaClasList.value[i] |
|||
if (item.clasOnum === currentColumnTag.value.clasOnum){ |
|||
currentColumnTag.value = item |
|||
} |
|||
} |
|||
} |
|||
} |
|||
function handleTableTagClose(tag){ |
|||
for (let i = 0; i < currentMetaData.value.tags.length; i++) { |
|||
if (tag.tagName === currentMetaData.value.tags[i].tagName && tag.tagValue === currentMetaData.value.tags[i].tagValue){ |
|||
currentMetaData.value.tags.splice(i, 1); |
|||
} |
|||
} |
|||
} |
|||
function openTableTagsDialog(){ |
|||
tableTagDialog.value = true |
|||
currentTableTag.value = { |
|||
"clasThreClas": "", |
|||
"clasOnum": null, |
|||
"clasName": "", |
|||
"recSubmPrsn": "", |
|||
"clasPriClas": "", |
|||
"clasScdClas": "" |
|||
} |
|||
tableTags.value = JSON.parse(JSON.stringify(currentMetaData.value.tags)) |
|||
getMetaClasList().then(res=>{ |
|||
metaClasList.value = res.data |
|||
}) |
|||
} |
|||
function openEditColumnDialog(row,index){ |
|||
columnInfoDialog.value = true |
|||
currentColumnData.value = JSON.parse(JSON.stringify(row)) |
|||
currentColumnTag.value = { |
|||
"clasThreClas": "", |
|||
"clasOnum": null, |
|||
"clasName": "", |
|||
"recSubmPrsn": "", |
|||
"clasPriClas": "", |
|||
"clasScdClas": "" |
|||
} |
|||
currentColumnData.value.fldClas = row.fldClas === null?[]:JSON.parse(row.fldClas) |
|||
getMetaClasList().then(res=>{ |
|||
metaClasList.value = res.data |
|||
}) |
|||
} |
|||
function showColumnDialog(row) { |
|||
let tableData = JSON.parse(JSON.stringify(row)) |
|||
currentMetaData.value = { |
|||
tabEngName: tableData.tabEngName, |
|||
tabCnName: tableData.tabCnName, |
|||
ssysCd: tableData.ssysCd, |
|||
mdlName:tableData.mdlName, |
|||
tabCrrctName:tableData.tabCrrctName, |
|||
tabDesc:tableData.tabDesc, |
|||
govFlag:tableData.govFlag, |
|||
pic:tableData.pic, |
|||
tags: tableData.tabClas? JSON.parse(tableData.tabClas):[] |
|||
} |
|||
let columnData = { |
|||
tabName: row.tabEngName, |
|||
ssysCd: row.ssysCd, |
|||
mdlName: row.mdlName |
|||
} |
|||
getColumnList(columnData).then(res=>{ |
|||
columnList.value = res.data |
|||
oldColumnsData.value = [] |
|||
for (let i = 0; i < columnList.value.length; i++) { |
|||
oldColumnsData.value.push({ |
|||
fldCrrctName:false, |
|||
crrctPkFlag:false, |
|||
fldDesc:false, |
|||
pic:false, |
|||
}) |
|||
} |
|||
}) |
|||
drawer.value = true |
|||
changedColumns.value = [] |
|||
} |
|||
|
|||
function getDatabaseList() { |
|||
let query = { |
|||
userName:cache.local.get("username"), |
|||
password:cache.local.get("password") |
|||
} |
|||
getDataSourceList(query).then(res=>{ |
|||
databaseList.value = [{ id: 100, name: "数据源", parentId: 0, children: res.data.totalList.map(element => ({ ...element, parentId: "100" })) }] |
|||
}) |
|||
} |
|||
function handleQuery(){ |
|||
queryParams.value.pageNum = 1; |
|||
getList() |
|||
} |
|||
function resetQuery(){ |
|||
queryParams.value ={ |
|||
ssysCd:'', |
|||
mdlName:'', |
|||
tabName:'', |
|||
colName:'', |
|||
tabType:'', |
|||
tagName:'', |
|||
recStat:'', |
|||
pageNum:1, |
|||
pageSize:10 |
|||
} |
|||
proxy.$refs.databaseTreeRef.setCurrentKey(null); |
|||
handleQuery() |
|||
} |
|||
|
|||
function handleSelectionChange(){ |
|||
|
|||
} |
|||
|
|||
function getList(){ |
|||
getMetaDataList(queryParams.value).then(res=>{ |
|||
dataList.value = res.data.rows |
|||
loading.value = false |
|||
total.value = res.data.total |
|||
}) |
|||
} |
|||
|
|||
function exportData(){ |
|||
|
|||
} |
|||
const filterNode = (value, data) => { |
|||
if (!value) return true; |
|||
return data.name.indexOf(value) !== -1; |
|||
}; |
|||
function handleNodeClick(data) { |
|||
queryParams.value.ssysCd = data.name; |
|||
handleQuery(); |
|||
} |
|||
watch(database, val => { |
|||
proxy.$refs["databaseTreeRef"].filter(val); |
|||
}); |
|||
function submit(){ |
|||
let data = { |
|||
ssysCd: currentMetaData.value.ssysCd, |
|||
mdlName: currentMetaData.value.mdlName, |
|||
tabEngName: currentMetaData.value.tabEngName, |
|||
tabCrrctName: currentMetaData.value.tabCrrctName, |
|||
tabDesc: currentMetaData.value.tabDesc, |
|||
pic: currentMetaData.value.pic, |
|||
govFlag: currentMetaData.value.govFlag, |
|||
tabClas: JSON.stringify(currentMetaData.value.tags), |
|||
columnInfo: [] |
|||
} |
|||
if (changedColumns.value.length > 0){ |
|||
for (let i = 0; i < changedColumns.value.length; i++) { |
|||
let column = changedColumns.value[i] |
|||
data.columnInfo.push({ |
|||
fldEngName: column.fldEngName, |
|||
fldCrrctName: column.fldCrrctName, |
|||
crrctPkFlag: column.crrctPkFlag, |
|||
fldDesc: column.fldDesc, |
|||
pic: column.pic, |
|||
fldClas: JSON.stringify(column.fldClas), |
|||
fldNullRate: column.fldNullRate, |
|||
recStat: column.recStat |
|||
}) |
|||
} |
|||
} |
|||
postMetaSupp(data).then(res=>{ |
|||
proxy.$modal.msgSuccess("操作成功"); |
|||
drawer.value = false |
|||
getList() |
|||
}) |
|||
} |
|||
function cancel(){ |
|||
drawer.value = false |
|||
} |
|||
onMounted(()=>{ |
|||
getDatabaseList() |
|||
handleQuery() |
|||
}) |
|||
</script> |
|||
|
|||
<style scoped lang="scss"> |
|||
:deep(.el-drawer__header) { |
|||
margin-bottom: 0 !important; |
|||
} |
|||
.full-height-tabs { |
|||
height: calc(100vh - 320px); |
|||
} |
|||
:deep(.el-tabs__content) { |
|||
height: 100%; |
|||
overflow: auto; |
|||
} |
|||
.table-container { |
|||
height: 100%; |
|||
overflow: auto; |
|||
} |
|||
</style> |
@ -0,0 +1,11 @@ |
|||
<template> |
|||
<div class="app-container"> |
|||
<span>你好</span> |
|||
</div> |
|||
</template> |
|||
<script setup> |
|||
|
|||
</script> |
|||
<style scoped lang="scss"> |
|||
|
|||
</style> |
@ -0,0 +1,140 @@ |
|||
<template> |
|||
<div class="app-container"> |
|||
<el-form :model="queryParams" ref="queryRef" :inline="true" label-width="68px"> |
|||
<el-form-item label="申请人" prop="applicant"> |
|||
<el-input |
|||
v-model="queryParams.applicant" |
|||
placeholder="请输入申请人" |
|||
clearable |
|||
style="width: 240px" |
|||
@keyup.enter="handleQuery" |
|||
/> |
|||
</el-form-item> |
|||
<el-form-item label="业务类型" prop="businessType"> |
|||
<el-select |
|||
v-model="queryParams.businessType" |
|||
placeholder="业务类型" |
|||
clearable |
|||
style="width: 240px" |
|||
> |
|||
<el-option |
|||
key="t_metadata_supp_info" |
|||
label="元数据信息补录" |
|||
value="t_metadata_supp_info" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
<el-form-item> |
|||
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button> |
|||
<el-button icon="Refresh" @click="resetQuery">重置</el-button> |
|||
</el-form-item> |
|||
</el-form> |
|||
<el-table :data="flowList"> |
|||
<el-table-column label="业务类型" align="center" prop="businessType"> |
|||
<template #default="scope"> |
|||
<span v-if="scope.row.businessType === 't_metadata_supp_info'">元数据信息补录</span> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column label="业务编号" align="center" prop="businessId" :show-overflow-tooltip="true" width="280"> |
|||
<template #default="scope"> |
|||
<el-link type="primary" @click="showBusinessDataDialog(scope.row)" :underline="false">{{ scope.row.businessId }}</el-link> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column label="申请人" align="center" prop="applicant" :show-overflow-tooltip="true" /> |
|||
<el-table-column label="申请时间" align="center" prop="applyTime" :show-overflow-tooltip="true" /> |
|||
<el-table-column label="当前状态" align="center" prop="configType"> |
|||
<template #default="scope"> |
|||
<span v-if="scope.row.status === 'waiting'">未审批</span> |
|||
<span v-if="scope.row.status === 'pending'">未审批</span> |
|||
<span v-if="scope.row.status === 'succeed'">已审批</span> |
|||
<span v-if="scope.row.status === 'rejected'">已驳回</span> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column label="下一步审批人" align="center" prop="approver" :show-overflow-tooltip="true" > |
|||
<template #default="scope"> |
|||
<el-link type="primary" @click="showFlowConfig(scope.row)" :underline="false">{{ scope.row.approver }}</el-link> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column label="操作" align="center" width="150" class-name="small-padding fixed-width"> |
|||
<template #default="scope"> |
|||
<el-button link type="success" icon="Select" @click="agree(scope.row)">同意</el-button> |
|||
<el-button link type="danger" icon="CloseBold" @click="reject(scope.row)">驳回</el-button> |
|||
</template> |
|||
</el-table-column> |
|||
</el-table> |
|||
|
|||
<pagination |
|||
v-show="total > 0" |
|||
:total="total" |
|||
v-model:page="queryParams.pageNum" |
|||
v-model:limit="queryParams.pageSize" |
|||
@pagination="getList" |
|||
/> |
|||
</div> |
|||
</template> |
|||
|
|||
<script setup> |
|||
import {getApprovalList, operateProcess } from "@/api/flow/flow.js" |
|||
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"; |
|||
const data = reactive({ |
|||
queryParams: { |
|||
pageNum: 1, |
|||
pageSize: 10, |
|||
applicant: undefined, |
|||
businessType: undefined, |
|||
}, |
|||
}); |
|||
const total = ref(0); |
|||
const { queryParams } = toRefs(data); |
|||
const flowList = ref([]); |
|||
/** 查询参数列表 */ |
|||
function getList() { |
|||
getApprovalList(queryParams.value).then(res=>{ |
|||
flowList.value = res.data.rows |
|||
total.value = res.data.total |
|||
}) |
|||
} |
|||
|
|||
/** 搜索按钮操作 */ |
|||
function handleQuery() { |
|||
queryParams.value.pageNum = 1; |
|||
getList(); |
|||
} |
|||
function resetQuery(){ |
|||
queryParams.value = { |
|||
pageNum: 1, |
|||
pageSize: 10, |
|||
applicant: undefined, |
|||
businessType: undefined, |
|||
} |
|||
getList() |
|||
} |
|||
function showBusinessDataDialog(row){ |
|||
|
|||
} |
|||
function showFlowConfig(row){ |
|||
|
|||
} |
|||
function agree(row){ |
|||
let data = { |
|||
flowId: row.id, |
|||
operateType: 'success', |
|||
operateComment: '' |
|||
} |
|||
operateProcess(data).then(res=>{ |
|||
proxy.$modal.msgSuccess("操作成功"); |
|||
getWaitingFlowCount().then(res=>{ |
|||
cache.local.set("waitingTotal",res.data) |
|||
}) |
|||
}) |
|||
} |
|||
function reject(row){ |
|||
|
|||
} |
|||
onMounted(()=>{ |
|||
handleQuery() |
|||
}) |
|||
</script> |
Loading…
Reference in new issue