问题一:pdd_data 挂在 shopee_products 上。 两个蝦皮商品指向同一个 PDD 链接时会各存一份、各采一次;collect_status 描述的是 PDD 商品的状态,却挂在蝦皮商品上,两份可能不一致。
pdd_data
shopee_products
collect_status
问题二(会买错东西):PDD 商品变动频繁。 商品 A 下架就得换成 B。但 sku_mappings 只按 shopee_sku_id 做键,换商品后旧映射还在:
sku_mappings
shopee_sku_id
用户已确认 PDD 商品变动大,这不是理论风险。
做:
pdd_products
id
goods_id
collect_error
collected_at
pdd_goods_id
(shopee_sku_id, pdd_goods_id)
pdd_option_key
OptionKey()
SetCollectResult
SetCollectFailed
docs/admin/01
03
05
不做(各自独立工单):
pending
collecting
collected
failed
no_link
shopee_products.pdd_goods_id IS NULL
deleted_at
WHERE deleted_at IS NULL
Client 按此结构采集并提交,Admin 原样存,零转换:
{"schema_version":1, "dimensions":[{"key":"color","name":"颜色分类"},{"key":"size","name":"尺码"}], "skus":[{"options":{"color":"黑色","size":"M"}, "price_cent":1256,"available":true,"raw_price":"¥12.56"}]}
price_cent
null
options
dimensions
用 json.Marshal 实现——Go 序列化 map 时按键名排序,天然规范化,不用自己拼、不用处理转义(规格文字里可能含 = 或 ;)。
json.Marshal
=
;
存映射和查 SKU 必须用同一个函数,各写一遍迟早算出不一样的结果,而且是静默失效。
查映射永远带上当前的 PDD 商品:
WHERE shopee_sku_id = ? AND pdd_goods_id = ?
换成 B 后查不到 B 的映射 → 界面显示「待匹配」,不会误用 A 的。不需要换商品时删数据,靠查询条件天然隔离;A 的映射留着,换回 A 时直接复用。
skus
skus_json
go vet
gofmt -l .
go test ./...
cd D:\chengma\cmautobuy\admin go vet ./... gofmt -l . go test ./... -count=1 go run .
不需要真机,不需要 Client。
admin/data/admin.db
回退:改动集中在 admin/,git revert 即可;数据库删掉重建。
admin/
git revert
998c06a
fab20cf
docs/task/16-admin-pdd-商品数据独立成表.md
go vet / gofmt -l . 无输出;go test ./... -count=1 55 个测试全 PASS。
go test ./... -count=1
审查时另行补验了工单未覆盖的 HTTP 层端到端:
422 COLLECT_GOODS_MISMATCH
claimed
200
16 条验收标准全部通过,含两条安全核心:换 PDD 商品后查不到旧映射、换回后旧映射仍可用。
TaskExists
GetTaskInfo
MarkCollecting
SoftDeletePddProduct
artifact_ref
diagnostics
用户确认验收通过。归档状态已更新(3fdab7b)。
3fdab7b
遗留:artifact_ref 仍未规范化,需与 Client 侧一起定格式(转 #31 处理采集结果字段时一并考虑)。
No dependencies set.
The note is not visible to the blocked user.
基本信息
要解决什么
问题一:
pdd_data挂在shopee_products上。 两个蝦皮商品指向同一个 PDD 链接时会各存一份、各采一次;collect_status描述的是 PDD 商品的状态,却挂在蝦皮商品上,两份可能不一致。问题二(会买错东西):PDD 商品变动频繁。 商品 A 下架就得换成 B。但
sku_mappings只按shopee_sku_id做键,换商品后旧映射还在:用户已确认 PDD 商品变动大,这不是理论风险。
做什么 / 不做什么
做:
pdd_products表(id主键,goods_idUNIQUE)shopee_products去掉pdd_data/collect_status/collect_error/collected_at,pdd_goods_id改为引用sku_mappings主键改为(shopee_sku_id, pdd_goods_id),新增pdd_option_keyOptionKey()规范化函数SetCollectResult/SetCollectFailed改写pdd_productsdocs/admin/01/03/05不做(各自独立工单):
怎么做
pdd_products
collect_status只有 4 个值:pending/collecting/collected/failed。去掉
no_link——有这一行就说明链接填了;「未填链接」是shopee_products.pdd_goods_id IS NULL。goods_id查(含已删除的),查到已删除的就清deleted_at、状态回pending,不新增行。WHERE deleted_at IS NULL,且只写在 repository 层。skus_json 结构
Client 按此结构采集并提交,Admin 原样存,零转换:
price_cent整数分,禁止浮点/字符串;允许null表示未采到,Admin 遇null拒绝建任务,绝不当 0options嵌一层,支持任意多个维度dimensions只给 key + name(Go map 无序,需要它定下拉框顺序),不给 valuesOptionKey()
用
json.Marshal实现——Go 序列化 map 时按键名排序,天然规范化,不用自己拼、不用处理转义(规格文字里可能含=或;)。存映射和查 SKU 必须用同一个函数,各写一遍迟早算出不一样的结果,而且是静默失效。
sku_mappings 改键
查映射永远带上当前的 PDD 商品:
换成 B 后查不到 B 的映射 → 界面显示「待匹配」,不会误用 A 的。不需要换商品时删数据,靠查询条件天然隔离;A 的映射留着,换回 A 时直接复用。
采集结果落库
goods_id必须等于请求采集的那个。不等说明链接跳转或采错商品,拒绝并整体回滚,不得静默存下skus为空数组时置failed,不是collected验收标准
pdd_products建表成功,goods_id有 UNIQUE 约束collect_status只接受 4 个值shopee_products不再有pdd_data/collect_status/collect_error/collected_atsku_mappings主键为(shopee_sku_id, pdd_goods_id)goods_id再保存,复活原行而不是 UNIQUE 冲突skus_json,状态collectedgoods_id与请求不符 → 拒绝,不写skus_jsonskus为空数组 → 置failedgo vet/gofmt -l ./go test ./...全过怎么验证
不需要真机,不需要 Client。
风险和回退
admin/data/admin.db结构对不上WHERE deleted_at IS NULL回退:改动集中在
admin/,git revert即可;数据库删掉重建。实施完成,待验收
998c06afeat: PDD 商品数据独立成表 (#16)fab20cfdocs: 归档任务 #16 Admin:claim 支持领取无主任务 (#17)docs/task/16-admin-pdd-商品数据独立成表.md验证结果(Go 1.23.0)
go vet/gofmt -l .无输出;go test ./... -count=155 个测试全 PASS。审查时另行补验了工单未覆盖的 HTTP 层端到端:
goods_id与请求不符 →422 COLLECT_GOODS_MISMATCH,拒绝后
skus_json空、状态仍collecting、任务仍claimed、幂等记录 0 条(整体回滚干净;幂等记录若残留会导致客户端重试永远拿到缓存的失败响应)
200但状态置failed16 条验收标准全部通过,含两条安全核心:换 PDD 商品后查不到旧映射、换回后旧映射仍可用。
三处超出工单但必要的决定
TaskExists重构为GetTaskInfo——原函数只返回蝦皮goods_id,采集结果要按 PDDgoods_id落库未验证到的部分
MarkCollecting/SoftDeletePddProduct目前无生产调用方,等 #18 接上artifact_ref存diagnostics原始 JSON,未规范化,因 Client 侧尚未定义该结构验收通过,关闭
用户确认验收通过。归档状态已更新(
3fdab7b)。998c06adocs/task/16-admin-pdd-商品数据独立成表.md遗留:
artifact_ref仍未规范化,需与 Client 侧一起定格式(转 #31 处理采集结果字段时一并考虑)。