device.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552
  1. package controllers
  2. import (
  3. "errors"
  4. "fmt"
  5. "io"
  6. "sparrow/pkg/models"
  7. "sparrow/pkg/rpcs"
  8. "sparrow/pkg/scene"
  9. "sparrow/pkg/server"
  10. "sparrow/services/knowoapi/services"
  11. "strconv"
  12. "time"
  13. "github.com/kataras/iris/v12"
  14. )
  15. // DeviceController api
  16. type DeviceController struct {
  17. Ctx iris.Context
  18. Service services.DeviceService
  19. Token
  20. }
  21. // Get 获取激活设备列表
  22. // GET /device?pi=&ps=&proid=&device_id=
  23. func (a *DeviceController) Get() {
  24. pi, err := a.Ctx.URLParamInt("pi")
  25. if err != nil {
  26. badRequest(a.Ctx, err)
  27. return
  28. }
  29. ps, err := a.Ctx.URLParamInt("ps")
  30. if err != nil {
  31. badRequest(a.Ctx, err)
  32. return
  33. }
  34. proid := a.Ctx.URLParam("proid")
  35. deviceid := a.Ctx.URLParam("device_id")
  36. vid := a.getVendorID(a.Ctx)
  37. datas, total, err := a.Service.GetDevices(vid, proid, pi, ps, deviceid)
  38. if err != nil {
  39. responseError(a.Ctx, ErrDatabase, err.Error())
  40. return
  41. }
  42. done(a.Ctx, map[string]interface{}{
  43. "list": datas,
  44. "total": total,
  45. })
  46. }
  47. // 设备数量,包含在线数量,离线数量,总数量
  48. // GET /devicecount
  49. func (a *DeviceController) GetDevicecount() {
  50. vid := a.getVendorID(a.Ctx)
  51. data, err := a.Service.GetDevicesCountByVenderId(vid)
  52. if err != nil && err.Error() != "redigo: nil returned" {
  53. responseError(a.Ctx, ErrDatabase, err.Error())
  54. return
  55. }
  56. done(a.Ctx, data)
  57. }
  58. // 获取设备在线状态
  59. // GET /devicestatus?device_id=
  60. func (a *DeviceController) GetDevicestatus() {
  61. deviceid := a.Ctx.URLParam("device_id")
  62. var status int
  63. onlineargs := rpcs.ArgsGetDeviceOnlineStatus{
  64. Id: deviceid,
  65. }
  66. onlinereply := rpcs.ReplyGetDeviceOnlineStatus{}
  67. err := server.RPCCallByName(nil, rpcs.DeviceManagerName, "DeviceManager.GetDeviceOnlineStatus", onlineargs, &onlinereply)
  68. if err != nil && err.Error() != "redigo: nil returned" {
  69. server.Log.Errorf("get devie online status error: %v", err)
  70. responseError(a.Ctx, ErrDatabase, err.Error())
  71. return
  72. }
  73. if int(onlinereply.HeartbeatInterval) > 0 && len(onlinereply.ClientIP) > 0 {
  74. status = 1
  75. }
  76. done(a.Ctx, map[string]interface{}{
  77. "Status": status,
  78. })
  79. }
  80. // GetBannerdata 获取设备激活和活跃数据
  81. // GET /bannerdata?proid=
  82. func (a *DeviceController) GetBannerdata() {
  83. proid, err := a.Ctx.URLParamInt("proid")
  84. if err != nil {
  85. proid = 0
  86. }
  87. var (
  88. //今日激活
  89. tact = 0
  90. // 今日活跃
  91. tlive = 0
  92. // 昨日激活
  93. yact = 0
  94. // 昨日活跃
  95. ylive = 0
  96. // 累计激活
  97. totolact = 0
  98. // 环比昨日激活
  99. comparedWithYesterdayActive = 0.00
  100. //活跃占比
  101. rateOfTodayLive = 0.00
  102. //环比昨日活跃
  103. comparedWithYesterdayLive = 0.00
  104. )
  105. vendorid := a.getVendorID(a.Ctx)
  106. totolact, err = a.Service.GetDeviceCount(vendorid)
  107. if err != nil {
  108. responseError(a.Ctx, ErrDatabase, err.Error())
  109. return
  110. }
  111. today := time.Now().Format("2006-01-02")
  112. yestoday := time.Now().AddDate(0, 0, -1).Format("2006-01-02")
  113. tact, err = a.Service.GetActiveNumberOfDate(vendorid, today)
  114. if err != nil {
  115. responseError(a.Ctx, ErrDatabase, err.Error())
  116. return
  117. }
  118. tlive, err = a.Service.GetLivelyCountOfDate(vendorid, today)
  119. if err != nil {
  120. responseError(a.Ctx, ErrDatabase, err.Error())
  121. return
  122. }
  123. yact, err = a.Service.GetActiveNumberOfDate(vendorid, yestoday)
  124. if err != nil {
  125. responseError(a.Ctx, ErrDatabase, err.Error())
  126. return
  127. }
  128. ylive, err = a.Service.GetLivelyCountOfDate(vendorid, yestoday)
  129. if err != nil {
  130. responseError(a.Ctx, ErrDatabase, err.Error())
  131. return
  132. }
  133. if tact != 0 && yact != 0 {
  134. comparedWithYesterdayActive = (float64(tact) / float64(yact)) * 100
  135. }
  136. if tlive != 0 && ylive != 0 {
  137. comparedWithYesterdayLive = (float64(tlive) / float64(ylive)) * 100
  138. rateOfTodayLive = float64(tlive) / float64(totolact) * 100
  139. }
  140. //TODO 这里的productid要去掉
  141. result := map[string]interface{}{
  142. "todayAct": tact,
  143. "todayLive": tlive,
  144. "yestodayAct": yact,
  145. "yestodayLive": ylive,
  146. "totalAct": totolact,
  147. "comparedWithYesterdayActive": fmt.Sprintf("%s%%", strconv.FormatFloat(comparedWithYesterdayActive, 'f', 2, 64)),
  148. "comparedWithYesterdayLive": fmt.Sprintf("%s%%", strconv.FormatFloat(comparedWithYesterdayLive, 'f', 2, 64)),
  149. "rateOfTodayLive": fmt.Sprintf("%s%%", strconv.FormatFloat(rateOfTodayLive, 'f', 2, 64)),
  150. "productid": proid,
  151. }
  152. done(a.Ctx, result)
  153. }
  154. // GetActivechart 获取N日的激活数据趋势
  155. func (a *DeviceController) GetActivechart() {
  156. // proid, err := a.Ctx.URLParamInt("proid")
  157. // if err != nil {
  158. // proid = 0
  159. // }
  160. days, err := a.Ctx.URLParamInt("days")
  161. if err != nil {
  162. days = 7
  163. }
  164. if days > 30 {
  165. badRequest(a.Ctx, errors.New("非法参数"))
  166. return
  167. }
  168. vendorid := a.getVendorID(a.Ctx)
  169. datas, err := a.Service.GetActiveOfNumDays(vendorid, days)
  170. if err != nil {
  171. responseError(a.Ctx, ErrDatabase, err.Error())
  172. return
  173. }
  174. done(a.Ctx, map[string]interface{}{
  175. "chart": datas,
  176. })
  177. }
  178. // GetLivechart 获取N日内的活跃数据
  179. func (a *DeviceController) GetLivechart() {
  180. // proid, err := a.Ctx.URLParamInt("proid")
  181. // if err != nil {
  182. // proid = 0
  183. // }
  184. days, err := a.Ctx.URLParamInt("days")
  185. if err != nil {
  186. days = 7
  187. }
  188. if days > 30 {
  189. badRequest(a.Ctx, errors.New("非法参数"))
  190. return
  191. }
  192. vendorid := a.getVendorID(a.Ctx)
  193. datas, err := a.Service.GetLivelyOfNumDays(vendorid, days)
  194. if err != nil {
  195. responseError(a.Ctx, ErrDatabase, err.Error())
  196. return
  197. }
  198. done(a.Ctx, map[string]interface{}{
  199. "chart": datas,
  200. })
  201. }
  202. // PostOtaUpgrade ota升级
  203. // POST /device/ota/upgrade
  204. func (a *DeviceController) PostOtaUpgrade() {
  205. params := new(models.UpgradeParams)
  206. params.DeviceID = a.Ctx.FormValue("device_id")
  207. params.VendorID = a.Token.getVendorID(a.Ctx)
  208. file, header, err := a.Ctx.FormFile("file")
  209. if err != nil {
  210. responseError(a.Ctx, ErrNormal, err.Error())
  211. return
  212. }
  213. fileBytes, err := io.ReadAll(file)
  214. if err != nil {
  215. responseError(a.Ctx, ErrNormal, err.Error())
  216. return
  217. }
  218. params.FileSize = header.Size
  219. params.File = fileBytes
  220. params.FileName = header.Filename
  221. err = a.Service.Upgrade(params)
  222. if err != nil {
  223. responseError(a.Ctx, ErrNormal, err.Error())
  224. return
  225. }
  226. done(a.Ctx, params)
  227. }
  228. // GetOtaProgress ota升级
  229. // GET /device/ota/progress?device_id=
  230. func (a *DeviceController) GetOtaProgress() {
  231. deviceId := a.Ctx.URLParam("device_id")
  232. data, err := a.Service.GetUpgradeProgress(deviceId)
  233. if err != nil {
  234. responseError(a.Ctx, ErrNormal, err.Error())
  235. return
  236. }
  237. done(a.Ctx, map[string]interface{}{
  238. "progress": data.Progress,
  239. })
  240. }
  241. // GetStatus 获取设备信息
  242. // GET /device/status?device_id=&product_id=
  243. func (a *DeviceController) GetStatus() {
  244. deviceId := a.Ctx.URLParam("device_id")
  245. productId := a.Ctx.URLParam("product_id")
  246. data, err := a.Service.GetDeviceStatus(deviceId, productId)
  247. if err != nil {
  248. responseError(a.Ctx, ErrNormal, err.Error())
  249. return
  250. }
  251. done(a.Ctx, map[string]interface{}{
  252. "data": data.MustToJsonString(),
  253. })
  254. }
  255. // GetEvent 获取设备事件信息
  256. // GET /device/event?device_id=&product_id=
  257. func (a *DeviceController) GetEvent() {
  258. deviceId := a.Ctx.URLParam("device_id")
  259. productId := a.Ctx.URLParam("product_id")
  260. data, err := a.Service.GetDeviceEvent(deviceId, productId)
  261. if err != nil {
  262. responseError(a.Ctx, ErrNormal, err.Error())
  263. return
  264. }
  265. done(a.Ctx, map[string]interface{}{
  266. "data": data.MustToJsonString(),
  267. })
  268. }
  269. // PostReport 获取设备状态
  270. // POST /device/report
  271. func (a *DeviceController) PostReport() {
  272. params := new(models.SendSplitCommandParams)
  273. if err := parseBody(a.Ctx, params); err != nil {
  274. badRequest(a.Ctx, err)
  275. return
  276. }
  277. result, err := a.Service.SetReport(*params)
  278. if err != nil {
  279. responseError(a.Ctx, ErrNormal, err.Error())
  280. return
  281. }
  282. done(a.Ctx, result)
  283. }
  284. // PostRestart 重启设备
  285. // POST /device/restart
  286. func (a *DeviceController) PostRestart() {
  287. params := new(models.SendSplitCommandParams)
  288. if err := parseBody(a.Ctx, params); err != nil {
  289. badRequest(a.Ctx, err)
  290. return
  291. }
  292. err := a.Service.Restart(*params)
  293. if err != nil {
  294. responseError(a.Ctx, ErrNormal, err.Error())
  295. return
  296. }
  297. done(a.Ctx, params.DeviceId)
  298. }
  299. // PostClear 清除设备配置数据
  300. // POST /device/clear
  301. func (a *DeviceController) PostClear() {
  302. params := new(models.SendSplitCommandParams)
  303. if err := parseBody(a.Ctx, params); err != nil {
  304. badRequest(a.Ctx, err)
  305. return
  306. }
  307. err := a.Service.ClearData(*params)
  308. if err != nil {
  309. responseError(a.Ctx, ErrNormal, err.Error())
  310. return
  311. }
  312. done(a.Ctx, params.DeviceId)
  313. }
  314. // PostDatatrans 设备端自动上报配置
  315. // POST /device/datarrans
  316. func (a *DeviceController) PostDatatrans() {
  317. params := new(models.SendSplitCommandParams)
  318. if err := parseBody(a.Ctx, params); err != nil {
  319. badRequest(a.Ctx, err)
  320. return
  321. }
  322. err := a.Service.SetDataTrans(*params)
  323. if err != nil {
  324. responseError(a.Ctx, ErrNormal, err.Error())
  325. return
  326. }
  327. done(a.Ctx, params.DeviceId)
  328. }
  329. // PostInfo
  330. // POST /device/info
  331. func (a *DeviceController) PostInfo() {
  332. params := new(models.SendSplitCommandParams)
  333. if err := parseBody(a.Ctx, params); err != nil {
  334. badRequest(a.Ctx, err)
  335. return
  336. }
  337. result, err := a.Service.GetInfo(*params)
  338. if err != nil {
  339. responseError(a.Ctx, ErrNormal, err.Error())
  340. return
  341. }
  342. done(a.Ctx, result)
  343. }
  344. // PostForcerun 远程控制某个模块强制运行
  345. // POST /device/forcerun
  346. func (a *DeviceController) PostForcerun() {
  347. params := new(models.SendSplitCommandParams)
  348. if err := parseBody(a.Ctx, params); err != nil {
  349. badRequest(a.Ctx, err)
  350. return
  351. }
  352. err := a.Service.ForceRun(*params)
  353. if err != nil {
  354. responseError(a.Ctx, ErrNormal, err.Error())
  355. return
  356. }
  357. done(a.Ctx, params.DeviceId)
  358. }
  359. // PostId 写入设备 ID
  360. // POST /device/id
  361. func (a *DeviceController) PostId() {
  362. params := new(models.SendSplitCommandParams)
  363. if err := parseBody(a.Ctx, params); err != nil {
  364. badRequest(a.Ctx, err)
  365. return
  366. }
  367. err := a.Service.SetDeviceId(*params)
  368. if err != nil {
  369. responseError(a.Ctx, ErrNormal, err.Error())
  370. return
  371. }
  372. done(a.Ctx, params.DeviceId)
  373. }
  374. // PostFjsq 智能分集水器控制
  375. // POST /device/fjsq
  376. func (a *DeviceController) PostFjsq() {
  377. params := new(models.SendSplitCommandParams)
  378. if err := parseBody(a.Ctx, params); err != nil {
  379. badRequest(a.Ctx, err)
  380. return
  381. }
  382. err := a.Service.SetFjsqStatus(*params)
  383. if err != nil {
  384. responseError(a.Ctx, ErrNormal, err.Error())
  385. return
  386. }
  387. done(a.Ctx, params.DeviceId)
  388. }
  389. // PostOutdoorpower 设置水系统外机电源状态
  390. // POST /device/outdoorpower
  391. func (a *DeviceController) PostOutdoorpower() {
  392. params := new(models.SendSplitCommandParams)
  393. if err := parseBody(a.Ctx, params); err != nil {
  394. badRequest(a.Ctx, err)
  395. return
  396. }
  397. err := a.Service.SetOutdoorPower(*params)
  398. if err != nil {
  399. responseError(a.Ctx, ErrNormal, err.Error())
  400. return
  401. }
  402. done(a.Ctx, params.DeviceId)
  403. }
  404. // PostOutdoortemp 设置水系统外机出水温度
  405. // POST /device/outdoortemp
  406. func (a *DeviceController) PostOutdoortemp() {
  407. params := new(models.SendSplitCommandParams)
  408. if err := parseBody(a.Ctx, params); err != nil {
  409. badRequest(a.Ctx, err)
  410. return
  411. }
  412. err := a.Service.SetOutdoorTemp(*params)
  413. if err != nil {
  414. responseError(a.Ctx, ErrNormal, err.Error())
  415. return
  416. }
  417. done(a.Ctx, params.DeviceId)
  418. }
  419. // PostOutdoorlinkage 开启/关闭水系统联动
  420. // POST /device/outdoorlinkage
  421. func (a *DeviceController) PostOutdoorlinkage() {
  422. params := new(models.SendSplitCommandParams)
  423. if err := parseBody(a.Ctx, params); err != nil {
  424. badRequest(a.Ctx, err)
  425. return
  426. }
  427. err := a.Service.SetOutdoorLinkage(*params)
  428. if err != nil {
  429. responseError(a.Ctx, ErrNormal, err.Error())
  430. return
  431. }
  432. done(a.Ctx, params.DeviceId)
  433. }
  434. // PostMixedwaterlinkage 开启/关闭调温中心联动
  435. // POST /device/mixedwaterlinkage
  436. func (a *DeviceController) PostMixedwaterlinkage() {
  437. params := new(models.SendSplitCommandParams)
  438. if err := parseBody(a.Ctx, params); err != nil {
  439. badRequest(a.Ctx, err)
  440. return
  441. }
  442. err := a.Service.SetMixedWaterLinkage(*params)
  443. if err != nil {
  444. responseError(a.Ctx, ErrNormal, err.Error())
  445. return
  446. }
  447. done(a.Ctx, params.DeviceId)
  448. }
  449. // Put 更新
  450. // PUT /device
  451. func (a *DeviceController) Put() {
  452. params := new(models.Device)
  453. if err := parseBody(a.Ctx, params); err != nil {
  454. badRequest(a.Ctx, err)
  455. return
  456. }
  457. if err := a.Service.Update(params); err != nil {
  458. responseError(a.Ctx, ErrDatabase, err.Error())
  459. return
  460. }
  461. done(a.Ctx, "已保存")
  462. }
  463. // PostSendcommand 下发指令
  464. // POST /device/sendcommand
  465. func (a *DeviceController) PostSendcommand() {
  466. params := new(models.SendCommandParams)
  467. if err := parseBody(a.Ctx, params); err != nil {
  468. badRequest(a.Ctx, err)
  469. return
  470. }
  471. err := a.Service.SendCommand(rpcs.ArgsSendCommand{
  472. DeviceId: params.DeviceId,
  473. SubDevice: params.SunDeviceId,
  474. Cmd: params.Cmd,
  475. Params: params.Params,
  476. })
  477. if err != nil {
  478. responseError(a.Ctx, ErrNormal, err.Error())
  479. return
  480. }
  481. done(a.Ctx, params.DeviceId)
  482. }
  483. // GetAllScenes 获取所有的场景
  484. // POST /device/allscenes
  485. func (a *DeviceController) GetAllScenes() {
  486. // proid, err := a.Ctx.URLParamInt("proid")
  487. // if err != nil {
  488. // proid = 0
  489. // }
  490. params := new(scene.GetSceneParams)
  491. datas, err := a.Service.GetScenes(*params)
  492. if err != nil {
  493. responseError(a.Ctx, ErrDatabase, err.Error())
  494. return
  495. }
  496. done(a.Ctx, map[string]interface{}{
  497. "chart": datas,
  498. })
  499. }