energy.go 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. package handler
  2. import (
  3. "city_chips/internal/service"
  4. "city_chips/pkg/helper/resp"
  5. "encoding/json"
  6. "fmt"
  7. "math/rand"
  8. "strconv"
  9. "time"
  10. "github.com/gin-gonic/gin"
  11. "github.com/spf13/viper"
  12. )
  13. type EnergyHandler struct {
  14. *Handler
  15. energyService service.EnergyService
  16. conf *viper.Viper
  17. }
  18. func NewEnergyHandler(
  19. handler *Handler,
  20. energyService service.EnergyService,
  21. conf *viper.Viper,
  22. ) *EnergyHandler {
  23. return &EnergyHandler{
  24. Handler: handler,
  25. energyService: energyService,
  26. conf: conf,
  27. }
  28. }
  29. // GetEnergy 获取能源系统数据
  30. func (h *EnergyHandler) GetEnergy(ctx *gin.Context) {
  31. m := make(map[string]any)
  32. OnedayPowerConsumption := make(map[string]any)
  33. OnedayWaterConsumption := make(map[string]any)
  34. LastYearEnergyConsumption := make(map[string]any)
  35. YearEnergyConsumption := make(map[string]any)
  36. LastYearCarbonEmissions := make(map[string]any)
  37. YearCarbonEmissions := make(map[string]any)
  38. for i := 0; i < 24; i++ {
  39. name := fmt.Sprintf("%v时", i+1)
  40. OnedayPowerConsumption[name] = rand.Intn(100)
  41. OnedayWaterConsumption[name] = rand.Intn(100)
  42. }
  43. for i := 0; i < 12; i++ {
  44. name := fmt.Sprintf("%v月", i+1)
  45. LastYearEnergyConsumption[name] = rand.Intn(1000)
  46. YearEnergyConsumption[name] = rand.Intn(1000)
  47. LastYearCarbonEmissions[name] = rand.Intn(1000)
  48. YearCarbonEmissions[name] = rand.Intn(1000)
  49. }
  50. m["PowerConsumption"] = rand.Intn(1000) //今日实时电耗
  51. m["WaterConsumption"] = rand.Intn(1000) //今日实时水耗
  52. m["YesterdayConsumption"] = rand.Intn(1000) //昨日电耗
  53. m["MonthElectricityConsumption"] = rand.Intn(1000) //本月电耗
  54. m["YesterdayWaterConsumption"] = rand.Intn(1000) //昨日水耗
  55. m["MonthWaterConsumption"] = rand.Intn(1000) //本月水耗
  56. m["OnedayPowerConsumption"] = OnedayPowerConsumption //本月水耗
  57. m["OnedayWaterConsumption"] = OnedayWaterConsumption //本月水耗
  58. m["EnergyCount"] = rand.Intn(10000) //能源总量
  59. m["EnergyIntensity"] = rand.Intn(1000) //能耗强度
  60. m["CarbonEmissions"] = rand.Intn(1000) //碳排总量
  61. m["CarbonIsntensity"] = rand.Intn(1000) //碳排强度
  62. m["LastYearEnergyConsumption"] = LastYearEnergyConsumption //去年能耗
  63. m["YearEnergyConsumption"] = YearEnergyConsumption //今年能耗
  64. m["LastYearCarbonEmissions"] = LastYearCarbonEmissions //去年碳排
  65. m["YearCarbonEmissions"] = YearCarbonEmissions //今年碳排
  66. resp.HandleSuccess(ctx, m)
  67. }
  68. // 水表数据
  69. func (h *EnergyHandler) GetWaterMmeter(ctx *gin.Context) {
  70. // 设置响应头
  71. ctx.Header("Content-Type", "text/event-stream")
  72. ctx.Header("Cache-Control", "no-cache")
  73. ctx.Header("Connection", "keep-alive")
  74. // 监听客户端断开连接
  75. conn := true
  76. notify := ctx.Writer.CloseNotify()
  77. type Response struct {
  78. RequestId string `protobuf:"bytes,1,opt,name=requestId,proto3" json:"requestId,omitempty"`
  79. Code int32 `protobuf:"varint,2,opt,name=code,proto3" json:"code,omitempty"`
  80. Msg string `protobuf:"bytes,3,opt,name=msg,proto3" json:"msg,omitempty"`
  81. Data any `json:"data"`
  82. }
  83. stationNo := ctx.Query("id")
  84. if len(stationNo) == 0 {
  85. resp.HandleError(ctx, 1201, "缺少必要参数", nil)
  86. return
  87. }
  88. var response Response
  89. for conn {
  90. select {
  91. case <-notify:
  92. conn = false
  93. fmt.Println("断开连接")
  94. return
  95. default:
  96. // 模拟数据
  97. data := make(map[string]any)
  98. response.Code = 200
  99. response.RequestId = strconv.Itoa(rand.Intn(1000))
  100. response.Msg = "success"
  101. data["今日用水"] = rand.Intn(1000)
  102. data["昨日用水"] = rand.Intn(1000)
  103. data["本月用水量"] = rand.Intn(1000)
  104. response.Data = data
  105. res, _ := json.Marshal(&response)
  106. fmt.Fprintf(ctx.Writer, "data: %s\n\n", string(res))
  107. ctx.Writer.Flush()
  108. time.Sleep(10 * time.Second)
  109. }
  110. }
  111. }
  112. // 电表数据
  113. func (h *EnergyHandler) GetAmmeter(ctx *gin.Context) {
  114. // 设置响应头
  115. ctx.Header("Content-Type", "text/event-stream")
  116. ctx.Header("Cache-Control", "no-cache")
  117. ctx.Header("Connection", "keep-alive")
  118. // 监听客户端断开连接
  119. conn := true
  120. notify := ctx.Writer.CloseNotify()
  121. type Response struct {
  122. RequestId string `protobuf:"bytes,1,opt,name=requestId,proto3" json:"requestId,omitempty"`
  123. Code int32 `protobuf:"varint,2,opt,name=code,proto3" json:"code,omitempty"`
  124. Msg string `protobuf:"bytes,3,opt,name=msg,proto3" json:"msg,omitempty"`
  125. Data any `json:"data"`
  126. }
  127. stationNo := ctx.Query("id")
  128. if len(stationNo) == 0 {
  129. resp.HandleError(ctx, 1201, "缺少必要参数", nil)
  130. return
  131. }
  132. var response Response
  133. for conn {
  134. select {
  135. case <-notify:
  136. conn = false
  137. fmt.Println("断开连接")
  138. return
  139. default:
  140. // 模拟数据
  141. data := make(map[string]any)
  142. response.Code = 200
  143. response.RequestId = strconv.Itoa(rand.Intn(1000))
  144. response.Msg = "success"
  145. data["今日用电量"] = rand.Intn(1000)
  146. data["昨日用电量"] = rand.Intn(1000)
  147. data["本月用水量"] = rand.Intn(1000)
  148. response.Data = data
  149. res, _ := json.Marshal(&response)
  150. fmt.Fprintf(ctx.Writer, "data: %s\n\n", string(res))
  151. ctx.Writer.Flush()
  152. time.Sleep(10 * time.Second)
  153. }
  154. }
  155. }
  156. func (h *EnergyHandler) GetTemperature(ctx *gin.Context) {
  157. // 设置响应头
  158. ctx.Header("Content-Type", "text/event-stream")
  159. ctx.Header("Cache-Control", "no-cache")
  160. ctx.Header("Connection", "keep-alive")
  161. // 监听客户端断开连接
  162. conn := true
  163. notify := ctx.Writer.CloseNotify()
  164. type Response struct {
  165. RequestId string `protobuf:"bytes,1,opt,name=requestId,proto3" json:"requestId,omitempty"`
  166. Code int32 `protobuf:"varint,2,opt,name=code,proto3" json:"code,omitempty"`
  167. Msg string `protobuf:"bytes,3,opt,name=msg,proto3" json:"msg,omitempty"`
  168. Data any `json:"data"`
  169. }
  170. stationNo := ctx.Query("id")
  171. if len(stationNo) == 0 {
  172. resp.HandleError(ctx, 1201, "缺少必要参数", nil)
  173. return
  174. }
  175. var response Response
  176. for conn {
  177. select {
  178. case <-notify:
  179. conn = false
  180. fmt.Println("断开连接")
  181. return
  182. default:
  183. // 模拟数据
  184. data := make(map[string]any)
  185. response.Code = 200
  186. response.RequestId = strconv.Itoa(rand.Intn(1000))
  187. response.Msg = "success"
  188. data["温度"] = rand.Intn(100)
  189. data["湿度"] = rand.Intn(100)
  190. data["时间"] = time.Now().Format("2006-01-02 15:04:05")
  191. response.Data = data
  192. res, _ := json.Marshal(&response)
  193. fmt.Fprintf(ctx.Writer, "data: %s\n\n", string(res))
  194. ctx.Writer.Flush()
  195. time.Sleep(10 * time.Second)
  196. }
  197. }
  198. }