diff --git a/server/app/goauto/sybimport/resolve_keys.go b/server/app/goauto/sybimport/resolve_keys.go index 596b8e8..1cb0466 100644 --- a/server/app/goauto/sybimport/resolve_keys.go +++ b/server/app/goauto/sybimport/resolve_keys.go @@ -49,17 +49,20 @@ func resyncShopeeProductKeys(tx *gorm.DB, shopeeProductID uint64, incomingRaw st sibling.ManuallyConfirmed || sibling.AIConfirmed { continue } - if sibling.TargetColor == keys.Color && sibling.TargetSize == keys.Size { - continue + if sibling.TargetColor != keys.Color || sibling.TargetSize != keys.Size { + if err := tx.Model(&models.SYBProduct{}).Where("id = ?", sibling.ID). + Updates(map[string]any{"target_color": keys.Color, "target_size": keys.Size}).Error; err != nil { + return sybspec.ParseResult{}, err + } } - if err := tx.Model(&models.SYBProduct{}).Where("id = ?", sibling.ID). - Updates(map[string]any{"target_color": keys.Color, "target_size": keys.Size}).Error; err != nil { - return sybspec.ParseResult{}, err - } - // `[必须]` 改了明细的键就必须把新键补进档案。映射是按档案里的值建的, - // 档案没有 `黑色【長袖】` 这个条目,采购查映射就查不到,明细永远停在 - // 「规格待匹配」——而采购员点「一键匹配」匹到的是档案里剩下的旧键 - // `黑色`,看起来成功了却没有任何明细在用它。 + // `[必须]` 无条件把键补进档案,不能只在键发生变化时补。映射是按档案里的 + // 值建的,档案缺了 `黑色【長袖】` 这个条目,采购查映射就查不到,明细永远 + // 停在「规格待匹配」——而采购员点「一键匹配」匹到的是档案里剩下的旧键 + // `黑色`,看起来成功了却没有任何明细在用它(线上 2026-09-17 实际发生)。 + // + // 只在「键变化」时补是不够的:既有数据的键早已是对的,档案却是空的, + // 那样永远补不上。无条件合并让这条路径可以自愈,mergeParsedSpec 本身 + // 对已存在的值是幂等的。 if err := mergeParsedSpec(tx, shopeeProductID, keys); err != nil { return sybspec.ParseResult{}, err }