2024-08-03 14:12:44 +08:00
|
|
|
package storage
|
|
|
|
|
|
|
|
import (
|
|
|
|
v2 "gitea.timerzz.com/kedaya_haitao/common/structs/v2"
|
|
|
|
"gorm.io/gorm"
|
|
|
|
"gorm.io/gorm/clause"
|
|
|
|
)
|
|
|
|
|
|
|
|
type ArticleApi interface {
|
2024-08-03 17:07:10 +08:00
|
|
|
Upsert(article v2.Article) error
|
|
|
|
Find(query FindArticleQuery) (articles []v2.Article, err error)
|
|
|
|
List(query PageListQuery) (articles []v2.Article, total int64, err error)
|
|
|
|
Get(query GetArticleQuery) (article v2.Article, err error)
|
2024-08-03 14:12:44 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
type articleApi struct {
|
|
|
|
db *gorm.DB
|
|
|
|
}
|
|
|
|
|
2024-08-27 19:35:21 +08:00
|
|
|
func NewArticleApi(db *gorm.DB) ArticleApi {
|
|
|
|
return &articleApi{
|
|
|
|
db: db,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-08-03 14:12:44 +08:00
|
|
|
// Upsert 插入或者更新商品
|
|
|
|
func (a *articleApi) Upsert(article v2.Article) error {
|
|
|
|
return a.db.Clauses(clause.OnConflict{
|
|
|
|
Columns: []clause.Column{{Name: "pid"}, {Name: "brand"}},
|
|
|
|
DoUpdates: clause.AssignmentColumns([]string{"name", "english_name", "available", "updated_at", "cost_price", "sell_price", "rate", "remark"}),
|
|
|
|
}).Create(&article).Error
|
|
|
|
}
|
2024-08-03 17:07:10 +08:00
|
|
|
|
|
|
|
type FindArticleQuery struct {
|
|
|
|
ID uint `query:"id"`
|
|
|
|
Keyword string `query:"keyword"`
|
|
|
|
Brand string `query:"brand"`
|
|
|
|
Pid string `query:"pid"`
|
|
|
|
Available *bool `query:"available"`
|
|
|
|
}
|
|
|
|
|
|
|
|
func (l *FindArticleQuery) Scope(db *gorm.DB) *gorm.DB {
|
|
|
|
if l.ID != 0 {
|
|
|
|
db = db.Where("`id` = ?", l.ID)
|
|
|
|
}
|
|
|
|
if l.Keyword != "" {
|
|
|
|
db = db.Where("(`name` LIKE ? OR `english_name LIKE ? OR `remark` LIKE ? )", "%"+l.Keyword+"%", "%"+l.Keyword+"%", "%"+l.Keyword+"%")
|
|
|
|
}
|
|
|
|
if l.Brand != "" {
|
|
|
|
db = db.Where("`brand` = ?", l.Brand)
|
|
|
|
}
|
|
|
|
if l.Pid != "" {
|
|
|
|
db = db.Where("`pid` = ?", l.Pid)
|
|
|
|
}
|
|
|
|
if l.Available != nil {
|
|
|
|
db = db.Where("`available` = ?", *l.Available)
|
|
|
|
}
|
|
|
|
return db
|
|
|
|
}
|
|
|
|
|
|
|
|
func (a *articleApi) Find(query FindArticleQuery) (articles []v2.Article, err error) {
|
|
|
|
err = a.db.Scopes(query.Scope).Find(&articles).Error
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
func (a *articleApi) List(query PageListQuery) (articles []v2.Article, total int64, err error) {
|
2024-08-26 17:51:14 +08:00
|
|
|
err = a.db.Scopes(query.Scoper.Scope).Model(&v2.Article{}).Count(&total).Error
|
2024-08-03 17:07:10 +08:00
|
|
|
if err != nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
err = a.db.Scopes(query.Scope).Find(&articles).Error
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
type GetArticleQuery struct {
|
|
|
|
ID uint `query:"id"`
|
|
|
|
Brand string `query:"brand"`
|
|
|
|
Pid string `query:"pid"`
|
|
|
|
History bool `query:"history"`
|
|
|
|
}
|
|
|
|
|
|
|
|
func (g *GetArticleQuery) Scope(db *gorm.DB) *gorm.DB {
|
|
|
|
db = db.Preload("Providers").Preload("Sellers")
|
|
|
|
if g.ID != 0 {
|
|
|
|
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.History {
|
|
|
|
db = db.Preload("Providers.HistoryPrice").Preload("Sellers.HistoryPrice")
|
|
|
|
}
|
|
|
|
return db
|
|
|
|
}
|
|
|
|
|
|
|
|
func (a *articleApi) Get(query GetArticleQuery) (article v2.Article, err error) {
|
|
|
|
err = a.db.Scopes(query.Scope).First(&article).Error
|
|
|
|
return
|
|
|
|
}
|