temperature.go 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. package service
  2. import (
  3. "bytes"
  4. "city_chips/internal/model"
  5. "city_chips/internal/repository"
  6. "encoding/json"
  7. "errors"
  8. "github.com/spf13/viper"
  9. "io"
  10. "net/http"
  11. )
  12. type TemperatureService interface {
  13. temperature(method, url string, body any) ([]byte, error)
  14. GetStatistics() ([]byte, error)
  15. GetBaseecic(currentPage, device_type_id, devices_enabled, gateway_id, pageSize int, query, devices_udid string) (model.IlluminatingBaseecic, error)
  16. GetAlarm(currentPage, pageSize int) ([]byte, error)
  17. GetAlarmStatistics(start_time, end_time string) ([]byte, error)
  18. GetgatewayFind() (model.GatewayFind, error)
  19. GetDeviceStatistics() (model.CategoryStatistics, error)
  20. GetGatewayStatistics() (model.GatewayStatistics, error)
  21. DevicesControl(agreement_json, request_id, udid string, source int) (model.DevicesControl, error)
  22. }
  23. func NewTemperatureService(service *Service, temperatureRepository repository.TemperatureRepository, conf *viper.Viper, client *http.Client) TemperatureService {
  24. return &temperatureService{
  25. Service: service,
  26. temperatureRepository: temperatureRepository,
  27. conf: conf,
  28. client: client,
  29. }
  30. }
  31. type temperatureService struct {
  32. *Service
  33. temperatureRepository repository.TemperatureRepository
  34. conf *viper.Viper
  35. client *http.Client
  36. }
  37. func (s *temperatureService) temperature(method, url string, body any) ([]byte, error) {
  38. login, err := s.login()
  39. if err != nil {
  40. return nil, err
  41. }
  42. var reqBody io.Reader
  43. var finalURL = url
  44. // 如果是 GET 请求,把 body 当作 query 参数处理
  45. if method == http.MethodGet || method == "" {
  46. vals, err := buildQueryParams(body)
  47. if err != nil {
  48. return nil, err
  49. }
  50. finalURL = addQueryParams(url, vals)
  51. } else {
  52. // 非 GET 请求才构造 body
  53. reqBody, err = buildRequestBody(body)
  54. if err != nil {
  55. return nil, err
  56. }
  57. }
  58. request, err := http.NewRequest(method, finalURL, reqBody)
  59. if err != nil {
  60. return nil, err
  61. }
  62. request.Header.Set("Authorization", login.AccessToken)
  63. response, err := s.client.Do(request)
  64. if err != nil {
  65. return nil, err
  66. }
  67. defer response.Body.Close()
  68. respBody, err := io.ReadAll(response.Body)
  69. if err != nil {
  70. return nil, err
  71. }
  72. return respBody, nil
  73. }
  74. // login 封装登录逻辑
  75. func (s *temperatureService) login() (*model.Login, error) {
  76. auth := s.conf.GetString("temperature.authorization")
  77. clientId := s.conf.GetInt("temperature.clientId")
  78. mobile := s.conf.GetString("temperature.mobile")
  79. password := s.conf.GetString("temperature.password")
  80. loginReq := model.LoginRequst{
  81. Authorization: auth,
  82. ClientId: clientId,
  83. Mobile: mobile,
  84. Password: password,
  85. }
  86. bodyBytes, err := json.Marshal(loginReq)
  87. if err != nil {
  88. return nil, err
  89. }
  90. url := s.conf.GetString("temperature.baseUrl") + s.conf.GetString("temperature.api.login")
  91. request, err := http.NewRequest("POST", url, bytes.NewBuffer(bodyBytes))
  92. if err != nil {
  93. return nil, err
  94. }
  95. response, err := s.client.Do(request)
  96. if err != nil {
  97. return nil, err
  98. }
  99. defer response.Body.Close()
  100. respBody, err := io.ReadAll(response.Body)
  101. if err != nil {
  102. return nil, err
  103. }
  104. var login model.Login
  105. if err := json.Unmarshal(respBody, &login); err != nil {
  106. return nil, err
  107. }
  108. return &login, nil
  109. }
  110. // GetStatistics 获取统计信息
  111. func (s *temperatureService) GetStatistics() ([]byte, error) {
  112. urls := s.conf.GetString("temperature.baseUrl") + s.conf.GetString("temperature.api.statistics")
  113. temperature, err := s.temperature("GET", urls, nil)
  114. if err != nil {
  115. return nil, errors.New("获取统计信息失败")
  116. }
  117. return temperature, nil
  118. }
  119. // GetDeviceStatistics 获取设备统计信息
  120. func (s *temperatureService) GetDeviceStatistics() (model.CategoryStatistics, error) {
  121. var respone model.CategoryStatistics
  122. urls := s.conf.GetString("temperature.baseUrl") + s.conf.GetString("temperature.api.deviceStatistics")
  123. temperature, err := s.temperature("GET", urls, nil)
  124. if err != nil {
  125. return model.CategoryStatistics{}, errors.New("获取设备统计信息失败")
  126. }
  127. err = json.Unmarshal(temperature, &respone)
  128. if err != nil {
  129. return model.CategoryStatistics{}, errors.New("json反序列化失败")
  130. }
  131. return respone, nil
  132. }
  133. // GetGatewayStatistics 网关设备在线离线统计
  134. func (s *temperatureService) GetGatewayStatistics() (model.GatewayStatistics, error) {
  135. var respone model.GatewayStatistics
  136. urls := s.conf.GetString("temperature.baseUrl") + s.conf.GetString("temperature.api.gatewayStatistics")
  137. temperature, err := s.temperature("GET", urls, nil)
  138. if err != nil {
  139. return model.GatewayStatistics{}, errors.New("获取设备统计信息失败")
  140. }
  141. err = json.Unmarshal(temperature, &respone)
  142. if err != nil {
  143. return model.GatewayStatistics{}, errors.New("json反序列化失败")
  144. }
  145. return respone, nil
  146. }
  147. // GetAlarm 获取报警信息
  148. func (s *temperatureService) GetAlarm(currentPage, pageSize int) ([]byte, error) {
  149. urls := s.conf.GetString("temperature.baseUrl") + s.conf.GetString("temperature.api.alarm")
  150. m := make(map[string]any)
  151. m["currentPage"] = currentPage
  152. m["pageSize"] = pageSize
  153. temperature, err := s.temperature("POST", urls, m)
  154. if err != nil {
  155. return nil, errors.New("获取统计信息失败")
  156. }
  157. return temperature, nil
  158. }
  159. // GetAlarmStatistics 获取报警统计信息
  160. func (s *temperatureService) GetAlarmStatistics(start_time, end_time string) ([]byte, error) {
  161. urls := s.conf.GetString("temperature.baseUrl") + s.conf.GetString("temperature.api.alarmStatistics")
  162. urls += "?start_time=" + start_time + "&end_time=" + end_time
  163. temperature, err := s.temperature("GET", urls, nil)
  164. if err != nil {
  165. return nil, errors.New("获取统计信息失败")
  166. }
  167. return temperature, nil
  168. }
  169. // GetBaseecic 获取温控面板列表
  170. func (s *temperatureService) GetBaseecic(currentPage, device_type_id, devices_enabled, gateway_id, pageSize int, query, devices_udid string) (model.IlluminatingBaseecic, error) {
  171. var baseecic model.IlluminatingBaseecic
  172. urls := s.conf.GetString("temperature.baseUrl") + s.conf.GetString("temperature.api.baseecic")
  173. m := make(map[string]any)
  174. m["currentPage"] = currentPage
  175. m["pageSize"] = pageSize
  176. if currentPage == 0 {
  177. m["currentPage"] = 1
  178. }
  179. if pageSize == 0 {
  180. m["pageSize"] = 20
  181. }
  182. if device_type_id != 0 {
  183. m["device_type_id"] = device_type_id
  184. }
  185. if devices_enabled != 0 {
  186. m["devices_enabled"] = devices_enabled
  187. }
  188. if gateway_id != 0 {
  189. m["gateway_id"] = gateway_id
  190. }
  191. if devices_udid != "" {
  192. m["devices_udid"] = devices_udid
  193. }
  194. if query != "" {
  195. m["query"] = query
  196. }
  197. temperature, err := s.temperature("POST", urls, m)
  198. if err != nil {
  199. return model.IlluminatingBaseecic{}, errors.New("获取统计信息失败")
  200. }
  201. err = json.Unmarshal(temperature, &baseecic)
  202. if err != nil {
  203. return model.IlluminatingBaseecic{}, errors.New("json反序列化失败")
  204. }
  205. return baseecic, nil
  206. }
  207. // GetgatewayFind 获取网关列表
  208. func (s *temperatureService) GetgatewayFind() (model.GatewayFind, error) {
  209. var gateway model.GatewayFind
  210. urls := s.conf.GetString("temperature.baseUrl") + s.conf.GetString("temperature.api.gatewayFind")
  211. m := make(map[string]any)
  212. m["gateway_type"] = -1
  213. temperature, err := s.temperature("POST", urls, m)
  214. if err != nil {
  215. return model.GatewayFind{}, errors.New("获取统计信息失败")
  216. }
  217. err = json.Unmarshal(temperature, &gateway)
  218. if err != nil {
  219. return model.GatewayFind{}, errors.New("json反序列化失败")
  220. }
  221. return gateway, nil
  222. }
  223. func (s *temperatureService) DevicesControl(agreement_json, request_id, udid string, source int) (model.DevicesControl, error) {
  224. var devicesControl model.DevicesControl
  225. urls := s.conf.GetString("illuminating.baseUrl") + s.conf.GetString("temperature.api.devicesControl")
  226. m := make(map[string]any)
  227. m["agreement_json"] = agreement_json
  228. if request_id != "" {
  229. m["request_id"] = request_id
  230. }
  231. m["source"] = source
  232. m["udid"] = udid
  233. illuminating, err := s.temperature("POST", urls, m)
  234. if err != nil {
  235. return model.DevicesControl{}, errors.New("控制空调设备失败")
  236. }
  237. err = json.Unmarshal(illuminating, &devicesControl)
  238. if err != nil {
  239. return model.DevicesControl{}, errors.New("json反序列化失败")
  240. }
  241. return devicesControl, nil
  242. }