From 9916ed5ccf168fd47b4824992f3777fb41f7b89e Mon Sep 17 00:00:00 2001 From: QiuSW <105186638@qq.com> Date: Fri, 28 Aug 2026 21:46:17 +0800 Subject: [PATCH] feat(web): add stock purchase workflow (#136) --- docs/03-business-rules-and-glossary.md | 5 +- web/src/api/goauto/purchase-tasks.js | 1 + web/src/views/goauto/pdd-products/index.vue | 49 +++++++++++++++++-- web/src/views/goauto/purchase-tasks/index.vue | 31 +++++++----- 4 files changed, 68 insertions(+), 18 deletions(-) diff --git a/docs/03-business-rules-and-glossary.md b/docs/03-business-rules-and-glossary.md index a42a25a..e9ed72f 100644 --- a/docs/03-business-rules-and-glossary.md +++ b/docs/03-business-rules-and-glossary.md @@ -2,8 +2,8 @@ generated: true (请先修改 Gitea Wiki,禁止直接编辑本文件) wiki_page: Business-Rules-and-Glossary wiki_url: https://git.ilapage.cn/OPC/goauto/wiki/Business-Rules-and-Glossary.- -wiki_revision: 92a67263229d3f98861b2526422d12ce13bb81c1 -synchronized_at: 2026-08-28T13:17:54Z +wiki_revision: 230c6c7c011843c87b64b9a8bca5f17718c2bede +synchronized_at: 2026-08-28T13:41:08Z # 业务规则与术语 @@ -125,6 +125,7 @@ synchronized_at: 2026-08-28T13:17:54Z - 采购域使用独立的 `purchase_task`、`purchase_task_attempt` 和可选 `pdd_account` 引用;PDD、虾皮和 SYB 商品表不保存采购订单、支付、物流或回填字段。 - `purchase_task.task_type` 区分 `syb_order` 与 `stock`。旧任务迁移为 `syb_order`;备货任务只引用已完成采集且处于 `active` 的 PDD 商品,颜色/尺码必须逐字命中当前可选规格,规格来源固定为 `direct_select`,SYB/虾皮身份快照为空。 - 备货任务不占用 SYB 活动槽,同一 PDD 商品可存在多个待执行备货任务,但设备、可选账号和执行期互斥仍沿用采购安全边界。备货任务不参与商品替换、批量重试、重新采购授权或 SYB 回填;失败后由人员重新创建备货任务。 +- Admin 在处于 `active` 且具有当前可选颜色价格(有尺码维度时还须有可选尺码)的 PDD 商品详情创建备货任务;颜色、尺码只能从最新采集档案选择,不允许自由输入,颜色切换后按已采集价格更新默认上下限。采购管理列表和详情用“订单采购 / 备货采购”区分类型;备货任务的 SYB/虾皮字段显示为空、失败任务不提供重试,并明确提示“备货采购不参与库存扣减与订单关联。” - 正式任务必须引用一条 SYB 商品明细;演练任务可以从 PDD 商品人工创建且不引用 SYB。 - 创建时固化三个商品身份、蝦皮订单号、目标和映射规格、数量、价格区间、币种、URL、`goods_id`、规则、设备和可选账号引用。商品档案后续修改不改变任务解释。正式任务的蝦皮订单号来自 SYB 商品 `order_code`,同一订单号可以对应多条商品和多个采购任务,不作为唯一键。 - Android 无法可靠识别登录中的 PDD 账号,因此账号引用可空;已知账号才参与账号级串行,未知账号不会阻止采购任务。 diff --git a/web/src/api/goauto/purchase-tasks.js b/web/src/api/goauto/purchase-tasks.js index 1d49629..8c6bb5e 100644 --- a/web/src/api/goauto/purchase-tasks.js +++ b/web/src/api/goauto/purchase-tasks.js @@ -5,6 +5,7 @@ export function getPurchaseTask(taskId) { return request({ url: `/api/admin/v1/p export function previewPurchaseTasks(data, options = {}) { return request({ url: '/api/admin/v1/purchase-tasks/batch-preview', method: 'post', data, ...options }) } export function createPurchaseTasksBatch(data) { return request({ url: '/api/admin/v1/purchase-tasks/batch', method: 'post', data }) } export function retryPurchaseTasksBatch(data) { return request({ url: '/api/admin/v1/purchase-tasks/batch-retry', method: 'post', data }) } +export function createStockPurchaseTask(data, options = {}) { return request({ url: '/api/admin/v1/purchase-tasks/stock', method: 'post', data, ...options }) } export function authorizeRepurchase(taskId, data) { return request({ url: `/api/admin/v1/purchase-tasks/${taskId}/authorize-repurchase`, method: 'post', data }) } export function reviewPurchasePayment(taskId, data) { return request({ url: `/api/admin/v1/purchase-tasks/${taskId}/payment-review`, method: 'post', data }) } export function selectPurchaseWriteback(taskId, data) { return request({ url: `/api/admin/v1/purchase-tasks/${taskId}/writeback-candidate`, method: 'post', data }) } diff --git a/web/src/views/goauto/pdd-products/index.vue b/web/src/views/goauto/pdd-products/index.vue index c3d4a61..4224968 100644 --- a/web/src/views/goauto/pdd-products/index.vue +++ b/web/src/views/goauto/pdd-products/index.vue @@ -63,7 +63,7 @@