| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312 |
- package payment
- import (
- "strconv"
- "github.com/gin-gonic/gin"
- "wails-app/internal/dao"
- "wails-app/internal/model/common/response"
- "wails-app/internal/model/vehicle/request"
- "wails-app/internal/modules/payment/repository"
- paymentService "wails-app/internal/modules/payment/service"
- utils "wails-app/internal/pkg"
- "wails-app/internal/service"
- )
- var vehicleSvc = service.ServiceGroupApp.VehicleServiceGroup.VehicleService
- var paymentSvc = paymentService.NewPaymentService()
- // ExitPreview 费用预览(只读,不修改数据库)
- func ExitPreview(c *gin.Context) {
- var req request.VehicleEntry
- if err := c.ShouldBindJSON(&req); err != nil {
- response.FailWithMessage(err.Error(), c)
- return
- }
- resp, err := vehicleSvc.ExitPreview(req)
- if err != nil {
- response.FailWithMessage(err.Error(), c)
- return
- }
- response.OkWithData(resp, c)
- }
- // ExitConfirm 确认出场 + 支付
- func ExitConfirm(c *gin.Context) {
- var req request.ExitConfirmRequest
- if err := c.ShouldBindJSON(&req); err != nil {
- response.FailWithMessage(err.Error(), c)
- return
- }
- resp, err := vehicleSvc.ExitConfirm(req, utils.GetUserID(c))
- if err != nil {
- response.FailWithMessage(err.Error(), c)
- return
- }
- response.OkWithData(resp, c)
- }
- // ListPayments 收费记录列表
- func ListPayments(c *gin.Context) {
- var q repository.PaymentListQuery
- if err := c.ShouldBindQuery(&q); err != nil {
- response.FailWithMessage(err.Error(), c)
- return
- }
- list, total, err := paymentSvc.QueryPayments(q)
- if err != nil {
- response.FailWithMessage(err.Error(), c)
- return
- }
- response.OkWithDetailed(response.PageResult{
- List: list,
- Total: total,
- Page: q.Page,
- PageSize: q.PageSize,
- }, "查询成功", c)
- }
- // TodaySummary 当日收费汇总
- func TodaySummary(c *gin.Context) {
- s, err := paymentSvc.GetTodaySummary()
- if err != nil {
- response.FailWithMessage(err.Error(), c)
- return
- }
- response.OkWithData(s, c)
- }
- type methodStatusRequest struct {
- Enabled bool `json:"enabled"`
- }
- type methodOption struct {
- Code string `json:"code"`
- Name string `json:"name"`
- }
- type entryOption struct {
- Code string `json:"code"`
- Name string `json:"name"`
- }
- func ListMethods(c *gin.Context) {
- list, err := paymentSvc.ListMethods()
- if err != nil {
- response.FailWithMessage(err.Error(), c)
- return
- }
- response.OkWithData(list, c)
- }
- func ListEnabledMethods(c *gin.Context) {
- entryCode := c.Query("entry")
- if entryCode == "" {
- // Accept the old query name during the transition so older clients keep
- // working while the API now exposes the concept as a payment entry.
- entryCode = c.Query("scene")
- }
- list, err := paymentSvc.ListEnabledMethods(entryCode)
- if err != nil {
- response.FailWithMessage(err.Error(), c)
- return
- }
- response.OkWithData(list, c)
- }
- func ListMethodOptions(c *gin.Context) {
- list, err := paymentSvc.ListMethods()
- if err != nil {
- response.FailWithMessage(err.Error(), c)
- return
- }
- options := make([]methodOption, 0, len(list)+1)
- for _, method := range list {
- options = append(options, methodOption{Code: method.Code, Name: method.Name})
- }
- options = append(options, methodOption{Code: paymentService.PaymentFree, Name: "免密放行"})
- response.OkWithData(options, c)
- }
- func ListEntries(c *gin.Context) {
- list, err := paymentSvc.ListEntries()
- if err != nil {
- response.FailWithMessage(err.Error(), c)
- return
- }
- response.OkWithData(list, c)
- }
- func ListEnabledEntries(c *gin.Context) {
- list, err := paymentSvc.ListEnabledEntries()
- if err != nil {
- response.FailWithMessage(err.Error(), c)
- return
- }
- response.OkWithData(list, c)
- }
- func ListEntryOptions(c *gin.Context) {
- list, err := paymentSvc.ListEnabledEntries()
- if err != nil {
- response.FailWithMessage(err.Error(), c)
- return
- }
- options := make([]entryOption, 0, len(list))
- for _, entry := range list {
- options = append(options, entryOption{Code: entry.Code, Name: entry.Name})
- }
- response.OkWithData(options, c)
- }
- func CreateMethod(c *gin.Context) {
- var req dao.PaymentMethodConfig
- if err := c.ShouldBindJSON(&req); err != nil {
- response.FailWithMessage(err.Error(), c)
- return
- }
- if err := paymentSvc.CreateMethod(&req); err != nil {
- response.FailWithMessage(err.Error(), c)
- return
- }
- response.OkWithMessage("新增支付方式成功", c)
- }
- func UpdateMethod(c *gin.Context) {
- id, err := strconv.ParseUint(c.Param("id"), 10, 64)
- if err != nil || id == 0 {
- response.FailWithMessage("无效的支付方式ID", c)
- return
- }
- var req dao.PaymentMethodConfig
- if err := c.ShouldBindJSON(&req); err != nil {
- response.FailWithMessage(err.Error(), c)
- return
- }
- if err := paymentSvc.UpdateMethod(uint(id), &req); err != nil {
- response.FailWithMessage(err.Error(), c)
- return
- }
- response.OkWithMessage("更新支付方式成功", c)
- }
- func SetMethodStatus(c *gin.Context) {
- id, err := strconv.ParseUint(c.Param("id"), 10, 64)
- if err != nil || id == 0 {
- response.FailWithMessage("无效的支付方式ID", c)
- return
- }
- var req methodStatusRequest
- if err := c.ShouldBindJSON(&req); err != nil {
- response.FailWithMessage(err.Error(), c)
- return
- }
- if err := paymentSvc.SetMethodEnabled(uint(id), req.Enabled); err != nil {
- response.FailWithMessage(err.Error(), c)
- return
- }
- response.OkWithMessage("支付方式状态已更新", c)
- }
- func DeleteMethod(c *gin.Context) {
- id, err := strconv.ParseUint(c.Param("id"), 10, 64)
- if err != nil || id == 0 {
- response.FailWithMessage("无效的支付方式ID", c)
- return
- }
- if err := paymentSvc.DeleteMethod(uint(id)); err != nil {
- response.FailWithMessage(err.Error(), c)
- return
- }
- response.OkWithMessage("删除支付方式成功", c)
- }
- func CreateEntry(c *gin.Context) {
- var req dao.PaymentEntryConfig
- if err := c.ShouldBindJSON(&req); err != nil {
- response.FailWithMessage(err.Error(), c)
- return
- }
- if err := paymentSvc.CreateEntry(&req); err != nil {
- response.FailWithMessage(err.Error(), c)
- return
- }
- response.OkWithMessage("新增支付入口成功", c)
- }
- func UpdateEntry(c *gin.Context) {
- id, err := strconv.ParseUint(c.Param("id"), 10, 64)
- if err != nil || id == 0 {
- response.FailWithMessage("无效的支付入口ID", c)
- return
- }
- var req dao.PaymentEntryConfig
- if err := c.ShouldBindJSON(&req); err != nil {
- response.FailWithMessage(err.Error(), c)
- return
- }
- if err := paymentSvc.UpdateEntry(uint(id), &req); err != nil {
- response.FailWithMessage(err.Error(), c)
- return
- }
- response.OkWithMessage("更新支付入口成功", c)
- }
- func SetEntryStatus(c *gin.Context) {
- id, err := strconv.ParseUint(c.Param("id"), 10, 64)
- if err != nil || id == 0 {
- response.FailWithMessage("无效的支付入口ID", c)
- return
- }
- var req methodStatusRequest
- if err := c.ShouldBindJSON(&req); err != nil {
- response.FailWithMessage(err.Error(), c)
- return
- }
- if err := paymentSvc.SetEntryEnabled(uint(id), req.Enabled); err != nil {
- response.FailWithMessage(err.Error(), c)
- return
- }
- response.OkWithMessage("支付入口状态已更新", c)
- }
- func DeleteEntry(c *gin.Context) {
- id, err := strconv.ParseUint(c.Param("id"), 10, 64)
- if err != nil || id == 0 {
- response.FailWithMessage("无效的支付入口ID", c)
- return
- }
- if err := paymentSvc.DeleteEntry(uint(id)); err != nil {
- response.FailWithMessage(err.Error(), c)
- return
- }
- response.OkWithMessage("支付入口已删除", c)
- }
- // SetupPaymentRouter 注册支付相关路由
- func SetupPaymentRouter(router *gin.RouterGroup) {
- pg := router.Group("/payment")
- {
- pg.GET("/list", ListPayments)
- pg.GET("/today-summary", TodaySummary)
- pg.GET("/methods", ListMethods)
- pg.GET("/methods/enabled", ListEnabledMethods)
- pg.GET("/methods/options", ListMethodOptions)
- pg.POST("/methods", CreateMethod)
- pg.PUT("/methods/:id", UpdateMethod)
- pg.PATCH("/methods/:id/status", SetMethodStatus)
- pg.DELETE("/methods/:id", DeleteMethod)
- pg.GET("/entries", ListEntries)
- pg.GET("/entries/enabled", ListEnabledEntries)
- pg.GET("/entries/options", ListEntryOptions)
- pg.POST("/entries", CreateEntry)
- pg.PUT("/entries/:id", UpdateEntry)
- pg.PATCH("/entries/:id/status", SetEntryStatus)
- pg.DELETE("/entries/:id", DeleteEntry)
- }
- eg := router.Group("/vehicle")
- {
- eg.POST("/exit/preview", ExitPreview)
- eg.POST("/exit/confirm", ExitConfirm)
- }
- }
|