feat: 增加店铺规格只读对比工具 (#193)
This commit is contained in:
@@ -0,0 +1,73 @@
|
||||
package repository
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"fmt"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// ComparableShopeeSpec 是一条可用于只读对比的蝦皮正式规格。
|
||||
type ComparableShopeeSpec struct {
|
||||
Color string
|
||||
Size string
|
||||
ParseOK bool
|
||||
}
|
||||
|
||||
// ShopSpecSource 汇总一件蝦皮商品及其关联 PDD 商品的原始对比数据。
|
||||
type ShopSpecSource struct {
|
||||
ShopeeGoodsID string
|
||||
PDDGoodsID string
|
||||
PDDExists bool
|
||||
PDDDeleted bool
|
||||
PDDSKUsJSON string
|
||||
ShopeeSpecs []ComparableShopeeSpec
|
||||
}
|
||||
|
||||
// ListShopSpecSources 按店铺名精确读取规格对比数据。本函数只执行 SELECT。
|
||||
func ListShopSpecSources(q Execer, shopName string) ([]ShopSpecSource, error) {
|
||||
rows, err := q.Query(`
|
||||
SELECT sp.goods_id, sp.pdd_goods_id,
|
||||
pp.goods_id, pp.deleted_at, pp.skus_json,
|
||||
sk.color, sk.size, sk.parse_ok
|
||||
FROM shopee_products sp
|
||||
LEFT JOIN shopee_skus sk ON sk.goods_id = sp.goods_id
|
||||
LEFT JOIN pdd_products pp ON pp.goods_id = sp.pdd_goods_id
|
||||
WHERE sp.shopee_shop_name = ?
|
||||
ORDER BY sp.goods_id, sk.sku_id`, strings.TrimSpace(shopName))
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("读取店铺规格对比数据失败: %w", err)
|
||||
}
|
||||
defer rows.Close()
|
||||
|
||||
var list []ShopSpecSource
|
||||
var current *ShopSpecSource
|
||||
for rows.Next() {
|
||||
var shopeeID string
|
||||
var pddID, existingPDDID, deletedAt, skusJSON sql.NullString
|
||||
var color, size sql.NullString
|
||||
var parseOK sql.NullInt64
|
||||
if err := rows.Scan(&shopeeID, &pddID, &existingPDDID, &deletedAt,
|
||||
&skusJSON, &color, &size, &parseOK); err != nil {
|
||||
return nil, fmt.Errorf("解析店铺规格对比数据失败: %w", err)
|
||||
}
|
||||
if current == nil || current.ShopeeGoodsID != shopeeID {
|
||||
list = append(list, ShopSpecSource{
|
||||
ShopeeGoodsID: shopeeID,
|
||||
PDDGoodsID: pddID.String,
|
||||
PDDExists: existingPDDID.Valid,
|
||||
PDDDeleted: strings.TrimSpace(deletedAt.String) != "",
|
||||
PDDSKUsJSON: skusJSON.String,
|
||||
})
|
||||
current = &list[len(list)-1]
|
||||
}
|
||||
if parseOK.Valid {
|
||||
current.ShopeeSpecs = append(current.ShopeeSpecs, ComparableShopeeSpec{
|
||||
Color: color.String, Size: size.String, ParseOK: parseOK.Int64 == 1,
|
||||
})
|
||||
}
|
||||
}
|
||||
if err := rows.Err(); err != nil {
|
||||
return nil, fmt.Errorf("遍历店铺规格对比数据失败: %w", err)
|
||||
}
|
||||
return list, nil
|
||||
}
|
||||
Reference in New Issue
Block a user