device.go 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. package controllers
  2. import (
  3. "errors"
  4. "fmt"
  5. "sparrow/pkg/rpcs"
  6. "sparrow/pkg/server"
  7. "sparrow/services/knowoapi/services"
  8. "strconv"
  9. "time"
  10. "github.com/garyburd/redigo/redis"
  11. "github.com/kataras/iris"
  12. )
  13. // DeviceController api
  14. type DeviceController struct {
  15. Ctx iris.Context
  16. Service services.DeviceService
  17. Token
  18. }
  19. // Get 获取激活设备列表
  20. // GET /device?pi=&ps=&proid=&device_id=
  21. func (a *DeviceController) Get() {
  22. pi, err := a.Ctx.URLParamInt("pi")
  23. if err != nil {
  24. badRequest(a.Ctx, err)
  25. return
  26. }
  27. ps, err := a.Ctx.URLParamInt("ps")
  28. if err != nil {
  29. badRequest(a.Ctx, err)
  30. return
  31. }
  32. proid, err := a.Ctx.URLParamInt("proid")
  33. if err != nil {
  34. proid = 0
  35. }
  36. deviceid := a.Ctx.URLParam("device_id")
  37. vid := a.getVendorID(a.Ctx)
  38. datas, total, err := a.Service.GetDevices(vid, proid, pi, ps, deviceid)
  39. if err != nil {
  40. responseError(a.Ctx, ErrDatabase, err.Error())
  41. return
  42. }
  43. done(a.Ctx, map[string]interface{}{
  44. "list": datas,
  45. "total": total,
  46. })
  47. }
  48. //设备数量,包含在线数量,离线数量,总数量
  49. //GET /devicecount
  50. func (a *DeviceController) GetDevicecount() {
  51. vid := a.getVendorID(a.Ctx)
  52. data, err := a.Service.GetDevicesCountByVenderId(vid)
  53. if err != nil && err.Error() != "redigo: nil returned" {
  54. responseError(a.Ctx, ErrDatabase, err.Error())
  55. return
  56. }
  57. done(a.Ctx, map[string]interface{}{
  58. "data": data,
  59. })
  60. }
  61. //获取设备在线状态
  62. // GET /devicestatus?device_id=
  63. func (a *DeviceController) GetDevicestatus() {
  64. deviceid, err := a.Ctx.URLParamInt("device_id")
  65. if err != nil {
  66. deviceid = 0
  67. }
  68. var status int
  69. onlineargs := rpcs.ArgsGetDeviceOnlineStatus{
  70. Id: uint64(deviceid),
  71. }
  72. onlinereply := rpcs.ReplyGetDeviceOnlineStatus{}
  73. err = server.RPCCallByName(nil, "devicemanager", "DeviceManager.GetDeviceOnlineStatus", onlineargs, &onlinereply)
  74. if err != nil && err.Error() != "redigo: nil returned" {
  75. server.Log.Errorf("get devie online status error: %v", err)
  76. responseError(a.Ctx, ErrDatabase, err.Error())
  77. return
  78. }
  79. if int(onlinereply.HeartbeatInterval) > 0 && len(onlinereply.ClientIP) > 0 && err != redis.ErrNil {
  80. status = 1
  81. }
  82. done(a.Ctx, map[string]interface{}{
  83. "status": status,
  84. })
  85. }
  86. // GetBannerdata 获取设备激活和活跃数据
  87. // GET /bannerdata?proid=
  88. func (a *DeviceController) GetBannerdata() {
  89. proid, err := a.Ctx.URLParamInt("proid")
  90. if err != nil {
  91. proid = 0
  92. }
  93. var (
  94. //今日激活
  95. tact = 0
  96. // 今日活跃
  97. tlive = 0
  98. // 昨日激活
  99. yact = 0
  100. // 昨日活跃
  101. ylive = 0
  102. // 累计激活
  103. totolact = 0
  104. // 环比昨日激活
  105. comparedWithYesterdayActive = 0.00
  106. //活跃占比
  107. rateOfTodayLive = 0.00
  108. //环比昨日活跃
  109. comparedWithYesterdayLive = 0.00
  110. )
  111. vendorid := a.getVendorID(a.Ctx)
  112. totolact, err = a.Service.GetDeviceCount(vendorid)
  113. if err != nil {
  114. responseError(a.Ctx, ErrDatabase, err.Error())
  115. return
  116. }
  117. today := time.Now().Format("2006-01-02")
  118. yestoday := time.Now().AddDate(0, 0, -1).Format("2006-01-02")
  119. tact, err = a.Service.GetActiveNumberOfDate(vendorid, today)
  120. if err != nil {
  121. responseError(a.Ctx, ErrDatabase, err.Error())
  122. return
  123. }
  124. tlive, err = a.Service.GetLivelyCountOfDate(vendorid, today)
  125. if err != nil {
  126. responseError(a.Ctx, ErrDatabase, err.Error())
  127. return
  128. }
  129. yact, err = a.Service.GetActiveNumberOfDate(vendorid, yestoday)
  130. if err != nil {
  131. responseError(a.Ctx, ErrDatabase, err.Error())
  132. return
  133. }
  134. ylive, err = a.Service.GetLivelyCountOfDate(vendorid, yestoday)
  135. if err != nil {
  136. responseError(a.Ctx, ErrDatabase, err.Error())
  137. return
  138. }
  139. if tact != 0 && yact != 0 {
  140. comparedWithYesterdayActive = (float64(tact) / float64(yact)) * 100
  141. }
  142. if tlive != 0 && ylive != 0 {
  143. comparedWithYesterdayLive = (float64(tlive) / float64(ylive)) * 100
  144. rateOfTodayLive = float64(tlive) / float64(totolact) * 100
  145. }
  146. //TODO 这里的productid要去掉
  147. result := map[string]interface{}{
  148. "todayAct": tact,
  149. "todayLive": tlive,
  150. "yestodayAct": yact,
  151. "yestodayLive": ylive,
  152. "totalAct": totolact,
  153. "comparedWithYesterdayActive": fmt.Sprintf("%s%%", strconv.FormatFloat(comparedWithYesterdayActive, 'f', 2, 64)),
  154. "comparedWithYesterdayLive": fmt.Sprintf("%s%%", strconv.FormatFloat(comparedWithYesterdayLive, 'f', 2, 64)),
  155. "rateOfTodayLive": fmt.Sprintf("%s%%", strconv.FormatFloat(rateOfTodayLive, 'f', 2, 64)),
  156. "productid": proid,
  157. }
  158. done(a.Ctx, result)
  159. }
  160. // GetActivechart 获取N日的激活数据趋势
  161. func (a *DeviceController) GetActivechart() {
  162. // proid, err := a.Ctx.URLParamInt("proid")
  163. // if err != nil {
  164. // proid = 0
  165. // }
  166. days, err := a.Ctx.URLParamInt("days")
  167. if err != nil {
  168. days = 7
  169. }
  170. if days > 30 {
  171. badRequest(a.Ctx, errors.New("非法参数"))
  172. return
  173. }
  174. vendorid := a.getVendorID(a.Ctx)
  175. datas, err := a.Service.GetActiveOfNumDays(vendorid, days)
  176. if err != nil {
  177. responseError(a.Ctx, ErrDatabase, err.Error())
  178. return
  179. }
  180. done(a.Ctx, map[string]interface{}{
  181. "chart": datas,
  182. })
  183. }
  184. // GetLivechart 获取N日内的活跃数据
  185. func (a *DeviceController) GetLivechart() {
  186. // proid, err := a.Ctx.URLParamInt("proid")
  187. // if err != nil {
  188. // proid = 0
  189. // }
  190. days, err := a.Ctx.URLParamInt("days")
  191. if err != nil {
  192. days = 7
  193. }
  194. if days > 30 {
  195. badRequest(a.Ctx, errors.New("非法参数"))
  196. return
  197. }
  198. vendorid := a.getVendorID(a.Ctx)
  199. datas, err := a.Service.GetLivelyOfNumDays(vendorid, days)
  200. if err != nil {
  201. responseError(a.Ctx, ErrDatabase, err.Error())
  202. return
  203. }
  204. done(a.Ctx, map[string]interface{}{
  205. "chart": datas,
  206. })
  207. }