Browse Source

Merge remote-tracking branch 'origin/master'

master
xueyinfei 2 months ago
parent
commit
c1229a50c2
  1. 1
      .gitignore
  2. 33
      vue-fastapi-backend/.env.dev
  3. 26
      vue-fastapi-backend/module_admin/controller/metatask_controller.py
  4. 1
      vue-fastapi-backend/module_admin/entity/do/metatask_do.py
  5. 1
      vue-fastapi-backend/module_admin/entity/vo/dataSource_vo.py
  6. 1
      vue-fastapi-backend/module_admin/entity/vo/metatask_vo.py
  7. 64
      vue-fastapi-backend/module_admin/service/metatask_service.py
  8. 15
      vue-fastapi-frontend/src/api/meta/metatask.js
  9. 54
      vue-fastapi-frontend/src/views/meta/metatask/dsDialog.vue
  10. 64
      vue-fastapi-frontend/src/views/meta/metatask/index.vue
  11. 10
      vue-fastapi-frontend/src/views/meta/metatask/logsDialog.vue

1
.gitignore

@ -136,3 +136,4 @@ dmypy.json
# Cython debug symbols
cython_debug/
vue-fastapi-backend/.env.dev

33
vue-fastapi-backend/.env.dev

@ -4,7 +4,7 @@ APP_ENV = 'dev'
# 应用名称
APP_NAME = 'RuoYi-FastAPI'
# 应用代理路径
APP_ROOT_PATH = '/default-api'
APP_ROOT_PATH = '/dev-api'
# 应用主机
APP_HOST = '127.0.0.1'
# 应用端口
@ -33,20 +33,20 @@ JWT_REDIS_EXPIRE_MINUTES = 30
# 数据库类型,可选的有'mysql'、'postgresql',默认为'mysql'
DB_TYPE = 'mysql'
# 数据库主机
DB_HOST = '192.168.0.3'
#DB_HOST = '47.113.147.166'
# DB_HOST = '192.168.0.3'
DB_HOST = '127.0.0.1'
# 数据库端口
DB_PORT = 3306
# 数据库用户名
DB_USERNAME = 'admin'
#DB_USERNAME = 'dbf'
# DB_USERNAME = 'admin'
DB_USERNAME = 'root'
# 数据库密码
DB_PASSWORD = '123456'
#DB_PASSWORD = '1q2w3e4r'
# DB_PASSWORD = '123456'
DB_PASSWORD = 'root'
# 数据库名称
DB_DATABASE = 'vue_faseapi'
#DB_DATABASE = 'vfa_test_0115'
# DB_DATABASE = 'vue_faseapi'
DB_DATABASE = 'ruoyi-fastapi'
# 是否开启sqlalchemy日志
DB_ECHO = true
@ -61,8 +61,8 @@ DB_POOL_TIMEOUT = 30
# -------- Redis配置 --------
# Redis主机
REDIS_HOST = '192.168.0.3'
#REDIS_HOST = '127.0.0.1'
# REDIS_HOST = '192.168.0.3'
REDIS_HOST = '127.0.0.1'
# Redis端口
REDIS_PORT = 6379
@ -76,14 +76,11 @@ REDIS_DATABASE = 2
# -------- minio配置 --------
# minio主机
MINIO_ADDRESS = '47.121.207.11:9000'
# MINIO_ADDRESS = '192.168.0.3:9000'
MINIO_ADDRESS = '192.168.0.3:9000'
# minio用户
MINIO_ADMIN = 'WFpLqkCgjoQNsnu6t7FO'
# MINIO_ADMIN = 'admin'
MINIO_ADMIN = 'admin'
# minio密码
MINIO_PASSWORD = 'gPRViF52Or5Fyvr0PCZHuIxZGfrTpNynajMiEjBZ'
# MINIO_PASSWORD = 'admin123'
MINIO_PASSWORD = 'admin123'
# 访问dolphinscheduler的接口地址
DS_SERVER_URL= http://localhost:12345
DS_SERVER_URL= http://47.121.207.11:12345

26
vue-fastapi-backend/module_admin/controller/metatask_controller.py

@ -168,6 +168,32 @@ async def DS_meta_metatask(
return ResponseUtil.success(msg=edit_config_result)
@metataskController.get('/DS/{id}', dependencies=[Depends(CheckUserInterfaceAuth('meta:metatask:ds'))])
@Log(title='元数据任务', business_type=BusinessType.UPDATE)
async def DS_meta_metatask_detail(
request: Request,
id: int,
query_db: AsyncSession = Depends(get_db),
current_user: CurrentUserModel = Depends(LoginService.get_current_user)
):
process=ParmScheduleVo()
process.processDefinitionCode=id
edit_config_result = await MetataskService.ds_metatask_detail(request, query_db, process,current_user)
return ResponseUtil.success(data=edit_config_result)
@metataskController.delete('/DS', dependencies=[Depends(CheckUserInterfaceAuth('meta:metatask:ds'))])
@Log(title='元数据任务', business_type=BusinessType.UPDATE)
async def 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 MetataskService.ds_metatask_delete(request, query_db, process,current_user)
return ResponseUtil.success(msg=edit_config_result)
# 元数据任务日志
@metataskController.get('/logs', dependencies=[Depends(CheckUserInterfaceAuth('meta:metatask:up',"meta:metatask:down"))])
@Log(title='元数据任务', business_type=BusinessType.UPDATE)

1
vue-fastapi-backend/module_admin/entity/do/metatask_do.py

@ -29,3 +29,4 @@ class Metatask(Base):
ac_target = Column(String(5), nullable=True, default=None, comment='采集目标')
ds_ids = Column(String(50), nullable=True, default=None, comment='任务Id')
ds_types = Column(String(5), nullable=True, default=None, comment='ds任务类型')
schId = Column(String(50), nullable=True, default=None, comment='调度id')

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

@ -86,6 +86,7 @@ class ParmSchedule(BaseModel):
processDefinitionCode: Optional[int] = Field(None, description="Process definition code")
class ParmScheduleVo(BaseModel):
warningGroupId: Optional[int] = Field(None, description="Warning group ID")
metaTaskId: Optional[int] = Field(None, description="metaTaskId")
workerGroup: Optional[str] = Field(None, description="Worker group")
environmentCode: Optional[int] = Field(None, description="Environment code")
processDefinitionCode: Optional[int] = Field(None, description="Process definition code")

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

@ -31,6 +31,7 @@ class MetataskModel(BaseModel):
ac_target: Optional[str] = Field(default=None, description='采集目标')
ds_ids: Optional[str] = Field(default=None, description='ds采集ids')
ds_types: Optional[str] = Field(default=None, description='ds采集类型')
schId: Optional[str] = Field(default=None, description='调度id')
class Metatask:

64
vue-fastapi-backend/module_admin/service/metatask_service.py

@ -1268,7 +1268,7 @@ class MetataskService:
parm.failureStrategy='CONTINUE'
parm.warningType='NONE'
parm.warningGroupId=process.warningGroupId
parm.workerGroup='TASK_POST'
parm.workerGroup=process.workerGroup
parm.processDefinitionCode =process.processDefinitionCode
parm.environmentCode=process.environmentCode
parm.processInstancePriority='MEDIUM'
@ -1287,10 +1287,72 @@ class MetataskService:
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.metatask_detail_services(query_db, process.metaTaskId)
metatask_info.schId=scheduleId
metatask_info = metatask_info.model_dump(exclude_unset=True)
await MetataskDao.edit_metatask_dao(query_db, metatask_info)
await query_db.commit()
return "调度运行成功!"
else:
raise ServiceException(message='运行失败!')
@classmethod
async def ds_metatask_detail(
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
processVo=ParmScheduleVo()
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:
processVo.crontab=item['crontab']
processVo.beginTime=item['startTime']
processVo.endTime=item['endTime']
processVo.workerGroup=item['workerGroup']
processVo.warningGroupId=item['warningGroupId']
processVo.environmentCode=item['environmentCode']
return processVo
@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.metatask_detail_services(query_db, process.metaTaskId)
metatask_info.schId=""
metatask_info = metatask_info.model_dump(exclude_unset=True)
await MetataskDao.edit_metatask_dao(query_db, metatask_info)
await query_db.commit()
return "调度删除成功!"
return "调度删除成功!"
@classmethod
async def get_metatask_logs_services(

15
vue-fastapi-frontend/src/api/meta/metatask.js

@ -100,6 +100,21 @@ export function dsmetatask(data) {
})
}
export function dsmetataskdelete(data) {
return request({
url: '/default-api/meta/metatask/DS',
method: 'delete',
data: data
})
}
export function dsmetataskdetail(pocessId) {
return request({
url: '/default-api/meta/metatask/DS/'+pocessId,
method: 'get',
})
}
// 删除元数据任务
export function delmetatask(metataskId,dsIds) {
const data = {

54
vue-fastapi-frontend/src/views/meta/metatask/dsDialog.vue

@ -41,6 +41,7 @@
v-model="form.workerGroup"
placeholder="请选择Worker分组"
style="width: 100%;"
@change="changeWoker"
>
<el-option
v-for="dict in workerGroupList"
@ -63,7 +64,7 @@
style="width: 100%;"
>
<el-option
v-for="dict in environmentList"
v-for="dict in environmentListVo"
:key="dict.id"
:label="dict.name"
:value="dict.code"
@ -112,7 +113,7 @@
<script>
import { ref, reactive, watch } from "vue";
import { dsmetatask } from "@/api/meta/metatask";
import { dsmetatask,dsmetataskdetail } from "@/api/meta/metatask";
import Crontab from '@/components/Crontab'
import { ElMessage } from 'element-plus'
@ -122,12 +123,18 @@ export default {
processDefinitionCode: String,
warningGroupList: Array,
environmentList: Array,
workerGroupList: Array
workerGroupList: Array,
getList:{
type: Function,
required: true,
},
},
setup(props) {
// Reactive state with `reactive` and `ref`
const visible = ref(false);
const openCron = ref(false);
const environmentListVo = ref([]);
const expression = ref("");
const dateRange = ref([]);
const form = reactive({
@ -135,6 +142,7 @@ export default {
warningGroupId: undefined,
environmentCode: undefined,
workerGroup: undefined,
metaTaskId:0,
crontab: "",
});
@ -145,10 +153,29 @@ export default {
});
// Methods
const show = (ids) => {
const show = (ids,metaTaskId) => {
form.processDefinitionCode = Number(ids[0]);
form.metaTaskId =Number(metaTaskId[0]);
dsmetataskdetail(form.processDefinitionCode).then((response) => {
if (response.success) {
if(response.data.crontab!=null)
form.crontab =response.data.crontab;
dateRange.value[0] =response.data.beginTime;
form.workerGroup =response.data.workerGroup;
form.warningGroupId =response.data.warningGroupId;
form.environmentCode =response.data.environmentCode;
dateRange.value[1] =response.data.endTime;
}else {
form.crontab ="";
form.workerGroup =undefined;
form.warningGroupId =undefined;
form.environmentCode =undefined;
}
environmentListVo.value = [...props.environmentList];
visible.value = true;
});
};
@ -162,17 +189,28 @@ export default {
};
const changeWoker = (value) => {
form.environmentCode=undefined
environmentListVo.value=[]
props.environmentList.forEach(item=>{
if(item.workerGroups.length>0&&item.workerGroups.includes(value)){
environmentListVo.value.push(item)
}
})
};
const handleds = () => {
dsmetatask(addDateRange(form, dateRange.value)).then((response) => {
if (response.success) {
visible.value = false;
console.log(response.msg)
ElMessage({
message: response.msg,
type: 'success',
})
}
props.getList();
}
});
};
@ -191,11 +229,13 @@ export default {
openCron,
expression,
dateRange,
environmentListVo,
form,
show,
handleShowCron,
crontabFill,
handleds,
changeWoker,
addDateRange,
};
}

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

@ -193,7 +193,17 @@
>删除</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"></right-toolbar>
@ -258,14 +268,14 @@
</template>
</el-table-column>
<el-table-column
label="调度时间"
label="调度ID"
align="center"
prop="dsTime"
prop="schId"
v-if="columns[5].visible"
width="100"
>
<template #default="scope">
<span>{{ parseTime(scope.row.createTime) }}</span>
<span>{{scope.row.schId}}</span>
</template>
</el-table-column>
<el-table-column
@ -540,6 +550,7 @@
:environmentList="environmentList"
:workerGroupList="workerGroupList"
:processDefinitionCode="dsIds"
:getList="getList"
/>
<log-dialog ref="logdialog"
:defindName="defindName"
@ -558,7 +569,7 @@
</style>
<script setup name="MetaTask">
import { ref, reactive, onMounted, watch } from "vue";
import { listmetatask, getmetatask, delmetatask, addmetatask, updatemetatask, downOrUpmetatask, datasourcetree, datasourceall } from "@/api/meta/metatask";
import { listmetatask, getmetatask, delmetatask, addmetatask, updatemetatask, downOrUpmetatask, datasourcetree, datasourceall ,dsmetataskdelete} from "@/api/meta/metatask";
import runDialog from "./runDialog";
import dsDialog from "./dsDialog";
import logDialog from "./logsDialog";
@ -647,7 +658,7 @@ const columns = [
{ key: 2, label: `任务类型`, visible: true },
{ key: 3, label: `所属数据源`, visible: true },
{ key: 4, label: `状态`, visible: true },
{ key: 5, label: `调度时间`, visible: true },
{ key: 5, label: `调度Id`, visible: true },
{ key: 6, label: `创建时间`, visible: true },
{ key: 7, label: `更新时间`, visible: true },
{ key: 8, label: `描述`, visible: true },
@ -664,10 +675,7 @@ watch(dbResoursName, (val) => {
});
// watch(filterText, (val) => {
// treeRef.value!.filter(val)
// })
// On mounted
onMounted(() => {
getList();
getDeptTree();
@ -678,7 +686,6 @@ const handleChangeType = (value) => {
form.value.metataskType = value[value.length - 1];
if (form.value.metataskType === '00') form.value.acTarget = '0';
else if (form.value.metataskType === '01') form.value.acTarget = '1';
console.log(form.value.metataskType ,"改变metataskType ")
};
const getList = async () => {
@ -749,7 +756,6 @@ const getIconClass = (data) => {
let icon=""
if (data.parentId == '0') icon= 'Monitor';
if (data.parentId == '100') icon= 'Coin';
console.log(icon)
return icon;
};
@ -843,7 +849,7 @@ const logdialog = ref(null);
const handleDS = (row) => {
if (dsdialog.value) {
dsdialog.value.show(dsIds.value); // Pass ids or any required data
dsdialog.value.show(dsIds.value,ids.value); // Pass ids or any required data
}
};
@ -864,7 +870,7 @@ const handleLog = (row) => {
const handleDSRow = (row) => {
if (dsdialog.value) {
dsdialog.value.show(row.dsIds); // Pass ids or any required data
dsdialog.value.show(row.dsIds,row.metatskId); // Pass ids or any required data
}
};
@ -906,10 +912,12 @@ const submitForm = async () => {
const handleDelete = async (row) => {
let isDelete = true;
if(row.metataskId!=null){
if (row.status === 'ONLINE') {
proxy.$modal.msgWarning("请选择下线数据进行删除");
isDelete = false;
}
} }
if (chooseRows.value.length > 0) {
chooseRows.value.forEach(b => {
if (b.status === 'ONLINE') {
@ -927,5 +935,31 @@ const handleDelete = async (row) => {
proxy.$modal.msgSuccess("删除成功");
}
};
const handleDeleteSche = async (row) => {
let isDelete = true;
if(row.metataskId!=null){
if (row.schId == ''||row.schId==null) {
proxy.$modal.msgWarning("请选择添加调度的任务进行删除");
isDelete = false;
}}else {
if (chooseRows.value.length > 0) {
chooseRows.value.forEach(b => {
if (b.schId == ''||b.schId==null) {
proxy.$modal.msgWarning("请选择添加调度的任务进行删除");
isDelete = false;
}
});
}
}
if (isDelete) {
const metataskIds = row.metataskId || ids.value;
const dsidsVo = row.dsIds || dsIds.value;
await proxy.$modal.confirm(`是否确认删除任务编号为"${metataskIds}"的调度?`);
await dsmetataskdelete({processDefinitionCode:dsidsVo.toString(),metaTaskId:metataskIds.toString()})
getList();
proxy.$modal.msgSuccess("删除调度成功");
}
};
</script>

10
vue-fastapi-frontend/src/views/meta/metatask/logsDialog.vue

@ -4,7 +4,7 @@
<div style="display: flex; flex-direction: column; gap: 10px;">
<!-- 第一部分实例表格带分页 -->
<el-card shadow="hover">
<template v-slot:header>
<template #header>
<div class="clearfix">
<span>实例列表</span>
</div>
@ -20,7 +20,7 @@
<el-table-column prop="id" label="实例ID" width="100" />
<el-table-column prop="name" label="实例名称" />
<el-table-column prop="state" label="状态" width="100">
<template v-slot:default="scope">
<template #default="scope">
<dict-tag
:options="meta_instance_status"
:value="scope.row.state"
@ -45,7 +45,7 @@
<!-- 第二部分任务节点表格 -->
<el-card shadow="hover">
<template v-slot:header>
<template #header>
<div class="clearfix">
<span>任务节点</span>
</div>
@ -61,7 +61,7 @@
<el-table-column prop="name" label="节点名称" />
<el-table-column prop="taskType" label="任务类型" />
<el-table-column prop="state" label="状态" width="100">
<template v-slot:default="scope">
<template #default="scope">
<dict-tag
:options="meta_instance_status"
:value="scope.row.state"
@ -73,7 +73,7 @@
<!-- 第三部分日志内容 -->
<el-card shadow="hover">
<template v-slot:header>
<template #header>
<div class="clearfix">
<span>日志详情</span>
</div>

Loading…
Cancel
Save