feat: 支持人工修改蝦皮规格 (#215)
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user