123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304 |
- const util = require("../../utils/util.js");
- Component({
- properties: {
- sid: {
- type: Number,
- value: -1,
- observer: function (newVal){
- this.setData({ sid: newVal });
- }
- },
- calendarInfo:{
- type: Array,
- value: [],
- observer: function (newVal){
- this.setData({ calendarInfo: newVal });
- this.calendarInfo()
- }
- },
- presellOpen:{
- type: Number,
- value: 0,
- observer: function (newVal){
- this.setData({ presellOpen: newVal });
- }
- }
- },
- data: {
- sid:-1,
- s1Sid:-1,
- dateList: [], //日历主体渲染数组
- selectDay: {}, //选中时间
- open:true, //展开、折叠日历
- monthList:[],
- selectedMonth:0,
- calendarInfo:[], //日历信息
- //selectDay:{},//日历选中日期
- presellOpen:0
- },
- methods: {
- // 解析月份列表
- calendarInfo() {
- let date={},monthList=[];
- this.data.calendarInfo.map((el,i) => {
- let dayVal=0,defalutDays=false;
- if (el.days && el.days.length>0) {
- el.days.forEach(it => {
- if (it.active) {
- dayVal=parseInt(it.days);
- defalutDays=true;
- this.setData({selectedMonth:i})
- let arr = it.month.split('-');
- date.year=parseInt(arr[0]);
- date.month=parseInt(arr[1]);
- date.day=parseInt(it.days);
- date.dateString=it.month+'-'+it.days;
- }
- });
- if (!defalutDays) {
- // dayVal=parseInt(el.days[0].days);
- dayVal = this.getDefaultDay(el.days,0);
- }
- }
- monthList.push({date:el.month+'-'+dayVal,month:el.month.split('-')[1]})
- });
- this.setData({monthList})
- this.setMonth(date.year, date.month, date.day,this.data.selectedMonth,this.data.sid)
- },
- // 递归遍历获取默认选中天数
- getDefaultDay(arr,i){
- if (arr.length>0 && i<arr.length) {
- if (arr[i].actNum>0 || arr[i].waitActNum>0) {
- return arr[i].days;
- } else {
- return this.getDefaultDay(arr,i+1);
- }
- }else{
- return 0;
- }
- },
- /**
- * 时间戳转化为年 月 日 时 分 秒
- * time: 需要被格式化的时间,可以被new Date()解析即可
- * format:格式化之后返回的格式,年月日时分秒分别为Y, M, D, h, m, s,这个参数不填的话则显示多久前
- */
- formatTime(time, format) {
- function formatNumber(n) {
- n = n.toString()
- return n[1] ? n : '0' + n
- }
- function getDate(time, format) {
- const formateArr = ['Y', 'M', 'D', 'h', 'm', 's']
- const returnArr = []
- const date = new Date(time)
- returnArr.push(date.getFullYear())
- returnArr.push(formatNumber(date.getMonth() + 1))
- returnArr.push(formatNumber(date.getDate()))
- returnArr.push(formatNumber(date.getHours()))
- returnArr.push(formatNumber(date.getMinutes()))
- returnArr.push(formatNumber(date.getSeconds()))
- for (const i in returnArr) {
- format = format.replace(formateArr[i], returnArr[i])
- }
- return format
- }
- function getDateDiff(time) {
- let r = ''
- const ft = new Date(time)
- const nt = new Date()
- const nd = new Date(nt)
- nd.setHours(23)
- nd.setMinutes(59)
- nd.setSeconds(59)
- nd.setMilliseconds(999)
- const d = parseInt((nd - ft) / 86400000)
- switch (true) {
- case d === 0:
- const t = parseInt(nt / 1000) - parseInt(ft / 1000)
- switch (true) {
- case t < 60:
- r = '刚刚'
- break
- case t < 3600:
- r = parseInt(t / 60) + '分钟前'
- break
- default:
- r = parseInt(t / 3600) + '小时前'
- }
- break
- case d === 1:
- r = '昨天'
- break
- case d === 2:
- r = '前天'
- break
- case d > 2 && d < 30:
- r = d + '天前'
- break
- default:
- r = getDate(time, 'Y-M-D')
- }
- return r
- }
- if (!format) {
- return getDateDiff(time)
- } else {
- return getDate(time, format)
- }
- },
- //picker设置月份
- editMonth(e) {
- let i = e.currentTarget.dataset.index;
- const arr = e.currentTarget.dataset.item.split("-");
- const year = parseInt(arr[0])
- const month = parseInt(arr[1])
- const day = parseInt(arr[2])
- this.setMonth(year, month,day,i,'',1)
- },
- //上月切换按钮点击
- lastMonth() {
- const lastMonth = new Date(this.data.selectDay.year, this.data.selectDay.month - 2)
- const year = lastMonth.getFullYear()
- const month = lastMonth.getMonth() + 1
- this.setMonth(year, month)
- },
- //下月切换按钮点击
- nextMonth() {
- const nextMonth = new Date(this.data.selectDay.year, this.data.selectDay.month)
- const year = nextMonth.getFullYear()
- const month = nextMonth.getMonth() + 1
- this.setMonth(year, month)
- },
- //设置月份
- setMonth(setYear, setMonth, setDay,index, sid,bol) {
- if (!util.isEmpty(index)) {
- this.setData({selectedMonth:index})
- }
- // if (this.data.selectDay.year !== setYear || this.data.selectDay.month !== setMonth || this.data.selectDay.day !== setDay || this.data.s1Sid != sid) {
- const data = {
- selectDay: {
- year: setYear,
- month: setMonth,
- day: setDay ? setDay : 0,
- dateString: setYear+'-'+setMonth+'-'+(setDay||0)
- }
- }
- if (!setDay) {
- data.open = true;
- }
- this.setData({selectDay:data.selectDay,s1Sid:sid})
- this.dateInit(setYear, setMonth)
- this.data.selectDay.bol=bol;
- this.triggerEvent("change", this.data.selectDay)
- // }
- },
- // //展开收起
- // openChange() {
- // this.setData({
- // open: !this.data.open
- // })
- // this.triggerEvent("aaa", { a: 0 })
- // this.dateInit()
- // },
- //日历主体的渲染方法
- dateInit(setYear = this.data.selectDay.year, setMonth = this.data.selectDay.month) {
- console.log(setYear,setMonth)
- let dateList = []; //需要遍历的日历数组数据
- let now = new Date(setYear, setMonth - 1)//当前月份的1号
- let startWeek = now.getDay(); //目标月1号对应的星期
- let dayNum = new Date(setYear, setMonth, 0).getDate() //当前月有多少天
- let forNum = Math.ceil((startWeek + dayNum) / 7) * 7 //当前月跨越的天数(包括当前月天数周所涉及的上下月日期)
- if (this.data.open) {
- //展开状态,需要渲染完整的月份
- for (let i = 0; i < forNum; i++) {
- const now2 = new Date(now)
- let obj = {};
- if (i>=startWeek && i<(dayNum+startWeek)) {
- now2.setDate(i - startWeek + 1)
- let dayStatus=this.matchDay({y:now2.getFullYear(),m:now2.getMonth()+1,d:now2.getDate()})
- obj = {
- day: now2.getDate(),
- month: now2.getMonth() + 1,
- year: now2.getFullYear(),
- dateString: this.formatTime(now2, "Y-M-D")
- };
- if (!util.isEmpty(dayStatus)) {
- obj.actNum=dayStatus.actNum;
- obj.waitActNum=dayStatus.waitActNum;
- }
- } else {
- obj = {}
- }
- dateList[i] = obj;
- }
- } else {
- //非展开状态,只需要渲染当前周
- for (let i = 0; i < 7; i++) {
- const now2 = new Date(now)
- //当前周的7天
- now2.setDate(Math.ceil((this.data.selectDay.day + startWeek) / 7) * 7 - 6 - startWeek + i)
- let obj = {};
- obj = {
- day: now2.getDate(),
- month: now2.getMonth() + 1,
- year: now2.getFullYear(),
- dateString: this.formatTime(now2, "Y-M-D")
- };
- dateList[i] = obj;
- }
- }
- this.setData({
- dateList: dateList
- })
- },
- // 匹配日历-天
- matchDay(date){
- let obj={};
- this.data.calendarInfo.map(el => {
- let date1 = el.month.split('-');
- if (date.y==date1[0] && date.m==parseInt(date1[1])) {
- el.days.forEach(it => {
- if (date.d==it.days) {
- obj = it;
- }
- });
- }
- });
- return obj;
- },
- //一天被点击时
- selectChange(e) {
- if (util.isEmpty(e.currentTarget.dataset.actnum) && util.isEmpty(e.currentTarget.dataset.waitactnum)) {
- return false;
- }
- const year = e.currentTarget.dataset.year
- const month = e.currentTarget.dataset.month
- const day = e.currentTarget.dataset.day
- const dateString = e.currentTarget.dataset.dateString
- const selectDay = {
- year: year,
- month: month,
- day: day,
- dateString: dateString
- }
- if (this.data.selectDay.year !== year || this.data.selectDay.month !== month) {
- this.setMonth(year, month, day)
- } else if (this.data.selectDay.day !== day) {
- this.setData({
- selectDay: selectDay
- })
- this.data.selectDay.bol = 1;
- this.triggerEvent("change", this.data.selectDay)
- }
- }
- },
- observers: {
- spot: function (spot) {
- // this.setSpot()
- }
- }
- })
|