You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

972 lines
27 KiB

<template>
<div class="app-container">
<el-row :gutter="20">
<!--部门数据-->
<el-col :span="4" :xs="24">
<el-tabs type="card" v-model="activeTab">
<!-- 数据源标签页 -->
<el-tab-pane label="数据源" name="dataSource">
<div class="head-container">
<el-input
v-model="dbResoursName"
placeholder="请输入数据源"
clearable
prefix-icon="search"
style="margin-bottom: 20px"
/>
</div>
<div class="head-container">
<el-tree
:data="dbResourceOptions"
:props="defaultProps"
:expand-on-click-node="false"
:filter-node-method="filterNode"
ref="tree"
node-key="id"
default-expand-all
highlight-current
@node-click="handleNodeClick"
>
<template #default="{ node, data }">
<span class="custom-tree-node">
<i :class="getIconClass(data)"></i>
<span>{{ data.name }}</span>
</span>
</template>
</el-tree>
</div>
</el-tab-pane>
<el-tab-pane label="报表" name="report">
<div>敬请期待。。。。。</div>
</el-tab-pane>
</el-tabs>
</el-col>
<!--用户数据-->
<el-col :span="20" :xs="24">
<el-form
:model="queryParams"
ref="queryForm"
:inline="true"
v-show="showSearch"
label-width="68px"
>
<el-form-item label="任务名称" prop="metataskName">
<el-input
v-model="queryParams.metataskName"
placeholder="请输入任务名称"
clearable
style="width: 240px"
/>
</el-form-item>
<el-form-item label="任务类型" prop="metataskType">
<el-select
v-model="queryParams.metataskType"
placeholder="任务类型"
clearable
style="width: 240px"
>
<el-option
v-for="dict in meta_task_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="创建时间">
<el-date-picker
v-model="dateRange"
style="width: 240px"
value-format="YYYY-MM-DD"
type="daterange"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
></el-date-picker>
</el-form-item>
<el-form-item>
<el-button
type="primary"
icon="search"
@click="handleQuery"
>搜索</el-button
>
<el-button icon="refresh" @click="resetQuery"
>重置</el-button
>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="plus"
@click="handleAdd"
v-hasPermi="['meta:metatask:add']"
>新建任务</el-button
>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="edit"
:disabled="singleOne"
@click="handleUpdate"
v-hasPermi="['meta:metatask:edit']"
>修改</el-button
>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="top"
:disabled="singleOne"
@click="handleUp"
v-hasPermi="['meta:metatask:up']"
>上线</el-button
>
</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="handleDelete"
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"></right-toolbar>
</el-row>
<el-table
v-loading="loading"
:data="userList"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="50" align="center" />
<el-table-column
label="任务名称"
align="center"
key="metataskName"
prop="metataskName"
v-if="columns[1].visible"
:show-overflow-tooltip="true"
/>
<el-table-column
label="任务类型"
align="center"
key="metataskType"
prop="metataskType"
v-if="columns[2].visible"
:show-overflow-tooltip="true"
width="180"
>
<template #default="scope">
<dict-tag
:options="meta_task_type"
:value="scope.row.metataskType"
/>
</template>
</el-table-column>
<el-table-column
label="所属数据源"
align="center"
key="dbRCode"
prop="dbRCode"
v-if="columns[3].visible"
:show-overflow-tooltip="true"
>
<template #default="scope">
{{ getListNameById(scope.row.dbRCode) }}
</template>
</el-table-column>
<el-table-column
label="状态"
align="center"
key="status"
prop="status"
v-if="columns[4].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[5].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[6].visible"
width="100"
>
<template #default="scope">
<span>{{ parseTime(scope.row.createTime) }}</span>
</template>
</el-table-column>
<el-table-column
label="更新时间"
align="center"
prop="updateTime"
v-if="columns[7].visible"
width="100"
>
<template #default="scope">
<span>{{ parseTime(scope.row.updateTime) }}</span>
</template>
</el-table-column>
<el-table-column
label="描述"
align="center"
key="remark"
prop="remark"
v-if="columns[8].visible"
:show-overflow-tooltip="true"
/>
<el-table-column
label="创建人"
align="center"
key="createBy"
prop="createBy"
v-if="columns[9].visible"
:show-overflow-tooltip="true"
width="70"
/>
<el-table-column
label="修改人"
align="center"
key="updateBy"
prop="updateBy"
v-if="columns[10].visible"
:show-overflow-tooltip="true"
width="70"
/>
<el-table-column
label="操作"
align="center"
width="200"
class-name="small-padding fixed-width"
>
<template #default="{ row }">
<el-button
link
type="primary"
:disabled="row.status === 'ONLINE'"
icon="Edit"
@click="handleUpdate(row)"
v-hasPermi="['meta:metatask:edit']"
>
修改
</el-button>
<el-button
link
type="primary"
icon="Delete"
:disabled="row.status === 'ONLINE'"
@click="handleDelete(row)"
v-hasPermi="['meta:metatask:delete']"
>
删除
</el-button>
<el-dropdown
link
@command="(command) => handleCommand(command, row)"
>
<el-button link type="primary" icon="d-arrow-right">
更多
</el-button>
<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>
<el-dropdown-item
command="handleDown"
icon="circle-check"
:disabled="row.status === 'OFFLINE'"
v-hasPermi="['meta:metatask:down']"
>
下线
</el-dropdown-item>
<el-dropdown-item
command="handleDS"
icon="circle-check"
:disabled="row.status === 'OFFLINE'"
v-hasPermi="['meta:metatask:ds']"
>
调度
</el-dropdown-item>
<el-dropdown-item
command="handleRun"
icon="circle-check"
:disabled="row.status === 'OFFLINE'"
v-hasPermi="['meta:metatask:run']"
>
运行
</el-dropdown-item>
<el-dropdown-item
command="handleLog"
icon="circle-check"
v-hasPermi="['meta:metatask:log']"
>
日志
</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total > 0"
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</el-col>
</el-row>
<el-dialog v-model="open" width="600px" append-to-body>
<template #title>
<el-cascader
v-model="form.metataskType"
:options="metataskTypeOptions"
:disabled="isEdit"
:props="{ expandTrigger: 'hover' }"
@change="handleChangeType"
></el-cascader>
</template>
<el-form ref="taskForm" :model="form" :rules="rules" label-width="80px">
<el-row>
<el-col :span="24">
<el-form-item label="任务名称" prop="metataskName">
<el-input
v-model="form.metataskName"
placeholder="请输入任务名称"
maxlength="30"
style="width: 80%"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="采集方式" prop="acquisitionType">
<el-select
v-model="form.acquisitionType"
placeholder="请选择采集方式"
maxlength="30"
:disabled="isEdit"
style="width: 80%"
>
<el-option
v-for="dict in meta_task_acq"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="数据源" prop="dbRCode">
<el-select
v-model="form.dbRCode"
placeholder="请选择数据源"
maxlength="30"
disabled
style="width: 80%"
>
<el-option
v-for="dict in dbResourceOldList"
:key="dict.id"
:label="dict.name"
:value="dict.id"
></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="数据库" prop="dbCode">
<el-input
:disabled="isEdit"
v-model="form.dbCode"
placeholder="请输入数据库"
maxlength="30"
style="width: 80%"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="模式列表" prop="dbSName">
<el-input
v-model="form.dbSName"
placeholder="请输入模式列表"
maxlength="30"
:disabled="isEdit"
style="width: 80%"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="备注">
<el-input
v-model="form.remark"
type="textarea"
placeholder="请输入内容"
style="width: 80%"
></el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="submitForm">确 定</el-button>
<el-button @click="cancel">取 消</el-button>
</div>
</template>
</el-dialog>
<run-dialog ref="rundialog"
:warningGroupList="warningGroupList"
:environmentList="environmentList"
:workerGroupList="workerGroupList"
:processDefinitionCode="dsIds"
/>
<ds-dialog ref="dsdialog"
processDefinitionType="metaTask"
:warningGroupList="warningGroupList"
:environmentList="environmentList"
:workerGroupList="workerGroupList"
:processDefinitionCode="dsIds"
:getList="getList"
/>
<log-dialog ref="logdialog"
:defindName="defindName"
/>
</div>
</template>
<style scoped>
.custom-tree-node {
display: flex;
align-items: center;
}
.custom-tree-node i {
margin-right: 8px; /* 图标与文本之间的间距 */
}
</style>
<script setup name="MetaTask">
import { ref, reactive, onMounted, watch } from "vue";
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";
const { proxy } = getCurrentInstance();
const { meta_task_type, meta_task_acq, meta_task_status,meta_task_at } = proxy.useDict("meta_task_type", "meta_task_acq", "meta_task_status", "meta_task_at");
// Component setup
const activeTab = ref("dataSource");
const loading = ref(true);
const ids = ref([]);
const idnames = ref([]);
const dsIds = ref([]);
const single = ref(true);
const isEdit = ref(true);
const singleOne = ref(true); // Online, Edit, Delete
const singleTwo = ref(true); // Offline, Logs, Scheduling
const multiple = ref(true);
const showSearch = ref(true);
const total = ref(0);
const userList = ref(null);
const title = ref("");
const warningGroupList = ref(undefined);
const environmentList = ref(undefined);
const workerGroupList = ref(undefined);
const defindName = ref("");
const dbResourceOptions = ref(undefined);
const dbRCodeList = ref(undefined);
const dbSCodeList = ref([
{ value: "scheam", label: "scheam" },
{ value: "scheam2", label: "scheam2" }
]);
const metataskTypeOptions = ref([
{ value: "0", label: "元数据采集", children: [{ value: "00", label: "表字段" }, { value: "01", label: "存储过程" }] },
{ value: "1", label: "元数据加工" }
]);
const open = ref(false);
const dbResoursName = ref(undefined);
const clickNode = ref(undefined);
const dateRange = ref([]);
const postOptions = ref([]);
const data = reactive({
form: { metataskId: undefined,
metataskType: "00",
metataskName: undefined,
dbRName: undefined,
dbCode: undefined,
dbName: undefined,
dbRCode: undefined,
dbSName: undefined,
dbSCode: undefined,
remark: undefined,
acquisitionType: "0",
dsId: undefined,
acTarget: "0"},
queryParams: {
pageNum: 1,
pageSize: 10,
dbRcode: undefined,
dsId: undefined,
metataskName: undefined,
metataskType: undefined,
dbRCode: undefined
},
rules: {
metataskName: [
{ required: true, message: "任务名称不能为空", trigger: "blur" },
{ min: 2, max: 20, message: "任务名称长度必须介于 2 20 之间", trigger: "blur" }
],
dbSCode: [{ required: true, message: "模式列表不能为空", trigger: "blur" }],
acquisitionType: [{ required: true, message: "采集方式不能为空", trigger: "blur" }],
acTarget: [{ required: true, message: "采集目标不能为空", trigger: "blur" }]
}
});
const { queryParams, form, rules } = toRefs(data);
const defaultProps = {
children: "children",
label: "name"
};
const selectRowData = ref({});
const dbResourceOldList = ref([]);
const columns = [
{ key: 0, label: `任务ID`, visible: true },
{ key: 1, label: `任务名称`, visible: true },
{ key: 2, label: `任务类型`, visible: true },
{ key: 3, label: `所属数据源`, visible: true },
{ key: 4, label: `状态`, visible: true },
{ key: 5, label: `调度Id`, visible: true },
{ key: 6, label: `创建时间`, visible: true },
{ key: 7, label: `更新时间`, visible: true },
{ key: 8, label: `描述`, visible: true },
{ key: 9, label: `创建人`, visible: true },
{ key: 10, label: `修改人`, visible: true }
];
const chooseRows = ref([]);
// Watcher for dynamic changes
watch(dbResoursName, (val) => {
proxy.$refs["tree"].filter(val);
});
onMounted(() => {
getList();
getDeptTree();
});
// Methods
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';
};
const getList = async () => {
loading.value = true;
const response = await listmetatask(proxy.addDateRange(queryParams.value, dateRange.value));
userList.value = response.rows;
total.value = response.total;
loading.value = false;
};
const getDeptTree = async () => {
const response = await datasourceall();
warningGroupList.value = response.data.alertGroups;
environmentList.value = response.data.environment;
workerGroupList.value = response.data.workerGroup;
const treeResponse = await datasourcetree();
if (treeResponse.success && treeResponse.rows.length > 0) {
dbResourceOldList.value = treeResponse.rows;
const childrenList = dbResourceOldList.value.map(element => ({ ...element, parentId: "100" }));
dbResourceOptions.value = [{ id: 100, name: "数据源", parentId: 0, children: childrenList }];
}
};
const getListNameById = (id) => {
const item = dbResourceOldList.value.find(item => item.id == id);
return item!=null ? item.name : '';
};
const filterNode = (value, data) => {
if (!value) return true;
return data.name.indexOf(value) !== -1;
};
const handleNodeClick = (data) => {
clickNode.value = data;
queryParams.value.dbRCode = data.id;
handleQuery();
};
const cancel = () => {
open.value = false;
reset();
};
const reset = () => {
form.value= {
metataskId: undefined,
metataskType: "00",
metataskName: undefined,
dbRName: undefined,
dbCode: undefined,
dbName: undefined,
dbRCode: clickNode.value?.id,
dbSName: undefined,
dbSCode: undefined,
remark: undefined,
acquisitionType: "0",
dsId: undefined,
acTarget: "0"
};
proxy.resetForm("taskForm");
};
const getIconClass = (data) => {
let icon=""
if (data.parentId == '0') icon= 'Monitor';
if (data.parentId == '100') icon= 'Coin';
return icon;
};
const handleQuery = () => {
queryParams.value.pageNum = 1;
getList();
};
const resetQuery = () => {
dateRange.value = [];
proxy.resetForm("queryForm");
queryParams.value.dbRCode = clickNode.value?.id;
proxy.tree.setCurrentKey(null);
handleQuery();
};
const handleSelectionChange = (selection) => {
selectRowData.value = selection[0];
chooseRows.value = selection;
ids.value = selection.map((item) => item.metataskId);
dsIds.value = selection.map((item) => item.dsIds);
idnames.value=selection.map((item) => item.metataskName);
singleOne.value = selection.length !== 1 || selectRowData.value.status === "ONLINE";
singleTwo.value = selection.length !== 1 || selectRowData.value.status === "OFFLINE";
single.value = selection.length !== 1;
multiple.value = selection.length === 0;
};
const handleCommand = (command, row) => {
switch (command) {
case "handleUp":
handleUp(row);
break;
case "handleDown":
handleDown(row);
break;
case "handleDS":
handleDSRow(row);
break;
case "handleRun":
handleRunRow(row);
break;
case "handleLog":
handleLogRow(row);
break;
default:
break;
}
};
const handleAdd = () => {
if (!clickNode.value) {
proxy.$modal.msgError("请选择数据源节点!");
return;
}
reset();
isEdit.value=false;
open.value = true;
};
const handleUpdate = async (row) => {
reset();
const metataskId = row.metataskId || ids.value;
const response = await getmetatask(metataskId);
form.value = response.data;
open.value = true;
isEdit.value=true;
};
const handleUp = async (row) => {
const metataskIds = String(row.metataskId || ids.value);
const metataskNames = row.metataskName || idnames.value;
await proxy.$modal.confirm(`是否确认上线任务 "${metataskNames}"?`);
await downOrUpmetatask(metataskIds, "ONLINE");
getList();
proxy.$modal.msgSuccess("上线成功");
};
const handleDown = async (row) => {
const metataskIds = String(row.metataskId || ids.value);
const metataskNames = row.metataskName || idnames.value;
await proxy.$modal.confirm(`是否确认下线任务 "${metataskNames}"?`);
await downOrUpmetatask(metataskIds, "OFFLINE");
getList();
proxy.$modal.msgSuccess("下线成功");
};
const dsdialog = ref(null);
const rundialog = ref(null);
const logdialog = ref(null);
const handleDS = (row) => {
if (dsdialog.value) {
dsdialog.value.show(dsIds.value,ids.value); // Pass ids or any required data
}
};
const handleRun = (row) => {
rundialog.value.show(dsIds.value);
};
const handleLog = (row) => {
defindName.value = `${selectRowData.value.metataskName}-${selectRowData.value.dsTypes === "0" ? "表字段采集" : "存储过程采集"}`;
if (logdialog.value) {
logdialog.value.show(defindName.value);
}
};
const handleDSRow = (row) => {
if (dsdialog.value) {
dsdialog.value.show(row.dsIds,row.metatskId); // Pass ids or any required data
}
};
const handleRunRow = (row) => {
rundialog.value.show(row.dsIds);
};
const handleLogRow = (row) => {
defindName.value = `${row.metataskName}-${row.dsTypes === "0" ? "表字段采集" : "存储过程采集"}`;
if (logdialog.value) {
logdialog.value.show(defindName.value);
}
};
const submitForm = async () => {
proxy.$refs["taskForm"].validate(async (valid) => {
if (valid) {
const submitForm = { ...form.value };
submitForm.dbCode = clickNode.value.type;
submitForm.dbRName = clickNode.value.name;
if (submitForm.metataskId !== undefined) {
await updatemetatask(submitForm);
proxy.$modal.msgSuccess("修改成功");
open.value = false;
getList();
} else {
await addmetatask(submitForm);
proxy.$modal.msgSuccess("新增成功");
open.value = false;
getList();
}
}
});
};
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') {
proxy.$modal.msgWarning("请选择下线数据进行删除");
isDelete = false;
}
});
}
if (isDelete) {
const metataskIds = row.metataskId || ids.value;
const metataskNames = row.metataskName || idnames.value;
const dsidsVo = row.dsIds || dsIds.value;
await proxy.$modal.confirm(`是否确认删除任务 "${metataskNames}"?`);
await delmetatask(metataskIds, dsidsVo);
getList();
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 metataskNames = row.metataskName || idnames.value;
const dsidsVo = row.dsIds || dsIds.value;
await proxy.$modal.confirm(`是否确认删除任务 "${metataskNames}"的调度?`);
await dsmetataskdelete({processDefinitionCode:dsidsVo.toString(),metaTaskId:metataskIds.toString()})
getList();
proxy.$modal.msgSuccess("删除调度成功");
}
};
</script>