Merge remote-tracking branch 'origin/master'

This commit is contained in:
M_Kececi
2026-06-23 20:47:52 +03:00
parent 136c1e74fb
commit 057f52a1f9
2 changed files with 34 additions and 26 deletions

View File

@@ -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
} }

View File

@@ -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)