fwh_mqttLog.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. package fwh_test
  2. import (
  3. "errors"
  4. "fmt"
  5. "fwh-toolbox-server/domain"
  6. "net/url"
  7. "strconv"
  8. "strings"
  9. "time"
  10. )
  11. type QueryMqttLogParam struct {
  12. SN *string
  13. CmdTypes []domain.MqttCmdType
  14. StartTime *time.Time
  15. EndTime *time.Time
  16. }
  17. // 查询站点信息
  18. func queryMqttLog(param QueryMqttLogParam) (*domain.FwhPageResponse[[]domain.MqttLogItem], error) {
  19. // 构造 query 参数
  20. params := url.Values{}
  21. if param.SN != nil {
  22. params.Add("searchName", *param.SN)
  23. }
  24. if len(param.CmdTypes) > 0 {
  25. cmdTypesStr := make([]string, len(param.CmdTypes))
  26. for i, v := range param.CmdTypes {
  27. cmdTypesStr[i] = string(v) // 转成 string
  28. }
  29. params.Add("cmdTypes", strings.Join(cmdTypesStr, ","))
  30. }
  31. if param.StartTime != nil {
  32. params.Add("startTime", param.StartTime.Format(time.DateTime))
  33. }
  34. if param.EndTime != nil {
  35. params.Add("endTime", param.EndTime.Format(time.DateTime))
  36. }
  37. if param.StartTime != nil || param.EndTime != nil {
  38. params.Add("timeType", "1") // 0-通讯时间 1-设备时间时
  39. }
  40. params.Add("pageSize", strconv.FormatUint(REQ_PAGE_SIZE, 10))
  41. params.Add("pageNum", strconv.Itoa(1))
  42. params.Add("lang", "ZH_CN")
  43. response, err := FwhHttpGetUnmarshalPage[[]domain.MqttLogItem](getFullEnergyUrl("/hes-gateway/manage/iotMqttCommlogs"), params)
  44. if err != nil {
  45. return nil, err
  46. }
  47. return response, nil
  48. }
  49. func queryMqttLogListOnePage(sn string, cmdType domain.MqttCmdType, startTime, endTime time.Time) ([]domain.MqttLogItem, error) {
  50. param := QueryMqttLogParam{
  51. SN: &sn,
  52. CmdTypes: []domain.MqttCmdType{cmdType},
  53. StartTime: &startTime,
  54. EndTime: &endTime,
  55. }
  56. mqttLogRes, err := queryMqttLog(param)
  57. if err != nil {
  58. return nil, err
  59. }
  60. if mqttLogRes.Code != 200 {
  61. return nil, fmt.Errorf("[queryMqttLogListOnePage] 查询失败 code: %d, message: %s", mqttLogRes.Code, mqttLogRes.Message)
  62. }
  63. // 判断是否超出可处理数据上限 10万条数据
  64. if mqttLogRes.Total > 10*10000 {
  65. return nil, fmt.Errorf("超出数据请求上限 - Total: %d (>10万)", mqttLogRes.Total)
  66. }
  67. return *mqttLogRes.Result, nil
  68. }
  69. // 从FWH获取MQTT log数据
  70. func QueryMqttLogListOnTimeRange(sn string, cmdType domain.MqttCmdType, startTime, endTime time.Time) ([]domain.MqttLogItem, error) {
  71. // 保证 startTime <= endTime
  72. if startTime.After(endTime) {
  73. return nil, errors.New("startTime > endTime")
  74. }
  75. // 按天拆分时间段
  76. var periods []struct{ Start, End time.Time }
  77. currTime := startTime
  78. for currTime.Before(endTime) {
  79. // 当天结束时间
  80. dayEnd := time.Date(currTime.Year(), currTime.Month(), currTime.Day(), 23, 59, 59, 0, currTime.Location())
  81. // 如果当天结束大于 endTime,使用 endTime
  82. if dayEnd.After(endTime) {
  83. dayEnd = endTime
  84. }
  85. periods = append(periods, struct{ Start, End time.Time }{Start: currTime, End: dayEnd})
  86. // 下一天开始
  87. currTime = dayEnd.Add(time.Second).Truncate(24 * time.Hour)
  88. currTime = time.Date(currTime.Year(), currTime.Month(), currTime.Day(), 0, 0, 0, 0, currTime.Location())
  89. }
  90. // 按天查询
  91. var mqttLogList []domain.MqttLogItem
  92. for _, period := range periods {
  93. var mqttLogRes []domain.MqttLogItem = nil
  94. periodEndTime := period.End
  95. // 检查数据是否超过1000(单次查询上限)
  96. for {
  97. var err error
  98. mqttLogRes, err = queryMqttLogListOnePage(sn, cmdType, period.Start, periodEndTime)
  99. if err != nil {
  100. return nil, err
  101. }
  102. time.Sleep(time.Second) // 延时1s
  103. mqttLogList = append(mqttLogList, mqttLogRes...)
  104. // 判断是否未查完
  105. if len(mqttLogRes) < int(REQ_PAGE_SIZE) {
  106. // 请求完成,退出
  107. break
  108. }
  109. // 跳转时间段,再次请求
  110. // 提取最后一条数据的设备时间
  111. periodEndTime, err = time.Parse(time.DateTime, mqttLogRes[len(mqttLogRes)-1].LogTime)
  112. if err != nil {
  113. return nil, err
  114. }
  115. }
  116. }
  117. return mqttLogList, nil
  118. }