fix: 修复任务日志日期查询部分错误

This commit is contained in:
2024-08-04 22:46:25 +08:00
parent f54caed4da
commit ff405d12ab
9 changed files with 10 additions and 758 deletions

View File

@@ -1,151 +0,0 @@
<template>
<a-form-item>
<a-radio v-model="radioValue" :label="1">
允许的通配符[, - * ? / L W]
</a-radio>
</a-form-item>
<a-form-item>
<a-radio v-model="radioValue" :label="2">
不指定
</a-radio>
</a-form-item>
<a-form-item>
<a-radio v-model="radioValue" :label="3">
周期从
<a-input-number v-model="cycle01" :min="1" :max="30" /> -
<a-input-number v-model="cycle02" :min="cycle01 ? cycle01 + 1 : 2" :max="31" />
</a-radio>
</a-form-item>
<a-form-item>
<a-radio v-model="radioValue" :label="4">
<a-input-number v-model="average01" :min="1" :max="30" /> 号开始
<a-input-number v-model="average02" :min="1" :max="31 - average01 || 1" /> 日执行一次
</a-radio>
</a-form-item>
<a-form-item>
<a-radio v-model="radioValue" :label="5">
每月
<a-input-number v-model="workday" :min="1" :max="31" /> 号最近的那个工作日
</a-radio>
</a-form-item>
<a-form-item>
<a-radio v-model="radioValue" :label="6">
本月最后一天
</a-radio>
</a-form-item>
<a-form-item>
<a-radio v-model="radioValue" :label="7">
指定
<a-select v-model="checkboxList" clearable placeholder="可多选" multiple style="width:100%">
<a-option v-for="item in 31" :key="item" :value="item">{{ item }}</a-option>
</a-select>
</a-radio>
</a-form-item>
</template>
<script setup>
import { computed, ref, watch } from 'vue'
const props = defineProps({
check: {
type: Function,
required: true
},
modelValue: {
type: String,
required: true
},
cron: {
type: Object,
required: true
}
})
const emit = defineEmits(['update:modelValue'])
const radioValue = ref(1)
const workday = ref(1)
const cycle01 = ref(1)
const cycle02 = ref(2)
const average01 = ref(1)
const average02 = ref(1)
const checkboxList = ref([])
const cycleTotal = computed(() => {
const cycle01Val = props.check(cycle01.value, 1, 30)
const cycle02Val = props.check(cycle02.value, cycle01Val ? cycle01Val + 1 : 2, 31, 31)
return `${cycle01Val}-${cycle02Val}`
})
const averageTotal = computed(() => {
const average01Val = props.check(average01.value, 1, 30)
const average02Val = props.check(average02.value, 1, 31 - average01Val || 0)
return `${average01Val}/${average02Val}`
})
const workdayCheck = computed(() => {
const workdayVal = props.check(workday.value, 1, 31)
return workdayVal
})
const checkboxString = computed(() => {
const str = checkboxList.value.join()
return str === '' ? '*' : str
})
const emitUpdate = (value) => {
emit('update:modelValue', value)
}
watch(radioValue, () => {
if (radioValue.value !== 2 && props.cron.week !== '?') {
props.cron.week = '?'
}
switch (radioValue.value) {
case 1:
emitUpdate('*')
break
case 2:
emitUpdate('?')
break
case 3:
emitUpdate(cycleTotal.value)
break
case 4:
emitUpdate(averageTotal.value)
break
case 5:
emitUpdate(`${workdayCheck.value}W`)
break
case 6:
emitUpdate('L')
break
case 7:
emitUpdate(checkboxString.value)
break
}
})
watch(cycleTotal, () => {
emitUpdate(cycleTotal.value)
})
watch(averageTotal, () => {
emitUpdate(averageTotal.value)
})
watch(workdayCheck, () => {
emitUpdate(`${workdayCheck.value}W`)
})
watch(checkboxString, () => {
emitUpdate(checkboxString.value)
})
</script>

View File

@@ -1,109 +0,0 @@
<template>
<a-form-item>
<a-radio v-model="radioValue" :label="1">
*
</a-radio>
</a-form-item>
<a-form-item>
<a-radio v-model="radioValue" :label="2">
周期从
<a-input-number v-model="cycle01" :min="0" :max="58" />
-
<a-input-number v-model="cycle02" :min="cycle01 ? cycle01 + 1 : 1" :max="59" />
</a-radio>
</a-form-item>
<a-form-item>
<a-radio v-model="radioValue" :label="3">
<a-input-number v-model="average01" :min="0" :max="58" />
开始
<a-input-number v-model="average02" :min="1" :max="59 - average01 || 0" />
执行一次
</a-radio>
</a-form-item>
<a-form-item>
<a-radio v-model="radioValue" :label="4">
指定
<a-select v-model="checkboxList" clearable placeholder="可多选" multiple style="width:100%">
<a-option v-for="item in 60" :key="item" :value="item - 1">{{ item - 1 }}</a-option>
</a-select>
</a-radio>
</a-form-item>
</template>
<script setup>
import { computed, ref, watch } from 'vue'
const props = defineProps({
check: {
type: Function,
required: true
},
modelValue: {
type: String,
required: true
}
})
const emit = defineEmits(['update:modelValue'])
const radioValue = ref(1)
const cycle01 = ref(0)
const cycle02 = ref(1)
const average01 = ref(0)
const average02 = ref(1)
const checkboxList = ref([])
const cycleTotal = computed(() => {
const cycle01Val = props.check(cycle01.value, 0, 58)
const cycle02Val = props.check(cycle02.value, cycle01Val ? cycle01Val + 1 : 1, 59)
return `${cycle01Val}-${cycle02Val}`
})
const averageTotal = computed(() => {
const average01Val = props.check(average01.value, 0, 58)
const average02Val = props.check(average02.value, 1, 59 - average01Val || 0)
return `${average01Val}/${average02Val}`
})
const checkboxString = computed(() => {
const str = checkboxList.value.join()
return str === '' ? '*' : str
})
const emitUpdate = (value) => {
emit('update:modelValue', value)
}
watch(radioValue, () => {
switch (radioValue.value) {
case 1:
emitUpdate('*')
break
case 2:
emitUpdate(cycleTotal.value)
break
case 3:
emitUpdate(averageTotal.value)
break
case 4:
emitUpdate(checkboxString.value)
break
}
})
watch(cycleTotal, () => {
emitUpdate(cycleTotal.value)
})
watch(averageTotal, () => {
emitUpdate(averageTotal.value)
})
watch(checkboxString, () => {
emitUpdate(checkboxString.value)
})
</script>

View File

@@ -1,145 +0,0 @@
<template>
<a-tabs default-active-key="1" type="card">
<a-tab-pane key="1" tab="秒">
<CrontabField v-model="cron.second" :check="checkNumber" />
</a-tab-pane>
<a-tab-pane key="2" tab="分">
<CrontabField v-model="cron.minute" :check="checkNumber" />
</a-tab-pane>
<a-tab-pane key="3" tab="时">
<CrontabField v-model="cron.hour" :check="checkNumber" />
</a-tab-pane>
<a-tab-pane key="4" tab="日">
<CrontabDay v-model="cron.day" :check="checkNumber" :cron="cron" />
</a-tab-pane>
<a-tab-pane key="5" tab="月">
<CrontabMonth v-model="cron.month" :check="checkNumber" />
</a-tab-pane>
<a-tab-pane key="6" tab="星期">
<CrontabWeek v-model="cron.week" :check="checkNumber" :cron="cron" />
</a-tab-pane>
<a-tab-pane key="7" tab="年">
<CrontabYear v-model="cron.year" :check="checkNumber" />
</a-tab-pane>
</a-tabs>
<div class="cron-result">
<p>Cron 表达式:</p>
<code class="cron-expression">{{ cronExpression }}</code>
</div>
<div v-if="cronExpression">
<!-- <button @click="parseCronExpression">解析表达式</button> -->
<button @click="generateCronExpression">生成表达式</button>
</div>
<div v-if="parsedCron">
<p>解析结果:</p>
<pre>{{ parsedCron }}</pre>
</div>
</template>
<script setup>
import { computed, ref } from 'vue'
import CrontabField from './CrontabField.vue' // Import the CrontabField component
import CrontabDay from './CrontabDay.vue' // Import the CrontabDay component
import CrontabMonth from './CrontabMonth.vue' // Import the CrontabMonth component
import CrontabWeek from './CrontabWeek.vue' // Import the CrontabWeek component
import CrontabYear from './CrontabYear.vue' // Import the CrontabYear component
const cron = ref({
second: '*',
minute: '*',
hour: '*',
day: '*',
month: '*',
week: '?',
year: '*'
})
const cronExpression = computed(() => {
return `${cron.value.second} ${cron.value.minute} ${cron.value.hour} ${cron.value.day} ${cron.value.month} ${cron.value.week} ${cron.value.year}`
})
const parsedCron = ref(null)
const checkNumber = (value, min, max, defaultValue = null) => {
if (value === '' || value === undefined || value === null || Number.isNaN(value)) {
return defaultValue
}
if (value < min) {
return min
}
if (value > max) {
return max
}
return value
}
const parseCronExpression = () => {
// 使用第三方库或自定义函数解析 Cron 表达式
// 例如:
const parsed = parseCron(cronExpression.value) // 替换为实际解析函数
parsedCron.value = parsed
}
const generateCronExpression = () => {
// 使用自定义函数根据选项生成 Cron 表达式
// 例如:
const generatedExpression = generateCronFromOptions(cron.value) // 替换为实际生成函数
cron.value = generatedExpression
}
// // 解析 Cron 表达式的函数
// function parseCron(expression) {
// // ... 解析逻辑
// // 返回解析后的结果,例如一个包含各个字段信息的数组或对象
// return {
// second: '0-59',
// minute: '0-59',
// hour: '0-23',
// day: '1-31',
// month: '1-12',
// week: '0-6',
// year: '*'
// }
// }
// 根据选项生成 Cron 表达式的函数
function generateCronFromOptions(options) {
// ... 生成逻辑
// 返回生成的 Cron 表达式字符串
return `${options.second} ${options.minute} ${options.hour} ${options.day} ${options.month} ${options.week} ${options.year}`
}
</script>
<style scoped>
.cron-generator {
display: flex;
flex-direction: column;
gap: 1rem;
margin: 0; /* Remove default margin */
padding: 0; /* Remove default padding */
}
.cron-section {
display: flex;
align-items: center;
}
label {
margin-right: 1rem;
}
.cron-result {
margin-top: 2rem;
border: 1px solid #ccc;
padding: 1rem;
border-radius: 4px;
}
.cron-expression {
display: block;
font-family: monospace;
margin-top: 0.5rem;
}
</style>

View File

@@ -1,18 +0,0 @@
<template>
<a-modal :visible="visible" width="600">
<CrontabGenerator />
</a-modal>
</template>
<script setup lang="ts">
// const props = defineProps<CrontabType>()
const visible = ref<boolean>(true)
// interface CrontabType {
// visible: boolean
//
// }
</script>
<style scoped lang="scss">
</style>

View File

@@ -1,106 +0,0 @@
<template>
<a-form-item>
<a-radio v-model="radioValue" :label="1">
允许的通配符[, - * /]
</a-radio>
</a-form-item>
<a-form-item>
<a-radio v-model="radioValue" :label="2">
周期从
<a-input-number v-model="cycle01" :min="1" :max="11" /> -
<a-input-number v-model="cycle02" :min="cycle01 ? cycle01 + 1 : 2" :max="12" />
</a-radio>
</a-form-item>
<a-form-item>
<a-radio v-model="radioValue" :label="3">
<a-input-number v-model="average01" :min="1" :max="11" /> 月开始
<a-input-number v-model="average02" :min="1" :max="12 - average01 || 0" /> 月执行一次
</a-radio>
</a-form-item>
<a-form-item>
<a-radio v-model="radioValue" :label="4">
指定
<a-select v-model="checkboxList" clearable placeholder="可多选" multiple style="width:100%">
<a-option v-for="item in 12" :key="item" :value="item">{{ item }}</a-option>
</a-select>
</a-radio>
</a-form-item>
</template>
<script setup>
import { computed, ref, watch } from 'vue'
const props = defineProps({
check: {
type: Function,
required: true
},
modelValue: {
type: String,
required: true
}
})
const emit = defineEmits(['update:modelValue'])
const radioValue = ref(1)
const cycle01 = ref(1)
const cycle02 = ref(2)
const average01 = ref(1)
const average02 = ref(1)
const checkboxList = ref([])
const cycleTotal = computed(() => {
const cycle01Val = props.check(cycle01.value, 1, 11)
const cycle02Val = props.check(cycle02.value, cycle01Val ? cycle01Val + 1 : 2, 12)
return `${cycle01Val}-${cycle02Val}`
})
const averageTotal = computed(() => {
const average01Val = props.check(average01.value, 1, 11)
const average02Val = props.check(average02.value, 1, 12 - average01Val || 0)
return `${average01Val}/${average02Val}`
})
const checkboxString = computed(() => {
const str = checkboxList.value.join()
return str === '' ? '*' : str
})
const emitUpdate = (value) => {
emit('update:modelValue', value)
}
watch(radioValue, () => {
switch (radioValue.value) {
case 1:
emitUpdate('*')
break
case 2:
emitUpdate(cycleTotal.value)
break
case 3:
emitUpdate(averageTotal.value)
break
case 4:
emitUpdate(checkboxString.value)
break
}
})
watch(cycleTotal, () => {
emitUpdate(cycleTotal.value)
})
watch(averageTotal, () => {
emitUpdate(averageTotal.value)
})
watch(checkboxString, () => {
emitUpdate(checkboxString.value)
})
</script>

View File

@@ -1,121 +0,0 @@
<template>
<a-form-item>
<a-radio v-model="radioValue" :label="1">
?
</a-radio>
</a-form-item>
<a-form-item>
<a-radio v-model="radioValue" :label="2">
指定
<a-select v-model="checkboxList" clearable placeholder="可多选" multiple style="width:100%">
<a-option v-for="item in 7" :key="item" :value="item - 1">{{ item === 0 ? '' : item }}</a-option>
</a-select>
</a-radio>
</a-form-item>
<a-form-item>
<a-radio v-model="radioValue" :label="3">
周期从
<a-select v-model="cycle01" clearable placeholder="起始星期" style="width:100%">
<a-option v-for="item in 7" :key="item" :value="item - 1">{{ item === 0 ? '' : item }}</a-option>
</a-select>
-
<a-select v-model="cycle02" clearable placeholder="结束星期" style="width:100%">
<a-option v-for="item in 7" :key="item" :value="item - 1">{{ item === 0 ? '' : item }}</a-option>
</a-select>
</a-radio>
</a-form-item>
<a-form-item>
<a-radio v-model="radioValue" :label="4">
每月
<a-select v-model="weekDay" clearable placeholder="星期" style="width:100%">
<a-option v-for="item in 7" :key="item" :value="item - 1">{{ item === 0 ? '' : item }}</a-option>
</a-select>
的第
<a-input-number v-model="weekNum" :min="1" :max="5" />
个工作日
</a-radio>
</a-form-item>
</template>
<script setup>
import { computed, ref, watch } from 'vue'
const props = defineProps({
check: {
type: Function,
required: true
},
modelValue: {
type: String,
required: true
},
cron: {
type: Object,
required: true
}
})
const emit = defineEmits(['update:modelValue'])
const radioValue = ref(1)
const checkboxList = ref([])
const cycle01 = ref(0)
const cycle02 = ref(0)
const weekDay = ref(0)
const weekNum = ref(1)
const checkboxString = computed(() => {
const str = checkboxList.value.join()
return str === '' ? '?' : str
})
const cycleTotal = computed(() => {
const cycle01Val = props.check(cycle01.value, 0, 6)
const cycle02Val = props.check(cycle02.value, cycle01Val ? cycle01Val + 1 : 1, 6)
return `${cycle01Val}-${cycle02Val}`
})
const weekDayCheck = computed(() => {
const weekDayVal = props.check(weekDay.value, 0, 6)
return weekDayVal
})
const emitUpdate = (value) => {
emit('update:modelValue', value)
}
watch(radioValue, () => {
if (radioValue.value !== 1 && props.cron.day !== '?') {
props.cron.day = '?'
}
switch (radioValue.value) {
case 1:
emitUpdate('?')
break
case 2:
emitUpdate(checkboxString.value)
break
case 3:
emitUpdate(cycleTotal.value)
break
case 4:
emitUpdate(`${weekDayCheck.value}#${weekNum.value}`)
break
}
})
watch(checkboxString, () => {
emitUpdate(checkboxString.value)
})
watch(cycleTotal, () => {
emitUpdate(cycleTotal.value)
})
watch(weekDayCheck, () => {
emitUpdate(`${weekDayCheck.value}#${weekNum.value}`)
})
</script>

View File

@@ -1,106 +0,0 @@
<template>
<a-form-item>
<a-radio v-model="radioValue" :label="1">
*
</a-radio>
</a-form-item>
<a-form-item>
<a-radio v-model="radioValue" :label="2">
周期从
<a-input-number v-model="cycle01" :min="1970" :max="2099" /> -
<a-input-number v-model="cycle02" :min="cycle01 ? cycle01 + 1 : 1971" :max="2099" />
</a-radio>
</a-form-item>
<a-form-item>
<a-radio v-model="radioValue" :label="3">
<a-input-number v-model="average01" :min="1970" :max="2098" /> 年开始
<a-input-number v-model="average02" :min="1" :max="2099 - average01 || 0" /> 年执行一次
</a-radio>
</a-form-item>
<a-form-item>
<a-radio v-model="radioValue" :label="4">
指定
<a-select v-model="checkboxList" clearable placeholder="可多选" multiple style="width:100%">
<a-option v-for="item in 130" :key="item" :value="item + 1970">{{ item + 1970 }}</a-option>
</a-select>
</a-radio>
</a-form-item>
</template>
<script setup>
import { computed, ref, watch } from 'vue'
const props = defineProps({
check: {
type: Function,
required: true
},
modelValue: {
type: String,
required: true
}
})
const emit = defineEmits(['update:modelValue'])
const radioValue = ref(1)
const cycle01 = ref(1970)
const cycle02 = ref(1971)
const average01 = ref(1970)
const average02 = ref(1)
const checkboxList = ref([])
const cycleTotal = computed(() => {
const cycle01Val = props.check(cycle01.value, 1970, 2099)
const cycle02Val = props.check(cycle02.value, cycle01Val ? cycle01Val + 1 : 1971, 2099)
return `${cycle01Val}-${cycle02Val}`
})
const averageTotal = computed(() => {
const average01Val = props.check(average01.value, 1970, 2098)
const average02Val = props.check(average02.value, 1, 2099 - average01Val || 0)
return `${average01Val}/${average02Val}`
})
const checkboxString = computed(() => {
const str = checkboxList.value.join()
return str === '' ? '*' : str
})
const emitUpdate = (value) => {
emit('update:modelValue', value)
}
watch(radioValue, () => {
switch (radioValue.value) {
case 1:
emitUpdate('*')
break
case 2:
emitUpdate(cycleTotal.value)
break
case 3:
emitUpdate(averageTotal.value)
break
case 4:
emitUpdate(checkboxString.value)
break
}
})
watch(cycleTotal, () => {
emitUpdate(cycleTotal.value)
})
watch(averageTotal, () => {
emitUpdate(averageTotal.value)
})
watch(checkboxString, () => {
emitUpdate(checkboxString.value)
})
</script>

View File

@@ -6,6 +6,7 @@
:shortcuts="shortcuts"
shortcuts-position="left"
style="height: 32px"
:allow-clear="allowClear"
/>
</template>
@@ -27,6 +28,10 @@ defineProps({
placeholder: {
type: Array as PropType<string[]>,
default: (): string[] => ['开始时间', '结束时间']
},
allowClear: {
type: Boolean,
default: true
}
})

View File

@@ -28,7 +28,7 @@
style="width: 150px"
@change="search"
/>
<DateRangePicker v-model="queryForm.datetimeRange" @change="search" />
<DateRangePicker v-model="queryForm.datetimeRange" :allow-clear="false" @change="search" />
<a-button @click="reset">重置</a-button>
</template>
<template #taskBatchStatus="{ record }">
@@ -125,7 +125,10 @@ const getGroupList = async () => {
// 重置
const reset = () => {
queryForm.taskBatchStatus = undefined
queryForm.datetimeRange = undefined
queryForm.datetimeRange = [
dayjs().subtract(6, 'day').startOf('day').format('YYYY-MM-DD HH:mm:ss'),
dayjs().endOf('day').format('YYYY-MM-DD HH:mm:ss')
]
search()
}