Files
shop-user-trade/dao/market/market_dao.go
2026-04-02 10:22:36 +08:00

152 lines
4.3 KiB
Go

package dao
import (
"context"
"time"
"gitea.com/red-future/common/db/gfdb"
"github.com/gogf/gf/v2/database/gdb"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/util/gconv"
marketConsts "shop-user-trade/consts/market"
"shop-user-trade/consts/public"
marketDto "shop-user-trade/model/dto/market"
marketEntity "shop-user-trade/model/entity/market"
)
var Market = new(marketDao)
type marketDao struct{}
// Insert 插入市场物品
func (d *marketDao) Insert(ctx context.Context, req *marketDto.CreateMarketReq) (id int64, err error) {
var entity *marketEntity.Market
if err = gconv.Struct(req, &entity); err != nil {
return
}
entity.Status = marketConsts.MarketStatusActive
r, err := gfdb.DB(ctx).Model(ctx, public.TableNameMarket).Data(entity).Insert()
if err != nil {
return
}
return r.LastInsertId()
}
// Update 更新市场物品
func (d *marketDao) Update(ctx context.Context, req *marketDto.UpdateMarketReq) (rows int64, err error) {
r, err := gfdb.DB(ctx).Model(ctx, public.TableNameMarket).
Data(req).
Where(marketEntity.MarketCol.Id, req.Id).
OmitEmpty().
Update()
if err != nil {
return
}
return r.RowsAffected()
}
// Delete 删除市场物品(软删除)
func (d *marketDao) Delete(ctx context.Context, req *marketDto.DeleteMarketReq) (rows int64, err error) {
r, err := gfdb.DB(ctx).Model(ctx, public.TableNameMarket).
Where(marketEntity.MarketCol.Id, req.Id).
Delete()
if err != nil {
return
}
return r.RowsAffected()
}
// GetOne 获取单个市场物品
func (d *marketDao) GetOne(ctx context.Context, req *marketDto.GetMarketReq) (res *marketEntity.Market, err error) {
r, err := gfdb.DB(ctx).Model(ctx, public.TableNameMarket).
Where(marketEntity.MarketCol.Id, req.Id).
One()
if err != nil {
return
}
err = r.Struct(&res)
return
}
// GetByID 根据ID获取市场物品
func (d *marketDao) GetByID(ctx context.Context, id int64) (res *marketEntity.Market, err error) {
r, err := gfdb.DB(ctx).Model(ctx, public.TableNameMarket).
Where(marketEntity.MarketCol.Id, id).
One()
if err != nil {
return
}
err = r.Struct(&res)
return
}
// GetByKnapsackID 根据背包项ID获取市场物品
func (d *marketDao) GetByKnapsackID(ctx context.Context, knapsackID int64) (res *marketEntity.Market, err error) {
r, err := gfdb.DB(ctx).Model(ctx, public.TableNameMarket).
Where(marketEntity.MarketCol.KnapsackID, knapsackID).
WhereNotIn(marketEntity.MarketCol.Status, []marketConsts.MarketStatus{
marketConsts.MarketStatusSold,
marketConsts.MarketStatusInactive,
marketConsts.MarketStatusExpired,
}).
One()
if err != nil {
return
}
err = r.Struct(&res)
return
}
// Count 获取市场物品数量
func (d *marketDao) Count(ctx context.Context, req *marketDto.ListMarketReq) (count int, err error) {
return d.buildListFilter(ctx, req).Count()
}
// List 获取市场列表
func (d *marketDao) List(ctx context.Context, req *marketDto.ListMarketReq) (res []marketEntity.Market, total int, err error) {
model := d.buildListFilter(ctx, req).OrderDesc(marketEntity.MarketCol.CreatedAt)
if req.Page != nil {
model.Page(int(req.Page.PageNum), int(req.Page.PageSize))
}
r, total, err := model.AllAndCount(false)
if err != nil {
return
}
err = r.Structs(&res)
return
}
// ListExpired 获取过期市场物品列表
func (d *marketDao) ListExpired(ctx context.Context) (res []marketEntity.Market, err error) {
now := time.Now().Unix()
r, err := gfdb.DB(ctx).Model(ctx, public.TableNameMarket).
Where(marketEntity.MarketCol.Status, marketConsts.MarketStatusActive).
WhereLT(marketEntity.MarketCol.ListExpireAt, now).
WhereNotNull(marketEntity.MarketCol.ListExpireAt).
All()
if err != nil {
return
}
err = r.Structs(&res)
return
}
// buildListFilter 构建列表查询过滤条件
func (d *marketDao) buildListFilter(ctx context.Context, req *marketDto.ListMarketReq) *gdb.Model {
model := gfdb.DB(ctx).Model(ctx, public.TableNameMarket).OmitEmpty()
if !g.IsEmpty(req.UserID) {
model = model.Where(marketEntity.MarketCol.UserID, req.UserID)
}
if req.Status != nil {
model = model.Where(marketEntity.MarketCol.Status, *req.Status)
}
if !g.IsEmpty(req.Type) {
model = model.Where(marketEntity.MarketCol.Type, req.Type)
}
if !g.IsEmpty(req.Keyword) {
model = model.WhereLike(marketEntity.MarketCol.AssetName, "%"+req.Keyword+"%")
}
return model
}