|
|
|
|
@ -3,27 +3,22 @@
|
|
|
|
|
<el-card shadow="never" class="mb-3">
|
|
|
|
|
<el-form :model="queryParams" :inline="true" label-width="90px">
|
|
|
|
|
<el-form-item label="关闭月份">
|
|
|
|
|
<el-date-picker
|
|
|
|
|
v-model="finishMonth"
|
|
|
|
|
type="month"
|
|
|
|
|
value-format="YYYY-MM"
|
|
|
|
|
placeholder="请选择月份"
|
|
|
|
|
clearable
|
|
|
|
|
@change="handleQuery"
|
|
|
|
|
/>
|
|
|
|
|
<el-date-picker v-model="finishMonth" type="month" value-format="YYYY-MM" placeholder="请选择月份" clearable @change="handleQuery" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
<el-form-item label="执行人">
|
|
|
|
|
<el-input v-model="queryParams.assigneeName" placeholder="请输入执行人" clearable @keyup.enter="handleQuery" />
|
|
|
|
|
<el-form-item label="任务类型">
|
|
|
|
|
<el-select v-model="queryParams.taskType" placeholder="请选择任务类型" clearable>
|
|
|
|
|
<el-option v-for="dict in temp_task_type" :key="dict.value" :label="dict.label" :value="dict.value" />
|
|
|
|
|
</el-select>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
<el-form-item label="主执行人">
|
|
|
|
|
<el-input v-model="queryParams.assigneeName" placeholder="请输入主执行人" clearable @keyup.enter="handleQuery" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
<el-form-item label="项目">
|
|
|
|
|
<el-input v-model="queryParams.projectName" placeholder="请输入项目名称" clearable @keyup.enter="handleQuery" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
<el-form-item label="发起部门">
|
|
|
|
|
<el-input v-model="queryParams.requestDeptName" placeholder="请输入发起部门" clearable @keyup.enter="handleQuery" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
<el-form-item label="完成结果">
|
|
|
|
|
<el-select v-model="queryParams.finishResult" placeholder="请选择完成结果" clearable>
|
|
|
|
|
<el-option v-for="dict in temp_task_finish_result" :key="dict.value" :label="dict.label" :value="dict.value" />
|
|
|
|
|
<el-form-item label="归集部门">
|
|
|
|
|
<el-select v-model="queryParams.deptId" placeholder="请选择部门" clearable filterable>
|
|
|
|
|
<el-option v-for="dept in deptList" :key="dept.deptId" :label="dept.deptName" :value="dept.deptId" />
|
|
|
|
|
</el-select>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
<el-form-item>
|
|
|
|
|
@ -43,45 +38,45 @@
|
|
|
|
|
|
|
|
|
|
<el-card shadow="never">
|
|
|
|
|
<el-tabs v-model="activeDimension">
|
|
|
|
|
<el-tab-pane label="按人员" name="assignee" />
|
|
|
|
|
<el-tab-pane label="按人员工时" name="member" />
|
|
|
|
|
<el-tab-pane label="按项目" name="project" />
|
|
|
|
|
<el-tab-pane label="按发起部门" name="dept" />
|
|
|
|
|
<el-tab-pane label="按完成结果" name="result" />
|
|
|
|
|
<el-tab-pane label="按关联链" name="chain" />
|
|
|
|
|
<el-tab-pane label="按归集部门" name="dept" />
|
|
|
|
|
<el-tab-pane label="按评分" name="score" />
|
|
|
|
|
</el-tabs>
|
|
|
|
|
|
|
|
|
|
<el-table v-loading="loading" :data="activeRows" border>
|
|
|
|
|
<el-table-column type="index" label="序号" width="70" align="center" />
|
|
|
|
|
<el-table-column :label="dimensionLabel" prop="name" min-width="220" show-overflow-tooltip align="center" />
|
|
|
|
|
<el-table-column label="任务数" prop="count" width="100" align="center" />
|
|
|
|
|
<el-table-column label="实际工时" prop="workload" width="120" align="center" />
|
|
|
|
|
<el-table-column label="平均工时" prop="avgWorkload" width="120" align="center" />
|
|
|
|
|
<el-table-column label="已完成" prop="finishedCount" width="100" align="center" />
|
|
|
|
|
<el-table-column label="不执行/终止" prop="terminatedCount" width="120" align="center" />
|
|
|
|
|
<el-table-column label="部分完成后终止" prop="partialTerminatedCount" width="140" align="center" />
|
|
|
|
|
<el-table-column label="任务数" prop="taskCount" width="100" align="center" />
|
|
|
|
|
<el-table-column label="工时合计" prop="hours" width="120" align="center" />
|
|
|
|
|
<el-table-column label="平均工时" prop="avgHours" width="120" align="center" />
|
|
|
|
|
<el-table-column label="评分数" prop="scoreCount" width="100" align="center" />
|
|
|
|
|
<el-table-column label="评分分布" prop="scoreSummary" min-width="180" show-overflow-tooltip align="center" />
|
|
|
|
|
</el-table>
|
|
|
|
|
|
|
|
|
|
<el-divider />
|
|
|
|
|
|
|
|
|
|
<el-table :data="detailRows" border>
|
|
|
|
|
<el-table :data="filteredTasks" border>
|
|
|
|
|
<el-table-column type="index" label="序号" width="70" align="center" />
|
|
|
|
|
<el-table-column label="任务编号" prop="tempTaskCode" width="150" align="center" />
|
|
|
|
|
<el-table-column label="任务类型" prop="taskType" width="100" align="center">
|
|
|
|
|
<template #default="scope">
|
|
|
|
|
<dict-tag :options="temp_task_type" :value="scope.row.taskType" />
|
|
|
|
|
</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<el-table-column label="任务描述" prop="taskDesc" min-width="240" show-overflow-tooltip align="center" />
|
|
|
|
|
<el-table-column label="主执行人" prop="assigneeName" width="110" align="center" />
|
|
|
|
|
<el-table-column label="项目名称" prop="projectName" min-width="170" show-overflow-tooltip align="center" />
|
|
|
|
|
<el-table-column label="发起部门" prop="requestDeptName" width="130" align="center" />
|
|
|
|
|
<el-table-column label="完成结果" prop="finishResult" width="130" align="center">
|
|
|
|
|
<template #default="scope">
|
|
|
|
|
<dict-tag :options="temp_task_finish_result" :value="scope.row.finishResult" />
|
|
|
|
|
</template>
|
|
|
|
|
<el-table-column label="归集部门" prop="deptName" width="130" align="center" />
|
|
|
|
|
<el-table-column label="工时合计" prop="totalHours" width="100" align="center" />
|
|
|
|
|
<el-table-column label="评分摘要" min-width="180" show-overflow-tooltip align="center">
|
|
|
|
|
<template #default="scope">{{ buildTaskScoreSummary(scope.row) }}</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<el-table-column label="实际工时" prop="actualWorkload" width="100" align="center" />
|
|
|
|
|
<el-table-column label="关闭时间" prop="actualFinishTime" width="160" align="center">
|
|
|
|
|
<template #default="scope">
|
|
|
|
|
<span>{{ formatDateTime(scope.row.actualFinishTime) }}</span>
|
|
|
|
|
</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<el-table-column label="关联原任务" prop="relatedTaskCode" width="150" align="center" />
|
|
|
|
|
</el-table>
|
|
|
|
|
</el-card>
|
|
|
|
|
</div>
|
|
|
|
|
@ -89,23 +84,43 @@
|
|
|
|
|
|
|
|
|
|
<script setup name="TempTaskReport" lang="ts">
|
|
|
|
|
import { listTempTask } from '@/api/oa/erp/tempTask';
|
|
|
|
|
import type { TempTaskQuery, TempTaskVO } from '@/api/oa/erp/tempTask/types';
|
|
|
|
|
import type { TempTaskQuery, TempTaskScoreVO, TempTaskVO, TempTaskWorklogVO } from '@/api/oa/erp/tempTask/types';
|
|
|
|
|
import type { DeptVO } from '@/api/system/dept/types';
|
|
|
|
|
import { allListDept } from '@/api/system/dept';
|
|
|
|
|
|
|
|
|
|
interface ReportWorklogRow extends TempTaskWorklogVO {
|
|
|
|
|
taskId: string | number;
|
|
|
|
|
taskCode: string;
|
|
|
|
|
projectName?: string;
|
|
|
|
|
deptName?: string;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
interface ReportScoreRow extends TempTaskScoreVO {
|
|
|
|
|
taskId: string | number;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
interface AggregateRow {
|
|
|
|
|
name: string;
|
|
|
|
|
count: number;
|
|
|
|
|
workload: number;
|
|
|
|
|
avgWorkload: number;
|
|
|
|
|
finishedCount: number;
|
|
|
|
|
terminatedCount: number;
|
|
|
|
|
partialTerminatedCount: number;
|
|
|
|
|
taskCount: number;
|
|
|
|
|
hours: number;
|
|
|
|
|
avgHours: number;
|
|
|
|
|
scoreCount: number;
|
|
|
|
|
scoreSummary: string;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
interface AggregateDraft {
|
|
|
|
|
name: string;
|
|
|
|
|
taskIds: Set<string | number>;
|
|
|
|
|
hours: number;
|
|
|
|
|
scoreGrades: string[];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const { proxy } = getCurrentInstance() as any;
|
|
|
|
|
const { temp_task_finish_result } = toRefs<any>(proxy?.useDict('temp_task_finish_result'));
|
|
|
|
|
const { temp_task_type, temp_task_score } = toRefs<any>(proxy?.useDict('temp_task_type', 'temp_task_score'));
|
|
|
|
|
|
|
|
|
|
const loading = ref(false);
|
|
|
|
|
const activeDimension = ref('assignee');
|
|
|
|
|
const activeDimension = ref('member');
|
|
|
|
|
const deptList = ref<DeptVO[]>([]);
|
|
|
|
|
const currentMonth = () => {
|
|
|
|
|
const now = new Date();
|
|
|
|
|
return `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}`;
|
|
|
|
|
@ -116,12 +131,12 @@ const runningTotal = ref(0);
|
|
|
|
|
|
|
|
|
|
const queryParams = ref<TempTaskQuery>({
|
|
|
|
|
pageNum: 1,
|
|
|
|
|
pageSize: 1000,
|
|
|
|
|
taskStatus: '3',
|
|
|
|
|
finishResult: undefined,
|
|
|
|
|
pageSize: 999999,
|
|
|
|
|
taskStatus: '5',
|
|
|
|
|
taskType: undefined,
|
|
|
|
|
assigneeName: undefined,
|
|
|
|
|
projectName: undefined,
|
|
|
|
|
requestDeptName: undefined,
|
|
|
|
|
deptId: undefined,
|
|
|
|
|
params: {}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
@ -137,49 +152,93 @@ const monthRange = computed(() => {
|
|
|
|
|
};
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const filteredRows = computed(() => {
|
|
|
|
|
return detailRows.value.filter((row) => row.finishResult && row.actualFinishTime);
|
|
|
|
|
const filteredTasks = computed(() => {
|
|
|
|
|
return detailRows.value.filter((row) => {
|
|
|
|
|
if (!row.actualFinishTime) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
if (queryParams.value.deptId && String(row.deptId || '') !== String(queryParams.value.deptId)) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const totalWorkload = computed(() => sumWorkload(filteredRows.value));
|
|
|
|
|
const worklogRows = computed<ReportWorklogRow[]>(() => {
|
|
|
|
|
return filteredTasks.value.flatMap((task) =>
|
|
|
|
|
(task.worklogs || []).map((worklog) => ({
|
|
|
|
|
...worklog,
|
|
|
|
|
taskId: task.tempTaskId,
|
|
|
|
|
taskCode: task.tempTaskCode,
|
|
|
|
|
projectName: task.projectName,
|
|
|
|
|
deptName: task.deptName
|
|
|
|
|
}))
|
|
|
|
|
);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const scoreRows = computed<ReportScoreRow[]>(() => {
|
|
|
|
|
return filteredTasks.value.flatMap((task) =>
|
|
|
|
|
(task.scores || []).map((score) => ({
|
|
|
|
|
...score,
|
|
|
|
|
taskId: task.tempTaskId
|
|
|
|
|
}))
|
|
|
|
|
);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const totalHours = computed(() => sumHours(worklogRows.value));
|
|
|
|
|
|
|
|
|
|
const metrics = computed(() => [
|
|
|
|
|
{ label: '闭环任务数', value: filteredRows.value.length },
|
|
|
|
|
{ label: '实际工时合计', value: formatNumber(totalWorkload.value) },
|
|
|
|
|
{ label: '单任务平均工时', value: formatNumber(filteredRows.value.length ? totalWorkload.value / filteredRows.value.length : 0) },
|
|
|
|
|
{ label: '关闭任务数', value: filteredTasks.value.length },
|
|
|
|
|
{ label: '工时合计', value: formatNumber(totalHours.value) },
|
|
|
|
|
{ label: '评分记录数', value: scoreRows.value.length },
|
|
|
|
|
{ label: '未关闭任务数', value: runningTotal.value }
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
const dimensionLabel = computed(() => {
|
|
|
|
|
const labelMap: Record<string, string> = {
|
|
|
|
|
assignee: '主执行人',
|
|
|
|
|
member: '人员',
|
|
|
|
|
project: '项目',
|
|
|
|
|
dept: '发起部门',
|
|
|
|
|
result: '完成结果',
|
|
|
|
|
chain: '关联链'
|
|
|
|
|
dept: '归集部门',
|
|
|
|
|
score: '评分等级'
|
|
|
|
|
};
|
|
|
|
|
return labelMap[activeDimension.value] || '维度';
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const activeRows = computed(() => {
|
|
|
|
|
const fieldMap: Record<string, (row: TempTaskVO) => string> = {
|
|
|
|
|
assignee: (row) => row.assigneeName || '未填写执行人',
|
|
|
|
|
project: (row) => row.projectName || row.projectCode || '未绑定项目',
|
|
|
|
|
dept: (row) => row.requestDeptName || '未填写部门',
|
|
|
|
|
result: (row) => getFinishResultLabel(row.finishResult),
|
|
|
|
|
chain: (row) => row.relatedTaskCode || row.tempTaskCode || '未形成关联链'
|
|
|
|
|
if (activeDimension.value === 'score') {
|
|
|
|
|
return aggregateScores();
|
|
|
|
|
}
|
|
|
|
|
const fieldMap: Record<string, (row: ReportWorklogRow) => string> = {
|
|
|
|
|
member: (row) => row.userName || '未识别人员',
|
|
|
|
|
project: (row) => row.projectName || '未绑定项目',
|
|
|
|
|
dept: (row) => row.deptName || '未填写归集部门'
|
|
|
|
|
};
|
|
|
|
|
return aggregateBy(filteredRows.value, fieldMap[activeDimension.value]);
|
|
|
|
|
return aggregateWorklogs(fieldMap[activeDimension.value]);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const getFinishResultLabel = (value?: string) => {
|
|
|
|
|
const dictList = unref(temp_task_finish_result) || [];
|
|
|
|
|
const scoreLabel = (value?: string) => {
|
|
|
|
|
const dictList = unref(temp_task_score) || [];
|
|
|
|
|
const target = dictList.find((item: any) => item.value === value);
|
|
|
|
|
return target?.label || value || '未填写完成结果';
|
|
|
|
|
return target?.label || value || '未评分';
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const sumWorkload = (rows: TempTaskVO[]) => {
|
|
|
|
|
return rows.reduce((sum, row) => sum + Number(row.actualWorkload || 0), 0);
|
|
|
|
|
const buildScoreSummary = (grades: string[]) => {
|
|
|
|
|
const countMap = grades.reduce<Record<string, number>>((map, grade) => {
|
|
|
|
|
const key = scoreLabel(grade);
|
|
|
|
|
map[key] = (map[key] || 0) + 1;
|
|
|
|
|
return map;
|
|
|
|
|
}, {});
|
|
|
|
|
return Object.entries(countMap)
|
|
|
|
|
.map(([grade, count]) => `${grade}:${count}`)
|
|
|
|
|
.join(',');
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const buildTaskScoreSummary = (row: TempTaskVO) => {
|
|
|
|
|
return buildScoreSummary((row.scores || []).map((score) => score.scoreGrade));
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const sumHours = (rows: Array<{ hours?: number }>) => {
|
|
|
|
|
return rows.reduce((sum, row) => sum + Number(row.hours || 0), 0);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const formatNumber = (value: number) => {
|
|
|
|
|
@ -193,40 +252,113 @@ const formatDateTime = (value?: string) => {
|
|
|
|
|
return String(value).replace('T', ' ').slice(0, 16);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const aggregateBy = (rows: TempTaskVO[], keyGetter: (row: TempTaskVO) => string) => {
|
|
|
|
|
const result = new Map<string, AggregateRow>();
|
|
|
|
|
rows.forEach((row) => {
|
|
|
|
|
const aggregateWorklogs = (keyGetter: (row: ReportWorklogRow) => string) => {
|
|
|
|
|
const result = new Map<string, AggregateDraft>();
|
|
|
|
|
worklogRows.value.forEach((row) => {
|
|
|
|
|
const key = keyGetter(row);
|
|
|
|
|
const current =
|
|
|
|
|
result.get(key) ||
|
|
|
|
|
({
|
|
|
|
|
name: key,
|
|
|
|
|
count: 0,
|
|
|
|
|
workload: 0,
|
|
|
|
|
avgWorkload: 0,
|
|
|
|
|
finishedCount: 0,
|
|
|
|
|
terminatedCount: 0,
|
|
|
|
|
partialTerminatedCount: 0
|
|
|
|
|
} as AggregateRow);
|
|
|
|
|
current.count += 1;
|
|
|
|
|
current.workload += Number(row.actualWorkload || 0);
|
|
|
|
|
if (row.finishResult === '1') {
|
|
|
|
|
current.finishedCount += 1;
|
|
|
|
|
} else if (row.finishResult === '2') {
|
|
|
|
|
current.terminatedCount += 1;
|
|
|
|
|
} else if (row.finishResult === '3') {
|
|
|
|
|
current.partialTerminatedCount += 1;
|
|
|
|
|
}
|
|
|
|
|
current.avgWorkload = current.count ? formatNumber(current.workload / current.count) : 0;
|
|
|
|
|
current.workload = formatNumber(current.workload);
|
|
|
|
|
taskIds: new Set<string | number>(),
|
|
|
|
|
hours: 0,
|
|
|
|
|
scoreGrades: []
|
|
|
|
|
} as AggregateDraft);
|
|
|
|
|
current.taskIds.add(row.taskId);
|
|
|
|
|
current.hours += Number(row.hours || 0);
|
|
|
|
|
result.set(key, current);
|
|
|
|
|
});
|
|
|
|
|
return Array.from(result.values()).sort((a, b) => b.workload - a.workload);
|
|
|
|
|
appendScores(result, (score) => {
|
|
|
|
|
const member = memberNameById(score.memberId);
|
|
|
|
|
if (activeDimension.value === 'member') {
|
|
|
|
|
return member || '未识别人员';
|
|
|
|
|
}
|
|
|
|
|
const task = filteredTasks.value.find((item) => String(item.tempTaskId) === String(score.taskId));
|
|
|
|
|
if (activeDimension.value === 'project') {
|
|
|
|
|
return task?.projectName || '未绑定项目';
|
|
|
|
|
}
|
|
|
|
|
return task?.deptName || '未填写归集部门';
|
|
|
|
|
});
|
|
|
|
|
return toAggregateRows(result);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const aggregateScores = () => {
|
|
|
|
|
const result = new Map<string, AggregateDraft>();
|
|
|
|
|
scoreRows.value.forEach((score) => {
|
|
|
|
|
const key = scoreLabel(score.scoreGrade);
|
|
|
|
|
const current =
|
|
|
|
|
result.get(key) ||
|
|
|
|
|
({
|
|
|
|
|
name: key,
|
|
|
|
|
taskIds: new Set<string | number>(),
|
|
|
|
|
hours: 0,
|
|
|
|
|
scoreGrades: []
|
|
|
|
|
} as AggregateDraft);
|
|
|
|
|
current.taskIds.add(score.taskId);
|
|
|
|
|
current.scoreGrades.push(score.scoreGrade);
|
|
|
|
|
result.set(key, current);
|
|
|
|
|
});
|
|
|
|
|
return toAggregateRows(result);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const appendScores = (result: Map<string, AggregateDraft>, keyGetter: (score: ReportScoreRow) => string) => {
|
|
|
|
|
scoreRows.value.forEach((score) => {
|
|
|
|
|
const key = keyGetter(score);
|
|
|
|
|
const current =
|
|
|
|
|
result.get(key) ||
|
|
|
|
|
({
|
|
|
|
|
name: key,
|
|
|
|
|
taskIds: new Set<string | number>(),
|
|
|
|
|
hours: 0,
|
|
|
|
|
scoreGrades: []
|
|
|
|
|
} as AggregateDraft);
|
|
|
|
|
current.taskIds.add(score.taskId);
|
|
|
|
|
current.scoreGrades.push(score.scoreGrade);
|
|
|
|
|
result.set(key, current);
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const memberNameById = (memberId: string | number) => {
|
|
|
|
|
for (const task of filteredTasks.value) {
|
|
|
|
|
const member = (task.members || []).find((item) => String(item.memberId) === String(memberId));
|
|
|
|
|
if (member?.userName) {
|
|
|
|
|
return member.userName;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return '';
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const toAggregateRows = (result: Map<string, AggregateDraft>): AggregateRow[] => {
|
|
|
|
|
return Array.from(result.values())
|
|
|
|
|
.map((item) => {
|
|
|
|
|
const taskCount = item.taskIds.size;
|
|
|
|
|
return {
|
|
|
|
|
name: item.name,
|
|
|
|
|
taskCount,
|
|
|
|
|
hours: formatNumber(item.hours),
|
|
|
|
|
avgHours: taskCount ? formatNumber(item.hours / taskCount) : 0,
|
|
|
|
|
scoreCount: item.scoreGrades.length,
|
|
|
|
|
scoreSummary: buildScoreSummary(item.scoreGrades)
|
|
|
|
|
};
|
|
|
|
|
})
|
|
|
|
|
.sort((a, b) => b.hours - a.hours || b.scoreCount - a.scoreCount);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const buildQuery = () => {
|
|
|
|
|
queryParams.value.params = { ...monthRange.value };
|
|
|
|
|
return { ...queryParams.value };
|
|
|
|
|
return {
|
|
|
|
|
...queryParams.value,
|
|
|
|
|
deptId: undefined,
|
|
|
|
|
params: {
|
|
|
|
|
...queryParams.value.params,
|
|
|
|
|
includeDetail: true
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const getDeptList = async () => {
|
|
|
|
|
const res = await allListDept({ status: 0 } as any);
|
|
|
|
|
deptList.value = res.data || [];
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const getList = async () => {
|
|
|
|
|
@ -234,8 +366,10 @@ const getList = async () => {
|
|
|
|
|
try {
|
|
|
|
|
const res: any = await listTempTask(buildQuery());
|
|
|
|
|
detailRows.value = res.rows || [];
|
|
|
|
|
const runningRes: any = await listTempTask({ pageNum: 1, pageSize: 1, taskStatus: '2' });
|
|
|
|
|
runningTotal.value = runningRes.total || 0;
|
|
|
|
|
const runningResList = await Promise.all(
|
|
|
|
|
['2', '3', '4'].map((status) => listTempTask({ pageNum: 1, pageSize: 1, taskStatus: status } as TempTaskQuery))
|
|
|
|
|
);
|
|
|
|
|
runningTotal.value = runningResList.reduce((sum: number, item: any) => sum + Number(item.total || 0), 0);
|
|
|
|
|
} finally {
|
|
|
|
|
loading.value = false;
|
|
|
|
|
}
|
|
|
|
|
@ -248,10 +382,10 @@ const handleQuery = () => {
|
|
|
|
|
|
|
|
|
|
const resetQuery = () => {
|
|
|
|
|
finishMonth.value = currentMonth();
|
|
|
|
|
queryParams.value.taskType = undefined;
|
|
|
|
|
queryParams.value.assigneeName = undefined;
|
|
|
|
|
queryParams.value.projectName = undefined;
|
|
|
|
|
queryParams.value.requestDeptName = undefined;
|
|
|
|
|
queryParams.value.finishResult = undefined;
|
|
|
|
|
queryParams.value.deptId = undefined;
|
|
|
|
|
handleQuery();
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
@ -259,8 +393,9 @@ const handleExport = () => {
|
|
|
|
|
proxy?.download('oa/erp/tempTask/export', buildQuery(), `tempTask_report_${new Date().getTime()}.xlsx`);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
onMounted(() => {
|
|
|
|
|
getList();
|
|
|
|
|
onMounted(async () => {
|
|
|
|
|
await getDeptList();
|
|
|
|
|
await getList();
|
|
|
|
|
});
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
|