feat: 支持人工修改蝦皮规格 (#215)

This commit is contained in:
chengma
2026-08-13 12:14:02 +08:00
parent 5b7d92289e
commit 4752fef54f
16 changed files with 403 additions and 34 deletions
+2 -1
View File
@@ -351,7 +351,8 @@ func UpsertCatalogShopeeSKU(q Execer, in CatalogShopeeSKUInput) (CatalogSKUOutco
sources, times := catalogFieldProvenance(current)
changed := external != current.ShopeeSKUID.String
canFill := func(field, current, incoming string) bool {
return strings.TrimSpace(incoming) != "" && (current == "" || (sources[field] == "syb" && in.Source != "syb"))
return sources[field] != "manual" && strings.TrimSpace(incoming) != "" &&
(current == "" || (sources[field] == "syb" && in.Source != "syb"))
}
if canFill("color", color, in.Color) {
color = in.Color
+44
View File
@@ -438,6 +438,50 @@ func GetShopeeSKUByID(q Execer, skuID string) (*model.ShopeeSKU, error) {
return &sk, nil
}
// ShopeeSKUManualState 是人工编辑前需要读取的最小状态。
// 字段来源 JSON 必须先读出再合并,不能直接重建,否则会丢掉 sku_code 等
// 本次表单没有修改的字段来源。
type ShopeeSKUManualState struct {
RecordID, GoodsID string
FieldSources, FieldObservedAt string
}
// GetShopeeSKUManualState 查询一条仍属于正常商品的 SKU 及其字段来源。
// 查不到返回 (nil, nil)。
func GetShopeeSKUManualState(q Execer, skuID string) (*ShopeeSKUManualState, error) {
var state ShopeeSKUManualState
err := q.QueryRow(`SELECT sku_id,goods_id,COALESCE(field_sources,'{}'),COALESCE(field_observed_at,'{}')
FROM shopee_skus sk WHERE sku_id=?
AND EXISTS (SELECT 1 FROM shopee_products sp WHERE sp.goods_id=sk.goods_id AND sp.deleted_at IS NULL)`, skuID).
Scan(&state.RecordID, &state.GoodsID, &state.FieldSources, &state.FieldObservedAt)
if errors.Is(err, sql.ErrNoRows) {
return nil, nil
}
if err != nil {
return nil, fmt.Errorf("查询待编辑蝦皮规格 %s 失败: %w", skuID, err)
}
return &state, nil
}
// UpdateShopeeSKUManualFields 原子保存人工确认的颜色、尺码和建议说明。
// spec_raw、spec_key、真实 SKU ID、SKU 编码和 is_manual 均不在更新清单中。
func UpdateShopeeSKUManualFields(q Execer, skuID, goodsID, color, size, advice,
fieldSources, fieldObservedAt, updatedAt string) (bool, error) {
result, err := q.Exec(`UPDATE shopee_skus SET color=?,size=?,advice=NULLIF(?,''),parse_ok=1,
field_sources=?,field_observed_at=?,updated_at=?
WHERE sku_id=? AND goods_id=?
AND EXISTS (SELECT 1 FROM shopee_products sp WHERE sp.goods_id=shopee_skus.goods_id AND sp.deleted_at IS NULL)`,
color, size, advice, fieldSources, fieldObservedAt, updatedAt, skuID, goodsID)
if err != nil {
return false, fmt.Errorf("保存蝦皮规格 %s 失败: %w", skuID, err)
}
count, err := result.RowsAffected()
if err != nil {
return false, fmt.Errorf("确认蝦皮规格 %s 保存结果失败: %w", skuID, err)
}
return count == 1, nil
}
// CountShopeeProducts 统计蝦皮商品总数,供列表页判断"是否已导入过任何数据"。
func CountShopeeProducts(q Execer) (int, error) {
var n int