update 修复keepalive 导致的甘特图点击报错问题

This commit is contained in:
2026-01-28 21:00:30 +08:00
parent f94bdfec71
commit 9e7fbb7f90
10 changed files with 87 additions and 34 deletions

View File

@@ -1,5 +1,5 @@
<template>
<commonChart
<commonFilterChart
:title="
resultTagType === 'mechine'
? $t('数据统计.指标完成统计(机台)')
@@ -15,7 +15,7 @@
<script lang="ts" setup>
import { ref } from 'vue';
import commonChart from '@/components/common/echartCard/commonFilterChart.vue';
import commonFilterChart from '@/components/common/echartCard/commonFilterChart.vue';
import { TASK_CALCULATE_STATUS_OBJ } from '@/utils/enum/task';
import {
getCommonCompleteStatisticsApi,

View File

@@ -1,5 +1,5 @@
<template>
<commonChart
<commonFilterChart
:title="$t('数据统计.项目任务完成情况统计')"
:charts-id="'chart-projectTaskComplete'"
:bar-type="'barChart'"
@@ -12,7 +12,7 @@
<script lang="ts" setup>
import { ref } from 'vue';
import commonChart from '@/components/common/echartCard/commonFilterChart.vue';
import commonFilterChart from '@/components/common/echartCard/commonFilterChart.vue';
import { TASK_PROCESS_STATUS_OBJ } from '@/utils/enum/task';
import { getAllUserTaskCompleteStatisticsApi } from '@/api/project/node';

View File

@@ -1,5 +1,5 @@
<template>
<commonChart
<commonFilterChart
:title="$t('数据统计.工位评审通过统计')"
:charts-id="'chart-reviewPassed'"
:bar-type="'barChart'"
@@ -19,12 +19,12 @@
/>
</el-form-item>
</template> -->
</commonChart>
</commonFilterChart>
</template>
<script lang="ts" setup>
import { ref } from 'vue';
import commonChart from '@/components/common/echartCard/commonFilterChart.vue';
import commonFilterChart from '@/components/common/echartCard/commonFilterChart.vue';
import { getWorkstationReviewStatisticsApi } from '@/api/project/node';
const props = defineProps({

View File

@@ -1,5 +1,5 @@
<template>
<commonChart
<commonFilterChart
:title="
resultTagType === 'mechine'
? $t('数据统计.任务完成统计(机台)')
@@ -15,7 +15,7 @@
<script lang="ts" setup>
import { ref } from 'vue';
import commonChart from '@/components/common/echartCard/commonFilterChart.vue';
import commonFilterChart from '@/components/common/echartCard/commonFilterChart.vue';
import { TASK_PROCESS_STATUS_OBJ } from '@/utils/enum/task';
import {
getCommonCompleteStatisticsApi,

View File

@@ -1,5 +1,5 @@
<template>
<commonChart
<commonFilterChart
:title="$t('数据统计.用户组难度系数统计')"
:charts-id="'chart-3-userDifficulty'"
:bar-type="'barChart'"
@@ -11,7 +11,7 @@
<script lang="ts" setup>
import { ref } from 'vue';
import commonChart from '@/components/common/echartCard/commonFilterChart.vue';
import commonFilterChart from '@/components/common/echartCard/commonFilterChart.vue';
import { getUserGroupDifficultyStatisticsApi } from '@/api/project/node';
import { useDict } from '@/utils/useDict';

View File

@@ -1,5 +1,5 @@
<template>
<commonChart
<commonFilterChart
:title="$t('数据统计.用户组项目统计')"
:charts-id="'chart-1-UserProjectStatistics'"
:bar-type="'barChart'"
@@ -11,7 +11,7 @@
<script lang="ts" setup>
import { ref } from 'vue';
import commonChart from '@/components/common/echartCard/commonFilterChart.vue';
import commonFilterChart from '@/components/common/echartCard/commonFilterChart.vue';
import { getUserGroupProjectStatisticsApi } from '@/api/project/node';
import { getThemeColor } from '@/utils/theme';

View File

@@ -1,5 +1,5 @@
<template>
<commonChart
<commonFilterChart
:title="$t('数据统计.用户组任务完成情况统计')"
:charts-id="'chart-2-UserTaskComplete'"
:bar-type="'barChart'"
@@ -11,7 +11,7 @@
<script lang="ts" setup>
import { ref } from 'vue';
import commonChart from '@/components/common/echartCard/commonFilterChart.vue';
import commonFilterChart from '@/components/common/echartCard/commonFilterChart.vue';
import { TASK_PROCESS_STATUS_OBJ } from '@/utils/enum/task';
import { getUserGroupTaskCompleteStatisticsApi } from '@/api/project/node';

View File

@@ -60,7 +60,7 @@
/>
</div>
<div class="chart-box">
<commonChart
<commonFilterChart
v-show="currentProjectId"
:title="$t('工况库.项目任务达成统计')"
:charts-id="'chart-achievement'"
@@ -69,7 +69,7 @@
:option="pieChartOption"
@update="queryProjectTaskAchievement"
>
</commonChart>
</commonFilterChart>
<el-empty
v-show="!currentProjectId"
class="chart-empty"
@@ -82,7 +82,7 @@
<script lang="ts" setup>
import { ref, onMounted, onBeforeUnmount } from 'vue';
import EchartCard from '@/components/common/echartCard/index.vue';
import commonChart from '@/components/common/echartCard/commonFilterChart.vue';
import commonFilterChart from '@/components/common/echartCard/commonFilterChart.vue';
import {
getTaskCompleteStatisticsByDisciplineApi,
getChildrenNodeListApi,

View File

@@ -25,7 +25,7 @@
</div>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item v-for="(action, aIndex) in actionList" :key="aIndex">
<el-dropdown-item v-for="(action, aIndex) in cardActionList" :key="aIndex">
<el-link :type="action.type" @click="actionClickFun(project, action)">
{{ action.title }}
</el-link>
@@ -92,7 +92,12 @@
</div>
</template>
<template #leftOptions>
<el-button icon="plus" @click="openProjectInfoDiaFun('create')" type="primary">
<el-button
icon="plus"
v-permission="'project_list_add_project'"
@click="openProjectInfoDiaFun('create')"
type="primary"
>
{{ $t('项目列表.新增') }}
</el-button>
<el-button type="primary" v-if="viewType === 'list'" @click="shwoProjectsFun"
@@ -160,7 +165,7 @@
</template>
<script setup lang="ts">
import { reactive, ref } from 'vue';
import { computed, reactive, ref } from 'vue';
import BaseTable from '@/components/common/table/baseTable.vue';
import projectInfoDialog from '@/components/project/projectInfoDialog.vue';
// import { useRouter } from 'vue-router';
@@ -185,6 +190,7 @@ import { PROJECT_EXE_STATUS_CODE } from '@/utils/enum/project';
import { enableConfigByTenant, TENANT_ENUM } from '@/tenants/tenant';
// import { getUserId, getUserTenantId } from '@/utils/user';
import projectOverview from '@/views/task/projectOverview/index.vue';
import { hasPermission } from '@/utils/permission';
export interface IUserInfo {
id: number;
@@ -229,20 +235,35 @@ const actionList = ref<any>([
{
title: '编辑',
type: 'primary',
code: 'project_list_edit_project',
click: (row: any) => {
openProjectInfoDiaFun('edit', row);
},
hide: () => {
return !hasPermission('project_list_edit_project');
},
},
{
title: '删除',
type: 'danger',
needConfirm: true,
confirmTip: '确认删除吗?',
code: 'project_list_delete_project',
click: (row: any) => {
deleteNodeFun(row);
},
hide: () => {
return !hasPermission('project_list_delete_project');
},
},
]);
// 卡片布局
const cardActionList = computed(() => {
const list = actionList.value.filter((item: any) => {
return hasPermission(item.code) || !item.code;
});
return list;
});
// const router = useRouter();
const basePageRef = ref();

View File

@@ -91,7 +91,7 @@
</template>
<script setup lang="ts">
import { ref, reactive, onMounted, nextTick, onBeforeUnmount, watch } from 'vue';
import { ref, reactive, onMounted, nextTick, onBeforeUnmount, watch, onActivated } from 'vue';
import { gantt } from 'dhtmlx-gantt';
import 'dhtmlx-gantt/codebase/dhtmlxgantt.css';
import dayjs from 'dayjs';
@@ -142,7 +142,7 @@ dayjs.extend(isBetween);
dayjs.extend(weekOfYear);
dayjs.extend(isoWeek);
let Gantt: any = gantt;
const Gantt: any = gantt;
const ganttEvents = ref<any>([]);
const colorList: string[] = ['#ffffff', '#d9ecff', '#c6e2ff', '#c6e2ff', '#79bbff', '#409eff']; // 格子颜色
const taskOriginData = ref<any>([]); // 所有用户的任务数据
@@ -536,15 +536,20 @@ const initGantt = () => {
const tableData = ref<any>([]);
const currentDimension = ref(props.dimension);
// 监听单元格点击事件
const monitorCellClickFun = () => {
const oList: any = document.getElementsByClassName('cell-style');
for (let i = 0; i < oList.length; i++) {
if (oList[i].onclick) {
continue;
}
// 移除旧的事件监听器
oList[i].onclick = null;
oList[i].onclick = async (e: any) => {
// 检查当前维度是否匹配
if (currentDimension.value !== props.dimension) {
return;
}
const obj = {
currentIdTasksId: JSON.parse(e.target.getAttribute('tasks')) || [],
currentDate: dayjs(e.target.getAttribute('date')).week(),
@@ -554,11 +559,13 @@ const monitorCellClickFun = () => {
const tasks = taskOriginData.value.find((item: any) => {
return item.userName === obj.currentUserName;
})?.taskList;
// console.log(taskOriginData.value, obj, '00000');
tableData.value = tasks.filter((item: any) => {
return obj.currentIdTasksId.includes(item.id);
});
visible.value = true;
if (tasks) {
tableData.value = tasks.filter((item: any) => {
return obj.currentIdTasksId.includes(item.id);
});
visible.value = true;
}
};
}
};
@@ -587,10 +594,35 @@ watch(
{ deep: true }
);
const isInitialized = ref(false);
onMounted(async () => {
await getUserGroupFun();
filterFprmData.beginTime = dayjs().subtract(3, 'month').format('YYYY-MM-DD HH:mm:ss');
filterFprmData.endTime = dayjs().format('YYYY-MM-DD HH:mm:ss');
if (props.dimension === 'person') {
filterFprmData.beginTime = dayjs().subtract(3, 'month').format('YYYY-MM-DD HH:mm:ss');
filterFprmData.endTime = dayjs().format('YYYY-MM-DD HH:mm:ss');
} else {
filterFprmData.beginTime = dayjs().subtract(3, 'month').format('YYYY-MM-DD HH:mm:ss');
filterFprmData.endTime = dayjs().add(3, 'month').format('YYYY-MM-DD HH:mm:ss');
}
await refreshGanttFun();
isInitialized.value = true;
});
onActivated(async () => {
if (!isInitialized.value) {
return;
}
currentDimension.value = props.dimension;
Gantt.clearAll();
taskOriginData.value = [];
tableData.value = [];
userTimeItemWorkList.clear();
columnTotals.value = {};
// 清除所有单元格的事件监听器
const cells = document.getElementsByClassName('cell-style');
Array.from(cells).forEach((cell) => {
(cell as HTMLElement).onclick = null;
});
await refreshGanttFun();
});
@@ -598,6 +630,7 @@ onBeforeUnmount(() => {
ganttEvents.value?.forEach((item: any) => {
Gantt.detachEvent(item);
});
ganttEvents.value = [];
Gantt.templates.timeline_cell_content = function () {
return '';
};
@@ -608,7 +641,6 @@ onBeforeUnmount(() => {
return '';
};
Gantt.clearAll();
Gantt = null;
});
</script>