broadcast.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. package handler
  2. import (
  3. "city_chips/internal/model"
  4. "city_chips/internal/service"
  5. "city_chips/pkg/helper/resp"
  6. "encoding/json"
  7. "fmt"
  8. "github.com/gin-gonic/gin"
  9. "github.com/spf13/viper"
  10. "math/rand"
  11. "time"
  12. )
  13. type BroadcastHandler struct {
  14. *Handler
  15. broadcastService service.BroadcastService
  16. conf *viper.Viper
  17. }
  18. func NewBroadcastHandler(handler *Handler, broadcastService service.BroadcastService, conf *viper.Viper) *BroadcastHandler {
  19. return &BroadcastHandler{
  20. Handler: handler,
  21. broadcastService: broadcastService,
  22. conf: conf,
  23. }
  24. }
  25. // GetBroadcast 获取广播系统数据
  26. func (h *BroadcastHandler) GetBroadcast(ctx *gin.Context) {
  27. m := make(map[string]any)
  28. terminal := make(map[string]any)
  29. var device []model.DeviceList
  30. var termin []model.TerminalLog
  31. for i := 0; i < 20; i++ {
  32. list := model.DeviceList{
  33. Id: i + 1,
  34. DeviceName: model.GetRandomItem(model.GBDeviceName),
  35. UseState: rand.Intn(2),
  36. OnlineState: rand.Intn(2),
  37. }
  38. log := model.TerminalLog{
  39. TerminalLog: model.GetRandomItem(model.GBterminalLogs),
  40. TerminalTime: time.Now().Format("2006-01-02 15:04:05"),
  41. }
  42. device = append(device, list)
  43. termin = append(termin, log)
  44. }
  45. terminal["2025-5-1"] = rand.Intn(100)
  46. terminal["2025-5-2"] = rand.Intn(100)
  47. terminal["2025-5-3"] = rand.Intn(100)
  48. terminal["2025-5-4"] = rand.Intn(100)
  49. terminal["2025-5-5"] = rand.Intn(100)
  50. terminal["2025-5-6"] = rand.Intn(100)
  51. terminal["2025-5-7"] = rand.Intn(100)
  52. m["device"] = device //设备列表
  53. m["TerminalOffline"] = terminal //终端离线
  54. m["RunStateUse"] = rand.Intn(100) //运行统计-使用中
  55. m["FreeStateUse"] = rand.Intn(100) //运行统计-空闲
  56. m["offlineStateUse"] = rand.Intn(100) //运行统计-离线
  57. m["TerminalLog"] = termin //终端日志
  58. m["PlaybackControls"] = device //播放控制
  59. resp.HandleSuccess(ctx, m)
  60. }
  61. // Getbroadcast 获取广播系统数据
  62. func (h *BroadcastHandler) GetBroadcastState(ctx *gin.Context) {
  63. // 设置响应头
  64. ctx.Header("Content-Type", "text/event-stream")
  65. ctx.Header("Cache-Control", "no-cache")
  66. ctx.Header("Connection", "keep-alive")
  67. // 监听客户端断开连接
  68. conn := true
  69. notify := ctx.Writer.CloseNotify()
  70. type Response struct {
  71. RequestId string `protobuf:"bytes,1,opt,name=requestId,proto3" json:"requestId,omitempty"`
  72. Code int32 `protobuf:"varint,2,opt,name=code,proto3" json:"code,omitempty"`
  73. Msg string `protobuf:"bytes,3,opt,name=msg,proto3" json:"msg,omitempty"`
  74. Data any `json:"data"`
  75. }
  76. stationNo := ctx.Query("id")
  77. if len(stationNo) == 0 {
  78. resp.HandleError(ctx, 1201, "缺少必要参数", nil)
  79. return
  80. }
  81. var response Response
  82. for conn {
  83. select {
  84. case <-notify:
  85. conn = false
  86. fmt.Println("断开连接")
  87. return
  88. default:
  89. // 模拟数据
  90. data := make(map[string]any)
  91. response.Code = 200
  92. response.RequestId = stationNo
  93. response.Msg = "success"
  94. data["state"] = rand.Intn(2) // // 1开 0关 2故障
  95. data["广播名称"] = model.GetRandomItem(model.GBDeviceName)
  96. response.Data = data
  97. res, _ := json.Marshal(&response)
  98. fmt.Fprintf(ctx.Writer, "data: %s\n\n", string(res))
  99. ctx.Writer.Flush()
  100. time.Sleep(10 * time.Second)
  101. }
  102. }
  103. }