let compareWorkday = [],
compareWeekendDay = []
// 选择时间时触发
const handleTime = async () => {
compareWorkday = []
compareWeekendDay = []
if (timeList()) {
await Fn()
}
}
// 对选择的时间进行统一格式化(encode)
const timestampToTime = timestamp => {
const date = new Date(timestamp)
const h = date.getHours() + ':'
const m = date.getMinutes() + ':'
const s = date.getSeconds()
return timeToStamp('1991-02-12' + ' ' + h + m + s)
}
// 统一格式化后再转为毫秒(decode)
const timeToStamp = res => {
const date = new Date(res)
return date.getTime()
}
// 对时间数组进行格式化
const timeList = () => {
const workdayList = cloneDeep(zoneInfo.workdayList)
const weekendDayList = cloneDeep(zoneInfo.weekendDayList)
workdayList.forEach(item => {
if (item.workday?.length > 0) {
const start = new Date(item.workday[0] || null).getTime()
const end = new Date(item.workday[1]).getTime()
item.workday[0] = (item.workday[0] + '').slice(16, 25)
item.workday[1] = (item.workday[1] + '').slice(16, 25)
// compareWorkday.push({ s: start, e: end })
compareWorkday.push({ s: timestampToTime(start), e: timestampToTime(end) })
}
})
if (zoneInfo.ruleForm.timeType === 2) {
weekendDayList.forEach(item => {
if (item.weekendDay?.length > 0) {
const start = new Date(item.weekendDay[0]).getTime()
const end = new Date(item.weekendDay[1]).getTime()
item.weekendDay[0] = (item.weekendDay[0] + '').slice(16, 25)
item.weekendDay[1] = (item.weekendDay[1] + '').slice(16, 25)
compareWeekendDay.push({ s: start, e: end })
}
})
}
if (!isAscending(compareWorkday) && compareWorkday.length > 1) {
ElMessage({
type: 'error',
message: '请按照升序选择时间区间!或者检查时间区间不能重复!',
})
return false
}
if (!isAscending(compareWeekendDay) && compareWeekendDay.length > 1) {
ElMessage({
type: 'error',
message: '请按照升序选择周末时间区间!或者检查时间区间不能重复!',
})
return false
}
return true
}
// 判断多个时间是否是升序选择时间
const isAscending = arr => {
for (let i = 0; i < arr.length - 1; i++) {
if (arr[i].e >= arr[i + 1].s) {
return false
}
}
return true
}
// 比较时间段是否重叠
const Fn = () => {
for (const k in compareWorkday) {
if (!judge(k)) {
ElMessage({
type: 'error',
message: '时间区间有重叠,请重新选择时间区间!',
})
zoneInfo.timeRepeat = false
return false
}
}
for (const k in compareWeekendDay) {
if (!judge(k)) {
ElMessage({
type: 'error',
message: '周末时间区间有重叠,请重新选择时间区间!',
})
zoneInfo.timeRepeat = false
return false
}
}
zoneInfo.timeRepeat = true
return true
}
// 具体时间比较
const judge = idx => {
for (const k in compareWorkday) {
if (idx !== k) {
if (compareWorkday[k].s <= compareWorkday[idx].s && compareWorkday[k].e > compareWorkday[idx].s) {
return false
}
if (compareWorkday[k].s < compareWorkday[idx].e && compareWorkday[k].e >= compareWorkday[idx].e) {
return false
}
}
}
for (const k in compareWeekendDay) {
if (idx !== k) {
if (compareWeekendDay[k].s <= compareWeekendDay[idx].s && compareWeekendDay[k].e > compareWeekendDay[idx].s) {
return false
}
if (compareWeekendDay[k].s < compareWeekendDay[idx].e && compareWeekendDay[k].e >= compareWeekendDay[idx].e) {
return false
}
}
}
return true
}