87 lines
2.1 KiB
Go
87 lines
2.1 KiB
Go
|
|
package placement
|
||
|
|
|
||
|
|
import (
|
||
|
|
"strings"
|
||
|
|
|
||
|
|
brandentity "haixun-backend/internal/model/brand/domain/entity"
|
||
|
|
)
|
||
|
|
|
||
|
|
func BuildMergedProductContext(brandName, productContext, productLabel string) string {
|
||
|
|
fields := ParseProductContext(productContext)
|
||
|
|
if name := strings.TrimSpace(brandName); name != "" {
|
||
|
|
fields.Brand = name
|
||
|
|
}
|
||
|
|
if label := strings.TrimSpace(productLabel); label != "" && fields.Product == "" {
|
||
|
|
fields.Product = label
|
||
|
|
}
|
||
|
|
return SerializeProductContext(fields)
|
||
|
|
}
|
||
|
|
|
||
|
|
func RecommendProduct(products []brandentity.Product, searchTag, defaultProductID string) *brandentity.Product {
|
||
|
|
if len(products) == 0 {
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
var defaultProduct *brandentity.Product
|
||
|
|
if id := strings.TrimSpace(defaultProductID); id != "" {
|
||
|
|
for i := range products {
|
||
|
|
if products[i].ID == id {
|
||
|
|
defaultProduct = &products[i]
|
||
|
|
break
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
tag := strings.TrimSpace(searchTag)
|
||
|
|
if tag == "" {
|
||
|
|
if defaultProduct != nil {
|
||
|
|
return defaultProduct
|
||
|
|
}
|
||
|
|
return &products[0]
|
||
|
|
}
|
||
|
|
|
||
|
|
bestScore := -1
|
||
|
|
var best *brandentity.Product
|
||
|
|
for i := range products {
|
||
|
|
score := ScoreProductForTag(tag, products[i].MatchTags)
|
||
|
|
if score > bestScore {
|
||
|
|
bestScore = score
|
||
|
|
best = &products[i]
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if best != nil && bestScore > 0 {
|
||
|
|
return best
|
||
|
|
}
|
||
|
|
if defaultProduct != nil {
|
||
|
|
return defaultProduct
|
||
|
|
}
|
||
|
|
return &products[0]
|
||
|
|
}
|
||
|
|
|
||
|
|
func ResolveBrandProductContext(brand brandentity.Brand, productID, searchTag string) string {
|
||
|
|
if len(brand.Products) > 0 {
|
||
|
|
picked := RecommendProduct(brand.Products, searchTag, productID)
|
||
|
|
if picked != nil {
|
||
|
|
return BuildMergedProductContext(brand.DisplayName, picked.ProductContext, picked.Label)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if formatted := ProductBriefFromContext(brand.ProductContext); formatted != "" {
|
||
|
|
return formatted
|
||
|
|
}
|
||
|
|
if brief := strings.TrimSpace(brand.ProductBrief); brief != "" {
|
||
|
|
return brief
|
||
|
|
}
|
||
|
|
return ""
|
||
|
|
}
|
||
|
|
|
||
|
|
func FindProduct(brand brandentity.Brand, productID string) *brandentity.Product {
|
||
|
|
id := strings.TrimSpace(productID)
|
||
|
|
if id == "" {
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
for i := range brand.Products {
|
||
|
|
if brand.Products[i].ID == id {
|
||
|
|
return &brand.Products[i]
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return nil
|
||
|
|
}
|