fix(backend): 商品编码改用最大序号生成不复用软删号 + 加 (shop_id,code) 唯一约束,根治重复编码
Deploy Server / release-deploy-server (push) Successful in 53s

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YZ4DskSRKsSiheQonFtQvx
This commit is contained in:
wangjia
2026-06-21 10:51:34 +08:00
parent 71ed15b40b
commit 1a1d9aa15e
6 changed files with 151 additions and 40 deletions
+9 -1
View File
@@ -87,7 +87,8 @@ func initDB() *gorm.DB {
}
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
Logger: logger.Default.LogMode(logLevel),
Logger: logger.Default.LogMode(logLevel),
TranslateError: true, // 把 MySQL 1062 翻译成 gorm.ErrDuplicatedKey,供编码撞唯一约束时重试
})
if err != nil {
log.Fatalf("failed to connect database: %v", err)
@@ -136,5 +137,12 @@ func autoMigrate(db *gorm.DB) {
if err != nil {
log.Fatalf("auto migrate failed: %v", err)
}
// products(shop_id, code) 联合唯一索引:ShopID 在共用 TenantBase 上无法用 struct tag 表达,
// 故在此幂等显式建(保证同店内商品编码唯一,DB 层兜底防止重复编码静默落库)。
if !db.Migrator().HasIndex(&model.Product{}, "uk_shop_code") {
if err := db.Exec("CREATE UNIQUE INDEX uk_shop_code ON products (shop_id, code)").Error; err != nil {
log.Fatalf("create unique index uk_shop_code failed: %v", err)
}
}
log.Println("AutoMigrate completed")
}