energy.go 17 KB

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