energy.go 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  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. "log"
  11. "net/http"
  12. )
  13. type EnergyService interface {
  14. GetStatistics() (model.IlluminatingStatistics, 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. DevicesControl(agreement_json, request_id, udid string, source int) (model.DevicesControl, error)
  20. GetEnergyTrend(request model.Request) (model.T, error)
  21. GetEnergyTree() (model.EnergyTree, error)
  22. GetDayAndNight(request model.DayAndNightRequst) (model.DayAndNightRespone, error)
  23. GetDeviceStatistics() (model.CategoryStatistics, error)
  24. GetHisData(dev_udid, start_time, end_time, data_size, data_type, cuerrentPage, pageSize, is_page string) (model.HisData, error)
  25. }
  26. func NewEnergyService(
  27. service *Service,
  28. energyRepository repository.EnergyRepository,
  29. viperViper *viper.Viper,
  30. client *http.Client,
  31. ) EnergyService {
  32. if client == nil {
  33. client = http.DefaultClient
  34. }
  35. return &energyService{
  36. Service: service,
  37. energyRepository: energyRepository,
  38. conf: viperViper,
  39. client: client,
  40. }
  41. }
  42. type energyService struct {
  43. *Service
  44. energyRepository repository.EnergyRepository
  45. conf *viper.Viper
  46. client *http.Client
  47. }
  48. func (s *energyService) energy(method, url string, body any) ([]byte, error) {
  49. login, err := s.login()
  50. if err != nil {
  51. return nil, err
  52. }
  53. var reqBody io.Reader
  54. var finalURL = url
  55. // 如果是 GET 请求,把 body 当作 query 参数处理
  56. if method == http.MethodGet || method == "" {
  57. vals, err := buildQueryParams(body)
  58. if err != nil {
  59. return nil, err
  60. }
  61. finalURL = addQueryParams(url, vals)
  62. } else {
  63. // 非 GET 请求才构造 body
  64. reqBody, err = buildRequestBody(body)
  65. if err != nil {
  66. return nil, err
  67. }
  68. }
  69. request, err := http.NewRequest(method, finalURL, reqBody)
  70. if err != nil {
  71. return nil, err
  72. }
  73. request.Header.Set("Authorization", login.AccessToken)
  74. response, err := s.client.Do(request)
  75. if err != nil {
  76. return nil, err
  77. }
  78. defer response.Body.Close()
  79. respBody, err := io.ReadAll(response.Body)
  80. if err != nil {
  81. return nil, err
  82. }
  83. return respBody, nil
  84. }
  85. // login 封装登录逻辑
  86. func (s *energyService) login() (*model.Login, error) {
  87. auth := s.conf.GetString("energy.authorization")
  88. clientId := s.conf.GetInt("energy.clientId")
  89. mobile := s.conf.GetString("energy.mobile")
  90. password := s.conf.GetString("energy.password")
  91. loginReq := model.LoginRequst{
  92. Authorization: auth,
  93. ClientId: clientId,
  94. Mobile: mobile,
  95. Password: password,
  96. }
  97. bodyBytes, err := json.Marshal(loginReq)
  98. if err != nil {
  99. return nil, err
  100. }
  101. url := s.conf.GetString("energy.baseUrl") + s.conf.GetString("energy.api.login")
  102. request, err := http.NewRequest("POST", url, bytes.NewBuffer(bodyBytes))
  103. if err != nil {
  104. return nil, err
  105. }
  106. response, err := s.client.Do(request)
  107. if err != nil {
  108. return nil, err
  109. }
  110. defer response.Body.Close()
  111. respBody, err := io.ReadAll(response.Body)
  112. if err != nil {
  113. return nil, err
  114. }
  115. var login model.Login
  116. if err := json.Unmarshal(respBody, &login); err != nil {
  117. return nil, err
  118. }
  119. return &login, nil
  120. }
  121. // 构建请求体工具函数
  122. // GetStatistics 获取统计信息
  123. func (s *energyService) GetStatistics() (model.IlluminatingStatistics, error) {
  124. var response model.IlluminatingStatistics
  125. urls := s.conf.GetString("energy.baseUrl") + s.conf.GetString("energy.api.statistics")
  126. energy, err := s.energy("GET", urls, nil)
  127. if err != nil {
  128. return model.IlluminatingStatistics{}, errors.New("获取统计信息失败")
  129. }
  130. err = json.Unmarshal(energy, &response)
  131. if err != nil {
  132. return model.IlluminatingStatistics{}, errors.New("json反序列化失败")
  133. }
  134. return response, nil
  135. }
  136. // GetDeviceStatistics 获取设备统计信息
  137. func (s *energyService) GetDeviceStatistics() (model.CategoryStatistics, error) {
  138. var response model.CategoryStatistics
  139. urls := s.conf.GetString("energy.baseUrl") + s.conf.GetString("energy.api.deviceStatistics")
  140. energy, err := s.energy("GET", urls, nil)
  141. if err != nil {
  142. return model.CategoryStatistics{}, errors.New("获取设备统计信息失败")
  143. }
  144. err = json.Unmarshal(energy, &response)
  145. if err != nil {
  146. return model.CategoryStatistics{}, errors.New("json反序列化失败")
  147. }
  148. return response, nil
  149. }
  150. // GetAlarm 获取报警信息
  151. func (s *energyService) GetAlarm(currentPage, pageSize int) ([]byte, error) {
  152. urls := s.conf.GetString("energy.baseUrl") + s.conf.GetString("energy.api.alarm")
  153. m := make(map[string]any)
  154. m["currentPage"] = currentPage
  155. m["pageSize"] = pageSize
  156. energy, err := s.energy("POST", urls, m)
  157. if err != nil {
  158. return nil, errors.New("获取统计信息失败")
  159. }
  160. return energy, nil
  161. }
  162. // GetAlarmStatistics 获取报警统计信息
  163. func (s *energyService) GetAlarmStatistics(start_time, end_time string) ([]byte, error) {
  164. urls := s.conf.GetString("energy.baseUrl") + s.conf.GetString("energy.api.alarmStatistics")
  165. urls += "?start_time=" + start_time + "&end_time=" + end_time
  166. energy, err := s.energy("GET", urls, nil)
  167. if err != nil {
  168. return nil, errors.New("获取统计信息失败")
  169. }
  170. return energy, nil
  171. }
  172. // GetBaseecic 获取能耗列表
  173. func (s *energyService) GetBaseecic(currentPage, device_type_id, devices_enabled, gateway_id, pageSize int, query, devices_udid string) (model.IlluminatingBaseecic, error) {
  174. var baseecic model.IlluminatingBaseecic
  175. urls := s.conf.GetString("energy.baseUrl") + s.conf.GetString("energy.api.baseecic")
  176. m := make(map[string]any)
  177. m["currentPage"] = currentPage
  178. m["pageSize"] = pageSize
  179. if currentPage == 0 {
  180. m["currentPage"] = 1
  181. }
  182. if pageSize == 0 {
  183. m["pageSize"] = 20
  184. }
  185. if device_type_id != 0 {
  186. m["device_type_id"] = device_type_id
  187. }
  188. if devices_enabled != 0 {
  189. m["devices_enabled"] = devices_enabled
  190. }
  191. if gateway_id != 0 {
  192. m["gateway_id"] = gateway_id
  193. }
  194. if devices_udid != "" {
  195. m["devices_udid"] = devices_udid
  196. }
  197. if query != "" {
  198. m["query"] = query
  199. }
  200. energy, err := s.energy("POST", urls, m)
  201. if err != nil {
  202. return model.IlluminatingBaseecic{}, errors.New("获取统计信息失败")
  203. }
  204. err = json.Unmarshal(energy, &baseecic)
  205. if err != nil {
  206. return model.IlluminatingBaseecic{}, errors.New("json反序列化失败")
  207. }
  208. return baseecic, nil
  209. }
  210. // GetgatewayFind 获取网关列表
  211. func (s *energyService) GetgatewayFind() (model.GatewayFind, error) {
  212. var gateway model.GatewayFind
  213. urls := s.conf.GetString("energy.baseUrl") + s.conf.GetString("energy.api.gatewayFind")
  214. m := make(map[string]any)
  215. m["gateway_type"] = -1
  216. energy, err := s.energy("POST", urls, m)
  217. if err != nil {
  218. return model.GatewayFind{}, errors.New("获取统计信息失败")
  219. }
  220. err = json.Unmarshal(energy, &gateway)
  221. if err != nil {
  222. return model.GatewayFind{}, errors.New("json反序列化失败")
  223. }
  224. return gateway, nil
  225. }
  226. // DevicesControl 设备控制
  227. func (s *energyService) DevicesControl(agreement_json, request_id, udid string, source int) (model.DevicesControl, error) {
  228. var devicesControl model.DevicesControl
  229. urls := s.conf.GetString("energy.baseUrl") + s.conf.GetString("energy.api.devicesControl")
  230. m := make(map[string]any)
  231. m["agreement_json"] = agreement_json
  232. if request_id != "" {
  233. m["request_id"] = request_id
  234. }
  235. m["source"] = source
  236. m["udid"] = udid
  237. energy, err := s.energy("POST", urls, m)
  238. if err != nil {
  239. return model.DevicesControl{}, errors.New("控制灯光设备失败")
  240. }
  241. err = json.Unmarshal(energy, &devicesControl)
  242. if err != nil {
  243. return model.DevicesControl{}, errors.New("json反序列化失败")
  244. }
  245. return devicesControl, nil
  246. }
  247. // GetEnergyTree 获取能耗树
  248. func (s *energyService) GetEnergyTree() (model.EnergyTree, error) {
  249. var response model.EnergyTree
  250. urls := s.conf.GetString("energy.baseUrl") + s.conf.GetString("energy.api.energyTree")
  251. energy, err := s.energy("GET", urls, nil)
  252. if err != nil {
  253. return model.EnergyTree{}, errors.New("获取能耗树失败")
  254. }
  255. err = json.Unmarshal(energy, &response)
  256. if err != nil {
  257. return model.EnergyTree{}, errors.New("json反序列化失败")
  258. }
  259. return response, nil
  260. }
  261. // GetEnergyTrend 获取能耗趋势
  262. func (s *energyService) GetEnergyTrend(request model.Request) (model.T, error) {
  263. var response model.T
  264. urls := s.conf.GetString("energy.baseUrl") + s.conf.GetString("energy.api.energyTrend")
  265. energy, err := s.energy("POST", urls, request)
  266. if err != nil {
  267. return model.T{}, errors.New("获取能耗趋势失败")
  268. }
  269. err = json.Unmarshal(energy, &response)
  270. if err != nil {
  271. return model.T{}, errors.New("json反序列化失败")
  272. }
  273. return response, nil
  274. }
  275. // GetDayAndNight 获取昼夜能耗分析
  276. func (s *energyService) GetDayAndNight(request model.DayAndNightRequst) (model.DayAndNightRespone, error) {
  277. var response model.DayAndNightRespone
  278. urls := s.conf.GetString("energy.baseUrl") + s.conf.GetString("energy.api.dayAndNight")
  279. energy, err := s.energy("POST", urls, request)
  280. if err != nil {
  281. return model.DayAndNightRespone{}, errors.New("获取能耗趋势失败")
  282. }
  283. err = json.Unmarshal(energy, &response)
  284. if err != nil {
  285. return model.DayAndNightRespone{}, errors.New("json反序列化失败")
  286. }
  287. return response, nil
  288. }
  289. // GetHisData 获取历史数据
  290. func (s *energyService) GetHisData(dev_udid, start_time, end_time, data_size, data_type, cuerrentPage, pageSize, is_page string) (model.HisData, error) {
  291. var response model.HisData
  292. urls := s.conf.GetString("energy.baseUrl") + s.conf.GetString("energy.api.hisData")
  293. //urls += "?dev_udid=" + dev_udid + "&start_time=" + start_time + "&end_time=" + end_time + "&data_size=" + data_size + "&data_type=" + data_type + "&cuerrentPage=" + cuerrentPage + "&pageSize=" + pageSize + "&is_page=" + is_page
  294. urls += "?dev_udid=" + dev_udid + "&data_size=" + data_size + "&data_type=" + data_type + "&start_time=" + start_time + "&end_time=" + end_time
  295. energy, err := s.energy("GET", urls, nil)
  296. log.Println(string(energy))
  297. if err != nil {
  298. return model.HisData{}, errors.New("获取历史数据失败")
  299. }
  300. err = json.Unmarshal(energy, &response)
  301. if err != nil {
  302. return model.HisData{}, errors.New("json反序列化失败")
  303. }
  304. return response, nil
  305. }