Browse Source

系统bug修复

master
xueyinfei 1 month ago
parent
commit
c775ce0dde
  1. 20
      vue-fastapi-backend/module_admin/controller/cdplb_controller.py
  2. 20
      vue-fastapi-backend/module_admin/controller/fccbd_controller.py
  3. 35
      vue-fastapi-backend/module_admin/controller/tsmcb_controller.py
  4. 6
      vue-fastapi-backend/module_admin/dao/fccbd_dao.py
  5. 2
      vue-fastapi-backend/module_admin/dao/metadata_config_dao.py
  6. 2
      vue-fastapi-backend/module_admin/dao/metatask_dao.py
  7. 6
      vue-fastapi-backend/module_admin/dao/sscf_dao.py
  8. 6
      vue-fastapi-backend/module_admin/dao/tsmcb_dao.py
  9. 10
      vue-fastapi-backend/module_admin/dao/vecset_dao.py
  10. 2
      vue-fastapi-backend/module_admin/entity/vo/metadata_config_vo.py
  11. 1
      vue-fastapi-backend/module_admin/entity/vo/metatask_vo.py
  12. 102
      vue-fastapi-backend/module_admin/service/cdplb_service.py
  13. 96
      vue-fastapi-backend/module_admin/service/fccbd_service.py
  14. 102
      vue-fastapi-backend/module_admin/service/tsmcb_service.py
  15. 2
      vue-fastapi-frontend/src/views/aichat/aichat.vue
  16. 2
      vue-fastapi-frontend/src/views/aichat/markdown.vue
  17. 148
      vue-fastapi-frontend/src/views/dataint/cypz/cdplb.vue
  18. 151
      vue-fastapi-frontend/src/views/dataint/cypz/fccbd.vue
  19. 148
      vue-fastapi-frontend/src/views/dataint/cypz/tsmcb.vue
  20. 14
      vue-fastapi-frontend/src/views/dataint/sscf/index.vue
  21. 12
      vue-fastapi-frontend/src/views/dataint/vecset/index.vue
  22. 117
      vue-fastapi-frontend/src/views/meta/metaInfo/index.vue
  23. 5
      vue-fastapi-frontend/src/views/meta/metasercurity/MetaSecurityCol.vue
  24. 5
      vue-fastapi-frontend/src/views/meta/metasercurity/MetaSecurityRow.vue
  25. 56
      vue-fastapi-frontend/src/views/meta/metatask/index.vue
  26. 18
      vue-fastapi-frontend/src/views/metadataConfig/clas/index.vue
  27. 30
      vue-fastapi-frontend/src/views/system/flow/index.vue

20
vue-fastapi-backend/module_admin/controller/cdplb_controller.py

@ -1,6 +1,6 @@
from typing import List from typing import List
from fastapi import APIRouter, Depends, Request from fastapi import APIRouter, Depends, Request, File, UploadFile, Query
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from config.get_db import get_db from config.get_db import get_db
from module_admin.entity.vo.user_vo import CurrentUserModel from module_admin.entity.vo.user_vo import CurrentUserModel
@ -8,6 +8,7 @@ from module_admin.entity.vo.dataint_vo import CdplbPageObject, SaveCdplbModel
from module_admin.service.login_service import LoginService from module_admin.service.login_service import LoginService
from module_admin.service.cdplb_service import CdplbService from module_admin.service.cdplb_service import CdplbService
from utils.response_util import ResponseUtil from utils.response_util import ResponseUtil
from utils.common_util import bytes2file_response
cdplbController = APIRouter(prefix='/dataint/cdplb', dependencies=[Depends(LoginService.get_current_user)]) cdplbController = APIRouter(prefix='/dataint/cdplb', dependencies=[Depends(LoginService.get_current_user)])
@ -36,3 +37,20 @@ async def delete_tsmcb(request: Request,
current_user: CurrentUserModel = Depends(LoginService.get_current_user)): current_user: CurrentUserModel = Depends(LoginService.get_current_user)):
result = await CdplbService.delete_cdplb(query_db, array) result = await CdplbService.delete_cdplb(query_db, array)
return ResponseUtil.success(msg=result.message) return ResponseUtil.success(msg=result.message)
@cdplbController.post("/importTemplate")
async def export_system_user_template(request: Request, query_db: AsyncSession = Depends(get_db)):
meta_import_template_result = await CdplbService.get_import_template_services()
return ResponseUtil.streaming(data=bytes2file_response(meta_import_template_result))
@cdplbController.post("/upload")
async def batch_import_cdplb_data(
request: Request,
file: UploadFile = File(...),
overWrite: bool = Query(alias='overWrite'),
query_db: AsyncSession = Depends(get_db),
current_user: CurrentUserModel = Depends(LoginService.get_current_user)):
batch_import_result = await CdplbService.batch_import_cdplb_data(query_db, file, overWrite, current_user)
return ResponseUtil.success(data=batch_import_result)

20
vue-fastapi-backend/module_admin/controller/fccbd_controller.py

@ -1,6 +1,6 @@
from typing import List from typing import List
from fastapi import APIRouter, Depends, Request from fastapi import APIRouter, Depends, Request, UploadFile, File, Query
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from config.get_db import get_db from config.get_db import get_db
from module_admin.entity.vo.user_vo import CurrentUserModel from module_admin.entity.vo.user_vo import CurrentUserModel
@ -8,6 +8,7 @@ from module_admin.entity.vo.dataint_vo import FccbdPageObject, SaveFccbdModel
from module_admin.service.login_service import LoginService from module_admin.service.login_service import LoginService
from module_admin.service.fccbd_service import FccbdService from module_admin.service.fccbd_service import FccbdService
from utils.response_util import ResponseUtil from utils.response_util import ResponseUtil
from utils.common_util import bytes2file_response
fccbdController = APIRouter(prefix='/dataint/fccbd', dependencies=[Depends(LoginService.get_current_user)]) fccbdController = APIRouter(prefix='/dataint/fccbd', dependencies=[Depends(LoginService.get_current_user)])
@ -36,3 +37,20 @@ async def delete_tsmcb(request: Request,
current_user: CurrentUserModel = Depends(LoginService.get_current_user)): current_user: CurrentUserModel = Depends(LoginService.get_current_user)):
result = await FccbdService.delete_fccbd(query_db, array) result = await FccbdService.delete_fccbd(query_db, array)
return ResponseUtil.success(msg=result.message) return ResponseUtil.success(msg=result.message)
@fccbdController.post("/importTemplate")
async def export_system_user_template(request: Request, query_db: AsyncSession = Depends(get_db)):
meta_import_template_result = await FccbdService.get_import_template_services()
return ResponseUtil.streaming(data=bytes2file_response(meta_import_template_result))
@fccbdController.post("/upload")
async def batch_import_fccbd_data(
request: Request,
file: UploadFile = File(...),
overWrite: bool = Query(alias='overWrite'),
query_db: AsyncSession = Depends(get_db),
current_user: CurrentUserModel = Depends(LoginService.get_current_user)):
batch_import_result = await FccbdService.batch_import_fccbd_data(query_db, file, overWrite, current_user)
return ResponseUtil.success(data=batch_import_result)

35
vue-fastapi-backend/module_admin/controller/tsmcb_controller.py

@ -1,6 +1,6 @@
from typing import List from typing import List
from fastapi import APIRouter, Depends, Request from fastapi import APIRouter, Depends, Request, UploadFile, File, Query
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from config.get_db import get_db from config.get_db import get_db
from module_admin.entity.vo.user_vo import CurrentUserModel from module_admin.entity.vo.user_vo import CurrentUserModel
@ -8,34 +8,49 @@ from module_admin.entity.vo.dataint_vo import TsmcbPageObject, SaveTsmcbModel
from module_admin.service.login_service import LoginService from module_admin.service.login_service import LoginService
from module_admin.service.tsmcb_service import TsmcbService from module_admin.service.tsmcb_service import TsmcbService
from utils.response_util import ResponseUtil from utils.response_util import ResponseUtil
from utils.common_util import bytes2file_response
tsmcbController = APIRouter(prefix='/dataint/tsmcb', dependencies=[Depends(LoginService.get_current_user)]) tsmcbController = APIRouter(prefix='/dataint/tsmcb', dependencies=[Depends(LoginService.get_current_user)])
@tsmcbController.get("/list") @tsmcbController.get("/list")
async def get_tsmcb_list(request: Request, tsmcb_query: TsmcbPageObject = Depends(TsmcbPageObject.as_query), async def get_tsmcb_list(request: Request, tsmcb_query: TsmcbPageObject = Depends(TsmcbPageObject.as_query),
query_db: AsyncSession = Depends(get_db), query_db: AsyncSession = Depends(get_db),
current_user: CurrentUserModel = Depends(LoginService.get_current_user)): current_user: CurrentUserModel = Depends(LoginService.get_current_user)):
meta_query_result = await TsmcbService.get_tsmcb_list_services(query_db, tsmcb_query, current_user) meta_query_result = await TsmcbService.get_tsmcb_list_services(query_db, tsmcb_query, current_user)
return ResponseUtil.success(data=meta_query_result) return ResponseUtil.success(data=meta_query_result)
@tsmcbController.post("/save") @tsmcbController.post("/save")
async def save_tsmcb(request: Request, async def save_tsmcb(request: Request,
saveTsmcbModel: SaveTsmcbModel, saveTsmcbModel: SaveTsmcbModel,
query_db: AsyncSession = Depends(get_db), query_db: AsyncSession = Depends(get_db),
current_user: CurrentUserModel = Depends(LoginService.get_current_user)): current_user: CurrentUserModel = Depends(LoginService.get_current_user)):
result = await TsmcbService.save_tsmcb(query_db, saveTsmcbModel, current_user) result = await TsmcbService.save_tsmcb(query_db, saveTsmcbModel, current_user)
return ResponseUtil.success(msg=result.message) return ResponseUtil.success(msg=result.message)
@tsmcbController.post("/delete") @tsmcbController.post("/delete")
async def delete_tsmcb(request: Request, async def delete_tsmcb(request: Request,
array: List[str], array: List[str],
query_db: AsyncSession = Depends(get_db), query_db: AsyncSession = Depends(get_db),
current_user: CurrentUserModel = Depends(LoginService.get_current_user)): current_user: CurrentUserModel = Depends(LoginService.get_current_user)):
result = await TsmcbService.delete_tsmcb(query_db, array) result = await TsmcbService.delete_tsmcb(query_db, array)
return ResponseUtil.success(msg=result.message) return ResponseUtil.success(msg=result.message)
@tsmcbController.post("/upload")
async def batch_import_tsmcb_data(
request: Request,
file: UploadFile = File(...),
overWrite: bool = Query(alias='overWrite'),
query_db: AsyncSession = Depends(get_db),
current_user: CurrentUserModel = Depends(LoginService.get_current_user)):
batch_import_result = await TsmcbService.batch_import_tsmcb_data(query_db, file, overWrite, current_user)
return ResponseUtil.success(data=batch_import_result)
@tsmcbController.post("/importTemplate")
async def export_tsmcb_template(request: Request, query_db: AsyncSession = Depends(get_db)):
meta_import_template_result = await TsmcbService.get_import_template_services()
return ResponseUtil.streaming(data=bytes2file_response(meta_import_template_result))

6
vue-fastapi-backend/module_admin/dao/fccbd_dao.py

@ -18,9 +18,9 @@ class FccbdDao:
async def get_fccbd_list(cls, db: AsyncSession, fccbd_query: FccbdPageObject): async def get_fccbd_list(cls, db: AsyncSession, fccbd_query: FccbdPageObject):
query = ( query = (
select(SysFccbd).where( select(SysFccbd).where(
SysFccbd.pos == fccbd_query.pos if fccbd_query.pos else True, SysFccbd.pos.like(f'%{fccbd_query.pos}%') if fccbd_query.pos else True,
SysFccbd.pos_name == fccbd_query.pos_name if fccbd_query.pos_name else True, SysFccbd.pos_name.like(f'%{fccbd_query.pos_name}%') if fccbd_query.pos_name else True,
SysFccbd.term == fccbd_query.term if fccbd_query.term else True, SysFccbd.term.like(f'%{fccbd_query.term}%') if fccbd_query.term else True,
SysFccbd.status == fccbd_query.status if fccbd_query.status else True SysFccbd.status == fccbd_query.status if fccbd_query.status else True
).distinct() ).distinct()
) )

2
vue-fastapi-backend/module_admin/dao/metadata_config_dao.py

@ -59,7 +59,7 @@ class MetadataConfigDao:
获取标签信息列表支持分页 获取标签信息列表支持分页
""" """
query = select(MetadataClas).where( query = select(MetadataClas).where(
MetadataClas.belt_batch_content==query_object.belt_batch_content if query_object.belt_batch_content else True, MetadataClas.belt_batch_content.in_([int(x) for x in query_object.onumStr.split(',')]) if query_object.onumStr else True,
MetadataClas.clas_name.like(f"%{query_object.clas_name}%") if query_object.clas_name else True, MetadataClas.clas_name.like(f"%{query_object.clas_name}%") if query_object.clas_name else True,
MetadataClas.clas_eff_flag == query_object.clas_eff_flag if query_object.clas_eff_flag else True, MetadataClas.clas_eff_flag == query_object.clas_eff_flag if query_object.clas_eff_flag else True,
MetadataClas.upd_time.between( MetadataClas.upd_time.between(

2
vue-fastapi-backend/module_admin/dao/metatask_dao.py

@ -58,7 +58,7 @@ class MetataskDao:
Metatask.metatask_name.like(f'%{query_object.metatask_name}%') if query_object.metatask_name else True, Metatask.metatask_name.like(f'%{query_object.metatask_name}%') if query_object.metatask_name else True,
Metatask.metatask_id == query_object.metatask_id if query_object.metatask_id else True, Metatask.metatask_id == query_object.metatask_id if query_object.metatask_id else True,
Metatask.metatask_type == query_object.metatask_type if query_object.metatask_type else True, Metatask.metatask_type == query_object.metatask_type if query_object.metatask_type else True,
Metatask.dbRCode == query_object.dbRCode if query_object.dbRCode else False, Metatask.dbRCode.in_([int(x) for x in query_object.dbRcodeStr.split(',')]) if query_object.dbRcodeStr else True,
Metatask.create_time.between( Metatask.create_time.between(
datetime.combine(datetime.strptime(query_object.begin_time, '%Y-%m-%d'), time(00, 00, 00)), datetime.combine(datetime.strptime(query_object.begin_time, '%Y-%m-%d'), time(00, 00, 00)),
datetime.combine(datetime.strptime(query_object.end_time, '%Y-%m-%d'), time(23, 59, 59)), datetime.combine(datetime.strptime(query_object.end_time, '%Y-%m-%d'), time(23, 59, 59)),

6
vue-fastapi-backend/module_admin/dao/sscf_dao.py

@ -19,9 +19,9 @@ class SscfDao:
async def get_sscf_list(cls, db: AsyncSession, sscf_query: SscfPageObject): async def get_sscf_list(cls, db: AsyncSession, sscf_query: SscfPageObject):
query = ( query = (
select(SysSscf).where( select(SysSscf).where(
SysSscf.keyword == sscf_query.keyword if sscf_query.keyword else True, SysSscf.keyword.like(f'%{sscf_query.keyword}%') if sscf_query.keyword else True,
SysSscf.type == sscf_query.type if sscf_query.type else True, SysSscf.type.like(f'%{sscf_query.type}%') if sscf_query.type else True,
SysSscf.dasset_id == sscf_query.dasset_id if sscf_query.dasset_id else True, SysSscf.dasset_id.in_(sscf_query.dasset_id.split(',')) if sscf_query.dasset_id else True,
SysSscf.status == sscf_query.status if sscf_query.status else True SysSscf.status == sscf_query.status if sscf_query.status else True
).distinct() ).distinct()
) )

6
vue-fastapi-backend/module_admin/dao/tsmcb_dao.py

@ -18,9 +18,9 @@ class TsmcbDao:
async def get_tsmcb_list(cls, db: AsyncSession, tsmcb_query: TsmcbPageObject): async def get_tsmcb_list(cls, db: AsyncSession, tsmcb_query: TsmcbPageObject):
query = ( query = (
select(SysTsmcb).where( select(SysTsmcb).where(
SysTsmcb.pos == tsmcb_query.pos if tsmcb_query.pos else True, SysTsmcb.pos.like(f'%{tsmcb_query.pos}%') if tsmcb_query.pos else True,
SysTsmcb.type == tsmcb_query.type if tsmcb_query.type else True, SysTsmcb.type.like(f'%{tsmcb_query.type}%') if tsmcb_query.type else True,
SysTsmcb.std_rpl_str == tsmcb_query.std_rpl_str if tsmcb_query.std_rpl_str else True, SysTsmcb.std_rpl_str.like(f'%{tsmcb_query.std_rpl_str}%') if tsmcb_query.std_rpl_str else True,
SysTsmcb.status == tsmcb_query.status if tsmcb_query.status else True SysTsmcb.status == tsmcb_query.status if tsmcb_query.status else True
).distinct() ).distinct()
) )

10
vue-fastapi-backend/module_admin/dao/vecset_dao.py

@ -18,12 +18,12 @@ class VecsetDao:
async def get_vecset_list(cls, db: AsyncSession, vecset_query: VecsetPageObject): async def get_vecset_list(cls, db: AsyncSession, vecset_query: VecsetPageObject):
query = ( query = (
select(SysVecset).where( select(SysVecset).where(
SysVecset.dasset_id == vecset_query.dasset_id if vecset_query.dasset_id else True, SysVecset.dasset_id.in_(vecset_query.dasset_id.split(',')) if vecset_query.dasset_id else True,
SysVecset.stab_name == vecset_query.stab_name if vecset_query.stab_name else True, SysVecset.stab_name.like(f'%{vecset_query.stab_name}%') if vecset_query.stab_name else True,
SysVecset.squery == vecset_query.squery if vecset_query.squery else True, SysVecset.squery.like(f'%{vecset_query.squery}%') if vecset_query.squery else True,
SysVecset.sanal_plan == vecset_query.sanal_plan if vecset_query.sanal_plan else True, SysVecset.sanal_plan.like(f'%{vecset_query.sanal_plan}%') if vecset_query.sanal_plan else True,
SysVecset.data_domain.like(f'%{vecset_query.data_domain}%') if vecset_query.data_domain else True,
SysVecset.status == vecset_query.status if vecset_query.status else True, SysVecset.status == vecset_query.status if vecset_query.status else True,
SysVecset.data_domain == vecset_query.data_domain if vecset_query.data_domain else True,
).distinct() ).distinct()
) )
query_result = await PageUtil.paginate(db, query, vecset_query.page_num, vecset_query.page_size, True) query_result = await PageUtil.paginate(db, query, vecset_query.page_num, vecset_query.page_size, True)

2
vue-fastapi-backend/module_admin/entity/vo/metadata_config_vo.py

@ -35,6 +35,7 @@ class MetadataClasQueryModel(MetadataClasModel):
""" """
标签信息不分页查询模型 标签信息不分页查询模型
""" """
onumStr: Optional[str] = Field(default=None, description='ids')
begin_time: Optional[str] = Field(default=None, description='开始时间') begin_time: Optional[str] = Field(default=None, description='开始时间')
end_time: Optional[str] = Field(default=None, description='结束时间') end_time: Optional[str] = Field(default=None, description='结束时间')
@ -44,6 +45,7 @@ class MetadataClasPageQueryModel(MetadataClasQueryModel):
""" """
标签信息分页查询模型 标签信息分页查询模型
""" """
page_num: int = Field(default=1, description='当前页码') page_num: int = Field(default=1, description='当前页码')
page_size: int = Field(default=10, description='每页记录数') page_size: int = Field(default=10, description='每页记录数')

1
vue-fastapi-backend/module_admin/entity/vo/metatask_vo.py

@ -50,6 +50,7 @@ class MetataskQueryModel(MetataskModel):
""" """
元数据任务不分页查询模型 元数据任务不分页查询模型
""" """
dbRcodeStr: Optional[str] = Field(default=None, description='系统集合')
begin_time: Optional[str]= Field(default=None, description='开始时间') begin_time: Optional[str]= Field(default=None, description='开始时间')
end_time: Optional[str]= Field(default=None, description='结束时间') end_time: Optional[str]= Field(default=None, description='结束时间')

102
vue-fastapi-backend/module_admin/service/cdplb_service.py

@ -1,7 +1,11 @@
import io
import json import json
import uuid import uuid
from typing import Optional, List from typing import Optional, List
import pandas as pd
from fastapi import UploadFile
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from module_admin.entity.vo.common_vo import CrudResponseModel from module_admin.entity.vo.common_vo import CrudResponseModel
from module_admin.entity.vo.user_vo import CurrentUserModel from module_admin.entity.vo.user_vo import CurrentUserModel
@ -10,7 +14,7 @@ from module_admin.entity.do.dataint_do import SysCdplb
from module_admin.dao.cdplb_dao import CdplbDao from module_admin.dao.cdplb_dao import CdplbDao
from exceptions.exception import ServiceException, ServiceWarning from exceptions.exception import ServiceException, ServiceWarning
from datetime import datetime from datetime import datetime
from utils.common_util import CamelCaseUtil from utils.common_util import *
class CdplbService: class CdplbService:
@ -52,3 +56,99 @@ class CdplbService:
await db.commit() await db.commit()
return CrudResponseModel(is_success=True, message='操作成功') return CrudResponseModel(is_success=True, message='操作成功')
@staticmethod
async def get_import_template_services():
"""
获取元数据导入模板service
:return: 元数据导入模板excel的二进制数据
"""
table_header_list = ['批量对象表名', '批里对象字段名', '频次', '词性', '词性名称', '状态']
selector_header_list = ['状态']
option_list = [{'状态': ['正常', '停用']}]
sheet_config1 = dict(
sheet_name="词典批量补充", header_list=table_header_list, data_list=[], selector_header_list=selector_header_list
)
sheet_configs = [sheet_config1]
binary_data = get_excel_template_with_sheets(
sheet_configs, # 每个Sheet的配置(包含表头、选择器等)
option_list
)
return binary_data
@classmethod
async def batch_import_cdplb_data(cls,
result_db: AsyncSession,
file: UploadFile,
overWrite: bool,
current_user: CurrentUserModel):
table_header_dict = {
'批量对象表名': 'bath_obj_tab_name',
'批里对象字段名': 'bath_obj_fld_name',
'频次': 'freq',
'词性': 'pos',
'词性名称': 'pos_name',
'状态': 'status'
}
contents = await file.read()
excel_file = pd.ExcelFile(io.BytesIO(contents))
await file.close()
# 获取所有sheet名称
sheet_names = excel_file.sheet_names
# 逐个读取
tableSheet = sheet_names[0]
result_list = {
"rows": [],
"successCount": 0
}
if tableSheet == '词典批量补充':
df = excel_file.parse(sheet_name=tableSheet, dtype=str, keep_default_na=False, na_values=[])
df.rename(columns=table_header_dict, inplace=True)
for index, row in df.iterrows():
noneValid = ''
if row['bath_obj_tab_name'] is None or len(row['bath_obj_tab_name']) == 0:
noneValid += "批量对象表名不能为空"
if row['bath_obj_fld_name'] is None or len(row['bath_obj_fld_name']) == 0:
if len(noneValid) > 0:
noneValid += ",批里对象字段名不能为空"
else:
noneValid += "批里对象字段名不能为空"
if row['freq'] is None or len(row['freq']) == 0:
if len(noneValid) > 0:
noneValid += ",频次不能为空"
else:
noneValid += "频次不能为空"
if row['pos'] is None or len(row['pos']) == 0:
if len(noneValid) > 0:
noneValid += ",词性不能为空"
else:
noneValid += "词性不能为空"
if row['pos_name'] is None or len(row['pos_name']) == 0:
if len(noneValid) > 0:
noneValid += ",词性名称不能为空"
else:
noneValid += "词性名称不能为空"
if row['status'] is None or len(row['status']) == 0:
if len(noneValid) > 0:
noneValid += ",状态不能为空"
else:
noneValid += "状态不能为空"
if len(noneValid) > 0:
result_list['rows'].append({
"row": index + 2,
"errorInfo": noneValid
})
continue
cdplb = SaveCdplbModel()
cdplb.bath_obj_tab_name = row['bath_obj_tab_name']
cdplb.bath_obj_fld_name = row['bath_obj_fld_name']
cdplb.freq = row['freq']
cdplb.pos = row['pos']
cdplb.pos_name = row['pos_name']
cdplb.status = '1' if row['status'] == '正常' else '0'
await cls.save_cdplb(result_db, cdplb, current_user)
result_list['successCount'] += 1
return result_list

96
vue-fastapi-backend/module_admin/service/fccbd_service.py

@ -1,7 +1,10 @@
import json import json
import uuid import uuid
from typing import Optional, List from typing import Optional, List, io
import pandas as pd
from fastapi import UploadFile
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from module_admin.entity.vo.common_vo import CrudResponseModel from module_admin.entity.vo.common_vo import CrudResponseModel
from module_admin.entity.vo.user_vo import CurrentUserModel from module_admin.entity.vo.user_vo import CurrentUserModel
@ -10,7 +13,7 @@ from module_admin.entity.do.dataint_do import SysFccbd
from module_admin.dao.fccbd_dao import FccbdDao from module_admin.dao.fccbd_dao import FccbdDao
from exceptions.exception import ServiceException, ServiceWarning from exceptions.exception import ServiceException, ServiceWarning
from datetime import datetime from datetime import datetime
from utils.common_util import CamelCaseUtil from utils.common_util import *
class FccbdService: class FccbdService:
@ -52,3 +55,92 @@ class FccbdService:
await db.commit() await db.commit()
return CrudResponseModel(is_success=True, message='操作成功') return CrudResponseModel(is_success=True, message='操作成功')
@staticmethod
async def get_import_template_services():
"""
获取元数据导入模板service
:return: 元数据导入模板excel的二进制数据
"""
table_header_list = ['词语', '频次', '词性', '词性名称', '状态']
selector_header_list = ['状态']
option_list = [{'状态': ['正常', '停用']}]
sheet_config1 = dict(
sheet_name="分词词典补充", header_list=table_header_list,data_list=[], selector_header_list=selector_header_list
)
sheet_configs = [sheet_config1]
binary_data = get_excel_template_with_sheets(
sheet_configs, # 每个Sheet的配置(包含表头、选择器等)
option_list
)
return binary_data
@classmethod
async def batch_import_fccbd_data(cls,
result_db: AsyncSession,
file: UploadFile,
overWrite: bool,
current_user: CurrentUserModel):
table_header_dict = {
'词语': 'term',
'频次': 'freq',
'词性': 'pos',
'词性名称': 'pos_name',
'状态': 'status'
}
contents = await file.read()
excel_file = pd.ExcelFile(io.BytesIO(contents))
await file.close()
# 获取所有sheet名称
sheet_names = excel_file.sheet_names
# 逐个读取
tableSheet = sheet_names[0]
result_list = {
"rows": [],
"successCount": 0
}
if tableSheet == '分词词典补充':
df = excel_file.parse(sheet_name=tableSheet, dtype=str, keep_default_na=False, na_values=[])
df.rename(columns=table_header_dict, inplace=True)
for index, row in df.iterrows():
noneValid = ''
if row['term'] is None or len(row['term']) == 0:
noneValid += "词语不能为空"
if row['freq'] is None or len(row['freq']) == 0:
if len(noneValid) > 0:
noneValid += ",频次不能为空"
else:
noneValid += "频次不能为空"
if row['pos'] is None or len(row['pos']) == 0:
if len(noneValid) > 0:
noneValid += ",词性不能为空"
else:
noneValid += "词性不能为空"
if row['pos_name'] is None or len(row['pos_name']) == 0:
if len(noneValid) > 0:
noneValid += ",词性名称不能为空"
else:
noneValid += "词性名称不能为空"
if row['status'] is None or len(row['status']) == 0:
if len(noneValid) > 0:
noneValid += ",状态不能为空"
else:
noneValid += "状态不能为空"
if len(noneValid) > 0:
result_list['rows'].append({
"row": index + 2,
"errorInfo": noneValid
})
continue
fccbd = SaveFccbdModel()
fccbd.term = row['term']
fccbd.freq = row['freq']
fccbd.pos = row['pos']
fccbd.pos_name = row['pos_name']
fccbd.status = '1' if row['status'] == '1' else '0'
await cls.save_fccbd(result_db, fccbd, current_user)
result_list['successCount'] += 1
return result_list

102
vue-fastapi-backend/module_admin/service/tsmcb_service.py

@ -1,7 +1,11 @@
import io
import json import json
import uuid import uuid
from typing import Optional, List from typing import Optional, List
import pandas as pd
from fastapi import UploadFile
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from module_admin.entity.vo.common_vo import CrudResponseModel from module_admin.entity.vo.common_vo import CrudResponseModel
from module_admin.entity.vo.user_vo import CurrentUserModel from module_admin.entity.vo.user_vo import CurrentUserModel
@ -10,7 +14,7 @@ from module_admin.entity.do.dataint_do import SysTsmcb
from module_admin.dao.tsmcb_dao import TsmcbDao from module_admin.dao.tsmcb_dao import TsmcbDao
from exceptions.exception import ServiceException, ServiceWarning from exceptions.exception import ServiceException, ServiceWarning
from datetime import datetime from datetime import datetime
from utils.common_util import CamelCaseUtil from utils.common_util import *
class TsmcbService: class TsmcbService:
@ -52,3 +56,99 @@ class TsmcbService:
await db.commit() await db.commit()
return CrudResponseModel(is_success=True, message='操作成功') return CrudResponseModel(is_success=True, message='操作成功')
@staticmethod
async def get_import_template_services():
"""
获取元数据导入模板service
:return: 元数据导入模板excel的二进制数据
"""
table_header_list = ['词性', '类型', '标准化替换字符', '前缀补充字符', '后缀补充字符', '状态']
selector_header_list = ['状态']
option_list = [{'状态': ['正常', '停用']}]
sheet_config1 = dict(
sheet_name="特殊名词补充", header_list=table_header_list, data_list=[], selector_header_list=selector_header_list
)
sheet_configs = [sheet_config1]
binary_data = get_excel_template_with_sheets(
sheet_configs, # 每个Sheet的配置(包含表头、选择器等)
option_list
)
return binary_data
@classmethod
async def batch_import_tsmcb_data(cls,
result_db: AsyncSession,
file: UploadFile,
overWrite: bool,
current_user: CurrentUserModel):
table_header_dict = {
'词性': 'pos',
'类型': 'type',
'标准化替换字符': 'std_rpl_str',
'前缀补充字符': 'prefix_supp_str',
'后缀补充字符': 'suffix_supp_str',
'状态': 'status'
}
contents = await file.read()
excel_file = pd.ExcelFile(io.BytesIO(contents))
await file.close()
# 获取所有sheet名称
sheet_names = excel_file.sheet_names
# 逐个读取
tableSheet = sheet_names[0]
result_list = {
"rows": [],
"successCount": 0
}
if tableSheet == '特殊名词补充':
df = excel_file.parse(sheet_name=tableSheet, dtype=str, keep_default_na=False, na_values=[])
df.rename(columns=table_header_dict, inplace=True)
for index, row in df.iterrows():
noneValid = ''
if row['pos'] is None or len(row['pos']) == 0:
noneValid += "词性不能为空"
if row['type'] is None or len(row['type']) == 0:
if len(noneValid) > 0:
noneValid += ",类型不能为空"
else:
noneValid += "类型不能为空"
if row['std_rpl_str'] is None or len(row['std_rpl_str']) == 0:
if len(noneValid) > 0:
noneValid += ",标准化替换字符不能为空"
else:
noneValid += "标准化替换字符不能为空"
if row['prefix_supp_str'] is None or len(row['prefix_supp_str']) == 0:
if len(noneValid) > 0:
noneValid += ",前缀补充字符不能为空"
else:
noneValid += "前缀补充字符不能为空"
if row['suffix_supp_str'] is None or len(row['suffix_supp_str']) == 0:
if len(noneValid) > 0:
noneValid += ",后缀补充字符名称不能为空"
else:
noneValid += "后缀补充字符名称不能为空"
if row['status'] is None or len(row['status']) == 0:
if len(noneValid) > 0:
noneValid += ",状态不能为空"
else:
noneValid += "状态不能为空"
if len(noneValid) > 0:
result_list['rows'].append({
"row": index + 2,
"errorInfo": noneValid
})
continue
tsmcb = SaveTsmcbModel()
tsmcb.pos = row['pos']
tsmcb.type = row['type']
tsmcb.std_rpl_str = row['std_rpl_str']
tsmcb.prefix_supp_str = row['prefix_supp_str']
tsmcb.suffix_supp_str = row['suffix_supp_str']
tsmcb.status = '1' if row['status'] == '正常' else '0'
await cls.save_tsmcb(result_db, tsmcb, current_user)
result_list['successCount'] += 1
return result_list

2
vue-fastapi-frontend/src/views/aichat/aichat.vue

@ -30,7 +30,7 @@
</div> </div>
<!-- 回答 --> <!-- 回答 -->
<div v-if="item.type === 'answer'" class="item-content mb-16 lighter" style="font-weight: 400"> <div v-if="item.type === 'answer'" class="item-content mb-16 lighter" style="font-weight: 400">
<el-popconfirm v-if="index < chatList.length-1" popper-style="z-index:3000" title="确定要回到这一步吗?" @confirm="confirmReturn(item,index)"> <el-popconfirm v-if="index < chatList.length-1 && (chatList[chatList.length-1].isEnd || chatList[chatList.length-1].isEnd)" popper-style="z-index:3000" title="确定要回到这一步吗?" @confirm="confirmReturn(item,index)">
<template #reference> <template #reference>
<div class="returnToHere" style="margin-top: 5px;margin-bottom: 5px"> <div class="returnToHere" style="margin-top: 5px;margin-bottom: 5px">
<i class="ri-bookmark-2-fill returnToHereIcon"></i> <i class="ri-bookmark-2-fill returnToHereIcon"></i>

2
vue-fastapi-frontend/src/views/aichat/markdown.vue

@ -20,7 +20,7 @@ const md = new MarkdownIt({
}) })
watch(() => props.markdownString, (newValue) => { watch(() => props.markdownString, (newValue) => {
if (newValue){ if (newValue){
compiledMarkdown.value = md.render(newValue); compiledMarkdown.value = md.render(newValue+'');
} }
}, { immediate: true }); }, { immediate: true });
</script> </script>

148
vue-fastapi-frontend/src/views/dataint/cypz/cdplb.vue

@ -141,11 +141,95 @@
</div> </div>
</template> </template>
</el-dialog> </el-dialog>
<el-dialog :title="upload.title" v-model="upload.open" width="400px" append-to-body>
<el-upload
ref="uploadRef"
:limit="1"
accept=".xlsx, .xls"
:headers="upload.headers"
:action="upload.url + '?overWrite=' + upload.overWrite"
:disabled="upload.isUploading"
:on-progress="handleFileUploadProgress"
:on-success="handleFileSuccess"
:auto-upload="false"
drag
>
<el-icon class="el-icon--upload"><upload-filled /></el-icon>
<div class="el-upload__text">将文件拖到此处<em>点击上传</em></div>
<template #tip>
<div class="el-upload__tip text-center">
<span>仅允许导入xlsxlsx格式文件</span>
<el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;" @click="importTemplate">下载模板</el-link>
</div>
</template>
</el-upload>
<!-- <el-form>-->
<!-- <el-form-item>-->
<!-- <template #label>-->
<!-- 开启覆盖-->
<!-- <el-tooltip-->
<!-- class="box-item"-->
<!-- effect="dark"-->
<!-- placement="right"-->
<!-- >-->
<!-- <template #content>-->
<!-- <div>打开开启覆盖则原补录信息会被模板中未填信息覆盖为空值<br>-->
<!-- 关闭开启覆盖则模板中留空数据不会影响原补录信息-->
<!-- </div>-->
<!-- </template>-->
<!-- <el-link :underline="false" type="primary"><i class="ri-question-line"></i></el-link>-->
<!-- </el-tooltip>-->
<!-- </template>-->
<!-- <el-switch v-model="upload.overWrite"></el-switch>-->
<!-- </el-form-item>-->
<!-- </el-form>-->
<template #footer>
<div class="dialog-footer">
<el-button type="primary" :disabled="upload.isUploading" @click="submitFileForm"> </el-button>
<el-button @click="upload.open = false"> </el-button>
</div>
</template>
</el-dialog>
<el-dialog title="导入结果" v-model="upload.showResult" width="1000px" append-to-body>
<template v-if="upload.showResult">
<el-tabs type="border-card" v-if=" (upload.resultMsg.table && upload.resultMsg.table.length>0) || (upload.resultMsg.column && upload.resultMsg.column.length>0)">
<el-tab-pane label="表级问题" v-if="upload.resultMsg.table && upload.resultMsg.table.length>0">
<el-table :data="upload.resultMsg.table" stripe style="width: 100%">
<el-table-column prop="row" label="行" />
<el-table-column prop="ssysCd" label="系统" />
<el-table-column prop="mdlName" label="模式" />
<el-table-column prop="tabEngName" label="表名称" />
<el-table-column prop="errorInfo" label="问题" />
</el-table>
</el-tab-pane>
<el-tab-pane label="字段级问题" v-if="upload.resultMsg.column && upload.resultMsg.column.length>0">
<el-table :data="upload.resultMsg.column" stripe style="width: 100%">
<el-table-column prop="row" label="行" />
<el-table-column prop="ssysCd" label="系统" />
<el-table-column prop="mdlName" label="模式" />
<el-table-column prop="tabEngName" label="表名称" />
<el-table-column prop="fldEngName" label="字段名称" />
<el-table-column prop="errorInfo" label="问题" />
</el-table>
</el-tab-pane>
</el-tabs>
<span v-if=" (upload.resultMsg.table && upload.resultMsg.table.length===0) && (upload.resultMsg.column && upload.resultMsg.column.length===0) && upload.resultMsg.successCount === 0">
上传的文档内容为空请进行有效上传
</span>
</template>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="upload.showResult = false"> </el-button>
</div>
</template>
</el-dialog>
</div> </div>
</template> </template>
<script setup> <script setup>
import { ref, nextTick, computed, watch, reactive, onMounted } from 'vue' import { ref, nextTick, computed, watch, reactive, onMounted } from 'vue'
import { getCdplbList, saveCdplb, deleteCdplb } from "@/api/dataint/cdplb" import { getCdplbList, saveCdplb, deleteCdplb } from "@/api/dataint/cdplb"
import {getToken} from "@/utils/auth.js";
import * as XLSX from "xlsx";
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const queryParams = ref({ const queryParams = ref({
@ -176,6 +260,49 @@ const currentForm = ref({
const multSelection = ref([]) const multSelection = ref([])
const dataList = ref([]) const dataList = ref([])
const total = ref(0) const total = ref(0)
/*** 导入参数 */
const upload = reactive({
//
open: false,
//
title: "",
//
isUploading: false,
//
headers: { Authorization: "Bearer " + getToken() },
overWrite: false,
//
url: import.meta.env.VITE_APP_BASE_API + "/dataint/cdplb/upload",
showResult: false,
resultMsg: {}
});
/**文件上传中处理 */
const handleFileUploadProgress = (event, file, fileList) => {
upload.isUploading = true;
}
/** 提交上传文件 */
function submitFileForm() {
proxy.$refs["uploadRef"].submit();
}
/** 下载模板操作 */
function importTemplate() {
proxy.download("/dataint/cdplb/importTemplate", {
}, `meta_template_${new Date().getTime()}.xlsx`);
}
/** 文件上传成功处理 */
const handleFileSuccess = (response, file, fileList) => {
upload.open = false;
upload.isUploading = false;
proxy.$refs["uploadRef"].handleRemove(file);
let resData = response.data
if (resData.successCount > 0 && resData.rows.length === 0){
proxy.$modal.msgSuccess("导入成功")
}else {
upload.resultMsg = resData
upload.showResult = true
}
getList();
}
function handleQuery(){ function handleQuery(){
queryParams.value.pageNum = 1; queryParams.value.pageNum = 1;
getList() getList()
@ -254,10 +381,27 @@ function handleDelete(array){
}) })
} }
function handleImport(){ function handleImport(){
upload.title = "数据导入";
upload.open = true;
} }
function handleExport(){ function handleExport(){
let data = [];
if (dataList.value.length > 0){
for (let i = 0; i < dataList.value.length; i++) {
data.push({
"批量对象表名":dataList.value[i].bathObjTabName,
"批里对象字段名":dataList.value[i].bathObjFldName,
"频次":dataList.value[i].freq,
"词性":dataList.value[i].pos,
"词性名称":dataList.value[i].posName,
"状态":dataList.value[i].status === '1'?"正常":"停用"
})
}
}
const workbook = XLSX.utils.book_new();
const worksheet = XLSX.utils.json_to_sheet(data);
XLSX.utils.book_append_sheet(workbook, worksheet, "Sheet1");
XLSX.writeFile(workbook, "数据导出.xlsx");
} }
function handleSelection(val){ function handleSelection(val){
multSelection.value= val multSelection.value= val

151
vue-fastapi-frontend/src/views/dataint/cypz/fccbd.vue

@ -12,8 +12,8 @@
</el-form-item> </el-form-item>
<el-form-item label="状态:"> <el-form-item label="状态:">
<el-select v-model="queryParams.status" style="width: 200px" clearable> <el-select v-model="queryParams.status" style="width: 200px" clearable>
<el-option label="正常" key="tsmcb-query-status-1" value="0"></el-option> <el-option label="正常" key="tsmcb-query-status-1" value="1"></el-option>
<el-option label="弃用" key="tsmcb-query-status-1" value="1"></el-option> <el-option label="弃用" key="tsmcb-query-status-1" value="0"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
@ -135,11 +135,95 @@
</div> </div>
</template> </template>
</el-dialog> </el-dialog>
<el-dialog :title="upload.title" v-model="upload.open" width="400px" append-to-body>
<el-upload
ref="uploadRef"
:limit="1"
accept=".xlsx, .xls"
:headers="upload.headers"
:action="upload.url + '?overWrite=' + upload.overWrite"
:disabled="upload.isUploading"
:on-progress="handleFileUploadProgress"
:on-success="handleFileSuccess"
:auto-upload="false"
drag
>
<el-icon class="el-icon--upload"><upload-filled /></el-icon>
<div class="el-upload__text">将文件拖到此处<em>点击上传</em></div>
<template #tip>
<div class="el-upload__tip text-center">
<span>仅允许导入xlsxlsx格式文件</span>
<el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;" @click="importTemplate">下载模板</el-link>
</div>
</template>
</el-upload>
<!-- <el-form>-->
<!-- <el-form-item>-->
<!-- <template #label>-->
<!-- 开启覆盖-->
<!-- <el-tooltip-->
<!-- class="box-item"-->
<!-- effect="dark"-->
<!-- placement="right"-->
<!-- >-->
<!-- <template #content>-->
<!-- <div>打开开启覆盖则原补录信息会被模板中未填信息覆盖为空值<br>-->
<!-- 关闭开启覆盖则模板中留空数据不会影响原补录信息-->
<!-- </div>-->
<!-- </template>-->
<!-- <el-link :underline="false" type="primary"><i class="ri-question-line"></i></el-link>-->
<!-- </el-tooltip>-->
<!-- </template>-->
<!-- <el-switch v-model="upload.overWrite"></el-switch>-->
<!-- </el-form-item>-->
<!-- </el-form>-->
<template #footer>
<div class="dialog-footer">
<el-button type="primary" :disabled="upload.isUploading" @click="submitFileForm"> </el-button>
<el-button @click="upload.open = false"> </el-button>
</div>
</template>
</el-dialog>
<el-dialog title="导入结果" v-model="upload.showResult" width="1000px" append-to-body>
<template v-if="upload.showResult">
<el-tabs type="border-card" v-if=" (upload.resultMsg.table && upload.resultMsg.table.length>0) || (upload.resultMsg.column && upload.resultMsg.column.length>0)">
<el-tab-pane label="表级问题" v-if="upload.resultMsg.table && upload.resultMsg.table.length>0">
<el-table :data="upload.resultMsg.table" stripe style="width: 100%">
<el-table-column prop="row" label="行" />
<el-table-column prop="ssysCd" label="系统" />
<el-table-column prop="mdlName" label="模式" />
<el-table-column prop="tabEngName" label="表名称" />
<el-table-column prop="errorInfo" label="问题" />
</el-table>
</el-tab-pane>
<el-tab-pane label="字段级问题" v-if="upload.resultMsg.column && upload.resultMsg.column.length>0">
<el-table :data="upload.resultMsg.column" stripe style="width: 100%">
<el-table-column prop="row" label="行" />
<el-table-column prop="ssysCd" label="系统" />
<el-table-column prop="mdlName" label="模式" />
<el-table-column prop="tabEngName" label="表名称" />
<el-table-column prop="fldEngName" label="字段名称" />
<el-table-column prop="errorInfo" label="问题" />
</el-table>
</el-tab-pane>
</el-tabs>
<span v-if=" (upload.resultMsg.table && upload.resultMsg.table.length===0) && (upload.resultMsg.column && upload.resultMsg.column.length===0) && upload.resultMsg.successCount === 0">
上传的文档内容为空请进行有效上传
</span>
</template>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="upload.showResult = false"> </el-button>
</div>
</template>
</el-dialog>
</div> </div>
</template> </template>
<script setup> <script setup>
import { ref, nextTick, computed, watch, reactive, onMounted } from 'vue' import { ref, nextTick, computed, watch, reactive, onMounted } from 'vue'
import { getFccbdList, saveFccbd, deleteFccbd } from "@/api/dataint/fccbd" import { getFccbdList, saveFccbd, deleteFccbd } from "@/api/dataint/fccbd"
import {getToken} from "@/utils/auth.js";
import * as XLSX from "xlsx";
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
@ -169,6 +253,49 @@ const currentForm = ref({
}) })
const dataList = ref([]) const dataList = ref([])
const total = ref(0) const total = ref(0)
/*** 导入参数 */
const upload = reactive({
//
open: false,
//
title: "",
//
isUploading: false,
//
headers: { Authorization: "Bearer " + getToken() },
overWrite: false,
//
url: import.meta.env.VITE_APP_BASE_API + "/dataint/fccbd/upload",
showResult: false,
resultMsg: {}
});
/**文件上传中处理 */
const handleFileUploadProgress = (event, file, fileList) => {
upload.isUploading = true;
}
/** 提交上传文件 */
function submitFileForm() {
proxy.$refs["uploadRef"].submit();
}
/** 下载模板操作 */
function importTemplate() {
proxy.download("/dataint/fccbd/importTemplate", {
}, `meta_template_${new Date().getTime()}.xlsx`);
}
/** 文件上传成功处理 */
const handleFileSuccess = (response, file, fileList) => {
upload.open = false;
upload.isUploading = false;
proxy.$refs["uploadRef"].handleRemove(file);
let resData = response.data
if (resData.successCount > 0 && resData.rows.length === 0){
proxy.$modal.msgSuccess("导入成功")
}else {
upload.resultMsg = resData
upload.showResult = true
}
getList();
}
function handleQuery(){ function handleQuery(){
queryParams.value.pageNum = 1; queryParams.value.pageNum = 1;
getList() getList()
@ -246,10 +373,26 @@ function handleDelete(array){
}) })
} }
function handleImport(){ function handleImport(){
upload.title = "数据导入";
upload.open = true;
} }
function handleExport(){ function handleExport(){
let data = [];
if (dataList.value.length > 0){
for (let i = 0; i < dataList.value.length; i++) {
data.push({
"词语":dataList.value[i].term,
"频次":dataList.value[i].freq,
"词性":dataList.value[i].pos,
"词性名称":dataList.value[i].posName,
"状态":dataList.value[i].status === '1'?"正常":"停用"
})
}
}
const workbook = XLSX.utils.book_new();
const worksheet = XLSX.utils.json_to_sheet(data);
XLSX.utils.book_append_sheet(workbook, worksheet, "Sheet1");
XLSX.writeFile(workbook, "数据导出.xlsx");
} }
function handleSelection(val){ function handleSelection(val){
multSelection.value= val multSelection.value= val

148
vue-fastapi-frontend/src/views/dataint/cypz/tsmcb.vue

@ -150,11 +150,95 @@
</div> </div>
</template> </template>
</el-dialog> </el-dialog>
<el-dialog :title="upload.title" v-model="upload.open" width="400px" append-to-body>
<el-upload
ref="uploadRef"
:limit="1"
accept=".xlsx, .xls"
:headers="upload.headers"
:action="upload.url + '?overWrite=' + upload.overWrite"
:disabled="upload.isUploading"
:on-progress="handleFileUploadProgress"
:on-success="handleFileSuccess"
:auto-upload="false"
drag
>
<el-icon class="el-icon--upload"><upload-filled /></el-icon>
<div class="el-upload__text">将文件拖到此处<em>点击上传</em></div>
<template #tip>
<div class="el-upload__tip text-center">
<span>仅允许导入xlsxlsx格式文件</span>
<el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;" @click="importTemplate">下载模板</el-link>
</div>
</template>
</el-upload>
<!-- <el-form>-->
<!-- <el-form-item>-->
<!-- <template #label>-->
<!-- 开启覆盖-->
<!-- <el-tooltip-->
<!-- class="box-item"-->
<!-- effect="dark"-->
<!-- placement="right"-->
<!-- >-->
<!-- <template #content>-->
<!-- <div>打开开启覆盖则原补录信息会被模板中未填信息覆盖为空值<br>-->
<!-- 关闭开启覆盖则模板中留空数据不会影响原补录信息-->
<!-- </div>-->
<!-- </template>-->
<!-- <el-link :underline="false" type="primary"><i class="ri-question-line"></i></el-link>-->
<!-- </el-tooltip>-->
<!-- </template>-->
<!-- <el-switch v-model="upload.overWrite"></el-switch>-->
<!-- </el-form-item>-->
<!-- </el-form>-->
<template #footer>
<div class="dialog-footer">
<el-button type="primary" :disabled="upload.isUploading" @click="submitFileForm"> </el-button>
<el-button @click="upload.open = false"> </el-button>
</div>
</template>
</el-dialog>
<el-dialog title="导入结果" v-model="upload.showResult" width="1000px" append-to-body>
<template v-if="upload.showResult">
<el-tabs type="border-card" v-if=" (upload.resultMsg.table && upload.resultMsg.table.length>0) || (upload.resultMsg.column && upload.resultMsg.column.length>0)">
<el-tab-pane label="表级问题" v-if="upload.resultMsg.table && upload.resultMsg.table.length>0">
<el-table :data="upload.resultMsg.table" stripe style="width: 100%">
<el-table-column prop="row" label="行" />
<el-table-column prop="ssysCd" label="系统" />
<el-table-column prop="mdlName" label="模式" />
<el-table-column prop="tabEngName" label="表名称" />
<el-table-column prop="errorInfo" label="问题" />
</el-table>
</el-tab-pane>
<el-tab-pane label="字段级问题" v-if="upload.resultMsg.column && upload.resultMsg.column.length>0">
<el-table :data="upload.resultMsg.column" stripe style="width: 100%">
<el-table-column prop="row" label="行" />
<el-table-column prop="ssysCd" label="系统" />
<el-table-column prop="mdlName" label="模式" />
<el-table-column prop="tabEngName" label="表名称" />
<el-table-column prop="fldEngName" label="字段名称" />
<el-table-column prop="errorInfo" label="问题" />
</el-table>
</el-tab-pane>
</el-tabs>
<span v-if=" (upload.resultMsg.table && upload.resultMsg.table.length===0) && (upload.resultMsg.column && upload.resultMsg.column.length===0) && upload.resultMsg.successCount === 0">
上传的文档内容为空请进行有效上传
</span>
</template>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="upload.showResult = false"> </el-button>
</div>
</template>
</el-dialog>
</div> </div>
</template> </template>
<script setup> <script setup>
import { ref, nextTick, computed, watch, reactive, onMounted } from 'vue' import { ref, nextTick, computed, watch, reactive, onMounted } from 'vue'
import { getTsmcbList, saveTsmcb, deleteTsmcb } from "@/api/dataint/tsmcb" import { getTsmcbList, saveTsmcb, deleteTsmcb } from "@/api/dataint/tsmcb"
import * as XLSX from "xlsx";
import {getToken} from "@/utils/auth.js";
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
@ -186,6 +270,49 @@ const multSelection =ref([])
const dataList = ref([]) const dataList = ref([])
const total = ref(0) const total = ref(0)
const showDialog = ref(false) const showDialog = ref(false)
/*** 导入参数 */
const upload = reactive({
//
open: false,
//
title: "",
//
isUploading: false,
//
headers: { Authorization: "Bearer " + getToken() },
overWrite: false,
//
url: import.meta.env.VITE_APP_BASE_API + "/dataint/tsmcb/upload",
showResult: false,
resultMsg: {}
});
/**文件上传中处理 */
const handleFileUploadProgress = (event, file, fileList) => {
upload.isUploading = true;
}
/** 提交上传文件 */
function submitFileForm() {
proxy.$refs["uploadRef"].submit();
}
/** 下载模板操作 */
function importTemplate() {
proxy.download("/dataint/tsmcb/importTemplate", {
}, `meta_template_${new Date().getTime()}.xlsx`);
}
/** 文件上传成功处理 */
const handleFileSuccess = (response, file, fileList) => {
upload.open = false;
upload.isUploading = false;
proxy.$refs["uploadRef"].handleRemove(file);
let resData = response.data
if (resData.successCount > 0 && resData.rows.length === 0){
proxy.$modal.msgSuccess("导入成功")
}else {
upload.resultMsg = resData
upload.showResult = true
}
getList();
}
function handleQuery(){ function handleQuery(){
queryParams.value.pageNum = 1; queryParams.value.pageNum = 1;
getList() getList()
@ -264,10 +391,27 @@ function handleDelete(array){
}) })
} }
function handleImport(){ function handleImport(){
upload.title = "数据导入";
upload.open = true;
} }
function handleExport(){ function handleExport(){
let data = [];
if (dataList.value.length > 0){
for (let i = 0; i < dataList.value.length; i++) {
data.push({
"词性":dataList.value[i].pos,
"类型":dataList.value[i].type,
"标准化替换字符":dataList.value[i].stdRplStr,
"前缀补充字符":dataList.value[i].prefixSuppStr,
"后缀补充字符":dataList.value[i].suffixSuppStr,
"状态":dataList.value[i].status === '1'?"正常":"停用"
})
}
}
const workbook = XLSX.utils.book_new();
const worksheet = XLSX.utils.json_to_sheet(data);
XLSX.utils.book_append_sheet(workbook, worksheet, "Sheet1");
XLSX.writeFile(workbook, "数据导出.xlsx");
} }
function handleSelection(val){ function handleSelection(val){
multSelection.value= val multSelection.value= val

14
vue-fastapi-frontend/src/views/dataint/sscf/index.vue

@ -256,7 +256,7 @@ import { getSscfList, saveSscf, deleteSscf, get_dasset_tree, saveDassetTreeNode
const { proxy } = getCurrentInstance(); const { proxy } = getCurrentInstance();
const queryParams = ref({ const queryParams = ref({
dassetId:'', dassetId:[],
keyword:'', keyword:'',
type:'', type:'',
status:'', status:'',
@ -340,9 +340,19 @@ function getList(){
} }
/** 节点单击事件 */ /** 节点单击事件 */
function handleNodeClick(data) { function handleNodeClick(data) {
queryParams.value.dassetId = data.onum; queryParams.value.dassetId = getAllChildOnums(data).join(',');
handleQuery(); handleQuery();
} }
const getAllChildOnums = (node) => {
const onums = [node.onum]; // onum
if (node.children && node.children.length > 0) {
node.children.forEach(childNode => {
onums.push(...getAllChildOnums(childNode)); //
});
}
return onums;
};
function resetQuery(){ function resetQuery(){
queryParams.value = { queryParams.value = {
pos:'', pos:'',

12
vue-fastapi-frontend/src/views/dataint/vecset/index.vue

@ -401,9 +401,19 @@ function getList(){
} }
/** 节点单击事件 */ /** 节点单击事件 */
function handleNodeClick(data) { function handleNodeClick(data) {
queryParams.value.dassetId = data.onum; queryParams.value.dassetId = getAllChildOnums(data).join(',');
handleQuery(); handleQuery();
} }
const getAllChildOnums = (node) => {
const onums = [node.onum]; // onum
if (node.children && node.children.length > 0) {
node.children.forEach(childNode => {
onums.push(...getAllChildOnums(childNode)); //
});
}
return onums;
};
function resetQuery(){ function resetQuery(){
queryParams.value = { queryParams.value = {
pos:'', pos:'',

117
vue-fastapi-frontend/src/views/meta/metaInfo/index.vue

@ -76,15 +76,15 @@
@keyup.enter="handleQuery" @keyup.enter="handleQuery"
/> />
</el-form-item> </el-form-item>
<el-form-item label="补录状态:"> <!-- <el-form-item label="补录状态:">-->
<el-input <!-- <el-input-->
v-model="queryParams.recStat" <!-- v-model="queryParams.recStat"-->
placeholder="请输入搜索状态" <!-- placeholder="请输入搜索状态"-->
clearable <!-- clearable-->
style="width: 240px" <!-- style="width: 240px"-->
@keyup.enter="handleQuery" <!-- @keyup.enter="handleQuery"-->
/> <!-- />-->
</el-form-item> <!-- </el-form-item>-->
<el-form-item> <el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button> <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button> <el-button icon="Refresh" @click="resetQuery">重置</el-button>
@ -135,9 +135,11 @@
<el-table-column label="对象中文名" width="100" align="center" prop="tabCnName"></el-table-column> <el-table-column label="对象中文名" width="100" align="center" prop="tabCnName"></el-table-column>
<el-table-column label="对象标签" width="200" align="center" prop="batchTabClas"> <el-table-column label="对象标签" width="200" align="center" prop="batchTabClas">
<template #default="scope"> <template #default="scope">
<el-popover v-for="item in scope.row.tempTabClas" placement="right" width="auto" trigger="hover"> <el-popover placement="right" width="auto" trigger="hover">
<template #reference> <template #reference>
<el-tag v-if="item.clasEffFlag && item.clasEffFlag === '1'">{{item.clasName}}</el-tag> <template v-for="item in scope.row.tempTabClas">
<el-tag v-if="item.clasEffFlag && item.clasEffFlag === '1'">{{item.clasName}}</el-tag>
</template>
</template> </template>
<div> <div>
<div style="margin: 5px" v-for="item in scope.row.showTabClas"><el-tag v-if="item.clasEffFlag && item.clasEffFlag === '1'">{{item.clasName + ":" + item.clasValue}}</el-tag></div> <div style="margin: 5px" v-for="item in scope.row.showTabClas"><el-tag v-if="item.clasEffFlag && item.clasEffFlag === '1'">{{item.clasName + ":" + item.clasValue}}</el-tag></div>
@ -150,19 +152,24 @@
<el-table-column label="补录对象描述" width="150" align="center" prop="tabDesc"> <el-table-column label="补录对象描述" width="150" align="center" prop="tabDesc">
<template #default="scope"> <template #default="scope">
<span v-if="scope.row.tabDesc && scope.row.tabDesc.length<=20">{{scope.row.tabDesc}}</span> <span v-if="scope.row.tabDesc && scope.row.tabDesc.length<=20">{{scope.row.tabDesc}}</span>
<el-tooltip <el-tooltip v-if="scope.row.tabDesc && scope.row.tabDesc.length>20"
popper-style="width:400px" popper-style="width:400px"
effect="dark" effect="dark"
:content="scope.row.tabDesc" :content="scope.row.tabDesc"
placement="bottom" placement="bottom"
> >
<span v-if="scope.row.tabDesc && scope.row.tabDesc.length>20">{{scope.row.tabDesc.slice(0, 20)+'...'}}</span> <span>{{scope.row.tabDesc.slice(0, 20)+'...'}}</span>
</el-tooltip> </el-tooltip>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="对象类型" align="center" prop="tabType"></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="govFlag">
<el-table-column label="补录审批状态" width="120" align="center" prop="recStat"></el-table-column> <template #default="scope">
<span v-if="scope.row.govFlag === '0'"></span>
<span v-else></span>
</template>
</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="负责人" align="center" prop="pic"></el-table-column>
<el-table-column label="采集时间" width="200" align="center" prop="extractUpdTime"> <el-table-column label="采集时间" width="200" align="center" prop="extractUpdTime">
<template #default="scope"> <template #default="scope">
@ -327,9 +334,11 @@
<!-- </el-table-column>--> <!-- </el-table-column>-->
<el-table-column label="字段标签" width="150" align="center" prop="fldClas"> <el-table-column label="字段标签" width="150" align="center" prop="fldClas">
<template #default="scope"> <template #default="scope">
<el-popover v-for="item in scope.row.tempFldClas" placement="right" width="auto" trigger="hover"> <el-popover placement="right" width="auto" trigger="hover">
<template #reference> <template #reference>
<el-tag v-if="item.clasEffFlag === '1'">{{item.clasName}}</el-tag> <template v-for="item in scope.row.tempFldClas">
<el-tag v-if="item.clasEffFlag === '1'">{{item.clasName}}</el-tag>
</template>
</template> </template>
<div> <div>
<div style="margin: 5px" v-for="item in scope.row.showFldClas"><el-tag v-if="item.clasEffFlag === '1'">{{item.clasName + ":" + item.clasValue}}</el-tag></div> <div style="margin: 5px" v-for="item in scope.row.showFldClas"><el-tag v-if="item.clasEffFlag === '1'">{{item.clasName + ":" + item.clasValue}}</el-tag></div>
@ -342,7 +351,26 @@
<!-- <span>{{scope.row.fldNullRate}}</span>--> <!-- <span>{{scope.row.fldNullRate}}</span>-->
<!-- </template>--> <!-- </template>-->
<!-- </el-table-column>--> <!-- </el-table-column>-->
<el-table-column label="引用字典/标准" align="center" prop="dataDictName"></el-table-column> <el-table-column label="引用字典/标准" align="center" prop="dataDictId">
<template #default="scope">
<el-popover v-if="scope.row.dataDictName && scope.row.dataDictName.length>0" placement="left" :width="400" trigger="click">
<template #reference>
<el-link type="primary" @click="showDataDict(scope.row.dataDictId)">{{scope.row.dataDictName}}</el-link>
</template>
<el-form :model="currentDictForm" v-loading="currentDictForm.loading">
<el-form-item label="字典归属"><span>{{currentDictForm.dataDictVestName}}</span></el-form-item>
<el-form-item label="来源系统"><span>{{currentDictForm.srcSysName}}</span></el-form-item>
<el-form-item label="数据字典类型"><span>{{currentDictForm.dataDictType === '0'?"基础数据":"指标数据"}}</span></el-form-item>
<el-form-item label="数据字典编号"><span>{{currentDictForm.dataDictNo}}</span></el-form-item>
<el-form-item label="字典英文名"><span>{{currentDictForm.dataDictEngName}}</span></el-form-item>
<el-form-item label="字典中文名"><span>{{currentDictForm.dataDictCnName}}</span></el-form-item>
<el-form-item label="字典业务定义"><span>{{currentDictForm.dataDictBusiMean}}</span></el-form-item>
<el-form-item label="数据类型"><span>{{currentDictForm.dataDictDataType}}</span></el-form-item>
<el-form-item label="数据标准"><span>{{currentDictForm.dataStdValue}}</span></el-form-item>
</el-form>
</el-popover>
</template>
</el-table-column>
<el-table-column label="安全等级" align="center" prop="dataSecLvl"></el-table-column> <el-table-column label="安全等级" align="center" prop="dataSecLvl"></el-table-column>
<el-table-column label="更新时间" align="center" prop="suppUpdTime" width="180"> <el-table-column label="更新时间" align="center" prop="suppUpdTime" width="180">
<template #default="scope"> <template #default="scope">
@ -547,7 +575,7 @@
<el-option <el-option
v-for="item in stddictOptions" v-for="item in stddictOptions"
:key="item.onum" :key="item.onum"
:label="item.dataDictCnName" :label="item.dataDictEngName + ' - '+item.dataDictCnName"
:value="item.onum"> :value="item.onum">
</el-option> </el-option>
</el-select> </el-select>
@ -849,7 +877,7 @@
<script setup name="Meta"> <script setup name="Meta">
import {getDataSourceList, getMetaDataList, getColumnList, getMetaClasList, postMetaSupp, getMetaDataRelship, getMetaDataBloodRelship, getProcData, runBloodAnalysis, publishAstData} from "@/api/meta/metaInfo" import {getDataSourceList, getMetaDataList, getColumnList, getMetaClasList, postMetaSupp, getMetaDataRelship, getMetaDataBloodRelship, getProcData, runBloodAnalysis, publishAstData} from "@/api/meta/metaInfo"
import { getMetaSecurityData } from "@/api/dataAsset/directory" import { getMetaSecurityData } from "@/api/dataAsset/directory"
import { listStdDictNoPage } from "@/api/datastd/std.js" import {getStdDict, listStdDictNoPage, listStdMainSelect} from "@/api/datastd/std.js"
import { ref, nextTick, computed, watch, reactive, onMounted } from 'vue' import { ref, nextTick, computed, watch, reactive, onMounted } from 'vue'
import SQLCodeMirror from "@/components/codemirror/SQLCodeMirror.vue"; import SQLCodeMirror from "@/components/codemirror/SQLCodeMirror.vue";
import cache from "@/plugins/cache"; import cache from "@/plugins/cache";
@ -860,6 +888,7 @@
import {getDirectoryTree} from "@/api/metadataConfig/directory.js"; import {getDirectoryTree} from "@/api/metadataConfig/directory.js";
import {EditPen} from "@element-plus/icons-vue"; import {EditPen} from "@element-plus/icons-vue";
import { useRoute} from 'vue-router'; import { useRoute} from 'vue-router';
import {datasourcetree} from "@/api/meta/metatask.js";
const data = reactive({ const data = reactive({
queryParams:{ queryParams:{
ssysId:'', ssysId:'',
@ -868,7 +897,7 @@
colName:'', colName:'',
tabType:'', tabType:'',
tagName:'', tagName:'',
recStat:'', // recStat:'',
pageNum:1, pageNum:1,
pageSize:10 pageSize:10
}, },
@ -885,6 +914,7 @@
tags:[] tags:[]
} }
}) })
const { proxy } = getCurrentInstance();
const route = useRoute(); const route = useRoute();
// const router = useRouter() // const router = useRouter()
const { queryParams, currentMetaData } = toRefs(data); const { queryParams, currentMetaData } = toRefs(data);
@ -894,6 +924,8 @@
const columnList = ref([]); const columnList = ref([]);
const tableTagDialog = ref(false); const tableTagDialog = ref(false);
const metaClasList = ref([]); const metaClasList = ref([]);
const currentDictForm = ref({});
const { std_code_status } = proxy.useDict("std_code_status","std_code_appr");
const columnInfoDialog = ref(false); const columnInfoDialog = ref(false);
const currentColumnData = ref({}); const currentColumnData = ref({});
const loadingBusiness = ref(false); const loadingBusiness = ref(false);
@ -922,7 +954,6 @@
const procId = ref(-1); const procId = ref(-1);
const activeColumnTab = ref("column"); const activeColumnTab = ref("column");
const businessOptionSelect = ref("er"); const businessOptionSelect = ref("er");
const { proxy } = getCurrentInstance();
const changedColumns = ref([]) const changedColumns = ref([])
const businessRelation = ref([]) const businessRelation = ref([])
const bloodRelation = ref([]) const bloodRelation = ref([])
@ -1384,9 +1415,43 @@
getMetaClasList().then(res=>{ getMetaClasList().then(res=>{
metaClasList.value = res.data metaClasList.value = res.data
}) })
remoteStddict() // remoteStddict()
remoteSecLvl() remoteSecLvl()
} }
function showDataDict(dictId){
currentDictForm.value.loading = true
getStdDict(dictId).then(res=>{
currentDictForm.value = {...res.data}
if (std_code_status.value && std_code_status.value.length>0){
for (let i = 0; i < std_code_status.value.length; i++) {
if (std_code_status.value[i].value === currentDictForm.value.dataDictVest){
currentDictForm.value.dataDictVestName = std_code_status.value[i].label
}
}
}
datasourcetree().then((response) => {
let dataList = response.rows;
if (dataList && dataList.length>0){
for (let i = 0; i < dataList.length; i++) {
if (dataList[i].id === currentDictForm.value.srcSys){
currentDictForm.value.srcSysName = dataList[i].name
}
}
}
listStdMainSelect("").then(res=>{
let dataList = res.data;
if(dataList && dataList.length>0){
for (let i = 0; i < dataList.length; i++) {
if(currentDictForm.value.dataStdNo === dataList[i].dataStdNo){
currentDictForm.value.dataStdValue = dataList[i].dataStdNo + '-' + dataList[i].dataStdEngName + '-' + dataList[i].dataStdCnName
}
}
}
currentDictForm.value.loading = false
})
})
})
}
function showColumnDialog(row) { function showColumnDialog(row) {
columnList.value = [] columnList.value = []
let tableData = JSON.parse(JSON.stringify(row)) let tableData = JSON.parse(JSON.stringify(row))
@ -1486,6 +1551,7 @@
getDirectoryTree({pageSize: 999}).then(res => { getDirectoryTree({pageSize: 999}).then(res => {
directoryTree.value = res.rows directoryTree.value = res.rows
}) })
remoteStddict();
} }
function findFullPathNames(targetId) { function findFullPathNames(targetId) {
@ -1529,7 +1595,7 @@
colName:'', colName:'',
tabType:'', tabType:'',
tagName:'', tagName:'',
recStat:'', // recStat:'',
pageNum:1, pageNum:1,
pageSize:10 pageSize:10
} }
@ -1767,7 +1833,7 @@
// fldNullRate: column.fldNullRate, // fldNullRate: column.fldNullRate,
dataDictId: column.dataDictId, dataDictId: column.dataDictId,
dataSecLvl: column.dataSecLvl, dataSecLvl: column.dataSecLvl,
recStat: column.recStat // recStat: column.recStat
}) })
} }
} }
@ -1798,7 +1864,6 @@
queryParams.value.tabName = route.query.tabName queryParams.value.tabName = route.query.tabName
} }
handleQuery().then(()=>{ handleQuery().then(()=>{
console.log(dataList.value.length)
if (dataList.value.length === 1){ if (dataList.value.length === 1){
showColumnDialog(dataList.value[0]) showColumnDialog(dataList.value[0])
} }

5
vue-fastapi-frontend/src/views/meta/metasercurity/MetaSecurityCol.vue

@ -143,8 +143,8 @@
</el-table-column> </el-table-column>
<el-table-column label="操作" align="center" width="180"> <el-table-column label="操作" align="center" width="180">
<template #default="scope"> <template #default="scope">
<el-button @click="handleEdit(scope.row)" type="text" icon="Edit" /> <el-button @click="handleEdit(scope.row)" link icon="Edit" />
<el-button @click="handleRemove(scope.row)" type="text" icon="Delete" /> <el-button @click="handleRemove(scope.row)" link icon="Delete" />
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -320,7 +320,6 @@ const getIconClass = (data) => {
let icon="" let icon=""
if (data.parentId == '0') icon= 'Monitor'; if (data.parentId == '0') icon= 'Monitor';
if (data.parentId == '99999') icon= 'Coin'; if (data.parentId == '99999') icon= 'Coin';
console.log(icon)
return icon; return icon;
}; };
const dbResourceOptions = ref(undefined); const dbResourceOptions = ref(undefined);

5
vue-fastapi-frontend/src/views/meta/metasercurity/MetaSecurityRow.vue

@ -135,8 +135,8 @@
</el-table-column> </el-table-column>
<el-table-column label="操作" align="center" width="180"> <el-table-column label="操作" align="center" width="180">
<template #default="scope"> <template #default="scope">
<el-button @click="handleEdit(scope.row)" type="text" icon="Edit" /> <el-button @click="handleEdit(scope.row)" link icon="Edit" />
<el-button @click="handleRemove(scope.row)" type="text" icon="Delete" /> <el-button @click="handleRemove(scope.row)" link icon="Delete" />
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -402,7 +402,6 @@ const getIconClass = (data) => {
let icon="" let icon=""
if (data.parentId == '0') icon= 'Monitor'; if (data.parentId == '0') icon= 'Monitor';
if (data.parentId == '99999') icon= 'Coin'; if (data.parentId == '99999') icon= 'Coin';
console.log(icon)
return icon; return icon;
}; };
const userOrRoleList = ref([]); const userOrRoleList = ref([]);

56
vue-fastapi-frontend/src/views/meta/metatask/index.vue

@ -368,45 +368,36 @@
<el-dropdown-menu> <el-dropdown-menu>
<el-dropdown-item <el-dropdown-item
command="handleUp" command="handleUp"
icon="circle-check" icon="circle-check"
:disabled="row.status === 'ONLINE'" :disabled="row.status === 'ONLINE'"
v-hasPermi="['meta:metatask:up']"
> >
上线 上线
</el-dropdown-item> </el-dropdown-item>
<el-dropdown-item <el-dropdown-item
command="handleDown" command="handleDown"
icon="circle-check" icon="circle-check"
:disabled="row.status === 'OFFLINE'" :disabled="row.status === 'OFFLINE'"
v-hasPermi="['meta:metatask:down']"
> >
下线 下线
</el-dropdown-item> </el-dropdown-item>
<el-dropdown-item <el-dropdown-item
command="handleDS" command="handleDS"
icon="circle-check" icon="circle-check"
:disabled="row.status === 'OFFLINE'" :disabled="row.status === 'OFFLINE'"
v-hasPermi="['meta:metatask:ds']"
> >
调度 调度
</el-dropdown-item> </el-dropdown-item>
<el-dropdown-item <el-dropdown-item
command="handleRun" command="handleRun"
icon="circle-check" icon="circle-check"
:disabled="row.status === 'OFFLINE'" :disabled="row.status === 'OFFLINE'"
v-hasPermi="['meta:metatask:run']"
> >
运行 运行
</el-dropdown-item> </el-dropdown-item>
<el-dropdown-item <el-dropdown-item
command="handleLog" command="handleLog"
icon="circle-check" icon="circle-check"
v-hasPermi="['meta:metatask:log']"
> >
日志 日志
</el-dropdown-item> </el-dropdown-item>
@ -429,7 +420,7 @@
</el-row> </el-row>
<el-dialog v-model="open" width="600px" append-to-body> <el-dialog v-model="open" width="600px" append-to-body>
<template #title> <template #header>
<el-cascader <el-cascader
v-model="form.metataskType" v-model="form.metataskType"
:options="metataskTypeOptions" :options="metataskTypeOptions"
@ -585,7 +576,7 @@ const activeTab = ref("dataSource");
const loading = ref(true); const loading = ref(true);
const ids = ref([]); const ids = ref([]);
const idnames = ref([]); const idnames = ref([]);
const dsIds = ref([]); const dsIds = ref('');
const single = ref(true); const single = ref(true);
const isEdit = ref(true); const isEdit = ref(true);
const singleOne = ref(true); // Online, Edit, Delete const singleOne = ref(true); // Online, Edit, Delete
@ -633,6 +624,7 @@ const data = reactive({
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
dbRcode: undefined, dbRcode: undefined,
dbRcodeStr:undefined,
dsId: undefined, dsId: undefined,
metataskName: undefined, metataskName: undefined,
metataskType: undefined, metataskType: undefined,
@ -716,7 +708,7 @@ const getDeptTree = async () => {
}; };
const getListNameById = (id) => { const getListNameById = (id) => {
const item = dbResourceOldList.value.find(item => item.id == id); const item = dbResourceOldList.value.find(item => item.id === id);
return item!=null ? item.name : ''; return item!=null ? item.name : '';
}; };
@ -728,10 +720,18 @@ const filterNode = (value, data) => {
const handleNodeClick = (data) => { const handleNodeClick = (data) => {
clickNode.value = data; clickNode.value = data;
queryParams.value.dbRCode = data.id; queryParams.value.dbRcodeStr = getAllChildOnums(data).join(',');
handleQuery(); handleQuery();
}; };
const getAllChildOnums = (node) => {
const ids = [node.id]; // onum
if (node.children && node.children.length > 0) {
node.children.forEach(childNode => {
ids.push(...getAllChildOnums(childNode)); //
});
}
return ids;
};
const cancel = () => { const cancel = () => {
open.value = false; open.value = false;
reset(); reset();

18
vue-fastapi-frontend/src/views/metadataConfig/clas/index.vue

@ -20,7 +20,6 @@
:highlight-current="true" :highlight-current="true"
:expand-on-click-node="false" :expand-on-click-node="false"
:data="directoryTree" :data="directoryTree"
:props="defaultProps"
:filter-node-method="filterNode" :filter-node-method="filterNode"
:current-node-key="currentNode.tempId" :current-node-key="currentNode.tempId"
@node-click="handleNodeClick" @node-click="handleNodeClick"
@ -357,6 +356,7 @@ import MergerDialog from './components/MergerDialog.vue'
import AssetMoveDialog from './components/AssetMoveDialog.vue' import AssetMoveDialog from './components/AssetMoveDialog.vue'
const queryForm = reactive({ const queryForm = reactive({
clasPriClas: '', clasPriClas: '',
onumStr:'',
clasName: '', clasName: '',
beltBatchContent:null, beltBatchContent:null,
pageNum: 1, pageNum: 1,
@ -513,16 +513,24 @@ setDirectoryTree().then(async () => {
} }
}) })
const handleNodeClick = async (data) => { const handleNodeClick = async (data) => {
if(data.contentOnum==1){ if(data.contentOnum===1){
queryForm.beltBatchContent=null queryForm.beltBatchContent=null
form.beltBatchContent=null form.beltBatchContent=null
}else{ }else{
form.beltBatchContent=data.contentOnum form.beltBatchContent=data.contentOnum
queryForm.beltBatchContent=data.contentOnum queryForm.onumStr = getAllChildOnums(data).join(',')
} }
handleSearch(); handleSearch();
} }
const getAllChildOnums = (node) => {
const ids = [node.contentOnum]; // onum
if (node.children && node.children.length > 0) {
node.children.forEach(childNode => {
ids.push(...getAllChildOnums(childNode)); //
});
}
return ids;
};
const filterText = ref(undefined) const filterText = ref(undefined)
const treeRef = ref(null) const treeRef = ref(null)
watch(filterText, (val) => { watch(filterText, (val) => {

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

@ -538,6 +538,10 @@
</el-table-column> </el-table-column>
</el-table> </el-table>
</div> </div>
<div style="text-align: center;margin-top: 10px">
<el-button type="success" icon="Select" @click="agree({id:currentFlowId})">同意</el-button>
<el-button type="danger" icon="CloseBold" @click="reject({id:currentFlowId})">驳回</el-button>
</div>
</el-dialog> </el-dialog>
<el-dialog v-model="metaData.metaDataListDialog" width="80%" title="导入元数据"> <el-dialog v-model="metaData.metaDataListDialog" width="80%" title="导入元数据">
<el-table <el-table
@ -603,20 +607,40 @@
v-model:limit="metaData.pageSize" v-model:limit="metaData.pageSize"
@pagination="getMetaDataList" @pagination="getMetaDataList"
/> />
<div style="text-align: center;margin-top: 10px">
<el-button type="success" icon="Select" @click="agree({id:currentFlowId})">同意</el-button>
<el-button type="danger" icon="CloseBold" @click="reject({id:currentFlowId})">驳回</el-button>
</div>
</el-dialog> </el-dialog>
<!-- 弹窗 --> <!-- 弹窗 -->
<el-dialog v-model="stdMainVisible" title="数据标准变更详情" width="80%"> <el-dialog v-model="stdMainVisible" title="数据标准变更详情" width="80%">
<DataStdMainTable :flowId="selectedFlowId" :stdMainVisible="stdMainVisible"/> <DataStdMainTable :flowId="selectedFlowId" :stdMainVisible="stdMainVisible"/>
<div style="text-align: center;margin-top: 10px">
<el-button type="success" icon="Select" @click="agree({id:currentFlowId})">同意</el-button>
<el-button type="danger" icon="CloseBold" @click="reject({id:currentFlowId})">驳回</el-button>
</div>
</el-dialog> </el-dialog>
<el-dialog v-model="stdDictVisible" title="数据字典变更详情" width="80%" > <el-dialog v-model="stdDictVisible" title="数据字典变更详情" width="80%" >
<DataStdDictTable :flowId="selectedFlowId" :stdDictVisible="stdDictVisible"/> <DataStdDictTable :flowId="selectedFlowId" :stdDictVisible="stdDictVisible"/>
<div style="text-align: center;margin-top: 10px">
<el-button type="success" icon="Select" @click="agree({id:currentFlowId})">同意</el-button>
<el-button type="danger" icon="CloseBold" @click="reject({id:currentFlowId})">驳回</el-button>
</div>
</el-dialog> </el-dialog>
<el-dialog v-model="stdCodeVisible" title="标准代码变更详情" width="80%" > <el-dialog v-model="stdCodeVisible" title="标准代码变更详情" width="80%" >
<DataStdCodeTable :flowId="selectedFlowId" :stdCodeVisible="stdCodeVisible"/> <DataStdCodeTable :flowId="selectedFlowId" :stdCodeVisible="stdCodeVisible"/>
<div style="text-align: center;margin-top: 10px">
<el-button type="success" icon="Select" @click="agree({id:currentFlowId})">同意</el-button>
<el-button type="danger" icon="CloseBold" @click="reject({id:currentFlowId})">驳回</el-button>
</div>
</el-dialog> </el-dialog>
<el-dialog v-model="dataAssetMainVisible" title="数据资产变更详情" width="80%" > <el-dialog v-model="dataAssetMainVisible" title="数据资产变更详情" width="80%" >
<DataAssetMainAppr :flowId="selectedFlowId" :dataAssetMainVisible="dataAssetMainVisible"/> <DataAssetMainAppr :flowId="selectedFlowId" :dataAssetMainVisible="dataAssetMainVisible"/>
<div style="text-align: center;margin-top: 10px">
<el-button type="success" icon="Select" @click="agree({id:currentFlowId})">同意</el-button>
<el-button type="danger" icon="CloseBold" @click="reject({id:currentFlowId})">驳回</el-button>
</div>
</el-dialog> </el-dialog>
</div> </div>
</template> </template>
@ -666,6 +690,7 @@ const metaData = ref({
const oldTableInfo = ref([]); const oldTableInfo = ref([]);
const oldColumnList = ref([]); const oldColumnList = ref([]);
const newTableInfo = ref([]); const newTableInfo = ref([]);
const currentFlowId = ref('');
const newColumnList = ref([]); const newColumnList = ref([]);
const total = ref(0); const total = ref(0);
const { queryParams } = toRefs(data); const { queryParams } = toRefs(data);
@ -1091,6 +1116,7 @@ function getMetaDataList(){
}) })
} }
function showBusinessDataDialog(row){ function showBusinessDataDialog(row){
currentFlowId.value = row.id
if (row.businessType === 'metaDataInfo'){ if (row.businessType === 'metaDataInfo'){
metaData.value.businessId = row.businessId metaData.value.businessId = row.businessId
let param = { let param = {
@ -1136,6 +1162,10 @@ function agree(row){
getWaitingFlowCount().then(res=>{ getWaitingFlowCount().then(res=>{
cache.local.set("waitingTotal",res.data) cache.local.set("waitingTotal",res.data)
}) })
stdMainVisible.value = false;
stdDictVisible.value = false;
stdCodeVisible.value = false;
dataAssetMainVisible.value = false;
getList() getList()
}) })
} }

Loading…
Cancel
Save