120 lines
3.4 KiB
Go
120 lines
3.4 KiB
Go
package service
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/gogf/gf/v2/errors/gerror"
|
|
"github.com/gogf/gf/v2/frame/g"
|
|
|
|
"36wisdom/biz/consts"
|
|
"36wisdom/biz/dao"
|
|
"36wisdom/biz/model/dto"
|
|
"36wisdom/common"
|
|
)
|
|
|
|
// ---------- 后台管理 ----------
|
|
|
|
type adminPrize struct{}
|
|
|
|
var AdminPrize = &adminPrize{}
|
|
|
|
// List 全部奖品(含下架),按类型 + 序号排序。
|
|
func (s *adminPrize) List(ctx context.Context, req *dto.AdminPrizeListReq) (*dto.AdminPrizeListRes, error) {
|
|
recs, err := dao.Prize.ListAll(ctx)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
items := make([]*dto.AdminPrizeItem, 0, len(recs))
|
|
for _, r := range recs {
|
|
items = append(items, &dto.AdminPrizeItem{
|
|
Id: r.Id, Name: r.Name, Description: r.Description,
|
|
Icon: r.Icon, PType: r.PType, PointsCost: r.PointsCost,
|
|
Stock: r.Stock, Status: r.Status, SortOrder: r.SortOrder,
|
|
})
|
|
}
|
|
return &dto.AdminPrizeListRes{List: items}, nil
|
|
}
|
|
|
|
// prizeNames 批量奖品名。
|
|
func prizeNames(ctx context.Context, prizeIds []int64) (map[int64]string, error) {
|
|
m := make(map[int64]string, len(prizeIds))
|
|
prizeIds = uniqueInt64(prizeIds)
|
|
if len(prizeIds) == 0 {
|
|
return m, nil
|
|
}
|
|
recs, err := dao.Prize.ListByIds(ctx, prizeIds)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
for _, r := range recs {
|
|
m[r.Id] = r.Name
|
|
}
|
|
return m, nil
|
|
}
|
|
|
|
// Create 新增奖品,清内容缓存。
|
|
func (s *adminPrize) Create(ctx context.Context, req *dto.AdminPrizeCreateReq) (*dto.AdminPrizeCreateRes, error) {
|
|
id, err := dao.Prize.InsertAndReturnId(ctx, g.Map{
|
|
"name": req.Name, "description": req.Description, "icon": req.Icon,
|
|
"p_type": req.PType, "points_cost": req.PointsCost, "stock": req.Stock,
|
|
"sort_order": req.SortOrder, "status": consts.StatusEnabled,
|
|
})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
common.InvalidateContentCache(ctx, consts.TablePrize)
|
|
return &dto.AdminPrizeCreateRes{Id: id}, nil
|
|
}
|
|
|
|
// Update 编辑奖品,清内容缓存。
|
|
func (s *adminPrize) Update(ctx context.Context, req *dto.AdminPrizeUpdateReq) (*dto.AdminPrizeUpdateRes, error) {
|
|
rec, err := dao.Prize.GetByPk(ctx, req.Id)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if rec == nil {
|
|
return nil, gerror.New("奖品不存在")
|
|
}
|
|
if err = dao.Prize.UpdateByPk(ctx, req.Id, g.Map{
|
|
"name": req.Name, "description": req.Description, "icon": req.Icon,
|
|
"p_type": req.PType, "points_cost": req.PointsCost, "stock": req.Stock,
|
|
"sort_order": req.SortOrder,
|
|
}); err != nil {
|
|
return nil, err
|
|
}
|
|
common.InvalidateContentCache(ctx, consts.TablePrize)
|
|
return &dto.AdminPrizeUpdateRes{}, nil
|
|
}
|
|
|
|
// setStatus 上下架(软删除)。
|
|
func (s *adminPrize) setStatus(ctx context.Context, id int64, status int) error {
|
|
rec, err := dao.Prize.GetByPk(ctx, id)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if rec == nil {
|
|
return gerror.New("奖品不存在")
|
|
}
|
|
if err = dao.Prize.UpdateByPk(ctx, id, g.Map{"status": status}); err != nil {
|
|
return err
|
|
}
|
|
common.InvalidateContentCache(ctx, consts.TablePrize)
|
|
return nil
|
|
}
|
|
|
|
// Disable 下架奖品。
|
|
func (s *adminPrize) Disable(ctx context.Context, req *dto.AdminPrizeDisableReq) (*dto.AdminPrizeDisableRes, error) {
|
|
if err := s.setStatus(ctx, req.Id, consts.StatusDisabled); err != nil {
|
|
return nil, err
|
|
}
|
|
return &dto.AdminPrizeDisableRes{}, nil
|
|
}
|
|
|
|
// Enable 上架奖品。
|
|
func (s *adminPrize) Enable(ctx context.Context, req *dto.AdminPrizeEnableReq) (*dto.AdminPrizeEnableRes, error) {
|
|
if err := s.setStatus(ctx, req.Id, consts.StatusEnabled); err != nil {
|
|
return nil, err
|
|
}
|
|
return &dto.AdminPrizeEnableRes{}, nil
|
|
}
|