Browse Source

feat: 时间轴数据处理

text-draggable
xuesinan 4 years ago
parent
commit
142eb8a24d
  1. 6
      src/components/tall/center/Global.vue
  2. 306
      src/components/tall/center/Index.vue
  3. 218
      src/components/tall/center/RegularTask.vue
  4. 69
      src/store/tall/task/index.js
  5. 1
      src/utils/task.js

6
src/components/tall/center/Global.vue

@ -8,8 +8,8 @@
<template v-if="globals.length > 0">
<div class="global-task cursor-pointer" v-for="(item, index) in globals" :key="index" @click="toDetail(item)">
<template v-if="item.plugins && item.plugins.length">
<div v-for="(pluginArr, i) in item.plugins" :key="i" class="pb-3">
<template v-if="pluginArr.length">
<div v-for="(pluginArr, i) in item.plugins" :key="i">
<div class="pb-3" v-if="pluginArr.length">
<Plugin
v-for="plugin in pluginArr"
:key="plugin.pluginTaskId"
@ -21,7 +21,7 @@
:style-type="plugin.styleType || 0"
:task="item"
/>
</template>
</div>
</div>
</template>

306
src/components/tall/center/Index.vue

@ -19,7 +19,7 @@
</div> -->
<!-- 日常任务 -->
<Global />
<Global ref="globalRef" />
<!-- <div class="global">
<div class="global-box" v-if="permanents && permanents.length > 0">
<div class="global-task cursor-pointer" v-for="(item, index) in permanents" :key="index" @click="toGlobalDetail(item)">
@ -31,7 +31,7 @@
</div> -->
<!-- 定期任务 -->
<RegularTask />
<RegularTask :style="{ height: tasksHeight + 'px' }" />
<!-- <div class="task-list" :style="{ height: 'calc(100vh - 160px - (' + globalHeight + 'px))' }">
<div class="task-box" v-for="(item, index) in regularTasks" :key="index">
<div class="task-time flex items-center justify-between">
@ -65,191 +65,47 @@
</template>
<script setup>
import { computed, watch } from 'vue';
import { computed, watch, ref } from 'vue';
import { useStore } from 'vuex';
// import dayjs from 'dayjs';
// import { ReloadOutlined, MoreOutlined, PlayCircleOutlined } from '@ant-design/icons-vue';
import { ReloadOutlined, MoreOutlined } from '@ant-design/icons-vue';
// import { message } from 'ant-design-vue';
// import { findShowRole, getPermanent, getRegularTask, findSonTask } from 'apis';
// import Roles from './Roles.vue'; //
// import Global from './Global.vue'; //
// import RegularTask from './RegularTask.vue'; //
const store = useStore();
const project = computed(() => store.state.projects.project); //
const roleId = computed(() => store.state.role.roleId); //
// const sessionRoles = sessionStorage.getItem('roles'); //
// const roles = computed(() => store.state.role.visibleRoles); //
// const permanents = computed(() => store.state.task.permanents); //
// const sessionPermanents = sessionStorage.getItem('permanents'); //
// const globalHeight = computed(() => store.state.task.globalHeight); //
// const sessionGlobalHeight = sessionStorage.getItem('globalHeight'); //
// const regularTasks = computed(() => store.state.task.regularTasks); //
// const taskObj = reactive({ tasks: [] }); //
const sessionTasks = sessionStorage.getItem('regularTasks'); //
const refreshProjects = computed(() => store.state.layout.refreshProjects); //
// if (sessionRoles) {
// const roleArr = JSON.parse(sessionRoles);
// store.commit('role/setVisibleRoles', roleArr);
// setInitialRoleId(roleArr);
// }
// if (sessionPermanents) {
// const arr = JSON.parse(sessionPermanents);
// store.commit('task/setPermanents', arr);
// }
// if (sessionGlobalHeight) {
// store.commit('task/setGlobalHeight', sessionGlobalHeight);
// }
const globals = computed(() => store.getters['task/globals']); //
const globalRef = ref(null);
const globalHeight = ref(0);
const clientHeight = ref(0); //
const tasksHeight = ref(null); //
watch(globals, () => {
clientHeight.value = `${document.documentElement.clientHeight}`; //
globalHeight.value = globalRef.value.$el.clientHeight;
tasksHeight.value = clientHeight.value - 48 - 44 - 36 - globalHeight.value;
console.log('globalHeight', globalHeight.value, clientHeight.value, tasksHeight.value);
});
if (sessionTasks) {
const arr = JSON.parse(sessionTasks);
store.commit('task/setRegularTasks', arr);
}
init();
watch(project, async () => {
if (project.value.id) {
await getRoles(project.value.id); // id
await getPermanentData(roleId.value); //
await getTasks({ roleId: roleId.value }); //
}
});
watch(refreshProjects, async () => {
if (project.value.id) {
await getRoles(project.value.id); // id
await getPermanentData(roleId.value); //
await getTasks({ roleId: roleId.value }); //
}
});
//
async function init() {
if (project.value) {
await getRoles(project.value.id); // id
await getPermanentData(roleId.value); // ;
await getTasks({ roleId: roleId.value }); //
}
}
/** id
* @param {string} projectId
* @param {object} params 提交的参数
*/
async function getRoles(params) {
console.log(params);
// try {
// const { url } = store.state.projects.project;
// const data = await findShowRole(params, url);
// store.commit('role/setInvisibleRoles', data ? data.invisibleList : []);
// store.commit('role/setVisibleRoles', data ? data.visibleList : []);
// setInitialRoleId(data ? data.visibleList : []);
// } catch (error) {
// message.info(error);
// throw new Error(error);
// }
}
//
// function setInitialRoleId(visibleList) {
// if (!visibleList || !visibleList.length) return;
// const index = visibleList.findIndex(item => +item.mine === 1);
// const currentRole = index > 0 ? visibleList[index] : visibleList[0];
// const currentRoleId = currentRole ? currentRole.id : '';
// store.commit('role/setRoleId', currentRoleId);
// }
//
async function getPermanentData(id) {
console.log(id);
// const params = { param: { roleId: id } };
// try {
// const data = await getPermanent(params);
// store.commit('task/setPermanents', data);
// const height = data.length * 38 + 26;
// store.commit('task/setGlobalHeight', height);
// } catch (error) {
// message.info(error);
// throw new Error(error);
// }
}
//
// function toGlobalDetail(item) {
// store.commit('task/setTaskDetail', item);
// store.commit('layout/setListStatus', false);
// store.commit('task/setIntellectualId', '');
// store.commit('task/setMeetId', '');
// store.commit('task/setSubMeetId', '');
// }
/**
* 根据时间基准点和角色查找定期任务
* @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向下查找(默认) 下查包含自己上查不包含
*/
async function getTasks(query) {
console.log(query);
// const params = { param: query };
// try {
// const data = await getRegularTask(params);
// taskObj.tasks = data;
// data.forEach(item => {
// item.plugins.forEach(val => {
// if (Number(val[0].pluginId) === 6) {
// getSonTask(item.detailId);
// }
// });
// });
// store.commit('task/setRegularTasks', data);
// } catch (error) {
// message.info(error);
// throw new Error(error);
// }
}
// id
// async function getSonTask(id) {
// const params = { param: { detailId: id } };
// try {
// const data = await findSonTask(params);
// taskObj.tasks.forEach(item => {
// if (item.detailId === id) {
// item.sonList = data;
// }
// });
// store.commit('task/setRegularTasks', taskObj.tasks);
// } catch (error) {
// message.info(error);
// throw new Error(error);
// watch(project, async () => {
// if (project.value.id) {
// await getRoles(project.value.id); // id
// await getPermanentData(roleId.value); //
// await getTasks({ roleId: roleId.value }); //
// }
// }
// });
// function toDetail(item) {
// store.commit('task/setTaskDetail', item);
// store.commit('task/sonDetailId', '');
// store.commit('task/sonExperimentationId', '');
// store.commit('layout/setListStatus', false);
// }
// function toSonDetail(item, id) {
// store.commit('task/setTaskDetail', item);
// store.commit('task/sonDetailId', id);
// store.commit('task/sonExperimentationId', id);
// store.commit('layout/setListStatus', false);
// }
// watch(refreshProjects, async () => {
// if (project.value.id) {
// await getRoles(project.value.id); // id
// await getPermanentData(roleId.value); //
// await getTasks({ roleId: roleId.value }); //
// }
// });
</script>
<style scoped>
@ -268,108 +124,4 @@ async function getTasks(query) {
margin-left: 16px;
cursor: pointer;
}
.role-list {
padding: 0 16px;
height: 36px;
border-bottom: 1px solid #cccccc;
}
.role-box {
margin-right: 16px;
height: 36px;
}
.role-name {
font-size: 14px;
line-height: 36px;
color: #333333;
}
.role-name.mine {
font-weight: 600;
color: #1890ff;
}
.role-box .line-box {
width: 100%;
bottom: 0;
}
.line-box .line {
width: 16px;
height: 2px;
background-color: #1890ff;
}
.global {
padding: 16px;
}
.global-box {
border: 1px solid #cccccc;
border-radius: 10px;
padding: 12px 16px;
}
.global-task {
padding: 8px 0;
line-height: 22px;
}
.task-list {
padding: 0 16px 50px;
overflow-y: auto;
}
.task-time {
height: 32px;
}
.task-time .anticon {
margin-right: 16px;
}
.task-time span {
font-size: 14px;
color: #595959;
}
.task-info {
margin: 8px 0;
padding-left: 11px;
}
.task-info > div {
padding-left: 27px;
border-left: 1px solid #d2d2d2;
}
.task-info .task-card {
padding: 16px;
border-radius: 8px;
-moz-box-shadow: 0px 3px 6px 0px rgba(0, 0, 0, 0.12);
-webkit-box-shadow: 0px 3px 6px 0px rgba(0, 0, 0, 0.12);
box-shadow: 0px 3px 6px 0px rgba(0, 0, 0, 0.12);
}
.task-con {
margin-top: 16px;
padding-left: 16px;
}
.task-con > div {
height: 30px;
}
:deep(.ant-checkbox + span) {
color: #607d8b;
}
.son-task-name {
color: #607d8b;
}
.task-list::-webkit-scrollbar {
width: 0 !important;
}
</style>

218
src/components/tall/center/RegularTask.vue

@ -4,7 +4,7 @@
<div class="task-time flex items-center justify-between">
<div class="flex items-center">
<PlayCircleOutlined style="font-size: 23px; color: #999999" />
<span>{{ dayjs(item.planStart).format('D日 HH:mm') }}</span>
<span>{{ dayjs(item.planStart).format('M月D日 HH:mm') }}</span>
</div>
<div class="task-action"></div>
</div>
@ -35,12 +35,12 @@
</template>
<script setup>
import { computed, watch } from 'vue';
import { computed, watch, onMounted } from 'vue';
import { useStore } from 'vuex';
import dayjs from 'dayjs';
import uTask from 'utils/task';
import { PlayCircleOutlined } from '@ant-design/icons-vue';
// import { getRegularTask } from 'apis';
import { getRegularTask } from 'apis';
import { message } from 'ant-design-vue';
const store = useStore();
@ -48,16 +48,22 @@ const project = computed(() => store.state.projects.project); // 项目信息
const roleId = computed(() => store.state.role.roleId); //
// const regularTasks = computed(() => store.state.task.regularTasks); //
const tasks = computed(() => store.state.task.tasks); //
const realTasks = computed(() => store.state.task.realTasks); //
const timeNode = computed(() => store.state.task.timeNode); //
const timeUnit = computed(() => store.state.task.timeUnit); //
const currLocationTaskId = computed(() => store.state.task.currLocationTaskId); // id
const businessCode = computed(() => store.state.task.businessCode); //
const timeGranularity = computed(() => store.getters['task/timeGranularity']); //
const timeLineType = computed(() => store.state.task.timeLineType); //
const downNextPage = computed(() => store.state.task.downNextPage); //
const upNextPage = computed(() => store.state.task.upNextPage); //
setNextPlaceholderTasks(); //
onMounted(() => {
window.addEventListener('scroll', handleScroll, true);
});
if (project.value && roleId.value) {
getTasks({ roleId: roleId.value }); //
}
@ -68,6 +74,26 @@ watch([project, roleId], async () => {
}
});
//
function handleScroll(e) {
// scrollTop
const { scrollTop } = e.target;
// windowHeight
const windowHeight = e.target.clientHeight;
// scrollHeight
const { scrollHeight } = e.target;
//
if (scrollTop + windowHeight === scrollHeight) {
//
setNextPlaceholderTasks(); //
}
//
if (scrollTop === 0) {
setPrevPlaceholderTasks(); //
}
}
/**
* 根据时间基准点和角色查找定期任务
* @param {object} query
@ -78,12 +104,21 @@ watch([project, roleId], async () => {
* @param {number} query.queryType 0向上查找 1向下查找(默认) 下查包含自己上查不包含
*/
async function getTasks(query) {
const params = generateGetTaskParam(query);
// const { url } = store.state.projects.project;
const params = { param: generateGetTaskParam(query) };
const { url } = store.state.projects.project;
try {
console.log(params);
// const data = await getRegularTask(params, url);
// store.commit('task/setRegularTasks', data);
const data = await getRegularTask(params, url);
store.commit('task/setRegularTasks', data);
if (params.param.queryType === 0) {
store.commit('task/setUpRealTasks', data.list);
store.commit('task/setUpNextPage', data.nextPage); //
} else {
store.commit('task/setDownRealTasks', data.list);
store.commit('task/setDownNextPage', data.nextPage); //
}
dataRender(params.param);
} catch (error) {
message.info(error);
throw new Error(error);
@ -108,22 +143,156 @@ function generateGetTaskParam(query) {
};
}
//
function dataRender(params) {
timeLineType.value === 1 ? renderScaleTask(params) : renderConTask(params);
}
//
async function renderScaleTask(query) {
const params = generateGetTaskParam(query);
//
const centerData = (await showTaskTime(params, realTasks.value, tasks.value)) || [];
console.log('centerData', centerData);
await handleTasksData(params, centerData, realTasks.value);
}
//
function renderConTask(params) {
console.log(params);
}
/**
* 正待处理的真实数据
*/
async function showTaskTime(params, reals, showTasks) {
// --
let centerData = [];
if (reals.length > params.pageSize && params.queryType === 0) {
centerData = reals.slice(reals.length - params.pageSize);
} else {
centerData = reals.slice(0, params.pageSize);
}
//
const firstDetailIndex = showTasks.findIndex(task => task.detailId); //
if (firstDetailIndex > -1) {
const firstId = showTasks[firstDetailIndex].id; // id
//
let lastDetailIndex = -1;
showTasks.forEach((item, index) => {
if (item.detailId) {
lastDetailIndex = index;
}
});
const lastId = showTasks[lastDetailIndex].id; // 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) {
centerData = index >= params.pageSize ? realTasks.slice(index - params.pageSize, index) : realTasks.slice(0, index);
}
});
}
return centerData;
}
//
async function handleTasksData(params, centerData) {
const showTasks = tasks.value;
//
const firstTime = showTasks.length > 0 ? showTasks[0].planStart : new Date().getTime();
const upTargetTime = dayjs(+firstTime).subtract(params.pageSize, timeGranularity.value); //
//
const lastTime =
showTasks.length > 0 ? dayjs(+showTasks[showTasks.length - 1].planStart).add(1, timeGranularity.value) : new Date().getTime();
const downTargetTime = dayjs(+lastTime).add(params.pageSize - 1, timeGranularity.value); //
const nextPage = params.queryType === 0 ? upNextPage.value : downNextPage.value; //
if (centerData.length) {
const arr = [];
centerData.forEach(v => {
// const centerTime = ''; // +/-15
let isExceed = false; // 15
if (params.queryType) {
isExceed = dayjs(+downTargetTime).isAfter(+v.planStart, timeGranularity.value);
} else {
isExceed = dayjs(+upTargetTime).isBefore(+v.planStart, timeGranularity.value);
}
if (isExceed) {
arr.push(v);
}
});
if (arr.length) {
if (arr.length === centerData.length && centerData.length < params.pageSize && nextPage > 0) {
getTasks({ pageNum: nextPage, queryType: params.queryType });
} else {
let newArr = [];
let breakTime = ''; //
let continueTime = ''; //
//
const currTime = params.queryType === 0 ? upTargetTime : lastTime;
// < centerData
//
// centerData < 15
// 15
// params.pageSize
// centerData = 15
//
//
// =
if (arr.length === centerData.length && centerData.length === params.pageSize) {
if (params.queryType === 0) {
continueTime = arr[0].planStart;
} else {
breakTime = arr[arr.length - 1].planStart;
}
}
console.log(currTime, breakTime, continueTime);
//
const sameTime = params.queryType === 0 ? firstTime : dayjs(+lastTime).subtract(1, timeGranularity.value);
//
const firstArr = arr.filter(item => dayjs(+item.planStart).isSame(+sameTime, timeGranularity.value));
console.log(sameTime, arr, newArr);
if (firstArr.length && params.queryType === 1) {
newArr = [...newArr, ...firstArr];
}
}
} else {
params.queryType === 0 ? setPrevPlaceholderTasks(params) : setNextPlaceholderTasks(params);
}
} else if (nextPage > 0) {
getTasks({ pageNum: nextPage, queryType: params.queryType });
} else {
params.queryType === 0 ? setPrevPlaceholderTasks(params) : setNextPlaceholderTasks(params);
}
}
//
// 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 = uTask.setPlaceholderTasks(startTime, true, timeGranularity.value);
// // store.commit('task/setCurrUpTimeNode', startTime);
// store.commit('task/setUpTasks', placeholderTasks);
// }
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 = uTask.setPlaceholderTasks(startTime, true, timeGranularity.value);
// store.commit('task/setCurrUpTimeNode', startTime);
store.commit('task/setUpTasks', placeholderTasks);
}
//
function setNextPlaceholderTasks(params) {
function setNextPlaceholderTasks() {
// store.commit('task/setBottomEnd', true);
let startTime = '';
if (!tasks.value || !tasks.value.length) {
@ -135,7 +304,6 @@ function setNextPlaceholderTasks(params) {
}
const initData = uTask.setPlaceholderTasks(startTime, false, timeGranularity.value);
console.log('222222222', params);
// store.commit('task/setCurrDownTimeNode', startTime);
store.commit('task/setDownTasks', initData);
}
@ -148,7 +316,7 @@ function toDetail(item) {
<style scoped>
.task-list {
padding: 0 16px 50px;
padding: 0 16px;
overflow-y: auto;
}

69
src/store/tall/task/index.js

@ -28,8 +28,12 @@ export default {
showScrollTo: false, // 是否可以设置时间轴自动滚动的位置
regularTasks: [], // 定期任务
realTasks: [], // 真实定期任务
currLocationTaskId: '', // 前需要定位到的任务id
businessCode: '', // 当前打开的项目的所属服务
timeLineType: 1, // 时间轴模式
upNextPage: 1, // 向上下一页的值
downNextPage: 1, // 向下下一页的值
},
getters: {
@ -301,6 +305,44 @@ export default {
// sessionStorage.setItem('regularTasks', JSON.stringify(tasks));
},
/**
* 真实定期任务
* @param {object} state
* @param {array} tasks 服务端查询到的定期任务书籍
*/
setUpRealTasks(state, tasks) {
state.realTasks = [...tasks, ...state.realTasks];
const arr = [];
state.realTasks.forEach(item => {
const index = arr.findIndex(v => v.id === item.id);
if (index === -1) {
arr.push(item);
}
});
state.realTasks = [...arr];
},
/**
* 真实定期任务
* @param {object} state
* @param {array} tasks 服务端查询到的定期任务书籍
*/
setDownRealTasks(state, tasks) {
state.realTasks = [...state.realTasks, ...tasks];
const arr = [];
state.realTasks.forEach(item => {
const index = arr.findIndex(v => v.id === item.id);
if (index === -1) {
arr.push(item);
}
});
state.realTasks = [...arr];
},
/**
* 当前需要定位到的任务id
* @param {Object} state
@ -318,6 +360,33 @@ export default {
setBusinessCode(state, data) {
state.businessCode = data;
},
/**
* 时间轴模式
* @param {Object} state
* @param {Object} data
*/
setTimeLineType(state, data) {
state.timeLineType = data;
},
/**
* 向上下一页页数
* @param {Object} state
* @param {Object} data
*/
setUpNextPage(state, data) {
state.upNextPage = data;
},
/**
* 下一页页数
* @param {Object} state
* @param {Object} data
*/
setDownNextPage(state, data) {
state.downNextPage = data;
},
},
actions: {},

1
src/utils/task.js

@ -22,7 +22,6 @@ const setPlaceholderTasks = (startTime, isUp, timeGranularity, pageCount) => {
.add(+delta, timeGranularity)
.valueOf(),
};
console.log('11111111', item);
// console.log('isup: ', isUp, 'result:', new Date(item.planStart).toLocaleDateString());
isUp ? result.unshift(item) : result.push(item);

Loading…
Cancel
Save