<template> <el-dialog v-model="visible" :close-on-click-modal="false" :title="form.jobId ? $t('common.editBtn') : $t('common.addBtn')" draggable> <el-form ref="dataFormRef" :model="form" :rules="dataRules" formDialogRef label-width="120px" v-loading="loading"> <el-row :gutter="20"> <el-col :span="12" class="mb20"> <el-form-item :label="t('job.jobName')" prop="jobName"> <el-input v-model="form.jobName" :placeholder="t('job.inputjobNameTip')"/> </el-form-item> </el-col> <el-col :span="12" class="mb20"> <el-form-item :label="t('job.jobGroup')" prop="jobGroup"> <el-input v-model="form.jobGroup" :placeholder="t('job.inputjobGroupTip')"/> </el-form-item> </el-col> <el-col :span="12" class="mb20"> <el-form-item :label="t('job.jobType')" prop="jobType"> <el-select v-model="form.jobType" :placeholder="t('job.jobType')"> <el-option v-for="(item, index) in job_type" :key="index" :label="item.label" :value="item.value"></el-option> </el-select> </el-form-item> </el-col> <el-col :span="12" class="mb20" v-if="['3', '4'].includes(form.jobType)"> <el-form-item :label="t('job.executePath')" prop="executePath"> <el-input v-model="form.executePath" :placeholder="t('job.inputexecutePathTip')"/> </el-form-item> </el-col> <el-col :span="12" class="mb20" v-if="['1', '2'].includes(form.jobType)"> <el-form-item :label="t('job.className')" prop="className"> <el-input v-model="form.className" :placeholder="t('job.inputclassNameTip')"/> </el-form-item> </el-col> <el-col :span="12" class="mb20" v-if="['1', '2'].includes(form.jobType)"> <el-form-item :label="t('job.methodName')" prop="methodName"> <el-input v-model="form.methodName" :placeholder="t('job.inputmethodNameTip')"/> </el-form-item> </el-col> <el-col :span="12" class="mb20"> <el-form-item :label="t('job.methodParamsValue')" prop="methodParamsValue"> <el-input v-model="form.methodParamsValue" :placeholder="t('job.inputmethodParamsValueTip')"/> </el-form-item> </el-col> <el-col :span="12" class="mb20"> <el-form-item :label="t('job.cronExpression')" prop="cronExpression"> <crontab clearable @hide="popoverVis(false)" v-model="form.cronExpression"></crontab> </el-form-item> </el-col> <el-col :span="12" class="mb20"> <el-form-item :label="t('job.misfirePolicy')" prop="misfirePolicy"> <el-select v-model="form.misfirePolicy" :placeholder="t('job.inputmisfirePolicyTip')"> <el-option v-for="(item, index) in misfire_policy" :key="index" :label="item.label" :value="item.value"></el-option> </el-select> </el-form-item> </el-col> <el-col :span="24" class="mb20"> <el-form-item :label="t('job.remark')" prop="remark"> <el-input v-model="form.remark" :placeholder="t('job.inputremarkTip')" type="textarea"/> </el-form-item> </el-col> </el-row> </el-form> <template #footer> <span class="dialog-footer"> <el-button formDialogRef @click="visible = false">{{ $t('common.cancelButtonText') }}</el-button> <el-button formDialogRef type="primary" @click="onSubmit" :disabled="loading">{{ $t('common.confirmButtonText') }}</el-button> </span> </template> </el-dialog> </template> <script lang="ts" name="SysJobDialog" setup> // 定义子组件向父组件传值/事件 import {useDict} from '/@/hooks/dict'; import {useMessage} from '/@/hooks/message'; import {addObj, getObj, putObj} from '/@/api/daemon/job'; import {useI18n} from 'vue-i18n'; import {rule} from '/@/utils/validate'; const emit = defineEmits(['refresh']); const Crontab = defineAsyncComponent(() => import('/@/components/Crontab/index.vue')); const {t} = useI18n(); // 定义变量内容 const dataFormRef = ref(); const visible = ref(false); const loading = ref(false); // 定义字典 const {misfire_policy, job_type} = useDict('job_status', 'job_execute_status', 'misfire_policy', 'job_type'); // 提交表单数据 const form = reactive({ jobId: '', jobName: '', jobGroup: '', jobType: '', executePath: '', className: '', methodName: '', methodParamsValue: '', cronExpression: '', misfirePolicy: '', jobStatus: '', jobExecuteStatus: '', remark: '', }); const popoverVis = (bol: boolean) => { popoverVisible.value = bol; }; const popoverVisible = ref(false); // 定义校验规则 const dataRules = reactive({ jobName: [{validator: rule.overLength, trigger: 'blur'},{required: true, message: '任务名称不能为空', trigger: 'blur'}], jobGroup: [{validator: rule.overLength, trigger: 'blur'},{required: true, message: '任务组名不能为空', trigger: 'blur'}], jobType: [{required: true, message: '任务类型不能为空', trigger: 'blur'}], cronExpression: [{validator: rule.overLength, trigger: 'blur'},{required: true, message: 'cron不能为空', trigger: 'blur'}], misfirePolicy: [{required: true, message: '策略不能为空', trigger: 'blur'}], executePath: [{validator: rule.overLength, trigger: 'blur'},{required: true, message: '执行路径不能为空', trigger: 'blur'}], className: [{validator: rule.overLength, trigger: 'blur'},{required: true, message: '执行文件不能为空', trigger: 'blur'}], methodName: [{validator: rule.overLength, trigger: 'blur'},{required: true, message: '执行方法不能为空', trigger: 'blur'}], methodParamsValue: [{validator: rule.overLength, trigger: 'blur'}], }); // 打开弹窗 const openDialog = (id: string) => { visible.value = true; form.jobId = ''; // 重置表单数据 nextTick(() => { dataFormRef.value?.resetFields(); }); // 获取sysJob信息 if (id) { form.jobId = id; getsysJobData(id); } }; // 提交 const onSubmit = async () => { const valid = await dataFormRef.value.validate().catch(() => { }); if (!valid) return false; try { loading.value = true; form.jobId ? await putObj(form) : await addObj(form); useMessage().success(t(form.jobId ? 'common.editSuccessText' : 'common.addSuccessText')); visible.value = false; emit('refresh'); } catch (err: any) { useMessage().error('任务初始化异常'); } finally { loading.value = false; } }; // 初始化表单数据 const getsysJobData = (id: string) => { // 获取数据 getObj(id).then((res: any) => { Object.assign(form, res.data); }); }; // 暴露变量 defineExpose({ openDialog, }); </script>