From 0d465a2615e3fe4cf0c2d6e4ef8e2103f9b45bab Mon Sep 17 00:00:00 2001 From: xuesinan <1404152492@qq.com> Date: Wed, 2 Mar 2022 15:21:08 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=97=B6=E9=97=B4=E8=BD=B4=E6=96=B9?= =?UTF-8?q?=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 3 +- components/Projects/ProjectItem.vue | 1 + components/TimeLine/TimeLine.vue | 15 + hooks/project/useGetTasks - 副本 (2).js | 476 ++++++++++++++++++++++++ hooks/project/useGetTasks - 副本 (3).js | 343 +++++++++++++++++ hooks/project/useGetTasks.js | 277 +++++++------- pages/project/project.vue | 46 ++- store/task/mutations.js | 9 + 8 files changed, 1020 insertions(+), 150 deletions(-) create mode 100644 hooks/project/useGetTasks - 副本 (2).js create mode 100644 hooks/project/useGetTasks - 副本 (3).js diff --git a/CHANGELOG.md b/CHANGELOG.md index c067171..d5bc9f7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -# 1.0.0 (2022-02-28) +# 1.0.0 (2022-03-02) ### 🌟 新功能 范围|描述|commitId @@ -115,6 +115,7 @@ - | 解决默认角色不是第一个时显示出错问题 | [8dba578](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/8dba578) - | 解决warning | [dcb0079](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/dcb0079) - | 拍照上传交付物 | [1cbb2ac](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/1cbb2ac) + - | 切换项目存储的任务id未清空 | [77fe17f](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/77fe17f) - | 切换项目任务清空 | [1dd3b4b](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/1dd3b4b) - | 日历列表H5在手机端不显示 | [0b4ae72](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/0b4ae72) - | 删除多余的引入 | [050b12a](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/050b12a) diff --git a/components/Projects/ProjectItem.vue b/components/Projects/ProjectItem.vue index a0447de..a247614 100644 --- a/components/Projects/ProjectItem.vue +++ b/components/Projects/ProjectItem.vue @@ -116,6 +116,7 @@ function openProject(project) { store.commit('task/clearTasks'); // 清空定期任务 store.commit('task/clearRealTasks'); // 清空真实任务数据 store.commit('socket/setCurrLocationTaskId', ''); + store.commit('task/setAllTasks', []); // 清空定期任务 store.commit('task/setUpNextPage', 1); store.commit('task/setDownNextPage', 1); store.commit('task/setTimeLineType', 1); diff --git a/components/TimeLine/TimeLine.vue b/components/TimeLine/TimeLine.vue index 837addd..1ab7899 100644 --- a/components/TimeLine/TimeLine.vue +++ b/components/TimeLine/TimeLine.vue @@ -60,6 +60,14 @@ async function handleScrollTop() { // 先把现在的任务放进去 store.commit('task/updateTasks', props.tasks) console.warn('滚动到顶部: '); + + if (timeLineType.value === 1) { + const startTime = props.tasks[0].planStart - 0; + store.commit('task/setCurrUpTimeNode', startTime); + const addTasks = uni.$task.setPlaceholderTasks(startTime, true, timeGranularity.value); + store.commit('task/setUpTasks', addTasks); + } + let params = { pageNum: upNextPage.value, queryType: 0 }; getTasksHook.dataRender(params); } @@ -71,6 +79,13 @@ async function handleScrollBottom() { store.commit('task/updateTasks', props.tasks); console.warn('滚动到底部: '); + if (timeLineType.value === 1) { + const startTime = dayjs(+props.tasks[props.tasks.length - 1].planStart).add(1, timeGranularity.value).valueOf(); + store.commit('task/setCurrDownTimeNode', startTime); + const addTasks = uni.$task.setPlaceholderTasks(startTime, false, timeGranularity.value); + store.commit('task/setDownTasks', addTasks); + } + let params = { pageNum: downNextPage.value, queryType: 1 }; getTasksHook.dataRender(params); } diff --git a/hooks/project/useGetTasks - 副本 (2).js b/hooks/project/useGetTasks - 副本 (2).js new file mode 100644 index 0000000..136c067 --- /dev/null +++ b/hooks/project/useGetTasks - 副本 (2).js @@ -0,0 +1,476 @@ +import { computed, nextTick, watch } from 'vue'; +import { useStore } from 'vuex'; +import { flatten } from 'lodash'; +import dayjs from 'dayjs'; + +export default function useGetTasks() { + const store = useStore(); + const tasks = computed(() => store.state.task.tasks); + const timeLineType = computed(() => store.state.task.timeLineType); // 时间轴模式 + const realTasks = computed(() => store.state.task.realTasks); // 真实任务 + const downNextPage = computed(() => store.state.task.downNextPage); // 下一页 + const upNextPage = computed(() => store.state.task.upNextPage); // 下一页 + const currUpTimeNode = computed(() => store.state.task.currUpTimeNode); // 当前查询的时间 + const currDownTimeNode = computed(() => store.state.task.currDownTimeNode); // 当前查询的时间 + const roleId = computed(() => store.state.role.roleId); + const timeNode = computed(() => store.state.task.timeNode); + const timeUnit = computed(() => store.state.task.timeUnit); + const visibleRoles = computed(() => store.state.role.visibleRoles); + const allTasks = computed(() => store.state.task.allTasks); + const roleIndex = computed(() => store.state.role.roleIndex); + + const projectId = computed(() => store.getters['project/projectId']); + const timeGranularity = computed(() => store.getters['task/timeGranularity']); + + const remindData = computed(() => store.state.socket.remindData); // 小红点 + + const currRoleRealTasks = computed(() => store.state.task.currRoleRealTasks); // 当前角色的真实任务数据 + + // 初始化 定期任务 + async function initPlanTasks() { + // timeLineType.value === 1 ? setNextPlaceholderTasks({}) : ''; + await getTasks({}); // 获取初始数据 + // await dataRender({}); + } + + /** + * 生成getTasks所用的参数 + * @param {object} query getTasks传递的参数 + */ + function generateGetTaskParam(query) { + return { + roleId: roleId.value, + timeNode: query.timeNode || timeNode.value, + timeUnit: query.timeUnit || timeUnit.value, + queryType: query.queryType === 0 ? 0 : 1, + pageNum: query.pageNum || 1, + pageSize: query.pageSize || uni.$taskConfig.pageCount, + taskId: query.taskId || '' + }; + } + + /** + * 根据时间基准点和角色查找定期任务 + * @param {object} query + * @param {string} query.roleId 角色id + * @param {string} query.timeNode 时间基准点 默认当前 + * @param {string} query.timeUnit 时间颗粒度 默认天 + * @param {string} query.queryNum 查找颗粒度数量 默认3个 + * @param {number} query.queryType 0向上查找 1向下查找(默认) 下查包含自己,上查不包含 + */ + function getTasks(query) { + store.commit('task/setShowSkeleton', false); + + const params = generateGetTaskParam(query); + uni.$catchReq.getTaskByNum(params, (err, data) => { + store.commit('task/setShowSkeleton', false); + if (err) { + // TODO: 提示错误 + console.error('err: ', err); + } else { + store.commit('task/setShowScrollTo', true); + + params.queryType === 0 ? store.commit('task/setUpRealTasks', data.list) : store.commit('task/setDownRealTasks', data.list); + params.queryType === 0 ? store.commit('task/setUpNextPage', data.nextPage) : store.commit('task/setDownNextPage', data.nextPage); // 下一页 + + const index = visibleRoles.value.findIndex(role => role.id === roleId.value); + const arr = [...allTasks.value]; + arr[index].realTasks = [...realTasks.value]; + store.commit('task/setAllTasks', arr); + store.commit('task/setCurrRoleRealTasks', arr[index].realTasks); // 设置当前角色的真实任务数据 + + // 数据处理 + dataRender(params); + } + }); + } + + function dataRender(params) { + timeLineType.value === 1 ? renderScaleTask(params) : renderConTask(params); + } + + // 任务模式 + async function renderConTask(params) { + let nextPage = params.queryType === 0 ? upNextPage.value : downNextPage.value; // 下一页的值 + let showTasks = tasks.value; + let centerData = await showTaskId(params, showTasks, realTasks.value) || []; + + if (centerData.length < 15 && nextPage > 0) { + getTasks({pageNum: nextPage, queryType: params.queryType}); + } else { + if (params.queryType === 0) { + showTasks = [...centerData, ...showTasks]; + } else { + showTasks = [...showTasks, ...centerData]; + } + } + + if (showTasks.length < 15 && nextPage === 0 && params.queryType === 1) { + getTasks({pageNum: 1, queryType: 0}); + } + + if (showTasks.length > 80) { + showTasks = params.queryType === 0 ? showTasks.slice(0, 80) : showTasks.slice(showTasks.length - 80); + } + + store.commit('task/clearTasks'); + params.queryType === 0 ? store.commit('task/setUpTasks', showTasks) : store.commit('task/setDownTasks', showTasks); + } + + // 刻度模式数据处理 + async function renderScaleTask(params) { + // params.queryType === 0 ? setPrevPlaceholderTasks(params) : setNextPlaceholderTasks(params); + + // let centerData = await showTaskId(params, tasks.value, currRoleRealTasks.value) || []; + let centerData = await showTaskTime(params, tasks.value, currRoleRealTasks.value) || []; + // tasksData(params, centerData, currRoleRealTasks.value); + handleTasksData(params, centerData, currRoleRealTasks.value); + } + + // 已显示的任务第一个时间和最后一个时间 + async function showTaskTime(params, showTasks, realTasks) { + + // 初始值 + let centerData = params.queryType === 0 ? [] : realTasks.slice(0, params.pageSize); + + /** + * 1、判断显示任务中是否有真实任务 + * 1-1、有。根据id查找任务 + * 1-2、无。根据时间查找任务 + * 2、查找15个任务 + */ + const firstDetailIndex = showTasks.findIndex(task => task.detailId); + + if (firstDetailIndex > -1) { + // 显示任务中有真实任务数据 + const firstId = showTasks[firstDetailIndex].id; + let lastDetailIndex = -1; + showTasks.forEach((item, index) => { + if (item.detailId) { + lastDetailIndex = index; + } + }) + const lastId = showTasks[lastDetailIndex].id; + + realTasks.forEach((item, index) => { + if (params.queryType === 1 && item.id === lastId) { + centerData = realTasks.slice(index + 1, index + 1 + params.pageSize) || []; + } else if (params.queryType === 0 && item.id === firstId) { + if (index >= params.pageSize) { + centerData = realTasks.slice(index - params.pageSize, index) || []; + } else { + centerData = realTasks.slice(0, index) || []; + } + } + }) + } else { + // 显示任务中没有真实任务数据 + // 已显示任务的第一个任务时间 + const firstTime = showTasks.length ? showTasks[0].planStart : ''; + // 已显示任务的最后一个任务时间 + const lastTime = showTasks.length ? showTasks[showTasks.length - 1].planStart : ''; + + try { + realTasks.forEach((item, index) => { + if (params.queryType === 1) { + if (dayjs(+lastTime).isSame(+item.planStart, timeGranularity.value) || dayjs(+lastTime).isBefore(+item.planStart, timeGranularity.value)) { + centerData = realTasks.slice(index, index + params.pageSize) || []; + throw Error(); + } + } else { + if (dayjs(+firstTime).isSame(+item.planStart, timeGranularity.value) || dayjs(+firstTime).isAfter(+item.planStart, timeGranularity.value)) { + if (index >= params.pageSize) { + centerData = realTasks.slice(index - params.pageSize, index) || []; + } else { + centerData = realTasks.slice(0, index) || []; + } + } + } + }) + } catch (e) { + console.log('退出循环') + } + } + + console.log('111111111', centerData); + return centerData; + } + + async function handleTasksData(params, centerData, realTasks) { + /** + * 3、查找的任务数量是否>=15 + * 3-1、是。 + * 判断时间跨度是否>=15 + * 3-1-1、是。显示时间刻度范围内的任务 + * 3-1-2、否。显示全部任务并删除多余的刻度 + * 3-2、否。 + * 判断时间跨度是否>=15 + * 3-2-1、是。显示时间刻度范围内的任务 + * 3-2-2、否。 + * 下一页是否为0 + * 3-2-2-1、是。无下一页,显示任务和刻度,之后继续展示刻度 + * 3-2-2-1、否。查找下一页数据并重复上述步骤 + */ + const startTime = centerData.length ? centerData[0].planStart : ''; + const endTime = centerData.length ? centerData[centerData.length - 1].planStart : ''; + let centerTime = dayjs(+startTime).add(params.pageSize, timeGranularity.value);\ + // 时间跨度是否大于等于15 + let isExceed = dayjs(+centerTime).isBefore(+endTime, timeGranularity.value) || dayjs(+centerTime).isSame(+endTime, timeGranularity.value); + + let nextPage = params.queryType === 0 ? upNextPage.value : downNextPage.value; // 下一页的值 + if (isExceed || centerData.length >= params.pageSize || nextPage === 0) { + params.queryType === 0 ? setPrevPlaceholderTasks(params) : setNextPlaceholderTasks(params); + } + + let showTasks = tasks.value; // 显示的数据 + + const firstDetailIndex = showTasks.findIndex(task => task.detailId); // 显示任务中存在真实任务 + const firstId = showTasks[firstDetailIndex].id; + let lastDetailIndex = -1; + showTasks.forEach((item, index) => { + if (item.detailId) { + lastDetailIndex = index; + } + }) + const lastId = showTasks[lastDetailIndex].id; + + showTasks.forEach((task, index) => { + const arr = centerData.filter(item => dayjs(+item.planStart).isSame(+task.planStart, timeGranularity.value)); + if (arr && arr.length) { + if (firstDetailIndex > -1) { + if (params.queryType === 1 && task.id === lastId) { + showTasks.splice(index + 1, 0, [...arr]) + } else (params.queryType === 0 && task.id === firstId) { + showTasks.splice(index, 0, [...arr]) + } + } else { + showTasks.splice(index, 1, [...arr]); + } + } + }) + + showTasks = flatten(showTasks); // 1维拍平 + + if (!isExceed) { + if (centerData.length < params.pageSize && nextPage > 0) { + await getTasks({pageNum: nextPage, queryType: params.queryType}); + return; + } + + let data = params.queryType === 0 ? centerData[0] : centerData[centerData.length - 1]; + showTasks.forEach((item, index) => { + if (item.id === data.id) { + len = index; + } + }) + + showTasks = params.queryType === 0 ? showTasks.slice(len) : showTasks.slice(0, len + 1); + } + + if (showTasks.length > 80) { + showTasks = param.queryType === 0 ? showTasks.slice(0, 80) : showTasks.slice(showTasks.length - 80); + } + + store.commit('task/clearTasks'); + param.queryType === 0 ? store.commit('task/setUpTasks', showTasks) : store.commit('task/setDownTasks', showTasks); + } + + // 已显示的任务第一个id和最后一个id + async function showTaskId(params, showTasks, realTasks) { + const firstDetailIndex = showTasks.findIndex(task => task.detailId); + const firstId = firstDetailIndex === -1 ? 0 : showTasks[firstDetailIndex].id; + let lastDetailIndex = -1; + showTasks.forEach((item, index) => { + if (item.detailId) { + lastDetailIndex = index; + } + }) + const lastId = lastDetailIndex === -1 ? 0 : showTasks[lastDetailIndex].id; + + let centerData = params.queryType === 0 ? [] : realTasks.slice(0, params.pageSize); + let flag = false; + realTasks.forEach((item, index) => { + if (params.queryType === 1 && item.id === lastId) { + flag = true; + centerData = realTasks.slice(index + 1, index + 1 + params.pageSize) || []; + } else if (params.queryType === 0 && item.id === firstId) { + flag = true; + centerData = realTasks.slice(index - params.pageSize, index) || []; + } + }) + + if (!flag) { + centerData = 0 + } + + console.log('111111', centerData, realTasks) + + // 1、数量大于等于15 centerData.length >= 15 + // 2、时间跨度大于等于15 + const startTime = centerData.length ? centerData[0].planStart : ''; + const endTime = centerData.length ? centerData[centerData.length - 1].planStart : ''; + let centerTime = dayjs(+startTime).add(params.pageSize, timeGranularity.value); + let isExceed = dayjs(+centerTime).isBefore(+endTime, timeGranularity.value) || dayjs(+centerTime).isSame(+endTime, timeGranularity.value); + // 3、下一页不为0 nextPage != 0 + let nextPage = params.queryType === 0 ? upNextPage.value : downNextPage.value; // 下一页的值 + + if (centerData.length < 15 && !isExceed && nextPage > 0) { + await getTasks({pageNum: nextPage, queryType: params.queryType}); + // centerData = await showTaskId(params, tasks.value, currRoleRealTasks.value); + } + + return centerData; + } + + /** + * 刻度模式数据处理 + * 大于等于15天,真实数据的时间跨度 + * 或大于等于15条,真实数据的数量 + * 不用重新加载数据 + * @param {Object} params + */ + function tasksData(query, centerData, realTasks) { + let params = generateGetTaskParam(query); + + params.queryType === 0 ? setPrevPlaceholderTasks(params) : setNextPlaceholderTasks(params); + let showTasks = tasks.value; // 显示的数据 + + + + let nextPage = param.queryType === 0 ? upNextPage.value : downNextPage.value; // 下一页的值 + + // 判断条件 + let isAccordTerm1 = false, isAccordTerm2 = false; + if (centerData.length > 0) { + // 1.数据数量>=15条 + isAccordTerm1 = centerData.length >= param.pageSize; + + // 2.数据最后一条数据时间>=当前查询的时间 + if (param.queryType === 0) { + let firstData = dayjs(centerData[0].planStart).add(param.pageSize, timeGranularity.value); + isAccordTerm2 = dayjs(+firstData).isBefore(+currUpTimeNode.value, timeGranularity.value) || dayjs(+firstData).isSame(+currUpTimeNode.value, timeGranularity.value); + } else { + let lastData = dayjs(centerData[centerData.length - 1].planStart).subtract(param.pageSize, timeGranularity.value); + isAccordTerm2 = dayjs(+lastData).isAfter(+currDownTimeNode.value, timeGranularity.value) || dayjs(+lastData).isSame(+currDownTimeNode.value, timeGranularity.value); + } + } + + // 3.下一页===0 + // 不需要添加新数据 + if (!isAccordTerm1 && !isAccordTerm2 && nextPage > 0) { + // getTasks({pageNum: nextPage, queryType: param.queryType}); + } else { + let tasksArr = [], isReplace = false, firstIndex = -1, selctedIndex = -1, replaceTime = 0; + showTasks.forEach((task, index) => { + const arr = centerData.filter(item => dayjs(+item.planStart).isSame(+task.planStart, timeGranularity.value)); + if (arr && arr.length) { + if (task.detailId) { + // 新数据与旧数据时间有重叠 + if (param.queryType === 1) { + selctedIndex = index; + tasksArr = [...arr]; + } else { + firstIndex = showTasks.findIndex(data => dayjs(+data.planStart).isSame(+task.planStart, timeGranularity.value)); + } + } else { + showTasks.splice(index, 1, [...arr]); + } + } + }) + + if (selctedIndex) { + showTasks.splice(selctedIndex + 1, 0, [...tasksArr]) + } + + if (firstIndex) { + showTasks.splice(firstIndex, 0, [...tasksArr]) + } + + showTasks.forEach((task, index) => { + const arr = centerData.filter(item => dayjs(+item.planStart).isSame(+task.planStart, timeGranularity.value)); + if (arr && arr.length) { + if (!task.detailId) { // 新数据与旧数据时间有重叠 + showTasks.splice(index, 1, [...arr]); // 这里加入的数据是array类型的, [{},{},[],[],{}] + } + } + }) + + showTasks = flatten(showTasks); // 1维拍平 + + if (isAccordTerm1 && !isAccordTerm2) { + let len = 0; + let data = param.queryType === 0 ? centerData[0] : centerData[centerData.length - 1]; + showTasks.forEach((item, index) => { + if (item.id === data.id) { + len = index; + } + }) + + showTasks = param.queryType === 0 ? showTasks.slice(len) : showTasks.slice(0, len + 1); + } + + if (showTasks.length > 80) { + showTasks = param.queryType === 0 ? showTasks.slice(0, 80) : showTasks.slice(showTasks.length - 80); + } + } + + store.commit('task/clearTasks'); + param.queryType === 0 ? store.commit('task/setUpTasks', showTasks) : store.commit('task/setDownTasks', showTasks); + } + + // 设置时间轴向上的空数据 + function setPrevPlaceholderTasks() { + store.commit('task/setTopEnd', true); + let startTime = ''; + if (!tasks.value || !tasks.value.length) { + startTime = Date.now(); // 没有任务就应该是时间基准点 + } else { + startTime = tasks.value[0].planStart - 0; // 有任务就是第一个任务的计划开始时间 + } + const placeholderTasks = uni.$task.setPlaceholderTasks(startTime, true, timeGranularity.value); + store.commit('task/setCurrUpTimeNode', startTime); + store.commit('task/setUpTasks', placeholderTasks); + } + + // 设置时间轴向下的空数据 + function setNextPlaceholderTasks(params) { + // store.commit('task/setBottomEnd', true); + console.log('ddddddddd') + let startTime = ''; + if (!tasks.value || !tasks.value.length) { + startTime = Date.now(); + } else { + startTime = dayjs(+tasks.value[tasks.value.length - 1].planStart).add(1, timeGranularity.value).valueOf(); + } + + if (params.taskId) { + realTasks.value.forEach(item => { + if (item.id === params.taskId) { + startTime = Number(item.planStart); + } + }) + } + + const initData = uni.$task.setPlaceholderTasks(startTime, false, timeGranularity.value); + store.commit('task/setCurrDownTimeNode', startTime); + store.commit('task/setDownTasks', initData); + } + + /** + * 当日常任务发生变化时 + * 将新获取到的日常任务放在allTasks里 + */ + watch(tasks, newValue => { + // 添加到allTasks里 + const index = visibleRoles.value.findIndex(role => role.id === roleId.value); + const arr = [...allTasks.value]; + arr[index].task = [...newValue]; + store.commit('task/setAllTasks', arr); + }); + + return { + initPlanTasks, + getTasks, + dataRender + } +} diff --git a/hooks/project/useGetTasks - 副本 (3).js b/hooks/project/useGetTasks - 副本 (3).js new file mode 100644 index 0000000..8bc439a --- /dev/null +++ b/hooks/project/useGetTasks - 副本 (3).js @@ -0,0 +1,343 @@ +import { computed, nextTick, watch } from 'vue'; +import { useStore } from 'vuex'; +import { flatten } from 'lodash'; +import dayjs from 'dayjs'; + +export default function useGetTasks() { + const store = useStore(); + const tasks = computed(() => store.state.task.tasks); + const timeLineType = computed(() => store.state.task.timeLineType); // 时间轴模式 + const realTasks = computed(() => store.state.task.realTasks); // 真实任务 + const downNextPage = computed(() => store.state.task.downNextPage); // 下一页 + const upNextPage = computed(() => store.state.task.upNextPage); // 下一页 + const currUpTimeNode = computed(() => store.state.task.currUpTimeNode); // 当前查询的时间 + const currDownTimeNode = computed(() => store.state.task.currDownTimeNode); // 当前查询的时间 + const roleId = computed(() => store.state.role.roleId); + const timeNode = computed(() => store.state.task.timeNode); + const timeUnit = computed(() => store.state.task.timeUnit); + const visibleRoles = computed(() => store.state.role.visibleRoles); + const allTasks = computed(() => store.state.task.allTasks); + const roleIndex = computed(() => store.state.role.roleIndex); + + const projectId = computed(() => store.getters['project/projectId']); + const timeGranularity = computed(() => store.getters['task/timeGranularity']); + + const remindData = computed(() => store.state.socket.remindData); // 小红点 + + const currRoleRealTasks = computed(() => store.state.task.currRoleRealTasks); // 当前角色的真实任务数据 + + // 初始化 定期任务 + async function initPlanTasks() { + if (timeLineType.value === 1) setNextPlaceholderTasks({}); + await getTasks({}); // 获取初始数据 + // await dataRender({}); + } + + /** + * 生成getTasks所用的参数 + * @param {object} query getTasks传递的参数 + */ + function generateGetTaskParam(query) { + return { + roleId: roleId.value, + timeNode: query.timeNode || timeNode.value, + timeUnit: query.timeUnit || timeUnit.value, + queryType: query.queryType === 0 ? 0 : 1, + pageNum: query.pageNum || 1, + pageSize: query.pageSize || uni.$taskConfig.pageCount, + taskId: query.taskId || '' + }; + } + + /** + * 根据时间基准点和角色查找定期任务 + * @param {object} query + * @param {string} query.roleId 角色id + * @param {string} query.timeNode 时间基准点 默认当前 + * @param {string} query.timeUnit 时间颗粒度 默认天 + * @param {string} query.queryNum 查找颗粒度数量 默认3个 + * @param {number} query.queryType 0向上查找 1向下查找(默认) 下查包含自己,上查不包含 + */ + function getTasks(query) { + store.commit('task/setShowSkeleton', false); + + const params = generateGetTaskParam(query); + uni.$catchReq.getTaskByNum(params, (err, data) => { + store.commit('task/setShowSkeleton', false); + if (err) { + // TODO: 提示错误 + console.error('err: ', err); + } else { + store.commit('task/setShowScrollTo', true); + + params.queryType === 0 ? store.commit('task/setUpRealTasks', data.list) : store.commit('task/setDownRealTasks', data.list); + params.queryType === 0 ? store.commit('task/setUpNextPage', data.nextPage) : store.commit('task/setDownNextPage', data.nextPage); // 下一页 + + const index = visibleRoles.value.findIndex(role => role.id === roleId.value); + const arr = [...allTasks.value]; + arr[index].realTasks = [...realTasks.value]; + store.commit('task/setAllTasks', arr); + store.commit('task/setCurrRoleRealTasks', arr[index].realTasks); // 设置当前角色的真实任务数据 + + // 数据处理 + dataRender(params); + } + }); + } + + function dataRender(params) { + timeLineType.value === 1 ? renderScaleTask(params) : renderConTask(params); + } + + // 刻度模式数据处理 + async function renderScaleTask(query) { + const params = generateGetTaskParam(query); + let centerData = await showTaskTime(params, tasks.value, currRoleRealTasks.value) || []; + await handleTasksData(params, centerData, currRoleRealTasks.value); + } + + // 已显示的任务第一个时间和最后一个时间 + async function showTaskTime(params, showTasks, realTasks) { + + // 初始值 + let centerData = params.queryType === 0 ? [] : realTasks.slice(0, params.pageSize); + + /** + * 1、判断显示任务中是否有真实任务 + * 1-1、有。根据id查找任务 + * 1-2、无。根据时间查找任务 + * 2、查找15个任务 + */ + const firstDetailIndex = showTasks.findIndex(task => task.detailId); + + if (firstDetailIndex > -1) { + // 显示任务中有真实任务数据 + const firstId = showTasks[firstDetailIndex].id; + let lastDetailIndex = -1; + showTasks.forEach((item, index) => { + if (item.detailId) { + lastDetailIndex = index; + } + }) + const lastId = showTasks[lastDetailIndex].id; + + realTasks.forEach((item, index) => { + if (params.queryType === 1 && item.id === lastId) { + centerData = realTasks.slice(index + 1, index + 1 + params.pageSize) || []; + } else if (params.queryType === 0 && item.id === firstId) { + if (index >= params.pageSize) { + centerData = realTasks.slice(index - params.pageSize, index) || []; + } else { + centerData = realTasks.slice(0, index) || []; + } + } + }) + } else { + // 显示任务中没有真实任务数据 + // 已显示任务的第一个任务时间 + const firstTime = showTasks.length ? showTasks[0].planStart : ''; + // 已显示任务的最后一个任务时间 + const lastTime = showTasks.length ? showTasks[showTasks.length - 1].planStart : ''; + + try { + realTasks.forEach((item, index) => { + if (params.queryType === 1) { + if (dayjs(+lastTime).isSame(+item.planStart, timeGranularity.value) || dayjs(+lastTime).isBefore(+item.planStart, timeGranularity.value)) { + centerData = realTasks.slice(index, index + params.pageSize) || []; + throw Error(); + } + } else { + if (dayjs(+firstTime).isSame(+item.planStart, timeGranularity.value) || dayjs(+firstTime).isAfter(+item.planStart, timeGranularity.value)) { + if (index >= params.pageSize) { + centerData = realTasks.slice(index - params.pageSize, index) || []; + } else { + centerData = realTasks.slice(0, index) || []; + } + } + } + }) + } catch (e) { + console.log('退出循环') + } + } + + console.log('111111111', centerData); + return centerData; + } + + async function handleTasksData(params, centerData, realTasks) { + /** + * 3、查找的任务数量是否>=15 + * 3-1、是。 + * 判断时间跨度是否>=15 + * 3-1-1、是。显示时间刻度范围内的任务 + * 3-1-2、否。显示全部任务并删除多余的刻度 + * 3-2、否。 + * 判断时间跨度是否>=15 + * 3-2-1、是。显示时间刻度范围内的任务 + * 3-2-2、否。 + * 下一页是否为0 + * 3-2-2-1、是。无下一页,显示任务和刻度,之后继续展示刻度 + * 3-2-2-1、否。查找下一页数据并重复上述步骤 + */ + const startTime = centerData.length ? centerData[0].planStart : ''; + const endTime = centerData.length ? centerData[centerData.length - 1].planStart : ''; + let centerTime = dayjs(+startTime).add(params.pageSize, timeGranularity.value); + // 时间跨度是否大于等于15 + let isExceed = dayjs(+centerTime).isBefore(+endTime, timeGranularity.value) || dayjs(+centerTime).isSame(+endTime, timeGranularity.value); + + let showTasks = tasks.value; // 显示的数据 + const nextPage = params.queryType === 0 ? upNextPage.value : downNextPage.value; // 下一页的值 + console.log('下一页', nextPage, isExceed, params.pageSize) + if (isExceed || centerData.length >= params.pageSize || nextPage === 0) { + params.queryType === 0 ? setPrevPlaceholderTasks(params) : setNextPlaceholderTasks(params); + showTasks = tasks.value; + console.log('fffffff', showTasks); + } + + if (centerData.length === 0 && nextPage === 0) { + params.queryType === 0 ? setPrevPlaceholderTasks(params) : setNextPlaceholderTasks(params); + showTasks = tasks.value; + console.log('ccccc', showTasks); + } else { + console.log('ttttttttt', showTasks); + const firstDetailIndex = showTasks.findIndex(task => task.detailId); // 显示任务中存在真实任务 + const firstId = firstDetailIndex > -1 ? showTasks[firstDetailIndex].id : ''; + let lastDetailIndex = -1; + showTasks.forEach((item, index) => { + if (item.detailId) { + lastDetailIndex = index; + } + }) + const lastId = lastDetailIndex > -1 ? showTasks[lastDetailIndex].id : ''; + + showTasks.forEach((task, index) => { + const arr = centerData.filter(item => dayjs(+item.planStart).isSame(+task.planStart, timeGranularity.value)); + if (arr && arr.length) { + if (firstDetailIndex > -1) { + if (params.queryType === 1 && task.id === lastId) { + showTasks.splice(index + 1, 0, [...arr]) + } else if (params.queryType === 0 && task.id === firstId) { + showTasks.splice(index, 0, [...arr]) + } + } else { + showTasks.splice(index, 1, [...arr]); + } + } + }) + + showTasks = flatten(showTasks); // 1维拍平 + + if (!isExceed) { + if (centerData.length < params.pageSize && nextPage > 0) { + await getTasks({pageNum: nextPage, queryType: params.queryType}); + console.log('oooooooo', showTasks); + return; + } + + if (centerData.length) { + let len = 0; + let data = params.queryType === 0 ? centerData[0] : centerData[centerData.length - 1]; + showTasks.forEach((item, index) => { + if (item.id === data.id) { + len = index; + } + }) + + showTasks = params.queryType === 0 ? showTasks.slice(len) : showTasks.slice(0, len + 1); + } + } + } + + if (showTasks.length > 80) { + showTasks = params.queryType === 0 ? showTasks.slice(0, 80) : showTasks.slice(showTasks.length - 80); + } + + store.commit('task/clearTasks'); + params.queryType === 0 ? store.commit('task/setUpTasks', showTasks) : store.commit('task/setDownTasks', showTasks); + } + + // 任务模式 + async function renderConTask(params) { + let nextPage = params.queryType === 0 ? upNextPage.value : downNextPage.value; // 下一页的值 + let showTasks = tasks.value; + let centerData = await showTaskId(params, showTasks, realTasks.value) || []; + + if (centerData.length < 15 && nextPage > 0) { + getTasks({pageNum: nextPage, queryType: params.queryType}); + } else { + if (params.queryType === 0) { + showTasks = [...centerData, ...showTasks]; + } else { + showTasks = [...showTasks, ...centerData]; + } + } + + if (showTasks.length < 15 && nextPage === 0 && params.queryType === 1) { + getTasks({pageNum: 1, queryType: 0}); + } + + if (showTasks.length > 80) { + showTasks = params.queryType === 0 ? showTasks.slice(0, 80) : showTasks.slice(showTasks.length - 80); + } + + store.commit('task/clearTasks'); + params.queryType === 0 ? store.commit('task/setUpTasks', showTasks) : store.commit('task/setDownTasks', showTasks); + } + + // 设置时间轴向上的空数据 + function setPrevPlaceholderTasks() { + store.commit('task/setTopEnd', true); + let startTime = ''; + if (!tasks.value || !tasks.value.length) { + startTime = Date.now(); // 没有任务就应该是时间基准点 + } else { + startTime = tasks.value[0].planStart - 0; // 有任务就是第一个任务的计划开始时间 + } + const placeholderTasks = uni.$task.setPlaceholderTasks(startTime, true, timeGranularity.value); + store.commit('task/setCurrUpTimeNode', startTime); + store.commit('task/setUpTasks', placeholderTasks); + } + + // 设置时间轴向下的空数据 + function setNextPlaceholderTasks(params) { + // store.commit('task/setBottomEnd', true); + console.log('ddddddddd') + let startTime = ''; + if (!tasks.value || !tasks.value.length) { + startTime = Date.now(); + } else { + startTime = dayjs(+tasks.value[tasks.value.length - 1].planStart).add(1, timeGranularity.value).valueOf(); + } + + if (params.taskId) { + realTasks.value.forEach(item => { + if (item.id === params.taskId) { + startTime = Number(item.planStart); + } + }) + } + + const initData = uni.$task.setPlaceholderTasks(startTime, false, timeGranularity.value); + store.commit('task/setCurrDownTimeNode', startTime); + store.commit('task/setDownTasks', initData); + } + + /** + * 当日常任务发生变化时 + * 将新获取到的日常任务放在allTasks里 + */ + watch(tasks, newValue => { + // 添加到allTasks里 + const index = visibleRoles.value.findIndex(role => role.id === roleId.value); + const arr = [...allTasks.value]; + arr[index].task = [...newValue]; + store.commit('task/setAllTasks', arr); + }); + + return { + initPlanTasks, + getTasks, + dataRender + } +} diff --git a/hooks/project/useGetTasks.js b/hooks/project/useGetTasks.js index 876eb44..0f104ad 100644 --- a/hooks/project/useGetTasks.js +++ b/hooks/project/useGetTasks.js @@ -24,9 +24,14 @@ export default function useGetTasks() { const remindData = computed(() => store.state.socket.remindData); // 小红点 + const currRoleRealTasks = computed(() => store.state.task.currRoleRealTasks); // 当前角色的真实任务数据 + const currLocationTaskId = computed(() => store.state.socket.currLocationTaskId); + // 初始化 定期任务 async function initPlanTasks() { + if (timeLineType.value === 1) setNextPlaceholderTasks({}); await getTasks({}); // 获取初始数据 + // await dataRender({}); } /** @@ -36,11 +41,12 @@ export default function useGetTasks() { function generateGetTaskParam(query) { return { roleId: roleId.value, + timeNode: query.timeNode || timeNode.value, timeUnit: query.timeUnit || timeUnit.value, queryType: query.queryType === 0 ? 0 : 1, pageNum: query.pageNum || 1, pageSize: query.pageSize || uni.$taskConfig.pageCount, - taskId: query.taskId || '' + taskId: query.taskId || currLocationTaskId.value }; } @@ -72,6 +78,12 @@ export default function useGetTasks() { const arr = [...allTasks.value]; arr[index].realTasks = [...realTasks.value]; store.commit('task/setAllTasks', arr); + store.commit('task/setCurrRoleRealTasks', arr[index].realTasks); // 设置当前角色的真实任务数据 + + if (!tasks.value || !tasks.value.length && timeLineType.value === 1) { + setNextPlaceholderTasks(params); + } + // 数据处理 dataRender(params); } @@ -82,165 +94,168 @@ export default function useGetTasks() { timeLineType.value === 1 ? renderScaleTask(params) : renderConTask(params); } - // 任务模式 - async function renderConTask(params) { - let nextPage = params.queryType === 0 ? upNextPage.value : downNextPage.value; // 下一页的值 - let showTasks = tasks.value; - let centerData = await showTaskId(params, showTasks, realTasks.value) || []; - - if (centerData.length < 15 && nextPage > 0) { - getTasks({pageNum: nextPage, queryType: params.queryType}); - } else { - if (params.queryType === 0) { - showTasks = [...centerData, ...showTasks]; - } else { - showTasks = [...showTasks, ...centerData]; - } - } - - if (showTasks.length < 15 && nextPage === 0 && params.queryType === 1) { - getTasks({pageNum: 1, queryType: 0}); - } - - if (showTasks.length > 80) { - showTasks = params.queryType === 0 ? showTasks.slice(0, 80) : showTasks.slice(showTasks.length - 80); - } - - store.commit('task/clearTasks'); - params.queryType === 0 ? store.commit('task/setUpTasks', showTasks) : store.commit('task/setDownTasks', showTasks); - } - // 刻度模式数据处理 - async function renderScaleTask(params) { - params.queryType === 0 ? setPrevPlaceholderTasks(params) : setNextPlaceholderTasks(params); + async function renderScaleTask(query) { + const params = generateGetTaskParam(query); + let centerData = await showTaskTime(params, tasks.value, currRoleRealTasks.value) || []; + await handleTasksData(params, centerData, currRoleRealTasks.value); + } - const index = visibleRoles.value.findIndex(role => role.id === roleId.value); - let currRoleRealTasks = []; - if (allTasks.value[index].realTasks) { - currRoleRealTasks = allTasks.value[index].realTasks; - } + // 已显示的任务第一个时间和最后一个时间 + async function showTaskTime(params, showTasks, realTasks) { + /** + * 1、判断显示任务中是否有真实任务 + * 1-1、有。根据id查找任务 + * 1-2、无。根据时间查找任务 + * 2、查找15个任务 + */ + + // 初始值 + // 显示任务中没有真实任务数据 + let centerData = realTasks.slice(0, params.pageSize); + const firstDetailIndex = showTasks.findIndex(task => task.detailId); + if (firstDetailIndex > -1) { + // 显示任务中有真实任务数据 + const firstId = showTasks[firstDetailIndex].id; + let lastDetailIndex = -1; + showTasks.forEach((item, index) => { + if (item.detailId) { + lastDetailIndex = index; + } + }) + const lastId = showTasks[lastDetailIndex].id; - let currRoleShowTasks = []; - if (allTasks.value[index].tasks) { - currRoleShowTasks = allTasks.value[index].tasks; + realTasks.forEach((item, index) => { + if (params.queryType === 1 && item.id === lastId) { + centerData = realTasks.slice(index + 1, index + 1 + params.pageSize); + } else if (params.queryType === 0 && item.id === firstId) { + centerData = index >= params.pageSize ? realTasks.slice(index - params.pageSize, index) : realTasks.slice(0, index); + } + }) } - let centerData = await showTaskId(params, tasks.value, realTasks.value) || []; - tasksData(params, centerData, currRoleRealTasks); - } - - // 已显示的任务第一个id和最后一个id - function showTaskId(params, showTasks, realTasks) { - const firstDetailIndex = showTasks.findIndex(task => task.detailId); - const firstId = firstDetailIndex === -1 ? 0 : showTasks[firstDetailIndex].id; - let lastDetailIndex = -1; - showTasks.forEach((item, index) => { - if (item.detailId) { - lastDetailIndex = index; - } - }) - const lastId = lastDetailIndex === -1 ? 0 : showTasks[lastDetailIndex].id; - - let centerData = params.queryType === 0 ? [] : realTasks.slice(0, params.pageSize); - realTasks.forEach((item, index) => { - if (params.queryType === 1 && item.id === lastId) { - centerData = realTasks.slice(index + 1, index + 1 + params.pageSize) || []; - } else if (params.queryType === 0 && item.id === firstId) { - centerData = realTasks.slice(index - params.pageSize, index) || []; - } - }) return centerData; } - /** - * 刻度模式数据处理 - * 大于等于15天,真实数据的时间跨度 - * 或大于等于15条,真实数据的数量 - * 不用重新加载数据 - * @param {Object} params - */ - function tasksData(params, centerData, realTasks) { - let param = generateGetTaskParam(params); + async function handleTasksData(params, centerData, realTasks) { + /** + * 3、查找的任务数量是否>=15 + * 3-1、是。 + * 判断时间跨度是否>=15 + * 3-1-1、是。显示时间刻度范围内的任务 + * 3-1-2、否。显示全部任务并删除多余的刻度 + * 3-2、否。 + * 判断时间跨度是否>=15 + * 3-2-1、是。显示时间刻度范围内的任务 + * 3-2-2、否。 + * 下一页是否为0 + * 3-2-2-1、是。无下一页,显示任务和刻度,之后继续展示刻度 + * 3-2-2-1、否。查找下一页数据并重复上述步骤 + */ let showTasks = tasks.value; // 显示的数据 - let nextPage = param.queryType === 0 ? upNextPage.value : downNextPage.value; // 下一页的值 - - // 判断条件 - let isAccordTerm1 = false, isAccordTerm2 = false; - if (centerData.length > 0) { - // 1.数据数量>=15条 - isAccordTerm1 = centerData.length >= param.pageSize; - - // 2.数据最后一条数据时间>=当前查询的时间 - if (param.queryType === 0) { - let firstData = dayjs(centerData[0].planStart).add(param.pageSize, timeGranularity.value); - isAccordTerm2 = dayjs(+firstData).isBefore(+currUpTimeNode.value, timeGranularity.value) || dayjs(+firstData).isSame(+currUpTimeNode.value, timeGranularity.value); + const nextPage = params.queryType === 0 ? upNextPage.value : downNextPage.value; // 下一页的值 + if (centerData.length) { + let centerDataTime = '', // 中间数据的时间 + scaleTime = '', // 空时间节点的开始时间 + centerTime = '', // 中间数据+/-15后的数据 + isExceed = false; // 时间跨度是否大于15 + + if (params.queryType) { + centerDataTime = centerData[centerData.length - 1].planStart; + scaleTime = currDownTimeNode.value; + centerTime = dayjs(+centerDataTime).subtract(params.pageSize, timeGranularity.value); + isExceed = dayjs(+centerTime).isSame(+scaleTime, timeGranularity.value) || dayjs(+centerTime).isAfter(+scaleTime, timeGranularity.value) } else { - let lastData = dayjs(centerData[centerData.length - 1].planStart).subtract(param.pageSize, timeGranularity.value); - isAccordTerm2 = dayjs(+lastData).isAfter(+currDownTimeNode.value, timeGranularity.value) || dayjs(+lastData).isSame(+currDownTimeNode.value, timeGranularity.value); + centerDataTime = centerData[0].planStart; + scaleTime = currUpTimeNode.value; + centerTime = dayjs(+centerDataTime).add(params.pageSize, timeGranularity.value); + isExceed = dayjs(+centerTime).isSame(+scaleTime, timeGranularity.value) || dayjs(+centerTime).isBefore(+scaleTime, timeGranularity.value) } - } - // 3.下一页===0 - // 不需要添加新数据 - if (!isAccordTerm1 && !isAccordTerm2 && nextPage > 0) { - getTasks({pageNum: nextPage, queryType: param.queryType}); - } else { - let tasksArr = [], isReplace = false, firstIndex = -1, selctedIndex = -1, replaceTime = 0; + const firstDetailIndex = showTasks.findIndex(task => task.detailId); // 显示任务中存在真实任务 + const firstId = firstDetailIndex > -1 ? showTasks[firstDetailIndex].id : ''; + let lastDetailIndex = -1; + showTasks.forEach((item, index) => { + if (item.detailId) { + lastDetailIndex = index; + } + }) + const lastId = lastDetailIndex > -1 ? showTasks[lastDetailIndex].id : ''; + showTasks.forEach((task, index) => { const arr = centerData.filter(item => dayjs(+item.planStart).isSame(+task.planStart, timeGranularity.value)); - if (arr && arr.length) { - if (task.detailId) { - // 新数据与旧数据时间有重叠 - if (param.queryType === 1) { - selctedIndex = index; - tasksArr = [...arr]; - } else { - firstIndex = showTasks.findIndex(data => dayjs(+data.planStart).isSame(+task.planStart, timeGranularity.value)); - } + if (arr.length) { + if (params.queryType === 1 && task.id === lastId) { + showTasks.splice(index + 1, 0, [...arr]) + } else if (params.queryType === 0 && task.id === firstId) { + showTasks.splice(index, 0, [...arr]) } else { - showTasks.splice(index, 1, [...arr]); + showTasks.splice(index, 1, [...arr]) } } }) - if (selctedIndex) { - showTasks.splice(selctedIndex + 1, 0, [...tasksArr]) - } + showTasks = flatten(showTasks); // 1维拍平 - if (firstIndex) { - showTasks.splice(firstIndex, 0, [...tasksArr]) - } + if (!isExceed) { + if (centerData.length >= params.pageSize) { + let len = -1; + let data = params.queryType === 0 ? centerData[0] : centerData[centerData.length - 1]; + showTasks.forEach((item, index) => { + if (item.id === data.id) { + len = index; + } + }) - showTasks.forEach((task, index) => { - const arr = centerData.filter(item => dayjs(+item.planStart).isSame(+task.planStart, timeGranularity.value)); - if (arr && arr.length) { - if (!task.detailId) { // 新数据与旧数据时间有重叠 - showTasks.splice(index, 1, [...arr]); // 这里加入的数据是array类型的, [{},{},[],[],{}] + if (len > -1) { + showTasks = params.queryType === 0 ? showTasks.slice(len) : showTasks.slice(0, len + 1); } + } else if (nextPage > 0) { + getTasks({pageNum: nextPage, queryType: params.queryType}); } - }) + } + } else { + if (nextPage > 0) { + getTasks({pageNum: nextPage, queryType: params.queryType}); + } else { + params.queryType === 0 ? setPrevPlaceholderTasks(params) : setNextPlaceholderTasks(params); + } + } - showTasks = flatten(showTasks); // 1维拍平 + if (showTasks.length > 80) { + showTasks = params.queryType === 0 ? showTasks.slice(0, 80) : showTasks.slice(showTasks.length - 80); + } - if (isAccordTerm1 && !isAccordTerm2) { - let len = 0; - let data = param.queryType === 0 ? centerData[0] : centerData[centerData.length - 1]; - showTasks.forEach((item, index) => { - if (item.id === data.id) { - len = index; - } - }) + store.commit('task/clearTasks'); + params.queryType === 0 ? store.commit('task/setUpTasks', showTasks) : store.commit('task/setDownTasks', showTasks); + } - showTasks = param.queryType === 0 ? showTasks.slice(len) : showTasks.slice(0, len + 1); - } + // 任务模式 + async function renderConTask(params) { + let nextPage = params.queryType === 0 ? upNextPage.value : downNextPage.value; // 下一页的值 + let showTasks = tasks.value; + let centerData = await showTaskTime(params, showTasks, currRoleRealTasks.value) || []; - if (showTasks.length > 80) { - showTasks = param.queryType === 0 ? showTasks.slice(0, 80) : showTasks.slice(showTasks.length - 80); + if (centerData.length < 15 && nextPage > 0) { + getTasks({pageNum: nextPage, queryType: params.queryType}); + } else { + if (params.queryType === 0) { + showTasks = [...centerData, ...showTasks]; + } else { + showTasks = [...showTasks, ...centerData]; } } + if (showTasks.length < 15 && nextPage === 0 && params.queryType === 1) { + getTasks({pageNum: 1, queryType: 0}); + } + + if (showTasks.length > 80) { + showTasks = params.queryType === 0 ? showTasks.slice(0, 80) : showTasks.slice(showTasks.length - 80); + } + store.commit('task/clearTasks'); - param.queryType === 0 ? store.commit('task/setUpTasks', showTasks) : store.commit('task/setDownTasks', showTasks); + params.queryType === 0 ? store.commit('task/setUpTasks', showTasks) : store.commit('task/setDownTasks', showTasks); } // 设置时间轴向上的空数据 @@ -268,7 +283,7 @@ export default function useGetTasks() { } if (params.taskId) { - realTasks.value.forEach(item => { + currRoleRealTasks.value.forEach(item => { if (item.id === params.taskId) { startTime = Number(item.planStart); } @@ -296,5 +311,5 @@ export default function useGetTasks() { initPlanTasks, getTasks, dataRender - }; + } } diff --git a/pages/project/project.vue b/pages/project/project.vue index 48c5d26..0b87da1 100644 --- a/pages/project/project.vue +++ b/pages/project/project.vue @@ -103,25 +103,28 @@ watch([allTasks, remindData], () => { if (item.task) { item.task.forEach(task => { task.remindNum = 0; - - task.plugins.forEach(pluginArr => { - pluginArr.forEach(plugin => { - plugin.remindNum = 0; - remindData.value.forEach(remind => { - const remind_data = JSON.parse(remind.data); - - if (item.role.id === remind_data.data.roleId) { - if (remind_data.data.taskId === task.id) { - task.remindNum++; + + if (task.plugins) { + task.plugins.forEach(pluginArr => { + pluginArr.forEach(plugin => { + plugin.remindNum = 0; + remindData.value.forEach(remind => { + const remind_data = JSON.parse(remind.data); + + if (item.role.id === remind_data.data.roleId) { + if (remind_data.data.taskId === task.id) { + task.remindNum++; + } + + if (remind_data.data.taskId === task.id && remind_data.data.pluginId === plugin.pluginTaskId) { + plugin.remindNum++; + } } - - if (remind_data.data.taskId === task.id && remind_data.data.pluginId === plugin.pluginTaskId) { - plugin.remindNum++; - } - } + }) }) }) - }) + } + }) } }) @@ -136,8 +139,8 @@ watch([allTasks, remindData], () => { * 注意: 切换角色后 重新设置了时间基准点 时间基准点一定会变 * 所以监听时间基准点获取 可变日常任务即可 这里不用获取 避免重复获取 */ -watch(roleId, newValue => { - if (newValue) { +watch(roleId, () => { + if (roleId.value) { // 判断如果allTasks里有就不用加了 if ( allTasks.value.length @@ -147,6 +150,13 @@ watch(roleId, newValue => { ) return; store.commit('task/setTimeNode', Date.now()); + + let currRoleRealTasks = []; + if (allTasks.value.length) { + const index = visibleRoles.value.findIndex(role => role.id === roleId.value); + currRoleRealTasks = allTasks.value[index].realTasks || []; + } + store.commit('task/setCurrRoleRealTasks', currRoleRealTasks); // 设置当前角色的真实任务数据 } }); diff --git a/store/task/mutations.js b/store/task/mutations.js index ee9647b..dd2bd9a 100644 --- a/store/task/mutations.js +++ b/store/task/mutations.js @@ -335,6 +335,15 @@ const mutations = { setAllTasks(state, data) { state.allTasks = data || []; }, + + /** + * 设置当前角色的真实任务数据 + * @param {Object} state + * @param {Array} data 服务端返回的模板数组 + */ + setCurrRoleRealTasks(state, data) { + state.currRoleRealTasks = data || []; + }, }; export default mutations;