feat: 保存并展示 PDD 店铺与价格采样信息 (#31)

This commit is contained in:
chengma
2026-08-07 17:13:25 +08:00
parent a2fc1501c4
commit 93beef8b36
17 changed files with 492 additions and 73 deletions
+59
View File
@@ -4,6 +4,7 @@ import (
"database/sql"
"encoding/json"
"errors"
"strings"
"sync"
"testing"
"time"
@@ -283,8 +284,10 @@ func pddProductState(t *testing.T, db *sql.DB, goodsID string) (status, title, s
const collectBody = `{"task_version":1,"attempt_id":"a-1","result_type":"collect",
"pdd_data":{"schema_version":1,"goods_id":"PDD-1","title":"测试商品",
"shop_name":"测试旗舰店","price_granularity":"color",
"dimensions":[{"key":"color","name":"颜色分类"}],
"skus":[{"options":{"color":"黑色","size":"M"},"price_cent":1256,
"price_observed_at":{"color":"黑色","size":"M"},
"available":true,"raw_price":"¥12.56"}]}}`
func TestSubmitResult_采集结果写入PDD商品(t *testing.T) {
@@ -307,6 +310,62 @@ func TestSubmitResult_采集结果写入PDD商品(t *testing.T) {
if skus == "" {
t.Error("skus_json 应被写入,实际为空")
}
var shop sql.NullString
if err := db.QueryRow(
`SELECT shop_name FROM pdd_products WHERE goods_id = ?`, "PDD-1",
).Scan(&shop); err != nil {
t.Fatalf("读取店铺名失败: %v", err)
}
if !shop.Valid || shop.String != "测试旗舰店" {
t.Errorf("店铺名应从采集结果落库,实际 %+v", shop)
}
if !strings.Contains(skus, `"price_granularity":"color"`) ||
!strings.Contains(skus, `"price_observed_at"`) {
t.Errorf("价格粒度与实测组合应保留在 skus_json,实际 %s", skus)
}
}
func TestSubmitResult_没有店铺名时不覆盖已有值(t *testing.T) {
db := newTestDB(t)
insertPddProduct(t, db, "PDD-1")
if _, err := db.Exec(
`UPDATE pdd_products SET shop_name = '旧店铺' WHERE goods_id = 'PDD-1'`,
); err != nil {
t.Fatalf("准备已有店铺名失败: %v", err)
}
insertCollectTask(t, db, "TASK-C", "client-001", "SHOPEE-1", "PDD-1")
claimTask(t, db, "TASK-C", "client-001")
body := `{"attempt_id":"a-1","result_type":"collect",
"pdd_data":{"goods_id":"PDD-1","title":"测试商品",
"skus":[{"options":{"color":"黑色"},"price_cent":100,"available":true}]}}`
if _, err := SubmitResult(db, "TASK-C", "client-001", "key-no-shop", []byte(body)); err != nil {
t.Fatalf("老版本报文不应失败: %v", err)
}
var shop string
if err := db.QueryRow(
`SELECT shop_name FROM pdd_products WHERE goods_id = 'PDD-1'`,
).Scan(&shop); err != nil {
t.Fatalf("读取店铺名失败: %v", err)
}
if shop != "旧店铺" {
t.Errorf("缺少 shop_name 时不应覆盖已有值,实际 %q", shop)
}
}
func TestSubmitResult_拒绝未知价格采样粒度(t *testing.T) {
db := newTestDB(t)
insertPddProduct(t, db, "PDD-1")
insertCollectTask(t, db, "TASK-C", "client-001", "SHOPEE-1", "PDD-1")
claimTask(t, db, "TASK-C", "client-001")
body := `{"attempt_id":"a-1","result_type":"collect",
"pdd_data":{"goods_id":"PDD-1","price_granularity":"unknown",
"skus":[{"options":{"color":"黑色"},"price_cent":100,"available":true}]}}`
if _, err := SubmitResult(db, "TASK-C", "client-001", "key-bad-granularity", []byte(body)); err == nil {
t.Fatal("未知 price_granularity 应被拒绝")
}
}
// 采到 0 个规格必须算失败——数据对业务毫无用处,