From 9e54263ee60282c5dc903d6cc26d01ba75a370f9 Mon Sep 17 00:00:00 2001 From: QiuSW <105186638@qq.com> Date: Mon, 12 Oct 2026 17:17:08 +0800 Subject: [PATCH] =?UTF-8?q?feat(web):=20=E9=87=87=E8=B4=AD=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E5=A2=9E=E5=8A=A0=E8=AE=BE=E5=A4=87/=E5=88=9B?= =?UTF-8?q?=E5=BB=BA=E4=BA=BA=E7=AD=9B=E9=80=89=E4=B8=8E=E5=88=9B=E5=BB=BA?= =?UTF-8?q?=E4=BA=BA=E5=B1=95=E7=A4=BA=20(#382)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 筛选区新增「设备」「创建人」可清空可搜索下拉,选项来自 filter-options,含未分派/Agent 发起/未记录;参与查询、重置与导出 - 表格在设备列后新增「创建人」列,详情新增创建人与创建来源 Co-Authored-By: Claude Sonnet 5.5 Claude-Session: https://claude.ai/code/session_01NTDbDcwbDw1TSAcE6wfh2F --- web/src/api/goauto/purchase-tasks.js | 1 + web/src/views/goauto/purchase-tasks/index.vue | 22 ++++++++++++++++--- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/web/src/api/goauto/purchase-tasks.js b/web/src/api/goauto/purchase-tasks.js index 6bc5fc3..cb0bd37 100644 --- a/web/src/api/goauto/purchase-tasks.js +++ b/web/src/api/goauto/purchase-tasks.js @@ -19,6 +19,7 @@ export function listPurchaseTasks(params) { } }) } +export function getPurchaseTaskFilterOptions() { return request({ url: '/api/admin/v1/purchase-tasks/filter-options', method: 'get' }) } export function getPurchaseTask(taskId) { return request({ url: `/api/admin/v1/purchase-tasks/${taskId}`, method: 'get' }) } export function previewPurchaseTasks(data, options = {}) { return request({ url: '/api/admin/v1/purchase-tasks/batch-preview', method: 'post', data, ...options }) } export function matchPurchaseSpecsBatch(data) { return request({ url: '/api/admin/v1/purchase-tasks/batch-spec-match', method: 'post', data, timeout: 610000 }) } diff --git a/web/src/views/goauto/purchase-tasks/index.vue b/web/src/views/goauto/purchase-tasks/index.vue index c446345..385702a 100644 --- a/web/src/views/goauto/purchase-tasks/index.vue +++ b/web/src/views/goauto/purchase-tasks/index.vue @@ -14,6 +14,8 @@ + + @@ -30,6 +32,7 @@ + @@ -56,6 +59,7 @@ {{ detail.task.quantity }} 件{{ specSourceLabel(detail.task.specSource) }} 查看映射 {{ priceText(detail.task.minUnitPriceCent, detail.task.currency) }} ~ {{ priceText(detail.task.maxUnitPriceCent, detail.task.currency) }}{{ priceText(detail.task.referenceUnitPriceCent, detail.task.currency) }} {{ detail.task.deviceName || '尚未分派' }}{{ detail.task.addressSuffix || '未生成' }} + {{ creatorLabel(detail.task) }}{{ createdSourceLabel(detail.task.createdSource) }}

规格匹配

@@ -153,7 +157,7 @@ import { parsePurchaseOrderFilter } from '@/utils/purchase-order-filter' import { ElMessage, ElMessageBox } from 'element-plus' import { RefreshLeft, Search } from '@element-plus/icons-vue' -import { authorizeRepurchase, cancelPurchaseTask, choosePurchaseMatching, getPurchaseTask, listPurchaseTasks, requeuePurchaseMatching, resolveUnknownPurchaseTask, retryPurchaseTasksBatch, reviewPurchasePayment, selectPurchaseWriteback, writebackPurchaseOrderNumbers } from '@/api/goauto/purchase-tasks' +import { authorizeRepurchase, cancelPurchaseTask, choosePurchaseMatching, getPurchaseTask, getPurchaseTaskFilterOptions, listPurchaseTasks, requeuePurchaseMatching, resolveUnknownPurchaseTask, retryPurchaseTasksBatch, reviewPurchasePayment, selectPurchaseWriteback, writebackPurchaseOrderNumbers } from '@/api/goauto/purchase-tasks' import { createRequestId } from '@/utils/request-id' import { saveExcel } from '@/utils/save-excel' import { EXPORT_MAX_ROWS, PURCHASE_EXPORT_HEADER, PURCHASE_EXPORT_NUMBER_COLS, exportFailureMessage, purchaseExportRow, runListExport } from '@/utils/list-export' @@ -175,7 +179,8 @@ export default { exporting: false, exportProgress: { done: 0, steps: 0 }, detailSession: 0, snapshots: { items: {}, loading: false, error: false }, orderWriteback: { open: false, saving: false, items: [] }, - query: { page: 1, pageSize: 20, taskId: '', taskType: '', shopeeOrderNo: '', status: '', executionMode: 'live', sybProductId: '', pddOrderNo: '', orderSubmittedRange: [] }, + query: { page: 1, pageSize: 20, taskId: '', taskType: '', shopeeOrderNo: '', status: '', executionMode: 'live', sybProductId: '', pddOrderNo: '', orderSubmittedRange: [], deviceId: '', createdBy: '' }, + filterOptions: { devices: [], creators: [] }, detail: { open: false, loading: false, task: null, attempts: [], matching: null }, matchingAction: { saving: false }, matchingDialog: { open: false, saving: false, color: '', size: '' }, retrySelection: [], @@ -214,6 +219,7 @@ export default { beforeUnmount() { this.clearSnapshots() }, deactivated() { this.detail.open = false; this.clearSnapshots() }, created() { + this.loadFilterOptions() const taskId = Number(this.$route.query.taskId) if (Number.isInteger(taskId) && taskId > 0) { this.query.taskId = String(taskId) @@ -241,7 +247,17 @@ export default { return params }, search() { this.query.page = 1; this.load() }, - reset() { this.query = { page: 1, pageSize: 20, taskId: '', taskType: '', shopeeOrderNo: '', status: '', executionMode: 'live', sybProductId: '', pddOrderNo: '', orderSubmittedRange: [] }; this.load() }, + reset() { this.query = { page: 1, pageSize: 20, taskId: '', taskType: '', shopeeOrderNo: '', status: '', executionMode: 'live', sybProductId: '', pddOrderNo: '', orderSubmittedRange: [], deviceId: '', createdBy: '' }; this.load() }, + // #382: options only list devices/creators that appear on purchase tasks; failure leaves the static options usable. + async loadFilterOptions() { + try { const r = await getPurchaseTaskFilterOptions(); this.filterOptions = { devices: r.data.devices || [], creators: r.data.creators || [] } } catch (error) { this.filterOptions = { devices: [], creators: [] } } + }, + createdSourceLabel(source) { return { admin: '管理端', client_api: '客户端接口', agent: 'Agent' }[source] || '未记录' }, + creatorLabel(task) { + if (task.createdSource === 'agent') return 'Agent' + if (!task.createdSource) return '未记录' + return task.createdByName || (task.createdBy ? `用户 #${task.createdBy}` : '未记录') + }, // #372: export every page of the filters as they are at click time (params are copied once). async exportExcel() { if (this.exporting || this.orderFilter.error) return