Browse Source

代码提交

master
siyaqi 1 day ago
parent
commit
980974db2b
  1. 59
      vue-fastapi-backend/module_admin/controller/metadata_config_controller.py
  2. 4
      vue-fastapi-backend/module_admin/entity/vo/metadata_config_vo.py
  3. 331
      vue-fastapi-backend/module_admin/service/metadata_config_service.py
  4. 32
      vue-fastapi-frontend/src/api/taskMetadataConfig/metadataConfig.js
  5. 606
      vue-fastapi-frontend/src/views/metadataConfig/taskBizConfig/index.vue

59
vue-fastapi-backend/module_admin/controller/metadata_config_controller.py

@ -632,35 +632,41 @@ async def get_task_biz_config_list_all(
@metadataConfigController.post('/taskBizConfig/add') @metadataConfigController.post('/taskBizConfig/add')
@ValidateFields(['bizModule', 'configType', 'data_sec_lvl', 'applyType']) @ValidateFields(['bizModule', 'configType', 'data_sec_lvl', 'applyType'])
async def add_task_biz_config( async def add_task_biz_config(
request: Request,
item: TaskBizConfigAddModel, item: TaskBizConfigAddModel,
db: AsyncSession = Depends(get_db), db: AsyncSession = Depends(get_db),
current_user: CurrentUserModel = Depends(LoginService.get_current_user), current_user: CurrentUserModel = Depends(LoginService.get_current_user),
): ):
item.create_by = current_user.user.user_name item.create_by = current_user.user.user_name
item.create_time = datetime.now() item.create_time = datetime.now()
result = await MetadataConfigService.add_task_biz_config_services(db, item) result = await MetadataConfigService.add_task_biz_config_services(db, item,current_user,request)
return ResponseUtil.success(msg=result.message) return ResponseUtil.success(msg=result.message)
@metadataConfigController.post('/taskBizConfig/edit') @metadataConfigController.post('/taskBizConfig/edit')
@ValidateFields(['onum']) @ValidateFields(['onum'])
async def edit_task_biz_config( async def edit_task_biz_config(
request: Request,
item: TaskBizConfigAddModel, item: TaskBizConfigAddModel,
db: AsyncSession = Depends(get_db), db: AsyncSession = Depends(get_db),
current_user: CurrentUserModel = Depends(LoginService.get_current_user), current_user: CurrentUserModel = Depends(LoginService.get_current_user),
): ):
item.update_by = current_user.user.user_name item.update_by = current_user.user.user_name
item.update_time = datetime.now() item.update_time = datetime.now()
result = await MetadataConfigService.edit_task_biz_config_services(db, item) result = await MetadataConfigService.edit_task_biz_config_services(db, item,current_user,request)
return ResponseUtil.success(msg=result.message)
@metadataConfigController.delete('/taskBizConfig/delete')
async def delete_task_biz_config(onums: str, db: AsyncSession = Depends(get_db)):
result = await MetadataConfigService.delete_task_biz_config_services(db, onums)
return ResponseUtil.success(msg=result.message) return ResponseUtil.success(msg=result.message)
# @metadataConfigController.delete('/taskBizConfig/delete')
# async def delete_task_biz_config(onums: str, db: AsyncSession = Depends(get_db)):
# result = await MetadataConfigService.delete_task_biz_config_services(db, onums)
# return ResponseUtil.success(msg=result.message)
@metadataConfigController.delete('/taskBizConfig/{metatask_ids}/{ds_ids}')
async def delete_task_biz_config(request: Request, metatask_ids: str,ds_ids:str, query_db: AsyncSession = Depends(get_db),current_user: CurrentUserModel = Depends(LoginService.get_current_user)):
delete_config = DeleteMetataskModel(metatask_ids=metatask_ids,ds_ids=ds_ids)
delete_config_result = await MetadataConfigService.delete_task_biz_config_services(request, query_db, delete_config,current_user)
logger.info(delete_config_result.message)
return ResponseUtil.success(msg=delete_config_result.message)
@metadataConfigController.get('/taskBizConfig/detail') @metadataConfigController.get('/taskBizConfig/detail')
async def get_task_biz_config_detail(onum: str, db: AsyncSession = Depends(get_db)): async def get_task_biz_config_detail(onum: str, db: AsyncSession = Depends(get_db)):
data = await MetadataConfigService.get_task_biz_config_detail_services(db, onum) data = await MetadataConfigService.get_task_biz_config_detail_services(db, onum)
@ -673,3 +679,40 @@ async def get_task_biz_rela_config_list(
ai_chat_list_result = await MetadataConfigService.get_task_biz_config_rela_list_services(query_db, bizOnum) ai_chat_list_result = await MetadataConfigService.get_task_biz_config_rela_list_services(query_db, bizOnum)
logger.info('获取成功') logger.info('获取成功')
return ResponseUtil.success(data=ai_chat_list_result) return ResponseUtil.success(data=ai_chat_list_result)
@metadataConfigController.put('/taskBiz/upOrdown')
async def task_biz_up_or_down_meta_metatask(
request: Request,
DownOrUpdate: OperaMetataskModel,
query_db: AsyncSession = Depends(get_db),
current_user: CurrentUserModel = Depends(LoginService.get_current_user),
):
edit_config_result = await MetadataConfigService.up_or_down_metatask_services(request, query_db,current_user, DownOrUpdate.id,DownOrUpdate.type)
logger.info(edit_config_result.message)
return ResponseUtil.success(msg=edit_config_result.message)
@metadataConfigController.put('/taskBiz/DS')
async def task_biz_DS_meta_metatask(
request: Request,
process: ParmScheduleVo,
query_db: AsyncSession = Depends(get_db),
current_user: CurrentUserModel = Depends(LoginService.get_current_user)
):
edit_config_result = await MetadataConfigService.ds_metatask_services(request, query_db, process,current_user)
return ResponseUtil.success(msg=edit_config_result)
@metadataConfigController.delete('/taskBiz/DS')
async def task_biz_DS_meta_metatask_delete(
request: Request,
process: ParmScheduleVo,
query_db: AsyncSession = Depends(get_db),
current_user: CurrentUserModel = Depends(LoginService.get_current_user)
):
edit_config_result = await MetadataConfigService.ds_metatask_delete(request, query_db, process,current_user)
return ResponseUtil.success(msg=edit_config_result)

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

@ -362,7 +362,7 @@ class TaskBizConfigAddModel(BaseModel):
create_time: Optional[datetime] = Field(default=None, description='创建时间') create_time: Optional[datetime] = Field(default=None, description='创建时间')
update_by: Optional[str] = Field(default=None, description='更新者') update_by: Optional[str] = Field(default=None, description='更新者')
update_time: Optional[datetime] = Field(default=None, description='更新时间') update_time: Optional[datetime] = Field(default=None, description='更新时间')
status: Optional[str] = Field(default="N", description="状态") status: Optional[str] = Field(default="OFFLINE", description="状态")
ds_time: Optional[datetime] = Field(default=None, description="调度时间") ds_time: Optional[datetime] = Field(default=None, description="调度时间")
ds_ids: Optional[str] = Field(default=None, description="任务ID") ds_ids: Optional[str] = Field(default=None, description="任务ID")
schId: Optional[str] = Field(default=None, description="调度id") schId: Optional[str] = Field(default=None, description="调度id")
@ -381,7 +381,7 @@ class TaskBizConfigModel(BaseModel):
create_time: Optional[datetime] = Field(default=None, description='创建时间') create_time: Optional[datetime] = Field(default=None, description='创建时间')
update_by: Optional[str] = Field(default=None, description='更新者') update_by: Optional[str] = Field(default=None, description='更新者')
update_time: Optional[datetime] = Field(default=None, description='更新时间') update_time: Optional[datetime] = Field(default=None, description='更新时间')
status: Optional[str] = Field(default="N", description="状态") status: Optional[str] = Field(default="OFFLINE", description="状态")
ds_time: Optional[datetime] = Field(default=None, description="调度时间") ds_time: Optional[datetime] = Field(default=None, description="调度时间")
ds_ids: Optional[str] = Field(default=None, description="任务ID") ds_ids: Optional[str] = Field(default=None, description="任务ID")
schId: Optional[str] = Field(default=None, description="调度id") schId: Optional[str] = Field(default=None, description="调度id")

331
vue-fastapi-backend/module_admin/service/metadata_config_service.py

@ -9,9 +9,20 @@ from utils.common_util import CamelCaseUtil
from module_admin.entity.do.metadata_config_do import SecuBizConfigRela,TaskBizConfigRela # ORM 类 from module_admin.entity.do.metadata_config_do import SecuBizConfigRela,TaskBizConfigRela # ORM 类
from exceptions.exception import ServiceException from exceptions.exception import ServiceException
import uuid import uuid
from module_admin.entity.vo.dataSource_vo import ProcessDefinition,ParmScheduleVo,ProcessInstancePage,ParmSchedule
from typing import List from typing import List
from datetime import datetime from datetime import datetime
from module_admin.entity.vo.metaprocessconfig_vo import MetaprocessconfigQueryModel,MetaprocessconfigModel
from module_admin.service.metaprocessconfig_service import MetaprocessconfigService
import requests
from fastapi import Request,Depends
import json
import re
from config.enums import RedisInitKeyConfig
from config.env import AppConfig
from module_admin.entity.vo.user_vo import CurrentUserModel
from module_admin.entity.vo.metatask_vo import DeleteMetataskModel
from datetime import datetime
class MetadataConfigService: class MetadataConfigService:
""" """
元数据分类管理 Service 元数据分类管理 Service
@ -355,7 +366,7 @@ class MetadataConfigService:
return await MetadataConfigDao.get_task_biz_config_list(db, query_object, is_page) return await MetadataConfigDao.get_task_biz_config_list(db, query_object, is_page)
@classmethod @classmethod
async def add_task_biz_config_services(cls, db: AsyncSession, page_object: TaskBizConfigAddModel): async def add_task_biz_config_services(cls, db: AsyncSession, page_object: TaskBizConfigAddModel, current_user: CurrentUserModel, request: Request):
try: try:
config = TaskBizConfigModel() config = TaskBizConfigModel()
config.onum = page_object.onum config.onum = page_object.onum
@ -370,7 +381,7 @@ class MetadataConfigService:
config.update_time = page_object.update_time config.update_time = page_object.update_time
obj = await MetadataConfigDao.add_task_biz_config(db, config) obj = await MetadataConfigDao.add_task_biz_config(db, config)
page_object.onum=obj.onum
# 添加关联信息 # 添加关联信息
records: List[TaskBizConfigRela] = [] records: List[TaskBizConfigRela] = []
for tab_onum in page_object.tab_onum_list: for tab_onum in page_object.tab_onum_list:
@ -382,14 +393,77 @@ class MetadataConfigService:
records.append(record) records.append(record)
await MetadataConfigDao.add_batch_task_rela_dao(db, records) await MetadataConfigDao.add_batch_task_rela_dao(db, records)
# 获取流程配置
processconfig = MetaprocessconfigQueryModel()
processconfig.db_type = "BizConfig"
processConfigList = await MetaprocessconfigService.get_metaprocessconfig_list_services(db, processconfig, False)
message = await cls.biz_process_defind_change_add(request, processConfigList, page_object, current_user)
if "成功" not in message:
await db.rollback()
raise ServiceException(message=f'新增批次标签任务 {page_object.biz_name} 失败,dolphinscheduler 创建失败'+message)
config.onum=page_object.onum
config.ds_ids=page_object.ds_ids
edit_data = config.model_dump(exclude_unset=True)
await MetadataConfigDao.edit_task_biz_config(db, page_object.onum, edit_data)
await db.commit() await db.commit()
return CrudResponseModel(is_success=True, message="新增成功") return CrudResponseModel(is_success=True, message="新增成功")
except Exception as e: except Exception as e:
await db.rollback() await db.rollback()
raise e raise e
@classmethod @classmethod
async def edit_task_biz_config_services(cls, db: AsyncSession, page_object: TaskBizConfigAddModel): async def biz_process_defind_change_add(cls,request: Request, processConfigList: list[MetaprocessconfigModel],page_object:TaskBizConfigAddModel,current_user: CurrentUserModel):
projectCode = await request.app.state.redis.get(f'{RedisInitKeyConfig.SYS_CONFIG.key}:sys.ds.projectcode')
url = f'{AppConfig.ds_server_url}/dolphinscheduler/projects/'+projectCode+'/task-definition/gen-task-codes?genNum=5'
headers = {'dashUserName': current_user.user.user_name, 'dashPassword': current_user.user.password}
# 新增接口
url2=f'{AppConfig.ds_server_url}/dolphinscheduler/projects/'+projectCode+'/process-definition'
headers2 = {'dashUserName': current_user.user.user_name, 'dashPassword': current_user.user.password, 'Content-Type': 'application/x-www-form-urlencoded'}
response = requests.get(url, headers=headers, verify=False)
if response.reason == 'OK':
intdsids=[]
message=''
dstypes=[]
response_text = response.text
data = json.loads(response_text)
code_list = data["data"]
str_list = list(map(str, code_list))
for config in processConfigList:
modified_json_str = config.taskDefinitionJson.replace("18093081592672", str_list[0]).replace("sh /home/xx/code/remote_python.sh", "sh /home/xx/code/remote_python.sh "+str(page_object.onum))
modified_json_str2=config.taskRelationJson.replace("18093081592672", str_list[0])
modified_json_str3=config.locations.replace("18093081592672", str_list[0])
metaprocessconfig_dict = MetaprocessconfigModel(taskDefinitionJson=modified_json_str,# 替换taskDefinitionJson
description="", # 替换工作流备注
locations=modified_json_str3,# 替换locations
name =page_object.biz_name,# 替换工作流名称
timeout=config.timeout,
globalParams =config.globalParams ,
tenantCode =config.tenantCode ,
taskRelationJson =modified_json_str2,# 替换taskRelationJson
executionType =config.executionType ,
releaseState=config.releaseState
).model_dump(exclude_unset=True, by_alias=True)
form_data = {key: str(value) for key, value in metaprocessconfig_dict.items()}
response_post0 = requests.post(url2, headers=headers2,data=form_data,verify=False)
text= response_post0.text
responsJson = json.loads(text)
if responsJson['msg'] == 'success':
dstypes.append('1')
intdsids.append(responsJson['data']['code'])
if message:
message += ", "
message += page_object.biz_name + "-批次标签新增成功"
else:
if message:
message += ", "
message += page_object.biz_name + "-批次标签新增失败"
if len(intdsids)>0:
page_object.ds_ids=','.join([str(i) for i in intdsids])
return message
@classmethod
async def edit_task_biz_config_services(cls, db: AsyncSession, page_object: TaskBizConfigAddModel,current_user: CurrentUserModel,request: Request):
config = TaskBizConfigModel() config = TaskBizConfigModel()
config.onum = page_object.onum config.onum = page_object.onum
config.biz_name = page_object.biz_name config.biz_name = page_object.biz_name
@ -420,6 +494,10 @@ class MetadataConfigService:
records.append(record) records.append(record)
await MetadataConfigDao.add_batch_task_rela_dao(db, records) await MetadataConfigDao.add_batch_task_rela_dao(db, records)
message= await cls.sec_process_defind_change_update(request,page_object,info,current_user)
if "成功" not in message:
await db.rollback()
raise ServiceException(message=f'更新批次标签任务 {page_object.biz_name} 失败,dolphinscheduler 创建失败'+message)
await db.commit() await db.commit()
return CrudResponseModel(is_success=True, message="更新成功") return CrudResponseModel(is_success=True, message="更新成功")
except Exception as e: except Exception as e:
@ -427,24 +505,241 @@ class MetadataConfigService:
raise e raise e
else: else:
raise ServiceException(message="任务业务配置不存在") raise ServiceException(message="任务业务配置不存在")
@classmethod @classmethod
async def delete_task_biz_config_services(cls, db: AsyncSession, onum_list: str): async def sec_process_defind_change_update(cls,request: Request,page_object:TaskBizConfigAddModel,metatask_old:TaskBizConfigAddModel,current_user: CurrentUserModel):
if not onum_list:
raise ServiceException(message="传入的编号为空") projectCode = await request.app.state.redis.get(f'{RedisInitKeyConfig.SYS_CONFIG.key}:sys.ds.projectcode')
dsids=page_object.ds_ids.split(",")
id_list = [onum.strip() for onum in onum_list.split(",") if onum.strip()] result_list = [{'dstype': t, 'dsid': i} for t, i in zip(dsids, dsids)]
if not id_list: message=''
raise ServiceException(message="无效的编号列表") # 查询接口
url=f'{AppConfig.ds_server_url}/dolphinscheduler/projects/'+projectCode+'/process-definition'
headers = {'dashUserName': current_user.user.user_name, 'dashPassword': current_user.user.password, }
headers2 = {'dashUserName': current_user.user.user_name, 'dashPassword': current_user.user.password, 'Content-Type': 'application/x-www-form-urlencoded'}
for config in result_list:
response = requests.get(f"{url}/{config['dsid']}", headers=headers, verify=False)
text= response.text
responsJson = json.loads(text)
if responsJson['msg'] == 'success':
task_def_list = responsJson['data']['taskDefinitionList']
# 遍历修改 rawScript
task_def_list = responsJson['data']['taskDefinitionList']
# 再序列化为 JSON 字符串
modified_json_str = json.dumps(task_def_list, ensure_ascii=False, indent=0)
getTaskRelationList=responsJson['data']['processTaskRelationList']
putTaskRelationList=[]
for item in getTaskRelationList:
new_item = {
"name": item['name'],
"preTaskCode":item['preTaskCode'] ,
"preTaskVersion":item['preTaskVersion'] ,
"postTaskCode":item['postTaskCode'] ,
"conditionType":item['conditionType'] ,
"conditionParams":item['conditionParams']
}
putTaskRelationList.append(new_item)
modified_json_str2= json.dumps(putTaskRelationList, ensure_ascii=False, indent=0)
modified_json_str2=re.sub(r'\s+', '', modified_json_str2)
metaprocessconfig_dict = MetaprocessconfigModel(taskDefinitionJson=modified_json_str,# 替换taskDefinitionJson
description="", # 替换工作流备注
locations=responsJson['data']['processDefinition']['locations'] ,# 替换locations
name =page_object.biz_name,# 替换工作流名称
tenantCode =responsJson['data']['processDefinition']['tenantCode'] ,
taskRelationJson =modified_json_str2,# 替换taskRelationJson
).model_dump(exclude_unset=True, by_alias=True)
form_data = {key: str(value) for key, value in metaprocessconfig_dict.items()}
response_put0 = requests.put(f"{url}/{config['dsid']}", headers=headers2,data=form_data,verify=False)
putText= response_put0.text
responsPutJson=json.loads(putText)
if responsPutJson['msg'] == 'success':
if message:
message += ", "
message += page_object.biz_name + "-批次标签成功"
else:
if message:
message += ", "
message += page_object.biz_name + "-批次标签修改失败"
return message
@classmethod
async def delete_task_biz_config_services(
cls,
request: Request,
query_db: AsyncSession,
page_object: DeleteMetataskModel,
current_user: CurrentUserModel
):
if page_object.metatask_ids and page_object.ds_ids:
metatask_id_list = page_object.metatask_ids.split(',')
try:
projectCode = await request.app.state.redis.get(
f'{RedisInitKeyConfig.SYS_CONFIG.key}:sys.ds.projectcode'
)
# 构造请求参数
url = f'{AppConfig.ds_server_url}/dolphinscheduler/projects/{projectCode}/process-definition/batch-delete'
form_data = {'codes': page_object.ds_ids}
headers = {
'dashUserName': current_user.user.user_name,
'dashPassword': current_user.user.password,
'Content-Type': 'application/x-www-form-urlencoded'
}
# 发送 POST 请求
response = requests.post(url, headers=headers, data=form_data, verify=False)
responsJson = json.loads(response.text)
if responsJson['success'] is True:
# 删除本地元任务配置
await MetadataConfigDao.delete_task_biz_config(query_db, metatask_id_list)
await MetadataConfigDao.delete_task_rela_batch(query_db, metatask_id_list)
await query_db.commit()
return CrudResponseModel(is_success=True, message='删除成功')
else:
raise ServiceException(message='ds删除失败')
except Exception as e:
await query_db.rollback()
raise e
else:
raise ServiceException(message='传入参数配置id为空')
@classmethod
async def up_or_down_metatask_services(
cls, request: Request, query_db: AsyncSession, current_user: CurrentUserModel, id: str, type: str
):
metatask_info = await cls.get_task_biz_config_detail_services(query_db, id)
metatask_info.update_by = current_user.user.user_name
metatask_info.update_time = datetime.now()
type_str: str
projectCode = await request.app.state.redis.get(f'{RedisInitKeyConfig.SYS_CONFIG.key}:sys.ds.projectcode')
dsids=metatask_info.ds_ids.split(",")
result_list = [{'dstype': t, 'dsid': i} for t, i in zip(dsids, dsids)]
message=''
# 查询接口
url=f'{AppConfig.ds_server_url}/dolphinscheduler/projects/'+projectCode+'/process-definition'
headers = {'dashUserName': current_user.user.user_name, 'dashPassword': current_user.user.password, 'Content-Type': 'application/x-www-form-urlencoded'}
for config in result_list:
metaprocessconfig_dict = {
'name': metatask_info.biz_name,
'releaseState': type
}
form_data = {key: str(value) for key, value in metaprocessconfig_dict.items()}
response = requests.post(f"{url}/{config['dsid']}/release", headers=headers, data=form_data, verify=False)
text= response.text
responsJson = json.loads(text)
if responsJson['success'] is True:
message='成功!'
else:
raise ServiceException(message='失败'+responsJson['msg'])
if type == 'OFFLINE':
# 下线
type_str = '下线'
metatask_info.status = 'OFFLINE'
else:
# 上线
type_str = '上线'
metatask_info.status = 'ONLINE'
edit_metatask = metatask_info.model_dump(exclude_unset=True)
try: try:
await MetadataConfigDao.delete_task_biz_config(db, id_list) await MetadataConfigDao.edit_task_biz_config(query_db, metatask_info.onum, edit_metatask)
await MetadataConfigDao.delete_task_rela_batch(db, id_list) await query_db.commit()
await db.commit() return CrudResponseModel(is_success=True, message=message)
return CrudResponseModel(is_success=True, message="删除成功")
except Exception as e: except Exception as e:
await db.rollback() await query_db.rollback()
raise e raise e
else:
raise ServiceException(message='更新失败')
@classmethod
async def ds_metatask_services(
cls, request: Request, query_db: AsyncSession, process: ParmScheduleVo,current_user: CurrentUserModel
):
projectCode = await request.app.state.redis.get(f'{RedisInitKeyConfig.SYS_CONFIG.key}:sys.ds.projectcode')
# 先查询是否建立定时任务
getdsurl=f'{AppConfig.ds_server_url}/dolphinscheduler/projects/'+projectCode+'/schedules?pageSize=10&pageNo=1&processDefinitionCode='+str(process.processDefinitionCode)
headers = {'dashUserName': current_user.user.user_name, 'dashPassword': current_user.user.password, 'Content-Type': 'application/x-www-form-urlencoded'}
getdsresponse = requests.get(getdsurl, headers=headers, verify=False)
getdstext= getdsresponse.text
responsJson = json.loads(getdstext)
if responsJson['msg'] == 'success':
if responsJson['data']['total']>0:
# getds_json_list = json.dumps(responsJson['data']['totalList'], ensure_ascii=False, indent=4)
getds_json_list = responsJson['data']['totalList']
for item in getds_json_list:
if item['releaseState']=='ONLINE':
# 先下线在删除
offdsurl=f"{AppConfig.ds_server_url}/dolphinscheduler/projects/{projectCode}/schedules/{item['id']}/offline"
offresponse = requests.post(offdsurl, headers=headers, verify=False)
# 删除对应的调度
deldsurl=f"{AppConfig.ds_server_url}/dolphinscheduler/projects/{projectCode}/schedules/{item['id']}?scheduleId={item['id']}"
delresponse = requests.delete(deldsurl, headers=headers, verify=False)
parm =ParmSchedule()
parm.failureStrategy='CONTINUE'
parm.warningType='NONE'
parm.warningGroupId=process.warningGroupId
parm.workerGroup=process.workerGroup
parm.processDefinitionCode =process.processDefinitionCode
parm.environmentCode=process.environmentCode
parm.processInstancePriority='MEDIUM'
parm.schedule = (
'{"startTime":"' + process.beginTime.strftime('%Y-%m-%d %H:%M:%S') +
'", "endTime":"' + process.endTime.strftime('%Y-%m-%d %H:%M:%S') +
'", "crontab":"' + process.crontab +
'", "timezoneId":"Asia/Shanghai"}')
url=f'{AppConfig.ds_server_url}/dolphinscheduler/projects/'+projectCode+'/schedules'
# form_data = {key: str(value) for key, value in process.__dict__.items()}
form_data = {key: value for key, value in parm.__dict__.items()}
response = requests.post(url, headers=headers, data=form_data, verify=False)
text= response.text
responsJson = json.loads(text)
if responsJson['msg'] == 'success':
scheduleId= responsJson['data']['id']
ondsurl=f"{AppConfig.ds_server_url}/dolphinscheduler/projects/{projectCode}/schedules/{scheduleId}/online"
ondsurl = requests.post(ondsurl, headers=headers, verify=False)
metatask_info = await cls.get_task_biz_config_detail_services(query_db, process.metaTaskId)
metatask_info.schId=scheduleId
metatask_info2 = metatask_info.model_dump(exclude_unset=True)
await MetadataConfigDao.edit_task_biz_config(query_db,metatask_info.onum, metatask_info2)
await query_db.commit()
return "调度运行成功!"
else:
raise ServiceException(message='运行失败!')
@classmethod
async def ds_metatask_delete(
cls, request: Request, query_db: AsyncSession, process: ParmScheduleVo,current_user: CurrentUserModel
):
projectCode = await request.app.state.redis.get(f'{RedisInitKeyConfig.SYS_CONFIG.key}:sys.ds.projectcode')
# 先查询是否建立定时任务
getdsurl=f'{AppConfig.ds_server_url}/dolphinscheduler/projects/'+projectCode+'/schedules?pageSize=10&pageNo=1&processDefinitionCode='+str(process.processDefinitionCode)
headers = {'dashUserName': current_user.user.user_name, 'dashPassword': current_user.user.password, 'Content-Type': 'application/x-www-form-urlencoded'}
getdsresponse = requests.get(getdsurl, headers=headers, verify=False)
getdstext= getdsresponse.text
responsJson = json.loads(getdstext)
if responsJson['msg'] == 'success':
if responsJson['data']['total']>0:
# getds_json_list = json.dumps(responsJson['data']['totalList'], ensure_ascii=False, indent=4)
getds_json_list = responsJson['data']['totalList']
for item in getds_json_list:
if item['releaseState']=='ONLINE':
# 先下线在删除
offdsurl=f"{AppConfig.ds_server_url}/dolphinscheduler/projects/{projectCode}/schedules/{item['id']}/offline"
offresponse = requests.post(offdsurl, headers=headers, verify=False)
# 删除对应的调度
deldsurl=f"{AppConfig.ds_server_url}/dolphinscheduler/projects/{projectCode}/schedules/{item['id']}?scheduleId={item['id']}"
delresponse = requests.delete(deldsurl, headers=headers, verify=False)
deldstext= delresponse.text
delresponsJson = json.loads(deldstext)
if delresponsJson['msg'] == 'success':
metatask_info = await cls.get_task_biz_config_detail_services(query_db, process.metaTaskId)
metatask_info2 = metatask_info.model_dump(exclude_unset=True)
metatask_info2.schId=""
await MetadataConfigDao.edit_task_biz_config(query_db,metatask_info.onum, metatask_info2)
await query_db.commit()
return "调度删除成功!"
return "调度删除成功!"
@classmethod @classmethod
async def get_task_biz_config_detail_services(cls, db: AsyncSession, onum: str): async def get_task_biz_config_detail_services(cls, db: AsyncSession, onum: str):

32
vue-fastapi-frontend/src/api/taskMetadataConfig/metadataConfig.js

@ -46,11 +46,10 @@ export function updateTaskBizConfig(data) {
} }
// 删除任务业务配置(支持批量) // 删除任务业务配置(支持批量)
export function delTaskBizConfig(onumStr) { export function delTaskBizConfig(metataskId,dsIds) {
return request({ return request({
url: '/default-api/metadataConfig/taskBizConfig/delete', url: '/default-api/metadataConfig/taskBizConfig/'+ metataskId+"/"+dsIds,
method: 'delete', method: 'delete',
params: { onums: onumStr }
}) })
} }
@ -61,3 +60,30 @@ export function getTaskBizRelaList(onum) {
method: 'get' method: 'get'
}) })
} }
export function downOrUpmetatask(id,type) {
const data = {
id: String(id), // 显式转换为字符串
type
}
return request({
url: '/default-api/metadataConfig/taskBiz/upOrdown',
method: 'put',
data: data
})
}
export function dsmetataskSec(data) {
return request({
url: '/default-api/metadataConfig/taskBiz/DS',
method: 'put',
data: data
})
}
export function dsmetataskdelete(data) {
return request({
url: '/default-api/metadataConfig/taskBiz/DS',
method: 'delete',
data: data
})
}

606
vue-fastapi-frontend/src/views/metadataConfig/taskBizConfig/index.vue

@ -1,53 +1,244 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<!-- 查询区域 -->
<el-row :gutter="10" class="mb8"> <el-row :gutter="10" class="mb8">
<el-form :inline="true" :model="queryForm"> <el-form :inline="true" :model="queryForm">
<el-form-item label="业务域名称"> <el-form-item label="标签任务名称">
<el-input v-model="queryForm.bizName" placeholder="请输入业务域名称" clearable style="width: 200px" /> <el-input
v-model="queryForm.bizName"
placeholder="请输入标签任务名称"
clearable
style="width: 200px"
/>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" icon="Search" @click="handleSearch">搜索</el-button> <el-button type="primary" icon="Search" @click="handleSearch"
>搜索</el-button
>
<el-button icon="Refresh" @click="resetQuery">重置</el-button> <el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-row> </el-row>
<!-- 操作按钮 -->
<el-row :gutter="10" class="mb8"> <el-row :gutter="10" class="mb8">
<el-col :span="1.5"> <el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="openAddDialog">新增</el-button> <el-button
type="primary"
plain
icon="plus"
@click="openAddDialog"
v-hasPermi="['meta:metatask:add']"
>新建任务</el-button
>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="selectedRows.length !== 1" @click="openEditDialog(selectedRows[0])">修改</el-button> <el-button
type="success"
plain
icon="edit"
:disabled="singleOne"
@click="openEditDialog(selectedRows[0])"
v-hasPermi="['meta:metatask:edit']"
>修改</el-button
>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="selectedRows.length === 0" @click="deleteSelected">删除</el-button> <el-button
type="success"
plain
icon="top"
:disabled="singleOne"
@click="handleUp"
v-hasPermi="['meta:metatask:up']"
>上线</el-button
>
</el-col> </el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="bottom"
:disabled="singleTwo"
@click="handleDown"
v-hasPermi="['meta:metatask:down']"
>下线</el-button
>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="AlarmClock"
:disabled="singleTwo"
@click="handleDS"
v-hasPermi="['meta:metatask:ds']"
>调度</el-button
>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="video-play"
:disabled="singleTwo"
@click="handleRun"
v-hasPermi="['meta:metatask:run']"
>运行</el-button
>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="edit"
:disabled="single"
@click="handleLog"
v-hasPermi="['meta:metatask:log']"
>日志</el-button
>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="delete"
:disabled="multiple"
@click="deleteSelected"
v-hasPermi="['meta:metatask:delete']"
>删除</el-button
>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="delete"
:disabled="singleTwo"
@click="handleDeleteSche"
v-hasPermi="['meta:metatask:ds']"
>删除调度</el-button
>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList" />
</el-row> </el-row>
<el-table v-loading="loading" :data="bizList" @selection-change="handleSelectionChange" style="width: 100%" border stripe> <!-- 表格 -->
<el-table-column type="selection" width="55" /> <el-table
<el-table-column prop="bizName" label="业务域名称" /> v-loading="loading"
<el-table-column prop="createBy" label="创建者" /> :data="bizList"
<el-table-column prop="createTime" label="创建时间" width="180"> @selection-change="handleSelectionChange"
<template #default="{ row }"> >
{{ formatDateTime(row.createTime) }} <el-table-column type="selection" width="50" align="center" />
<el-table-column
label="任务名称"
align="center"
key="bizName"
prop="bizName"
v-if="columns[1].visible"
:show-overflow-tooltip="true"
/>
<el-table-column
label="状态"
align="center"
key="status"
prop="status"
v-if="columns[2].visible"
:show-overflow-tooltip="true"
>
<template #default="scope">
<dict-tag
:options="meta_task_status"
:value="scope.row.status"
/>
</template>
</el-table-column>
<el-table-column
label="调度ID"
align="center"
prop="schId"
v-if="columns[3].visible"
width="100"
>
<template #default="scope">
<span>{{scope.row.schId}}</span>
</template>
</el-table-column>
<el-table-column
label="创建时间"
align="center"
prop="createTime"
v-if="columns[4].visible"
>
<template #default="scope">
<span>{{ parseTime(scope.row.createTime) }}</span>
</template>
</el-table-column>
<el-table-column
label="更新时间"
align="center"
prop="updateTime"
v-if="columns[5].visible"
>
<template #default="scope">
<span>{{ parseTime(scope.row.updateTime) }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="updateBy" label="更新者" />
<el-table-column prop="updateTime" label="更新时间" width="180"> <el-table-column
label="创建人"
align="center"
key="createBy"
prop="createBy"
v-if="columns[6].visible"
:show-overflow-tooltip="true"
/>
<el-table-column
label="修改人"
align="center"
key="updateBy"
prop="updateBy"
v-if="columns[7].visible"
:show-overflow-tooltip="true"
/>
<el-table-column label="操作" fixed="right" align="center" width="200">
<template #default="{ row }"> <template #default="{ row }">
{{ formatDateTime(row.updateTime) }} <el-button type="primary" link icon="Edit" @click="handleEdit(row)">编辑</el-button>
<el-button type="danger" link icon="Delete" @click="handleDelete(row)">删除</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryForm.pageNum" v-model:limit="queryForm.pageSize" @pagination="getList" /> <!-- 分页 -->
<pagination
<el-dialog :title="title" v-model="open" width="1600px" append-to-body :before-close="handleClose"> v-show="total > 0"
<el-form ref="bizFormRef" :model="form" :rules="rules" label-width="130px"> :total="total"
v-model:page="queryForm.pageNum"
v-model:limit="queryForm.pageSize"
@pagination="getList"
/>
<!-- 新增/编辑弹窗 -->
<el-dialog
:title="title"
v-model="open"
width="1600px"
append-to-body
:before-close="handleClose"
>
<el-form
ref="bizFormRef"
:model="form"
:rules="rules"
label-width="130px"
>
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="8"> <el-col :span="8">
<el-form-item label="业务域名称" prop="bizName"> <el-form-item label="标签任务名称" prop="bizName">
<el-input v-model="form.bizName" style="width: 200px" /> <el-input v-model="form.bizName" style="width: 200px" />
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -58,35 +249,81 @@
<el-col :span="10"> <el-col :span="10">
<el-form :model="leftQueryForm" inline size="small"> <el-form :model="leftQueryForm" inline size="small">
<el-form-item label="系统名"> <el-form-item label="系统名">
<el-select v-model="leftQueryForm.ssysCd" placeholder="请选择系统" clearable filterable style="width: 180px"> <el-select
<el-option v-for="item in dsSysList" :key="item.id" :label="item.name" :value="item.name" /> v-model="leftQueryForm.ssysCd"
placeholder="请选择系统"
clearable
filterable
style="width: 180px"
>
<el-option
v-for="item in dsSysList"
:key="item.id"
:label="item.name"
:value="item.name"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="表名"> <el-form-item label="表名">
<el-input v-model="leftQueryForm.tabName" placeholder="请输入表名" clearable style="width: 180px" /> <el-input
v-model="leftQueryForm.tabName"
placeholder="请输入表名"
clearable
style="width: 180px"
/>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="loadLeftTable">查询</el-button> <el-button type="primary" @click="loadLeftTable">查询</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
<el-table :data="leftTableData" height="300" border style="margin-top: 10px" @selection-change="handleLeftSelect"> <el-table
:data="leftTableData"
height="300"
border
style="margin-top: 10px"
@selection-change="handleLeftSelect"
>
<el-table-column type="selection" width="50" /> <el-table-column type="selection" width="50" />
<el-table-column prop="ssysCd" label="系统名" /> <el-table-column prop="ssysCd" label="系统名" />
<el-table-column prop="mdlName" label="模式名" /> <el-table-column prop="mdlName" label="模式名" />
<el-table-column prop="tabEngName" label="表名" /> <el-table-column prop="tabEngName" label="表名" />
</el-table> </el-table>
<pagination v-show="leftTotal > 0" :total="leftTotal" v-model:page="leftQueryForm.pageNum" v-model:limit="leftQueryForm.pageSize" @pagination="loadLeftTable" /> <pagination
v-show="leftTotal > 0"
:total="leftTotal"
v-model:page="leftQueryForm.pageNum"
v-model:limit="leftQueryForm.pageSize"
@pagination="loadLeftTable"
/>
</el-col> </el-col>
<el-col :span="4" class="flex-col-center"> <el-col :span="4" class="flex-col-center">
<el-button type="primary" @click="moveToRight" :disabled="leftSelected.length === 0"> > </el-button> <el-button
<el-button type="danger" style="margin-top: 10px" @click="moveToLeft" :disabled="rightSelected.length === 0"> < </el-button> type="primary"
@click="moveToRight"
:disabled="leftSelected.length === 0"
>
&gt;
</el-button>
<el-button
type="danger"
style="margin-top: 10px"
@click="moveToLeft"
:disabled="rightSelected.length === 0"
>
&lt;
</el-button>
</el-col> </el-col>
<el-col :span="10"> <el-col :span="10">
<el-table :data="rightTableData" height="360" border @selection-change="handleRightSelect"> <el-table
:data="rightTableData"
height="360"
border
@selection-change="handleRightSelect"
>
<el-table-column type="selection" width="50" /> <el-table-column type="selection" width="50" />
<el-table-column prop="ssysCd" label="系统名" /> <el-table-column prop="ssysCd" label="系统名" />
<el-table-column prop="mdlName" label="模式名" /> <el-table-column prop="mdlName" label="模式名" />
@ -100,41 +337,76 @@
<el-button type="primary" @click="submitForm">保存</el-button> <el-button type="primary" @click="submitForm">保存</el-button>
</template> </template>
</el-dialog> </el-dialog>
<!-- 运行调度日志弹窗 -->
<run-dialog
ref="rundialog"
:warningGroupList="warningGroupList"
:environmentList="environmentList"
:workerGroupList="workerGroupList"
:processDefinitionCode="dsIds"
/>
<ds-dialog
ref="dsdialog"
processDefinitionType="secTask"
:warningGroupList="warningGroupList"
:environmentList="environmentList"
:workerGroupList="workerGroupList"
:processDefinitionCode="dsIds"
:getList="getList"
/>
<log-dialog ref="logdialog" :defindName="defindName" />
</div> </div>
</template> </template>
<script setup> <script setup>
import { ref, reactive, onMounted } from 'vue' import { ref, reactive, onMounted, getCurrentInstance } from 'vue'
import { ElMessageBox, ElMessage } from 'element-plus' import { ElMessageBox, ElMessage } from 'element-plus'
import useUserStore from '@/store/modules/user' import useUserStore from '@/store/modules/user'
import { getMetaDataList } from '@/api/meta/metaInfo' import { getMetaDataList } from '@/api/meta/metaInfo'
import { datasourceall} from "@/api/meta/metatask";
const userStore = useUserStore()
const dsSysList = userStore.dsSysList
import { import {
listTaskBizConfig, listTaskBizConfig,
addTaskBizConfig, addTaskBizConfig,
updateTaskBizConfig, updateTaskBizConfig,
getTaskBizRelaList, getTaskBizRelaList,
delTaskBizConfig downOrUpmetatask,
dsmetataskdelete,
dsmetataskSec,
delTaskBizConfig,
} from '@/api/taskMetadataConfig/metadataConfig' } from '@/api/taskMetadataConfig/metadataConfig'
import runDialog from '../../meta/metatask/runDialog'
import dsDialog from '../../meta/metatask/dsDialog'
import logDialog from '../../meta/metatask/logsDialog'
const { proxy } = getCurrentInstance()
const { meta_task_status } = proxy.useDict('meta_task_status')
const getDeptTree = async () => {
const response = await datasourceall();
warningGroupList.value = response.data.alertGroups;
environmentList.value = response.data.environment;
workerGroupList.value = response.data.workerGroup;
};
const userStore = useUserStore()
const dsSysList = userStore.dsSysList
const queryForm = reactive({ const queryForm = reactive({
bizName: '', bizName: '',
riskLvl: '',
pageNum: 1, pageNum: 1,
pageSize: 10 pageSize: 10,
}) })
const leftQueryForm = reactive({ const leftQueryForm = reactive({
ssysCd: '', ssysCd: '',
tabName: '', tabName: '',
pageNum: 1, pageNum: 1,
pageSize: 10 pageSize: 10,
}) })
const bizList = ref([]) const bizList = ref([])
const secList = ref([])
const total = ref(0) const total = ref(0)
const loading = ref(false) const loading = ref(false)
const open = ref(false) const open = ref(false)
@ -145,20 +417,48 @@ const bizFormRef = ref(null)
const form = reactive({ const form = reactive({
onum: null, onum: null,
bizName: '', bizName: '',
riskLvl: '',
isStop: null
}) })
const rules = { const rules = {
bizName: [{ required: true, message: '请输入业务域名称', trigger: 'blur' }], bizName: [{ required: true, message: '请输入标签任务名称', trigger: 'blur' }],
riskLvl: [{ required: true, message: '请选择风险等级', trigger: 'blur' }],
isStop: [{ required: true, message: '请选择状态', trigger: 'change' }]
} }
const selectedRows = ref([]) const selectedRows = ref([])
const leftTableData = ref([])
const leftTotal = ref(0)
const leftSelected = ref([])
const rightTableData = ref([])
const rightSelected = ref([])
const warningGroupList = ref([])
const environmentList = ref([])
const workerGroupList = ref([])
const dsIds = ref([]);
const defindName = ref('')
const columns = reactive([
{ key: 0, label: '任务ID', prop: 'onum', visible: true },
{ key: 1, label: '任务名称', prop: 'bizName', visible: true },
{ key: 2, label: '状态', prop: 'status', visible: true },
{ key: 3, label: '调度ID', prop: 'schId', visible: true },
{ key: 4, label: '创建时间', prop: 'createTime', visible: true },
{ key: 5, label: '更新时间', prop: 'updateTime', visible: true },
{ key: 6, label: '创建人', prop: 'createBy', visible: true },
{ key: 7, label: '修改人', prop: 'updateBy', visible: true }
])
function handleSelectionChange(val) { function handleSelectionChange(val) {
selectedRows.value = val selectedRows.value = val
dsIds.value = selection.map((item) => item.dsIds);
}
function handleLeftSelect(rows) {
leftSelected.value = rows
}
function handleRightSelect(rows) {
rightSelected.value = rows
} }
async function getList() { async function getList() {
@ -167,25 +467,56 @@ async function getList() {
const res = await listTaskBizConfig(queryForm) const res = await listTaskBizConfig(queryForm)
bizList.value = res.rows || [] bizList.value = res.rows || []
total.value = res.total || 0 total.value = res.total || 0
} catch (error) { } catch {
ElMessage.error('获取列表失败,请重试') ElMessage.error('获取列表失败,请重试')
} finally { } finally {
loading.value = false loading.value = false
} }
} }
async function getSecList() { async function loadLeftTable() {
// TODO: try {
const res = await getMetaDataList(leftQueryForm)
leftTableData.value = res.data.rows || []
leftTotal.value = res.data.total || 0
} catch {
ElMessage.error('加载左侧表数据失败')
}
} }
function getSecLevelName(value) { async function loadRightTable(onum) {
const item = secList.value.find((d) => d.onum === value) try {
return item ? item.secLevelSummary : value const res = await getTaskBizRelaList(onum)
rightTableData.value = res.data || []
} catch {
ElMessage.error('加载右侧表数据失败')
}
}
function buildKey(row) {
return `${row.ssysCd}||${row.mdlName}||${row.tabEngName}`
}
function moveToRight() {
const existingKeys = new Set(rightTableData.value.map(buildKey))
leftSelected.value.forEach(item => {
if (!existingKeys.has(buildKey(item))) {
let additem=item
additem.onum=item.extractOnum
rightTableData.value.push(item)
}
})
}
function moveToLeft() {
const removeKeys = new Set(rightSelected.value.map(buildKey))
rightTableData.value = rightTableData.value.filter(
item => !removeKeys.has(buildKey(item))
)
} }
function resetQuery() { function resetQuery() {
queryForm.bizName = '' queryForm.bizName = ''
queryForm.riskLvl = ''
queryForm.pageNum = 1 queryForm.pageNum = 1
getList() getList()
} }
@ -196,12 +527,10 @@ function handleSearch() {
} }
function openAddDialog() { function openAddDialog() {
title.value = '新增业务域配置' title.value = '新增标签任务'
Object.assign(form, { Object.assign(form, {
onum: null, onum: null,
bizName: '', bizName: '',
riskLvl: '',
isStop: null
}) })
rightTableData.value = [] rightTableData.value = []
open.value = true open.value = true
@ -212,20 +541,21 @@ function openEditDialog(row) {
ElMessage.warning('请选择一条记录进行编辑') ElMessage.warning('请选择一条记录进行编辑')
return return
} }
title.value = '编辑业务域配置' title.value = '编辑标签任务'
loadRightTable(row.onum)
Object.assign(form, row) Object.assign(form, row)
loadRightTable(row.onum)
open.value = true open.value = true
} }
function submitForm() { function submitForm() {
bizFormRef.value.validate(async (valid) => { bizFormRef.value.validate(async valid => {
if (!valid) return if (!valid) return
let tabonums=[] let tabonums=[]
rightTableData.value.forEach(item=>{ rightTableData.value.forEach(item=>{
tabonums.push(item.onum) tabonums.push(item.onum)
})
})
console.log( rightTableData.value,"sss")
const submitData = { ...form,tabOnumList:tabonums } const submitData = { ...form,tabOnumList:tabonums }
try { try {
if (title.value.includes('新增')) { if (title.value.includes('新增')) {
@ -237,24 +567,15 @@ function submitForm() {
} }
open.value = false open.value = false
getList() getList()
} catch (error) { } catch {
ElMessage.error('操作失败,请重试') ElMessage.error('操作失败,请重试')
} }
}) })
} }
function deleteRow(onum) { function handleClose(done) {
ElMessageBox.confirm('确定删除该条记录吗?', '提示', { type: 'warning' }) bizFormRef.value.resetFields()
.then(async () => { done()
try {
await delTaskBizConfig(onum)
ElMessage.success('删除成功')
getList()
} catch (error) {
ElMessage.error('删除失败,请重试')
}
})
.catch(() => { })
} }
function deleteSelected() { function deleteSelected() {
@ -262,91 +583,152 @@ function deleteSelected() {
ElMessage.warning('请至少选择一条记录删除') ElMessage.warning('请至少选择一条记录删除')
return return
} }
ElMessageBox.confirm(`确定删除选中的 ${selectedRows.value.length} 条记录吗?`, '提示', { type: 'warning' }) const onlineRows = selectedRows.value.filter(row => row.status === 'ONLINE')
if (onlineRows.length > 0) {
ElMessage.warning('请选择下线状态的记录进行删除')
return
}
ElMessageBox.confirm(
`确定删除选中的 ${selectedRows.value.length} 条记录吗?`,
'提示',
{ type: 'warning' }
)
.then(async () => { .then(async () => {
try { try {
for (const row of selectedRows.value) { for (const row of selectedRows.value) {
await delTaskBizConfig(row.onum) await delTaskBizConfig(row.onum, row.dsIds)
} }
ElMessage.success('删除成功') ElMessage.success('删除成功')
getList() getList()
} catch (error) { } catch {
ElMessage.error('删除失败,请重试') ElMessage.error('删除失败,请重试')
} }
}) })
.catch(() => {}) .catch(() => {})
} }
function handleClose(done) { //
bizFormRef.value.resetFields() const singleOne = computed(() => selectedRows.value.length !== 1)
done() const singleTwo = computed(() => selectedRows.value.length !== 1)
const single = computed(() => selectedRows.value.length !== 1)
const multiple = computed(() => selectedRows.value.length === 0)
function handleUp() {
if (singleOne.value) return
const selected = selectedRows.value[0]
if (selected.status === 'ONLINE') {
ElMessage.warning('该任务已是上线状态')
return
} }
// ==== 穿 ==== ElMessageBox.confirm('确定要上线该任务吗?', '提示', { type: 'warning' })
const leftTableData = ref([]) .then(async () => {
const leftTotal = ref(0) try {
const leftSelected = ref([]) await downOrUpmetatask(selected.onum, 'ONLINE')
const rightTableData = ref([]) ElMessage.success('上线成功')
const rightSelected = ref([]) getList()
} catch (err) {
ElMessage.error('上线失败,请重试')
}
})
.catch(() => {})
}
function handleLeftSelect(rows) { function handleDown() {
leftSelected.value = rows if (singleTwo.value) return
const selected = selectedRows.value[0]
if (selected.status === 'OFFLINE') {
ElMessage.warning('该任务已是下线状态')
return
} }
function handleRightSelect(rows) {
rightSelected.value = rows ElMessageBox.confirm('确定要下线该任务吗?', '提示', { type: 'warning' })
.then(async () => {
try {
await downOrUpmetatask(selected.onum, 'OFFLINE')
ElMessage.success('下线成功')
getList()
} catch (err) {
ElMessage.error('下线失败,请重试')
}
})
.catch(() => {})
} }
function handleDS() {
if (singleTwo.value) return
async function loadLeftTable() { dsdialog.value.show(selectedRows.value[0].dsIds,selectedRows.value[0].onum); // Pass ids or any required data
const res = await getMetaDataList(leftQueryForm)
leftTableData.value = res.data.rows || []
leftTotal.value = res.data.total || 0
} }
async function loadRightTable(onum) { function handleRun() {
const res = await getTaskBizRelaList(onum) if (singleTwo.value) return;
rightTableData.value = res.data || []
const selected = selectedRows.value[0];
if (selected.status !== 'ONLINE') {
ElMessage.warning('仅支持对已上线状态的任务进行运行操作');
return;
}
rundialog.value.show(selected.dsIds);
} }
function buildKey(row) {
return `${row.ssysCd}||${row.mdlName}||${row.tabEngName}` function handleLog() {
if (single.value) return
defindName.value = selectedRows.value[0].bizName
logdialog.value.open()
} }
function moveToRight() { function handleDeleteSche() {
const existingKeys = new Set(rightTableData.value.map(buildKey)) if (singleTwo.value) return
leftSelected.value.forEach(item => { ElMessageBox.confirm('确定删除调度吗?', '提示', { type: 'warning' })
if (!existingKeys.has(buildKey(item))) { .then(async () => {
let additem = item try {
additem.onum = item.extractOnum await dsmetataskSec(selectedRows.value[0].onum)
rightTableData.value.push(item) ElMessage.success('删除调度成功')
getList()
} catch {
ElMessage.error('删除调度失败')
} }
}) })
.catch(() => {})
} }
function moveToLeft() { function formatDateTime(val) {
const removeKeys = new Set(rightSelected.value.map(buildKey)) if (!val) return ''
rightTableData.value = rightTableData.value.filter(item => !removeKeys.has(buildKey(item))) const date = new Date(val)
const Y = date.getFullYear()
const M = (date.getMonth() + 1).toString().padStart(2, '0')
const D = date.getDate().toString().padStart(2, '0')
const h = date.getHours().toString().padStart(2, '0')
const m = date.getMinutes().toString().padStart(2, '0')
const s = date.getSeconds().toString().padStart(2, '0')
return `${Y}-${M}-${D} ${h}:${m}:${s}`
} }
onMounted(() => { onMounted(() => {
getList() getList()
getSecList() getDeptTree()
loadLeftTable() loadLeftTable()
}) })
// refs to dialog components
const rundialog = ref(null)
const dsdialog = ref(null)
const logdialog = ref(null)
</script> </script>
<style scoped> <style scoped>
.app-container {
padding: 20px;
}
.mb8 { .mb8 {
margin-bottom: 8px; margin-bottom: 8px;
} }
.flex-col-center { .flex-col-center {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
margin-top: 150px;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
height: 100%;
} }
</style> </style>

Loading…
Cancel
Save