package controller import ( "electricity_bill_calc/model" "electricity_bill_calc/response" "electricity_bill_calc/security" "electricity_bill_calc/service" "net/http" "strconv" "time" "github.com/gofiber/fiber/v2" "github.com/shopspring/decimal" ) func InitializeChargesController(app *fiber.App) { app.Get("/charges", security.OPSAuthorize, listAllCharges) app.Post("/charge", security.OPSAuthorize, recordNewCharge) app.Put("/charge/:uid/:seq", security.OPSAuthorize, modifyChargeState) } func listAllCharges(c *fiber.Ctx) error { result := response.NewResult(c) requestPage, err := strconv.Atoi(c.Query("page", "1")) if err != nil { return result.NotAccept("查询参数[page]格式不正确。") } requestKeyword := c.Query("keyword", "") requestBeginDate := c.Query("begin", "") requestEndDate := c.Query("end", "") charges, total, err := service.ChargeService.ListPagedChargeRecord(requestKeyword, requestBeginDate, requestEndDate, requestPage) if err != nil { return result.NotFound(err.Error()) } return result.Json( http.StatusOK, "已获取到符合条件的计费记录。", response.NewPagedResponse(requestPage, total).ToMap(), fiber.Map{"records": charges}, ) } type _NewChargeFormData struct { UserId string `json:"userId" form:"userId"` Fee decimal.NullDecimal `json:"fee" form:"fee"` Discount decimal.NullDecimal `json:"discount" form:"discount"` Amount decimal.NullDecimal `json:"amount" form:"amount"` ChargeTo model.Date `json:"chargeTo" form:"chargeTo"` } func recordNewCharge(c *fiber.Ctx) error { result := response.NewResult(c) formData := new(_NewChargeFormData) if err := c.BodyParser(formData); err != nil { return result.UnableToParse("无法解析提交的数据。") } currentTime := time.Now() newRecord := &model.UserCharge{ UserId: formData.UserId, Fee: formData.Fee, Discount: formData.Discount, Amount: formData.Amount, Settled: true, SettledAt: ¤tTime, ChargeTo: formData.ChargeTo, } err := service.ChargeService.CreateChargeRecord(newRecord, true) if err != nil { return result.Error(http.StatusInternalServerError, err.Error()) } return result.Created("指定用户的服务已延期。") } type _StateChangeFormData struct { Cancelled bool `json:"cancelled"` } func modifyChargeState(c *fiber.Ctx) error { result := response.NewResult(c) formData := new(_StateChangeFormData) if err := c.BodyParser(formData); err != nil { return result.UnableToParse("无法解析提交的数据。") } requestUserID := c.Params("uid", "") requestChargeSeq, err := strconv.Atoi(c.Params("seq", "-1")) if err != nil || requestChargeSeq == -1 { return result.Error(http.StatusNotAcceptable, "参数[记录流水号]解析错误。") } err = service.ChargeService.CancelCharge(int64(requestChargeSeq), requestUserID) if err != nil { return result.Error(http.StatusInternalServerError, err.Error()) } return result.Updated("指定用户服务延期记录状态已经更新。") }