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. 7
      vue-fastapi-frontend/src/views/meta/metasercurity/MetaSecurityCol.vue
  24. 7
      vue-fastapi-frontend/src/views/meta/metasercurity/MetaSecurityRow.vue
  25. 66
      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 fastapi import APIRouter, Depends, Request
from fastapi import APIRouter, Depends, Request, File, UploadFile, Query
from sqlalchemy.ext.asyncio import AsyncSession
from config.get_db import get_db
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.cdplb_service import CdplbService
from utils.response_util import ResponseUtil
from utils.common_util import bytes2file_response
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)):
result = await CdplbService.delete_cdplb(query_db, array)
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 fastapi import APIRouter, Depends, Request
from fastapi import APIRouter, Depends, Request, UploadFile, File, Query
from sqlalchemy.ext.asyncio import AsyncSession
from config.get_db import get_db
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.fccbd_service import FccbdService
from utils.response_util import ResponseUtil
from utils.common_util import bytes2file_response
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)):
result = await FccbdService.delete_fccbd(query_db, array)
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 fastapi import APIRouter, Depends, Request
from fastapi import APIRouter, Depends, Request, UploadFile, File, Query
from sqlalchemy.ext.asyncio import AsyncSession
from config.get_db import get_db
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.tsmcb_service import TsmcbService
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.get("/list")
async def get_tsmcb_list(request: Request, tsmcb_query: TsmcbPageObject = Depends(TsmcbPageObject.as_query),
query_db: AsyncSession = Depends(get_db),
current_user: CurrentUserModel = Depends(LoginService.get_current_user)):
query_db: AsyncSession = Depends(get_db),
current_user: CurrentUserModel = Depends(LoginService.get_current_user)):
meta_query_result = await TsmcbService.get_tsmcb_list_services(query_db, tsmcb_query, current_user)
return ResponseUtil.success(data=meta_query_result)
@tsmcbController.post("/save")
async def save_tsmcb(request: Request,
saveTsmcbModel: SaveTsmcbModel,
query_db: AsyncSession = Depends(get_db),
current_user: CurrentUserModel = Depends(LoginService.get_current_user)):
saveTsmcbModel: SaveTsmcbModel,
query_db: AsyncSession = Depends(get_db),
current_user: CurrentUserModel = Depends(LoginService.get_current_user)):
result = await TsmcbService.save_tsmcb(query_db, saveTsmcbModel, current_user)
return ResponseUtil.success(msg=result.message)
@tsmcbController.post("/delete")
async def delete_tsmcb(request: Request,
array: List[str],
query_db: AsyncSession = Depends(get_db),
current_user: CurrentUserModel = Depends(LoginService.get_current_user)):
array: List[str],
query_db: AsyncSession = Depends(get_db),
current_user: CurrentUserModel = Depends(LoginService.get_current_user)):
result = await TsmcbService.delete_tsmcb(query_db, array)
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):
query = (
select(SysFccbd).where(
SysFccbd.pos == fccbd_query.pos if fccbd_query.pos else True,
SysFccbd.pos_name == fccbd_query.pos_name if fccbd_query.pos_name else True,
SysFccbd.term == fccbd_query.term if fccbd_query.term else True,
SysFccbd.pos.like(f'%{fccbd_query.pos}%') if fccbd_query.pos else True,
SysFccbd.pos_name.like(f'%{fccbd_query.pos_name}%') if fccbd_query.pos_name 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
).distinct()
)

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

@ -59,7 +59,7 @@ class MetadataConfigDao:
获取标签信息列表支持分页
"""
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_eff_flag == query_object.clas_eff_flag if query_object.clas_eff_flag else True,
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_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.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(
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)),

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):
query = (
select(SysSscf).where(
SysSscf.keyword == sscf_query.keyword if sscf_query.keyword else True,
SysSscf.type == sscf_query.type if sscf_query.type else True,
SysSscf.dasset_id == sscf_query.dasset_id if sscf_query.dasset_id else True,
SysSscf.keyword.like(f'%{sscf_query.keyword}%') if sscf_query.keyword else True,
SysSscf.type.like(f'%{sscf_query.type}%') if sscf_query.type 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
).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):
query = (
select(SysTsmcb).where(
SysTsmcb.pos == tsmcb_query.pos if tsmcb_query.pos else True,
SysTsmcb.type == 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.pos.like(f'%{tsmcb_query.pos}%') if tsmcb_query.pos else True,
SysTsmcb.type.like(f'%{tsmcb_query.type}%') if tsmcb_query.type 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
).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):
query = (
select(SysVecset).where(
SysVecset.dasset_id == vecset_query.dasset_id if vecset_query.dasset_id else True,
SysVecset.stab_name == vecset_query.stab_name if vecset_query.stab_name else True,
SysVecset.squery == vecset_query.squery if vecset_query.squery else True,
SysVecset.sanal_plan == vecset_query.sanal_plan if vecset_query.sanal_plan else True,
SysVecset.dasset_id.in_(vecset_query.dasset_id.split(',')) if vecset_query.dasset_id else True,
SysVecset.stab_name.like(f'%{vecset_query.stab_name}%') if vecset_query.stab_name else True,
SysVecset.squery.like(f'%{vecset_query.squery}%') if vecset_query.squery 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.data_domain == vecset_query.data_domain if vecset_query.data_domain else True,
).distinct()
)
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='开始时间')
end_time: Optional[str] = Field(default=None, description='结束时间')
@ -44,6 +45,7 @@ class MetadataClasPageQueryModel(MetadataClasQueryModel):
"""
标签信息分页查询模型
"""
page_num: int = Field(default=1, 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='开始时间')
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 uuid
from typing import Optional, List
import pandas as pd
from fastapi import UploadFile
from sqlalchemy.ext.asyncio import AsyncSession
from module_admin.entity.vo.common_vo import CrudResponseModel
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 exceptions.exception import ServiceException, ServiceWarning
from datetime import datetime
from utils.common_util import CamelCaseUtil
from utils.common_util import *
class CdplbService:
@ -52,3 +56,99 @@ class CdplbService:
await db.commit()
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 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 module_admin.entity.vo.common_vo import CrudResponseModel
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 exceptions.exception import ServiceException, ServiceWarning
from datetime import datetime
from utils.common_util import CamelCaseUtil
from utils.common_util import *
class FccbdService:
@ -52,3 +55,92 @@ class FccbdService:
await db.commit()
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 uuid
from typing import Optional, List
import pandas as pd
from fastapi import UploadFile
from sqlalchemy.ext.asyncio import AsyncSession
from module_admin.entity.vo.common_vo import CrudResponseModel
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 exceptions.exception import ServiceException, ServiceWarning
from datetime import datetime
from utils.common_util import CamelCaseUtil
from utils.common_util import *
class TsmcbService:
@ -52,3 +56,99 @@ class TsmcbService:
await db.commit()
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 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>
<div class="returnToHere" style="margin-top: 5px;margin-bottom: 5px">
<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) => {
if (newValue){
compiledMarkdown.value = md.render(newValue);
compiledMarkdown.value = md.render(newValue+'');
}
}, { immediate: true });
</script>

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

@ -141,11 +141,95 @@
</div>
</template>
</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>
</template>
<script setup>
import { ref, nextTick, computed, watch, reactive, onMounted } from 'vue'
import { getCdplbList, saveCdplb, deleteCdplb } from "@/api/dataint/cdplb"
import {getToken} from "@/utils/auth.js";
import * as XLSX from "xlsx";
const { proxy } = getCurrentInstance();
const queryParams = ref({
@ -176,6 +260,49 @@ const currentForm = ref({
const multSelection = ref([])
const dataList = ref([])
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(){
queryParams.value.pageNum = 1;
getList()
@ -254,10 +381,27 @@ function handleDelete(array){
})
}
function handleImport(){
upload.title = "数据导入";
upload.open = true;
}
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){
multSelection.value= val

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

@ -12,8 +12,8 @@
</el-form-item>
<el-form-item label="状态:">
<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-form-item>
<el-form-item>
@ -135,11 +135,95 @@
</div>
</template>
</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>
</template>
<script setup>
import { ref, nextTick, computed, watch, reactive, onMounted } from 'vue'
import { getFccbdList, saveFccbd, deleteFccbd } from "@/api/dataint/fccbd"
import {getToken} from "@/utils/auth.js";
import * as XLSX from "xlsx";
const { proxy } = getCurrentInstance();
@ -169,6 +253,49 @@ const currentForm = ref({
})
const dataList = ref([])
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(){
queryParams.value.pageNum = 1;
getList()
@ -246,10 +373,26 @@ function handleDelete(array){
})
}
function handleImport(){
upload.title = "数据导入";
upload.open = true;
}
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){
multSelection.value= val

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

@ -150,11 +150,95 @@
</div>
</template>
</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>
</template>
<script setup>
import { ref, nextTick, computed, watch, reactive, onMounted } from 'vue'
import { getTsmcbList, saveTsmcb, deleteTsmcb } from "@/api/dataint/tsmcb"
import * as XLSX from "xlsx";
import {getToken} from "@/utils/auth.js";
const { proxy } = getCurrentInstance();
@ -186,6 +270,49 @@ const multSelection =ref([])
const dataList = ref([])
const total = ref(0)
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(){
queryParams.value.pageNum = 1;
getList()
@ -264,10 +391,27 @@ function handleDelete(array){
})
}
function handleImport(){
upload.title = "数据导入";
upload.open = true;
}
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){
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 queryParams = ref({
dassetId:'',
dassetId:[],
keyword:'',
type:'',
status:'',
@ -340,9 +340,19 @@ function getList(){
}
/** 节点单击事件 */
function handleNodeClick(data) {
queryParams.value.dassetId = data.onum;
queryParams.value.dassetId = getAllChildOnums(data).join(',');
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(){
queryParams.value = {
pos:'',

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

@ -401,9 +401,19 @@ function getList(){
}
/** 节点单击事件 */
function handleNodeClick(data) {
queryParams.value.dassetId = data.onum;
queryParams.value.dassetId = getAllChildOnums(data).join(',');
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(){
queryParams.value = {
pos:'',

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

@ -76,15 +76,15 @@
@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 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>
@ -135,9 +135,11 @@
<el-table-column label="对象中文名" width="100" align="center" prop="tabCnName"></el-table-column>
<el-table-column label="对象标签" width="200" align="center" prop="batchTabClas">
<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>
<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>
<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">
<template #default="scope">
<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"
effect="dark"
:content="scope.row.tabDesc"
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>
</template>
</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="对象治理标志" width="120" align="center" prop="govFlag">
<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="采集时间" width="200" align="center" prop="extractUpdTime">
<template #default="scope">
@ -327,9 +334,11 @@
<!-- </el-table-column>-->
<el-table-column label="字段标签" width="150" align="center" prop="fldClas">
<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>
<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>
<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>-->
<!-- </template>-->
<!-- </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="suppUpdTime" width="180">
<template #default="scope">
@ -547,7 +575,7 @@
<el-option
v-for="item in stddictOptions"
:key="item.onum"
:label="item.dataDictCnName"
:label="item.dataDictEngName + ' - '+item.dataDictCnName"
:value="item.onum">
</el-option>
</el-select>
@ -849,7 +877,7 @@
<script setup name="Meta">
import {getDataSourceList, getMetaDataList, getColumnList, getMetaClasList, postMetaSupp, getMetaDataRelship, getMetaDataBloodRelship, getProcData, runBloodAnalysis, publishAstData} from "@/api/meta/metaInfo"
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 SQLCodeMirror from "@/components/codemirror/SQLCodeMirror.vue";
import cache from "@/plugins/cache";
@ -860,6 +888,7 @@
import {getDirectoryTree} from "@/api/metadataConfig/directory.js";
import {EditPen} from "@element-plus/icons-vue";
import { useRoute} from 'vue-router';
import {datasourcetree} from "@/api/meta/metatask.js";
const data = reactive({
queryParams:{
ssysId:'',
@ -868,7 +897,7 @@
colName:'',
tabType:'',
tagName:'',
recStat:'',
// recStat:'',
pageNum:1,
pageSize:10
},
@ -885,6 +914,7 @@
tags:[]
}
})
const { proxy } = getCurrentInstance();
const route = useRoute();
// const router = useRouter()
const { queryParams, currentMetaData } = toRefs(data);
@ -894,6 +924,8 @@
const columnList = ref([]);
const tableTagDialog = ref(false);
const metaClasList = ref([]);
const currentDictForm = ref({});
const { std_code_status } = proxy.useDict("std_code_status","std_code_appr");
const columnInfoDialog = ref(false);
const currentColumnData = ref({});
const loadingBusiness = ref(false);
@ -922,7 +954,6 @@
const procId = ref(-1);
const activeColumnTab = ref("column");
const businessOptionSelect = ref("er");
const { proxy } = getCurrentInstance();
const changedColumns = ref([])
const businessRelation = ref([])
const bloodRelation = ref([])
@ -1384,9 +1415,43 @@
getMetaClasList().then(res=>{
metaClasList.value = res.data
})
remoteStddict()
// remoteStddict()
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) {
columnList.value = []
let tableData = JSON.parse(JSON.stringify(row))
@ -1486,6 +1551,7 @@
getDirectoryTree({pageSize: 999}).then(res => {
directoryTree.value = res.rows
})
remoteStddict();
}
function findFullPathNames(targetId) {
@ -1529,7 +1595,7 @@
colName:'',
tabType:'',
tagName:'',
recStat:'',
// recStat:'',
pageNum:1,
pageSize:10
}
@ -1767,7 +1833,7 @@
// fldNullRate: column.fldNullRate,
dataDictId: column.dataDictId,
dataSecLvl: column.dataSecLvl,
recStat: column.recStat
// recStat: column.recStat
})
}
}
@ -1798,7 +1864,6 @@
queryParams.value.tabName = route.query.tabName
}
handleQuery().then(()=>{
console.log(dataList.value.length)
if (dataList.value.length === 1){
showColumnDialog(dataList.value[0])
}

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

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

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

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

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

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

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

@ -20,7 +20,6 @@
:highlight-current="true"
:expand-on-click-node="false"
:data="directoryTree"
:props="defaultProps"
:filter-node-method="filterNode"
:current-node-key="currentNode.tempId"
@node-click="handleNodeClick"
@ -357,6 +356,7 @@ import MergerDialog from './components/MergerDialog.vue'
import AssetMoveDialog from './components/AssetMoveDialog.vue'
const queryForm = reactive({
clasPriClas: '',
onumStr:'',
clasName: '',
beltBatchContent:null,
pageNum: 1,
@ -513,16 +513,24 @@ setDirectoryTree().then(async () => {
}
})
const handleNodeClick = async (data) => {
if(data.contentOnum==1){
if(data.contentOnum===1){
queryForm.beltBatchContent=null
form.beltBatchContent=null
}else{
form.beltBatchContent=data.contentOnum
queryForm.beltBatchContent=data.contentOnum
form.beltBatchContent=data.contentOnum
queryForm.onumStr = getAllChildOnums(data).join(',')
}
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 treeRef = ref(null)
watch(filterText, (val) => {

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

@ -538,6 +538,10 @@
</el-table-column>
</el-table>
</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 v-model="metaData.metaDataListDialog" width="80%" title="导入元数据">
<el-table
@ -603,20 +607,40 @@
v-model:limit="metaData.pageSize"
@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 v-model="stdMainVisible" title="数据标准变更详情" width="80%">
<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 v-model="stdDictVisible" title="数据字典变更详情" width="80%" >
<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 v-model="stdCodeVisible" title="标准代码变更详情" width="80%" >
<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 v-model="dataAssetMainVisible" title="数据资产变更详情" width="80%" >
<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>
</div>
</template>
@ -666,6 +690,7 @@ const metaData = ref({
const oldTableInfo = ref([]);
const oldColumnList = ref([]);
const newTableInfo = ref([]);
const currentFlowId = ref('');
const newColumnList = ref([]);
const total = ref(0);
const { queryParams } = toRefs(data);
@ -1091,6 +1116,7 @@ function getMetaDataList(){
})
}
function showBusinessDataDialog(row){
currentFlowId.value = row.id
if (row.businessType === 'metaDataInfo'){
metaData.value.businessId = row.businessId
let param = {
@ -1136,6 +1162,10 @@ function agree(row){
getWaitingFlowCount().then(res=>{
cache.local.set("waitingTotal",res.data)
})
stdMainVisible.value = false;
stdDictVisible.value = false;
stdCodeVisible.value = false;
dataAssetMainVisible.value = false;
getList()
})
}

Loading…
Cancel
Save