energy.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510
  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. "go.uber.org/zap"
  9. "math/rand"
  10. "strconv"
  11. "strings"
  12. "time"
  13. "github.com/gin-gonic/gin"
  14. "github.com/spf13/viper"
  15. )
  16. type EnergyHandler struct {
  17. *Handler
  18. energyService service.EnergyService
  19. conf *viper.Viper
  20. }
  21. func NewEnergyHandler(
  22. handler *Handler,
  23. energyService service.EnergyService,
  24. conf *viper.Viper,
  25. ) *EnergyHandler {
  26. return &EnergyHandler{
  27. Handler: handler,
  28. energyService: energyService,
  29. conf: conf,
  30. }
  31. }
  32. // GetEnergy 获取能源系统数据
  33. func (h *EnergyHandler) GetEnergy(ctx *gin.Context) {
  34. m := make(map[string]any)
  35. OnedayPowerConsumption := make(map[string]any)
  36. OnedayWaterConsumption := make(map[string]any)
  37. LastYearEnergyConsumption := make(map[string]any)
  38. YearEnergyConsumption := make(map[string]any)
  39. LastYearCarbonEmissions := make(map[string]any)
  40. YearCarbonEmissions := make(map[string]any)
  41. for i := 0; i < 24; i++ {
  42. name := fmt.Sprintf("%v时", i+1)
  43. OnedayPowerConsumption[name] = rand.Intn(100)
  44. OnedayWaterConsumption[name] = rand.Intn(100)
  45. }
  46. for i := 0; i < 12; i++ {
  47. name := fmt.Sprintf("%v月", i+1)
  48. LastYearEnergyConsumption[name] = rand.Intn(1000)
  49. YearEnergyConsumption[name] = rand.Intn(1000)
  50. LastYearCarbonEmissions[name] = rand.Intn(1000)
  51. YearCarbonEmissions[name] = rand.Intn(1000)
  52. }
  53. getStatistics, err := h.energyService.GetStatistics()
  54. if err != nil {
  55. resp.HandleError(ctx, 1201, "缺少必要参数", nil)
  56. return
  57. }
  58. tree, err := h.energyService.GetEnergyTree()
  59. if err != nil {
  60. resp.HandleError(ctx, 1201, "缺少必要参数", nil)
  61. return
  62. }
  63. now := time.Now()
  64. start_time := now.AddDate(0, 0, -7).Format("2006-01-02 00:00:00")
  65. end_time := now.Format("2006-01-02 00:00:00")
  66. var water, electricity model.T
  67. var waterResp, electricityResp []model.EnergyTrend
  68. var electricityNight, waterNight model.DayAndNightRespone
  69. waterCount := make(map[string]any)
  70. electricityCount := make(map[string]any)
  71. for _, child := range tree.Data[0].Children {
  72. if strings.Contains(child.Name, "电") {
  73. electricity, err = h.energyService.GetEnergyTrend(model.Request{
  74. TimeType: "day",
  75. Nodes: []int{child.Id},
  76. StartTime: start_time,
  77. EndTime: end_time,
  78. })
  79. if err != nil {
  80. resp.HandleError(ctx, 1201, "获取电耗能源趋势失败", nil)
  81. return
  82. }
  83. electricityNight, err = h.energyService.GetDayAndNight(model.DayAndNightRequst{
  84. TimeType: "day",
  85. Node: child.Id,
  86. StartTime: start_time,
  87. EndTime: end_time,
  88. DayTime: "09:00",
  89. NightTime: "18:00",
  90. })
  91. if err != nil {
  92. resp.HandleError(ctx, 1201, "获取电耗夜耗失败", nil)
  93. return
  94. }
  95. }
  96. if strings.Contains(child.Name, "水") {
  97. water, err = h.energyService.GetEnergyTrend(model.Request{
  98. TimeType: "day",
  99. Nodes: []int{child.Id},
  100. StartTime: start_time,
  101. EndTime: end_time,
  102. })
  103. if err != nil {
  104. resp.HandleError(ctx, 1201, "获取水耗能源趋势失败", nil)
  105. return
  106. }
  107. waterNight, err = h.energyService.GetDayAndNight(model.DayAndNightRequst{
  108. TimeType: "day",
  109. Node: child.Id,
  110. StartTime: start_time,
  111. EndTime: end_time,
  112. DayTime: "09:00",
  113. NightTime: "18:00",
  114. })
  115. if err != nil {
  116. resp.HandleError(ctx, 1201, "获取水耗夜耗失败", nil)
  117. return
  118. }
  119. }
  120. }
  121. err = json.Unmarshal([]byte(water.RespJson), &waterResp)
  122. err = json.Unmarshal([]byte(electricity.RespJson), &electricityResp)
  123. if err != nil {
  124. resp.HandleError(ctx, 1202, "json反序列化失败", nil)
  125. return
  126. }
  127. for _, trend := range waterResp[0].Json {
  128. waterCount[trend.Time] = trend.TotalUsage
  129. }
  130. for _, trend := range electricityResp[0].Json {
  131. electricityCount[trend.Time] = trend.TotalUsage
  132. }
  133. m["DeviceCount"] = getStatistics.DeviceCount //设备总数
  134. m["GatewayCount"] = getStatistics.GatewayCount //网关总数
  135. m["AlarmCount"] = getStatistics.AlarmCount //报警总数
  136. m["MonthElectricityConsumption"] = getStatistics.RoomCount // 房间总数
  137. //m["YesterdayWaterConsumption"] = rand.Intn(1000) //昨日水耗
  138. //m["MonthWaterConsumption"] = rand.Intn(1000) //本月水耗
  139. //m["OnedayPowerConsumption"] = OnedayPowerConsumption //本月水耗
  140. m["OnedayWaterConsumption"] = OnedayWaterConsumption //本月水耗
  141. //m["EnergyCount"] = rand.Intn(10000) //能源总量
  142. //m["EnergyIntensity"] = rand.Intn(1000) //能耗强度
  143. //m["CarbonEmissions"] = rand.Intn(1000) //碳排总量
  144. //m["CarbonIsntensity"] = rand.Intn(1000) //碳排强度
  145. //m["LastYearEnergyConsumption"] = LastYearEnergyConsumption //去年能耗
  146. //m["YearEnergyConsumption"] = YearEnergyConsumption //今年能耗
  147. m["electricityNight"] = electricityNight.Data //昼夜用电分析
  148. m["waterNight"] = waterNight.Data //昼夜用水分析
  149. m["electricityCount"] = electricityCount //用电统计
  150. m["waterCount"] = waterCount //用水统计
  151. resp.HandleSuccess(ctx, m)
  152. }
  153. // GetEnergyTrend 获取能耗趋势
  154. func (h *EnergyHandler) GetEnergyTrend(ctx *gin.Context) {
  155. var rest model.Request
  156. var tre []model.EnergyTrend
  157. var waterResp []model.EnergyTrend
  158. err := ctx.ShouldBindJSON(&rest)
  159. if err != nil {
  160. h.logger.Error("参数错误", zap.Any("err", err))
  161. resp.HandleError(ctx, 1201, "参数错误", nil)
  162. return
  163. }
  164. trend, err := h.energyService.GetEnergyTrend(rest)
  165. if err != nil {
  166. h.logger.Error("获取能耗趋势失败", zap.Any("err", err))
  167. resp.HandleError(ctx, 1201, "获取能耗趋势失败", nil)
  168. }
  169. err = json.Unmarshal([]byte(trend.RespJson), &tre)
  170. if err != nil {
  171. h.logger.Error("json反序列化失败", zap.Any("err", err))
  172. resp.HandleError(ctx, 1202, "json反序列化失败", nil)
  173. return
  174. }
  175. err = json.Unmarshal([]byte(trend.RespJson), &waterResp)
  176. if err != nil {
  177. h.logger.Error("json反序列化失败", zap.Any("err", err))
  178. resp.HandleError(ctx, 1202, "json反序列化失败", nil)
  179. return
  180. }
  181. resp.HandleSuccess(ctx, waterResp)
  182. }
  183. // GetBaseecic 获取能耗设备列表
  184. func (h *EnergyHandler) GetBaseecic(ctx *gin.Context) {
  185. currentPageStr := ctx.PostForm("currentPage")
  186. currentPage, err := strconv.Atoi(currentPageStr)
  187. device_type_idStr := ctx.PostForm("device_type_id")
  188. device_type_id, err := strconv.Atoi(device_type_idStr)
  189. devices_enabledStr := ctx.PostForm("devices_enabled")
  190. devices_enabled, err := strconv.Atoi(devices_enabledStr)
  191. pageSizeStr := ctx.PostForm("pageSize")
  192. gatewayStr := ctx.PostForm("gateway_id")
  193. gateway_id, err := strconv.Atoi(gatewayStr)
  194. pageSize, err := strconv.Atoi(pageSizeStr)
  195. if err != nil {
  196. resp.HandleError(ctx, 1203, "参数错误", err)
  197. return
  198. }
  199. query := ctx.PostForm("query")
  200. baseecic, err := h.energyService.GetBaseecic(currentPage, device_type_id, devices_enabled, gateway_id, pageSize, query, "")
  201. if err != nil {
  202. h.logger.Error("获取能耗设备列表失败", zap.Any("err", err))
  203. resp.HandleError(ctx, 1201, "获取能耗设备列表失败", nil)
  204. return
  205. }
  206. resp.HandleSuccess(ctx, baseecic)
  207. }
  208. // GetgatewayFind 获取网关信息
  209. func (h *EnergyHandler) GetgatewayFind(ctx *gin.Context) {
  210. gateway, err := h.energyService.GetgatewayFind()
  211. if err != nil {
  212. h.logger.Error("获取获取网关信息失败", zap.Any("err", err))
  213. resp.HandleError(ctx, 1201, "获取网关信息失败", nil)
  214. return
  215. }
  216. resp.HandleSuccess(ctx, gateway)
  217. h.logger.Info("获取网关信息成功", zap.Any("control", gateway))
  218. }
  219. // GetDayAndNight 获取日夜数据
  220. func (h *EnergyHandler) GetDayAndNight(ctx *gin.Context) {
  221. var rest model.DayAndNightRequst
  222. err := ctx.ShouldBindJSON(&rest)
  223. if err != nil {
  224. h.logger.Error("参数错误", zap.Any("err", err))
  225. resp.HandleError(ctx, 1201, "参数错误", nil)
  226. }
  227. night, err := h.energyService.GetDayAndNight(rest)
  228. if err != nil {
  229. h.logger.Error("获取获取网关信息失败", zap.Any("err", err))
  230. resp.HandleError(ctx, 1201, "获取网关信息失败", nil)
  231. return
  232. }
  233. resp.HandleSuccess(ctx, night)
  234. h.logger.Info("获取网关信息成功", zap.Any("night", night))
  235. }
  236. // GetEnergystatus 获取设备状态详情
  237. func (h *EnergyHandler) GetEnergystatus(ctx *gin.Context) {
  238. // 设置响应头
  239. ctx.Header("Content-Type", "text/event-stream")
  240. ctx.Header("Cache-Control", "no-cache")
  241. ctx.Header("Connection", "keep-alive")
  242. // 监听客户端断开连接
  243. conn := true
  244. notify := ctx.Writer.CloseNotify()
  245. var response model.Response
  246. m := make(map[string]any)
  247. // 使用 map[string]interface{} 来接收未知结构的 JSON 对象
  248. var data model.DevicesJsonObject
  249. devices_udid := ctx.Query("devices_udid")
  250. for conn {
  251. select {
  252. case <-notify:
  253. conn = false
  254. fmt.Println("断开连接")
  255. return
  256. default:
  257. baseecic, err := h.energyService.GetBaseecic(1, 0, -1, 0, 1, "", devices_udid)
  258. if err != nil {
  259. h.logger.Error("获取设备信息详情失败")
  260. response.Code = 1203
  261. response.Msg = "获取设备信息详情失败"
  262. response.Data = nil
  263. res, _ := json.Marshal(&response)
  264. fmt.Fprintf(ctx.Writer, "data: %s\n\n", string(res))
  265. ctx.Writer.Flush()
  266. conn = false
  267. return
  268. }
  269. m["设备名称"] = baseecic.Devices[0].DevicesName
  270. m["state"] = baseecic.Devices[0].OnLine
  271. err = json.Unmarshal([]byte(baseecic.Devices[0].DevicesJsonObject), &data)
  272. if err != nil {
  273. h.logger.Error("json反序列化失败")
  274. response.Code = 1202
  275. response.Msg = "json反序列化失败"
  276. response.Data = nil
  277. res, _ := json.Marshal(&response)
  278. fmt.Fprintf(ctx.Writer, "data: %s\n\n", string(res))
  279. conn = false
  280. }
  281. m["总水量"] = data.EPE
  282. response.Code = 200
  283. response.Msg = "获取设备信息成功"
  284. response.Data = m
  285. res, _ := json.Marshal(&response)
  286. fmt.Fprintf(ctx.Writer, "data: %s\n\n", string(res))
  287. ctx.Writer.Flush()
  288. time.Sleep(10 * time.Second)
  289. }
  290. }
  291. }
  292. // CategoryStatistics 获取设备类型统计
  293. func (h *EnergyHandler) CategoryStatistics(ctx *gin.Context) {
  294. statistics, err := h.energyService.GetDeviceStatistics()
  295. if err != nil {
  296. h.logger.Error("获取设备类型统计失败", zap.Any("err", err))
  297. resp.HandleError(ctx, 1201, "获取设备类型统计失败", nil)
  298. return
  299. }
  300. resp.HandleSuccess(ctx, statistics)
  301. }
  302. // 水表数据
  303. func (h *EnergyHandler) GetWaterMmeter(ctx *gin.Context) {
  304. // 设置响应头
  305. ctx.Header("Content-Type", "text/event-stream")
  306. ctx.Header("Cache-Control", "no-cache")
  307. ctx.Header("Connection", "keep-alive")
  308. // 监听客户端断开连接
  309. conn := true
  310. notify := ctx.Writer.CloseNotify()
  311. var response model.Response
  312. m := make(map[string]any)
  313. // 使用 map[string]interface{} 来接收未知结构的 JSON 对象
  314. var data model.TotalWater
  315. devices_udid := ctx.Query("id")
  316. for conn {
  317. select {
  318. case <-notify:
  319. conn = false
  320. fmt.Println("断开连接")
  321. return
  322. default:
  323. baseecic, err := h.energyService.GetBaseecic(1, 0, -1, 0, 1, "", devices_udid)
  324. if err != nil {
  325. h.logger.Error("获取设备信息详情失败")
  326. response.Code = 1203
  327. response.Msg = "获取设备信息详情失败"
  328. response.Data = nil
  329. res, _ := json.Marshal(&response)
  330. fmt.Fprintf(ctx.Writer, "data: %s\n\n", string(res))
  331. ctx.Writer.Flush()
  332. conn = false
  333. return
  334. }
  335. m["设备名称"] = baseecic.Devices[0].DevicesName
  336. m["state"] = baseecic.Devices[0].OnLine
  337. err = json.Unmarshal([]byte(baseecic.Devices[0].DevicesJsonObject), &data)
  338. if err != nil {
  339. h.logger.Error("json反序列化失败")
  340. response.Code = 1202
  341. response.Msg = "json反序列化失败"
  342. response.Data = nil
  343. res, _ := json.Marshal(&response)
  344. fmt.Fprintf(ctx.Writer, "data: %s\n\n", string(res))
  345. conn = false
  346. }
  347. m["总水量"] = data.TotalWater
  348. response.Code = 200
  349. response.Msg = "获取设备信息成功"
  350. response.Data = m
  351. res, _ := json.Marshal(&response)
  352. fmt.Fprintf(ctx.Writer, "data: %s\n\n", string(res))
  353. ctx.Writer.Flush()
  354. time.Sleep(10 * time.Second)
  355. }
  356. }
  357. }
  358. // 电表数据
  359. func (h *EnergyHandler) GetAmmeter(ctx *gin.Context) {
  360. // 设置响应头
  361. ctx.Header("Content-Type", "text/event-stream")
  362. ctx.Header("Cache-Control", "no-cache")
  363. ctx.Header("Connection", "keep-alive")
  364. // 监听客户端断开连接
  365. conn := true
  366. notify := ctx.Writer.CloseNotify()
  367. var response model.Response
  368. m := make(map[string]any)
  369. // 使用 map[string]interface{} 来接收未知结构的 JSON 对象
  370. var data model.DevicesJsonObject
  371. devices_udid := ctx.Query("id")
  372. for conn {
  373. select {
  374. case <-notify:
  375. conn = false
  376. fmt.Println("断开连接")
  377. return
  378. default:
  379. baseecic, err := h.energyService.GetBaseecic(1, 0, -1, 0, 1, "", devices_udid)
  380. if err != nil {
  381. h.logger.Error("获取设备信息详情失败")
  382. response.Code = 1203
  383. response.Msg = "获取设备信息详情失败"
  384. response.Data = nil
  385. res, _ := json.Marshal(&response)
  386. fmt.Fprintf(ctx.Writer, "data: %s\n\n", string(res))
  387. ctx.Writer.Flush()
  388. conn = false
  389. return
  390. }
  391. m["设备名称"] = baseecic.Devices[0].DevicesName
  392. m["state"] = baseecic.Devices[0].OnLine
  393. err = json.Unmarshal([]byte(baseecic.Devices[0].DevicesJsonObject), &data)
  394. if err != nil {
  395. h.logger.Error("json反序列化失败")
  396. response.Code = 1202
  397. response.Msg = "json反序列化失败"
  398. response.Data = nil
  399. res, _ := json.Marshal(&response)
  400. fmt.Fprintf(ctx.Writer, "data: %s\n\n", string(res))
  401. conn = false
  402. }
  403. m["总有攻电能(kW·h)"] = data.EPE
  404. response.Code = 200
  405. response.Msg = "获取设备信息成功"
  406. response.Data = m
  407. res, _ := json.Marshal(&response)
  408. fmt.Fprintf(ctx.Writer, "data: %s\n\n", string(res))
  409. ctx.Writer.Flush()
  410. time.Sleep(10 * time.Second)
  411. }
  412. }
  413. }
  414. // GetHisData 获取历史数据
  415. func (h *EnergyHandler) GetHisData(ctx *gin.Context) {
  416. dev_udid := ctx.Query("dev_udid")
  417. start_time := ctx.Query("start_time")
  418. end_time := ctx.Query("end_time")
  419. data_size := ctx.Query("data_size")
  420. data_type := ctx.Query("data_type")
  421. cuerrentPage := ctx.Query("cuerrentPage")
  422. pageSize := ctx.Query("pageSize")
  423. is_page := ctx.Query("is_page")
  424. if len(data_size) == 0 {
  425. data_size = "1"
  426. }
  427. if len(data_type) == 0 {
  428. data_type = "1"
  429. }
  430. if len(is_page) == 0 {
  431. is_page = "1"
  432. }
  433. start, err := time.Parse("2006-01-02 15:04:05", start_time)
  434. end, err := time.Parse("2006-01-02 15:04:05", end_time)
  435. if err != nil {
  436. resp.HandleError(ctx, 1201, "时间格式错误", nil)
  437. return
  438. }
  439. start_time = start.Format("2006-01-02 15:04:05")
  440. end_time = end.Format("2006-01-02 15:04:05")
  441. data, err := h.energyService.GetHisData(dev_udid, start_time, end_time, data_size, data_type, cuerrentPage, pageSize, is_page)
  442. if err != nil {
  443. resp.HandleError(ctx, 1201, err.Error(), nil)
  444. return
  445. }
  446. resp.HandleSuccess(ctx, data)
  447. }
  448. func (h *EnergyHandler) GetTemperature(ctx *gin.Context) {
  449. // 设置响应头
  450. ctx.Header("Content-Type", "text/event-stream")
  451. ctx.Header("Cache-Control", "no-cache")
  452. ctx.Header("Connection", "keep-alive")
  453. // 监听客户端断开连接
  454. conn := true
  455. notify := ctx.Writer.CloseNotify()
  456. type Response struct {
  457. RequestId string `protobuf:"bytes,1,opt,name=requestId,proto3" json:"requestId,omitempty"`
  458. Code int32 `protobuf:"varint,2,opt,name=code,proto3" json:"code,omitempty"`
  459. Msg string `protobuf:"bytes,3,opt,name=msg,proto3" json:"msg,omitempty"`
  460. Data any `json:"data"`
  461. }
  462. stationNo := ctx.Query("id")
  463. if len(stationNo) == 0 {
  464. resp.HandleError(ctx, 1201, "缺少必要参数", nil)
  465. return
  466. }
  467. var response Response
  468. for conn {
  469. select {
  470. case <-notify:
  471. conn = false
  472. fmt.Println("断开连接")
  473. return
  474. default:
  475. // 模拟数据
  476. data := make(map[string]any)
  477. response.Code = 200
  478. response.RequestId = strconv.Itoa(rand.Intn(1000))
  479. response.Msg = "success"
  480. data["温度"] = rand.Intn(100)
  481. data["湿度"] = rand.Intn(100)
  482. data["时间"] = time.Now().Format("2006-01-02 15:04:05")
  483. response.Data = data
  484. res, _ := json.Marshal(&response)
  485. fmt.Fprintf(ctx.Writer, "data: %s\n\n", string(res))
  486. ctx.Writer.Flush()
  487. time.Sleep(10 * time.Second)
  488. }
  489. }
  490. }