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 }