// components/xx-calendar/xx-calendar.js import calendarFormatter from "./xx_calendar"; import commonApi from "../../../utils/https/common" Component({ /** * 组件的属性列表 */ properties: { use_date_arr:{ type:Array, value:[] } }, /** * 组件的初始数据 */ data: { // 本月指的是选择的当前月份 year: new Date().getFullYear(), month: new Date().getMonth() + 1, weeksArr: ['日', '一', '二', '三', '四', '五', '六'], nowMonth: new Date().getMonth() + 1, //本月是几月 nowDay: new Date().getDate(), //本月当天的日期 lastMonthDays: [], //上一个月 nowMonthDays: [], //本月 nextMonthDays: [], //下一个月 weekDay:[], //周 日期list activeDateStr:'', // 当前日期, currentViewType: 'week', //当前选中的是周还是月 holidayList:[], //节假日 holidayList2:['2024/01/01','2024/02/10','2024/04/04', '2024/05/01', '2024/06/10','2024/09/17','2024/10/01'], // 节假日() // lisClickNext: true, // 是否可以点下一周 }, /** * 组件的方法列表 */ methods: { //获取当月天数 getThisMonthDays(year, month) { return new Date(year, month, 0).getDate(); }, /** 总方法 */ //创建日期 createDays(year, month) { if( this.data.currentViewType === "month" ) { this.getLastMonthDays(year, month) this.getNowMonthDays(year, month) this.getNextMonthDays(year, month) } else { this.getWeekData() } }, /** 视图收起/展开 */ toggleMode() { const { year, month} = this.data if ((this.data.currentViewType === 'week' && this.data.weekDay.some(s => s.year === (year+1))) || (this.data.currentViewType === 'week' && this.data.weekDay.some(s => s.year === (year-1)))) { return } this.setData({ currentViewType: this.data.currentViewType === "month" ? "week" : "month", }) const activeDateStr = this.data.activeDateStr const arr = activeDateStr.split("/") if( this.data.currentViewType === "month" ) { this.getLastMonthDays(year, month) this.getNowMonthDays(year, month) this.getNextMonthDays(year, month) } else { this.getWeekData() } this.setData({ headerDate: `${arr[0]} 年 ${arr[1]} 月` }) this.triggerEvent('modeChange', { viewType: this.data.currentViewType, }); }, /** 获取上个月日期 */ getLastMonthDays(year, month) { let nowMonthFirstDays = new Date(year, month - 1, 1).getDay() let lastMonthDays = [] if (nowMonthFirstDays) { //判断当月的第一天是不是星期天 //上个月显示多少天 let lastMonthNums = month - 1 < 0 ? this.getThisMonthDays(year - 1, 12) : this.getThisMonthDays(year, month - 1); //判断是否会跨年 //上个月从几号开始显示 for (let i = lastMonthNums - nowMonthFirstDays + 1; i <= lastMonthNums; i++) { let time = new Date(year, month - 2, i).toLocaleDateString() //对应的时间 let timer = time.replace(/\//g, "-") lastMonthDays.push({ date: i, //几号 week: this.data.weeksArr[new Date(year, month - 2, i).getDay()], //星期几 time:time, isNowMonthDay: '' }); } } this.setData({ lastMonthDays }) console.log(lastMonthDays); }, /** 获取当月日期 */ getNowMonthDays(year, month) { let { nowMonth, nowDay } = this.data let nowMonthDays = [] let days = this.getThisMonthDays(year, month); //获取当月的天数 for (let i = 1; i <= days; i++) { let d = new Date(year, month - 1, i) let years = d.getFullYear() let months = d.getMonth() + 1 let day2 = d.getDate() let time = `${years+'/'+months +'/'+day2}` // 2022/3/3 let timer = time.replace(/\//g, "-") let timer2 = timer.split('-') var day = calendarFormatter.solar2lunar(timer2[0], timer2[1], timer2[2]); let newdate if (day.IDayCn == '初一') { newdate = day.IMonthCn } else { newdate = day.IDayCn } // 当前月数据 let festival = calendarFormatter.getFestival(timer) // 返回当前节假日名称, 不是节日返回 '工作日' let realDate = new Date()                  let realMonth = realDate.getMonth() + 1 let _time = `${years}/${+months < 10 ? '0'+months : months}/${+day2 < 10 ? '0'+day2 :day2}` console.log(this.data.holidayList2.includes(_time)) nowMonthDays.push({ date: i, //几号 week: this.data.weeksArr[new Date(year, month - 1, i).getDay()], //星期几 time, _time, color: false, day: newdate, // day: ['工作日', '周末'].includes(festival) || festival.indexOf('补') > -1 || [如果有不想展示的日期,放这里].includes(timer) ? newdate : festival, isNowMonthDay: (month == realMonth && i == nowDay) ? "isNowMonthDay" : "", isHoliday: this.data.holidayList.find(s => s.date == _time ), // 判断是否是休息日 是的话返回true, 不是的话返回false holidayList2: this.data.holidayList2.includes(_time) }); } this.data.use_date_arr.forEach(ele => { ele = ele.replace(/\-/g, "/") nowMonthDays.forEach(item => { if (ele == item.time) { console.log(item); item.color = true } }) }) this.setData({ nowMonthDays }) }, /** 获取下个月日期 */ getNextMonthDays(year, month) { let { lastMonthDays, nowMonthDays, } = this.data let nextMonthDays = [] let nextMonthNums = (lastMonthDays.length + nowMonthDays.length) > 35 ? 42 - (lastMonthDays.length + nowMonthDays.length) : 35 - (lastMonthDays.length + nowMonthDays.length) //下个月显示多少天 let nowYear = (parseInt(month) + 1) > 12 ? year + 1 : year //下一个月的年份 let nowMonth = (parseInt(month) + 1) > 12 ? 1 : parseInt(month) + 1 //下一个月的月份 if (nextMonthNums) { //判断当前天数是否大于零 for (let i = 1; i <= nextMonthNums; i++) { let time = new Date(year, month - 1, i).toLocaleDateString() nextMonthDays.push({ date: i, //几号 week: this.data.weeksArr[new Date(nowYear, nowMonth - 1, i).getDay()], //星期几 time, isNowMonthDay: '' }); } } this.setData({ nextMonthDays }) console.log(nextMonthDays) }, /** 切换月份 */ changeMonthFun(e){ if (this.data.currentViewType === "month") { let { year, month, nowDay } = this.data let type = e.currentTarget.dataset.type //类型 if (type == 'prev') { //上一个月 year = month - 1 > 0 ? year : year - 1 month = month - 1 > 0 ? month - 1 : 12 } else { //next 下个月 year = (parseInt(month) + 1) > 12 ? year + 1 : year month = (parseInt(month) + 1) > 12 ? 1 : parseInt(month) + 1 } if (year != this.data.year) { return } this.setData({ year, month, nowMonth: month, activeDateStr: `${year}/${month}/${nowDay}` }) this.createDays(year, month) } else { let { year, month, nowDay } = this.data let type = e.currentTarget.dataset.type //类型 if ((type == 'next' && this.data.weekDay[0].year === (year+1)) || (type == 'prev' && this.data.weekDay[0].year === (year-1))) { return } // if (type == 'next' && this.data.weekDay[0].year === 2025) { // // debugger // return // } // let newActiveDateStr = this.getActiveDateStrByWeek(this.data.activeDateStr, type) let newActiveDateStr = this.getActiveDateStrByWeek(this.data.weekDay[6].dateStr, type) // debugger this.getWeekData(newActiveDateStr) console.log(this.data.weekDay); // this.data.lisClickNext = this.data.weekDay.every(s => s.year == 2024) } }, // 获取节假日 getHoliday(){ commonApi._post("pbservice/Actcalendar/getHoliday",{year:this.data.year}).then(res => { // console.log(res); this.setData({ holidayList: res.data })  this.data.holidayList = this.data.holidayList.map(item=> { if (item.name == '清明节') { return {   ...item, color:'#009EA3',   background:'#DAF0EE' } }else if (item.name == '劳动节') { return {   ...item, color:'#DE4126',   background:'#FFECDB' } }else if (item.name == '春节') { return {   ...item, color:'#D10000',   background:'#FAE3E3' } }else if (item.name == '元旦') { return {   ...item, color:'#EB3300',   background:'#FFDED9' } }else if (item.name == '端午节') { return {   ...item, color:'#0B8E3F',   background:'#CEEDDB' } }else if (item.name == '国庆节') { return {   ...item, color:'#D41E1E',   background:'#FFE8E8' } }else if (item.name == '中秋节') { return {   ...item, color:'#FF8E24',   background:'#FFF3DB' } } else { return {   ...item, color:'#fff',   background:'#fff' } } }) console.log('------------------------------',this.data.holidayList); let { year, month, nowDay } = this.data this.setData({ activeDateStr: `${year}/${month}/${nowDay}` }) this.createDays(year, month, nowDay) }) }, /** 获取周视图数据 */ getWeekData(defaultDate) { /** 是否是从周一开始 */ const isStartFromMonday = this.properties.startDay === "monday" if (!defaultDate) { defaultDate = this.data.activeDateStr } const YEAR = new Date(defaultDate).getFullYear() const MONTH = new Date(defaultDate).getMonth() + 1 const DATE = new Date(defaultDate).getDate() const WEEK = isStartFromMonday ? new Date(defaultDate).getDay() || 7 : new Date(defaultDate).getDay() /** 上月最后一天 */ let lastDayOfLastMonth = new Date(YEAR, MONTH - 1, 0) /** 上月最后一天是周几 */ let lastDateOfLastMonth = lastDayOfLastMonth.getDate() /** 当月最后一天 */ let lastDay = new Date(YEAR, MONTH, 0) /** 当月最后一天是几号 */ let lastDate = lastDay.getDate() // debugger var ret = [] /** 前面有几天 */ let preCount = isStartFromMonday ? WEEK - 1 : WEEK for (let i = 0; i < 7; i++) { /** 用于计算的日期,可能为负数,可能大于当月最后一天 */ let date = i + (DATE - preCount) /** 真实的日期 */ let showDate = date /** 真实的月 */ let showMonth = MONTH /** 真实的年 */ let showYear = YEAR if (date <= 0) { // 上个月 showMonth = MONTH - 1 showDate = lastDateOfLastMonth + date } else if (date > lastDate) { // 下个月 showMonth = MONTH + 1 showDate = showDate - lastDate } if (showMonth === 0) { showMonth = 12 showYear = YEAR - 1 } if (showMonth === 13) { showMonth = 1 showYear = YEAR + 1 } var day = calendarFormatter.solar2lunar(showYear,showMonth, showDate); let newdate if (day.IDayCn == '初一') { newdate = day.IMonthCn } else { newdate = day.IDayCn } let { month, nowDay } = this.data  let realMonth =new Date().getMonth() + 1 // 当前周数据 let festival = calendarFormatter.getFestival(`${showYear}-${showMonth}-${showDate}`) // 返回当前节假日名称, 不是节日返回 '工作日' // debugger ret.push({ year: showYear, month: showMonth, date: showDate, calDate: date, day: newdate, dateStr: `${showYear}/${showMonth}/${showDate}`, isNowMonthDay: ( realMonth  == showMonth && nowDay == showDate) ? "isNowMonthDay" : "", isHoliday: this.data.holidayList.find(s => s.date === `${showYear}/${+showMonth < 10 ? '0'+showMonth : showMonth}/${+showDate < 10 ? '0'+showDate :showDate}` ), holidayList2: this.data.holidayList2.includes(`${showYear}/${+showMonth < 10 ? '0'+showMonth : showMonth}/${+showDate < 10 ? '0'+showDate :showDate}` ) // `${showYear}/${showMonth}/${showDate}` // isHoliday: calendarFormatter.isHoliday(`${showYear}-${showMonth}-${showDate}`), // 判断是否是休息日 是的话返回true, 不是的话返回false }) } console.log(ret); // debugger this.setData({ weekDay: ret, year: YEAR, month: MONTH, }) }, /** * 周视图下,左右切换时,获取新的高亮日期 * @param {string} curActiveDateStr 当前高亮的日期 * @param {string} type "prev" or "next" */ getActiveDateStrByWeek(curActiveDateStr, type) { const arr = curActiveDateStr.split("/") const year = +arr[0] const month = +arr[1] const date = +arr[2] let newYear = year, newMonth = month, newDate = date; /** 上月最后一天 */ const lastMonthLastDate = new Date(year, month - 1, 0).getDate() /** 本月最后一天 */ const curMonthLastDate = new Date(year, month, 0).getDate() if (type === "prev") { // 如果减7小于0, 说明跳月了 if (date - 7 <= 0) { newYear = month === 1 ? year - 1 : year newMonth = month === 1 ? 12 : month - 1 newDate = lastMonthLastDate + date - 7 } else { newDate = date - 7 } } else if (type == "next") { // 如果加7大于本月最后一天,说明跳月了 if (date + 7 > curMonthLastDate) { newYear = month === 12 ? year + 1 : year newMonth = month === 12 ? 1 : month + 1 newDate = (date + 7) - curMonthLastDate } else { newDate = date + 7 } } return `${newYear}/${newMonth}/${newDate}` }, /** 选择日期触发 */ selectDate(e){ let type = e.currentTarget.dataset.type //选择的时间类型 let index = e.currentTarget.dataset.index //选择的下标 let date if (this.data.currentViewType == 'week') { date = e.currentTarget.dataset.item.dateStr //选择的下标 type = 'weekDay' } else { date = e.currentTarget.dataset.item.time //选择的下标 } let selectDate = date.replace(/\//g, "-") console.log("选择的时间", selectDate) // 自定义事件,父组件调用,回调 选择的时间selectDate this.triggerEvent('selectDate', selectDate) //将选择的时间类型的 isNowMonthDay 全改为'' this.data[type]?.forEach(item => { item.isNowMonthDay = '' }) console.log(index,this.data,[type]); this.data[type]?.forEach((item, idx) => { if (index == idx) { item.isNowMonthDay = (item.time == new Date().toLocaleDateString() ? "isNowMonthDay" : "isNotNowMonthDay"); //判断当前选中的日期是否是当前时间 } else { item.isNowMonthDay = '' } }) const dateArr = date.split('/') this.setData({ [type]: this.data[type], activeDateStr: date, year: dateArr[0], month:dateArr[1], nowMonth: dateArr[1], nowDay: dateArr[2], }) }, }, ready() { this.getHoliday() } })