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"; import { checkFullScren } from "../../utils/checkFullScren"; const currentDate = new Date(); const minYear = 2020; const maxYear = currentDate.getFullYear() + 1; let DateMap = getDateMap(minYear, maxYear); const weekList = ["周日", "周一", "周二", "周三", "周四", "周五", "周六"]; import create from "dd-store"; let maxClickCount = 5; create.Page({ data: { refresh: false, $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, isIPX: checkFullScren() }, scrollTop: 0, pageSize: 10, totalPages: 1, currentPage: 1, firstPage: 1, scheduleList: [], timer: null, isFirstLoad: true, blankDataLength: 0, blankDataLengthAfter: 0, minYear: minYear, maxYear: maxYear, todayIndex: 0, onShow() { //如果是重复会议重新算 if (this.$store.data.indexNeedUpdate) { dd.setNavigationBar({ title: "日程" }); DateMap = getDateMap(this.minYear, this.maxYear); this.getData(); this.isFirstLoad = true; this.$store.data.indexNeedUpdate = false; this.update(); } //单次会议往DateMap中添加 if (this.$store.data.onceMeetingContent) { this.getScheduleList(this.$store.data.onceMeetingContent, "once"); this.$store.data.onceMeetingContent = null; this.update(); } //刷新动态列表 if (this.$store.data.isIndexAffairListNeedUpdate) { this.getPages(1); this.$store.data.isIndexAffairListNeedUpdate = false; this.update(); } }, onLoad(event) { if (JSON.stringify(event) != "{}") { this.setData({ listLoading: false }); const scheduleItem = JSON.parse(Object.keys(event)[0].split("=")[1]); dd.navigateTo({ url: `./../meetingDetail/meetingDetail?scheduleItem=${encodeURIComponent( JSON.stringify(scheduleItem) )}` }); } dd.setNavigationBar({ title: "动态" }); //获取动态列表 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, dynamicList: [] }); 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(); } }).catch(err => { // if (err && err.refresh) { // this.setData({ // refresh: true // }) // } }); }, //动态置顶 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)) { const centerPage = Math.floor(i / this.pageSize); this.todayIndex = i; this.setData({ currentDataIndex: i }); // firstPage转为4的倍数,一次下拉加载40条 const firstPage = centerPage - 2; this.firstPage = firstPage % 4 == 0 ? firstPage : firstPage - (firstPage % 4); this.currentPage = centerPage + 2; break; } } }, getData() { getHomeUserSchedule1({ startTime: "2020-01-01 00:00:00", endTime: "2025-12-30 23:59:59" }).then(res => { this.getScheduleList(res.data.data); }); }, //生成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]).push({ ...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, type) { if (type == "once") { this.setDateMapValue(response.startTime, response.endTime, response); } else { 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.sort(function (a, b) { return a.startTime.getTime() - b.startTime.getTime(); }); 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 }); } }); this.scheduleList = DateList; this.getPagination(this.scheduleList); // 第一次加载 this.setData({ scheduleList: this.scheduleList.slice( this.firstPage * this.pageSize, this.currentPage * this.pageSize ), loading: false }); //定位到当前日期 this.backToToday("first"); }, //日程上拉加载 lower() { if (this.currentPage < this.totalPages) { this.currentPage++; this.setData({ scheduleList: this.scheduleList.slice( this.firstPage * this.pageSize, this.currentPage * this.pageSize ) }); } else { //超出加载一年的数据 this.maxYear++; const yearData = getBlankList(this.maxYear); this.blankDataLengthAfter += yearData.length; this.scheduleList.push(...yearData); 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 -= 4; this.currentPage -= 4; this.setData( { todayStr: "", scheduleList: this.scheduleList.slice( this.firstPage * this.pageSize, this.currentPage * this.pageSize ) }, () => { this.setData({ todayStr: this.data.scheduleList[this.pageSize * 4 - 1].dateStr }); dd.stopPullDownRefresh(); } ); } else { this.minYear--; const yearData = getBlankList(this.minYear); this.blankDataLength += yearData.length; this.todayIndex += yearData.length; 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(); } ); } }, scroll(e) { // 一次性惯性拉到顶速度跟不上,重置 if (e.detail.scrollTop == 0) { this.setData({ currentData: this.data.scheduleList[0].dateStr, currentDataIndex: 0 }); } //每次计算偏移值 const offset = this.getScrollOffset(e.detail.scrollTop); dd.createSelectorQuery() .selectAll(".li") .boundingClientRect() .exec(rect => { //日程的上下箭头 if (rect[0]) { this.setScrollOffset(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; }, setScrollOffset(rect) { if (rect[0][this.todayIndex]) { if ( rect[0][this.todayIndex].top <= 60 && rect[0][this.todayIndex].top >= 30 ) { if (this.data.offset !== "stop") { this.setData({ offset: "stop" }); } } else if (rect[0][this.todayIndex].top < 60) { if (this.data.offset !== "next") { this.setData({ offset: "next" }); } } else if (rect[0][this.todayIndex].top > 30) { if (this.data.offset !== "before") { this.setData({ offset: "before" }); } } } else { if (this.data.offset !== "before") { this.setData({ offset: "before" }); } } }, 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=${encodeURIComponent( JSON.stringify(e.target.dataset.item) )}` }); }, 1000), backToToday(type) { if (!type) { //如果当前的日期还没加载出来点击无效 const isFindArr = this.data.scheduleList.filter( it => it.dateStr == toLocaleDateString(currentDate) ); if (isFindArr.length == 0) { //去掉头部空数据 if (this.minYear < minYear) { this.scheduleList.splice(0, this.blankDataLength); this.minYear = minYear; } //去掉尾部数据 if (this.maxYear > maxYear) { this.scheduleList.splice(-this.blankDataLengthAfter); this.maxYear = maxYear; } this.getPagination(this.scheduleList); this.setData({ scheduleList: this.scheduleList.slice( this.firstPage * this.pageSize, this.currentPage * this.pageSize ) }); } } //需要先清空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 (this.isFirstLoad) { this.backToToday("first"); this.isFirstLoad = false; } if (lastTimeTabBarIndex == tabbar) { if (tabbar == "1") { this.backToToday(); } } else { //切换到动态页面时,日程重置成当前日期 if (tabbar == "0") { this.lastOffset = this.data.offset; this.setData({ offset: "stop" }); } else if (!this.isFirstLoad) { this.setData({ offset: this.lastOffset }); } } }, onTitleClick() { maxClickCount--; if (maxClickCount == 0) { dd.alert({ content: "0.0.9" }); maxClickCount = 5; } } });