65 lines
2.2 KiB
Go
65 lines
2.2 KiB
Go
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
|
|
}
|