package handler import ( "city_chips/internal/model" "city_chips/internal/service" "city_chips/pkg/helper/resp" "encoding/json" "fmt" "github.com/gin-gonic/gin" "github.com/spf13/viper" "math/rand" "time" ) type BroadcastHandler struct { *Handler broadcastService service.BroadcastService conf *viper.Viper } func NewBroadcastHandler(handler *Handler, broadcastService service.BroadcastService, conf *viper.Viper) *BroadcastHandler { return &BroadcastHandler{ Handler: handler, broadcastService: broadcastService, conf: conf, } } // GetBroadcast 获取广播系统数据 func (h *BroadcastHandler) GetBroadcast(ctx *gin.Context) { m := make(map[string]any) terminal := make(map[string]any) var device []model.DeviceList var termin []model.TerminalLog for i := 0; i < 20; i++ { list := model.DeviceList{ Id: i + 1, DeviceName: model.GetRandomItem(model.GBDeviceName), UseState: rand.Intn(2), OnlineState: rand.Intn(2), } log := model.TerminalLog{ TerminalLog: model.GetRandomItem(model.GBterminalLogs), TerminalTime: time.Now().Format("2006-01-02 15:04:05"), } device = append(device, list) termin = append(termin, log) } terminal["2025-5-1"] = rand.Intn(100) terminal["2025-5-2"] = rand.Intn(100) terminal["2025-5-3"] = rand.Intn(100) terminal["2025-5-4"] = rand.Intn(100) terminal["2025-5-5"] = rand.Intn(100) terminal["2025-5-6"] = rand.Intn(100) terminal["2025-5-7"] = rand.Intn(100) m["device"] = device //设备列表 m["TerminalOffline"] = terminal //终端离线 m["RunStateUse"] = rand.Intn(100) //运行统计-使用中 m["FreeStateUse"] = rand.Intn(100) //运行统计-空闲 m["offlineStateUse"] = rand.Intn(100) //运行统计-离线 m["TerminalLog"] = termin //终端日志 m["PlaybackControls"] = device //播放控制 resp.HandleSuccess(ctx, m) } // Getbroadcast 获取广播系统数据 func (h *BroadcastHandler) GetBroadcastState(ctx *gin.Context) { // 设置响应头 ctx.Header("Content-Type", "text/event-stream") ctx.Header("Cache-Control", "no-cache") ctx.Header("Connection", "keep-alive") // 监听客户端断开连接 conn := true notify := ctx.Writer.CloseNotify() type Response struct { RequestId string `protobuf:"bytes,1,opt,name=requestId,proto3" json:"requestId,omitempty"` Code int32 `protobuf:"varint,2,opt,name=code,proto3" json:"code,omitempty"` Msg string `protobuf:"bytes,3,opt,name=msg,proto3" json:"msg,omitempty"` Data any `json:"data"` } stationNo := ctx.Query("id") if len(stationNo) == 0 { resp.HandleError(ctx, 1201, "缺少必要参数", nil) return } var response Response for conn { select { case <-notify: conn = false fmt.Println("断开连接") return default: // 模拟数据 data := make(map[string]any) response.Code = 200 response.RequestId = stationNo response.Msg = "success" data["state"] = rand.Intn(2) // // 1开 0关 2故障 data["广播名称"] = model.GetRandomItem(model.GBDeviceName) response.Data = data res, _ := json.Marshal(&response) fmt.Fprintf(ctx.Writer, "data: %s\n\n", string(res)) ctx.Writer.Flush() time.Sleep(10 * time.Second) } } }