From c6251810b57c4a69a1844398fe4bfd594195b873 Mon Sep 17 00:00:00 2001 From: ye1023 <12588209+ye1023@user.noreply.gitee.com> Date: Wed, 10 Jun 2026 09:39:32 +0800 Subject: [PATCH] =?UTF-8?q?yxk-20260610-=E5=AE=A1=E6=89=B9=E5=8E=86?= =?UTF-8?q?=E5=8F=B2=E9=A1=B5=E9=9D=A2=20=E5=AE=A1=E6=89=B9=E5=8E=86?= =?UTF-8?q?=E5=8F=B2=E9=A1=B5=E9=9D=A2=E6=94=B9=E4=B8=BA=E4=B8=80=E6=AC=A1?= =?UTF-8?q?=E5=8A=A0=E8=BD=BD=E5=AE=8C=E6=95=B4=E5=AE=A1=E6=89=B9=E5=8E=86?= =?UTF-8?q?=E5=8F=B2=E5=B9=B6=E5=85=A8=E9=83=A8=E5=B1=95=E7=A4=BA=EF=BC=9B?= =?UTF-8?q?=E8=A1=A8=E6=A0=BC=E4=B8=8A=E6=96=B9=E5=A2=9E=E5=8A=A0=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E5=90=8D=E7=A7=B0=E5=B9=B3=E9=93=BA=20checkbox?= =?UTF-8?q?=EF=BC=8C=E9=BB=98=E8=AE=A4=E5=85=A8=E9=80=89=E3=80=82=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E5=8B=BE=E9=80=89=E6=88=96=E5=8F=96=E6=B6=88=E5=8B=BE?= =?UTF-8?q?=E9=80=89=E8=8A=82=E7=82=B9=E6=97=B6=EF=BC=8C=E4=BB=85=E5=9C=A8?= =?UTF-8?q?=E5=89=8D=E7=AB=AF=E8=BF=87=E6=BB=A4=E8=A1=A8=E6=A0=BC=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=EF=BC=8C=E4=B8=8D=E8=B0=83=E7=94=A8=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../content/TaskApprovalHistoryContent.vue | 172 ++++++++++++++++-- 1 file changed, 152 insertions(+), 20 deletions(-) diff --git a/src/views/super/bpm/process/personalOffice/myHandleTask/content/TaskApprovalHistoryContent.vue b/src/views/super/bpm/process/personalOffice/myHandleTask/content/TaskApprovalHistoryContent.vue index 7bb1eea..be0e69e 100644 --- a/src/views/super/bpm/process/personalOffice/myHandleTask/content/TaskApprovalHistoryContent.vue +++ b/src/views/super/bpm/process/personalOffice/myHandleTask/content/TaskApprovalHistoryContent.vue @@ -1,5 +1,17 @@ @@ -11,11 +23,16 @@ */ import { BasicTable, useTable } from '/@/components/Table'; import type { BasicColumn } from '/@/components/Table'; - import { onMounted, watch } from 'vue'; + import { onMounted, ref, watch } from 'vue'; import { list as queryApprovalOpinionList } from '/@/views/taskApprovalOpinion/TaskApprovalOpinion.api'; + interface ApprovalHistoryRecord { + [key: string]: any; + taskName?: string; + } + const approvalHistoryColumns: BasicColumn[] = [ - { title: '节点名称', dataIndex: 'taskName', width: 160, align: 'left' }, + { title: '节点名称', dataIndex: 'taskName', width: 160, align: 'center' }, { title: '开始时间', dataIndex: 'startTime', width: 170, align: 'center' }, { title: '办理时间', dataIndex: 'opTime', width: 170, align: 'center' }, { @@ -43,7 +60,11 @@ }, }, setup(props) { - const [registerTable, { reload }] = useTable({ + const allApprovalHistoryList = ref([]); + const taskNameOptions = ref([]); + const selectedTaskNames = ref([]); + + const [registerTable, { reload, setTableData }] = useTable({ title: '', api: getApprovalHistoryList, columns: approvalHistoryColumns, @@ -55,35 +76,107 @@ useSearchForm: false, canResize: false, immediate: false, - pagination: { - pageSize: 10, - }, + pagination: false, scroll: { x: 1290 }, }); - // 按流程实例查询审批历史,只查 task_approval_opinion 表 - function getApprovalHistoryList(params) { - const processInstId = - props.formData?.procInsId || - props.formData?.procInstId || - props.formData?.processInstanceId; - if (!processInstId) { - return Promise.resolve({ records: [], total: 0 }); + function getProcessInstId(): string { + return props.formData?.procInsId || props.formData?.procInstId || props.formData?.processInstanceId; + } + + function normalizeTaskName(taskName: unknown): string { + return typeof taskName === 'string' ? taskName.trim() : ''; + } + + function resolveRecords(res: any): ApprovalHistoryRecord[] { + if (Array.isArray(res)) { + return res; } - return queryApprovalOpinionList({ - ...params, + return res?.records || res?.result?.records || []; + } + + function resolveTotal(res: any, fallbackTotal: number): number { + return Number(res?.total || res?.result?.total || fallbackTotal || 0); + } + + function getFilteredApprovalHistoryList(): ApprovalHistoryRecord[] { + if (selectedTaskNames.value.length === 0) { + return []; + } + const selectedNameSet = new Set(selectedTaskNames.value); + return allApprovalHistoryList.value.filter((record) => { + const taskName = normalizeTaskName(record.taskName); + return taskName && selectedNameSet.has(taskName); + }); + } + + function resetTaskNameFilter(records: ApprovalHistoryRecord[]) { + const taskNames = records.map((record) => normalizeTaskName(record.taskName)).filter(Boolean); + taskNameOptions.value = Array.from(new Set(taskNames)); + selectedTaskNames.value = [...taskNameOptions.value]; + } + + function applyTaskNameFilter() { + setTableData(getFilteredApprovalHistoryList()); + } + + function handleTaskNameChange(checkedValues: string[]) { + selectedTaskNames.value = checkedValues; + applyTaskNameFilter(); + } + + function selectAllTaskNames() { + selectedTaskNames.value = [...taskNameOptions.value]; + applyTaskNameFilter(); + } + + function clearTaskNames() { + selectedTaskNames.value = []; + applyTaskNameFilter(); + } + + // 按流程实例查询审批历史,只查 task_approval_opinion 表 + async function getApprovalHistoryList() { + const processInstId = getProcessInstId(); + if (!processInstId) { + allApprovalHistoryList.value = []; + resetTaskNameFilter([]); + return { records: [], total: 0 }; + } + + const queryParams = { processInstId, column: 'startTime', order: 'asc', + }; + + // 接口默认为分页返回,先取首批数据和总数;若未拿全,再按总数补齐完整审批历史。 + const firstRes = await queryApprovalOpinionList({ + ...queryParams, + pageNo: 1, + pageSize: 10, }); + const firstRecords = resolveRecords(firstRes); + const total = resolveTotal(firstRes, firstRecords.length); + let records = firstRecords; + if (total > firstRecords.length) { + const fullRes = await queryApprovalOpinionList({ + ...queryParams, + pageNo: 1, + pageSize: total, + }); + records = resolveRecords(fullRes); + } + + allApprovalHistoryList.value = records; + resetTaskNameFilter(records); + const filteredRecords = getFilteredApprovalHistoryList(); + return { records: filteredRecords, total: filteredRecords.length }; } // 组件挂载时自动加载(解决 tab 懒加载场景下父组件 reload 调用时子组件未挂载的问题) onMounted(() => { - const processInstId = - props.formData?.procInsId || - props.formData?.procInstId || - props.formData?.processInstanceId; + const processInstId = getProcessInstId(); if (processInstId) { reload(); } @@ -102,6 +195,11 @@ return { registerTable, reload, + taskNameOptions, + selectedTaskNames, + handleTaskNameChange, + selectAllTaskNames, + clearTaskNames, }; }, }; @@ -112,4 +210,38 @@ height: 100%; padding: 4px 0; } + + .approval-history-filter { + display: flex; + align-items: flex-start; + gap: 8px; + margin-bottom: 8px; + padding: 4px 0; + } + + .approval-history-filter__label { + flex: 0 0 auto; + line-height: 32px; + color: rgba(0, 0, 0, 0.85); + } + + .approval-history-filter__checkboxes { + display: flex; + flex: 1; + flex-wrap: wrap; + gap: 6px 12px; + min-width: 0; + padding-top: 5px; + + :deep(.ant-checkbox-wrapper) { + margin-left: 0; + } + } + + .approval-history-filter__actions { + display: flex; + flex: 0 0 auto; + align-items: center; + line-height: 32px; + }