This commit is contained in:
2026-01-29 11:29:38 +08:00
8 changed files with 82 additions and 66 deletions

View File

@@ -14,6 +14,8 @@ export enum TASK_PROCESS_STATUS {
CLOSED = '6', CLOSED = '6',
/** 已延期 */ /** 已延期 */
POSTPONED = '7', POSTPONED = '7',
/** 已闭环 */
CLOSED_LOOP = '8',
} }
export enum TASK_APPROVE_STATUS_ENUM { export enum TASK_APPROVE_STATUS_ENUM {
@@ -43,6 +45,7 @@ export const TASK_PROCESS_STATUS_OBJ: any = {
[TASK_PROCESS_STATUS.PAUSED]: '已暂停', [TASK_PROCESS_STATUS.PAUSED]: '已暂停',
[TASK_PROCESS_STATUS.CLOSED]: '已关闭', [TASK_PROCESS_STATUS.CLOSED]: '已关闭',
[TASK_PROCESS_STATUS.POSTPONED]: '已延期', [TASK_PROCESS_STATUS.POSTPONED]: '已延期',
[TASK_PROCESS_STATUS.CLOSED_LOOP]: '已闭环',
}; };
export const TASK_PROCESS_STATUS_OPTIONS = ( export const TASK_PROCESS_STATUS_OPTIONS = (

View File

@@ -45,14 +45,20 @@ import {
} from '@/api/system/systemData'; } from '@/api/system/systemData';
const statusColorList = [ const statusColorList = [
'rgb(200, 201, 204)', 'rgb(200, 201, 204)', // 未开始
getThemeColor('--el-color-primary'), getThemeColor('--el-color-primary'), // 进行中
getThemeColor('--el-color-danger'), getThemeColor('--el-color-danger'), // 已驳回
getThemeColor('--el-color-success'), getThemeColor('--el-color-success'), // 已完成
getThemeColor('--el-color-warning'), getThemeColor('--el-color-warning'), // 已暂停
getThemeColor('--el-color-info'), getThemeColor('--el-color-info'), // 已关闭
'rgb(248, 152, 152)', // 已延期
'rgb(179, 225, 157)', // 已闭环
];
const performanceColorList = [
'rgb(200, 201, 204)',
getThemeColor('--el-color-success'),
getThemeColor('--el-color-primary'),
]; ];
const performanceColorList = ['rgb(200, 201, 204)', getThemeColor('--el-color-success')];
// 难度系数颜色列表 // 难度系数颜色列表
const difficultyCountColorList = [ const difficultyCountColorList = [
'#67c23a', '#67c23a',

View File

@@ -13,9 +13,10 @@
<script lang="ts" setup> <script lang="ts" setup>
import { ref } from 'vue'; import { ref } from 'vue';
import commonFilterChart 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'; import { getAllUserTaskCompleteStatisticsApi } from '@/api/project/node';
import { useDict } from '@/utils/useDict';
const { TASK_ACHIEVE_STATUS } = useDict('TASK_ACHIEVE_STATUS');
const props = defineProps({ const props = defineProps({
statusColorList: { statusColorList: {
type: Array, type: Array,
@@ -28,15 +29,18 @@ const getProjectGroupTaskCompleteStatistics = async (formData: any) => {
const xData: any = []; const xData: any = [];
let legendData: any = []; let legendData: any = [];
let seriesData: any = []; let seriesData: any = [];
let colors: any = [];
const res: any = await getAllUserTaskCompleteStatisticsApi({ const res: any = await getAllUserTaskCompleteStatisticsApi({
tag1List: formData.tag1 ? formData.tag1.split(',') : [], tag1List: formData.tag1 ? formData.tag1.split(',') : [],
}); });
if (res.code === 200) { if (res.code === 200) {
legendData = legendData =
res.data?.allExeStatus?.map((item: any) => { res.data?.allExeStatus?.map((item: any) => {
return TASK_PROCESS_STATUS_OBJ[item]; return TASK_ACHIEVE_STATUS.value.O[item];
}) || []; }) || [];
colors = res.data?.allExeStatus.map((item: any) => {
return props.statusColorList[Number(item) - 1];
});
seriesData = legendData?.map((item: any) => { seriesData = legendData?.map((item: any) => {
return { return {
name: item, name: item,
@@ -62,8 +66,8 @@ const getProjectGroupTaskCompleteStatistics = async (formData: any) => {
const seriesItem = seriesData.find((item: any) => item.name === statusName); const seriesItem = seriesData.find((item: any) => item.name === statusName);
if (seriesItem) { if (seriesItem) {
// 获取状态对应的 key // 获取状态对应的 key
const statusKey = Object.keys(TASK_PROCESS_STATUS_OBJ).find( const statusKey = Object.keys(TASK_ACHIEVE_STATUS.value.O).find(
(key) => TASK_PROCESS_STATUS_OBJ[key] === statusName (key) => TASK_ACHIEVE_STATUS.value.O[key] === statusName
); );
if (statusKey) { if (statusKey) {
// 如果 statusCount 中有这个状态,使用其值,否则使用 0 // 如果 statusCount 中有这个状态,使用其值,否则使用 0
@@ -78,13 +82,15 @@ const getProjectGroupTaskCompleteStatistics = async (formData: any) => {
xData, xData,
seriesData, seriesData,
legendData, legendData,
colors,
}; };
}; };
const initProjectTaskCompleteChart = async (formData: any) => { const initProjectTaskCompleteChart = async (formData: any) => {
const { xData, seriesData, legendData } = await getProjectGroupTaskCompleteStatistics(formData); const { xData, seriesData, legendData, colors } =
await getProjectGroupTaskCompleteStatistics(formData);
chartOption.value = { chartOption.value = {
color: props.statusColorList, color: colors,
legend: { legend: {
data: legendData, data: legendData,
}, },

View File

@@ -16,12 +16,13 @@
<script lang="ts" setup> <script lang="ts" setup>
import { ref } from 'vue'; import { ref } from 'vue';
import commonFilterChart from '@/components/common/echartCard/commonFilterChart.vue'; import commonFilterChart from '@/components/common/echartCard/commonFilterChart.vue';
import { TASK_PROCESS_STATUS_OBJ } from '@/utils/enum/task';
import { import {
getCommonCompleteStatisticsApi, getCommonCompleteStatisticsApi,
getTaskCompleteStatisticsByDisciplineApi, getTaskCompleteStatisticsByDisciplineApi,
} from '@/api/project/node'; } from '@/api/project/node';
import { useDict } from '@/utils/useDict';
const { TASK_ACHIEVE_STATUS } = useDict('TASK_ACHIEVE_STATUS');
const props = defineProps({ const props = defineProps({
// x轴 机台、学科discipline // x轴 机台、学科discipline
resultTagType: { resultTagType: {
@@ -65,15 +66,17 @@ const initTaskCompleteChart = async (formData: any) => {
titles = titles =
res.data?.allExeStatus?.map((item: any) => { res.data?.allExeStatus?.map((item: any) => {
return TASK_PROCESS_STATUS_OBJ[item]; return TASK_ACHIEVE_STATUS.value.O[item] || item;
}) || []; }) || [];
const colors = res.data?.allExeStatus.map((item: any) => {
return props.statusColorList[Number(item) - 1];
});
const names = res.data?.allExeStatus || []; const names = res.data?.allExeStatus || [];
for (let i = 0; i < names.length; i++) { for (let i = 0; i < names.length; i++) {
const str = names[i]; const str = names[i];
const obj: any = { const obj: any = {
name: TASK_PROCESS_STATUS_OBJ[str], name: TASK_ACHIEVE_STATUS.value.O[str] || str,
type: 'bar', type: 'bar',
emphasis: { emphasis: {
focus: 'series', focus: 'series',
@@ -88,7 +91,7 @@ const initTaskCompleteChart = async (formData: any) => {
seriesData.push(obj); seriesData.push(obj);
} }
chartOption.value = { chartOption.value = {
color: props.statusColorList, color: colors,
legend: { legend: {
data: titles, data: titles,
}, },

View File

@@ -12,9 +12,10 @@
<script lang="ts" setup> <script lang="ts" setup>
import { ref } from 'vue'; import { ref } from 'vue';
import commonFilterChart 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'; import { getUserGroupTaskCompleteStatisticsApi } from '@/api/project/node';
import { useDict } from '@/utils/useDict';
const { TASK_ACHIEVE_STATUS } = useDict('TASK_ACHIEVE_STATUS');
const props = defineProps({ const props = defineProps({
statusColorList: { statusColorList: {
type: Array, type: Array,
@@ -25,14 +26,18 @@ const getUserGroupTaskCompleteStatistics = async (formData: any) => {
const xData: any = []; const xData: any = [];
let legendData: any = []; let legendData: any = [];
let seriesData: any = []; let seriesData: any = [];
let colors: any = [];
const res: any = await getUserGroupTaskCompleteStatisticsApi({ const res: any = await getUserGroupTaskCompleteStatisticsApi({
...formData, ...formData,
}); });
if (res.code === 200) { if (res.code === 200) {
legendData = legendData =
res.data?.allExeStatus?.map((item: any) => { res.data?.allExeStatus?.map((item: any) => {
return TASK_PROCESS_STATUS_OBJ[item]; return TASK_ACHIEVE_STATUS.value.O[item];
}) || []; }) || [];
colors = res.data?.allExeStatus.map((item: any) => {
return props.statusColorList[Number(item) - 1];
});
seriesData = legendData?.map((item: any) => { seriesData = legendData?.map((item: any) => {
return { return {
name: item, name: item,
@@ -58,8 +63,8 @@ const getUserGroupTaskCompleteStatistics = async (formData: any) => {
const seriesItem = seriesData.find((item: any) => item.name === statusName); const seriesItem = seriesData.find((item: any) => item.name === statusName);
if (seriesItem) { if (seriesItem) {
// 获取状态对应的 key // 获取状态对应的 key
const statusKey = Object.keys(TASK_PROCESS_STATUS_OBJ).find( const statusKey = Object.keys(TASK_ACHIEVE_STATUS.value.O).find(
(key) => TASK_PROCESS_STATUS_OBJ[key] === statusName (key) => TASK_ACHIEVE_STATUS.value.O[key] === statusName
); );
if (statusKey) { if (statusKey) {
// 如果 statusCount 中有这个状态,使用其值,否则使用 0 // 如果 statusCount 中有这个状态,使用其值,否则使用 0
@@ -74,14 +79,16 @@ const getUserGroupTaskCompleteStatistics = async (formData: any) => {
xData, xData,
seriesData, seriesData,
legendData, legendData,
colors,
}; };
}; };
// 初始化用户组项目统计 // 初始化用户组项目统计
const chartOption = ref(); const chartOption = ref();
const initUserTaskCompleteChart = async (formData: any) => { const initUserTaskCompleteChart = async (formData: any) => {
const { xData, seriesData, legendData } = await getUserGroupTaskCompleteStatistics(formData); const { xData, seriesData, legendData, colors } =
await getUserGroupTaskCompleteStatistics(formData);
chartOption.value = { chartOption.value = {
color: props.statusColorList, color: colors,
legend: { legend: {
data: legendData, data: legendData,
}, },

View File

@@ -89,24 +89,24 @@ import {
} from '@/api/project/node'; } from '@/api/project/node';
import { getTaskAchieveStatisticsApi } from '@/api/project/task'; import { getTaskAchieveStatisticsApi } from '@/api/project/task';
import { getThemeColor } from '@/utils/theme'; import { getThemeColor } from '@/utils/theme';
import { import { TASK_CALCULATE_STATUS_OBJ } from '@/utils/enum/task';
TASK_PROCESS_STATUS_OBJ,
TASK_PROCESS_STATUS,
TASK_CALCULATE_STATUS_OBJ,
} from '@/utils/enum/task';
import emitter from '@/utils/eventBus'; import emitter from '@/utils/eventBus';
// import { useDict } from '@/utils/useDict'; import { useDict } from '@/utils/useDict';
// const { DISCIPLINE_TYPE } = useDict('DISCIPLINE_TYPE'); // const { DISCIPLINE_TYPE } = useDict('DISCIPLINE_TYPE');
const { TASK_ACHIEVE_STATUS } = useDict('TASK_ACHIEVE_STATUS');
// 进度状态颜色列表 // 进度状态颜色列表
const statusColorList = [ const statusColorList = [
'rgb(200, 201, 204)', 'rgb(200, 201, 204)', // 未开始
getThemeColor('--el-color-primary'), getThemeColor('--el-color-primary'), // 进行中
getThemeColor('--el-color-danger'), getThemeColor('--el-color-danger'), // 已驳回
getThemeColor('--el-color-success'), getThemeColor('--el-color-success'), // 已完成
getThemeColor('--el-color-warning'), getThemeColor('--el-color-warning'), // 已暂停
getThemeColor('--el-color-info'), getThemeColor('--el-color-info'), // 已关闭
'rgb(248, 152, 152)', // 已延期
'rgb(179, 225, 157)', // 已闭环
]; ];
const achievementColorList = [ const achievementColorList = [
getThemeColor('--el-color-info'), // 未分析 getThemeColor('--el-color-info'), // 未分析
getThemeColor('--el-color-success'), // 合格 getThemeColor('--el-color-success'), // 合格
@@ -180,11 +180,13 @@ const getCommonOptionFun = async () => {
let xData: any = []; let xData: any = [];
const seriesData: any = []; const seriesData: any = [];
let legendData: any = []; let legendData: any = [];
let colors: any = [];
if (currentProjectId.value === '') { if (currentProjectId.value === '') {
return { return {
xData, xData,
seriesData, seriesData,
legendData, legendData,
colors,
}; };
} else { } else {
// dzhtodo 感觉这里的学科入参有问题 // dzhtodo 感觉这里的学科入参有问题
@@ -201,36 +203,22 @@ const getCommonOptionFun = async () => {
}); });
legendData = res.data.allExeStatus.map((item: any) => { legendData = res.data.allExeStatus.map((item: any) => {
return TASK_PROCESS_STATUS_OBJ[item]; return TASK_ACHIEVE_STATUS.value.O[item];
});
colors = res.data?.allExeStatus.map((item: any) => {
return statusColorList[Number(item) - 1];
}); });
const names = res.data.allExeStatus; const names = res.data.allExeStatus;
for (let i = 0; i < names.length; i++) { for (let i = 0; i < names.length; i++) {
const str = names[i]; const str = names[i];
const obj: any = { const obj: any = {
name: TASK_PROCESS_STATUS_OBJ[str], name: TASK_ACHIEVE_STATUS.value.O[str],
type: 'bar', type: 'bar',
stack: 'total', // 堆叠效果 stack: 'total', // 堆叠效果
emphasis: { emphasis: {
focus: 'series', focus: 'series',
}, },
label: {
show: false, // 暂不展示,效果很一般
position:
TASK_PROCESS_STATUS_OBJ[str] ===
TASK_PROCESS_STATUS_OBJ[TASK_PROCESS_STATUS.COMPLETED]
? 'right'
: '',
formatter: (params: any) => {
return params.value
? TASK_PROCESS_STATUS_OBJ[str] ===
TASK_PROCESS_STATUS_OBJ[TASK_PROCESS_STATUS.COMPLETED]
? `———${params.value}`
: params.value
: '';
},
},
data: [], data: [],
}; };
@@ -245,16 +233,17 @@ const getCommonOptionFun = async () => {
xData, xData,
seriesData, seriesData,
legendData, legendData,
colors,
}; };
} }
}; };
const queryProjectTaskProgress = async () => { const queryProjectTaskProgress = async () => {
const { xData, seriesData, legendData } = await getCommonOptionFun(); const { xData, seriesData, legendData, colors } = await getCommonOptionFun();
if (!ProjectTaskProgressChartRef.value || !ProjectTaskProgressChartRef.value.commonChartRef) if (!ProjectTaskProgressChartRef.value || !ProjectTaskProgressChartRef.value.commonChartRef)
return; return;
ProjectTaskProgressChartRef.value.commonChartRef.disposeEchartsByKey('chart-progress'); ProjectTaskProgressChartRef.value.commonChartRef.disposeEchartsByKey('chart-progress');
ProjectTaskProgressChartRef.value.commonChartRef.option = { ProjectTaskProgressChartRef.value.commonChartRef.option = {
color: statusColorList, color: colors,
title: { title: {
show: false, show: false,
}, },

View File

@@ -130,14 +130,16 @@ watchEffect(() => {
// 进度状态颜色列表:已驳回、未开始、进行中、已完成、已暂停、已关闭、已延期 // 进度状态颜色列表:已驳回、未开始、进行中、已完成、已暂停、已关闭、已延期
const statusColorList = [ const statusColorList = [
getThemeColor('--el-color-danger'), 'rgb(200, 201, 204)', // 未开始
'rgb(200, 201, 204)', getThemeColor('--el-color-primary'), // 进行中
getThemeColor('--el-color-primary'), getThemeColor('--el-color-danger'), // 已驳回
getThemeColor('--el-color-success'), getThemeColor('--el-color-success'), // 已完成
getThemeColor('--el-color-warning'), getThemeColor('--el-color-warning'), // 已暂停
'rgb(222, 223, 224)', getThemeColor('--el-color-info'), // 已关闭
'rgb(250, 182, 182)', 'rgb(248, 152, 152)', // 已延期
'rgb(179, 225, 157)', // 已闭环
]; ];
// 完成情况颜色列表:未分析、不合格、合格 // 完成情况颜色列表:未分析、不合格、合格
const completionStatusColorList = [ const completionStatusColorList = [
getThemeColor('--el-color-info'), getThemeColor('--el-color-info'),

View File

@@ -144,7 +144,7 @@ dayjs.extend(isoWeek);
const Gantt: any = gantt; const Gantt: any = gantt;
const ganttEvents = ref<any>([]); const ganttEvents = ref<any>([]);
const colorList: string[] = ['#ffffff', '#d9ecff', '#c6e2ff', '#c6e2ff', '#79bbff', '#409eff']; // 格子颜色 const colorList: string[] = ['#ffffff', '#d9ecff', '#c6e2ff', '#a1cefc', '#79bbff', '#409eff']; // 格子颜色
const taskOriginData = ref<any>([]); // 所有用户的任务数据 const taskOriginData = ref<any>([]); // 所有用户的任务数据
const loading = ref<boolean>(false); const loading = ref<boolean>(false);
const visible = ref(false); const visible = ref(false);