faultRecordControllers.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. package controllers
  2. import (
  3. "errors"
  4. "net/url"
  5. "strconv"
  6. "fwh-toolbox-server/dto"
  7. "fwh-toolbox-server/middleware"
  8. mongoRepo "fwh-toolbox-server/repositories/mongo"
  9. "fwh-toolbox-server/services"
  10. "github.com/gofiber/fiber/v2"
  11. "go.uber.org/zap"
  12. )
  13. // faultRecordOperator 当前操作人:优先显示名,没有时用登录名
  14. func faultRecordOperator(c *fiber.Ctx) string {
  15. if name := middleware.AuthGetDisplayName(c); name != "" {
  16. return name
  17. }
  18. return middleware.AuthGetUserName(c)
  19. }
  20. func faultRecordErr(c *fiber.Ctx, err error) error {
  21. if errors.Is(err, services.ErrFaultRecordInvalid) || errors.Is(err, mongoRepo.ErrFaultRecordOpNotFound) {
  22. return Fail(c, err.Error())
  23. }
  24. return Error(c, err.Error())
  25. }
  26. // 查询网关下可操作的设备
  27. // GET /faultRecord/devices?env=&gatewaySn=
  28. func GetFaultRecordDevices(c *fiber.Ctx) error {
  29. data, err := services.GetFaultRecordSiteDevices(c.Query("env"), c.Query("gatewaySn"))
  30. if err != nil {
  31. return faultRecordErr(c, err)
  32. }
  33. return Success(c, data)
  34. }
  35. // 创建操作
  36. // POST /faultRecord/operations
  37. func CreateFaultRecordOperation(c *fiber.Ctx) error {
  38. var body dto.FaultRecordCreateOpReq
  39. if err := c.BodyParser(&body); err != nil {
  40. zap.L().Warn("Invalid request body", zap.String("err", err.Error()))
  41. return Fail(c, "Invalid request body")
  42. }
  43. id, err := services.CreateFaultRecordOperation(c.UserContext(), body, faultRecordOperator(c))
  44. if err != nil {
  45. return faultRecordErr(c, err)
  46. }
  47. return Success(c, fiber.Map{"id": id})
  48. }
  49. // 操作历史(所有人共享)
  50. // GET /faultRecord/operations?env=&gatewaySn=&kind=&pageNum=&pageSize=
  51. func ListFaultRecordOperations(c *fiber.Ctx) error {
  52. page, _ := strconv.ParseInt(c.Query("pageNum", "1"), 10, 64)
  53. size, _ := strconv.ParseInt(c.Query("pageSize", "20"), 10, 64)
  54. if page < 1 || size < 1 || size > 200 {
  55. return Fail(c, "invalid pagination")
  56. }
  57. data, err := services.ListFaultRecordOperations(c.UserContext(), mongoRepo.FaultRecordOpFilter{
  58. Env: c.Query("env"),
  59. GatewaySn: c.Query("gatewaySn"),
  60. Kind: c.Query("kind"),
  61. }, page, size)
  62. if err != nil {
  63. return faultRecordErr(c, err)
  64. }
  65. return Success(c, data)
  66. }
  67. // 操作详情(含原始报文和逐项结果)
  68. // GET /faultRecord/operations/:id
  69. func GetFaultRecordOperation(c *fiber.Ctx) error {
  70. data, err := services.GetFaultRecordOperation(c.UserContext(), c.Params("id"))
  71. if err != nil {
  72. return faultRecordErr(c, err)
  73. }
  74. return Success(c, data)
  75. }
  76. // 取消操作
  77. // POST /faultRecord/operations/:id/cancel
  78. func CancelFaultRecordOperation(c *fiber.Ctx) error {
  79. if err := services.CancelFaultRecordOperation(c.UserContext(), c.Params("id")); err != nil {
  80. return faultRecordErr(c, err)
  81. }
  82. return Success[any](c, nil)
  83. }
  84. // 手动重试下载(上传已完成但下载失败时)
  85. // POST /faultRecord/operations/:id/retry-download
  86. func RetryFaultRecordDownload(c *fiber.Ctx) error {
  87. if err := services.RetryFaultRecordDownload(c.UserContext(), c.Params("id"), faultRecordOperator(c)); err != nil {
  88. return faultRecordErr(c, err)
  89. }
  90. return Success[any](c, nil)
  91. }
  92. // 录波详情(解析后的基本信息、通道和波形)
  93. // GET /faultRecord/operations/:id/record
  94. func GetFaultRecordRecord(c *fiber.Ctx) error {
  95. data, err := services.GetFaultRecordRecord(c.UserContext(), c.Params("id"))
  96. if err != nil {
  97. return faultRecordErr(c, err)
  98. }
  99. return Success(c, data)
  100. }
  101. // 导出录波文件
  102. // GET /faultRecord/operations/:id/export?format=raw|csv
  103. func ExportFaultRecordFile(c *fiber.Ctx) error {
  104. name, data, err := services.ExportFaultRecordFile(c.UserContext(), c.Params("id"), c.Query("format"))
  105. if err != nil {
  106. return faultRecordErr(c, err)
  107. }
  108. c.Set("Content-Disposition", "attachment; filename=\""+name+"\"; filename*=UTF-8''"+url.PathEscape(name))
  109. c.Type("application/octet-stream")
  110. return c.Send(data)
  111. }