feat 添加对provider的操作

This commit is contained in:
timerzz 2024-08-23 18:12:31 +08:00
parent 033c875d5e
commit 33ca01c975
3 changed files with 81 additions and 34 deletions

View File

@ -1,63 +1,102 @@
package storage package storage
import ( import (
"fmt"
"strconv"
"strings"
v2 "gitea.timerzz.com/kedaya_haitao/common/structs/v2" v2 "gitea.timerzz.com/kedaya_haitao/common/structs/v2"
"github.com/samber/lo"
"gorm.io/gorm" "gorm.io/gorm"
"gorm.io/gorm/clause" "gorm.io/gorm/clause"
) )
type ProviderApi interface { type ProviderApi interface {
Get(id uint) (provider v2.Provider, err error)
List(query PageListQuery) (providers []v2.Provider, total int64, err error)
Create(provider v2.Provider) error
Update(provider v2.Provider) error
Delete(id uint) (provider v2.Provider, err error)
}
func NewProviderApi(db *gorm.DB) ProviderApi {
return &providerApi{db: db}
} }
type providerApi struct { type providerApi struct {
db *gorm.DB db *gorm.DB
} }
// ProviderArticleApi 管理供应商商品的接口 type ListProviderQuery struct {
type ProviderArticleApi interface {
Get(query GetProviderArticleQuery) (article v2.ProviderArticle, err error)
Upsert(article v2.ProviderArticle) error
}
type providerArticleApi struct {
db *gorm.DB
}
type GetProviderArticleQuery struct {
ID uint `query:"id"` ID uint `query:"id"`
Brand string `query:"brand"`
Pid string `query:"pid"`
ProviderId string `query:"providerId"` ProviderId string `query:"providerId"`
SkuId string `query:"skuId"` Keyword string `query:"keyword"`
} }
func (g *GetProviderArticleQuery) Scope(db *gorm.DB) *gorm.DB { func (g *ListProviderQuery) Scope(db *gorm.DB) *gorm.DB {
if g.ID > 0 { if g.ID > 0 {
db = db.Where("id=?", g.ID) db = db.Where("id=?", g.ID)
} }
if g.Brand != "" {
db = db.Where("brand=?", g.Brand)
}
if g.Pid != "" {
db = db.Where("pid=?", g.Pid)
}
if g.ProviderId != "" { if g.ProviderId != "" {
db = db.Where("provider_id=?", g.ProviderId) db = db.Where("provider_id=?", g.ProviderId)
} }
if g.SkuId != "" { if g.Keyword != "" {
db = db.Where("sku_id=?", g.SkuId) db = db.Where("name LIKE ?", "%"+g.Keyword+"%")
} }
return db return db
} }
func (p *providerArticleApi) Get(query GetProviderArticleQuery) (article v2.ProviderArticle, err error) { func (p *providerApi) Get(id uint) (provider v2.Provider, err error) {
err = p.db.Scopes(query.Scope).First(&article).Error err = p.db.Where("id = ?", id).Preload("CalculateProcess").First(&provider).Error
return return
} }
func (p *providerArticleApi) Upsert(article v2.ProviderArticle) error { func (p *providerApi) List(query PageListQuery) (providers []v2.Provider, total int64, err error) {
return p.db.Clauses(clause.OnConflict{ err = p.db.Scopes(query.Scoper.Scope).Count(&total).Error
Columns: []clause.Column{{Name: "provider_id"}, {Name: "sku_id"}}, if err != nil {
DoUpdates: clause.AssignmentColumns([]string{"cost"}), return
}).Create(&article).Error }
err = p.db.Scopes(query.Scope).Find(&providers).Error
return
}
func (p *providerApi) Create(provider v2.Provider) error {
if provider.ProviderId == "" {
return fmt.Errorf("标识为空")
}
if provider.Name == "" {
return fmt.Errorf("名称为空")
}
return p.db.Create(&provider).Error
}
func (p *providerApi) Update(provider v2.Provider) error {
if provider.ProviderId == "" {
return fmt.Errorf("标识为空")
}
return p.db.Transaction(func(tx *gorm.DB) error {
ids := lo.Map(lo.Filter(provider.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.Where(fmt.Sprintf("id not in (%s) AND owner_id = ? AND kind = ?", strings.Join(ids, ",")), provider.ID, "provider").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 = ?", provider.ID).Updates(&provider).Error
})
}
func (p *providerApi) Delete(id uint) (provider v2.Provider, err error) {
err = p.db.Transaction(func(tx *gorm.DB) error {
if err = tx.Where("owner_id = ? AND kind = ?", id, "provider").Delete(&v2.CalculateProcess{}).Error; err != nil {
}
return p.db.Clauses(clause.Returning{}).Where("id = ?", id).Delete(&provider).Error
})
return
} }

View File

@ -3,7 +3,8 @@ package storage
import "gorm.io/gorm" import "gorm.io/gorm"
type Storage struct { type Storage struct {
articleApi ArticleApi articleApi ArticleApi
providerApi ProviderApi
} }
func NewStorage(db *gorm.DB) *Storage { func NewStorage(db *gorm.DB) *Storage {
@ -11,9 +12,14 @@ func NewStorage(db *gorm.DB) *Storage {
articleApi: &articleApi{ articleApi: &articleApi{
db: db, db: db,
}, },
providerApi: NewProviderApi(db),
} }
} }
func (s *Storage) Article() ArticleApi { func (s *Storage) Article() ArticleApi {
return s.articleApi return s.articleApi
} }
func (s *Storage) Provider() ProviderApi {
return s.providerApi
}

View File

@ -21,12 +21,14 @@ type Provider struct {
Config ProviderOption `gorm:"type:json;serializer:json" json:"config"` Config ProviderOption `gorm:"type:json;serializer:json" json:"config"`
//计算过程 //计算过程
CalculateProcess []CalculateProcess `json:"calculateProcess" gorm:"polymorphicType:Kind;polymorphicId:OwnerID;polymorphicValue:provider"` CalculateProcess []CalculateProcess `json:"calculateProcess" gorm:"polymorphicType:Kind;polymorphicId:OwnerID;polymorphicValue:provider"`
// 备注
Mark string `json:"mark,omitempty"`
} }
type ProviderOption struct { type ProviderOption struct {
Interval time.Duration `yaml:"interval" json:"interval"` //抓取间隔 Ticker string `yaml:"ticker" json:"ticker"` //每天几点抓取
ExchangeRate float64 `yaml:"exchangeRate" json:"exchangeRate"` //汇率 ExchangeRate float64 `yaml:"exchangeRate" json:"exchangeRate"` //汇率
Freight float64 `yaml:"freight" json:"freight"` //运费 Freight float64 `yaml:"freight" json:"freight"` //运费
} }
// ProviderArticle 供应商商品信息 // ProviderArticle 供应商商品信息