feat: 支持无SKU目录导入策略 (#141)

This commit is contained in:
chengma
2026-08-11 11:03:18 +08:00
parent 6386d76488
commit 4259be0e55
17 changed files with 766 additions and 73 deletions
+33 -18
View File
@@ -2,11 +2,13 @@ package repository
import (
"database/sql"
"encoding/json"
"errors"
"fmt"
"strings"
"cmautobuy/admin/model"
"cmautobuy/admin/spec"
)
// UpsertShopeeProduct 写入或更新一条蝦皮商品汇总行。
@@ -57,22 +59,35 @@ func UpsertShopeeSKU(q Execer, skuID, goodsID, specRaw, color, size, advice stri
parseOKInt = 1
}
now := model.NowISO()
_, err := q.Exec(`
specKey, err := spec.SpecKey(specRaw)
if err != nil {
return fmt.Errorf("规格原文无效: %w", err)
}
fieldSources, fieldTimes := map[string]string{}, map[string]string{}
for name, value := range map[string]string{"color": color, "size": size, "advice": advice, "sku_code": skuCode} {
if strings.TrimSpace(value) != "" {
fieldSources[name], fieldTimes[name] = "report", now
}
}
fieldSourcesJSON, _ := json.Marshal(fieldSources)
fieldTimesJSON, _ := json.Marshal(fieldTimes)
_, err = q.Exec(`
INSERT INTO shopee_skus
(sku_id, goods_id, spec_raw, color, size, advice, parse_ok, sku_code,
is_manual, created_at, updated_at)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, 0, ?, ?)
(sku_id, shopee_sku_id, goods_id, spec_raw, spec_key, color, size, advice, parse_ok, sku_code,
is_manual, source, field_sources, field_observed_at, created_at, updated_at)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0, 'report', ?, ?, ?, ?)
ON DUPLICATE KEY UPDATE
goods_id = VALUES(goods_id),
spec_raw = VALUES(spec_raw),
color = VALUES(color),
size = VALUES(size),
advice = VALUES(advice),
parse_ok = VALUES(parse_ok),
sku_code = VALUES(sku_code),
updated_at = VALUES(updated_at)`,
// is_manual 不在上面的 SET 列表里,SQLite 对没提到的列保持原值不变。
skuID, goodsID, specRaw, color, size, advice, parseOKInt, skuCode, now, now)
goods_id = CASE WHEN is_manual=1 THEN goods_id ELSE VALUES(goods_id) END,
color = CASE WHEN is_manual=1 THEN color ELSE VALUES(color) END,
size = CASE WHEN is_manual=1 THEN size ELSE VALUES(size) END,
advice = CASE WHEN is_manual=1 THEN advice ELSE VALUES(advice) END,
parse_ok = CASE WHEN is_manual=1 THEN parse_ok ELSE VALUES(parse_ok) END,
sku_code = CASE WHEN is_manual=1 THEN sku_code ELSE VALUES(sku_code) END,
field_sources = CASE WHEN is_manual=1 THEN field_sources ELSE VALUES(field_sources) END,
field_observed_at = CASE WHEN is_manual=1 THEN field_observed_at ELSE VALUES(field_observed_at) END,
updated_at = CASE WHEN is_manual=1 THEN updated_at ELSE VALUES(updated_at) END`,
// 人工行的业务字段和更新时间均由 CASE 保留。
skuID, skuID, goodsID, specRaw, specKey, color, size, advice, parseOKInt, skuCode, string(fieldSourcesJSON), string(fieldTimesJSON), now, now)
if err != nil {
return fmt.Errorf("写入蝦皮 SKU %s 失败: %w", skuID, err)
}
@@ -293,7 +308,7 @@ func GetShopeeCollectStatus(q Execer, pddGoodsID string) (status, msg sql.NullSt
// 见 #41「弹窗里待补的行必须显示 spec_raw 原文」。
func ListShopeeSKUsByGoodsID(q Execer, goodsID string) ([]model.ShopeeSKU, error) {
rows, err := q.Query(`
SELECT sku_id, goods_id, spec_raw, color, size, advice, parse_ok, sku_code,
SELECT sku_id, COALESCE(shopee_sku_id,''), goods_id, spec_raw, color, size, advice, parse_ok, sku_code,
is_manual, created_at, updated_at
FROM shopee_skus
WHERE goods_id = ?
@@ -309,7 +324,7 @@ func ListShopeeSKUsByGoodsID(q Execer, goodsID string) ([]model.ShopeeSKU, error
var color, size, advice, skuCode sql.NullString
var parseOK, isManual int
if err := rows.Scan(
&sk.SKUID, &sk.GoodsID, &sk.SpecRaw, &color, &size, &advice,
&sk.RecordID, &sk.SKUID, &sk.GoodsID, &sk.SpecRaw, &color, &size, &advice,
&parseOK, &skuCode, &isManual, &sk.CreatedAt, &sk.UpdatedAt,
); err != nil {
return nil, fmt.Errorf("读取蝦皮商品 %s 的规格失败: %w", goodsID, err)
@@ -331,10 +346,10 @@ func GetShopeeSKUByID(q Execer, skuID string) (*model.ShopeeSKU, error) {
var color, size, advice, skuCode sql.NullString
var parseOK, isManual int
err := q.QueryRow(`
SELECT sku_id, goods_id, spec_raw, color, size, advice, parse_ok, sku_code,
SELECT sku_id, COALESCE(shopee_sku_id,''), goods_id, spec_raw, color, size, advice, parse_ok, sku_code,
is_manual, created_at, updated_at
FROM shopee_skus WHERE sku_id = ?`, skuID).Scan(
&sk.SKUID, &sk.GoodsID, &sk.SpecRaw, &color, &size, &advice,
&sk.RecordID, &sk.SKUID, &sk.GoodsID, &sk.SpecRaw, &color, &size, &advice,
&parseOK, &skuCode, &isManual, &sk.CreatedAt, &sk.UpdatedAt,
)
if errors.Is(err, sql.ErrNoRows) {