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 }