feat: 支持无SKU目录导入策略 (#141)
This commit is contained in:
+33
-18
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user