| New file |
| | |
| | | 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) { |
| | | console.log('表单', creatPlan) |
| | | |
| | | const startDate = moment.unix(creatPlan.task_days[0]).toDate() |
| | | const endDate = moment.unix(creatPlan.task_days[1]).toDate() |
| | | console.log('开始时间:', startDate, '结束时间:', endDate) |
| | | |
| | | 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) |
| | | console.log('月:', monthList) |
| | | |
| | | 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) |
| | | }) |
| | | }) |
| | | }) |
| | | |
| | | console.log('日期时间:', dateList) |
| | | // 过滤掉不在选择日期内的日期 |
| | | 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) |
| | | |
| | | console.log('星期时间:', weekDate) |
| | | // 获取星期 |
| | | 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) |
| | | console.log('月:', monthList) |
| | | |
| | | 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) |
| | | }) |
| | | }) |
| | | }) |
| | | }) |
| | | |
| | | console.log('日期时间:', dateList) |
| | | // 过滤掉不在选择日期内的日期 |
| | | 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) |
| | | |
| | | console.log('星期时间:', weekDate) |
| | | // 获取星期 |
| | | 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 => { |
| | | console.log(timearr,"***************************") |
| | | timearr.forEach(time=>{ |
| | | console.log("time:",time) |
| | | const timeStr = moment.unix(time).format('HH:mm') |
| | | console.log("timeStr:",timeStr) |
| | | |
| | | finalDateTimeArr.push(date + ' ' + timeStr) |
| | | }) |
| | | |
| | | }) |
| | | }) |
| | | break |
| | | } |
| | | } |
| | | } |
| | | |
| | | console.log('最终时间:', finalDateTimeArr) |
| | | var tempDateTimeArr = [] |
| | | if (creatPlan.task_type === TaskType.Repeat) { |
| | | tempDateTimeArr = finalDateTimeArr.map(dateTime=>[dateTime]) |
| | | |
| | | }else if (creatPlan.task_type === TaskType.Continuous){ |
| | | |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | // 对finalDateTimeArr进行时间过滤,筛选掉过去时间和无效时间 |
| | | const futureDateTimeArr = finalDateTimeArr.filter(dateStr => { |
| | | return new Date(dateStr).getTime() >= new Date().getTime() |
| | | }) |
| | | console.log('未来时间:', futureDateTimeArr) |
| | | |
| | | return futureDateTimeArr |
| | | } |
| | | |
| | | // 获取一个日期范围内的每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天 |
| | | } |
| | | console.log('每', n, '天的日期', dateArr) |
| | | return dateArr |
| | | } |
| | | |
| | | /** |
| | | * 获取当前日期的星期数的日期 |
| | | * @param date |
| | | */ |
| | | function getDateListOfWeek (dateArr: any[], week: number[]) { |
| | | console.log('获取当前日期的星期数的日期:', dateArr, week) |
| | | 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() |
| | | console.log('开始时间结束时间时间戳', startTime, endTime) |
| | | 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') |
| | | } |