Commit d35447e2 authored by zhengyaoqiu's avatar zhengyaoqiu

feat(colorway): 商品上传接口

parent a8ff01a5
...@@ -5,7 +5,7 @@ import "gorm.io/gorm" ...@@ -5,7 +5,7 @@ import "gorm.io/gorm"
type ColorSpu struct { type ColorSpu struct {
gorm.Model gorm.Model
CompleteSpuStyleNumber string `gorm:"uniqueIndex:style; size:50; not null"` CompleteSpuStyleNumber string `gorm:"uniqueIndex:style; size:50; not null"`
ColorCode string `gorm:"uniqueIndex:style; size:50; not null"` ColorCode string `gorm:"uniqueIndex:style; size:50;"`
Color Color `gorm:"embedded;embeddedPrefix:color_"` Color Color `gorm:"embedded;embeddedPrefix:color_"`
InfoSelect string `gorm:"not null; size:24"` // 商品信息默认选择哪个商品 InfoSelect string `gorm:"not null; size:24"` // 商品信息默认选择哪个商品
......
...@@ -5,7 +5,7 @@ import "gorm.io/gorm" ...@@ -5,7 +5,7 @@ import "gorm.io/gorm"
type Image struct { type Image struct {
gorm.Model gorm.Model
ColorSpuStyleNumber string `gorm:"index:style; size:50; not null"` ColorSpuStyleNumber string `gorm:"index:style; size:50; not null"`
ColorSpuColorCode string `gorm:"index:style; size:50; not null"` ColorSpuColorCode string `gorm:"index:style; size:50"`
Url string `gorm:"uniqueIndex; size:256"` Url string `gorm:"uniqueIndex; size:256"`
} }
......
...@@ -7,7 +7,7 @@ type Sku struct { ...@@ -7,7 +7,7 @@ type Sku struct {
Pc3SkuId string `gorm:"uniqueIndex; not null; size:24"` Pc3SkuId string `gorm:"uniqueIndex; not null; size:24"`
Pc3ProductId string `gorm:"not null; size:24"` Pc3ProductId string `gorm:"not null; size:24"`
ColorSpuStyleNumber string `gorm:"index: style; size:50; not null"` ColorSpuStyleNumber string `gorm:"index: style; size:50; not null"`
ColorSpuColorCode string `gorm:"index: style; size:50; not null"` ColorSpuColorCode string `gorm:"index: style; size:50"`
SourceId string `gorm:"size:50; not null"` SourceId string `gorm:"size:50; not null"`
SiteId string `gorm:"size:50; not null"` SiteId string `gorm:"size:50; not null"`
Size string `gorm:"size:50; not null"` Size string `gorm:"size:50; not null"`
......
package repository package repository
import ( import (
"fmt"
"git.chillcy.com/golang/colorway/internal/pkg/database/model" "git.chillcy.com/golang/colorway/internal/pkg/database/model"
"gorm.io/gorm" "gorm.io/gorm"
"gorm.io/gorm/clause" "gorm.io/gorm/clause"
...@@ -37,6 +38,21 @@ func upsertCompleteSpus(db *gorm.DB, completeSpus model.CompleteSpus) error { ...@@ -37,6 +38,21 @@ func upsertCompleteSpus(db *gorm.DB, completeSpus model.CompleteSpus) error {
return result.Error return result.Error
} }
// OnConflict 导致的更新操作不会回填 ID,即使外键 StyleNumber 存在,也会报错 WHERE conditions required,所以重新读取出来
styleNumbers := completeSpus.GetStyleNumbers()
var reloadedSpus []model.CompleteSpu
err := db.Where("style_number IN ?", styleNumbers).Find(&reloadedSpus).Error
if err != nil {
return fmt.Errorf("failed to reload CompleteSpus: %v", err)
}
for _, reloadSpu := range reloadedSpus {
for i := range completeSpus {
if reloadSpu.StyleNumber == completeSpus[i].StyleNumber {
completeSpus[i].ID = reloadSpu.ID
}
}
}
for _, spu := range completeSpus { for _, spu := range completeSpus {
err := upsertCompleteSpu(db, spu) err := upsertCompleteSpu(db, spu)
if err != nil { if err != nil {
...@@ -49,37 +65,86 @@ func upsertCompleteSpus(db *gorm.DB, completeSpus model.CompleteSpus) error { ...@@ -49,37 +65,86 @@ func upsertCompleteSpus(db *gorm.DB, completeSpus model.CompleteSpus) error {
func upsertCompleteSpu(db *gorm.DB, completeSpu model.CompleteSpu) error { func upsertCompleteSpu(db *gorm.DB, completeSpu model.CompleteSpu) error {
// 处理关联关系 // 处理关联关系
err := db.Model(&completeSpu).Association("ColorSpus").Replace(completeSpu.ColorSpus) // 不能直接 relapce 因为 ColorSpu CompleteSpuStyleNumber not null replace 会先将外键设置为 null 导致报错
err := db.Model(&completeSpu).Association("ColorSpus").Delete()
if err != nil { if err != nil {
return err return err
} }
err = db.Model(&completeSpu).Association("ColorSpus").Append(completeSpu.ColorSpus)
if err != nil {
return err
}
styles := completeSpu.ColorSpus.GetStyles()
var reloadedColorSpus model.ColorSpus
err = db.Where("(complete_spu_style_number, color_code) IN ?", styles).Find(&reloadedColorSpus).Error
if err != nil {
return fmt.Errorf("failed to reload ColorSpus: %v", err)
}
for _, reloadColorSpu := range reloadedColorSpus {
for i := range completeSpu.ColorSpus {
if completeSpu.ColorSpus[i].CompleteSpuStyleNumber == reloadColorSpu.CompleteSpuStyleNumber &&
completeSpu.ColorSpus[i].ColorCode == reloadColorSpu.ColorCode {
completeSpu.ColorSpus[i].ID = reloadColorSpu.ID
}
}
}
for _, colorSpu := range completeSpu.ColorSpus { for _, colorSpu := range completeSpu.ColorSpus {
err = db.Model(&colorSpu).Association("Skus").Replace(colorSpu.Skus) err = db.Model(&colorSpu).Association("Skus").Delete()
if err != nil { if err != nil {
return err return err
} }
err = db.Model(&colorSpu).Association("Images").Replace(colorSpu.Images) err = db.Model(&colorSpu).Association("Skus").Append(colorSpu.Skus)
if err != nil { if err != nil {
return err return err
} }
err = db.Model(&colorSpu).Association("Images").Delete()
if err != nil {
return err
}
err = db.Model(&colorSpu).Association("Images").Append(colorSpu.Images)
if err != nil {
return err
}
}
err = db.Model(&completeSpu).Association("Compositions").Delete()
if err != nil {
return err
}
err = db.Model(&completeSpu).Association("Compositions").Append(completeSpu.Compositions)
if err != nil {
return err
}
err = db.Model(&completeSpu).Association("Models").Delete()
if err != nil {
return err
}
err = db.Model(&completeSpu).Association("Models").Append(completeSpu.Models)
if err != nil {
return err
}
err = db.Model(&completeSpu).Association("Fits").Delete()
if err != nil {
return err
} }
err = db.Model(&completeSpu).Association("Compositions").Replace(completeSpu.Compositions) err = db.Model(&completeSpu).Association("Fits").Append(completeSpu.Fits)
if err != nil { if err != nil {
return err return err
} }
err = db.Model(&completeSpu).Association("Models").Replace(completeSpu.Models) err = db.Model(&completeSpu).Association("Genders").Delete()
if err != nil { if err != nil {
return err return err
} }
err = db.Model(&completeSpu).Association("Fits").Replace(completeSpu.Fits) err = db.Model(&completeSpu).Association("Genders").Append(completeSpu.Genders)
if err != nil { if err != nil {
return err return err
} }
err = db.Model(&completeSpu).Association("Genders").Replace(completeSpu.Genders) err = db.Model(&completeSpu).Association("Categories").Delete()
if err != nil { if err != nil {
return err return err
} }
err = db.Model(&completeSpu).Association("Categories").Replace(completeSpu.Categories) err = db.Model(&completeSpu).Association("Categories").Append(completeSpu.Categories)
if err != nil { if err != nil {
return err return err
} }
......
Name: colorway.rpc Name: colorway.rpc
ListenOn: 0.0.0.0:5200 ListenOn: 0.0.0.0:5200
Mode: dev Mode: dev
Timeout: 30000
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment