Admin:PDD 商品支持批量导入 Excel 链接 #104

Closed
opened 2026-08-10 15:55:56 +08:00 by ila · 4 comments
Owner

基本信息

  • 类型:需求
  • 父级大工单:#14
  • 所属 MVP / 版本:#15 Admin 四模块可用闭环
  • 阶段:PDD 商品数据与采集任务分配
  • 状态:待验收
  • 依赖:复用现有 PDD 商品建档与批量采集任务规则(含 #74 的可选客户端能力)

要解决什么

PDD 商品模块目前只能逐条粘贴链接创建商品。采购员已有按 raw_data/pdd链接.xlsx 整理的一列式链接清单,逐条录入效率低且容易漏录或重复录入;导入后还需要能够针对本次导入的商品批量创建采集任务。

已核对样本:第一个有效工作表的第一列标题为“拼多多链接”,下面是带 goods_id 的完整 PDD 链接;其余工作表可能为空。样本同时包含 yangkeduo.com 和 pinduoduo.com 域名,现有链接解析规则均可识别。

做什么 / 不做什么

  • 做:
    • 在 PDD 商品列表顶部、“添加 PDD 商品”旁增加“批量导入”按钮和 Excel 上传弹窗。
    • 接受 .xlsx 文件,读取第一个���空工作表中标题为“拼多多链接”的第一列,忽略空工作表、空行和单元格首尾空白。
    • 每行复用现有完整 PDD 链接解析及 goods_id 去重规则;支持 yangkeduo.com、pinduoduo.com,继续拒绝不含 goods_id 的短链接。
    • 最多处理 5000 条非空数据行;校验扩展名、文件大小和 xlsx 文件头,解析失败不得导致进程崩溃。
    • 新商品创建为待采集;已存在且有效的商品复用并保留标题、规格和采集状态;已软删除商品按现有规则复活并清空失效采集结果;同一文件内重复 goods_id 只处理一次。
    • 合法行允许导入,非法行逐条列出 Excel 行号、原始内容和可操作的失败原因;数据库写入放在同一事务中,数据库异常时整批合法行回滚。
    • 导入结果显示总行数、新建、已存在、复活、文件内重复和失败数量,并完整展示失败明细。
    • 结果页提供“为本次导入商品创建采集任务”按钮;点击后复用现有批量采集确认和可选客户端规则,默认不指定客户端,并继续执行已采集、采集中、超时和重复任务的现有跳过规则。
    • 更新 Admin 的 PDD 页面/质量文档并增加脱敏自动化测试;用 raw_data/pdd链接.xlsx 做一次本地人工核对,但不提交商业样本。
  • 不做:
    • 不在上传完成后自动创建采集任务,必须由采购员显式确认。
    • 不支持 .xls、CSV、PDD 短链接或任意网页链接。
    • 不增加导入批次表,不持久化原始上传文件,不修改数据库结构。
    • 不覆盖已存在有效商品的采集结果,不先清空 PDD 商品表。
    • 不修改 Client 四接口,不执行手机采集、采购或下单。

怎么做

  • admin/handler/web/web.go:增加带登录与 CSRF 防护的 POST /pdd/import 路由。
  • admin/handler/web/pdd.go:限制请求体和文件类型,使用服务端生成的安全临时文件名,调用 Service 后渲染导入统计与失败明细;Handler 不解析 Excel、不写 SQL。
  • admin/service/pdd_import.go(新增):使用固定版本 github.com/xuri/excelize/v2 v2.9.1 流式读取工作表;识别表头、限制行数、调用现有 ParsePddGoodsID,完成文件内去重、分类统计和事务编排。
  • admin/repository/pdd.go:在事务边界内复用或补充能够区分新建、已存在、复活结果的 PDD upsert;SQL 参数化,不改变现有单条创建行为。
  • admin/templates/pdd/list.html:增加导入弹窗、格式提示、统计/失败明细和“为本次导入商品创建采集任务”入口;复用现有客户端选择确认交互,页面在 1366×768 下可操作。
  • admin/static/js/app.js:仅在复用现有弹窗/本次导入 ID 传递确有需要时做最小原生 JavaScript 调整,不引入前端框架或构建工具。
  • 增加 admin/service/pdd_import_test.go、相邻 Handler/Repository 测试及 testdata/ 脱敏小样本;更新 docs/admin/01-requirements.md、docs/admin/05-ui-specification.md、docs/admin/06-quality-security.md 中相关稳定规则。
  • 不新增数据库迁移;现有 pdd_products.goods_id 唯一约束足以保证商品档案不重复。

验收标准

  • PDD 商品页“添加 PDD 商品”旁显示“批量导入”,可从弹窗上传 .xlsx,所有写请求通过 CSRF 校验。
  • raw_data/pdd链接.xlsx 的 8 条链接可全部识别,空 Sheet2/Sheet3 不报错,两个现有 PDD 域名均导入成功。
  • 非 xlsx、伪造扩展名、空文件、超限文件、缺少“拼多多链接”列或超过 5000 条时明确拒绝且不写库。
  • 新商品、已存在商品、已软删除商品和文件内重复商品分别按既有规则处理;重复导入不产生重复记录,也不清空有效采集结果。
  • 文件中部分链接无效时,其他合法行可导入;页面逐行显示失败行号、原始值和原因,不静默丢行。
  • 任一数据库写入���常时,本次合法行整体回滚,并明确提示没有部分生效。
  • 导入结果准确显示总行数、新建、已存在、复活、重复和失败数量。
  • 上传成功不会自动创建任务;采购员点击“为本次导入商品创建采集任务”并确认后,才按现有可选客户端、权限、去重及状态规则创建任务。
  • 导入结果中的商品超过当前分页范围时,仍能一次提交本次导入集合,不依赖逐页勾选。
  • 不新增数据库表或迁移,不改变 Client 四接口,不触发采集、采购、真实下单或付款。
  • 页面在 1366×768 下可完成上传、查看结果和创建采集任务,错误信息有文字且不只靠颜色表达。
  • Go 1.23.0 下 build、test、vet 通过,自动化测试使用脱敏固件,商业样本未进入 Git。

怎么验证

从 admin/ 目录执行:

$env:GOTOOLCHAIN='go1.23.0'
gofmt -l .
go build ./...
go test ./... -count=1
go vet ./...
Remove-Item Env:GOTOOLCHAIN

人工验证:

  1. 使用管理员和正常状态采购员分别打开 PDD 商品页,上传 raw_data/pdd链接.xlsx。
  2. 核对 8 条链接、两个域名、三个工作表的处理结果和页面统计。
  3. 再次上传同一文件,确认不新增重复商品、不清空已采集结果。
  4. 使用含重复、空行、短链接、非 PDD 链接和错误表头的脱敏文件核对逐行反馈。
  5. 导入后点击“为本次导入商品创建采集任务”,分别验证默认不指定、指定可见客户端和伪造不可见客户端。

风险和回退

  • 风险:批量导入意外覆盖既有采集结果。控制方式是复用 goods_id 唯一键和现有 upsert/复活语义,覆盖重复导入回归测试,禁止清表导入。
  • 风险:恶意或异常 Excel 消耗内存、磁盘。控制方式是请求体、文件大小、扩展名、xlsx 文件头和 5000 行上限,并使用流式读取和服务端生成文件名。
  • 风险:导入后误发大量采集任务。控制方式是上传只建商品,创建任务必须二次显式确认并复用现有客户端权限和任务去重规则。
  • 回退:回退本工单代码与文档提交即可;无数据库迁移。已经导入的商品属于正常业务档案,不自动删除;已经显式创建的任务按现有取消/状态规则处理。
## 基本信息 - 类型:需求 - 父级大工单:#14 - 所属 MVP / 版本:#15 Admin 四模块可用闭环 - 阶段:PDD 商品数据与采集任务分配 - 状态:待验收 - 依赖:复用现有 PDD 商品建档与批量采集任务规则(含 #74 的可选客户端能力) ## 要解决什么 PDD 商品模块目前只能逐条粘贴链接创建商品。采购员已有按 `raw_data/pdd链接.xlsx` 整理的一列式链接清单,逐条录入效率低且容易漏录或重复录入;导入后还需要能够针对本次导入的商品批量创建采集任务。 已核对样本:第一个有效工作表的第一列标题为“拼多多链接”,下面是带 `goods_id` 的完整 PDD 链接;其余工作表可能为空。样本同时包含 `yangkeduo.com` 和 `pinduoduo.com` 域名,现有链接解析规则均可识别。 ## 做什么 / 不做什么 - 做: - 在 PDD 商品列表顶部、“添加 PDD 商品”旁增加“批量导入”按钮和 Excel 上传弹窗。 - 接受 `.xlsx` 文件,读取第一个���空工作表中标题为“拼多多链接”的第一列,忽略空工作表、空行和单元格首尾空白。 - 每行复用现有完整 PDD 链接解析及 `goods_id` 去重规则;支持 `yangkeduo.com`、`pinduoduo.com`,继续拒绝不含 `goods_id` 的短链接。 - 最多处理 5000 条非空数据行;校验扩展名、文件大小和 xlsx 文件头,解析失败不得导致进程崩溃。 - 新商品创建为待采集;已存在且有效的商品复用并保留标题、规格和采集状态;已软删除商品按现有规则复活并清空失效采集结果;同一文件内重复 `goods_id` 只处理一次。 - 合法行允许导入,非法行逐条列出 Excel 行号、原始内容和可操作的失败原因;数据库写入放在同一事务中,数据库异常时整批合法行回滚。 - 导入结果显示总行数、新建、已存在、复活、文件内重复和失败数量,并完整展示失败明细。 - 结果页提供“为本次导入商品创建采集任务”按钮;点击后复用现有批量采集确认和可选客户端规则,默认不指定客户端,并继续执行已采集、采集中、超时和重复任务的现有跳过规则。 - 更新 Admin 的 PDD 页面/质量文档并增加脱敏自动化测试;用 `raw_data/pdd链接.xlsx` 做一次本地人工核对,但不提交商业样本。 - 不做: - 不在上传完成后自动创建采集任务,必须由采购员显式确认。 - 不支持 `.xls`、CSV、PDD 短链接或任意网页链接。 - 不增加导入批次表,不持久化原始上传文件,不修改数据库结构。 - 不覆盖已存在有效商品的采集结果,不先清空 PDD 商品表。 - 不修改 Client 四接口,不执行手机采集、采购或下单。 ## 怎么做 - `admin/handler/web/web.go`:增加带登录与 CSRF 防护的 `POST /pdd/import` 路由。 - `admin/handler/web/pdd.go`:限制请求体和文件类型,使用服务端生成的安全临时文件名,调用 Service 后渲染导入统计与失败明细;Handler 不解析 Excel、不写 SQL。 - `admin/service/pdd_import.go`(新增):使用固定版本 `github.com/xuri/excelize/v2 v2.9.1` 流式读取工作表;识别表头、限制行数、调用现有 `ParsePddGoodsID`,完成文件内去重、分类统计和事务编排。 - `admin/repository/pdd.go`:在事务边界内复用或补充能够区分新建、已存在、复活结果的 PDD upsert;SQL 参数化,不改变现有单条创建行为。 - `admin/templates/pdd/list.html`:增加导入弹窗、格式提示、统计/失败明细和“为本次导入商品创建采集任务”入口;复用现有客户端选择确认交互,页面在 1366×768 下可操作。 - `admin/static/js/app.js`:仅在复用现有弹窗/本次导入 ID 传递确有需要时做最小原生 JavaScript 调整,不引入前端框架或构建工具。 - 增加 `admin/service/pdd_import_test.go`、相邻 Handler/Repository 测试及 `testdata/` 脱敏小样本;更新 `docs/admin/01-requirements.md`、`docs/admin/05-ui-specification.md`、`docs/admin/06-quality-security.md` 中相关稳定规则。 - 不新增数据库迁移;现有 `pdd_products.goods_id` 唯一约束足以保证商品档案不重复。 ## 验收标准 - [x] PDD 商品页“添加 PDD 商品”旁显示“批量导入”,可从弹窗上传 `.xlsx`,所有写请求通过 CSRF 校验。 - [x] `raw_data/pdd链接.xlsx` 的 8 条链接可全部识别,空 Sheet2/Sheet3 不报错,两个现有 PDD 域名均导入成功。 - [x] 非 xlsx、伪造扩展名、空文件、超限文件、缺少“拼多多链接”列或超过 5000 条时明确拒绝且不写库。 - [x] 新商品、已存在商品、已软删除商品和文件内重复商品分别按既有规则处理;重复导入不产生重复记录,也不清空有效采集结果。 - [x] 文件中部分链接无效时,其他合法行可导入;页面逐行显示失败行号、原始值和原因,不静默丢行。 - [x] 任一数据库写入���常时,本次合法行整体回滚,并明确提示没有部分生效。 - [x] 导入结果准确显示总行数、新建、已存在、复活、重复和失败数量。 - [x] 上传成功不会自动创建任务;采购员点击“为本次导入商品创建采集任务”并确认后,才按现有可选客户端、权限、去重及状态规则创建任务。 - [x] 导入结果中的商品超过当前分页范围时,仍能一次提交本次导入集合,不依赖逐页勾选。 - [x] 不新增数据库表或迁移,不改变 Client 四接口,不触发采集、采购、真实下单或付款。 - [x] 页面在 1366×768 下可完成上传、查看结果和创建采集任务,错误信息有文字且不只靠颜色表达。 - [x] Go 1.23.0 下 build、test、vet 通过,自动化测试使用脱敏固件,商业样本未进入 Git。 ## 怎么验证 从 `admin/` 目录执行: ```powershell $env:GOTOOLCHAIN='go1.23.0' gofmt -l . go build ./... go test ./... -count=1 go vet ./... Remove-Item Env:GOTOOLCHAIN ``` 人工验证: 1. 使用管理员和正常状态采购员分别打开 PDD 商品页,上传 `raw_data/pdd链接.xlsx`。 2. 核对 8 条链接、两个域名、三个工作表的处理结果和页面统计。 3. 再次上传同一文件,确认不新增重复商品、不清空已采集结果。 4. 使用含重复、空行、短链接、非 PDD 链接和错误表头的脱敏文件核对逐行反馈。 5. 导入后点击“为本次导入商品创建采集任务”,分别验证默认不指定、指定可见客户端和伪造不可见客户端。 ## 风险和回退 - 风险:批量导入意外覆盖既有采集结果。控制方式是复用 `goods_id` 唯一键和现有 upsert/复活语义,覆盖重复导入回归测试,禁止清表导入。 - 风险:恶意或异常 Excel 消耗内存、磁盘。控制方式是请求体、文件大小、扩展名、xlsx 文件头和 5000 行上限,并使用流式读取和服务端生成文件名。 - 风险:导入后误发大量采集任务。控制方式是上传只建商品,创建任务必须二次显式确认并复用现有客户端权限和任务去重规则。 - 回退:回退本工单代码与文档提交即可;无数据库迁移。已经导入的商品属于正常业务档案,不自动删除;已经显式创建的任务按现有取消/状态规则处理。
Author
Owner

开始实施:已核对工单范围、Admin 分层/上传安全规则及 UI 可访问性要求。当前进入代码与测试实现;不会改数据库结构、Client 四接口或真实下单开关。

开始实施:已核对工单范围、Admin 分层/上传安全规则及 UI 可访问性要求。当前进入代码与测试实现;不会改数据库结构、Client 四接口或真实下单开关。
Author
Owner

实施完成,等待用户验收

  • 实现提交:188725f feat: 支持批量导入 PDD 商品链接 (#104)
  • 归档提交:b16f39a docs: 归档任务 #104
  • 归档:docs/task/104-pdd商品批量导入excel链接.md

已完成

  • 增加 PDD .xlsx 批量导入、10MB/文件头/表头/5000 行校验、逐行失败反馈和事务回滚。
  • 复用原有 goods_id 去重、已存在商品保留采集结果、软删除恢复规则。
  • 导入结果保留本批完整商品集合,显式确认后才复用现有可选客户端批量采集;上传不自动建任务。
  • multipart 上限前移到 CSRF 解析前,确保 PDD/蝦皮上传限制实际生效。
  • 增加脱敏 admin/testdata/pdd_links.xlsx、业务/事务/模板转义测试及 Admin 基线文档。

验证结果

Go 1.23.0 下 go mod verify、go build ./...、go test ./... -count=1、go vet ./... 全部通过;node --check static/js/app.js 通过。使用 Go 导入解析器读取 raw_data/pdd链接.xlsx,确认 8 行、8 个唯一合法链接、0 失败,两个 PDD 域名���空 Sheet2/Sheet3 均正确处理。

未设置 CMAUTOBUY_MYSQL_TEST=1 与独立 _test 基础库,因此未执行真实 MySQL 8.4 HTTP 上传落库集成测试;未连接生产数据库。1366×768 浏览器人工操作项保留待验收。

## 实施完成,等待用户验收 - 实现提交:`188725f` `feat: 支持批量导入 PDD 商品链接 (#104)` - 归档提交:`b16f39a` `docs: 归档任务 #104` - 归档:`docs/task/104-pdd商品批量导入excel链接.md` ### 已完成 - 增加 PDD `.xlsx` 批量导入、10MB/文件头/表头/5000 行校验、逐行失败反馈和事务回滚。 - 复用原有 goods_id 去重、已存在商品保留采集结果、软删除恢复规则。 - 导入结果保留本批完整商品集合,显式确认后才复用现有可选客户端批量采集;上传不自动建任务。 - multipart 上限前移到 CSRF 解析前,确保 PDD/蝦皮上传限制实际生效。 - 增加脱敏 `admin/testdata/pdd_links.xlsx`、业务/事务/模板转义测试及 Admin 基线文档。 ### 验证结果 Go 1.23.0 下 `go mod verify`、`go build ./...`、`go test ./... -count=1`、`go vet ./...` 全部通过;`node --check static/js/app.js` 通过。使用 Go 导入解析器读取 `raw_data/pdd链接.xlsx`,确认 8 行、8 个唯一合法链接、0 失败,两个 PDD 域名���空 Sheet2/Sheet3 均正确处理。 未设置 `CMAUTOBUY_MYSQL_TEST=1` 与独立 `_test` 基础库,因此未执行真实 MySQL 8.4 HTTP 上传落库集成测试;未连接生产数据库。1366×768 浏览器人工操作项保留待验收。
Author
Owner

用户已明确验收通过。验收清单已回填,本工单关闭。

用户已明确验收通过。验收清单已回填,本工单关闭。
Author
Owner

用户已明确验收通过。验收清单已回填,本工单关闭。

用户已明确验收通过。验收清单已回填,本工单关闭。
ila closed this issue 2026-08-10 23:24:42 +08:00
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chengma/cmautobuy#104