package controller import ( "electricity_bill_calc/logger" "electricity_bill_calc/model" "electricity_bill_calc/repository" "electricity_bill_calc/response" "electricity_bill_calc/service" "electricity_bill_calc/types" "net/http" "github.com/gofiber/fiber/v2" "go.uber.org/zap" ) var chargeLog = logger.Named("Handler", "Charge") func InitializeChargeHandlers(router *fiber.App) { router.Get("/charge", searchCharges) router.Post("/charge", createNewUserChargeRecord) router.Put("/charge/:uid/:seq", modifyUserChargeState) } // 检索用户的充值记录列表 func searchCharges(c *fiber.Ctx) error { chargeLog.Info("检索用户的充值记录列表。") result := response.NewResult(c) keyword := c.Query("keyword", "") page := c.QueryInt("page", 1) beginTime := types.ParseDateWithDefault(c.Query("begin"), types.NewEmptyDate()) endTime := types.ParseDateWithDefault(c.Query("end"), types.MaxDate()) charges, total, err := repository.ChargeRepository.FindCharges(uint(page), &beginTime, &endTime, &keyword) if err != nil { chargeLog.Error("检索用户的充值记录列表失败。", zap.Error(err)) return result.Error(http.StatusInternalServerError, err.Error()) } return result.Success( "已经获取到符合条件的计费记录。", response.NewPagedResponse(page, total).ToMap(), fiber.Map{"records": charges}, ) } // 创建一条新的用户充值记录 func createNewUserChargeRecord(c *fiber.Ctx) error { chargeLog.Info("创建一条新的用户充值记录。") result := response.NewResult(c) createionForm := new(model.ChargeRecordCreationForm) if err := c.BodyParser(createionForm); err != nil { chargeLog.Error("无法解析创建充值记录的请求数据。", zap.Error(err)) return result.Error(http.StatusBadRequest, err.Error()) } fee, _ := createionForm.Fee.Decimal.Float64() discount, _ := createionForm.Discount.Decimal.Float64() amount, _ := createionForm.Amount.Decimal.Float64() ok, err := service.ChargeService.RecordUserCharge( createionForm.UserId, &fee, &discount, &amount, createionForm.ChargeTo, true, ) if err != nil { chargeLog.Error("创建用户充值记录失败。", zap.Error(err)) return result.Error(http.StatusInternalServerError, err.Error()) } if !ok { chargeLog.Error("创建用户充值记录失败。") return result.NotAccept("创建用户充值记录失败。") } else { return result.Success("创建用户充值记录成功, 指定用户的服务已延期。") } } // 改变用户充值记录的状态 func modifyUserChargeState(c *fiber.Ctx) error { chargeLog.Info("改变用户充值记录的状态。") result := response.NewResult(c) uid := c.Params("uid") seq, err := c.ParamsInt("seq") if err != nil { chargeLog.Error("无法解析请求参数。", zap.Error(err)) return result.Error(http.StatusBadRequest, err.Error()) } ok, err := service.ChargeService.CancelUserCharge(uid, int64(seq)) if err != nil { chargeLog.Error("取消用户充值记录失败。", zap.Error(err)) return result.Error(http.StatusInternalServerError, err.Error()) } if !ok { chargeLog.Error("取消用户充值记录失败。") return result.NotAccept("取消用户充值记录失败。") } else { return result.Success("取消用户充值记录成功。") } }