api.go 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  1. package payment
  2. import (
  3. "strconv"
  4. "github.com/gin-gonic/gin"
  5. "wails-app/internal/dao"
  6. "wails-app/internal/model/common/response"
  7. "wails-app/internal/model/vehicle/request"
  8. "wails-app/internal/modules/payment/repository"
  9. paymentService "wails-app/internal/modules/payment/service"
  10. utils "wails-app/internal/pkg"
  11. "wails-app/internal/service"
  12. )
  13. var vehicleSvc = service.ServiceGroupApp.VehicleServiceGroup.VehicleService
  14. var paymentSvc = paymentService.NewPaymentService()
  15. // ExitPreview 费用预览(只读,不修改数据库)
  16. func ExitPreview(c *gin.Context) {
  17. var req request.VehicleEntry
  18. if err := c.ShouldBindJSON(&req); err != nil {
  19. response.FailWithMessage(err.Error(), c)
  20. return
  21. }
  22. resp, err := vehicleSvc.ExitPreview(req)
  23. if err != nil {
  24. response.FailWithMessage(err.Error(), c)
  25. return
  26. }
  27. response.OkWithData(resp, c)
  28. }
  29. // ExitConfirm 确认出场 + 支付
  30. func ExitConfirm(c *gin.Context) {
  31. var req request.ExitConfirmRequest
  32. if err := c.ShouldBindJSON(&req); err != nil {
  33. response.FailWithMessage(err.Error(), c)
  34. return
  35. }
  36. resp, err := vehicleSvc.ExitConfirm(req, utils.GetUserID(c))
  37. if err != nil {
  38. response.FailWithMessage(err.Error(), c)
  39. return
  40. }
  41. response.OkWithData(resp, c)
  42. }
  43. // ListPayments 收费记录列表
  44. func ListPayments(c *gin.Context) {
  45. var q repository.PaymentListQuery
  46. if err := c.ShouldBindQuery(&q); err != nil {
  47. response.FailWithMessage(err.Error(), c)
  48. return
  49. }
  50. list, total, err := paymentSvc.QueryPayments(q)
  51. if err != nil {
  52. response.FailWithMessage(err.Error(), c)
  53. return
  54. }
  55. response.OkWithDetailed(response.PageResult{
  56. List: list,
  57. Total: total,
  58. Page: q.Page,
  59. PageSize: q.PageSize,
  60. }, "查询成功", c)
  61. }
  62. // TodaySummary 当日收费汇总
  63. func TodaySummary(c *gin.Context) {
  64. s, err := paymentSvc.GetTodaySummary()
  65. if err != nil {
  66. response.FailWithMessage(err.Error(), c)
  67. return
  68. }
  69. response.OkWithData(s, c)
  70. }
  71. type methodStatusRequest struct {
  72. Enabled bool `json:"enabled"`
  73. }
  74. type methodOption struct {
  75. Code string `json:"code"`
  76. Name string `json:"name"`
  77. }
  78. type entryOption struct {
  79. Code string `json:"code"`
  80. Name string `json:"name"`
  81. }
  82. func ListMethods(c *gin.Context) {
  83. list, err := paymentSvc.ListMethods()
  84. if err != nil {
  85. response.FailWithMessage(err.Error(), c)
  86. return
  87. }
  88. response.OkWithData(list, c)
  89. }
  90. func ListEnabledMethods(c *gin.Context) {
  91. entryCode := c.Query("entry")
  92. if entryCode == "" {
  93. // Accept the old query name during the transition so older clients keep
  94. // working while the API now exposes the concept as a payment entry.
  95. entryCode = c.Query("scene")
  96. }
  97. list, err := paymentSvc.ListEnabledMethods(entryCode)
  98. if err != nil {
  99. response.FailWithMessage(err.Error(), c)
  100. return
  101. }
  102. response.OkWithData(list, c)
  103. }
  104. func ListMethodOptions(c *gin.Context) {
  105. list, err := paymentSvc.ListMethods()
  106. if err != nil {
  107. response.FailWithMessage(err.Error(), c)
  108. return
  109. }
  110. options := make([]methodOption, 0, len(list)+1)
  111. for _, method := range list {
  112. options = append(options, methodOption{Code: method.Code, Name: method.Name})
  113. }
  114. options = append(options, methodOption{Code: paymentService.PaymentFree, Name: "免密放行"})
  115. response.OkWithData(options, c)
  116. }
  117. func ListEntries(c *gin.Context) {
  118. list, err := paymentSvc.ListEntries()
  119. if err != nil {
  120. response.FailWithMessage(err.Error(), c)
  121. return
  122. }
  123. response.OkWithData(list, c)
  124. }
  125. func ListEnabledEntries(c *gin.Context) {
  126. list, err := paymentSvc.ListEnabledEntries()
  127. if err != nil {
  128. response.FailWithMessage(err.Error(), c)
  129. return
  130. }
  131. response.OkWithData(list, c)
  132. }
  133. func ListEntryOptions(c *gin.Context) {
  134. list, err := paymentSvc.ListEnabledEntries()
  135. if err != nil {
  136. response.FailWithMessage(err.Error(), c)
  137. return
  138. }
  139. options := make([]entryOption, 0, len(list))
  140. for _, entry := range list {
  141. options = append(options, entryOption{Code: entry.Code, Name: entry.Name})
  142. }
  143. response.OkWithData(options, c)
  144. }
  145. func CreateMethod(c *gin.Context) {
  146. var req dao.PaymentMethodConfig
  147. if err := c.ShouldBindJSON(&req); err != nil {
  148. response.FailWithMessage(err.Error(), c)
  149. return
  150. }
  151. if err := paymentSvc.CreateMethod(&req); err != nil {
  152. response.FailWithMessage(err.Error(), c)
  153. return
  154. }
  155. response.OkWithMessage("新增支付方式成功", c)
  156. }
  157. func UpdateMethod(c *gin.Context) {
  158. id, err := strconv.ParseUint(c.Param("id"), 10, 64)
  159. if err != nil || id == 0 {
  160. response.FailWithMessage("无效的支付方式ID", c)
  161. return
  162. }
  163. var req dao.PaymentMethodConfig
  164. if err := c.ShouldBindJSON(&req); err != nil {
  165. response.FailWithMessage(err.Error(), c)
  166. return
  167. }
  168. if err := paymentSvc.UpdateMethod(uint(id), &req); err != nil {
  169. response.FailWithMessage(err.Error(), c)
  170. return
  171. }
  172. response.OkWithMessage("更新支付方式成功", c)
  173. }
  174. func SetMethodStatus(c *gin.Context) {
  175. id, err := strconv.ParseUint(c.Param("id"), 10, 64)
  176. if err != nil || id == 0 {
  177. response.FailWithMessage("无效的支付方式ID", c)
  178. return
  179. }
  180. var req methodStatusRequest
  181. if err := c.ShouldBindJSON(&req); err != nil {
  182. response.FailWithMessage(err.Error(), c)
  183. return
  184. }
  185. if err := paymentSvc.SetMethodEnabled(uint(id), req.Enabled); err != nil {
  186. response.FailWithMessage(err.Error(), c)
  187. return
  188. }
  189. response.OkWithMessage("支付方式状态已更新", c)
  190. }
  191. func DeleteMethod(c *gin.Context) {
  192. id, err := strconv.ParseUint(c.Param("id"), 10, 64)
  193. if err != nil || id == 0 {
  194. response.FailWithMessage("无效的支付方式ID", c)
  195. return
  196. }
  197. if err := paymentSvc.DeleteMethod(uint(id)); err != nil {
  198. response.FailWithMessage(err.Error(), c)
  199. return
  200. }
  201. response.OkWithMessage("删除支付方式成功", c)
  202. }
  203. func CreateEntry(c *gin.Context) {
  204. var req dao.PaymentEntryConfig
  205. if err := c.ShouldBindJSON(&req); err != nil {
  206. response.FailWithMessage(err.Error(), c)
  207. return
  208. }
  209. if err := paymentSvc.CreateEntry(&req); err != nil {
  210. response.FailWithMessage(err.Error(), c)
  211. return
  212. }
  213. response.OkWithMessage("新增支付入口成功", c)
  214. }
  215. func UpdateEntry(c *gin.Context) {
  216. id, err := strconv.ParseUint(c.Param("id"), 10, 64)
  217. if err != nil || id == 0 {
  218. response.FailWithMessage("无效的支付入口ID", c)
  219. return
  220. }
  221. var req dao.PaymentEntryConfig
  222. if err := c.ShouldBindJSON(&req); err != nil {
  223. response.FailWithMessage(err.Error(), c)
  224. return
  225. }
  226. if err := paymentSvc.UpdateEntry(uint(id), &req); err != nil {
  227. response.FailWithMessage(err.Error(), c)
  228. return
  229. }
  230. response.OkWithMessage("更新支付入口成功", c)
  231. }
  232. func SetEntryStatus(c *gin.Context) {
  233. id, err := strconv.ParseUint(c.Param("id"), 10, 64)
  234. if err != nil || id == 0 {
  235. response.FailWithMessage("无效的支付入口ID", c)
  236. return
  237. }
  238. var req methodStatusRequest
  239. if err := c.ShouldBindJSON(&req); err != nil {
  240. response.FailWithMessage(err.Error(), c)
  241. return
  242. }
  243. if err := paymentSvc.SetEntryEnabled(uint(id), req.Enabled); err != nil {
  244. response.FailWithMessage(err.Error(), c)
  245. return
  246. }
  247. response.OkWithMessage("支付入口状态已更新", c)
  248. }
  249. func DeleteEntry(c *gin.Context) {
  250. id, err := strconv.ParseUint(c.Param("id"), 10, 64)
  251. if err != nil || id == 0 {
  252. response.FailWithMessage("无效的支付入口ID", c)
  253. return
  254. }
  255. if err := paymentSvc.DeleteEntry(uint(id)); err != nil {
  256. response.FailWithMessage(err.Error(), c)
  257. return
  258. }
  259. response.OkWithMessage("支付入口已删除", c)
  260. }
  261. // SetupPaymentRouter 注册支付相关路由
  262. func SetupPaymentRouter(router *gin.RouterGroup) {
  263. pg := router.Group("/payment")
  264. {
  265. pg.GET("/list", ListPayments)
  266. pg.GET("/today-summary", TodaySummary)
  267. pg.GET("/methods", ListMethods)
  268. pg.GET("/methods/enabled", ListEnabledMethods)
  269. pg.GET("/methods/options", ListMethodOptions)
  270. pg.POST("/methods", CreateMethod)
  271. pg.PUT("/methods/:id", UpdateMethod)
  272. pg.PATCH("/methods/:id/status", SetMethodStatus)
  273. pg.DELETE("/methods/:id", DeleteMethod)
  274. pg.GET("/entries", ListEntries)
  275. pg.GET("/entries/enabled", ListEnabledEntries)
  276. pg.GET("/entries/options", ListEntryOptions)
  277. pg.POST("/entries", CreateEntry)
  278. pg.PUT("/entries/:id", UpdateEntry)
  279. pg.PATCH("/entries/:id/status", SetEntryStatus)
  280. pg.DELETE("/entries/:id", DeleteEntry)
  281. }
  282. eg := router.Group("/vehicle")
  283. {
  284. eg.POST("/exit/preview", ExitPreview)
  285. eg.POST("/exit/confirm", ExitConfirm)
  286. }
  287. }