<template> <el-form size="small"> <el-form-item> <el-radio v-model="radioValue" :label="1"> 周,允许的通配符[, - * ? / L #] </el-radio> </el-form-item> <el-form-item> <el-radio v-model="radioValue" :label="2"> 不指定 </el-radio> </el-form-item> <el-form-item> <el-radio v-model="radioValue" :label="3"> 周期从 <el-select clearable v-model="cycle01"> <el-option v-for="(item, index) of weekList" :key="index" :label="item.value" :value="item.key" :disabled="item.key === 7" >{{ item.value }}</el-option > </el-select> - <el-select clearable v-model="cycle02"> <el-option v-for="(item, index) of weekList" :key="index" :label="item.value" :value="item.key" :disabled="item.key <= cycle01" >{{ item.value }}</el-option > </el-select> </el-radio> </el-form-item> <el-form-item> <el-radio v-model="radioValue" :label="4"> 第 <el-input-number v-model="average01" :min="1" :max="4" /> 周的 <el-select clearable v-model="average02"> <el-option v-for="item in weekList" :key="item.key" :label="item.value" :value="item.key" /> </el-select> </el-radio> </el-form-item> <el-form-item> <el-radio v-model="radioValue" :label="5"> 本月最后一个 <el-select clearable v-model="weekday"> <el-option v-for="item in weekList" :key="item.key" :label="item.value" :value="item.key" /> </el-select> </el-radio> </el-form-item> <el-form-item> <el-radio v-model="radioValue" :label="6"> 指定 <el-select class="multiselect" clearable v-model="checkboxList" placeholder="可多选" multiple :multiple-limit="6" > <el-option v-for="item in weekList" :key="item.key" :label="item.value" :value="item.key" /> </el-select> </el-radio> </el-form-item> </el-form> </template> <script setup> const emit = defineEmits(["update"]); const props = defineProps({ cron: { type: Object, default: { // second: "*", // min: "*", hour: "*", day: "*", month: "*", week: "?", year: "", }, }, check: { type: Function, default: () => {}, }, }); const radioValue = ref(2); const cycle01 = ref(2); const cycle02 = ref(3); const average01 = ref(1); const average02 = ref(2); const weekday = ref(2); const checkboxList = ref([]); const checkCopy = ref([2]); const weekList = ref([ { key: 1, value: "星期日" }, { key: 2, value: "星期一" }, { key: 3, value: "星期二" }, { key: 4, value: "星期三" }, { key: 5, value: "星期四" }, { key: 6, value: "星期五" }, { key: 7, value: "星期六" }, ]); const cycleTotal = computed(() => { cycle01.value = props.check(cycle01.value, 1, 6); cycle02.value = props.check(cycle02.value, cycle01.value + 1, 7); return cycle01.value + "-" + cycle02.value; }); const averageTotal = computed(() => { average01.value = props.check(average01.value, 1, 4); average02.value = props.check(average02.value, 1, 7); return average02.value + "#" + average01.value; }); const weekdayTotal = computed(() => { weekday.value = props.check(weekday.value, 1, 7); return weekday.value + "L"; }); const checkboxString = computed(() => { return checkboxList.value.join(","); }); watch( () => props.cron.week, (value) => changeRadioValue(value) ); watch( [radioValue, cycleTotal, averageTotal, weekdayTotal, checkboxString], () => onRadioChange() ); function changeRadioValue(value) { if (value === "*") { radioValue.value = 1; } else if (value === "?") { radioValue.value = 2; } else if (value.indexOf("-") > -1) { const indexArr = value.split("-"); cycle01.value = Number(indexArr[0]); cycle02.value = Number(indexArr[1]); radioValue.value = 3; } else if (value.indexOf("#") > -1) { const indexArr = value.split("#"); average01.value = Number(indexArr[1]); average02.value = Number(indexArr[0]); radioValue.value = 4; } else if (value.indexOf("L") > -1) { const indexArr = value.split("L"); weekday.value = Number(indexArr[0]); radioValue.value = 5; } else { checkboxList.value = [ ...new Set(value.split(",").map((item) => Number(item))), ]; radioValue.value = 6; } } function onRadioChange() { if (radioValue.value === 2 && props.cron.day === "?") { emit("update", "day", "*", "week"); } if (radioValue.value !== 2 && props.cron.day !== "?") { emit("update", "day", "?", "week"); } switch (radioValue.value) { case 1: emit("update", "week", "*", "week"); break; case 2: emit("update", "week", "?", "week"); break; case 3: emit("update", "week", cycleTotal.value, "week"); break; case 4: emit("update", "week", averageTotal.value, "week"); break; case 5: emit("update", "week", weekdayTotal.value, "week"); break; case 6: if (checkboxList.value.length === 0) { checkboxList.value.push(checkCopy.value[0]); } else { checkCopy.value = checkboxList.value; } emit("update", "week", checkboxString.value, "week"); break; } } </script> <style lang="scss" scoped> .el-input-number--small, .el-select, .el-select--small { margin: 0 0.5rem; } .el-select, .el-select--small { width: 8rem; } .el-select.multiselect, .el-select--small.multiselect { width: 17.8rem; } </style>