api.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. package incident
  2. import (
  3. "strconv"
  4. "github.com/gin-gonic/gin"
  5. "wails-app/internal/model/common/response"
  6. "wails-app/internal/modules/incident/repository"
  7. "wails-app/internal/modules/incident/service"
  8. utils "wails-app/internal/pkg"
  9. )
  10. var incidentSvc = service.NewIncidentService()
  11. // adminAuthorityId 管理员角色(888);处置权限见初始化种子中的 Casbin 规则。
  12. const adminAuthorityId = "888"
  13. // ListIncidents 分页筛选异常记录。
  14. func ListIncidents(c *gin.Context) {
  15. var q repository.IncidentListQuery
  16. if err := c.ShouldBindQuery(&q); err != nil {
  17. response.FailWithMessage(err.Error(), c)
  18. return
  19. }
  20. list, total, err := incidentSvc.ListIncidents(q)
  21. if err != nil {
  22. response.FailWithMessage(err.Error(), c)
  23. return
  24. }
  25. response.OkWithDetailed(response.PageResult{List: list, Total: total, Page: q.Page, PageSize: q.PageSize}, "查询成功", c)
  26. }
  27. // GetIncident 异常详情。
  28. func GetIncident(c *gin.Context) {
  29. id, err := strconv.ParseUint(c.Param("id"), 10, 64)
  30. if err != nil {
  31. response.FailWithMessage("异常记录 ID 无效", c)
  32. return
  33. }
  34. record, err := incidentSvc.GetIncident(uint(id))
  35. if err != nil {
  36. response.FailWithMessage(service.ErrIncidentNotFound.Error(), c)
  37. return
  38. }
  39. response.OkWithData(record, c)
  40. }
  41. // CreateIncident 人工上报异常。
  42. func CreateIncident(c *gin.Context) {
  43. var req service.CreateIncidentRequest
  44. if err := c.ShouldBindJSON(&req); err != nil {
  45. response.FailWithMessage(err.Error(), c)
  46. return
  47. }
  48. record, err := incidentSvc.CreateIncident(req, utils.GetUserID(c))
  49. if err != nil {
  50. response.FailWithMessage(err.Error(), c)
  51. return
  52. }
  53. response.OkWithData(record, c)
  54. }
  55. // TransitionIncident 状态流转+处置。强制免费等资金类处置仅管理员(888)可执行。
  56. func TransitionIncident(c *gin.Context) {
  57. id, err := strconv.ParseUint(c.Param("id"), 10, 64)
  58. if err != nil {
  59. response.FailWithMessage("异常记录 ID 无效", c)
  60. return
  61. }
  62. var req service.TransitionRequest
  63. if err := c.ShouldBindJSON(&req); err != nil {
  64. response.FailWithMessage(err.Error(), c)
  65. return
  66. }
  67. isAdmin := strconv.FormatUint(uint64(utils.GetUserAuthorityId(c)), 10) == adminAuthorityId
  68. record, err := incidentSvc.TransitionIncident(uint(id), req, utils.GetUserID(c), isAdmin)
  69. if err != nil {
  70. response.FailWithMessage(err.Error(), c)
  71. return
  72. }
  73. response.OkWithData(record, c)
  74. }
  75. // GetIncidentStats 异常统计(页面头部汇总)。
  76. func GetIncidentStats(c *gin.Context) {
  77. stats, err := incidentSvc.GetIncidentStats()
  78. if err != nil {
  79. response.FailWithMessage(err.Error(), c)
  80. return
  81. }
  82. response.OkWithData(stats, c)
  83. }
  84. // SetupIncidentRouter 注册异常处置路由(挂在 PrivateGroup,自动带 JWT+Casbin+操作日志)。
  85. func SetupIncidentRouter(router *gin.RouterGroup) {
  86. sr := router.Group("/incident")
  87. sr.GET("/list", ListIncidents)
  88. sr.GET("/stats", GetIncidentStats)
  89. sr.GET("/:id", GetIncident)
  90. sr.POST("", CreateIncident)
  91. sr.POST("/:id/transition", TransitionIncident)
  92. }