This commit is contained in:
2026-04-13 15:08:19 +08:00
7 changed files with 105 additions and 103 deletions

View File

@@ -199,11 +199,11 @@ watch(
(newVal) => {
if (newVal && Object.keys(newVal).length > 0) {
const { tag1, workspace, discipline, createTimeArr, finishTimeArr } = newVal;
if (tag1 !== undefined) formData.value.tag1 = tag1;
if (workspace !== undefined) formData.value.workspace = workspace;
if (discipline !== undefined) formData.value.discipline = discipline;
if (createTimeArr !== undefined) formData.value.createTimeArr = createTimeArr;
if (finishTimeArr !== undefined) formData.value.finishTimeArr = finishTimeArr;
formData.value.tag1 = tag1;
formData.value.workspace = workspace;
formData.value.discipline = discipline;
formData.value.createTimeArr = createTimeArr;
formData.value.finishTimeArr = finishTimeArr;
}
},
{ deep: true }

View File

@@ -124,6 +124,7 @@ interface Props {
checkMethod?: any; // 处理勾选逻辑
showAddCategoryButton?: boolean; // 是否显示添加分类按钮
allowRootAddTask?: boolean; // 是否允许在根节点添加任务
hideEditFn?: (row: any) => boolean; // 外部控制编辑按钮隐藏逻辑
}
const props = withDefaults(defineProps<Props>(), {
@@ -156,6 +157,7 @@ const props = withDefaults(defineProps<Props>(), {
checkMethod: null,
showAddCategoryButton: true,
allowRootAddTask: false,
hideEditFn: undefined,
});
if (props?.checkMethod) {
@@ -410,7 +412,10 @@ const actionList = computed(() => {
click: (row: any) => {
editRowFun(row);
},
hide: () => {
hide: (row: any) => {
if (props.hideEditFn && props.hideEditFn(row)) {
return true;
}
return props.readonly;
},
},

View File

@@ -70,9 +70,14 @@
:loading="loading"
:editMode="!enableConfigByTenant([TENANT_ENUM.LYRIC])"
:enableSelectCode="enableSelectCode"
:hideEditFn="hideEditForLyricFun"
>
<template #otherOptions>
<el-tooltip :content="$t('工况库.导入Excel')" placement="top">
<el-tooltip
:content="$t('工况库.导入Excel')"
placement="top"
v-if="!enableConfigByTenant([TENANT_ENUM.LYRIC])"
>
<div class="icon-change-view" @click="openImportPoolFun">
<el-icon :size="18">
<Upload />
@@ -281,6 +286,13 @@ const enableSelectCode = computed(() => {
return props.pageType === 'loadcase' && enableConfigByTenant([TENANT_ENUM.LYRIC]);
});
const hideEditForLyricFun = (row: any) => {
if (!enableConfigByTenant([TENANT_ENUM.LYRIC])) {
return false;
}
return row.nodeType === NODE_TYPE.TASK || row.nodeType === NODE_TYPE.PERFORMANCE;
};
let originalSnapshot: any = null;
const tableData = ref<any>([]);

View File

@@ -37,11 +37,15 @@ const getProjectGroupTaskCompleteStatistics = async (formData: any) => {
finishTimeArr: formData.finishTimeArr,
});
if (res.code === 200) {
const validStatusKeys =
res.data?.allExeStatus?.filter((statusKey: string) =>
TASK_ACHIEVE_STATUS.value.O.hasOwnProperty(statusKey)
) || [];
legendData =
res.data?.allExeStatus?.map((item: any) => {
validStatusKeys?.map((item: any) => {
return TASK_ACHIEVE_STATUS.value.O[item] || item;
}) || [];
colors = res.data?.allExeStatus.map((item: any) => {
colors = validStatusKeys.map((item: any) => {
return props.statusColorList[Number(item) - 1];
});
seriesData = legendData?.map((item: any) => {

View File

@@ -63,15 +63,18 @@ const initTaskCompleteChart = async (formData: any) => {
res.data?.result?.map((item: any) => {
return item.name;
}) || [];
const validStatusKeys =
res.data?.allExeStatus?.filter((statusKey: string) =>
TASK_ACHIEVE_STATUS.value.O.hasOwnProperty(statusKey)
) || [];
titles =
res.data?.allExeStatus?.map((item: any) => {
validStatusKeys?.map((item: any) => {
return TASK_ACHIEVE_STATUS.value.O[item] || item;
}) || [];
const colors = res.data?.allExeStatus.map((item: any) => {
const colors = validStatusKeys.map((item: any) => {
return props.statusColorList[Number(item) - 1];
});
const names = res.data?.allExeStatus || [];
const names = validStatusKeys || [];
for (let i = 0; i < names.length; i++) {
const str = names[i];

View File

@@ -44,11 +44,16 @@ const getUserGroupTaskCompleteStatistics = async (formData: any) => {
delete params.userId;
const res: any = await getUserGroupTaskCompleteStatisticsApi(params);
if (res.code === 200) {
// 获取有效的状态列表(只保留 TASK_ACHIEVE_STATUS.value.O 中存在的 key
const validStatusKeys =
res.data?.allExeStatus?.filter((statusKey: string) =>
TASK_ACHIEVE_STATUS.value.O.hasOwnProperty(statusKey)
) || [];
legendData =
res.data?.allExeStatus?.map((item: any) => {
validStatusKeys?.map((item: any) => {
return TASK_ACHIEVE_STATUS.value.O[item];
}) || [];
colors = res.data?.allExeStatus.map((item: any) => {
colors = validStatusKeys.map((item: any) => {
return props.statusColorList[Number(item) - 1];
});
seriesData = legendData?.map((item: any) => {

View File

@@ -127,23 +127,16 @@ const achieveFilterData = ref<any>({
const handleProgressFilterUpdate = async (data: any) => {
progressFilterData.value = data;
await progressBarChartUpdate(data);
await progressPieChartUpdate(data);
await updateProgressCharts(data);
};
const handleAchieveFilterUpdate = async (data: any) => {
achieveFilterData.value = data;
await achieveBarChartUpdate(data);
await achievePieChartUpdate(data);
await updateAchieveCharts(data);
};
// 【1】进度统计柱状图
const progressBarChartNodata = ref(false);
const progressBarOption = ref<any>();
const getCommonOptionFun = async (data: any) => {
let xData: any = [];
let seriesData: any = [];
let legendData: any = [];
// 统一更新进度统计图表(只调用一次接口)
const updateProgressCharts = async (data: any) => {
const res: any = await getTaskCompleteStatisticsByDisciplineApi({
tag1: data.tag1,
tag5: data.workspace,
@@ -151,16 +144,17 @@ const getCommonOptionFun = async (data: any) => {
createTimeArr: data.createTimeArr,
finishTimeArr: data.finishTimeArr,
});
if (res && res.code === 200) {
progressBarChartNodata.value = res.data.allExeStatus.length === 0;
xData = res.data.result.map((item: any) => {
// 更新柱状图
const xData = res.data.result.map((item: any) => {
return item.name;
});
legendData = Object.keys(TASK_ACHIEVE_STATUS.value.O).map((item: any) => {
const legendData = Object.keys(TASK_ACHIEVE_STATUS.value.O).map((item: any) => {
return TASK_ACHIEVE_STATUS.value.O[item];
});
const names = Object.keys(TASK_ACHIEVE_STATUS.value.O);
seriesData = names.map((str) => ({
const seriesData = names.map((str) => ({
name: TASK_ACHIEVE_STATUS.value.O[str],
type: 'bar',
emphasis: {
@@ -168,81 +162,54 @@ const getCommonOptionFun = async (data: any) => {
},
data: res.data.result.map((item: any) => item?.statusCount[str] || 0),
}));
}
return { xData, seriesData, legendData };
};
const progressBarChartUpdate = async (data: any) => {
const { xData, seriesData, legendData } = await getCommonOptionFun(data);
const option = {
color: statusColorList,
legend: { data: legendData },
grid: { bottom: '50' },
xAxis: { type: 'category', data: xData || [] },
yAxis: { type: 'value', minInterval: 1 },
dataZoom: xData.length > 4,
series: seriesData || [],
};
progressBarOption.value = option;
};
// 【2】进度统计饼图
const progressPieChartNodata = ref(false);
const progressPieOption = ref<any>();
const progressPieChartUpdate = async (data: any) => {
const seriesData: { name: any; value: any }[] = [];
const res: any = await getTaskCompleteStatisticsByDisciplineApi({
tag1: data.tag1,
tag5: data.workspace,
discipline: data.discipline,
createTimeArr: data.createTimeArr,
finishTimeArr: data.finishTimeArr,
});
if (res.code === 200) {
progressPieChartNodata.value = res.data.allExeStatus.length === 0;
// 把res.data.allAchieveStatus数组转换为对象的keyvalue默认是0
const barOption = {
color: statusColorList,
legend: { data: legendData },
grid: { bottom: '50' },
xAxis: { type: 'category', data: xData || [] },
yAxis: { type: 'value', minInterval: 1 },
dataZoom: xData.length > 4,
series: seriesData || [],
};
progressBarOption.value = barOption;
progressBarChartNodata.value = res.data.allExeStatus.length === 0;
// 更新饼图
const pieSeriesData: { name: any; value: any }[] = [];
const achieveStatusObj: any = {};
Object.keys(TASK_ACHIEVE_STATUS.value.O).forEach((item: any) => {
achieveStatusObj[item] = 0;
});
// 遍历res.data.result数组把每个对象的statusCount属性合并到achieveStatusObj中
res.data.result?.forEach((item: any) => {
for (const key in item.statusCount) {
achieveStatusObj[key] += item.statusCount[key];
}
});
// 遍历achieveStatusObj把每个对象的key转换为中文
for (const key in achieveStatusObj) {
seriesData.push({
pieSeriesData.push({
name: TASK_ACHIEVE_STATUS.value.O[key],
value: achieveStatusObj[key],
});
}
const option = getPieOptions(statusColorList, seriesData);
progressPieOption.value = option;
const pieOption = getPieOptions(statusColorList, pieSeriesData);
progressPieOption.value = pieOption;
progressPieChartNodata.value = res.data.allExeStatus.length === 0;
}
};
// 完成情况颜色列表:未分析、不合格、合格
const completionStatusColorList = [
'rgb(200, 201, 204)',
getThemeColor('--el-color-danger'),
getThemeColor('--el-color-success'),
];
// 【3】任务达成统计柱状图
const achieveBarOption = ref<any>();
const taskCalculateStatusLegendData = TASK_CALCULATE_STATUS_OPTIONS.map((item) => ({
name: item.label,
}));
const achieveBarChartUpdate = async (data: any) => {
// 统一更新达成统计图表(只调用一次接口)
const updateAchieveCharts = async (data: any) => {
const res: any = await getTaskAchieveStatisticsByDisciplineApi({
// resultTagType: 'tag6',
tag1: data.tag1,
tag5: data.workspace,
discipline: data.discipline,
createTimeArr: data.createTimeArr,
finishTimeArr: data.finishTimeArr,
});
if (res && res.code === 200) {
// 更新柱状图
const xData = res.data.result.map((item: any) => {
return item.name;
});
@@ -254,7 +221,7 @@ const achieveBarChartUpdate = async (data: any) => {
},
data: res.data.result.map((resultItem: any) => resultItem?.statusCount[item.value] || 0),
}));
const option = {
const barOption = {
color: completionStatusColorList,
legend: { data: taskCalculateStatusLegendData },
grid: { bottom: xData.length > 4 ? '50' : '10' },
@@ -263,46 +230,52 @@ const achieveBarChartUpdate = async (data: any) => {
dataZoom: xData.length > 4,
series: seriesData,
};
achieveBarOption.value = { ...option };
}
};
// 【4】任务达成统计饼图
const achievePieChartNodata = ref(false);
const achievePieOption = ref<any>();
const achievePieChartUpdate = async (data: any) => {
const seriesData: { name: any; value: any }[] = [];
const res: any = await getTaskAchieveStatisticsByDisciplineApi({
// resultTagType: 'tag6',
tag1: data.tag1,
tag5: data.workspace,
discipline: data.discipline,
createTimeArr: data.createTimeArr,
finishTimeArr: data.finishTimeArr,
});
if (res.code === 200) {
achievePieChartNodata.value = res.data.allExeStatus.length === 0;
achieveBarOption.value = { ...barOption };
// 更新饼图
const pieSeriesData: { name: any; value: any }[] = [];
const achieveStatusObj: any = {};
Object.keys(RESULT_ACHIEVE_STATUS.value.O).forEach((item: any) => {
achieveStatusObj[item] = 0;
});
// 遍历res.data.result数组把每个对象的statusCount属性合并到achieveStatusObj中
res.data.result?.forEach((item: any) => {
for (const key in item.statusCount) {
achieveStatusObj[key] += item.statusCount[key];
}
});
// 遍历achieveStatusObj把每个对象的key转换为中文
for (const key in achieveStatusObj) {
seriesData.push({
pieSeriesData.push({
name: RESULT_ACHIEVE_STATUS.value.O[key],
value: achieveStatusObj[key],
});
}
const option = getPieOptions(completionStatusColorList, seriesData);
achievePieOption.value = option;
const pieOption = getPieOptions(completionStatusColorList, pieSeriesData);
achievePieOption.value = pieOption;
achievePieChartNodata.value = res.data.allExeStatus.length === 0;
}
};
// 进度统计图表状态
const progressBarChartNodata = ref(false);
const progressBarOption = ref<any>();
const progressPieChartNodata = ref(false);
const progressPieOption = ref<any>();
// 完成情况颜色列表:未分析、不合格、合格
const completionStatusColorList = [
'rgb(200, 201, 204)',
getThemeColor('--el-color-danger'),
getThemeColor('--el-color-success'),
];
// 达成统计图表状态
const achieveBarOption = ref<any>();
const taskCalculateStatusLegendData = TASK_CALCULATE_STATUS_OPTIONS.map((item) => ({
name: item.label,
}));
const achievePieChartNodata = ref(false);
const achievePieOption = ref<any>();
// 饼图配置 statusColorList 颜色列表 seriesData 数据 [{ name: '分类1', value: 10 },{ name: '分类2', value: 20 }]
const getPieOptions = (statusColorList: any, seriesData: any) => {
const option = {