huangyan 4 روز پیش
والد
کامیت
0bfad2a52c

+ 3 - 0
cmd/server/wire/wire.go

@@ -32,6 +32,7 @@ var RepositorySet = wire.NewSet(
 	repository.NewIlluminatingRepository,
 	repository.NewEnergyRepository,
 	repository.NewIntelligentBuildingControlRepository,
+	repository.NewTemperatureRepository,
 )
 
 var ServiceSet = wire.NewSet(
@@ -48,6 +49,7 @@ var ServiceSet = wire.NewSet(
 	service.NewIlluminatingService,
 	service.NewEnergyService,
 	service.NewIntelligentBuildingControlService,
+	service.NewTemperatureService,
 	provideHTTPClient,
 )
 
@@ -65,6 +67,7 @@ var HandlerSet = wire.NewSet(
 	handler.NewIlluminatingHandler,
 	handler.NewEnergyHandler,
 	handler.NewIntelligentBuildingControlHandler,
+	handler.NewTemperatureHandler,
 )
 
 func provideHTTPClient() *http.Client {

+ 7 - 4
cmd/server/wire/wire_gen.go

@@ -59,7 +59,10 @@ func NewWire(viperViper *viper.Viper, logger *log.Logger) (*gin.Engine, func(),
 	intelligentBuildingControlRepository := repository.NewIntelligentBuildingControlRepository(repositoryRepository)
 	intelligentBuildingControlService := service.NewIntelligentBuildingControlService(serviceService, intelligentBuildingControlRepository)
 	intelligentBuildingControlHandler := handler.NewIntelligentBuildingControlHandler(handlerHandler, intelligentBuildingControlService, viperViper)
-	engine := server.NewServerHTTP(logger, accessControlHandler, hikvisionHandler, conferenceHandler, homeHandler, elevatorHandler, broadcastHandler, propertyHandler, informationHandler, illuminatingHandler, energyHandler, intelligentBuildingControlHandler)
+	temperatureRepository := repository.NewTemperatureRepository(repositoryRepository)
+	temperatureService := service.NewTemperatureService(serviceService, temperatureRepository, viperViper, client)
+	temperatureHandler := handler.NewTemperatureHandler(handlerHandler, temperatureService, viperViper)
+	engine := server.NewServerHTTP(logger, accessControlHandler, hikvisionHandler, conferenceHandler, homeHandler, elevatorHandler, broadcastHandler, propertyHandler, informationHandler, illuminatingHandler, energyHandler, intelligentBuildingControlHandler, temperatureHandler)
 	return engine, func() {
 	}, nil
 }
@@ -68,11 +71,11 @@ func NewWire(viperViper *viper.Viper, logger *log.Logger) (*gin.Engine, func(),
 
 var ServerSet = wire.NewSet(server.NewServerHTTP)
 
-var RepositorySet = wire.NewSet(repository.NewDb, repository.NewRepository, repository.NewUserRepository, repository.NewAccessControlRepository, repository.NewHikvisionRepository, repository.NewConferenceRepository, repository.NewHomeRepository, repository.NewElevatorRepository, repository.NewBroadcastRepository, repository.NewPropertyRepository, repository.NewInformationRepository, repository.NewIlluminatingRepository, repository.NewEnergyRepository, repository.NewIntelligentBuildingControlRepository)
+var RepositorySet = wire.NewSet(repository.NewDb, repository.NewRepository, repository.NewUserRepository, repository.NewAccessControlRepository, repository.NewHikvisionRepository, repository.NewConferenceRepository, repository.NewHomeRepository, repository.NewElevatorRepository, repository.NewBroadcastRepository, repository.NewPropertyRepository, repository.NewInformationRepository, repository.NewIlluminatingRepository, repository.NewEnergyRepository, repository.NewIntelligentBuildingControlRepository, repository.NewTemperatureRepository)
 
-var ServiceSet = wire.NewSet(service.NewService, service.NewUserService, service.NewAccessControlService, service.NewHikvisionService, service.NewConferenceService, service.NewHomeService, service.NewElevatorService, service.NewBroadcastService, service.NewPropertyService, service.NewInformationService, service.NewIlluminatingService, service.NewEnergyService, service.NewIntelligentBuildingControlService, provideHTTPClient)
+var ServiceSet = wire.NewSet(service.NewService, service.NewUserService, service.NewAccessControlService, service.NewHikvisionService, service.NewConferenceService, service.NewHomeService, service.NewElevatorService, service.NewBroadcastService, service.NewPropertyService, service.NewInformationService, service.NewIlluminatingService, service.NewEnergyService, service.NewIntelligentBuildingControlService, service.NewTemperatureService, provideHTTPClient)
 
-var HandlerSet = wire.NewSet(handler.NewHandler, handler.NewUserHandler, handler.NewAccessControlHandler, handler.NewHikvisionHandler, handler.NewConferenceHandler, handler.NewHomeHandler, handler.NewElevatorHandler, handler.NewBroadcastHandler, handler.NewPropertyHandler, handler.NewInformationHandler, handler.NewIlluminatingHandler, handler.NewEnergyHandler, handler.NewIntelligentBuildingControlHandler)
+var HandlerSet = wire.NewSet(handler.NewHandler, handler.NewUserHandler, handler.NewAccessControlHandler, handler.NewHikvisionHandler, handler.NewConferenceHandler, handler.NewHomeHandler, handler.NewElevatorHandler, handler.NewBroadcastHandler, handler.NewPropertyHandler, handler.NewInformationHandler, handler.NewIlluminatingHandler, handler.NewEnergyHandler, handler.NewIntelligentBuildingControlHandler, handler.NewTemperatureHandler)
 
 func provideHTTPClient() *http.Client {
 	return http.DefaultClient

+ 19 - 4
config/local.yml

@@ -97,6 +97,7 @@ obix:
   baseUrl: "https://10.1.201.253/obix/config"
   username: "obix"
   password: "Obix123456"
+#照明 系统
 illuminating:
   authorization: "Basic ZWNpYzo1MzZmN2VkNGE1MTNiODMzMTI3N2IwMzVkZDE2ODExZg=="
   clientId: 3
@@ -120,7 +121,7 @@ illuminating:
     timingSave: "/device/v1/cust/scene/timing/save" #保存定时任务
     changeState: "/device/v2/cust/scene/timing/change/state" #修改定时任务状态
     timingId: "/device/v1/cust/scene/timing/id" #定时任务详情
-
+# energy 能耗系统
 energy:
   authorization: "Basic ZWNpYzo1MzZmN2VkNGE1MTNiODMzMTI3N2IwMzVkZDE2ODExZg=="
   clientId: 3
@@ -139,6 +140,20 @@ energy:
     energyTree: "/energy/v2/erg/packing/energyTree" #能源树
     dayAndNight: "/energy/v2/erg/trend/dayAndNight" # 日夜能耗分析
     hisData: "/baseecic/v1/device/his/data" #历史数据
-
-
-
+#温控系统
+temperature:
+  authorization: "Basic ZWNpYzo1MzZmN2VkNGE1MTNiODMzMTI3N2IwMzVkZDE2ODExZg=="
+  clientId: 3
+  mobile: "admin"
+  password: "123456"
+  baseUrl: "http://182.43.247.65:8093"
+  api:
+    login: "/user/v1/user/user/login"
+    statistics: "/baseecic/v1/baseecic/all/statistics" #统计
+    baseecic: "/baseecic/v2/device/all"#所有设备
+    alarm: "/maintain/v2/maintain/alarm/message/find" #报警
+    deviceStatistics: "/device/v2/base/device/category/statistics" #设备类型统计
+    alarmStatistics: "/maintain/v3/maintain/alarm/message/statistics" #报警统计
+    gatewayStatistics: "/baseecic/v2/baseecic/gateway/statistics" #网关设备在线离线统计
+    gatewayFind: "/baseecic/v2/base/gateway/find/gateway" #网关
+    devicesControl: "/device/v1/base/devices/control/one" #设备控制

+ 45 - 22
internal/handler/energy.go

@@ -6,6 +6,7 @@ import (
 	"city_chips/pkg/helper/resp"
 	"encoding/json"
 	"fmt"
+	"github.com/tidwall/gjson"
 	"go.uber.org/zap"
 	"math/rand"
 	"strconv"
@@ -18,8 +19,9 @@ import (
 
 type EnergyHandler struct {
 	*Handler
-	energyService service.EnergyService
-	conf          *viper.Viper
+	energyService      service.EnergyService
+	conf               *viper.Viper
+	temperatureService service.TemperatureService
 }
 
 func NewEnergyHandler(
@@ -473,18 +475,9 @@ func (h *EnergyHandler) GetTemperature(ctx *gin.Context) {
 	// 监听客户端断开连接
 	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
+	var response model.Response
+	m := make(map[string]any)
+	devices_udid := ctx.Query("id")
 	for conn {
 		select {
 		case <-notify:
@@ -492,15 +485,25 @@ func (h *EnergyHandler) GetTemperature(ctx *gin.Context) {
 			fmt.Println("断开连接")
 			return
 		default:
-			// 模拟数据
-			data := make(map[string]any)
+			baseecic, err := h.temperatureService.GetBaseecic(1, 0, -1, 0, 1, "", devices_udid)
+			if err != nil {
+				h.logger.Error("获取设备信息详情失败")
+				response.Code = 1203
+				response.Msg = "获取设备信息详情失败"
+				response.Data = nil
+				res, _ := json.Marshal(&response)
+				fmt.Fprintf(ctx.Writer, "data: %s\n\n", string(res))
+				ctx.Writer.Flush()
+				conn = false
+				return
+			}
+			m["设备名称"] = baseecic.Devices[0].DevicesName
+			m["温度设定上限"] = gjson.Get(baseecic.Devices[0].DevicesJsonObject, "temp_max").Num
+			m["温度设定下限"] = gjson.Get(baseecic.Devices[0].DevicesJsonObject, "temp_min").Num
+			m["当前温度"] = gjson.Get(baseecic.Devices[0].DevicesJsonObject, "dis_temp").Num
 			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
+			response.Msg = "获取设备信息成功"
+			response.Data = m
 			res, _ := json.Marshal(&response)
 			fmt.Fprintf(ctx.Writer, "data: %s\n\n", string(res))
 			ctx.Writer.Flush()
@@ -508,3 +511,23 @@ func (h *EnergyHandler) GetTemperature(ctx *gin.Context) {
 		}
 	}
 }
+
+// DevicesControl 空调控制
+func (h *EnergyHandler) DevicesControl(ctx *gin.Context) {
+	agreement_json := ctx.PostForm("agreement_json")
+	request_id := ctx.PostForm("request_id")
+	udid := ctx.PostForm("udid")
+	source, err := strconv.Atoi(ctx.PostForm("source"))
+	if err != nil {
+		resp.HandleError(ctx, 1203, "参数错误", err)
+		return
+	}
+	control, err := h.temperatureService.DevicesControl(agreement_json, request_id, udid, source)
+	if err != nil {
+		h.logger.Error("空调控制失败", zap.Any("err", err))
+		resp.HandleError(ctx, 1201, "空调控制失败", nil)
+		return
+	}
+	resp.HandleSuccess(ctx, control)
+	h.logger.Info("空调控制成功", zap.Any("control", control))
+}

+ 193 - 0
internal/handler/temperature.go

@@ -0,0 +1,193 @@
+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"
+	"github.com/tidwall/gjson"
+	"go.uber.org/zap"
+	"strconv"
+	"time"
+)
+
+type TemperatureHandler struct {
+	*Handler
+	temperatureService service.TemperatureService
+	conf               *viper.Viper
+}
+
+func NewTemperatureHandler(
+	handler *Handler,
+	temperatureService service.TemperatureService,
+	conf *viper.Viper,
+) *TemperatureHandler {
+	return &TemperatureHandler{
+		Handler:            handler,
+		temperatureService: temperatureService,
+		conf:               conf,
+	}
+}
+
+func (h *TemperatureHandler) GetTemperature(ctx *gin.Context) {
+	m := make(map[string]any)
+	var alarmstatistics model.AlarmStatistics
+	var alarmCount model.AlarmCount
+	var statis model.IlluminatingStatistics
+
+	now := time.Now()
+	sevenDaysAgo := now.AddDate(0, 0, -30).Format("2006-01-02")
+	format := now.Format("2006-01-02")
+	alarmStatistics, err := h.temperatureService.GetAlarmStatistics(sevenDaysAgo, format)
+	if err != nil {
+		h.logger.Error("获取告警信息统计失败", zap.Any("err", err))
+		resp.HandleError(ctx, 1204, "获取告警信息统计失败", nil)
+		return
+	}
+	err = json.Unmarshal(alarmStatistics, &alarmstatistics)
+	if err != nil {
+		h.logger.Error("json反序列化失败")
+		resp.HandleError(ctx, 1205, "json序列化失败", nil)
+		return
+	}
+	alarm, err := h.temperatureService.GetAlarm(1, 100)
+	if err != nil {
+		h.logger.Error("获取告警信息失败", zap.Any("err", err))
+		resp.HandleError(ctx, 1203, "获取告警信息失败", nil)
+		return
+	}
+	err = json.Unmarshal(alarm, &alarmCount)
+	if err != nil {
+		h.logger.Error("json反序列化失败")
+		resp.HandleError(ctx, 1205, "json序列化失败", nil)
+		return
+	}
+	statistics, err := h.temperatureService.GetStatistics()
+	if err != nil {
+		h.logger.Error("获取统计信息失败", zap.Any("err", err))
+		resp.HandleError(ctx, 1201, "获取统计信息失败", nil)
+		return
+	}
+	err = json.Unmarshal(statistics, &statis)
+	if err != nil {
+		h.logger.Error("json反序列化失败")
+		resp.HandleError(ctx, 1202, "json反序列化失败", nil)
+		return
+	}
+	for i, _ := range alarmstatistics.TimeStatistics {
+		s := alarmstatistics.TimeStatistics[i].TimeDay.Format("2006-01-02 15:04:05")
+		alarmstatistics.TimeStatistics[i].Time = s
+	}
+	baseecic, err := h.temperatureService.GetBaseecic(1, 0, -1, 0, statis.DeviceCount, "", "")
+	if err != nil {
+		h.logger.Error("获取 basement_ecic 列表失败", zap.Any("err", err))
+		resp.HandleError(ctx, 1202, "获取 basement_ecic 列表失败", nil)
+		return
+	}
+	deviceStatistics, err := h.temperatureService.GetGatewayStatistics()
+	if err != nil {
+		h.logger.Error("获取设备统计失败", zap.Any("err", err))
+		resp.HandleError(ctx, 1202, "获取设备统计失败", nil)
+		return
+	}
+
+	m["temperatureDevice"] = baseecic.Devices             //设备列表
+	m["DeviceCount"] = statis.DeviceCount                 //设备总数
+	m["GatewayCount"] = statis.GatewayCount               //网关数量
+	m["GatewayOnline"] = deviceStatistics.GatewayOnline   //网关在线数量
+	m["GatewayOffline"] = deviceStatistics.GatewayOffline //网关离线数量
+	m["DeviceOnLine"] = deviceStatistics.DeviceOnline     //设备在线数量
+	m["DeviceOffLine"] = deviceStatistics.DeviceOffline   //设备离线数量
+	m["AlarmCount"] = statis.AlarmCount                   //报警数量
+	m["RunAnalyse"] = alarmstatistics.TimeStatistics      //报警统计分析
+	m["EventList"] = alarmCount                           //报警事件
+	resp.HandleSuccess(ctx, m)
+}
+
+// GetBaseecic 获取设备列表
+func (h *TemperatureHandler) GetBaseecic(ctx *gin.Context) {
+	currentPageStr := ctx.PostForm("currentPage")
+	currentPage, err := strconv.Atoi(currentPageStr)
+	device_type_idStr := ctx.PostForm("device_type_id")
+	device_type_id, err := strconv.Atoi(device_type_idStr)
+	devices_enabledStr := ctx.PostForm("devices_enabled")
+	devices_enabled, err := strconv.Atoi(devices_enabledStr)
+	pageSizeStr := ctx.PostForm("pageSize")
+	gatewayStr := ctx.PostForm("gateway_id")
+	gateway_id, err := strconv.Atoi(gatewayStr)
+	pageSize, err := strconv.Atoi(pageSizeStr)
+	if err != nil {
+		resp.HandleError(ctx, 1203, "参数错误", err)
+		return
+	}
+	query := ctx.PostForm("query")
+	baseecic, err := h.temperatureService.GetBaseecic(currentPage, device_type_id, devices_enabled, gateway_id, pageSize, query, "")
+	if err != nil {
+		h.logger.Error("获取统计信息失败", zap.Any("err", err))
+		resp.HandleError(ctx, 1201, "获取统计信息失败", nil)
+		return
+	}
+
+	resp.HandleSuccess(ctx, baseecic)
+}
+
+// GetgatewayFind 获取网关信息
+func (h *TemperatureHandler) GetgatewayFind(ctx *gin.Context) {
+	gateway, err := h.temperatureService.GetgatewayFind()
+	if err != nil {
+		h.logger.Error("获取统计信息失败", zap.Any("err", err))
+		resp.HandleError(ctx, 1201, "获取统计信息失败", nil)
+		return
+	}
+	resp.HandleSuccess(ctx, gateway)
+	h.logger.Info("获取统计信息成功", zap.Any("control", gateway))
+}
+
+// GetTemperatureInfo  获取温度详情
+func (h *TemperatureHandler) GetTemperatureInfo(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()
+	var response model.Response
+	m := make(map[string]any)
+	devices_udid := ctx.Query("id")
+	for conn {
+		select {
+		case <-notify:
+			conn = false
+			fmt.Println("断开连接")
+			return
+		default:
+			baseecic, err := h.temperatureService.GetBaseecic(1, 0, -1, 0, 1, "", devices_udid)
+			if err != nil {
+				h.logger.Error("获取设备信息详情失败")
+				response.Code = 1203
+				response.Msg = "获取设备信息详情失败"
+				response.Data = nil
+				res, _ := json.Marshal(&response)
+				fmt.Fprintf(ctx.Writer, "data: %s\n\n", string(res))
+				ctx.Writer.Flush()
+				conn = false
+				return
+			}
+			m["设备名称"] = baseecic.Devices[0].DevicesName
+			m["温度设定上限"] = gjson.Get(baseecic.Devices[0].DevicesJsonObject, "temp_max").Num
+			m["温度设定下限"] = gjson.Get(baseecic.Devices[0].DevicesJsonObject, "temp_min").Num
+			m["当前温度"] = gjson.Get(baseecic.Devices[0].DevicesJsonObject, "dis_temp").Num
+			response.Code = 200
+			response.Msg = "获取设备信息成功"
+			response.Data = m
+			res, _ := json.Marshal(&response)
+			fmt.Fprintf(ctx.Writer, "data: %s\n\n", string(res))
+			ctx.Writer.Flush()
+			time.Sleep(10 * time.Second)
+		}
+	}
+}

+ 2 - 0
internal/model/illuminating.go

@@ -68,6 +68,8 @@ type IlluminatingStatistics struct {
 	DdcCount        int `json:"ddc_count"`
 	ThermostatCount int `json:"thermostat_count"`
 }
+
+// 设备列表接口,该结构体属于多个系统结构体(照明,能耗,温控)
 type IlluminatingBaseecic struct {
 	Devices []struct {
 		DevicesId                 int           `json:"devices_id"`

+ 69 - 0
internal/model/temperature.go

@@ -0,0 +1,69 @@
+package model
+
+import "gorm.io/gorm"
+
+type Temperature struct {
+	gorm.Model
+}
+
+// GatewayStatistics 网关,设备在线离线统计
+type GatewayStatistics struct {
+	GatewayOnline  int `json:"gateway_online"`
+	GatewayOffline int `json:"gateway_offline"`
+	DeviceOnline   int `json:"device_online"`
+	DeviceOffline  int `json:"device_offline"`
+}
+
+// TemperatureJsonObject 温控json结构体
+type TemperatureJsonObject struct {
+	BacklashSetting    int     `json:"backlash_setting"`
+	Control24          int     `json:"control_2_4"`
+	DaDb               int     `json:"da_db"`
+	DevUdid            string  `json:"dev_udid"`
+	DisDevName         string  `json:"dis_dev_name"`
+	DisTemp            float64 `json:"dis_temp"`
+	FanSetting         int     `json:"fan_setting"`
+	FanStatus          int     `json:"fan_status"`
+	FrozenEnable       int     `json:"frozen_enable"`
+	FrozenTemp         int     `json:"frozen_temp"`
+	KeyLock            int     `json:"key_lock"`
+	OutTemp            int     `json:"out_temp"`
+	OutTempCalibration int     `json:"out_temp_calibration"`
+	RunMode            int     `json:"run_mode"`
+	SensorSelection    int     `json:"sensor_selection"`
+	SwitchStatus       int     `json:"switch_status"`
+	TempMax            int     `json:"temp_max"`
+	TempMin            int     `json:"temp_min"`
+	TempSetting        int     `json:"temp_setting"`
+	ValveStatus        int     `json:"valve_status"`
+}
+type TemperatureJsonObjectLoRa struct {
+	LoRaChannel      int    `json:"LoRaChannel"`
+	Address          int    `json:"address"`
+	BacklashSetting  int    `json:"backlash_setting"`
+	Control24        int    `json:"control_2_4"`
+	DaDb             int    `json:"da_db"`
+	DevUdid          string `json:"dev_udid"`
+	DisDevName       string `json:"dis_dev_name"`
+	DisTemp          int    `json:"dis_temp"`
+	FanSetting       int    `json:"fan_setting"`
+	FanStatus        int    `json:"fan_status"`
+	FirmwareVer      string `json:"firmware_ver"`
+	FrozenEnable     int    `json:"frozen_enable"`
+	FrozenTemp       int    `json:"frozen_temp"`
+	InterSensorError int    `json:"inter_sensor_error"`
+	KeyLock          int    `json:"key_lock"`
+	OutTemp          int    `json:"out_temp"`
+	OuterSensorError int    `json:"outer_sensor_error"`
+	RunMode          int    `json:"run_mode"`
+	SensorSelection  int    `json:"sensor_selection"`
+	SwitchStatus     int    `json:"switch_status"`
+	TempMax          int    `json:"temp_max"`
+	TempMin          int    `json:"temp_min"`
+	TempSetting      int    `json:"temp_setting"`
+	ValveStatus      int    `json:"valve_status"`
+}
+
+func (m *Temperature) TableName() string {
+	return "temperature"
+}

+ 28 - 0
internal/repository/temperature.go

@@ -0,0 +1,28 @@
+package repository
+
+import (
+	"city_chips/internal/model"
+	
+)
+
+type TemperatureRepository interface {
+	GetTemperature(ctx context.Context, id int64) (*model.Temperature, error)
+}
+
+func NewTemperatureRepository(
+	repository *Repository,
+) TemperatureRepository {
+	return &temperatureRepository{
+		Repository: repository,
+	}
+}
+
+type temperatureRepository struct {
+	*Repository
+}
+
+func (r *temperatureRepository) GetTemperature(ctx context.Context, id int64) (*model.Temperature, error) {
+	var temperature model.Temperature
+
+	return &temperature, nil
+}

+ 9 - 0
internal/server/http.go

@@ -21,6 +21,7 @@ func NewServerHTTP(
 	illuminating *handler.IlluminatingHandler,
 	energy *handler.EnergyHandler,
 	intell *handler.IntelligentBuildingControlHandler,
+	tempers *handler.TemperatureHandler,
 ) *gin.Engine {
 	gin.SetMode(gin.ReleaseMode)
 	r := gin.Default()
@@ -141,5 +142,13 @@ func NewServerHTTP(
 		inte.GET("/pointType", intell.GetPointType)
 		inte.GET("/deviceType", intell.GetDeviceType)
 	}
+	//温控
+	temper := r.Group("/temperature")
+	{
+		temper.GET("/count", tempers.GetTemperature)
+		temper.POST("/getBaseecic", tempers.GetBaseecic)
+		temper.GET("/gatewayFind", tempers.GetgatewayFind)
+		temper.GET("/getTemperatureInfo", tempers.GetTemperatureInfo)
+	}
 	return r
 }

+ 271 - 0
internal/service/temperature.go

@@ -0,0 +1,271 @@
+package service
+
+import (
+	"bytes"
+	"city_chips/internal/model"
+	"city_chips/internal/repository"
+	"encoding/json"
+	"errors"
+	"github.com/spf13/viper"
+	"io"
+	"net/http"
+)
+
+type TemperatureService interface {
+	temperature(method, url string, body any) ([]byte, error)
+	GetStatistics() ([]byte, error)
+	GetBaseecic(currentPage, device_type_id, devices_enabled, gateway_id, pageSize int, query, devices_udid string) (model.IlluminatingBaseecic, error)
+	GetAlarm(currentPage, pageSize int) ([]byte, error)
+	GetAlarmStatistics(start_time, end_time string) ([]byte, error)
+	GetgatewayFind() (model.GatewayFind, error)
+	GetDeviceStatistics() (model.CategoryStatistics, error)
+	GetGatewayStatistics() (model.GatewayStatistics, error)
+	DevicesControl(agreement_json, request_id, udid string, source int) (model.DevicesControl, error)
+}
+
+func NewTemperatureService(service *Service, temperatureRepository repository.TemperatureRepository, conf *viper.Viper, client *http.Client) TemperatureService {
+	return &temperatureService{
+		Service:               service,
+		temperatureRepository: temperatureRepository,
+		conf:                  conf,
+		client:                client,
+	}
+}
+
+type temperatureService struct {
+	*Service
+	temperatureRepository repository.TemperatureRepository
+	conf                  *viper.Viper
+	client                *http.Client
+}
+
+func (s *temperatureService) temperature(method, url string, body any) ([]byte, error) {
+	login, err := s.login()
+	if err != nil {
+		return nil, err
+	}
+
+	var reqBody io.Reader
+	var finalURL = url
+
+	// 如果是 GET 请求,把 body 当作 query 参数处理
+	if method == http.MethodGet || method == "" {
+		vals, err := buildQueryParams(body)
+		if err != nil {
+			return nil, err
+		}
+		finalURL = addQueryParams(url, vals)
+	} else {
+		// 非 GET 请求才构造 body
+		reqBody, err = buildRequestBody(body)
+		if err != nil {
+			return nil, err
+		}
+	}
+
+	request, err := http.NewRequest(method, finalURL, reqBody)
+	if err != nil {
+		return nil, err
+	}
+	request.Header.Set("Authorization", login.AccessToken)
+
+	response, err := s.client.Do(request)
+	if err != nil {
+		return nil, err
+	}
+	defer response.Body.Close()
+
+	respBody, err := io.ReadAll(response.Body)
+	if err != nil {
+		return nil, err
+	}
+	return respBody, nil
+}
+
+// login 封装登录逻辑
+func (s *temperatureService) login() (*model.Login, error) {
+	auth := s.conf.GetString("temperature.authorization")
+	clientId := s.conf.GetInt("temperature.clientId")
+	mobile := s.conf.GetString("temperature.mobile")
+	password := s.conf.GetString("temperature.password")
+
+	loginReq := model.LoginRequst{
+		Authorization: auth,
+		ClientId:      clientId,
+		Mobile:        mobile,
+		Password:      password,
+	}
+
+	bodyBytes, err := json.Marshal(loginReq)
+	if err != nil {
+		return nil, err
+	}
+
+	url := s.conf.GetString("temperature.baseUrl") + s.conf.GetString("temperature.api.login")
+	request, err := http.NewRequest("POST", url, bytes.NewBuffer(bodyBytes))
+	if err != nil {
+		return nil, err
+	}
+
+	response, err := s.client.Do(request)
+	if err != nil {
+		return nil, err
+	}
+	defer response.Body.Close()
+
+	respBody, err := io.ReadAll(response.Body)
+	if err != nil {
+		return nil, err
+	}
+
+	var login model.Login
+	if err := json.Unmarshal(respBody, &login); err != nil {
+		return nil, err
+	}
+
+	return &login, nil
+}
+
+// GetStatistics 获取统计信息
+func (s *temperatureService) GetStatistics() ([]byte, error) {
+	urls := s.conf.GetString("temperature.baseUrl") + s.conf.GetString("temperature.api.statistics")
+	temperature, err := s.temperature("GET", urls, nil)
+	if err != nil {
+		return nil, errors.New("获取统计信息失败")
+	}
+	return temperature, nil
+}
+
+// GetDeviceStatistics 获取设备统计信息
+func (s *temperatureService) GetDeviceStatistics() (model.CategoryStatistics, error) {
+	var respone model.CategoryStatistics
+	urls := s.conf.GetString("temperature.baseUrl") + s.conf.GetString("temperature.api.deviceStatistics")
+	temperature, err := s.temperature("GET", urls, nil)
+	if err != nil {
+		return model.CategoryStatistics{}, errors.New("获取设备统计信息失败")
+	}
+	err = json.Unmarshal(temperature, &respone)
+	if err != nil {
+		return model.CategoryStatistics{}, errors.New("json反序列化失败")
+	}
+	return respone, nil
+}
+
+// GetGatewayStatistics 网关设备在线离线统计
+func (s *temperatureService) GetGatewayStatistics() (model.GatewayStatistics, error) {
+	var respone model.GatewayStatistics
+	urls := s.conf.GetString("temperature.baseUrl") + s.conf.GetString("temperature.api.gatewayStatistics")
+	temperature, err := s.temperature("GET", urls, nil)
+	if err != nil {
+		return model.GatewayStatistics{}, errors.New("获取设备统计信息失败")
+	}
+	err = json.Unmarshal(temperature, &respone)
+	if err != nil {
+		return model.GatewayStatistics{}, errors.New("json反序列化失败")
+	}
+	return respone, nil
+}
+
+// GetAlarm 获取报警信息
+func (s *temperatureService) GetAlarm(currentPage, pageSize int) ([]byte, error) {
+	urls := s.conf.GetString("temperature.baseUrl") + s.conf.GetString("temperature.api.alarm")
+	m := make(map[string]any)
+	m["currentPage"] = currentPage
+	m["pageSize"] = pageSize
+	temperature, err := s.temperature("POST", urls, m)
+	if err != nil {
+		return nil, errors.New("获取统计信息失败")
+	}
+	return temperature, nil
+}
+
+// GetAlarmStatistics 获取报警统计信息
+func (s *temperatureService) GetAlarmStatistics(start_time, end_time string) ([]byte, error) {
+	urls := s.conf.GetString("temperature.baseUrl") + s.conf.GetString("temperature.api.alarmStatistics")
+	urls += "?start_time=" + start_time + "&end_time=" + end_time
+	temperature, err := s.temperature("GET", urls, nil)
+	if err != nil {
+		return nil, errors.New("获取统计信息失败")
+	}
+	return temperature, nil
+}
+
+// GetBaseecic 获取温控面板列表
+func (s *temperatureService) GetBaseecic(currentPage, device_type_id, devices_enabled, gateway_id, pageSize int, query, devices_udid string) (model.IlluminatingBaseecic, error) {
+	var baseecic model.IlluminatingBaseecic
+	urls := s.conf.GetString("temperature.baseUrl") + s.conf.GetString("temperature.api.baseecic")
+	m := make(map[string]any)
+	m["currentPage"] = currentPage
+	m["pageSize"] = pageSize
+
+	if currentPage == 0 {
+		m["currentPage"] = 1
+	}
+	if pageSize == 0 {
+		m["pageSize"] = 20
+	}
+	if device_type_id != 0 {
+		m["device_type_id"] = device_type_id
+	}
+	if devices_enabled != 0 {
+		m["devices_enabled"] = devices_enabled
+	}
+	if gateway_id != 0 {
+		m["gateway_id"] = gateway_id
+	}
+	if devices_udid != "" {
+		m["devices_udid"] = devices_udid
+	}
+	if query != "" {
+		m["query"] = query
+	}
+	temperature, err := s.temperature("POST", urls, m)
+	if err != nil {
+		return model.IlluminatingBaseecic{}, errors.New("获取统计信息失败")
+	}
+	err = json.Unmarshal(temperature, &baseecic)
+	if err != nil {
+		return model.IlluminatingBaseecic{}, errors.New("json反序列化失败")
+	}
+	return baseecic, nil
+}
+
+// GetgatewayFind 获取网关列表
+func (s *temperatureService) GetgatewayFind() (model.GatewayFind, error) {
+	var gateway model.GatewayFind
+	urls := s.conf.GetString("temperature.baseUrl") + s.conf.GetString("temperature.api.gatewayFind")
+	m := make(map[string]any)
+	m["gateway_type"] = -1
+
+	temperature, err := s.temperature("POST", urls, m)
+	if err != nil {
+		return model.GatewayFind{}, errors.New("获取统计信息失败")
+	}
+	err = json.Unmarshal(temperature, &gateway)
+	if err != nil {
+		return model.GatewayFind{}, errors.New("json反序列化失败")
+	}
+	return gateway, nil
+}
+func (s *temperatureService) DevicesControl(agreement_json, request_id, udid string, source int) (model.DevicesControl, error) {
+	var devicesControl model.DevicesControl
+	urls := s.conf.GetString("illuminating.baseUrl") + s.conf.GetString("temperature.api.devicesControl")
+	m := make(map[string]any)
+	m["agreement_json"] = agreement_json
+	if request_id != "" {
+		m["request_id"] = request_id
+	}
+	m["source"] = source
+	m["udid"] = udid
+
+	illuminating, err := s.temperature("POST", urls, m)
+	if err != nil {
+		return model.DevicesControl{}, errors.New("控制空调设备失败")
+	}
+	err = json.Unmarshal(illuminating, &devicesControl)
+	if err != nil {
+		return model.DevicesControl{}, errors.New("json反序列化失败")
+	}
+
+	return devicesControl, nil
+}

+ 1 - 0
pkg/helper/sseStream/sse.go

@@ -0,0 +1 @@
+package sseStream