feat: 支持批量导入 PDD 商品链接 (#104)

This commit is contained in:
chengma
2026-08-10 16:14:24 +08:00
parent 7bd75510b2
commit 188725ff64
15 changed files with 911 additions and 32 deletions
+11 -1
View File
@@ -134,7 +134,8 @@ PDD 商品之所以单独一个模块,是因为它在数据上就是**独立
维护拼多多商品档案,并发起采集。这条链路**不依赖蝦皮和顺运宝的任何数据**,
可以单独跑通:建商品 → 建采集任务 → Client 领走执行 → 提交结果 → 页面显示已采集。
**顶部工具条:** 创建按钮、创建采集任务按钮、采集状态筛选、商品 ID/链接搜索框、搜索按钮、删除按钮。
**顶部工具条:** 添加 PDD 商品、批量导入、创建采集任务、采集状态筛选、
商品 ID/链接搜索框、搜索和删除。
**中间表格:**
@@ -158,6 +159,15 @@ PDD 商品之所以单独一个模块,是因为它在数据上就是**独立
不接受短链接——`goods_id` 上有 UNIQUE 约束,防重全靠它,
拿不到就没法查重,同一个商品会存成好几行。
**批量导入:** 接受第一列标题为“拼多多链接”的一列式 `.xlsx`,读取第一个
非空工作表,忽略空工作表和空行,一次最多 5000 条。逐行复用单条创建的链接解析、
去重和软删除恢复规则;已存在有效商品保留采集结果。无效行不阻塞其他合法行,
但必须显示 Excel 行号和原因;数据库异常时合法行整体回滚。
上传只建立商品档案,**不得自动创建采集任务**。导入结果保留本次合法且去重后的
完整商品集合,采购员显式确认后才能为这一集合批量创建任务;该集合不受列表分页限制,
客户端选择、权限、状态跳过和任务去重继续使用现有规则。
**双击行打开弹窗:** 查看商品信息,可编辑链接,并显示采回来的规格和价格。
- `[必须]` **规格和价格必须显示**,这是采集结果的全部价值所在——
+24 -2
View File
@@ -235,13 +235,14 @@ M 个 SKU,K 行解析失败"),覆盖掉正常的统计文案,并且回
### 5.1 工具条
```text
[添加 PDD 商品] [创建采集任务] 采集状态[全部▾] 商品ID/链接[___] [搜索] [删除]
[添加 PDD 商品] [批量导入] [创建采集任务] 采集状态[全部▾] 商品ID/链接[___] [搜索] [删除]
```
- **添加 PDD 商品** → 弹窗,只填 PDD 链接。
`[必须]` 文案要写全,**不能简写成「创建」**:同一条工具条上还有
「创建采集任务」,两个都以「创建」开头,第一次用的人分不清
哪个是加商品、哪个是发起采集。
- **批量导入** → 弹窗选择一列式 `.xlsx`;上传只建档,不自动发采集任务。
- **创建采集任务** → 勾选多行后可用。
- **采集状态筛选** → 全部 / 未采集 / 采集中 / 已采集 / 采集失败。
`[必须]` 这个筛选是**刚需**,不是锦上添花:这个页面的主要用途是维护
@@ -305,7 +306,28 @@ M 个 SKU,K 行解析失败"),覆盖掉正常的统计文案,并且回
`[必须]` 报错要说清**下一步怎么办**,例如"请在拼多多 App 的商品页点
「分享」→「复制链接」,拿到带 `goods_id=` 的完整链接"。光说"链接无效"操作员不知道改什么。
### 5.4 编辑弹窗(双击行打开)
### 5.4 批量导入弹窗与结果
弹窗有可见“Excel 文件”标签和持续格式说明:只接受不超过 10MB 的 `.xlsx`;
读取第一个非空工作表,第一列标题必须为“拼多多链接”,每行一个带 `goods_id=` 的
完整链接,最多 5000 条。空工作表、空行忽略,短链接继续拒绝。
上传期间提交按钮显示“导入中…”并禁用,防止重复提交。完成后在工具条下方显示:
```text
本次导入结果
总行数 N · 新建 N · 已存在 N · 恢复 N · 文件内重复 N · 失败 N
[为本次导入商品创建采集任务]
```
- 新建、已存在、软删除恢复和文件内重复必须分开统计;
- 失败明细完整显示 Excel 行号、原始内容和可操作原因,长链接允许换行;
- 结果不能只靠颜色表达,并使用可访问的文字标题和区域标签;
- 本次导入的合法商品超过当前分页时,仍能由结果按钮一次提交完整集合;
- 点击结果按钮才打开现有客户端选择确认流程,默认不指定客户端;
- 上传完成本身不创建任务,已采集/采集中等跳过规则在最终确认后执行。
### 5.5 编辑弹窗(双击行打开)
```text
┌─────────────────────────────────────────────┐
+5
View File
@@ -24,6 +24,8 @@
再加解析失败的用例(确认 `parse_ok=0` 且不瞎猜);
- **Excel 导入分行**:商品汇总行 vs SKU 行的判断;
- **upsert 不覆盖人工字段**:先填 PDD 链接,再导入一次,断言链接还在;
- **PDD 链接批量导入**:空工作表、正确/错误表头、两个允许域名、短链/非 PDD
链接、空行、5000 条边界、文件内重复、新建/复用/复活分类和重复导入不覆盖采集结果;
- 任务创建校验:商品、采集结果、有效映射、数量、人民币价格上限、客户端可见范围逐条覆盖;
- 采购任务重复提交保护、部分业务失败、PDD 换品隔离和采集选项失效;
- 金额换算显示(分 ↔ 元),边界值 0 和大额;
@@ -106,6 +108,9 @@
**禁止用 `template.HTML` 包裹用户可控内容**——商品名、订单号都来自外部。
- `[必须]` 上传的 Excel 限制**大小和扩展名**,解析失败要返回明确错误,
不能 panic 把整个进程带崩。
- `[必须]` PDD 链接导入还要校验 xlsx 文件头和 5000 条非空数据行上限;
文件结构错误时不写库,行内容错误时导入其他合法行并列出全部失败明细,
数据库异常时本批合法行整体回滚。
- `[必须]` 文件名不得直接用于拼路径(路径穿越),落盘时用自己生成的名字。
- `[建议]` MVP 只监听 `127.0.0.1`,不对外暴露。要给内网用再单独评估。
- `[必须]` 不提供固定默认密码和公开注册;第一位管理员由用户首次初始化。