Merge remote-tracking branch 'origin/master'
This commit is contained in:
@@ -109,6 +109,15 @@ func productSeriesFallbackLogEnabled() bool {
|
|||||||
return raw == "1" || raw == "true" || raw == "on" || raw == "yes"
|
return raw == "1" || raw == "true" || raw == "on" || raw == "yes"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func productSeriesFallbackOverrideExisting() bool {
|
||||||
|
// Default off: do not override existing (possibly manual) assignments.
|
||||||
|
raw := strings.TrimSpace(strings.ToLower(os.Getenv("PRODUCT_SERIES_FALLBACK_OVERRIDE_EXISTING")))
|
||||||
|
if raw == "" {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return raw == "1" || raw == "true" || raw == "on" || raw == "yes"
|
||||||
|
}
|
||||||
|
|
||||||
func productSeriesFallbackCode() string {
|
func productSeriesFallbackCode() string {
|
||||||
code := strings.TrimSpace(os.Getenv("PRODUCT_SERIES_FALLBACK_SERIES_CODE"))
|
code := strings.TrimSpace(os.Getenv("PRODUCT_SERIES_FALLBACK_SERIES_CODE"))
|
||||||
if code == "" {
|
if code == "" {
|
||||||
@@ -505,9 +514,10 @@ func productSeriesApplyVariant(ctx context.Context, pg *sql.DB, v productSeriesA
|
|||||||
return 0, 1, err
|
return 0, 1, err
|
||||||
}
|
}
|
||||||
if fallbackID > 0 {
|
if fallbackID > 0 {
|
||||||
// Only apply fallback when the variant has no assignments yet.
|
if !productSeriesFallbackOverrideExisting() {
|
||||||
var exists int
|
// Only apply fallback when the variant has no assignments yet.
|
||||||
checkErr := pg.QueryRowContext(ctx, `
|
var exists int
|
||||||
|
checkErr := pg.QueryRowContext(ctx, `
|
||||||
SELECT 1
|
SELECT 1
|
||||||
FROM zbggseri
|
FROM zbggseri
|
||||||
WHERE mmitem_id=$1
|
WHERE mmitem_id=$1
|
||||||
@@ -515,18 +525,23 @@ WHERE mmitem_id=$1
|
|||||||
AND (($3::bigint IS NULL AND dim3 IS NULL) OR dim3=$3::bigint)
|
AND (($3::bigint IS NULL AND dim3 IS NULL) OR dim3=$3::bigint)
|
||||||
LIMIT 1
|
LIMIT 1
|
||||||
`, mmitemID, dim1ID, nullableInt64ForAuto(dim3ID)).Scan(&exists)
|
`, mmitemID, dim1ID, nullableInt64ForAuto(dim3ID)).Scan(&exists)
|
||||||
if checkErr == nil {
|
if checkErr == nil {
|
||||||
if productSeriesFallbackLogEnabled() {
|
if productSeriesFallbackLogEnabled() {
|
||||||
log.Printf("[ProductSeriesFallback] already_exists product=%s color=%s dim3=%s fallback=%s(%d)", strings.TrimSpace(v.ProductCode), strings.TrimSpace(v.ColorCode), strings.TrimSpace(v.Dim3Code), strings.TrimSpace(fallbackCode), fallbackID)
|
log.Printf("[ProductSeriesFallback] already_exists product=%s color=%s dim3=%s fallback=%s(%d)", strings.TrimSpace(v.ProductCode), strings.TrimSpace(v.ColorCode), strings.TrimSpace(v.Dim3Code), strings.TrimSpace(fallbackCode), fallbackID)
|
||||||
|
}
|
||||||
|
// keep existing manual/previous assignment; nothing to do
|
||||||
|
return 0, 0, nil
|
||||||
|
}
|
||||||
|
if checkErr != nil && checkErr != sql.ErrNoRows {
|
||||||
|
return 0, 1, checkErr
|
||||||
}
|
}
|
||||||
// keep existing manual/previous assignment; nothing to do
|
|
||||||
return 0, 0, nil
|
|
||||||
}
|
|
||||||
if checkErr != nil && checkErr != sql.ErrNoRows {
|
|
||||||
return 0, 1, checkErr
|
|
||||||
}
|
}
|
||||||
if productSeriesFallbackLogEnabled() {
|
if productSeriesFallbackLogEnabled() {
|
||||||
log.Printf("[ProductSeriesFallback] apply product=%s color=%s dim3=%s fallback=%s(%d)", strings.TrimSpace(v.ProductCode), strings.TrimSpace(v.ColorCode), strings.TrimSpace(v.Dim3Code), strings.TrimSpace(fallbackCode), fallbackID)
|
if productSeriesFallbackOverrideExisting() {
|
||||||
|
log.Printf("[ProductSeriesFallback] override_apply product=%s color=%s dim3=%s fallback=%s(%d)", strings.TrimSpace(v.ProductCode), strings.TrimSpace(v.ColorCode), strings.TrimSpace(v.Dim3Code), strings.TrimSpace(fallbackCode), fallbackID)
|
||||||
|
} else {
|
||||||
|
log.Printf("[ProductSeriesFallback] apply product=%s color=%s dim3=%s fallback=%s(%d)", strings.TrimSpace(v.ProductCode), strings.TrimSpace(v.ColorCode), strings.TrimSpace(v.Dim3Code), strings.TrimSpace(fallbackCode), fallbackID)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// Use the fallback series as the single selected rule.
|
// Use the fallback series as the single selected rule.
|
||||||
selected = []productSeriesAutoRule{{SeriesID: fallbackID}}
|
selected = []productSeriesAutoRule{{SeriesID: fallbackID}}
|
||||||
@@ -834,14 +849,6 @@ func productSeriesResolveDimTokenID(ctx context.Context, pg *sql.DB, column stri
|
|||||||
return 0, false, nil
|
return 0, false, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// dimval3 tokens like "001" can map to different dim ids per product in this installation.
|
|
||||||
// Prefer per-mmitem inference from dfblob (src_id filter) to avoid global mk_dim_token_map mismatches.
|
|
||||||
if column == "dimval3" && mmitemID > 0 {
|
|
||||||
if inferred, ok := productSeriesInferDimIDFromImages(pg, mmitemID, column, tok); ok {
|
|
||||||
return inferred, true, nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var id int64
|
var id int64
|
||||||
err := pg.QueryRowContext(ctx, `SELECT dim_id FROM mk_dim_token_map WHERE dim_column=$1 AND token=$2`, column, tok).Scan(&id)
|
err := pg.QueryRowContext(ctx, `SELECT dim_id FROM mk_dim_token_map WHERE dim_column=$1 AND token=$2`, column, tok).Scan(&id)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
@@ -851,8 +858,9 @@ func productSeriesResolveDimTokenID(ctx context.Context, pg *sql.DB, column stri
|
|||||||
return 0, false, err
|
return 0, false, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fallback: infer from dfblob filenames. For dimval3 do not persist globally.
|
// Fallback: infer from dfblob filenames.
|
||||||
if mmitemID > 0 {
|
// For dimval3, prefer token map as the source of truth when present; use image inference only when missing.
|
||||||
|
if column == "dimval3" && mmitemID > 0 {
|
||||||
if inferred, ok := productSeriesInferDimIDFromImages(pg, mmitemID, column, tok); ok {
|
if inferred, ok := productSeriesInferDimIDFromImages(pg, mmitemID, column, tok); ok {
|
||||||
return inferred, true, nil
|
return inferred, true, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -361,11 +361,11 @@ LIMIT 1
|
|||||||
row.MmitemID = mmitemByCode[row.ProductCode]
|
row.MmitemID = mmitemByCode[row.ProductCode]
|
||||||
row.Dim1ID = dim1ByToken[row.ColorCode]
|
row.Dim1ID = dim1ByToken[row.ColorCode]
|
||||||
if row.Dim3Code != "" {
|
if row.Dim3Code != "" {
|
||||||
// dimval3 tokens can be ambiguous globally; prefer per-mmitem inference.
|
// dimval3 can be ambiguous, but if mk_dim_token_map has a row we treat it as source of truth.
|
||||||
if inferred := inferDim3ForMmitem(row.MmitemID, row.Dim3Code); inferred > 0 {
|
if v := dim3ByToken[row.Dim3Code]; v > 0 {
|
||||||
|
row.Dim3ID = v
|
||||||
|
} else if inferred := inferDim3ForMmitem(row.MmitemID, row.Dim3Code); inferred > 0 {
|
||||||
row.Dim3ID = inferred
|
row.Dim3ID = inferred
|
||||||
} else {
|
|
||||||
row.Dim3ID = dim3ByToken[row.Dim3Code]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
row.MappingReady = row.MmitemID > 0 && row.Dim1ID > 0 && (row.Dim3Code == "" || row.Dim3ID > 0)
|
row.MappingReady = row.MmitemID > 0 && row.Dim1ID > 0 && (row.Dim3Code == "" || row.Dim3ID > 0)
|
||||||
|
|||||||
Reference in New Issue
Block a user