331 lines
8.5 KiB
Go
331 lines
8.5 KiB
Go
package handlers
|
|
|
|
import (
|
|
"errors"
|
|
"platform/pkg/u"
|
|
"platform/web/auth"
|
|
"platform/web/core"
|
|
g "platform/web/globals"
|
|
m "platform/web/models"
|
|
q "platform/web/queries"
|
|
s "platform/web/services"
|
|
"time"
|
|
|
|
"github.com/gofiber/fiber/v2"
|
|
"gorm.io/gen"
|
|
"gorm.io/gen/field"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
// PageCouponUser 分页查询当前用户已发放优惠券
|
|
func PageCouponUser(c *fiber.Ctx) error {
|
|
authCtx, err := auth.GetAuthCtx(c).PermitUser()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
var req PageCouponUserReq
|
|
if err := g.Validator.ParseBody(c, &req); err != nil {
|
|
return err
|
|
}
|
|
|
|
conds := couponUserPageConditions(req.CouponUserPageFilter)
|
|
conds = append(conds, q.CouponUser.UserID.Eq(authCtx.User.ID))
|
|
|
|
list, total, err := q.CouponUser.
|
|
Joins(q.CouponUser.Coupon).
|
|
Select(couponUserSelect(false)...).
|
|
Where(conds...).
|
|
Order(q.CouponUser.CreatedAt.Desc()).
|
|
FindByPage(req.GetOffset(), req.GetLimit())
|
|
if err != nil {
|
|
return core.NewBizErr("获取数据失败", err)
|
|
}
|
|
|
|
return c.JSON(core.PageResp{
|
|
List: list,
|
|
Total: int(total),
|
|
Page: req.GetPage(),
|
|
Size: req.GetSize(),
|
|
})
|
|
}
|
|
|
|
type PageCouponUserReq struct {
|
|
core.PageReq
|
|
CouponUserPageFilter
|
|
}
|
|
|
|
// GetCouponUser 获取当前用户已发放优惠券详情
|
|
func GetCouponUser(c *fiber.Ctx) error {
|
|
authCtx, err := auth.GetAuthCtx(c).PermitUser()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
var req core.IdReq
|
|
if err := g.Validator.ParseBody(c, &req); err != nil {
|
|
return err
|
|
}
|
|
|
|
item, err := q.CouponUser.
|
|
Joins(q.CouponUser.Coupon).
|
|
Select(couponUserSelect(false)...).
|
|
Where(
|
|
q.CouponUser.ID.Eq(req.Id),
|
|
q.CouponUser.UserID.Eq(authCtx.User.ID),
|
|
).
|
|
Take()
|
|
if errors.Is(err, gorm.ErrRecordNotFound) {
|
|
return core.NewBizErr("已发放优惠券不存在")
|
|
}
|
|
if err != nil {
|
|
return core.NewBizErr("获取数据失败", err)
|
|
}
|
|
|
|
return c.JSON(item)
|
|
}
|
|
|
|
// PageCouponUserByAdmin 分页查询全部已发放优惠券
|
|
func PageCouponUserByAdmin(c *fiber.Ctx) error {
|
|
_, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeCouponUserRead)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
var req PageCouponUserByAdminReq
|
|
if err := g.Validator.ParseBody(c, &req); err != nil {
|
|
return err
|
|
}
|
|
|
|
conds := couponUserPageConditions(req.CouponUserPageFilter)
|
|
if req.UserID != nil {
|
|
conds = append(conds, q.CouponUser.UserID.Eq(*req.UserID))
|
|
}
|
|
if req.UserPhone != nil {
|
|
conds = append(conds, q.User.As("User").Phone.Eq(*req.UserPhone))
|
|
}
|
|
|
|
list, total, err := q.CouponUser.
|
|
Joins(q.CouponUser.Coupon, q.CouponUser.User).
|
|
Select(couponUserSelect(true)...).
|
|
Where(conds...).
|
|
Order(q.CouponUser.CreatedAt.Desc()).
|
|
FindByPage(req.GetOffset(), req.GetLimit())
|
|
if err != nil {
|
|
return core.NewBizErr("获取数据失败", err)
|
|
}
|
|
|
|
return c.JSON(core.PageResp{
|
|
List: list,
|
|
Total: int(total),
|
|
Page: req.GetPage(),
|
|
Size: req.GetSize(),
|
|
})
|
|
}
|
|
|
|
type PageCouponUserByAdminReq struct {
|
|
core.PageReq
|
|
CouponUserPageFilter
|
|
UserID *int32 `json:"user_id,omitempty"`
|
|
UserPhone *string `json:"user_phone,omitempty"`
|
|
}
|
|
|
|
// PageCouponUserOfUserByAdmin 分页查询指定用户已发放优惠券
|
|
func PageCouponUserOfUserByAdmin(c *fiber.Ctx) error {
|
|
_, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeCouponUserReadOfUser)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
var req PageCouponUserOfUserByAdminReq
|
|
if err := g.Validator.ParseBody(c, &req); err != nil {
|
|
return err
|
|
}
|
|
|
|
conds := couponUserPageConditions(req.CouponUserPageFilter)
|
|
conds = append(conds, q.CouponUser.UserID.Eq(req.UserID))
|
|
|
|
list, total, err := q.CouponUser.
|
|
Joins(q.CouponUser.Coupon, q.CouponUser.User).
|
|
Select(couponUserSelect(true)...).
|
|
Where(conds...).
|
|
Order(q.CouponUser.CreatedAt.Desc()).
|
|
FindByPage(req.GetOffset(), req.GetLimit())
|
|
if err != nil {
|
|
return core.NewBizErr("获取数据失败", err)
|
|
}
|
|
|
|
return c.JSON(core.PageResp{
|
|
List: list,
|
|
Total: int(total),
|
|
Page: req.GetPage(),
|
|
Size: req.GetSize(),
|
|
})
|
|
}
|
|
|
|
type PageCouponUserOfUserByAdminReq struct {
|
|
core.PageReq
|
|
CouponUserPageFilter
|
|
UserID int32 `json:"user_id" validate:"required"`
|
|
}
|
|
|
|
// GetCouponUserByAdmin 获取已发放优惠券详情
|
|
func GetCouponUserByAdmin(c *fiber.Ctx) error {
|
|
_, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeCouponUserRead)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
var req core.IdReq
|
|
if err := g.Validator.ParseBody(c, &req); err != nil {
|
|
return err
|
|
}
|
|
|
|
item, err := q.CouponUser.
|
|
Joins(q.CouponUser.Coupon, q.CouponUser.User).
|
|
Select(couponUserSelect(true)...).
|
|
Where(q.CouponUser.ID.Eq(req.Id)).
|
|
Take()
|
|
if errors.Is(err, gorm.ErrRecordNotFound) {
|
|
return core.NewBizErr("已发放优惠券不存在")
|
|
}
|
|
if err != nil {
|
|
return core.NewBizErr("获取数据失败", err)
|
|
}
|
|
|
|
return c.JSON(item)
|
|
}
|
|
|
|
func CreateCouponUserByAdmin(c *fiber.Ctx) error {
|
|
_, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeCouponUserWrite)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
var req s.CreateCouponUserData
|
|
if err := g.Validator.ParseBody(c, &req); err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := s.CouponUser.Create(req); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func UpdateCouponUserByAdmin(c *fiber.Ctx) error {
|
|
_, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeCouponUserWrite)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
var req s.UpdateCouponUserData
|
|
if err := g.Validator.ParseBody(c, &req); err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := s.CouponUser.Update(req); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func DeleteCouponUserByAdmin(c *fiber.Ctx) error {
|
|
_, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeCouponUserWrite)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
var req core.IdReq
|
|
if err := g.Validator.ParseBody(c, &req); err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := s.CouponUser.Delete(req.Id); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
type CouponUserPageFilter struct {
|
|
CouponID *int32 `json:"coupon_id,omitempty"`
|
|
CouponName *string `json:"coupon_name,omitempty"`
|
|
Status *m.CouponUserStatus `json:"status,omitempty"`
|
|
Expired *bool `json:"expired,omitempty"`
|
|
CreatedAtStart *time.Time `json:"created_at_start,omitempty"`
|
|
CreatedAtEnd *time.Time `json:"created_at_end,omitempty"`
|
|
ExpireAtStart *time.Time `json:"expire_at_start,omitempty"`
|
|
ExpireAtEnd *time.Time `json:"expire_at_end,omitempty"`
|
|
UsedAtStart *time.Time `json:"used_at_start,omitempty"`
|
|
UsedAtEnd *time.Time `json:"used_at_end,omitempty"`
|
|
}
|
|
|
|
func couponUserPageConditions(req CouponUserPageFilter) []gen.Condition {
|
|
conds := make([]gen.Condition, 0)
|
|
if req.CouponID != nil {
|
|
conds = append(conds, q.CouponUser.CouponID.Eq(*req.CouponID))
|
|
}
|
|
if req.CouponName != nil {
|
|
conds = append(conds, q.Coupon.As("Coupon").Name.Like("%"+*req.CouponName+"%"))
|
|
}
|
|
if req.Status != nil {
|
|
conds = append(conds, q.CouponUser.Status.Eq(int(*req.Status)))
|
|
}
|
|
if req.Expired != nil {
|
|
if *req.Expired {
|
|
conds = append(conds, q.CouponUser.ExpireAt.IsNotNull(), q.CouponUser.ExpireAt.Lte(time.Now()))
|
|
} else {
|
|
conds = append(conds, q.CouponUser.Where(q.CouponUser.ExpireAt.IsNull()).Or(q.CouponUser.ExpireAt.Gt(time.Now())))
|
|
}
|
|
}
|
|
if req.CreatedAtStart != nil {
|
|
conds = append(conds, q.CouponUser.CreatedAt.Gte(u.DateHead(*req.CreatedAtStart)))
|
|
}
|
|
if req.CreatedAtEnd != nil {
|
|
conds = append(conds, q.CouponUser.CreatedAt.Lte(u.DateTail(*req.CreatedAtEnd)))
|
|
}
|
|
if req.ExpireAtStart != nil {
|
|
conds = append(conds, q.CouponUser.ExpireAt.Gte(u.DateHead(*req.ExpireAtStart)))
|
|
}
|
|
if req.ExpireAtEnd != nil {
|
|
conds = append(conds, q.CouponUser.ExpireAt.Lte(u.DateTail(*req.ExpireAtEnd)))
|
|
}
|
|
if req.UsedAtStart != nil {
|
|
conds = append(conds, q.CouponUser.UsedAt.Gte(u.DateHead(*req.UsedAtStart)))
|
|
}
|
|
if req.UsedAtEnd != nil {
|
|
conds = append(conds, q.CouponUser.UsedAt.Lte(u.DateTail(*req.UsedAtEnd)))
|
|
}
|
|
return conds
|
|
}
|
|
|
|
func couponUserSelect(includeUser bool) []field.Expr {
|
|
cols := []field.Expr{
|
|
q.CouponUser.ALL,
|
|
q.Coupon.As("Coupon").ID.As("Coupon__id"),
|
|
q.Coupon.As("Coupon").Name.As("Coupon__name"),
|
|
q.Coupon.As("Coupon").Amount.As("Coupon__amount"),
|
|
q.Coupon.As("Coupon").MinAmount.As("Coupon__min_amount"),
|
|
q.Coupon.As("Coupon").Count_.As("Coupon__count"),
|
|
q.Coupon.As("Coupon").Status.As("Coupon__status"),
|
|
q.Coupon.As("Coupon").ExpireType.As("Coupon__expire_type"),
|
|
q.Coupon.As("Coupon").ExpireAt.As("Coupon__expire_at"),
|
|
q.Coupon.As("Coupon").ExpireIn.As("Coupon__expire_in"),
|
|
q.Coupon.As("Coupon").CreatedAt.As("Coupon__created_at"),
|
|
q.Coupon.As("Coupon").UpdatedAt.As("Coupon__updated_at"),
|
|
}
|
|
|
|
if includeUser {
|
|
cols = append(cols,
|
|
q.User.As("User").ID.As("User__id"),
|
|
q.User.As("User").Phone.As("User__phone"),
|
|
q.User.As("User").Name.As("User__name"),
|
|
)
|
|
}
|
|
|
|
return cols
|
|
}
|