package repository import ( "database/sql" "errors" "fmt" "cmautobuy/admin/model" ) // GetSpecMapping 读取某个蝦皮商品的顺运宝规格在指定 PDD 商品下的映射。 func GetSpecMapping(q Execer, shopeeGoodsID, specKey, pddGoodsID string) (*model.SpecMapping, error) { var m model.SpecMapping var mappedBy sql.NullString err := q.QueryRow(` SELECT shopee_goods_id, spec_key, pdd_goods_id, pdd_option_key, pdd_options, spec_raw, mapped_at, mapped_by FROM spec_mappings WHERE shopee_goods_id = ? AND spec_key = ? AND pdd_goods_id = ?`, shopeeGoodsID, specKey, pddGoodsID).Scan( &m.ShopeeGoodsID, &m.SpecKey, &m.PddGoodsID, &m.PddOptionKey, &m.PddOptions, &m.SpecRaw, &m.MappedAt, &mappedBy) if errors.Is(err, sql.ErrNoRows) { return nil, nil } if err != nil { return nil, fmt.Errorf("查询规格映射失败: %w", err) } m.MappedBy = mappedBy.String return &m, nil } // UpsertSpecMapping 保存可复用规格映射,唯一键包含当前 PDD 商品。 func UpsertSpecMapping(q Execer, m model.SpecMapping) error { _, err := q.Exec(` INSERT INTO spec_mappings (shopee_goods_id, spec_key, pdd_goods_id, pdd_option_key, pdd_options, spec_raw, mapped_at, mapped_by) VALUES (?, ?, ?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE pdd_option_key = VALUES(pdd_option_key), pdd_options = VALUES(pdd_options), spec_raw = VALUES(spec_raw), mapped_at = VALUES(mapped_at), mapped_by = VALUES(mapped_by)`, m.ShopeeGoodsID, m.SpecKey, m.PddGoodsID, m.PddOptionKey, m.PddOptions, m.SpecRaw, m.MappedAt, nullableText(m.MappedBy)) if err != nil { return fmt.Errorf("保存规格映射失败: %w", err) } return nil } func InsertSpecMappingDecision(q Execer, d model.SpecMappingDecision) error { _, err := q.Exec(`INSERT INTO spec_mapping_decisions (shopee_goods_id,spec_key,pdd_goods_id,rules_version,suggested_option_key, chosen_option_key,accepted,decided_by,decided_at) VALUES (?,?,?,?,?,?,?,?,?)`, d.ShopeeGoodsID, d.SpecKey, d.PddGoodsID, d.RulesVersion, nullableText(d.SuggestedOptionKey), d.ChosenOptionKey, d.Accepted, nullableText(d.DecidedBy), d.DecidedAt) if err != nil { return fmt.Errorf("写入规格匹配决策审计失败: %w", err) } return nil }