package storage import ( "fmt" "strconv" v2 "gitea.timerzz.com/kedaya_haitao/common/structs/v2" "github.com/samber/lo" "gorm.io/gorm" "gorm.io/gorm/clause" ) type SellerApi interface { Get(id uint) (seller v2.Seller, err error) GetBySellerId(sellerId v2.SellerId) (seller v2.Seller, err error) List(query PageListQuery) (sellers []v2.Seller, total int64, err error) Create(seller v2.Seller) error Update(seller v2.Seller) error UpdateStatus(seller v2.Seller) error Delete(id uint) (seller v2.Seller, err error) AutoMigrate() error } func NewSellerApi(db *gorm.DB) SellerApi { return &sellerApi{db: db} } type sellerApi struct { db *gorm.DB } type ListSellerQuery struct { ID uint `query:"id"` SellerId v2.SellerId `query:"sellerId"` Keyword string `query:"keyword"` } func (g *ListSellerQuery) Scope(db *gorm.DB) *gorm.DB { if g.ID > 0 { db = db.Where("id=?", g.ID) } if g.SellerId != "" { db = db.Where("seller_id=?", g.SellerId) } if g.Keyword != "" { db = db.Where("name ilike ?", "%"+g.Keyword+"%") } return db } func (p *sellerApi) Get(id uint) (seller v2.Seller, err error) { err = p.db.Where("id=?", id).Preload("CalculateProcess").First(&seller).Error return } func (p *sellerApi) GetBySellerId(sellerId v2.SellerId) (seller v2.Seller, err error) { err = p.db.Where("seller_id=?", sellerId).Preload("CalculateProcess").First(&seller).Error return } func (p *sellerApi) List(query PageListQuery) (sellers []v2.Seller, total int64, err error) { err = p.db.Scopes(query.Scoper.Scope).Model(&v2.Seller{}).Count(&total).Error if err != nil { return } err = p.db.Scopes(query.Scope).Find(&sellers).Error return } func (p *sellerApi) Create(seller v2.Seller) error { if seller.SellerId == "" { return fmt.Errorf("标识为空") } if seller.Name == "" { return fmt.Errorf("名称为空") } return p.db.Create(&seller).Error } func (p *sellerApi) Update(seller v2.Seller) error { if seller.SellerId == "" { return fmt.Errorf("标识为空") } return p.db.Transaction(func(tx *gorm.DB) error { ids := lo.Map(lo.Filter(seller.CalculateProcess, func(item v2.CalculateProcess, index int) bool { return item.ID > 0 }), func(item v2.CalculateProcess, index int) string { return strconv.Itoa(int(item.ID)) }) // 删除已经没有的CalculateProcess if err := tx.Not(ids).Where("owner_id=? AND kind=?", seller.ID, "seller").Delete(&v2.CalculateProcess{}).Error; err != nil { return err } // 更新方案的name和描述 return tx.Session(&gorm.Session{FullSaveAssociations: true}).Select("updated_at", "name", "config", "mark", "CalculateProcess"). Where("id=?", seller.ID).Updates(&seller).Error }) } func (p *sellerApi) UpdateStatus(seller v2.Seller) error { if seller.ID == 0 { return fmt.Errorf("id为空") } return p.db.Model(&seller).Where("id=?", seller.ID).Select("status", "msg", "pull_at").Updates(&seller).Error } func (p *sellerApi) Delete(id uint) (seller v2.Seller, err error) { err = p.db.Transaction(func(tx *gorm.DB) error { if err = tx.Where("owner_id=? AND kind=?", id, "seller").Delete(&v2.CalculateProcess{}).Error; err != nil { } return p.db.Clauses(clause.Returning{}).Where("id=?", id).Delete(&seller).Error }) return } func (p *sellerApi) AutoMigrate() error { return p.db.AutoMigrate(&v2.Seller{}, &v2.CalculateProcess{}) }