package handlers import ( "platform/pkg/u" "platform/web/auth" "platform/web/core" g "platform/web/globals" q "platform/web/queries" "time" "github.com/gofiber/fiber/v2" ) // PageBillByAdmin 分页查询全部账单 func PageBillByAdmin(c *fiber.Ctx) error { // 检查权限 _, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeBillRead) if err != nil { return err } // 解析请求参数 req := new(PageBillByAdminReq) if err := g.Validator.ParseBody(c, req); err != nil { return err } // 构造查询条件 do := q.Bill.Where() if req.UserPhone != nil { do = do.Where(q.User.As("User").Phone.Eq(*req.UserPhone)) } if req.TradeInnerNo != nil { do = do.Where(q.Trade.As("Trade").InnerNo.Eq(*req.TradeInnerNo)) } if req.ResourceNo != nil { do = do.Where(q.Resource.As("Resource").ResourceNo.Eq(*req.ResourceNo)) } if req.BillNo != nil { do = do.Where(q.Bill.BillNo.Eq(*req.BillNo)) } if req.CreatedAtStart != nil { time := u.DateHead(*req.CreatedAtStart) do = do.Where(q.Bill.CreatedAt.Gte(time)) } if req.CreatedAtEnd != nil { time := u.DateHead(*req.CreatedAtEnd) do = do.Where(q.Bill.CreatedAt.Lte(time)) } if req.ProductCode != nil { do = do.Where(q.Resource.As("Resource").Code.Eq(*req.ProductCode)) } if req.SkuCode != nil { do = do.Where(q.Bill. Where(q.ResourceShort.As("Resource__Short").Code.Eq(*req.SkuCode)). Or(q.ResourceLong.As("Resource__Long").Code.Eq(*req.SkuCode))) } // 查询用户列表 list, total, err := q.Bill. Joins( q.Bill.User, q.Bill.Resource, q.Bill.Trade, q.Bill.Resource.Short, q.Bill.Resource.Long, ). Select( q.Bill.ALL, q.User.As("User").Phone.As("User__phone"), q.User.As("User").Name.As("User__name"), q.Trade.As("Trade").InnerNo.As("Trade__inner_no"), q.Trade.As("Trade").Acquirer.As("Trade__acquirer"), q.Resource.As("Resource").ResourceNo.As("Resource__resource_no"), ). Where(do). Order(q.Bill.CreatedAt.Desc()). FindByPage(req.GetOffset(), req.GetLimit()) if err != nil { return err } // 返回结果 return c.JSON(core.PageResp{ List: list, Total: int(total), Page: req.GetPage(), Size: req.GetSize(), }) } type PageBillByAdminReq struct { core.PageReq UserPhone *string `json:"user_phone,omitempty"` TradeInnerNo *string `json:"trade_inner_no,omitempty"` ResourceNo *string `json:"resource_no,omitempty"` BillNo *string `json:"bill_no,omitempty"` CreatedAtStart *time.Time `json:"created_at_start,omitempty"` CreatedAtEnd *time.Time `json:"created_at_end,omitempty"` ProductCode *string `json:"product_code,omitempty"` SkuCode *string `json:"sku_code,omitempty"` } // PageBillOfUserByAdmin 分页查询指定用户账单 func PageBillOfUserByAdmin(c *fiber.Ctx) error { // 检查权限 _, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeBillReadOfUser) if err != nil { return err } // 解析请求参数 req := new(PageBillOfUserByAdminReq) if err := g.Validator.ParseBody(c, req); err != nil { return err } // 构造查询条件 do := q.Bill.Where(q.Bill.UserID.Eq(req.UserID)) if req.TradeInnerNo != nil { do = do.Where(q.Trade.As("Trade").InnerNo.Eq(*req.TradeInnerNo)) } if req.ResourceNo != nil { do = do.Where(q.Resource.As("Resource").ResourceNo.Eq(*req.ResourceNo)) } if req.BillNo != nil { do = do.Where(q.Bill.BillNo.Eq(*req.BillNo)) } if req.CreatedAtStart != nil { time := u.DateHead(*req.CreatedAtStart) do = do.Where(q.Bill.CreatedAt.Gte(time)) } if req.CreatedAtEnd != nil { time := u.DateHead(*req.CreatedAtEnd) do = do.Where(q.Bill.CreatedAt.Lte(time)) } if req.ProductCode != nil { do = do.Where(q.Resource.As("Resource").Code.Eq(*req.ProductCode)) } if req.SkuCode != nil { do = do.Where(q.Bill. Where(q.ResourceShort.As("Resource__Short").Code.Eq(*req.SkuCode)). Or(q.ResourceLong.As("Resource__Long").Code.Eq(*req.SkuCode))) } // 查询账单列表 list, total, err := q.Bill. Joins( q.Bill.Resource, q.Bill.Trade, q.Bill.Resource.Short, q.Bill.Resource.Long, ). Select( q.Bill.ALL, q.Trade.As("Trade").InnerNo.As("Trade__inner_no"), q.Trade.As("Trade").Acquirer.As("Trade__acquirer"), q.Resource.As("Resource").ResourceNo.As("Resource__resource_no"), ). Where(do). Order(q.Bill.CreatedAt.Desc()). FindByPage(req.GetOffset(), req.GetLimit()) if err != nil { return err } // 返回结果 return c.JSON(core.PageResp{ List: list, Total: int(total), Page: req.GetPage(), Size: req.GetSize(), }) } type PageBillOfUserByAdminReq struct { core.PageReq UserID int32 `json:"user_id" validate:"required"` TradeInnerNo *string `json:"trade_inner_no,omitempty"` ResourceNo *string `json:"resource_no,omitempty"` BillNo *string `json:"bill_no,omitempty"` CreatedAtStart *time.Time `json:"created_at_start,omitempty"` CreatedAtEnd *time.Time `json:"created_at_end,omitempty"` ProductCode *string `json:"product_code,omitempty"` SkuCode *string `json:"sku_code,omitempty"` } // ListBill 获取账单列表 func ListBill(c *fiber.Ctx) error { // 检查权限 authCtx, err := auth.GetAuthCtx(c).PermitUser() if err != nil { return err } // 解析请求参数 req := new(ListBillReq) if err := c.BodyParser(req); err != nil { return err } // 查询账单列表 do := q.Bill. Where(q.Bill.UserID.Eq(authCtx.User.ID)) if req.Type != nil { do.Where(q.Bill.Type.Eq(int(*req.Type))) } if req.CreateAfter != nil { do.Where(q.Bill.CreatedAt.Gte(*req.CreateAfter)) } if req.CreateBefore != nil { do.Where(q.Bill.CreatedAt.Lte(*req.CreateBefore)) } if req.BillNo != nil && *req.BillNo != "" { do.Where(q.Bill.BillNo.Eq(*req.BillNo)) } bills, err := q.Bill.Where(do). Preload(q.Bill.Resource, q.Bill.Trade, q.Bill.Refund). Preload(q.Bill.Resource.Short, q.Bill.Resource.Long). Order(q.Bill.CreatedAt.Desc()). Offset(req.GetOffset()). Limit(req.GetLimit()). Find() if err != nil { return err } var total int64 if len(bills) < req.GetLimit() { total = int64(len(bills) + req.GetOffset()) } else { total, err = q.Bill.Where(do).Count() if err != nil { return err } } return c.JSON(core.PageResp{ Total: int(total), Page: req.GetPage(), Size: req.GetSize(), List: bills, }) } type ListBillReq struct { core.PageReq BillNo *string `json:"bill_no"` Type *int `json:"type"` CreateAfter *time.Time `json:"create_after"` CreateBefore *time.Time `json:"create_before"` }