From 622473021ae237bb65ce8b2793fb2d81452135dc Mon Sep 17 00:00:00 2001 From: QiuSW <105186638@qq.com> Date: Mon, 5 Oct 2026 18:03:11 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=89=B9=E9=87=8F=E6=93=8D=E4=BD=9C?= =?UTF-8?q?=E5=8F=AA=E4=BD=BF=E7=94=A8=E5=BD=93=E5=89=8D=E9=A1=B5=E5=8B=BE?= =?UTF-8?q?=E9=80=89=20(#30)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/views/ProductListView.vue | 31 +++++++++++++++++++------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/frontend/src/views/ProductListView.vue b/frontend/src/views/ProductListView.vue index ce7851b..e8eb50d 100644 --- a/frontend/src/views/ProductListView.vue +++ b/frontend/src/views/ProductListView.vue @@ -228,6 +228,10 @@ const rows = ref([]) const total = ref(0) const loading = ref(false) const checkedIds = ref([]) +const visibleSelectedIDs = computed(() => { + const visible = new Set(rows.value.map((row) => row.id)) + return checkedIds.value.filter((id) => visible.has(id)) +}) const uploadPreviewNotice = ref(null) watch(checkedIds, () => { uploadPreviewNotice.value = null }) const searchingProductID = ref('') @@ -469,12 +473,16 @@ function renderStatus(value, dict) { } async function search(resetPage = true) { - if (resetPage) query.value.page = 1 + if (resetPage) { + query.value.page = 1 + checkedIds.value = [] + } loading.value = true try { const page = await ListProducts(query.value) rows.value = page.items || [] total.value = page.total || 0 + checkedIds.value = visibleSelectedIDs.value await loadVideoSummaries(rows.value) } catch (err) { message.error(String(err)) @@ -494,6 +502,12 @@ function changePageSize(size) { search() } +function changePage(page) { + query.value.page = page + checkedIds.value = [] + search(false) +} + // ---- 操作按钮 ---- async function run(action, fn) { running.value = action @@ -541,7 +555,7 @@ const productSyncSummary = computed(() => { return `${state}:成功 ${result.succeededShops}/${result.totalShops} 个店铺,失败 ${result.failedShops},未处理 ${result.skippedShops},实际保存 ${result.productCount} 条商品` }) -const selectedCount = computed(() => checkedIds.value.length) +const selectedCount = computed(() => visibleSelectedIDs.value.length) // ---- 批量取视频任务 ---- const emptyTaskProgress = () => ({ @@ -652,13 +666,13 @@ function uploadPreviewErrorCode(err) { } async function uploadSelectedVideo() { - if (checkedIds.value.length === 0) { + const selectedIDs = [...visibleSelectedIDs.value] + if (selectedIDs.length === 0) { message.warning('请先勾选要上传的商品') return } try { uploadPreviewNotice.value = null - const selectedIDs = [...checkedIds.value] // 使用 Wails 生成绑定的命名空间访问新方法;审核者生成绑定后即可直接使用。 const preview = await AppBindings.GetUploadPreview(selectedIDs) dialog.warning({ @@ -670,7 +684,7 @@ async function uploadSelectedVideo() { ` 可上传 ${preview.uploadableCount} 个,共 ${formatFileSize(preview.uploadableSize)}\n`, ` 缺少视频 ${preview.missingCount} 个\n`, ` 视频不合规 ${preview.invalidCount} 个(时长或像素不符合货憨憨要求)\n`, - checkedIds.value.length > 1 + selectedIDs.length > 1 ? ' 已有视频:执行时逐个检查,已有视频的会跳过\n' : '', '视频将通过 erpgo 提交。提交后会查询原操作状态;结果未确认时保持待处理,不会自动重复上传。', @@ -723,12 +737,13 @@ function stopTaskPolling() { } async function startVideoTask() { - if (checkedIds.value.length === 0) { + const selectedIDs = [...visibleSelectedIDs.value] + if (selectedIDs.length === 0) { message.warning('请先勾选要处理的商品') return } try { - await StartVideoTask([...checkedIds.value]) + await StartVideoTask(selectedIDs) await refreshTaskProgress() startTaskPolling() message.info('批量取视频已启动') @@ -989,7 +1004,7 @@ onUnmounted(() => { :page-size="query.pageSize" :page-sizes="[20, 50, 100, 200, 500]" show-size-picker - @update:page="search(false)" + @update:page="changePage" @update:page-size="changePageSize" />