From 5bedb9b6dd6fbbc5cca4688c5e7af4b95943f23b Mon Sep 17 00:00:00 2001 From: hwj Date: Fri, 10 Apr 2026 16:45:28 +0800 Subject: [PATCH] =?UTF-8?q?style=EF=BC=9A=E4=BB=BB=E5=8A=A1=E5=8D=95?= =?UTF-8?q?=E6=8E=92=E4=BA=A7-=E6=8E=92=E4=BA=A7=E5=BC=B9=E6=A1=86-?= =?UTF-8?q?=E5=A4=8D=E9=80=89=E6=A1=86=E9=80=BB=E8=BE=91=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/TaskScheduleDialog.vue | 202 ++++++++++-------- 1 file changed, 107 insertions(+), 95 deletions(-) diff --git a/src/views/mes/tasksummary/components/TaskScheduleDialog.vue b/src/views/mes/tasksummary/components/TaskScheduleDialog.vue index 6b23967e..6dc3eef6 100644 --- a/src/views/mes/tasksummary/components/TaskScheduleDialog.vue +++ b/src/views/mes/tasksummary/components/TaskScheduleDialog.vue @@ -62,7 +62,7 @@ - + @@ -184,6 +184,7 @@ const emit = defineEmits(['success']) const dialogVisible = ref(false) const taskLoading = ref(false) const detailLoading = ref(false) +const taskSelectionLoading = ref(false) const submitLoading = ref(false) const previewVisible = ref(false) const itemNeedRef = ref() @@ -222,6 +223,9 @@ const taskList = ref([]) const detailList = ref([]) const currentTask = ref() const allDetailsMap = ref>({}) // store details per taskId +const taskDetailRequestMap = new Map>() +const currentDetailRequestId = ref(0) +const taskTableBusy = computed(() => taskLoading.value || taskSelectionLoading.value) const loadTaskList = async () => { taskLoading.value = true @@ -250,121 +254,127 @@ const loadTaskList = async () => { } } -const loadDetailList = async (taskId?: number) => { - if (!taskId) { - detailList.value = [] - return - } +const getTaskDetailList = async (taskRow?: any) => { + const taskId = taskRow?.id + if (!taskId) return [] - // Use cached list if exists if (allDetailsMap.value[taskId]) { - detailList.value = allDetailsMap.value[taskId] - return + return allDetailsMap.value[taskId] } - detailLoading.value = true - try { - const data = await TaskApi.getTaskDetailPage({ - pageNo: 1, - pageSize: 10, - taskId - }) - console.log('currentTask.value',currentTask.value) - const list = (data?.list ?? []).map((item: any) => ({ - ...item, - _parentTaskOrderPriority: currentTask.value?.isUrgent, - _parentTaskDeliveryDate: currentTask.value?.deliveryDate - })) - - // Cache the loaded list - allDetailsMap.value[taskId] = list - detailList.value = list - } finally { - detailLoading.value = false + const pendingRequest = taskDetailRequestMap.get(taskId) + if (pendingRequest) { + return pendingRequest } + + const requestPromise = TaskApi.getTaskDetailPage({ + pageNo: 1, + pageSize: 10, + taskId + }) + .then((data: any) => { + const list = (data?.list ?? []).map((item: any) => ({ + ...item, + _parentTaskOrderPriority: taskRow?.isUrgent, + _parentTaskDeliveryDate: taskRow?.deliveryDate + })) + allDetailsMap.value[taskId] = list + return list + }) + .finally(() => { + taskDetailRequestMap.delete(taskId) + }) + + taskDetailRequestMap.set(taskId, requestPromise) + return requestPromise } const handleCurrentTaskChange = async (row: any) => { if (!row) return currentTask.value = row - await loadDetailList(row?.id) - - // Re-apply selection state for children when view changes - nextTick(() => { - const parentIsSelected = taskTableRef.value?.getSelectionRows()?.some((t: any) => t.id === row.id) - if (parentIsSelected) { - detailList.value.forEach(child => { - detailTableRef.value?.toggleRowSelection(child, true) - }) + const requestId = ++currentDetailRequestId.value + detailLoading.value = true + try { + const list = await getTaskDetailList(row) + if (requestId !== currentDetailRequestId.value || currentTask.value?.id !== row.id) return + detailList.value = list + nextTick(() => { + const parentIsSelected = taskTableRef.value?.getSelectionRows()?.some((t: any) => t.id === row.id) + if (parentIsSelected) { + detailList.value.forEach(child => { + detailTableRef.value?.toggleRowSelection(child, true) + }) + } + }) + } finally { + if (requestId === currentDetailRequestId.value) { + detailLoading.value = false } - }) + } } const handleTaskSelect = async (selection: any[], row: any) => { - const isSelected = selection.some((item) => item.id === row.id) - - // load detail list to cache if not exists - if (!allDetailsMap.value[row.id]) { - currentTask.value = row - await loadDetailList(row.id) - } - - const childList = allDetailsMap.value[row.id] || [] - - if (isSelected && childList.length === 0) { - message.warning(`任务单 ${row.code} 无任务明细数据,无法勾选`) - taskTableRef.value?.toggleRowSelection(row, false) - return - } - - if (childList.length) { - childList.forEach((child) => { - // Find the row in detailList if currently displayed, or just use the child object - // `toggleRowSelection` needs the exact object reference that is in `data` - const rowInView = detailList.value.find(d => d.id === child.id) - if (rowInView) { - detailTableRef.value?.toggleRowSelection(rowInView, isSelected) - } else { - // If not in view but we want to select it, we can push it to selection or wait until viewed - // In Element Plus, toggleRowSelection works best with displayed data. - // We'll rely on handleCurrentTaskChange to re-apply selection if needed when viewed. + if (taskSelectionLoading.value) return + taskSelectionLoading.value = true + try { + const isSelected = selection.some((item) => item.id === row.id) + if (isSelected) { + await handleCurrentTaskChange(row) + const childList = allDetailsMap.value[row.id] || [] + if (childList.length === 0) { + message.warning(`任务单 ${row.code} 无任务明细数据,无法勾选`) + taskTableRef.value?.toggleRowSelection(row, false) + return } - }) + detailList.value.forEach((child) => { + detailTableRef.value?.toggleRowSelection(child, true) + }) + return + } + + const childList = allDetailsMap.value[row.id] || [] + if (currentTask.value?.id === row.id) { + childList.forEach((child) => { + const rowInView = detailList.value.find(d => d.id === child.id) + if (rowInView) { + detailTableRef.value?.toggleRowSelection(rowInView, false) + } + }) + } + } finally { + taskSelectionLoading.value = false } } const handleTaskSelectAll = async (selection: any[]) => { - const isAllSelected = selection.length > 0 - - if (isAllSelected) { - const validRows = [] - let hasEmptyChild = false - - for (const row of selection) { - if (!allDetailsMap.value[row.id]) { - currentTask.value = row - await loadDetailList(row.id) + if (taskSelectionLoading.value) return + taskSelectionLoading.value = true + try { + const isAllSelected = selection.length > 0 + if (isAllSelected) { + let hasEmptyChild = false + for (const row of selection) { + const childList = await getTaskDetailList(row) + if (childList.length === 0) { + hasEmptyChild = true + taskTableRef.value?.toggleRowSelection(row, false) + } else { + childList.forEach((child) => { + const rowInView = detailList.value.find(d => d.id === child.id) + if (rowInView) { + detailTableRef.value?.toggleRowSelection(rowInView, true) + } + }) + } } - const childList = allDetailsMap.value[row.id] || [] - - if (childList.length === 0) { - hasEmptyChild = true - taskTableRef.value?.toggleRowSelection(row, false) - } else { - validRows.push(row) - childList.forEach((child) => { - const rowInView = detailList.value.find(d => d.id === child.id) - if (rowInView) { - detailTableRef.value?.toggleRowSelection(rowInView, true) - } - }) + if (hasEmptyChild) { + message.warning('部分任务单无明细数据,已自动取消勾选') } + } else { + detailTableRef.value?.clearSelection() } - if (hasEmptyChild) { - message.warning('部分任务单无明细数据,已自动取消勾选') - } - } else { - detailTableRef.value?.clearSelection() + } finally { + taskSelectionLoading.value = false } } @@ -406,6 +416,8 @@ const handleDetailSelectAll = (selection: any[]) => { } } +const isTaskRowSelectable = () => !taskTableBusy.value && !detailLoading.value + const handleSearch = async () => { queryParams.pageNo = 1 await loadTaskList()