element-plus中el-time-picker区间选择时间升序排序且不能有时间重叠

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
}

  

posted @ 2025-03-20 09:54  夏目友人喵  阅读(16)  评论(0)    收藏  举报