import { RRule } from "rrule"; import { getDynamicList, meetingCollection, updateMeetingTask, getHomeUserSchedule1 } from "../../api/request"; import { getDateMap, getExcludeDate, getNextDateList, getWeekNumber, getBlankList, toLocaleDateString } from './schedule.js'; import { getFormatDate, throttle, padZero, getCreateShowTime } from "../../utils/utils"; const currentDate = new Date(); let minYear = 2020; let maxYear = currentDate.getFullYear() + 1; let DateMap = getDateMap(minYear, maxYear); const weekList = ["周日", "周一", "周二", "周三", "周四", "周五", "周六"]; import create from "dd-store"; create.Page({ data: { $data: null, iconDay: currentDate.getDate(), scheduleList: [], todayStr: toLocaleDateString(currentDate), currentData: toLocaleDateString(currentDate), currentDataIndex: 0, offset: 'stop', show: false, loading: true, traceTime: '1970-03-01 00:00:00', isStopBodyScroll: false, dynamicList: [], current: 1, pages: 1, listLoading: true }, scrollTop: 0, pageSize: 10, totalPages: 1, currentPage: 1, firstPage: 1, scheduleList: [], timer: null, isFirstLoad: true, onShow() { if (this.$store.data.indexNeedUpdate) { //优化:如果是重复会议重新算,单次会议往DateMap中添加 DateMap = getDateMap(minYear, maxYear); this.onLoad() } }, onLoad() { dd.setNavigationBar({ title: this.$store.data.tabBarIndex == '0' ? "动态" : '日程' }); //获取动态列表 this.getPages(1); //获取日程列表 this.getData(); this.isFirstLoad = true; }, //动态列表侧滑的时候禁止页面上下滑动 setBodyDisableScroll(isStopBodyScroll) { this.setData({ isStopBodyScroll }) }, //点击页面关闭侧滑模块 closeSwipe() { if (this.$store.closeActiveSwipe) { this.$store.closeActiveSwipe() } }, getPages(current, callBack) { getDynamicList({ current, size: 10 }).then(res => { if (!res.data.data) { this.setData({ listLoading: false }) return; } const dynamicList = res.data.data.records.map((item, index) => { for (let i = 0; i < item.meetingLogDataList.length; i++) { if (item.meetingLogDataList[i].creatorInfo) { item.meetingLogDataList[i].creatorInfo = JSON.parse( item.meetingLogDataList[i].creatorInfo ); } if (item.meetingLogDataList[i].createTime) { item.meetingLogDataList[i].createTime = getCreateShowTime( item.meetingLogDataList[i].createTime ); } let itemData = item.meetingLogDataList[i].meetingLogResource; if (itemData) { itemData.groupId = item.groupId if (itemData.taskInfos || itemData.fileInfos) { if (itemData.creatorInfo) { itemData.creatorInfo = JSON.parse(itemData.creatorInfo); } if (itemData.fileInfos) { itemData.fileInfos = JSON.parse(itemData.fileInfos); } if (itemData.taskInfos) { itemData.taskInfos = JSON.parse(itemData.taskInfos); } if (itemData.acceptorInfo) { itemData.acceptorInfo = JSON.parse(itemData.acceptorInfo); } } } } return item }); //第一页数据会重新请求需要替换 if (current === 1) { this.setData({ dynamicList }); } else { const newDynamicList = this.data.dynamicList.concat(dynamicList); this.setData({ dynamicList: newDynamicList }); } this.setData({ listLoading: false, current: res.data.data.current, pages: res.data.data.pages, }); if (callBack) { callBack() } }); }, //动态置顶 changeCollection(e) { const { index, scheduleId, collection } = e.target.dataset; meetingCollection({ scheduleId, collection }).then(res => { //取消置顶 if (collection === "N") { // 重新获取第一页的数据 this.getPages(1, () => { dd.showToast({ content: '取消成功' }) }); } else { //置顶 const dynamicList = this.data.dynamicList; const replaceItem = dynamicList[index]; dynamicList[index].traceTime = res.data.data; dynamicList.splice(index, 1); dynamicList.unshift(replaceItem); this.setData({ dynamicList: dynamicList }, () => { dd.showToast({ content: '置顶成功' }) }); } }); }, //动态上拉加载分页数据 onScrollToLower() { if (this.data.current < this.data.pages) { this.getPages(this.data.current + 1); } }, //动态修改状态 onChangeTaskStatusOnList(e) { const data = { groupId: e.groupId, scheduleId: e.scheduleId, resourceType: "task", creatorId: getApp().globalData.userid, creatorInfo: getApp().globalData.userInfo, id: e.id, logType: "task_status_modify", taskStatus: e.status }; updateMeetingTask(data).then(res => { if (res.data.code === 0) { let dataIndex1 = ""; let dataIndex2 = ""; this.data.dynamicList.forEach((item, index) => { if (item.scheduleId === e.scheduleId) { dataIndex1 = index; item.meetingLogDataList.forEach((it, index2) => { if (it.meetingLogResource.id == e.id) { dataIndex2 = index2; } }); } }); const setData = `dynamicList[${dataIndex1}].meetingLogDataList[${dataIndex2}].meetingLogResource.taskStatus`; this.setData({ [setData]: e.status }); } }); }, //日程获取分页数据 getPagination(scheduleList = []) { this.totalPages = Math.ceil(scheduleList.length / this.pageSize); for (let i = 0; i < scheduleList.length; i++) { if (scheduleList[i].dateStr == toLocaleDateString(currentDate)) { this.firstPage = Math.floor(i / this.pageSize) - 2; this.currentPage = Math.floor(i / this.pageSize) + 2; break } } }, getData() { getHomeUserSchedule1({ startTime: "2020-01-01 00:00:00", endTime: "2025-12-30 23:59:59" }).then(res => { this.scheduleList = this.getScheduleList(res.data.data); this.getPagination(this.scheduleList); // 第一次加载 this.setData({ scheduleList: this.scheduleList.slice(this.firstPage * this.pageSize, this.currentPage * this.pageSize), loading: false }); }); }, //生成DateMap值 setDateMapValue(startTime, endTime, item, type) { const pushItem = { endTime: endTime, startTime: startTime, planDate: getFormatDate(startTime, "yyyyMMdd", "-"), thisDayStartTime: getFormatDate(startTime, 'HH:mm'), thisDayEndTime: getFormatDate(endTime, 'HH:mm'), confirmAttendance: item.confirmAttendance, title: item.title, id: item.id, isBeOverdue: currentDate.getTime() > endTime.getTime() ? true : false }; //模板会议id为空 if (type == 'repeat') { pushItem.scheduleTemplateId = item.id; pushItem.id = '' } // 如果是跨天会议,需要手动在起始天以后的其他天 添加会议日程 const nextDateList = getNextDateList(startTime, endTime);//返回日期包括起始天 if (nextDateList.length > 1) { pushItem.isDaySpan = true; pushItem.isFewDays = 1; pushItem.isfirstDayOrEndDay = '0'// 0 第一天,1中间的天,2结束的天 pushItem.duration = nextDateList.length; for (let i = 1; i < nextDateList.length; i++) { if (DateMap.has(nextDateList[i])) { DateMap.get(nextDateList[i]).unshift({ ...pushItem, isFewDays: i + 1, isfirstDayOrEndDay: nextDateList.length - 1 === i ? "2" : "1",// 0 第一天,1中间的天,2结束的天 }); } } } if (DateMap.has(toLocaleDateString(startTime))) { DateMap.get(toLocaleDateString(startTime)).push(pushItem) } }, // 根据接口返回数据生成填充DateMap setDateMapByResponse(response) { if (response) { // 处理单次会议 scheduleList const scheduleListWithTemplateId = []; response.scheduleList.forEach(item => { // 有scheduleTemplateId则是虚拟会议转成实体会议,需要替换rrule生成的模板会议 if (item.scheduleTemplateId) { scheduleListWithTemplateId.push(item); } else { this.setDateMapValue(new Date(item.startTime.replace(/-/g, '/')), new Date(item.endTime.replace(/-/g, '/')), item); } }); // 处理重复会议 templateList response.templateList.forEach(item => { //日程会议 const itemScheduleList = scheduleListWithTemplateId.filter(it => it.scheduleTemplateId == item.id); // 生成rrules规则 const initialTimeList = item.initialTime.split('-'); const startTimeList = item.startTime.split(":"); const DTSTART = `${initialTimeList[0]}${initialTimeList[1]}${initialTimeList[2]}T${startTimeList[0]}${startTimeList[1]}00Z`; const rule = RRule.fromString( `${item.recurrenceModel.recurrenceRule};DTSTART=${DTSTART}` ); const setDateMapValueAll = (startTime, endTime, item) => { //如果有日程会议则用日程会议替换 let replaceItem = []; if (itemScheduleList.length > 0) { replaceItem = itemScheduleList.filter(it => it.planDate == getFormatDate(startTime, "yyyyMMdd", "-")) } if (replaceItem.length > 0) { this.setDateMapValue(new Date(replaceItem[0].startTime.replace(/-/g, '/')), new Date(replaceItem[0].endTime.replace(/-/g, '/')), replaceItem[0]); } else { this.setDateMapValue(startTime, endTime, item, 'repeat'); } } // 需要剔除某一天 if (item.excludePlanDates) { const excludeData = getExcludeDate(item.excludePlanDates.split(",")); rule.all().forEach(startTime => { //修正时间(时间有8小时时差) startTime.setHours(startTime.getHours() - 8); // 生成结束时间 const endTime = new Date(startTime); endTime.setMinutes(endTime.getMinutes() + item.recurrenceModel.duration); // 剔除规则: 时间小于futureTime 时间不在单个排除日期里面 if (startTime.getTime() < excludeData.minFutureTime && !excludeData.excludeDateList.includes(getFormatDate(startTime, "yyyyMMdd", "-"))) { setDateMapValueAll(startTime, endTime, item); } }); } // 正常生成数据 else { rule.all().forEach(startTime => { //修正时间(时间有8小时时差) startTime.setHours(startTime.getHours() - 8); // 生成结束时间 const endTime = new Date(startTime); endTime.setMinutes(endTime.getMinutes() + item.recurrenceModel.duration); setDateMapValueAll(startTime, endTime, item); }); } }); } }, //日程数据 getScheduleList(response) { this.setDateMapByResponse(response); // 取出DateMap的value值平铺到DateList const DateList = []; DateMap.forEach(function (value, key) { const keyDate = new Date(key); const year = keyDate.getFullYear(); const month = keyDate.getMonth(); const date = keyDate.getDate(); const day = keyDate.getDay(); // 生成年 if (month === 0 && date === 1) { DateList.push({ type: "year", value: year, dateStr: `${year}` }); } //生成月 if (date === 1) { DateList.push({ type: "month", value: month + 1, dateStr: `${year}/${month + 1}` }); } //生成周 if (day === 0) { const rangeDate = new Date(year, month, date + 6); const rangeMonth2 = new Date(rangeDate).getMonth(); const rangeDay2 = new Date(rangeDate).getDate(); DateList.push({ type: "week", value: `第${getWeekNumber(year, month, date)}周,${month + 1}月${date}日 - ${ rangeMonth2 == month ? "" : rangeMonth2 + 1 + "月" }${rangeDay2}日`, dateStr: `${year}/${month + 1}/${date}-week` }); } // 有日程长度 if (value.length !== 0) { value.forEach((item, index) => { if (index === 0) { DateList.push({ type: key !== toLocaleDateString(currentDate) ? "day" : 'today', week: weekList[day], hasDateLabel: padZero(date), value: item, dateStr: `${key}` }); } else { DateList.push({ type: "day", value: item, dateStr: `${key}/${item.id || item.scheduleTemplateId}` }); } }); } else if (value.length === 0 && key === toLocaleDateString(currentDate)) { DateList.push({ type: "thisday", value: "", hasDateLabel: padZero(date), week: weekList[day], dateStr: key }); } }); return DateList; }, //日程上拉加载 lower() { if (this.currentPage < this.totalPages) { this.currentPage++; this.setData({ scheduleList: this.scheduleList.slice(this.firstPage * this.pageSize, this.currentPage * this.pageSize) }); } else { //超出加载一年的数据 maxYear++; this.scheduleList.push(...getBlankList(maxYear)); this.setData({ scheduleList: this.scheduleList.slice(this.firstPage * this.pageSize) }) } }, onPullDownRefresh() { if (this.$store.data.tabBarIndex == '0') { this.getPages(1); dd.stopPullDownRefresh(); return } //日程页面到顶部的时候才下拉加载数据,否则定位距离太长 if (this.$store.data.tabBarIndex == '1' && this.scrollTop !== 0) { dd.stopPullDownRefresh(); return } // const todayStr = this.data.scheduleList[0].dateStr; if (this.firstPage > 0) { this.firstPage--; this.currentPage--; this.setData({ todayStr: '', scheduleList: this.scheduleList.slice(this.firstPage * this.pageSize, this.currentPage * this.pageSize) }, () => { this.setData({ todayStr: this.data.scheduleList[this.pageSize - 1].dateStr }); dd.stopPullDownRefresh(); }); } else { minYear--; const yearData = getBlankList(minYear); this.scheduleList.unshift(...yearData); this.totalPages = Math.ceil(this.scheduleList.length / this.pageSize); this.currentPage = Math.floor(yearData.length * 2 / this.pageSize); this.setData({ todayStr: '', scheduleList: this.scheduleList.slice(0, yearData.length * 2), }, () => { this.setData({ //加载一年的数据重定位可能会有点问题,重置一下 currentData: this.scheduleList[yearData.length - 1].dateStr, currentDataIndex: yearData.length - 1, todayStr: this.scheduleList[yearData.length - 1].dateStr }); dd.stopPullDownRefresh() }) } }, //计算高度 caculateHeight(scrollTop) { let height = 0; let i = 0; while (height <= scrollTop) { if (this.data.scheduleList[i].type.indexOf('day') !== '-1') { height += this.dateHeight } else { height += this.otherHeight } i++ } return i }, scroll(e) { //计算有偏差 // const index = this.caculateHeight(e.detail.scrollTop); // console.log(index) // if (this.data.scheduleList[index].dateStr.split('/')[1] !== this.data.currentData.split('/')[1]) { // console.log('setDate: ' + this.data.scheduleList[index].dateStr) // this.setData({ // currentData: this.data.scheduleList[index].dateStr // }) // } //循环次数过多 // dd.createSelectorQuery().selectAll('.li').boundingClientRect().exec((rect) => { // for (let i = rect[0].length; i > 0; i--) { // if (rect[0][i] && rect[0][i].top < 50) { // if (this.data.scheduleList[i].dateStr.split('/')[1] !== this.data.currentData.split('/')[1]) { // this.setData({ // currentData: this.data.scheduleList[i].dateStr, // }) // } // break; // } // } // }) // 一次性惯性拉到顶速度跟不上,重置 if (e.detail.scrollTop == 0) { this.setData({ currentData: this.data.scheduleList[0].dateStr, currentDataIndex: 0 }) } if (this.timer) { clearTimeout(this.timer) } this.timer = setTimeout(() => { this.setData({ offset: 'stop' }) }, 500) //每次计算偏移值 const offset = this.getScrollOffset(e.detail.scrollTop); if (this.data.offset !== offset) { if (!this.resetToview) { this.setData({ offset }); } this.resetToview = false } dd.createSelectorQuery().selectAll('.li').boundingClientRect().exec((rect) => { if (offset == 'next') { for (let i = this.data.currentDataIndex; i < rect[0].length; i++) { if (rect[0][i].top > 0) { if (this.data.scheduleList[i].dateStr.split('/')[1] !== this.data.currentData.split('/')[1]) { this.setData({ currentData: this.data.scheduleList[i].dateStr, currentDataIndex: i }) } break; } } } else if (offset == 'before') { let i = Math.min(this.data.currentDataIndex, this.data.scheduleList.length - 1); for (; i > 0; i--) { if (rect[0][i].top < 50) { if (this.data.scheduleList[i].dateStr.split('/')[1] !== this.data.currentData.split('/')[1]) { this.setData({ currentData: this.data.scheduleList[i].dateStr, currentDataIndex: i }) } break; } } } }) }, //判断滚动方向 getScrollOffset(scrollTop) { let offset = 'stop'; if (scrollTop > this.scrollTop) { //向下滚动 offset = 'next' } else { //向上滚动 offset = 'before' } this.scrollTop = scrollTop; return offset }, closePop() { this.setData({ show: false }); }, changesidebar() { this.setData({ show: true }); }, createMeeting() { dd.navigateTo({ url: "./../createMeeting/createMeeting" }); }, nextDetail: throttle(function (e) { dd.navigateTo({ url: `./../meetingDetail/meetingDetail?scheduleItem=${JSON.stringify( e.target.dataset.item )}` }); }, 1000), backToToday() { //需要先清空todayStr再设置才有效 this.setData( { todayStr: "" }, () => { this.setData({ todayStr: toLocaleDateString(currentDate) }); } ); }, // 修改tabBar changeTabBar(e) { const { tabbar, title } = e.currentTarget.dataset; const lastTimeTabBarIndex = this.$store.data.tabBarIndex; this.$store.data.tabBarIndex = tabbar; this.update(); dd.setNavigationBar({ title: title }); if (tabbar == '1' && lastTimeTabBarIndex == tabbar) { this.backToToday(); } if (this.isFirstLoad) { this.backToToday(); this.isFirstLoad = false; this.resetToview = true; } } });