merge
This commit is contained in:
@@ -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 }
|
||||
|
||||
@@ -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;
|
||||
},
|
||||
},
|
||||
|
||||
@@ -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>([]);
|
||||
|
||||
@@ -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) => {
|
||||
|
||||
@@ -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];
|
||||
|
||||
@@ -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) => {
|
||||
|
||||
@@ -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数组转换为对象的key,value默认是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 = {
|
||||
|
||||
Reference in New Issue
Block a user