feat: 重构顺运宝规格主链路 (#88)
This commit is contained in:
@@ -196,11 +196,10 @@ PDD 商品之所以单独一个模块,是因为它在数据上就是**独立
|
||||
| 订单号 | |
|
||||
| 商品标题 | |
|
||||
| 蝦皮商品 ID | 关联蝦皮数据模块 |
|
||||
| 规格 SKU | 蝦皮的规格编号 |
|
||||
| 数量 | |
|
||||
| 价格 | 蝦皮售价,**台币分**,见 §7 |
|
||||
| 图片 | 存 URL,表格里显示缩略图 |
|
||||
| 处理阶段 | 未找到蝦皮商品 / 待确认蝦皮规格 / 未关联 PDD / 待采集 / 采集中 / 采集失败 / 规格待匹配 / 可采购 / 采购数据异常 / 已创建任务 |
|
||||
| 处理阶段 | 采购数据异常(顺运宝未提供规格)/ 未关联 PDD / 待采集 / 采集中 / 采集失败 / 规格待匹配 / 可采购 / 已创建任务 |
|
||||
| 下一步 | 每行只显示当前最需要完成的一个操作 |
|
||||
| 更新时间 | |
|
||||
|
||||
@@ -208,15 +207,16 @@ PDD 商品之所以单独一个模块,是因为它在数据上就是**独立
|
||||
|
||||
**双击行或点击下一步打开处理弹窗:**
|
||||
|
||||
- 顺运宝商品 ID 能找到蝦皮商品后,先确认蝦皮 SKU。规格原文完全一致,或解析后的颜色尺码只有一个唯一候选时可以自动确认;零候选和多候选必须人工选择,不能猜。
|
||||
- `shopee_sku_id` 只表示“蝦皮规格已确认”,不等于 PDD 规格已经匹配。完整处理阶段还要检查当前 PDD 关联、采集状态和 `sku_mappings`。
|
||||
- 蝦皮 SKU 确认后,可在同一弹窗填写完整 PDD 链接并创建采集任务;链接关联规则与蝦皮详情完全一致。
|
||||
- 顺运宝的 `product_spec` 是匹配主链路的真实来源;系统不再要求先确认蝦皮 SKU。
|
||||
- “规格身份键” `spec_key` 只对顺运宝规格原文去除首尾空白、折叠连续空白,用于判断是否是同一条规格;颜色、尺寸和建议的解析只用于显示与推荐,不改变身份。
|
||||
- 找到蝦皮商品后,可在同一弹窗填写完整 PDD 链接并创建采集任务;链接关联规则与蝦皮详情完全一致。
|
||||
|
||||
- 显示蝦皮规格原文和当前 PDD 商品 `skus_json` 里的动态规格组合与人民币价格;
|
||||
- PDD 维度来自采集结果的 `dimensions`,不得写死成颜色、尺码两个维度;
|
||||
- 操作员选好对应关系,点保存;
|
||||
- `[必须]` 保存的是**可复用的 SKU 映射**,不是这一张订单的临时数据。
|
||||
下次遇到同一个蝦皮 SKU 自动带出,操作员只需确认。
|
||||
- `[必须]` 保存的是**可复用的商品规格映射**,键为
|
||||
`(蝦皮商品 ID, spec_key, PDD 商品 ID)`,不是这一张订单的临时数据。
|
||||
下次遇到同商品、同规格和同 PDD 商品时自动带出。
|
||||
- `[必须]` 该商品尚未采集(`skus_json` 为空)时,弹窗直接展示关联和创建采集任务入口,
|
||||
而不是显示一个空列表让人困惑。
|
||||
|
||||
@@ -333,7 +333,7 @@ PDD 商品之所以单独一个模块,是因为它在数据上就是**独立
|
||||
|
||||
1. 该蝦皮商品已填 PDD 链接;
|
||||
2. 当前 PDD 商品已采集成功(`skus_json` 非空);
|
||||
3. 该蝦皮 SKU 已有 PDD 规格映射;
|
||||
3. 该顺运宝规格非空,且已有当前 PDD 商品的规格映射;
|
||||
4. 数量大于 0;
|
||||
5. **价格上限已填且大于 0** —— 默认从当前映射的 PDD 规格价格带出,操作员可改,但不允许为空;
|
||||
6. 已选择分配的客户端;
|
||||
@@ -470,9 +470,8 @@ MVP 之后:
|
||||
- **采集任务不指定客户端**,谁领到算谁的;采购任务仍可分配,也允许留空。
|
||||
- 任务**分配给指定客户端**,Client 只领分给自己的。
|
||||
- **不加心跳接口**;设置页显式登记,领取接口保留兼容登记,在线状态由最近活动时间派生。
|
||||
- SKU 映射**独立成表且可复用**,同一蝦皮 SKU 只人工匹配一次。
|
||||
- 货运单的"规格 SKU"**直接对应蝦皮 `商品規格ID`**,不需要转换。
|
||||
但**不加外键**——本地查不到该 SKU 是常态,见 [03 数据模型](03-data-model.md) §4。
|
||||
- 规格映射**独立成表且可复用**,按 `(蝦皮商品 ID, spec_key, PDD 商品 ID)` 隔离;换 PDD 商品不会误用旧映射,换回时可继续复用。
|
||||
- 货运单的规格原文来自顺运宝;不再依赖蝦皮 `商品規格ID` 才能关联 PDD 和建立规格映射。
|
||||
- Admin 不提供固定默认密码;第一次启动由用户创建第一个管理员,之后初始化入口永久关闭。
|
||||
- 账号只有 `admin`(管理员)和 `purchaser`(采购员)两种固定角色;采购员不能管理用户。
|
||||
- Web 登录只保护 HTML 页面,`/api/v1/client/*` 不使用网页登录 Session,现有 Client 行为保持不变。
|
||||
|
||||
+53
-47
@@ -128,6 +128,12 @@ SQLite 同一时刻只允许一个写事务,连接放太开会互相抢锁、
|
||||
错误要等操作员点到那个页面才暴露,如果那是个写操作页面,暴露出来的就不是报错
|
||||
而是写坏数据。自检只查表名,不逐列校验:够抓住"迁移没跑到"这一类问题,代价也低。
|
||||
|
||||
MySQL 迁移 v3(工单 #88)是追加式迁移:新增 `spec_mappings`,为 `syb_orders`
|
||||
增加 `spec_key`,为 `shopee_products` 增加 `source`。迁移使用稳定 `syb_id`
|
||||
游标分批回填,先完整备份旧 `sku_mappings` 为 `sku_mappings_v3_backup`,
|
||||
再转换能找到顺运宝商品与规格的映射。复跑、字段已建但约束未建等中断状态必须自动收敛;
|
||||
启动自检除表名外还校验 v3 主键、长度、二进制排序规则和 `source` 取值约束。
|
||||
|
||||
## 3. 蝦皮数据
|
||||
|
||||
蝦皮报表**一个文件里混了两层数据**,所以拆成两张表。
|
||||
@@ -140,6 +146,7 @@ CREATE TABLE shopee_products (
|
||||
title TEXT NOT NULL, -- 蝦皮「商品名稱」
|
||||
shopee_status TEXT, -- 蝦皮「商品當前狀態」
|
||||
main_sku_code TEXT, -- 蝦皮「主商品貨號」
|
||||
source VARCHAR(16) COLLATE utf8mb4_bin NOT NULL DEFAULT 'report', -- report / syb
|
||||
|
||||
-- 下面两个是我们自己维护的,报表里没有,导入时绝不能覆盖
|
||||
pdd_goods_url TEXT, -- ★ 人工填写的 PDD 链接原文
|
||||
@@ -149,11 +156,18 @@ CREATE TABLE shopee_products (
|
||||
updated_at TEXT NOT NULL
|
||||
);
|
||||
|
||||
ALTER TABLE shopee_products ADD CONSTRAINT chk_shopee_products_source
|
||||
CHECK (source IN ('report', 'syb'));
|
||||
|
||||
CREATE INDEX idx_shopee_products_pdd ON shopee_products(pdd_goods_id);
|
||||
```
|
||||
|
||||
`[必须]` **采集结果和采集状态不在这张表里**,它们属于 PDD 商品,见 §4。
|
||||
|
||||
`source='syb'` 表示顺运宝先到、蝦皮报表尚未导入时创建的最小商品骨架。
|
||||
后续 Excel 导入同一 `goods_id` 时必须补全商品信息并把来源提升为 `report`;
|
||||
导入不得覆盖人工维护的 PDD 关联。
|
||||
|
||||
`pdd_goods_id` 表示"这个蝦皮商品**当前**对应哪个 PDD 商品"。
|
||||
PDD 商品下架换代时改这里,是一个随时会变的关联,不是永久绑定。
|
||||
|
||||
@@ -299,7 +313,7 @@ CREATE INDEX idx_pdd_products_status ON pdd_products(collect_status);
|
||||
|
||||
**为什么用软删除**
|
||||
|
||||
`sku_mappings` 指向这张表。硬删会把人工攒了很久的匹配成果一起带走。
|
||||
`spec_mappings` 指向这张表。硬删会把人工攒了很久的匹配成果一起带走。
|
||||
软删除后界面不再显示,但记录和映射都还在。
|
||||
|
||||
`[必须]` 操作员重新填同一个链接时**要能复活**(清 `deleted_at`、状态置回
|
||||
@@ -434,9 +448,10 @@ CREATE TABLE syb_orders (
|
||||
syb_id TEXT PRIMARY KEY, -- 货运单**明细行** ID(顺运宝 details[].id)
|
||||
order_no TEXT NOT NULL, -- 订单号(顺运宝外层 code,不是 orderCode)
|
||||
title TEXT, -- 商品标题
|
||||
product_spec TEXT, -- 规格原文,v5 新增,对应 shopee_skus.spec_raw
|
||||
product_spec TEXT, -- 顺运宝规格原文
|
||||
spec_key VARCHAR(191), -- 规格身份键;空规格保持 NULL
|
||||
shopee_goods_id TEXT, -- 蝦皮商品 ID(顺运宝 productId,11 位)
|
||||
shopee_sku_id TEXT, -- 蝦皮规格 ID,人工/自动匹配的结果
|
||||
shopee_sku_id TEXT, -- 历史兼容列;新主链路不读写
|
||||
quantity INTEGER NOT NULL CHECK (quantity > 0),
|
||||
price_twd_cent INTEGER CHECK (price_twd_cent IS NULL OR price_twd_cent >= 0),
|
||||
image_url TEXT, -- 存 URL,不存图片本身
|
||||
@@ -453,24 +468,12 @@ CREATE INDEX idx_syb_orders_list ON syb_orders(updated_at DESC, syb_id DESC);
|
||||
- `price_twd_cent` 是**台币分**,是蝦皮那边的售价,
|
||||
和采购任务的人民币价格上限**没有换算关系**,不要互相赋值。
|
||||
- `image_url` 存 URL。`[必须]` 不要把图片二进制存进数据库。
|
||||
- `shopee_sku_id` **直接对应 `shopee_skus.sku_id`**,编号格式一致,不需要额外转换。
|
||||
|
||||
`[必须]` 但**不要加外键约束**。理由:蝦皮报表不是全量目录(样本里平均每商品仅 1.17 个 SKU),
|
||||
货运单来了而本地查不到这个 SKU 是**常态**。加了外键,同步就会直接失败。
|
||||
|
||||
正确做法是软关联:查不到时照常保存货运单,界面上标出"SKU 未收录",
|
||||
并引导操作员到蝦皮数据模块手动新增(见 [05 界面规范](05-ui-specification.md) §4.4)。
|
||||
|
||||
**"编号能对上"和"本地一定查得到"是两回事,别混。**
|
||||
|
||||
**处理阶段是派生的,不存字段**:`shopee_sku_id` 非空只表示蝦皮规格已确认。
|
||||
PDD 规格是否已匹配要联查 `sku_mappings`,同时限定 `shopee_sku_id` 和当前
|
||||
`pdd_goods_id`,并确认 `pdd_option_key` 仍存在于最新 `skus_json`;选项消失后按待匹配处理。
|
||||
|
||||
`[必须]` **`shopee_sku_id` 顺运宝同步绝不能覆盖**(工单 #46)。它是蝦皮规格识别
|
||||
结果(人工确认或确定性唯一识别产生),顺运宝那边根本没有这个值(顺运宝只给商品级 `productId`,
|
||||
不含蝦皮規格ID,见 §5.1 下方接口对照)。`repository.UpsertSybOrder` 的
|
||||
`ON CONFLICT DO UPDATE SET` 里不出现这一列,新建行时才会写它(此时通常是空值)。
|
||||
- `spec_key` 通过 `SpecKey(product_spec)` 计算:去除首尾空白,把连续空白折叠为一个半角空格,
|
||||
但不做大小写、繁简、颜色或单位转换。空规格不生成键,并在采购流程中作为数据异常阻断。
|
||||
- **处理阶段是派生的,不存字段**:PDD 规格是否已匹配要按
|
||||
`(shopee_goods_id, spec_key, 当前 pdd_goods_id)` 联查 `spec_mappings`,并确认 `pdd_option_key`
|
||||
仍存在于最新 `skus_json`。
|
||||
- `shopee_sku_id` 只为兼容历史数据保留;顺运宝同步、弹窗、映射和建采购任务均不再读写它。
|
||||
|
||||
`[必须]` 一行对应顺运宝一张货运单的**一个商品明细**(`details[]` 的一项),
|
||||
不是一张货运单——一张货运单可以有多个商品,各占一行,`syb_id` 用的是
|
||||
@@ -518,33 +521,35 @@ CREATE TABLE syb_sync_state (
|
||||
`[必须]` 本表不保存顺运宝 Cookie、token、密码、验证码、收件信息或原始响应。
|
||||
失败原因最多保留 500 个字符,并在页面输出时由模板转义。
|
||||
|
||||
## 6. `sku_mappings` 规格映射
|
||||
## 6. `spec_mappings` 顺运宝规格映射
|
||||
|
||||
"蝦皮的这个规格 = 拼多多的那个规格",**匹配一次,以后复用**。
|
||||
"这个蝦皮商品的这条顺运宝规格 = 当前拼多多商品的那个规格",**匹配一次,以后复用**。
|
||||
|
||||
```sql
|
||||
CREATE TABLE sku_mappings (
|
||||
shopee_sku_id TEXT NOT NULL,
|
||||
pdd_goods_id TEXT NOT NULL, -- ★ 这条映射属于哪个 PDD 商品
|
||||
pdd_option_key TEXT NOT NULL, -- 规范化的组合键,见 §6.2
|
||||
pdd_options TEXT NOT NULL, -- 原始 options 对象,显示用
|
||||
goods_id TEXT NOT NULL, -- 蝦皮商品 ID,方便按商品批量查
|
||||
mapped_at TEXT NOT NULL,
|
||||
mapped_by TEXT,
|
||||
PRIMARY KEY (shopee_sku_id, pdd_goods_id),
|
||||
FOREIGN KEY (shopee_sku_id) REFERENCES shopee_skus(sku_id) ON DELETE CASCADE
|
||||
CREATE TABLE spec_mappings (
|
||||
shopee_goods_id VARCHAR(191) COLLATE utf8mb4_bin NOT NULL,
|
||||
spec_key VARCHAR(191) COLLATE utf8mb4_bin NOT NULL,
|
||||
pdd_goods_id VARCHAR(191) COLLATE utf8mb4_bin NOT NULL,
|
||||
pdd_option_key VARCHAR(191) COLLATE utf8mb4_bin NOT NULL, -- 见 §6.2
|
||||
pdd_options LONGTEXT NOT NULL, -- 原始 options JSON,显示用
|
||||
spec_raw TEXT NOT NULL,
|
||||
mapped_at VARCHAR(35) NOT NULL,
|
||||
mapped_by VARCHAR(191),
|
||||
PRIMARY KEY (shopee_goods_id, spec_key, pdd_goods_id),
|
||||
KEY idx_spec_mappings_goods (shopee_goods_id),
|
||||
KEY idx_spec_mappings_pdd (pdd_goods_id)
|
||||
);
|
||||
|
||||
CREATE INDEX idx_sku_mappings_goods ON sku_mappings(goods_id);
|
||||
CREATE INDEX idx_sku_mappings_pdd ON sku_mappings(pdd_goods_id);
|
||||
```
|
||||
|
||||
### 6.1 为什么主键要带上 `pdd_goods_id`
|
||||
`[必须]` 不加外键。顺运宝明细可能比蝦皮报表更早到达,同步要先创建 skeleton 商品;
|
||||
PDD 商品还可软删除,映射作为审计和可恢复数据必须保留。
|
||||
|
||||
### 6.1 为什么主键要带上商品和 `pdd_goods_id`
|
||||
|
||||
PDD 商品下架换代很频繁——A 买不到了就得换 B。
|
||||
|
||||
假设蝦皮商品 X 原来对应 PDD 商品 A,操作员匹配好了"黑色/M → 黑色/M码";
|
||||
后来 A 下架,换成了 B。如果映射只按 `shopee_sku_id` 存,那条旧映射还在,
|
||||
后来 A 下架,换成了 B。如果映射不带 `pdd_goods_id`,那条旧映射还在,
|
||||
但它描述的是 **A 的规格**:
|
||||
|
||||
| | 后果 |
|
||||
@@ -555,8 +560,9 @@ PDD 商品下架换代很频繁——A 买不到了就得换 B。
|
||||
把 `pdd_goods_id` 放进主键后,`[必须]` 查映射**永远带上"当前对应的 PDD 商品"**:
|
||||
|
||||
```sql
|
||||
SELECT ... FROM sku_mappings
|
||||
WHERE shopee_sku_id = ?
|
||||
SELECT ... FROM spec_mappings
|
||||
WHERE shopee_goods_id = ?
|
||||
AND spec_key = ?
|
||||
AND pdd_goods_id = (蝦皮商品当前的 pdd_goods_id)
|
||||
```
|
||||
|
||||
@@ -701,12 +707,12 @@ CREATE TABLE clients (
|
||||
|
||||
```text
|
||||
shopee_products ──1:N──→ shopee_skus
|
||||
│ │
|
||||
│ pdd_goods_id │ shopee_sku_id
|
||||
│ (当前对应哪个 ↓
|
||||
│ PDD 商品,可换) sku_mappings ──pdd_goods_id──┐
|
||||
↓ │
|
||||
pdd_products ←────────────────────────────────────────┘
|
||||
│
|
||||
│ pdd_goods_id(当前 PDD 商品,可换)
|
||||
↓
|
||||
pdd_products ←─pdd_goods_id─ spec_mappings
|
||||
↑
|
||||
syb_orders ─(shopee_goods_id, spec_key)─┘
|
||||
(skus_json 里是所有规格和价格)
|
||||
|
||||
syb_orders ──创建──→ tasks ──分配──→ clients
|
||||
@@ -717,7 +723,7 @@ users(采购员)──1:N 当前归属──────────┘
|
||||
两条关联都可以变,这是有意的:
|
||||
|
||||
- `shopee_products.pdd_goods_id`:PDD 商品下架换代时改
|
||||
- `sku_mappings` 按 `(蝦皮SKU, PDD商品)` 存:换了商品自然查不到旧映射
|
||||
- `spec_mappings` 按 `(蝦皮商品, 顺运宝规格键, PDD商品)` 存:换了商品自然查不到旧映射
|
||||
|
||||
## 11. 与 Client 数据模型的关系
|
||||
|
||||
|
||||
@@ -153,6 +153,7 @@
|
||||
| ☐ | 勾选 |
|
||||
| 商品 ID | |
|
||||
| 商品名称 | 截断 + 悬停完整 |
|
||||
| 数据来源 | 蝦皮报表 / 顺运宝补建;不只靠颜色区分 |
|
||||
| 颜色 / 尺码 / 建议 | 解析失败的显示为 `—` 并**整行标黄**,提示需人工补 |
|
||||
| PDD 链接 | 空的显示"**未填写**"并标红,这是最需要操作员注意的状态 |
|
||||
| 采集状态 | 未填链接 / 未采集 / 采集中 / 已采集 / 采集失败。**数据来自两张表**,判断方式见 [01 需求](01-requirements.md) §6.1 |
|
||||
@@ -197,6 +198,9 @@
|
||||
|
||||
### 4.4 手动新增
|
||||
|
||||
> 本节是旧 SKU 确认流程的历史要求,已被工单 #88 的顺运宝 `spec_key`
|
||||
> 主链路取代;保留仅为说明蝦皮报表数据可继续独立维护,顺运宝处理不再以此为前置条件。
|
||||
|
||||
`[必须]` 必须提供"新增 SKU"入口。
|
||||
|
||||
原因:蝦皮报表只包含**有销售成绩的** SKU(样本里平均每个商品仅 1.17 个),
|
||||
@@ -468,27 +472,25 @@ HTML 片段,只替换弹窗内部的表格、总数和分页。主货运单表
|
||||
|
||||
### 6.2 表格列
|
||||
|
||||
☐ / 货运单明细ID / 订单号 / 商品标题 / 规格 / 蝦皮商品ID / 规格SKU / 数量 /
|
||||
☐ / 货运单明细ID / 订单号 / 商品标题 / 规格 / 蝦皮商品ID / 数量 /
|
||||
价格(台币)/ 图片 / **处理阶段** / **下一步** / 更新时间
|
||||
|
||||
- 一行对应顺运宝一张货运单的**一个商品明细**,不是一张货运单——一张货运单
|
||||
可以有多个商品,各占一行。
|
||||
- 图片显示小缩略图。`[必须]` 存 URL,不要把图片塞进数据库。
|
||||
- 处理阶段是按当前关联事实**算出来的**,不是存一份容易过期的状态字段。阶段至少区分:
|
||||
未找到蝦皮商品、待确认蝦皮规格、未关联 PDD、PDD 待采集、采集中、采集失败、
|
||||
规格待匹配、可采购、采购数据异常和已创建任务。`shopee_sku_id` 非空只说明蝦皮规格已确认。
|
||||
采购数据异常(顺运宝未提供规格)、未关联 PDD、PDD 待采集、采集中、
|
||||
采集失败、规格待匹配、可采购和已创建任务。
|
||||
- 每行显示一个有文字的“下一步”按钮;双击行和按钮打开同一个服务端渲染处理弹窗。
|
||||
- 规格原文完全一致,或解析后的颜色尺码只有一个唯一候选时,系统可以自动确认
|
||||
蝦皮 SKU;零候选或多候选必须由采购员选择,不能模糊猜测。
|
||||
- 规格原文为空时不显示匹配表单,明确提示“顺运宝未提供规格”,并禁止建立映射或创建采购任务。
|
||||
- 完整货运单 JSON 不作为列显示,落在 `syb_data` 里,供后续排查用。
|
||||
|
||||
### 6.3 采购处理与规格匹配弹窗(双击行或点击下一步打开)
|
||||
|
||||
弹窗按当前处理阶段渐进展示。第一步先确认蝦皮 SKU;顺运宝同步本身仍不提供
|
||||
`shopee_sku_id`,但同步写入明细后可以根据本地蝦皮数据做确定性唯一匹配。
|
||||
后续 PDD 关联、采集和规格映射使用同一个弹窗继续完成。
|
||||
弹窗按当前处理阶段渐进展示。它直接以顺运宝规格原文及其 `spec_key`
|
||||
连接当前 PDD 商品选项,不再经过蝦皮 SKU 确认步骤。PDD 关联、采集和规格映射使用同一个弹窗完成。
|
||||
|
||||
确认蝦皮 SKU 后,弹窗先展示当前 PDD 商品 ID、完整链接和采集状态。未关联时
|
||||
弹窗先展示当前 PDD 商品 ID、完整链接和采集状态。未关联时
|
||||
可直接填写完整链接;换成其他商品需要明确确认。待采集或采集失败时显示
|
||||
“创建采集任务”或“重新创建采集任务”,采集中和已采集状态只显示说明。
|
||||
|
||||
@@ -512,11 +514,11 @@ HTML 片段,只替换弹窗内部的表格、总数和分页。主货运单表
|
||||
|
||||
- 右侧下拉的选项来自该商品 `skus_json` 里的 `dimensions`,
|
||||
**不要写死"颜色/尺码"两个维度**——PDD 商品可能有第三个维度。
|
||||
- **打开时先查 `sku_mappings`**,有记录就自动带出并提示"已自动带出"。
|
||||
这是省人工的关键:同一个蝦皮 SKU 只需人工匹配一次。
|
||||
- **打开时先按 `(蝦皮商品 ID, spec_key, 当前 PDD 商品 ID)` 查 `spec_mappings`**,
|
||||
有记录就自动带出并提示"已自动带出"。
|
||||
- 查询必须同时带当前 `pdd_goods_id`,并核对选项仍存在且可购买;换品或选项消失时回到待匹配。
|
||||
- 该商品**还没采集**(`skus_json` 为空)时,不要显示空下拉,直接展示关联和创建采集任务入口。
|
||||
- 保存写的是 `sku_mappings`(可复用),**不是这一张订单的临时数据**。
|
||||
- 保存写的是 `spec_mappings`(可复用),**不是这一张订单的临时数据**。
|
||||
|
||||
### 6.4 创建采购任务
|
||||
|
||||
|
||||
Reference in New Issue
Block a user