Commit 517bf022 authored by LiXuyang's avatar LiXuyang

任务调度

parent 0a007e12
src/assets/images/taskFlush.jpg

35.8 KB | W: | H:

src/assets/images/taskFlush.jpg

65 KB | W: | H:

src/assets/images/taskFlush.jpg
src/assets/images/taskFlush.jpg
src/assets/images/taskFlush.jpg
src/assets/images/taskFlush.jpg
  • 2-up
  • Swipe
  • Onion skin
...@@ -16,10 +16,11 @@ ...@@ -16,10 +16,11 @@
import { useMessage } from '@/hooks/web/useMessage'; import { useMessage } from '@/hooks/web/useMessage';
import { exportRoleList } from '@/api/system/role/role'; import { exportRoleList } from '@/api/system/role/role';
import { downloadByData } from '@/utils/file/download'; import { downloadByData } from '@/utils/file/download';
import { ModalProps } from 'ant-design-vue';
const emit = defineEmits(['success', 'register']); const emit = defineEmits(['success', 'register']);
const { createMessage } = useMessage(); const { createMessage } = useMessage();
const getTitle = computed(() => '查看日志'); const getTitle = '查看日志1111';
const textAreaData = ref( const textAreaData = ref(
'\n' + '\n' +
'2023-07-05 15: 38: 11.224 [ForkJoinPool-2-worker-25] INFO i.t.t.web.schedule.SolutionWatcher - change sub job status to RUNNING, sub job id is 13ad3131-d07b-4f53-92b9-4f06447fe400\n' + '2023-07-05 15: 38: 11.224 [ForkJoinPool-2-worker-25] INFO i.t.t.web.schedule.SolutionWatcher - change sub job status to RUNNING, sub job id is 13ad3131-d07b-4f53-92b9-4f06447fe400\n' +
...@@ -39,7 +40,11 @@ ...@@ -39,7 +40,11 @@
//初始化弹框 //初始化弹框
const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => { const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {
setModalProps({ confirmLoading: false, showOkBtn: false, cancelText: '关闭' }); setModalProps({
confirmLoading: false,
showOkBtn: false,
cancelText: '关闭',
} as ModalProps);
}); });
/**确定按钮*/ /**确定按钮*/
......
...@@ -3,53 +3,53 @@ ...@@ -3,53 +3,53 @@
<template #extra> <template #extra>
<div style="display: flex"> <div style="display: flex">
<div> <div>
<a-button type="link"> <a-button type="link" :disabled="checkDisabled()">
<Icon icon="ant-design:caret-right-outlined" size="24" /> <Icon icon="ant-design:caret-right-outlined" size="24" />
<p style="color: black">运行</p> <p style="color: black">运行</p>
</a-button> </a-button>
</div> </div>
<div> <div>
<a-button type="link"> <a-button type="link" :disabled="checkDisabled()">
<Icon icon="ant-design:send-outlined" size="24" /> <Icon icon="ant-design:send-outlined" size="24" />
<p style="color: black">发布</p> <p style="color: black">发布</p>
</a-button> </a-button>
</div> </div>
<div> <div>
<a-button <a-button @click="batchOffline" :disabled="checkDisabled()" type="link">
@click="batchOffline"
:disabled="checkDisabled()"
type="link"
>
<Icon icon="ant-design:cloud-download-outlined" size="24" /> <Icon icon="ant-design:cloud-download-outlined" size="24" />
<p style="color: black">下线</p> <p style="color: black">下线</p>
</a-button> </a-button>
</div> </div>
<div> <div>
<a-button type="link"> <a-button type="link" :disabled="checkDisabled()">
<Icon icon="ant-design:tag-outlined" size="24" /> <Icon icon="ant-design:tag-outlined" size="24" />
<p style="color: black">设置业务标签</p> <p style="color: black">设置业务标签</p>
</a-button> </a-button>
</div> </div>
<div> <div>
<a-button type="link"> <a-button type="link" :disabled="checkDisabled()">
<Icon icon="ant-design:reconciliation-outlined" size="24" /> <Icon icon="ant-design:reconciliation-outlined" size="24" />
<p style="color: black">复制到</p> <p style="color: black">复制到</p>
</a-button> </a-button>
</div> </div>
<div> <div>
<a-button type="link"> <a-button type="link" :disabled="checkDisabled()">
<Icon icon="ant-design:delete-outlined" style="color: red" size="24" /> <Icon
icon="ant-design:delete-outlined"
:style="{ color: checkDisabled() ? null : 'red' }"
size="24"
/>
<p style="color: black">删除</p> <p style="color: black">删除</p>
</a-button> </a-button>
</div> </div>
<div> <div>
<a-button type="link"> <a-button type="link" :disabled="checkDisabled()">
<Icon icon="ant-design:folder-open-outlined" size="24" /> <Icon icon="ant-design:folder-open-outlined" size="24" />
<p style="color: black">移动</p> <p style="color: black">移动</p>
</a-button> </a-button>
</div> </div>
<div> <div>
<a-button type="link"> <a-button type="link" :disabled="checkDisabled()">
<Icon icon="ant-design:arrow-up-outlined" size="24" /> <Icon icon="ant-design:arrow-up-outlined" size="24" />
<p style="color: black">导出</p> <p style="color: black">导出</p>
</a-button> </a-button>
...@@ -193,40 +193,41 @@ ...@@ -193,40 +193,41 @@
const searchInfo = reactive<Recordable>({}); const searchInfo = reactive<Recordable>({});
const [copyModal, { openModal: openCopyModal }] = useModal(); const [copyModal, { openModal: openCopyModal }] = useModal();
const [checkModal, { openModal: openCheckModal }] = useModal(); const [checkModal, { openModal: openCheckModal }] = useModal();
const [registerTable, { getRowSelection, getSelectRows, setTableData,setSelectedRows, }] = useTable({ const [registerTable, { getRowSelection, getSelectRows, setTableData, setSelectedRows }] =
/* title: '任务流',*/ useTable({
api: async (params) => { /* title: '任务流',*/
const response = { api: async (params) => {
pageNu: '1', const response = {
pageSize: '10', pageNu: '1',
pages: '1', pageSize: '10',
total: tableData.value.length, pages: '1',
code: '', total: tableData.value.length,
message: '', code: '',
data: [], message: '',
}; data: [],
//按照部门筛选 如果有进行过滤相应部门的 没有就赋值全部 };
let data = []; //按照部门筛选 如果有进行过滤相应部门的 没有就赋值全部
data = tableData.value.filter((item) => item.type === 'theme'); let data = [];
return { ...response, data: data }; data = tableData.value.filter((item) => item.type === 'theme');
}, return { ...response, data: data };
rowKey: 'businessId', },
rowSelection: true, rowKey: 'businessId',
showIndexColumn: false, rowSelection: true,
columns, showIndexColumn: false,
showTableSetting: false, columns,
bordered: true, showTableSetting: false,
striped: false, bordered: true,
handleSearchInfoFn(info) { striped: false,
console.log('handleSearchInfoFn', info); handleSearchInfoFn(info) {
return info; console.log('handleSearchInfoFn', info);
}, return info;
actionColumn: { },
width: 220, actionColumn: {
title: '操作', width: 220,
dataIndex: 'action', title: '操作',
}, dataIndex: 'action',
}); },
});
/**右上*/ /**右上*/
const [registerForm] = useTable({ const [registerForm] = useTable({
schemas: searchFormSchema, schemas: searchFormSchema,
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
:title="getTitle" :title="getTitle"
@ok="handleSubmit" @ok="handleSubmit"
> >
<BasicTree checkable :search="true" :treeData="taskFlushTreeData" /> <BasicTree checkable :search="true" :treeData="taskFlushTreeData" :defaultExpandAll="true" />
</BasicModal> </BasicModal>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
import { taskFlushTreeData } from './designData'; import { taskFlushTreeData } from './designData';
import { BasicTree } from '@/components/Tree'; import { BasicTree } from '@/components/Tree';
/* const getTitle = '选择上游任务流';*/ /* const getTitle = '选择上游任务流';*/
const getTitle = '添加上游任务流'; const getTitle = '添加上游任务流';
//初始化弹框 //初始化弹框
const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => { const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {
...@@ -22,7 +22,6 @@ ...@@ -22,7 +22,6 @@
}); });
/**确定按钮*/ /**确定按钮*/
async function handleSubmit() { async function handleSubmit() {
closeModal(); closeModal();
} }
</script> </script>
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
<div style="display: flex"> <div style="display: flex">
<BasicTree <BasicTree
class="w-1/2" class="w-1/2"
defaultExpandLevel="1" :defaultExpandAll="true"
@select="handleSelect" @select="handleSelect"
:search="true" :search="true"
:treeData="taskLeftTreeData" :treeData="taskLeftTreeData"
......
...@@ -2,6 +2,9 @@ import { FormSchema } from '@/components/Form'; ...@@ -2,6 +2,9 @@ import { FormSchema } from '@/components/Form';
import { BasicColumn } from '@/components/Table'; import { BasicColumn } from '@/components/Table';
import { InputProps, TableColumn } from 'ant-design-vue'; import { InputProps, TableColumn } from 'ant-design-vue';
import { TreeItem } from '@/components/Tree'; import { TreeItem } from '@/components/Tree';
import { TreeProps } from 'ant-design-vue/es/tree/Tree';
import { pathOptionsData } from '@/views/dataStandards/labelDropInspection/labelData';
import {taskTreeData} from "@/views/taskScheduling/taskFlowDesign/designData";
export const designFormSchema: FormSchema[] = [ export const designFormSchema: FormSchema[] = [
{ {
...@@ -757,8 +760,10 @@ export const checkFormSchema: FormSchema[] = [ ...@@ -757,8 +760,10 @@ export const checkFormSchema: FormSchema[] = [
{ {
label: '落标检查', label: '落标检查',
field: 'path', field: 'path',
required: true, component: 'TreeSelect',
slot: 'path', componentProps: {
treeData: pathOptionsData,
} as TreeProps,
}, },
{ {
label: '检查结果', label: '检查结果',
...@@ -1265,7 +1270,8 @@ export const defineEvent: FormSchema[] = [ ...@@ -1265,7 +1270,8 @@ export const defineEvent: FormSchema[] = [
field: 'sql', field: 'sql',
component: 'InputTextArea', component: 'InputTextArea',
componentProps: { componentProps: {
placeholder: '事件满足取决于当前sql返回结果是否为空,' + placeholder:
'事件满足取决于当前sql返回结果是否为空,' +
'若无返回结果则判断事件条件未达成:\n' + '若无返回结果则判断事件条件未达成:\n' +
'此处支持引用任务流参数、工作区参数、全局参数', '此处支持引用任务流参数、工作区参数、全局参数',
rows: 8, rows: 8,
...@@ -1369,6 +1375,10 @@ export const copyFormSchema: FormSchema[] = [ ...@@ -1369,6 +1375,10 @@ export const copyFormSchema: FormSchema[] = [
{ {
label: '路径', label: '路径',
field: 'path', field: 'path',
slot: 'path', component: 'TreeSelect',
componentProps: {
fieldNames: { value: 'key', title: 'title' },
treeData: taskTreeData,
} as TreeProps,
}, },
]; ];
...@@ -17,10 +17,7 @@ ...@@ -17,10 +17,7 @@
<CloseOutlined /> <CloseOutlined />
退出 退出
</a-button> </a-button>
<a-button v-if="!versionFlag" style="border-color: transparent"> <a-button v-if="!versionFlag" type="primary">跳转运维</a-button>
<Icon icon="ant-design:dashboard-outlined" style="color: blue" size="24" />
<p>跳转运维</p></a-button
>
<a-button v-if="!versionFlag" :disabled="debugFlag" type="primary"> <a-button v-if="!versionFlag" :disabled="debugFlag" type="primary">
<!-- <Icon icon="ant-design:caret-right-outlined" style="color: blue" size="24"/> <!-- <Icon icon="ant-design:caret-right-outlined" style="color: blue" size="24"/>
<p>运行</p>--> <p>运行</p>-->
......
...@@ -8,167 +8,165 @@ ...@@ -8,167 +8,165 @@
> >
<BasicForm @register="registerForm"> <BasicForm @register="registerForm">
<template #cycle="{ field, model }"> <template #cycle="{ field, model }">
<Select v-model:value="model[field]" :options="cycleOptions" placeholder="请选择"/> <Select v-model:value="model[field]" :options="cycleOptions" placeholder="请选择" />
<a-button <a-button
type="link" type="link"
v-if="model[field] === '事件触发器'" v-if="model[field] === '事件触发器'"
@click="handleCycle" @click="handleCycle"
style="margin-left: -15px" style="margin-left: -15px"
>批量调整直接下游配置 >批量调整直接下游配置
</a-button> </a-button>
</template> </template>
<template #scheduleTime="{ field, model }"> <template #scheduleTime="{ field, model }">
<div style="display: flex"> <div style="display: flex">
<Input v-model:value="model[field]" style="width: 45%"/> <Input v-model:value="model[field]" style="width: 45%" />
<Input v-model:value="model['scheduleTime']" style="width: 45%"/> <Input v-model:value="model['scheduleTime']" style="width: 45%" />
</div> </div>
</template> </template>
<template #eventTrigger="{ field, model }"> <template #eventTrigger="{ field, model }">
<div style="display: flex;"> <div style="display: flex">
<a-button @click="handleSetConfig" <a-button @click="handleSetConfig" style="color: red; border-color: red"
style="color: red;border-color: red;">定义事件 >定义事件
</a-button> </a-button>
<a-button @click="viewLogs" style="margin-left: 20px">查看日志</a-button> <a-button @click="viewLogs" style="margin-left: 20px">查看日志</a-button>
</div> </div>
<a-button type="link" style="color: red;margin-left: -10px"> <a-button type="link" style="color: red; margin-left: -10px">
<Icon icon="ant-design:exclamation-circle-outlined"/> <Icon icon="ant-design:exclamation-circle-outlined" />
请定义触发事件详情 请定义触发事件详情
</a-button> </a-button>
</template> </template>
<template #overTime="{ field, model }"> <template #overTime="{ field, model }">
<CheckboxGroup :options="overTimeOptions" v-model:value="model[field]"/> <CheckboxGroup :options="overTimeOptions" v-model:value="model[field]" />
<div v-if="model[field]" style="display: flex; width: 30%"> <div v-if="model[field]" style="display: flex; width: 30%">
<InputNumber v-model:value="model.timeNum" :min="0" :step="1"/> <InputNumber v-model:value="model.timeNum" :min="0" :step="1" />
<Select v-model:value="model.timeType" :options="timeTypeOptions"/> <Select v-model:value="model.timeType" :options="timeTypeOptions" />
</div> </div>
</template> </template>
<template #group="{ field, model }"> <template #group="{ field, model }">
<Select v-model:value="model[field]" :options="groupOptions"/> <Select v-model:value="model[field]" :options="groupOptions" />
</template> </template>
</BasicForm> </BasicForm>
<EditDownStreamModel @register="editModal"/> <EditDownStreamModel @register="editModal" />
<DefineEvent @register="defineEvent"/> <DefineEvent @register="defineEvent" />
<ViewLogModal @register="registerViewLogsModal" /> <ViewLogModal @register="registerViewLogsModal" />
</BasicModal> </BasicModal>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import Icon from '@/components/Icon/Icon.vue'; import Icon from '@/components/Icon/Icon.vue';
import {Input, CheckboxGroup, Select, InputNumber, FormItemRest} from 'ant-design-vue'; import { Input, CheckboxGroup, Select, InputNumber, FormItemRest } from 'ant-design-vue';
import {BasicModal, useModal, useModalInner} from '@/components/Modal'; import { BasicModal, useModal, useModalInner } from '@/components/Modal';
import {BasicForm, useForm} from '@/components/Form'; import { BasicForm, useForm } from '@/components/Form';
import { import { taskOverallConfig } from '@/views/taskScheduling/taskFlowDesign/design.data';
taskOverallConfig, import EditDownStreamModel from './editDownStreamModel.vue';
} from '@/views/taskScheduling/taskFlowDesign/design.data'; import DefineEvent from './defineEvent.vue';
import EditDownStreamModel from './editDownStreamModel.vue'; import { routeList } from '@/views/dataService/serviceManage/onlineManage/mock';
import DefineEvent from "./defineEvent.vue"; import ViewLogModal from '@/views/dataIntegration/dataLoading/dataEntryLake/ViewLogModal.vue';
import {routeList} from "@/views/dataService/serviceManage/onlineManage/mock";
import ViewLogModal from "@/views/dataIntegration/dataLoading/dataEntryLake/ViewLogModal.vue";
const getTitle = '任务流全局配置'; const getTitle = '任务流全局配置';
const [registerViewLogsModal, { openModal: openViewLogsModal }] = useModal(); const [registerViewLogsModal, { openModal: openViewLogsModal }] = useModal();
const [editModal, {openModal: openEditModel}] = useModal(); const [editModal, { openModal: openEditModel }] = useModal();
const [defineEvent, {openModal: openDefineEvent}] = useModal(); const [defineEvent, { openModal: openDefineEvent }] = useModal();
function handleCycle() { function handleCycle() {
openEditModel(true, { openEditModel(true, {
isUpdate: false, isUpdate: false,
}); });
} }
/**定义事件*/ /**定义事件*/
function handleSetConfig() { function handleSetConfig() {
openDefineEvent(true, { openDefineEvent(true, {
isUpdate: false, isUpdate: false,
}); });
} }
/**查看日志*/ /**查看日志*/
function viewLogs() { function viewLogs() {
openViewLogsModal(true); openViewLogsModal(true, {});
} }
//初始化弹框 //初始化弹框
const [registerModal, {setModalProps, closeModal}] = useModalInner(async (data) => { const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => {
setModalProps({confirmLoading: false}); setModalProps({ confirmLoading: false });
}); });
/**调度周期*/ /**调度周期*/
const cycleOptions = [ const cycleOptions = [
{ {
label: '每天一次', label: '每天一次',
value: '每天一次', value: '每天一次',
}, },
{ {
label: 'Cron表达式', label: 'Cron表达式',
value: 'Cron表达式', value: 'Cron表达式',
}, },
{ {
label: '事件触发器', label: '事件触发器',
value: '事件触发器', value: '事件触发器',
}, },
{ {
label: '无周期', label: '无周期',
value: '无周期', value: '无周期',
}, },
]; ];
const overTimeOptions = [ const overTimeOptions = [
{ {
label: '超时失败', label: '超时失败',
value: '超时失败', value: '超时失败',
}, },
]; ];
const groupOptions = [ const groupOptions = [
{ {
label: '全部执行器', label: '全部执行器',
value: '全部执行器', value: '全部执行器',
}, },
{ {
label: 'Java执行器', label: 'Java执行器',
value: 'Java执行器', value: 'Java执行器',
}, },
{ {
label: 'Scala执行器', label: 'Scala执行器',
value: 'Scala执行器', value: 'Scala执行器',
}, },
{ {
label: 'default group', label: 'default group',
value: 'default group', value: 'default group',
}, },
]; ];
const timeTypeOptions = [ const timeTypeOptions = [
{ {
label: '分', label: '分',
value: '分', value: '分',
}, },
{ {
label: '小时', label: '小时',
value: '小时', value: '小时',
}, },
{ {
label: '天', label: '天',
value: '天', value: '天',
}, },
{ {
label: '周', label: '周',
value: '周', value: '周',
}, },
{ {
label: '月', label: '月',
value: '月', value: '月',
}, },
]; ];
const [registerForm, {setFieldsValue, updateSchema, resetFields, validate}] = useForm({ const [registerForm, { setFieldsValue, updateSchema, resetFields, validate }] = useForm({
labelWidth: 100, labelWidth: 100,
labelAlign: 'left', labelAlign: 'left',
baseColProps: {lg: 12, md: 24}, baseColProps: { lg: 12, md: 24 },
schemas: taskOverallConfig, schemas: taskOverallConfig,
showActionButtonGroup: false, showActionButtonGroup: false,
actionColOptions: { actionColOptions: {
span: 23, span: 23,
}, },
}); });
/**确定按钮*/ /**确定按钮*/
async function handleSubmit() { async function handleSubmit() {
closeModal(); closeModal();
} }
</script> </script>
...@@ -226,17 +226,7 @@ ...@@ -226,17 +226,7 @@
</BasicForm> </BasicForm>
</TabPane> </TabPane>
<TabPane v-if="type === '13'" key="13" tab="落标检查任务"> <TabPane v-if="type === '13'" key="13" tab="落标检查任务">
<BasicForm @register="checkForm"> <BasicForm @register="checkForm" />
<template #path="{ field, model }">
<div style="display: flex">
<InputSearch
v-model:value="model[field]"
enter-button="选择"
@search="onCheckSearch"
/>
</div>
</template>
</BasicForm>
</TabPane> </TabPane>
<TabPane v-if="type !== '7' && type !== '8' && type !== '10'" key="100" tab="任务参数"> <TabPane v-if="type !== '7' && type !== '8' && type !== '10'" key="100" tab="任务参数">
<!--嵌套任务流任务区别部分--> <!--嵌套任务流任务区别部分-->
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment