package handler import ( "city_chips/internal/service" "city_chips/pkg/helper/resp" "encoding/json" "fmt" "math/rand" "strconv" "time" "github.com/gin-gonic/gin" "github.com/spf13/viper" ) type EnergyHandler struct { *Handler energyService service.EnergyService conf *viper.Viper } func NewEnergyHandler( handler *Handler, energyService service.EnergyService, conf *viper.Viper, ) *EnergyHandler { return &EnergyHandler{ Handler: handler, energyService: energyService, conf: conf, } } // GetEnergy 获取能源系统数据 func (h *EnergyHandler) GetEnergy(ctx *gin.Context) { m := make(map[string]any) OnedayPowerConsumption := make(map[string]any) OnedayWaterConsumption := make(map[string]any) LastYearEnergyConsumption := make(map[string]any) YearEnergyConsumption := make(map[string]any) LastYearCarbonEmissions := make(map[string]any) YearCarbonEmissions := make(map[string]any) for i := 0; i < 24; i++ { name := fmt.Sprintf("%v时", i+1) OnedayPowerConsumption[name] = rand.Intn(100) OnedayWaterConsumption[name] = rand.Intn(100) } for i := 0; i < 12; i++ { name := fmt.Sprintf("%v月", i+1) LastYearEnergyConsumption[name] = rand.Intn(1000) YearEnergyConsumption[name] = rand.Intn(1000) LastYearCarbonEmissions[name] = rand.Intn(1000) YearCarbonEmissions[name] = rand.Intn(1000) } m["PowerConsumption"] = rand.Intn(1000) //今日实时电耗 m["WaterConsumption"] = rand.Intn(1000) //今日实时水耗 m["YesterdayConsumption"] = rand.Intn(1000) //昨日电耗 m["MonthElectricityConsumption"] = rand.Intn(1000) //本月电耗 m["YesterdayWaterConsumption"] = rand.Intn(1000) //昨日水耗 m["MonthWaterConsumption"] = rand.Intn(1000) //本月水耗 m["OnedayPowerConsumption"] = OnedayPowerConsumption //本月水耗 m["OnedayWaterConsumption"] = OnedayWaterConsumption //本月水耗 m["EnergyCount"] = rand.Intn(10000) //能源总量 m["EnergyIntensity"] = rand.Intn(1000) //能耗强度 m["CarbonEmissions"] = rand.Intn(1000) //碳排总量 m["CarbonIsntensity"] = rand.Intn(1000) //碳排强度 m["LastYearEnergyConsumption"] = LastYearEnergyConsumption //去年能耗 m["YearEnergyConsumption"] = YearEnergyConsumption //今年能耗 m["LastYearCarbonEmissions"] = LastYearCarbonEmissions //去年碳排 m["YearCarbonEmissions"] = YearCarbonEmissions //今年碳排 resp.HandleSuccess(ctx, m) } // 水表数据 func (h *EnergyHandler) GetWaterMmeter(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 = strconv.Itoa(rand.Intn(1000)) response.Msg = "success" data["今日用水"] = rand.Intn(1000) data["昨日用水"] = rand.Intn(1000) data["本月用水量"] = rand.Intn(1000) 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) } } } // 电表数据 func (h *EnergyHandler) GetAmmeter(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 = strconv.Itoa(rand.Intn(1000)) response.Msg = "success" data["今日用电量"] = rand.Intn(1000) data["昨日用电量"] = rand.Intn(1000) data["本月用水量"] = rand.Intn(1000) 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) } } } func (h *EnergyHandler) GetTemperature(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 = strconv.Itoa(rand.Intn(1000)) response.Msg = "success" data["温度"] = rand.Intn(100) data["湿度"] = rand.Intn(100) data["时间"] = time.Now().Format("2006-01-02 15:04:05") 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) } } }