import { CreatePlan } from '/@/api/wayline'
|
import { FrequencyType, RepeatRuleType, TaskType } from '/@/types/task'
|
import { dateFormat } from '/@/utils/time'
|
import moment from 'moment'
|
|
/**
|
* 根据规则获取起飞时间节点(时间戳)
|
* @param creatPlan
|
*/
|
export function getFlyTimeList (creatPlan: CreatePlan) {
|
const startDate = moment.unix(creatPlan.task_days[0]).toDate()
|
const endDate = moment.unix(creatPlan.task_days[1]).toDate()
|
|
let finalDateTimeArr = [] as any
|
if (creatPlan.task_type === TaskType.Repeat) {
|
// 重复定时
|
|
switch (creatPlan.rep_fre_type) {
|
// 月
|
|
case FrequencyType.month: {
|
// 先计算这几个月分别是哪个月
|
const monthList = getYearMonth(startDate, endDate, creatPlan.rep_fre_val)
|
|
if (creatPlan.rep_rule_type === RepeatRuleType.day) {
|
// 按日期
|
// 拼接日期
|
const dateList = [] as any
|
|
monthList.forEach(date => {
|
creatPlan.rep_rule_val?.forEach(day => {
|
if (day < 10) {
|
day = '0' + day
|
}
|
|
creatPlan.task_periods?.forEach(timearr => {
|
const timeStr = moment.unix(timearr[0]).format('HH:mm')
|
const str = date + '-' + day + ' ' + timeStr
|
const tempDate = new Date(str)
|
dateList.push(tempDate)
|
})
|
})
|
})
|
|
// 过滤掉不在选择日期内的日期
|
finalDateTimeArr = dateList.filter(date => {
|
// 如果该日期的时间大于结束时间,则过滤掉
|
if (date.getTime() > endDate.getTime()) {
|
return false
|
}
|
|
const tempDate = date.getDate()
|
let j = 0
|
for (let i = 0; i < creatPlan.rep_rule_val?.length; i++) {
|
if (tempDate === creatPlan.rep_rule_val[i]) {
|
return true
|
} else {
|
j++
|
// 全都不符合
|
if (j === creatPlan.rep_rule_val?.length) {
|
return false
|
}
|
}
|
}
|
|
return false
|
})
|
|
// 去重
|
finalDateTimeArr = Array.from(new Set(finalDateTimeArr.map(date => dateFormat(date, 'yyyy-MM-dd hh:mm'))))
|
} else if (creatPlan.rep_rule_type === RepeatRuleType.week) {
|
// 按星期
|
monthList.forEach(yearMonth => {
|
const tmpDate = new Date(yearMonth)
|
const date = getMonthWeek(tmpDate.getFullYear(), tmpDate.getMonth(), creatPlan.rep_rule_val[0], creatPlan.rep_rule_val[1])
|
creatPlan.task_periods?.forEach(timearr => {
|
const timeStr = moment.unix(timearr[0]).format('HH:mm')
|
const dateStr = date + ' ' + timeStr
|
finalDateTimeArr.push(dateStr)
|
})
|
})
|
}
|
|
break
|
}
|
// 周
|
case FrequencyType.week: {
|
// 获取每n周的日期
|
const weekDate = gainAllDateBetRange(startDate, endDate, creatPlan.rep_fre_val * 7)
|
|
// 获取星期
|
const dateList = getDateListOfWeek(weekDate, creatPlan.rep_rule_val)
|
|
// 拼接时间
|
dateList.forEach(date => {
|
creatPlan.task_periods?.forEach(timearr => {
|
const timeStr = moment.unix(timearr[0]).format('HH:mm')
|
finalDateTimeArr.push(date + ' ' + timeStr)
|
})
|
})
|
break
|
}
|
// 日
|
case FrequencyType.day: {
|
// 根据每几天获取时间
|
const dateList = gainAllDateBetRange(startDate, endDate, creatPlan.rep_fre_val)
|
// 拼接执行时间即可
|
dateList.forEach(date => {
|
creatPlan.task_periods?.forEach(timearr => {
|
const timeStr = moment.unix(timearr[0]).format('HH:mm')
|
finalDateTimeArr.push(date + ' ' + timeStr)
|
})
|
})
|
break
|
}
|
}
|
} else if (creatPlan.task_type === TaskType.Continuous) {
|
// 连续执行
|
switch (creatPlan.rep_fre_type) {
|
// 月
|
case FrequencyType.month: {
|
// 先计算这几个月分别是哪个月
|
const monthList = getYearMonth(startDate, endDate, creatPlan.rep_fre_val)
|
|
if (creatPlan.rep_rule_type === RepeatRuleType.day) {
|
// 按日期
|
// 拼接日期
|
const dateList = [] as any
|
|
monthList.forEach(date => {
|
creatPlan.rep_rule_val?.forEach(day => {
|
if (day < 10) {
|
day = '0' + day
|
}
|
|
creatPlan.task_periods?.forEach(timearr => {
|
timearr.forEach(time => {
|
const timeStr = moment.unix(time).format('HH:mm')
|
const str = date + '-' + day + ' ' + timeStr
|
const tempDate = new Date(str)
|
dateList.push(tempDate)
|
})
|
})
|
})
|
})
|
|
// 过滤掉不在选择日期内的日期
|
finalDateTimeArr = dateList.filter(date => {
|
// 如果该日期的时间大于结束时间,则过滤掉
|
if (date.getTime() > endDate.getTime()) {
|
return false
|
}
|
|
const tempDate = date.getDate()
|
let j = 0
|
for (let i = 0; i < creatPlan.rep_rule_val?.length; i++) {
|
if (tempDate === creatPlan.rep_rule_val[i]) {
|
return true
|
} else {
|
j++
|
// 全都不符合
|
if (j === creatPlan.rep_rule_val?.length) {
|
return false
|
}
|
}
|
}
|
|
return false
|
})
|
|
// 去重
|
finalDateTimeArr = Array.from(new Set(finalDateTimeArr.map(date => dateFormat(date, 'yyyy-MM-dd hh:mm'))))
|
} else if (creatPlan.rep_rule_type === RepeatRuleType.week) {
|
// 按星期
|
monthList.forEach(yearMonth => {
|
const tmpDate = new Date(yearMonth)
|
const date = getMonthWeek(tmpDate.getFullYear(), tmpDate.getMonth(), creatPlan.rep_rule_val[0], creatPlan.rep_rule_val[1])
|
creatPlan.task_periods?.forEach(timearr => {
|
timearr.forEach(time => {
|
const timeStr = moment.unix(time).format('HH:mm')
|
const dateStr = date + ' ' + timeStr
|
finalDateTimeArr.push(dateStr)
|
})
|
})
|
})
|
}
|
|
break
|
}
|
// 周
|
case FrequencyType.week: {
|
// 获取每n周的日期
|
const weekDate = gainAllDateBetRange(startDate, endDate, creatPlan.rep_fre_val * 7)
|
|
// 获取星期
|
const dateList = getDateListOfWeek(weekDate, creatPlan.rep_rule_val)
|
|
// 拼接时间
|
dateList.forEach(date => {
|
creatPlan.task_periods?.forEach(timearr => {
|
timearr.forEach(time => {
|
const timeStr = moment.unix(time).format('HH:mm')
|
finalDateTimeArr.push(date + ' ' + timeStr)
|
})
|
})
|
})
|
break
|
}
|
// 日
|
case FrequencyType.day: {
|
// 根据每几天获取时间
|
const dateList = gainAllDateBetRange(startDate, endDate, creatPlan.rep_fre_val)
|
// 拼接执行时间即可
|
dateList.forEach(date => {
|
creatPlan.task_periods?.forEach(timearr => {
|
timearr.forEach(time => {
|
const timeStr = moment.unix(time).format('HH:mm')
|
|
finalDateTimeArr.push(date + ' ' + timeStr)
|
})
|
})
|
})
|
break
|
}
|
}
|
}
|
|
console.log('最终时间:', finalDateTimeArr)
|
let tempDateTimeArr = []
|
if (creatPlan.task_type === TaskType.Repeat) {
|
tempDateTimeArr = finalDateTimeArr.map(dateTime => [dateTime])
|
} else if (creatPlan.task_type === TaskType.Continuous) {
|
for (let i = 0; i < finalDateTimeArr.length; i = i + 2) {
|
tempDateTimeArr.push([finalDateTimeArr[i], finalDateTimeArr[i + 1]])
|
}
|
}
|
|
// 对tempDateTimeArr进行时间过滤,筛选掉过去时间和无效时间
|
const futureDateTimeArr = tempDateTimeArr.filter(dateArr => {
|
return new Date(dateArr[0]).getTime() >= new Date().getTime()
|
})
|
|
console.log('未来时间:', futureDateTimeArr)
|
|
const futureDateTimeUnixArr = [] as any
|
futureDateTimeArr.forEach(dateArr => {
|
const list = [] as any
|
|
dateArr.forEach(dateTimeStr => {
|
const timestamp = moment(dateTimeStr).unix()
|
list.push(timestamp)
|
})
|
futureDateTimeUnixArr.push(list)
|
})
|
console.log('未来时间unix:', futureDateTimeUnixArr)
|
return futureDateTimeUnixArr
|
}
|
|
// 获取一个日期范围内的每n天的日期,入参为Date对象
|
function gainAllDateBetRange (startDate: Date, endDate: Date, n = 1) {
|
const dateArr = [] as any
|
if (!(startDate instanceof Date && endDate instanceof Date)) return dateArr // 非时间格式返回空数组
|
const startTime = startDate.getTime() // 获取开始日期的毫秒数
|
const endTime = endDate.getTime() // 获取结束日期的毫秒数
|
const numTime = 24 * 60 * 60 * 1000 * n // 一天的毫秒数
|
for (let time = startTime; time <= endTime;) {
|
dateArr.push(dateFormat(new Date(time), 'yyyy-MM-dd')) // 将格式化后的时间存入结果数组
|
time += numTime // 每次加n天
|
}
|
return dateArr
|
}
|
|
/**
|
* 获取当前日期的星期数的日期
|
* @param date
|
*/
|
function getDateListOfWeek (dateArr: any[], week: number[]) {
|
const list = [] as any
|
dateArr.forEach(dateStr => {
|
const date = new Date(dateStr)
|
week.forEach(n => {
|
const tempDate = weekDate(date, n)
|
list.push(tempDate)
|
})
|
})
|
return list
|
}
|
|
/**
|
* 根据日期获取星期日期
|
* @param date
|
* @param n
|
*/
|
function weekDate (date: Date, n: number) {
|
date.setDate(date.getDate() + n - (date.getDay() || 7))
|
const dateStr = dateFormat(new Date(date), 'yyyy-MM-dd')
|
return dateStr
|
}
|
|
function getYearMonth (startDate: Date, endDate: Date, n: number) {
|
const dateArr = [] as any
|
|
const startTime = startDate.getTime()
|
const endTime = endDate.getTime()
|
let date = startDate
|
|
for (let dateTime = startTime; dateTime <= endTime;) {
|
const str = dateFormat(date, 'yyyy-MM')
|
dateArr.push(str)
|
date = new Date(date.getFullYear(), date.getMonth() + Number(n))
|
dateTime = date.getTime()
|
}
|
|
return dateArr
|
}
|
|
/**
|
* 获取某年月的第几周的周几的日期
|
* @param year
|
* @param month
|
*/
|
function getMonthWeek (year:number, month:number, whichWeek:number, whichDay:number) {
|
// 获取该月的第一天
|
const firstDayOfMonth = new Date(year, month, 1)
|
const daysOffset = whichDay - firstDayOfMonth.getDay() // 计算第一周的差几天
|
|
const day = firstDayOfMonth.getDate() + daysOffset + 7 * (whichWeek - 1) // 第二周的星期一的日期
|
return dateFormat(new Date(year, month, day), 'yyyy-MM-dd')
|
}
|