mqttDataManageServices.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. /*
  2. * MQTT 报文管理 Service(数据来自 iotcore-stat Elasticsearch)
  3. * 站点即 equipNo。看板统计 + 逐条查询。
  4. */
  5. package services
  6. import (
  7. "fmt"
  8. "fwh-toolbox-server/domain"
  9. "fwh-toolbox-server/repositories"
  10. "time"
  11. "go.uber.org/zap"
  12. )
  13. /*************** 看板:报文总量 ***************/
  14. // GetMqttDailyTotal 日报文总量
  15. func GetMqttDailyTotal(date string) (*domain.MessageTotal, error) {
  16. res, err := repositories.EsGetDailyMessageTotal(date)
  17. if err != nil {
  18. zap.L().Error("EsGetDailyMessageTotal failed.", zap.String("err", err.Error()), zap.String("date", date))
  19. return nil, err
  20. }
  21. return res, nil
  22. }
  23. // GetMqttMonthlyTotal 月报文总量(仅统计总数,代价可控;不涉及慢的站点月聚合)
  24. func GetMqttMonthlyTotal(year, month int) (*domain.MessageTotal, error) {
  25. res, err := repositories.EsGetMonthlyMessageTotal(year, month)
  26. if err != nil {
  27. zap.L().Error("EsGetMonthlyMessageTotal failed.", zap.String("err", err.Error()), zap.Int("year", year), zap.Int("month", month))
  28. return nil, err
  29. }
  30. return res, nil
  31. }
  32. // GetMqttMonthlyDailyTrend 全站本月每日报文总量(看板柱状图)。
  33. // 结果按整月 1~月末补齐:缺失的天补 0,保证横轴完整。
  34. func GetMqttMonthlyDailyTrend(year, month int) ([]domain.DailyTotal, error) {
  35. list, err := repositories.EsGetMonthlyDailyTrend(year, month)
  36. if err != nil {
  37. zap.L().Error("EsGetMonthlyDailyTrend failed.", zap.String("err", err.Error()), zap.Int("year", year), zap.Int("month", month))
  38. return nil, err
  39. }
  40. // 已有数据按日期建索引
  41. totalByDate := make(map[string]int64, len(list))
  42. for _, d := range list {
  43. totalByDate[d.Date] = d.Total
  44. }
  45. // 生成整月 1~月末的完整日期序列(缺失补 0)
  46. // 用下月第 0 天得到当月天数
  47. daysInMonth := time.Date(year, time.Month(month)+1, 0, 0, 0, 0, 0, time.UTC).Day()
  48. out := make([]domain.DailyTotal, 0, daysInMonth)
  49. for day := 1; day <= daysInMonth; day++ {
  50. date := fmt.Sprintf("%04d-%02d-%02d", year, month, day)
  51. out = append(out, domain.DailyTotal{Date: date, Total: totalByDate[date]})
  52. }
  53. return out, nil
  54. }
  55. /*************** 看板:站点日总量(分页降序) ***************/
  56. // GetMqttSiteDailyTotals 站点日总量(分页)
  57. func GetMqttSiteDailyTotals(date string, page, pageSize int) (*domain.SiteTotalPage, error) {
  58. res, err := repositories.EsGetSiteDailyTotals(date, page, pageSize)
  59. if err != nil {
  60. zap.L().Error("EsGetSiteDailyTotals failed.", zap.String("err", err.Error()), zap.String("date", date))
  61. return nil, err
  62. }
  63. return res, nil
  64. }
  65. /*************** 下钻:站点当日命令类型总量 ***************/
  66. // GetMqttSiteCmdTypeTotals 某站点某天各命令类型总量(分页)
  67. func GetMqttSiteCmdTypeTotals(equipNo, date string, page, pageSize int) (*domain.CmdTypeTotalPage, error) {
  68. res, err := repositories.EsGetSiteCmdTypeTotals(equipNo, date, page, pageSize)
  69. if err != nil {
  70. zap.L().Error("EsGetSiteCmdTypeTotals failed.", zap.String("err", err.Error()), zap.String("equipNo", equipNo), zap.String("date", date))
  71. return nil, err
  72. }
  73. return res, nil
  74. }
  75. /*************** 查询:逐条原始报文 ***************/
  76. // QueryMqttMessages 按过滤条件查询逐条报文
  77. func QueryMqttMessages(equipNo *string, cmdType *int64, startTime, endTime *time.Time, page, pageSize int) (*domain.MessagePage, error) {
  78. param := repositories.EsQueryMessageParam{
  79. EquipNo: equipNo,
  80. CmdType: cmdType,
  81. StartTime: startTime,
  82. EndTime: endTime,
  83. Page: page,
  84. PageSize: pageSize,
  85. }
  86. res, err := repositories.EsQueryMessages(param)
  87. if err != nil {
  88. zap.L().Error("EsQueryMessages failed.", zap.String("err", err.Error()))
  89. return nil, err
  90. }
  91. return res, nil
  92. }