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 }