From 57f6cec80356ef0b2e757f817e89923b97d5437a Mon Sep 17 00:00:00 2001 From: QiuSW <105186638@qq.com> Date: Thu, 17 Sep 2026 09:44:48 +0800 Subject: [PATCH] =?UTF-8?q?fix(server):=20=E6=A1=A3=E6=A1=88=E5=90=88?= =?UTF-8?q?=E5=B9=B6=E6=94=B9=E4=B8=BA=E6=97=A0=E6=9D=A1=E4=BB=B6=EF=BC=8C?= =?UTF-8?q?=E6=97=A2=E6=9C=89=E6=95=B0=E6=8D=AE=E5=8F=AF=E8=87=AA=E6=84=88?= =?UTF-8?q?=20(#301)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 只在键发生变化时才补档案是不够的:既有数据的键早已被前一次重解析改对了,档案 却还是空的,那样永远补不上——线上 215 条全部返回 unchanged,档案一条都没补进去。 mergeParsedSpec 对已存在的值幂等,无条件合并让这条路径能自愈。 Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01NTDbDcwbDw1TSAcE6wfh2F --- server/app/goauto/sybimport/resolve_keys.go | 23 ++++++++++++--------- 1 file changed, 13 insertions(+), 10 deletions(-) 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 }