diff --git a/controller/top_up.go b/controller/top_up.go new file mode 100644 index 0000000..092d62a --- /dev/null +++ b/controller/top_up.go @@ -0,0 +1,140 @@ +package controller + +import ( + "electricity_bill_calc/logger" + "electricity_bill_calc/repository" + "electricity_bill_calc/response" + "electricity_bill_calc/security" + "electricity_bill_calc/tools" + "electricity_bill_calc/types" + "electricity_bill_calc/vo" + + "github.com/gofiber/fiber/v2" + "github.com/jinzhu/copier" + "go.uber.org/zap" +) + +var topUpLog = logger.Named("Controller", "TopUp") + +func InitializeTopUpHandlers(router *fiber.App) { + router.Get("/topup/:pid", security.EnterpriseAuthorize, listTopUps) + router.Post("/topup/:pid", security.EnterpriseAuthorize, createTopUp) + router.Get("/topup/:pid/:code", security.EnterpriseAuthorize, getTopUp) + router.Delete("/topup/:pid/:code", security.EnterpriseAuthorize, deleteTopUp) +} + +// 查询符合条件的商户充值记录 +func listTopUps(c *fiber.Ctx) error { + result := response.NewResult(c) + park := tools.EmptyToNil(c.Params("pid")) + if park == nil { + topUpLog.Error("查询符合条件的商户充值记录,未指定要访问的园区") + return result.BadRequest("未指定要访问的园区") + } + if pass, err := checkParkBelongs(*park, topUpLog, c, &result); !pass { + return err + } + keyword := tools.EmptyToNil(c.Query("keyword")) + startDate, err := types.ParseDatep(c.Query("start_date")) + if err != nil { + topUpLog.Error("查询符合条件的商户充值记录,查询起始日期格式错误", zap.Error(err)) + return result.BadRequest("查询起始日期格式错误") + } + endDate, err := types.ParseDatep(c.Query("end_date")) + if err != nil { + topUpLog.Error("查询符合条件的商户充值记录,查询结束日期格式错误", zap.Error(err)) + return result.BadRequest("查询结束日期格式错误") + } + page := c.QueryInt("page", 1) + topUps, total, err := repository.TopUpRepository.ListTopUps(*park, startDate, endDate, keyword, uint(page)) + if err != nil { + topUpLog.Error("查询符合条件的商户充值记录,查询失败", zap.Error(err)) + return result.Error(fiber.StatusInternalServerError, "商户充值记录查询不成功") + } + var topUpDetails []*vo.TopUpDetailQueryResponse + copier.Copy(&topUpDetails, &topUps) + return result.Success( + "已经获取到符合条件的商户充值记录", + response.NewPagedResponse(page, total).ToMap(), + fiber.Map{"topUps": topUpDetails}, + ) +} + +// 获取指定充值记录的详细内容 +func getTopUp(c *fiber.Ctx) error { + result := response.NewResult(c) + park := tools.EmptyToNil(c.Params("pid")) + if park == nil { + topUpLog.Error("获取指定充值记录的详细内容,未指定要访问的园区") + return result.BadRequest("未指定要访问的园区") + } + if pass, err := checkParkBelongs(*park, topUpLog, c, &result); !pass { + return err + } + topUpCode := tools.EmptyToNil(c.Params("code")) + if topUpCode == nil { + topUpLog.Error("获取指定充值记录的详细内容,未指定要查询的充值记录") + return result.BadRequest("未指定要查询的充值记录") + } + topUp, err := repository.TopUpRepository.GetTopUp(*park, *topUpCode) + if err != nil { + topUpLog.Error("获取指定充值记录的详细内容,查询失败", zap.Error(err)) + return result.NotFound("未找到指定的商户充值记录") + } + var topUpDetail vo.TopUpDetailQueryResponse + copier.Copy(&topUpDetail, &topUp) + return result.Success( + "已经获取到指定充值记录的详细内容", + fiber.Map{"topup": topUpDetail}, + ) +} + +// 创建一条新的商户充值记录 +func createTopUp(c *fiber.Ctx) error { + result := response.NewResult(c) + park := tools.EmptyToNil(c.Params("pid")) + if park == nil { + topUpLog.Error("创建一条新的商户充值记录,未指定要访问的园区") + return result.BadRequest("未指定要访问的园区") + } + if pass, err := checkParkBelongs(*park, topUpLog, c, &result); !pass { + return err + } + var form vo.TopUpCreationForm + if err := c.BodyParser(&form); err != nil { + topUpLog.Error("创建一条新的商户充值记录,请求体解析失败", zap.Error(err)) + return result.BadRequest("请求体解析失败") + } + if err := repository.TopUpRepository.CreateTopUp(*park, &form); err != nil { + topUpLog.Error("创建一条新的商户充值记录,创建失败", zap.Error(err)) + return result.NotAccept("商户充值记录创建不成功") + } + return result.Created( + "已经创建一条新的商户充值记录", + ) +} + +// 删除一条指定的商户充值记录 +func deleteTopUp(c *fiber.Ctx) error { + result := response.NewResult(c) + park := tools.EmptyToNil(c.Params("pid")) + if park == nil { + topUpLog.Error("删除一条指定的商户充值记录,未指定要访问的园区") + return result.BadRequest("未指定要访问的园区") + } + if pass, err := checkParkBelongs(*park, topUpLog, c, &result); !pass { + return err + } + topUpCode := tools.EmptyToNil(c.Params("code")) + if topUpCode == nil { + topUpLog.Error("删除一条指定的商户充值记录,未指定要删除的充值记录") + return result.BadRequest("未指定要删除的充值记录") + } + if err := repository.TopUpRepository.DeleteTopUp(*park, *topUpCode); err != nil { + topUpLog.Error("删除一条指定的商户充值记录,删除失败", zap.Error(err)) + return result.NotAccept("商户充值记录删除不成功") + } + return result.Deleted( + "已经删除一条指定的商户充值记录", + ) +} diff --git a/model/top_up.go b/model/top_up.go index 64f2b35..fe4c1c1 100644 --- a/model/top_up.go +++ b/model/top_up.go @@ -20,3 +20,14 @@ type TopUp struct { SynchronizedAt *types.DateTime `json:"synchronizedAt" db:"synchronized_at"` CancelledAt *types.DateTime `json:"cancelledAt" db:"cancelled_at"` } + +func (t TopUp) SyncStatus() int16 { + switch { + case t.SuccessfulSynchronized && t.SynchronizedAt != nil: + return 1 + case !t.SuccessfulSynchronized && t.SynchronizedAt != nil: + return 2 + default: + return 0 + } +} diff --git a/router/router.go b/router/router.go index 251260c..ac51adb 100644 --- a/router/router.go +++ b/router/router.go @@ -50,6 +50,7 @@ func App() *fiber.App { controller.InitializeParkHandlers(app) controller.InitializeMeterHandlers(app) controller.InitializeInvoiceHandler(app) + controller.InitializeTopUpHandlers(app) return app } diff --git a/vo/top_up.go b/vo/top_up.go index fb7f01f..c1c8f39 100644 --- a/vo/top_up.go +++ b/vo/top_up.go @@ -7,3 +7,15 @@ type TopUpCreationForm struct { Meter string `json:"meter"` Amount decimal.Decimal `json:"amount"` } + +type TopUpDetailQueryResponse struct { + Id string `json:"id" copier:"topUpCode"` + Tenement string `json:"tenement"` + TenementName string `json:"tenementName"` + Meter string `json:"meter"` + MeterAddress string `json:"meterAddress"` + ToppedUpAt string `json:"toppedUpAt"` + Amount decimal.Decimal `json:"amount"` + PaymentType int16 `json:"paymentType"` + SyncStatus int16 `json:"syncStatus" copier:"SyncStatus"` +}