cdata.go 38 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180
  1. package controllers
  2. import (
  3. "fmt"
  4. "strconv"
  5. "time"
  6. validation "github.com/go-ozzo/ozzo-validation/v4"
  7. "github.com/astaxie/beego"
  8. "lc/common/models"
  9. "lc/common/util"
  10. )
  11. // 各种统计数据
  12. const (
  13. DevStatusPrefix string = "dev_stat_"
  14. DevDataPrefix string = "dev_data_"
  15. ONLINE string = "online"
  16. TLast string = "tlast"
  17. //TIME string = "time"
  18. )
  19. type DataController struct {
  20. BaseController
  21. }
  22. // ReqHisData 历史数据
  23. type ReqHisData struct {
  24. Code string `json:"code"` //设备编码
  25. Sids []uint16 `json:"sids"` //SID编号
  26. Start string `json:"start"`
  27. End string `json:"end"`
  28. Type int `json:"type"` //1:每小时数据;2:每天数据
  29. }
  30. // ReqBHisData 多设备历史数据
  31. type ReqBHisData struct {
  32. Codes []string `json:"codes"` //设备编码
  33. Start string `json:"start"`
  34. End string `json:"end"`
  35. Type int `json:"type"` //1:每小时数据;2:每天数据
  36. }
  37. type HisData struct {
  38. Time util.MLTime `json:"time"`
  39. Val float32 `json:"val"`
  40. ValMin float32 `json:"minval"`
  41. ValMax float32 `json:"maxval"`
  42. }
  43. type RespHisData struct {
  44. Code string `json:"code"` //设备编码
  45. MapData map[uint16][]HisData `json:"data"` //sid->数据
  46. }
  47. type RespBHisData struct {
  48. MapData map[string]map[uint16][]HisData `json:"data"` //sid->数据
  49. }
  50. // ReqRTData 实时数据
  51. type ReqRTData struct {
  52. Codes []string `json:"codes"` //设备编码列表
  53. }
  54. type RTData struct {
  55. Time util.MLTime `json:"time"`
  56. Data map[uint16]float32 `json:"data"`
  57. }
  58. type RTStatus struct {
  59. Online int `json:"online"`
  60. Time util.MLTime `json:"time"`
  61. }
  62. // ReqAlarmData 告警数据
  63. type ReqAlarmData struct {
  64. Codes []string `json:"codes"` //设备编码
  65. Flag int `json:"flag"` //0所有告警,1结束的告警,2未结束的告警
  66. }
  67. type RespAlarm struct {
  68. ID int64 `json:"id"`
  69. DID string `json:"code"`
  70. TStart util.MLTime `json:"tstart"`
  71. TEnd util.MLTime `json:"tend,omitempty"`
  72. Content string `json:"content"` //告警内容
  73. AlarmType uint16 `json:"alarmtype"` //告警类型
  74. Level uint8 `json:"level"` //告警等级,0:普通,1:重要,2:严重
  75. Threshold float32 `json:"threshold"`
  76. Value float32 `json:"value"`
  77. Sid uint16 `json:"sid"` //sid,对应物模型的sid
  78. Cid int `json:"cid"` //策略编号
  79. Cname string `json:"cname"` //策略名称
  80. UpdatedAt util.MLTime `json:"updatedat"` //更新时间
  81. }
  82. // ReqEnergy 能耗数据
  83. type ReqEnergy struct {
  84. Codes []string `json:"codes"`
  85. Start string `json:"start"`
  86. End string `json:"end"`
  87. Flag int `json:"flag"` //1:每日数据;2:每月数据
  88. }
  89. type RespEnergy struct {
  90. Date string `json:"date"`
  91. Beginning float32 `json:"beginning"`
  92. Ending float32 `json:"ending"`
  93. Difference float32 `json:"difference"`
  94. }
  95. // ReqLightingRate 亮灯率数据
  96. type ReqLightingRate struct {
  97. Tenant string `json:"tenant"`
  98. Start string `json:"start"`
  99. End string `json:"end"`
  100. Quarter int `json:"quarter"`
  101. Flag int `json:"flag"`
  102. }
  103. func (a ReqLightingRate) Validate() error {
  104. return validation.ValidateStruct(&a,
  105. validation.Field(&a.Tenant, validation.Required, validation.Length(4, 8)),
  106. validation.Field(&a.Start, validation.Required, validation.Date("2006-01-02")),
  107. validation.Field(&a.End, validation.Required, validation.Date("2006-01-02")),
  108. validation.Field(&a.Quarter, validation.In(0, 1, 2, 3, 4)),
  109. validation.Field(&a.Flag, validation.In(0, 1, 2, 3)),
  110. )
  111. }
  112. // ReqVehicleData 请求抓拍单元统计数据
  113. type ReqVehicleData struct {
  114. Codes []string `json:"codes"`
  115. Start string `json:"start"`
  116. End string `json:"end"`
  117. Types []int `json:"types"`
  118. Flag int `json:"flag"`
  119. }
  120. func (a ReqVehicleData) Validate() error {
  121. return validation.ValidateStruct(&a,
  122. validation.Field(&a.Codes, validation.Length(1, 0)),
  123. validation.Field(&a.Start, validation.Required, validation.Date("2006-01-02 15:04:05")),
  124. validation.Field(&a.End, validation.Required, validation.Date("2006-01-02 15:04:05")),
  125. validation.Field(&a.Flag, validation.In(0, 1, 2, 3)),
  126. )
  127. }
  128. type DayLightingRateData struct {
  129. Date string `json:"date"`
  130. Total int `json:"total"`
  131. Number int `json:"number"`
  132. Rate float64 `json:"rate"`
  133. }
  134. type RespDayLightingRateData struct {
  135. Tenant string `json:"tenant"`
  136. Flag int `json:"flag"`
  137. Data []DayLightingRateData `json:"data"`
  138. }
  139. type MonthLightingRate struct {
  140. Month string `json:"month"`
  141. Rate float64 `json:"rate"`
  142. }
  143. type RespMonthLightingRate struct {
  144. Tenant string `json:"tenant"`
  145. Flag int `json:"flag"`
  146. Data []MonthLightingRate `json:"data"`
  147. }
  148. type QuarterLightingRate struct {
  149. Quarter string `json:"quarter"`
  150. Rate float64 `json:"rate"`
  151. }
  152. type RespQuarterLightingRate struct {
  153. Tenant string `json:"tenant"`
  154. Flag int `json:"flag"`
  155. Data []QuarterLightingRate `json:"data"`
  156. }
  157. type YearLightingRate struct {
  158. Year string `json:"year"`
  159. Rate float64 `json:"rate"`
  160. }
  161. type RespYearLightingRate struct {
  162. Tenant string `json:"tenant"`
  163. Flag int `json:"flag"`
  164. Data []YearLightingRate `json:"data"`
  165. }
  166. type ReqSosAlarm struct {
  167. Tenant string `json:"tenant"`
  168. Start string `json:"start"`
  169. End string `json:"end"`
  170. Codes []string `json:"codes"`
  171. }
  172. type RespSosAlarm struct {
  173. ID int64 `json:"id"`
  174. DID string `json:"code"`
  175. TStart util.MLTime `json:"tstart"`
  176. TEnd util.MLTime `json:"tend,omitempty"`
  177. Duration uint `json:"duration"`
  178. UpdatedAt util.MLTime `json:"updatedat"` //更新时间
  179. }
  180. type ReqLampEvent struct {
  181. Tenant string `json:"tenant"`
  182. Start string `json:"start"`
  183. End string `json:"end"`
  184. Codes []string `json:"codes"`
  185. }
  186. type RespLampEvent struct {
  187. ID int64 `json:"id"`
  188. DID string `json:"code"`
  189. TStart util.MLTime `json:"tstart"`
  190. TEnd util.MLTime `json:"tend,omitempty"`
  191. Brightness uint8 `json:"brightness"`
  192. Duration uint `json:"duration"`
  193. UpdatedAt util.MLTime `json:"updatedat"` //更新时间
  194. }
  195. // ReqRadarDataList 雷达详细数据
  196. type ReqRadarDataList struct {
  197. Codes []string `json:"codes"` //设备编码
  198. Start string `json:"start"`
  199. End string `json:"end"`
  200. Model uint8 `json:"model"` //类型 0点目标 1车目标 所有目标2
  201. }
  202. type RadarData struct {
  203. Time util.MLTime `json:"time"`
  204. Model uint8 `json:"model"`
  205. Speed float64 `json:"speed"`
  206. Dist float64 `json:"dist"`
  207. }
  208. // ReqRadarSummaryData 雷达统计数据
  209. type ReqRadarSummaryData struct {
  210. Codes []string `json:"codes"` //设备编码
  211. Start string `json:"start"`
  212. End string `json:"end"`
  213. Type uint8 `json:"type"` //1:小时数据,每个网关、雷达每小时有一条数据2:日数据,每个网关、雷达每天有一条数据
  214. Model uint8 `json:"model"` //类型 0点目标 1车目标 所有目标2
  215. }
  216. type RadarSummaryData struct {
  217. Time util.MLTime `json:"time"`
  218. Model uint8 `json:"model"`
  219. OverSpeedNumber int `json:"over_speed_number"` // 超速数量
  220. Speed20Number int `json:"speed0_20_number"` // 0-20 速度区间数量
  221. Speed40Number int `json:"speed20_40_number"` // 20-40 速度区间数量
  222. Speed60Number int `json:"speed40_60_number"` // 40-60 速度区间数量
  223. Speed80Number int `json:"speed60_80_number"` // 60-80 速度区间数量
  224. Speed100Number int `json:"speed80_100_number"` // 80-100 速度区间数量
  225. Speed120Number int `json:"speed100_120_number"` // 100-120 速度区间数量
  226. SpeedMaxNumber int `json:"speed_over120_number"` // >120 速度区间数量
  227. Total int `json:"total"`
  228. }
  229. // History @Title 获取历史数据
  230. // @Description 获取历史数据
  231. // @Param body controllers.ReqHisData true "请求参数"
  232. // @Success 0 {int} BaseResponse.Code "成功"
  233. // @Failure 1 {int} BaseResponse.Code "失败"
  234. // @router /v1/history [post]
  235. func (o *DataController) History() {
  236. var obj ReqHisData
  237. if err := json.Unmarshal(o.Ctx.Input.RequestBody, &obj); err != nil {
  238. //beego.Debug(string(o.Ctx.Input.RequestBody))
  239. //beego.Error(fmt.Sprintf("数据包解析错误:%s", err.Error()))
  240. o.Response(Failure, fmt.Sprintf("数据包解析错误:%s", err.Error()), nil)
  241. return
  242. }
  243. ret := RespHisData{
  244. Code: obj.Code,
  245. MapData: make(map[uint16][]HisData),
  246. }
  247. if obj.Type == 1 {
  248. arr, err := models.GetDeviceHourData(obj.Code, obj.Start, obj.End, obj.Sids)
  249. if err != nil {
  250. o.Response(Failure, fmt.Sprintf("数据查询错误:%s", err.Error()), nil)
  251. return
  252. }
  253. for _, v := range arr {
  254. d := HisData{
  255. Time: util.MLTime(v.Time),
  256. Val: v.Val,
  257. }
  258. ret.MapData[v.Sid] = append(ret.MapData[v.Sid], d)
  259. }
  260. } else if obj.Type == 2 {
  261. arr, err := models.GetDeviceDayData(obj.Code, obj.Start, obj.End, obj.Sids)
  262. if err != nil {
  263. o.Response(Failure, fmt.Sprintf("数据查询错误:%s", err.Error()), nil)
  264. return
  265. }
  266. for _, v := range arr {
  267. d := HisData{
  268. Time: util.MLTime(v.Time),
  269. Val: v.ValAvg,
  270. ValMin: v.ValMin,
  271. ValMax: v.ValMax,
  272. }
  273. ret.MapData[v.Sid] = append(ret.MapData[v.Sid], d)
  274. }
  275. }
  276. o.Response(Success, "成功", ret)
  277. }
  278. // BatchHistory @Title 获取多设备历史数据
  279. // @Description 获取多设备历史数据
  280. // @Param body controllers.ReqHisData true "请求参数"
  281. // @Success 0 {int} BaseResponse.Code "成功"
  282. // @Failure 1 {int} BaseResponse.Code "失败"
  283. // @router /v1/bhistory [post]
  284. func (o *DataController) BatchHistory() {
  285. var obj ReqBHisData
  286. if err := json.Unmarshal(o.Ctx.Input.RequestBody, &obj); err != nil {
  287. //beego.Debug(string(o.Ctx.Input.RequestBody))
  288. //beego.Error(fmt.Sprintf("数据包解析错误:%s", err.Error()))
  289. o.Response(Failure, fmt.Sprintf("数据包解析错误:%s", err.Error()), nil)
  290. return
  291. }
  292. ret := RespBHisData{
  293. MapData: make(map[string]map[uint16][]HisData),
  294. }
  295. if obj.Type == 1 {
  296. arr, err := models.GetBDeviceHourData(obj.Codes, obj.Start, obj.End)
  297. if err != nil {
  298. o.Response(Failure, fmt.Sprintf("数据查询错误:%s", err.Error()), nil)
  299. return
  300. }
  301. for _, v := range arr {
  302. d := HisData{
  303. Time: util.MLTime(v.Time),
  304. Val: v.Val,
  305. }
  306. if m, ok := ret.MapData[v.ID]; !ok {
  307. m = make(map[uint16][]HisData)
  308. m[v.Sid] = append(m[v.Sid], d)
  309. ret.MapData[v.ID] = m
  310. } else {
  311. m[v.Sid] = append(m[v.Sid], d)
  312. }
  313. }
  314. } else if obj.Type == 2 {
  315. arr, err := models.GetBDeviceDayData(obj.Codes, obj.Start, obj.End)
  316. if err != nil {
  317. o.Response(Failure, fmt.Sprintf("数据查询错误:%s", err.Error()), nil)
  318. return
  319. }
  320. for _, v := range arr {
  321. d := HisData{
  322. Time: util.MLTime(v.Time),
  323. Val: v.ValAvg,
  324. ValMin: v.ValMin,
  325. ValMax: v.ValMax,
  326. }
  327. if m, ok := ret.MapData[v.ID]; !ok {
  328. m = make(map[uint16][]HisData)
  329. m[v.Sid] = append(m[v.Sid], d)
  330. ret.MapData[v.ID] = m
  331. } else {
  332. m[v.Sid] = append(m[v.Sid], d)
  333. }
  334. }
  335. }
  336. o.Response(Success, "成功", ret)
  337. }
  338. // Realtime @Title 获取实时数据
  339. // @Description 获取历史数据
  340. // @Param body map[string]controllers.RTData true "请求参数"
  341. // @Success 0 {int} BaseResponse.Code "成功"
  342. // @Failure 1 {int} BaseResponse.Code "失败"
  343. // @router /v1/realtime [post]
  344. func (o *DataController) Realtime() {
  345. var obj ReqRTData
  346. err := json.Unmarshal(o.Ctx.Input.RequestBody, &obj)
  347. if err != nil {
  348. beego.Debug(string(o.Ctx.Input.RequestBody))
  349. beego.Error(fmt.Sprintf("数据包解析错误:%s", err.Error()))
  350. o.Response(Failure, fmt.Sprintf("数据包解析错误:%s", err.Error()), nil)
  351. return
  352. }
  353. ret := make(map[string]*RTData)
  354. for _, v0 := range obj.Codes {
  355. var rtdata RTData
  356. rtdata.Data = make(map[uint16]float32)
  357. if mapdata, err := redisCltRawdata.HGetAll(DevDataPrefix + v0).Result(); err == nil {
  358. for k, v1 := range mapdata {
  359. if k == TIME {
  360. if t, err := util.MlParseTime(v1); err == nil {
  361. rtdata.Time = util.MLTime(t)
  362. }
  363. } else {
  364. if sid, err := strconv.Atoi(k); err == nil {
  365. if fval, err := strconv.ParseFloat(v1, 64); err == nil {
  366. rtdata.Data[uint16(sid)] = float32(fval)
  367. }
  368. }
  369. }
  370. }
  371. //时间和数据均有,则返回给调用方
  372. if !time.Time(rtdata.Time).IsZero() && len(rtdata.Data) > 0 {
  373. ret[v0] = &rtdata
  374. }
  375. }
  376. }
  377. o.Response(Success, "成功", ret)
  378. }
  379. // RealtimestatusGet @Title 获取实时状态
  380. // @Description 获取实时状态
  381. // @Param body controllers.ReqRTData true "请求参数"
  382. // @Success 0 {int} BaseResponse.Code "成功"
  383. // @Failure 1 {int} BaseResponse.Code "失败"
  384. // @router /v1/rtstatus [post]
  385. func (o *DataController) RealtimestatusGet() {
  386. var obj ReqRTData
  387. err := json.Unmarshal(o.Ctx.Input.RequestBody, &obj)
  388. if err != nil {
  389. beego.Debug(string(o.Ctx.Input.RequestBody))
  390. beego.Error(fmt.Sprintf("数据包解析错误:%s", err.Error()))
  391. o.Response(Failure, fmt.Sprintf("数据包解析错误:%s", err.Error()), nil)
  392. return
  393. }
  394. ret := make(map[string]*RTStatus)
  395. for _, v0 := range obj.Codes {
  396. if mapdata, err := redisCltRawdata.HGetAll(DevStatusPrefix + v0).Result(); err == nil {
  397. var rtstatus RTStatus
  398. for k, v1 := range mapdata {
  399. if k == TLast {
  400. if t, err := util.MlParseTime(v1); err == nil {
  401. rtstatus.Time = util.MLTime(t)
  402. }
  403. } else if k == ONLINE {
  404. if n, err := strconv.Atoi(v1); err == nil {
  405. rtstatus.Online = n
  406. }
  407. }
  408. }
  409. ret[v0] = &rtstatus
  410. }
  411. }
  412. o.Response(Success, "成功", ret)
  413. }
  414. // AlarmSync @Title 同步告警数据
  415. // @Description 同步告警数据
  416. // @Param body body controllers.ReqAlarmData true "请求参数"
  417. // @Success 0 {int} BaseResponse.Code "成功"
  418. // @Failure 1 {int} BaseResponse.Code "失败"
  419. // @router /v1/alarm/sync [get]
  420. func (o *DataController) AlarmSync() {
  421. id, _ := o.GetUint64("id") //ID
  422. updatedat := o.GetString("updatedat") //更新时间
  423. arr, err := models.GetUpdateAlarm(id, updatedat)
  424. if err != nil {
  425. o.Response(Failure, fmt.Sprintf("数据查询错误:%s", err.Error()), nil)
  426. return
  427. }
  428. ret := make([]RespAlarm, 0, len(arr))
  429. for _, v := range arr {
  430. oo := RespAlarm{
  431. ID: v.ID,
  432. DID: v.DID,
  433. TStart: util.MLTime(v.TStart),
  434. TEnd: util.MLTime(v.TEnd),
  435. Content: v.Content,
  436. AlarmType: v.AlarmType,
  437. Level: v.Level,
  438. Threshold: v.Threshold,
  439. Value: v.SValue,
  440. Sid: v.Sid,
  441. Cid: int(v.Cid),
  442. Cname: v.Cname,
  443. UpdatedAt: util.MLTime(v.UpdatedAt),
  444. }
  445. ret = append(ret, oo)
  446. }
  447. o.Response(Success, "成功", ret)
  448. }
  449. // Alarm @Title 获取告警数据
  450. // @Description 获取告警数据
  451. // @Param body controllers.ReqAlarmData true "请求参数"
  452. // @Success 0 {int} BaseResponse.Code "成功"
  453. // @Failure 1 {int} BaseResponse.Code "失败"
  454. // @router /v1/alarm [post]
  455. func (o *DataController) Alarm() {
  456. var obj ReqAlarmData
  457. if err := json.Unmarshal(o.Ctx.Input.RequestBody, &obj); err != nil {
  458. beego.Error(fmt.Sprintf("数据包解析错误:%s", err.Error()))
  459. o.Response(Failure, fmt.Sprintf("数据包解析错误:%s", err.Error()), nil)
  460. return
  461. }
  462. arr, err := models.GetAlarmByCodes(obj.Codes, obj.Flag)
  463. if err != nil {
  464. o.Response(Failure, fmt.Sprintf("数据查询错误:%s", err.Error()), nil)
  465. return
  466. }
  467. ret := make([]RespAlarm, 0, len(arr))
  468. for _, v := range arr {
  469. oo := RespAlarm{
  470. ID: v.ID,
  471. DID: v.DID,
  472. TStart: util.MLTime(v.TStart),
  473. TEnd: util.MLTime(v.TEnd),
  474. Content: v.Content,
  475. AlarmType: v.AlarmType,
  476. Level: v.Level,
  477. Threshold: v.Threshold,
  478. Value: v.SValue,
  479. Sid: v.Sid,
  480. Cid: int(v.Cid),
  481. Cname: v.Cname,
  482. UpdatedAt: util.MLTime(v.UpdatedAt),
  483. }
  484. ret = append(ret, oo)
  485. }
  486. o.Response(Success, "成功", ret)
  487. }
  488. // Energy @Title 获取能耗数据
  489. // @Description 获取能耗数据
  490. // @Param body controllers.ReqEnergy true "请求参数"
  491. // @Success 0 {int} BaseResponse.Code "成功"
  492. // @Failure 1 {int} BaseResponse.Code "失败"
  493. // @router /v1/energy [post]
  494. func (o *DataController) Energy() {
  495. var obj ReqEnergy
  496. if err := json.Unmarshal(o.Ctx.Input.RequestBody, &obj); err != nil {
  497. beego.Error(fmt.Sprintf("数据包解析错误:%s", err.Error()))
  498. o.Response(Failure, fmt.Sprintf("数据包解析错误:%s", err.Error()), nil)
  499. return
  500. }
  501. ret := make(map[string][]RespEnergy)
  502. if obj.Flag == 1 {
  503. arr, err := models.GetDeviceEnergyDayData(obj.Codes, obj.Start, obj.End)
  504. if err != nil {
  505. o.Response(Failure, fmt.Sprintf("数据查询错误:%s", err.Error()), nil)
  506. return
  507. }
  508. for _, v := range arr {
  509. en := RespEnergy{
  510. Date: v.Date.Format("2006-01-02"),
  511. Beginning: v.Beginning,
  512. Ending: v.Ending,
  513. Difference: v.Difference,
  514. }
  515. ret[v.ID] = append(ret[v.ID], en)
  516. }
  517. } else if obj.Flag == 2 {
  518. arr, err := models.GetDeviceEnergyMonthData(obj.Codes, obj.Start, obj.End)
  519. if err != nil {
  520. o.Response(Failure, fmt.Sprintf("数据查询错误:%s", err.Error()), nil)
  521. return
  522. }
  523. for _, v := range arr {
  524. en := RespEnergy{
  525. Date: v.Date.Format("2006-01-02"),
  526. Beginning: v.Beginning,
  527. Ending: v.Ending,
  528. Difference: v.Difference,
  529. }
  530. ret[v.ID] = append(ret[v.ID], en)
  531. }
  532. } else {
  533. o.Response(Failure, fmt.Sprintf("flag为不支持的标识:flag=", obj.Flag), nil)
  534. return
  535. }
  536. o.Response(Success, "成功", ret)
  537. }
  538. // LightingRate @Title 获取亮灯率
  539. // @Description 获取亮灯率
  540. // @Param body controllers.ReqLightingRate true "请求参数"
  541. // @Success 0 {int} BaseResponse.Code "成功"
  542. // @Failure 1 {int} BaseResponse.Code "失败"
  543. // @router /v1/lightingrate [post]
  544. func (o *DataController) LightingRate() {
  545. var obj ReqLightingRate
  546. if err := json.Unmarshal(o.Ctx.Input.RequestBody, &obj); err != nil {
  547. beego.Error(fmt.Sprintf("数据包解析错误:%s", err.Error()))
  548. o.Response(Failure, fmt.Sprintf("数据包解析错误:%s", err.Error()), nil)
  549. return
  550. }
  551. if err := obj.Validate(); err != nil {
  552. beego.Error(fmt.Sprintf("请求参数验证失败:%s", err.Error()))
  553. o.Response(Failure, fmt.Sprintf("请求参数验证失败:%s", err.Error()), nil)
  554. return
  555. }
  556. ret := RespDayLightingRateData{
  557. Tenant: obj.Tenant,
  558. Flag: obj.Flag,
  559. }
  560. if obj.Flag == 0 {
  561. arr, err := models.GetDayLightingRateData(obj.Tenant, obj.Start, obj.End)
  562. if err == nil { //日
  563. Data := make([]DayLightingRateData, 0, len(arr))
  564. for _, v := range arr {
  565. lrd := DayLightingRateData{
  566. Date: v.Date.Format("2006-01-02"),
  567. Total: v.Total,
  568. Number: v.Number,
  569. Rate: float64(v.Rate),
  570. }
  571. Data = append(Data, lrd)
  572. }
  573. o.Response(Success, "成功", RespDayLightingRateData{Tenant: obj.Tenant, Flag: obj.Flag, Data: Data})
  574. }
  575. } else if obj.Flag == 1 { //月
  576. ts, _ := time.Parse("2006-01-02", obj.Start)
  577. te, _ := time.Parse("2006-01-02", obj.End)
  578. arr, err := models.GetMonthLightingRateData(obj.Tenant, ts.Format("2006-01"), te.Format("2006-01"))
  579. if err == nil {
  580. Data := make([]MonthLightingRate, 0, len(arr))
  581. for _, v := range arr {
  582. Data = append(Data, MonthLightingRate{Month: v.Time, Rate: float64(v.Rate)})
  583. }
  584. o.Response(Success, "成功", RespMonthLightingRate{Tenant: obj.Tenant, Flag: obj.Flag, Data: Data})
  585. }
  586. } else if obj.Flag == 2 { //季度
  587. ts, _ := time.Parse("2006-01-02", obj.Start)
  588. te, _ := time.Parse("2006-01-02", obj.End)
  589. arr, err := models.GetQuarterLightingRateData(obj.Tenant, ts.Format("2006"), te.Format("2006"), obj.Quarter)
  590. if err == nil {
  591. Data := make([]QuarterLightingRate, 0, len(arr))
  592. for _, v := range arr {
  593. Data = append(Data, QuarterLightingRate{Quarter: v.Time, Rate: float64(v.Rate)})
  594. }
  595. o.Response(Success, "成功", RespQuarterLightingRate{Tenant: obj.Tenant, Flag: obj.Flag, Data: Data})
  596. }
  597. } else if obj.Flag == 3 { //年度
  598. ts, _ := time.Parse("2006-01-02", obj.Start)
  599. te, _ := time.Parse("2006-01-02", obj.End)
  600. arr, err := models.GetYearLightingRateData(obj.Tenant, ts.Format("2006"), te.Format("2006"))
  601. if err == nil {
  602. Data := make([]YearLightingRate, 0, len(arr))
  603. for _, v := range arr {
  604. Data = append(Data, YearLightingRate{Year: v.Time, Rate: float64(v.Rate)})
  605. }
  606. o.Response(Success, "成功", RespYearLightingRate{Tenant: obj.Tenant, Flag: obj.Flag, Data: Data})
  607. }
  608. }
  609. o.Response(Success, "成功", ret)
  610. }
  611. // Sos @Title 获取一键求助报警记录
  612. // @Description 获取一键求助报警记录
  613. // @Param body body controllers.ReqSosAlarm true "请求参数"
  614. // @Success 0 {int} BaseResponse.Code "成功"
  615. // @Failure 1 {int} BaseResponse.Code "失败"
  616. // @router /v1/sos [post]
  617. func (o *DataController) Sos() {
  618. var obj ReqSosAlarm
  619. if err := json.Unmarshal(o.Ctx.Input.RequestBody, &obj); err != nil {
  620. beego.Error(fmt.Sprintf("数据包解析错误:%s", err.Error()))
  621. o.Response(Failure, fmt.Sprintf("数据包解析错误:%s", err.Error()), nil)
  622. return
  623. }
  624. arr, err := models.GetSosAlarm(obj.Codes, obj.Start, obj.End)
  625. if err != nil {
  626. o.Response(Failure, fmt.Sprintf("数据查询错误:%s", err.Error()), nil)
  627. return
  628. }
  629. ret := make([]RespSosAlarm, 0, len(arr))
  630. var duration uint = 0
  631. for _, v := range arr {
  632. if v.TEnd.IsZero() {
  633. duration = 0
  634. } else {
  635. duration = uint(v.TEnd.Sub(v.TStart).Seconds())
  636. }
  637. oo := RespSosAlarm{
  638. ID: v.ID,
  639. DID: v.DID,
  640. TStart: util.MLTime(v.TStart),
  641. TEnd: util.MLTime(v.TEnd),
  642. Duration: duration,
  643. UpdatedAt: util.MLTime(v.UpdatedAt),
  644. }
  645. ret = append(ret, oo)
  646. }
  647. o.Response(Success, "成功", ret)
  648. }
  649. // SosSync @Title 同步一键求助报警记录
  650. // @Description 同步一键求助报警记录
  651. // @Param body controllers.ReqAlarmData true "请求参数"
  652. // @Success 0 {int} BaseResponse.Code "成功"
  653. // @Failure 1 {int} BaseResponse.Code "失败"
  654. // @router /v1/sos/sync [get]
  655. func (o *DataController) SosSync() {
  656. id, _ := o.GetUint64("id") //ID
  657. updatedat := o.GetString("updatedat") //更新时间
  658. arr, err := models.GetUpdateSosAlarm(id, updatedat)
  659. if err != nil {
  660. o.Response(Failure, fmt.Sprintf("数据查询错误:%s", err.Error()), nil)
  661. return
  662. }
  663. ret := make([]RespSosAlarm, 0, len(arr))
  664. var duration uint = 0
  665. for _, v := range arr {
  666. if v.TEnd.IsZero() {
  667. duration = 0
  668. } else {
  669. duration = uint(v.TEnd.Sub(v.TStart).Seconds())
  670. }
  671. oo := RespSosAlarm{
  672. ID: v.ID,
  673. DID: v.DID,
  674. TStart: util.MLTime(v.TStart),
  675. TEnd: util.MLTime(v.TEnd),
  676. Duration: duration,
  677. UpdatedAt: util.MLTime(v.UpdatedAt),
  678. }
  679. ret = append(ret, oo)
  680. }
  681. o.Response(Success, "成功", ret)
  682. }
  683. // LampEvent @Title 获取开关灯记录
  684. // @Description 获取开关灯记录
  685. // @Param body body controllers.ReqLampEvent true "请求参数"
  686. // @Success 0 {int} BaseResponse.Code "成功"
  687. // @Failure 1 {int} BaseResponse.Code "失败"
  688. // @router /v1/lampevent [post]
  689. func (o *DataController) LampEvent() {
  690. var obj ReqLampEvent
  691. if err := json.Unmarshal(o.Ctx.Input.RequestBody, &obj); err != nil {
  692. beego.Error(fmt.Sprintf("数据包解析错误:%s", err.Error()))
  693. o.Response(Failure, fmt.Sprintf("数据包解析错误:%s", err.Error()), nil)
  694. return
  695. }
  696. arr, err := models.GetLampEvents(obj.Codes, obj.Start, obj.End)
  697. if err != nil {
  698. o.Response(Failure, fmt.Sprintf("数据查询错误:%s", err.Error()), nil)
  699. return
  700. }
  701. ret := make([]RespLampEvent, 0, len(arr))
  702. var duration uint = 0
  703. for _, v := range arr {
  704. if v.TEnd.IsZero() {
  705. duration = 0
  706. } else {
  707. duration = uint(v.TEnd.Sub(v.TStart).Minutes())
  708. }
  709. oo := RespLampEvent{
  710. ID: int64(v.ID),
  711. DID: v.DID,
  712. TStart: util.MLTime(v.TStart),
  713. TEnd: util.MLTime(v.TEnd),
  714. Brightness: v.Brightness,
  715. Duration: duration,
  716. UpdatedAt: util.MLTime(v.UpdatedAt),
  717. }
  718. ret = append(ret, oo)
  719. }
  720. o.Response(Success, "成功", ret)
  721. }
  722. // LampEventSync @Title 同步开关灯记录
  723. // @Description 同步开关灯记录
  724. // @Param body body controllers.ReqAlarmData true "请求参数"
  725. // @Success 0 {int} BaseResponse.Code "成功"
  726. // @Failure 1 {int} BaseResponse.Code "失败"
  727. // @router /v1/lampevent/sync [get]
  728. func (o *DataController) LampEventSync() {
  729. id, _ := o.GetUint64("id") //ID
  730. updatedat := o.GetString("updatedat") //更新时间
  731. arr, err := models.GetUpdateLampEvents(id, updatedat)
  732. if err != nil {
  733. o.Response(Failure, fmt.Sprintf("数据查询错误:%s", err.Error()), nil)
  734. return
  735. }
  736. ret := make([]RespLampEvent, 0, len(arr))
  737. var duration uint = 0
  738. for _, v := range arr {
  739. if v.TEnd.IsZero() {
  740. duration = 0
  741. } else {
  742. duration = uint(v.TEnd.Sub(v.TStart).Seconds())
  743. }
  744. oo := RespLampEvent{
  745. ID: int64(v.ID),
  746. DID: v.DID,
  747. TStart: util.MLTime(v.TStart),
  748. TEnd: util.MLTime(v.TEnd),
  749. Brightness: v.Brightness,
  750. Duration: duration,
  751. UpdatedAt: util.MLTime(v.UpdatedAt),
  752. }
  753. ret = append(ret, oo)
  754. }
  755. o.Response(Success, "成功", ret)
  756. }
  757. // VehicleProvince @Title 获取车流量分省统计数据
  758. // @Description 获取车流量分省统计数据
  759. // @Param body controllers.ReqVehicleData true "请求参数"
  760. // @Success 0 {int} BaseResponse.Code "成功"
  761. // @Failure 1 {int} BaseResponse.Code "失败"
  762. // @router /v1/its/province [post]
  763. func (o *DataController) VehicleProvince() {
  764. var obj ReqVehicleData
  765. if err := json.Unmarshal(o.Ctx.Input.RequestBody, &obj); err != nil {
  766. beego.Error(fmt.Sprintf("数据包解析错误:%s", err.Error()))
  767. o.Response(Failure, fmt.Sprintf("数据包解析错误:%s", err.Error()), nil)
  768. return
  769. }
  770. if err := obj.Validate(); err != nil {
  771. beego.Error(fmt.Sprintf("请求参数校验错误:%s", err.Error()))
  772. o.Response(Failure, fmt.Sprintf("请求参数校验错误:%s", err.Error()), nil)
  773. return
  774. }
  775. arr, err := models.GetVehicleProvince(obj.Codes, obj.Start, obj.End, obj.Flag)
  776. if err != nil {
  777. o.Response(Failure, fmt.Sprintf("数据查询错误:%s", err.Error()), nil)
  778. return
  779. }
  780. o.Response(Success, "成功", arr)
  781. }
  782. // VehicleCity @Title 获取车流量分城市统计数据
  783. // @Description 获取车流量分城市统计数据
  784. // @Param body controllers.ReqVehicleData true "请求参数"
  785. // @Success 0 {int} BaseResponse.Code "成功"
  786. // @Failure 1 {int} BaseResponse.Code "失败"
  787. // @router /v1/its/provincecity [post]
  788. func (o *DataController) VehicleCity() {
  789. var obj ReqVehicleData
  790. if err := json.Unmarshal(o.Ctx.Input.RequestBody, &obj); err != nil {
  791. beego.Error(fmt.Sprintf("数据包解析错误:%s", err.Error()))
  792. o.Response(Failure, fmt.Sprintf("数据包解析错误:%s", err.Error()), nil)
  793. return
  794. }
  795. if err := obj.Validate(); err != nil {
  796. beego.Error(fmt.Sprintf("请求参数校验错误:%s", err.Error()))
  797. o.Response(Failure, fmt.Sprintf("请求参数校验错误:%s", err.Error()), nil)
  798. return
  799. }
  800. arr, err := models.GetVehicleProvinceCity(obj.Codes, obj.Start, obj.End, obj.Flag)
  801. if err != nil {
  802. o.Response(Failure, fmt.Sprintf("数据查询错误:%s", err.Error()), nil)
  803. return
  804. }
  805. o.Response(Success, "成功", arr)
  806. }
  807. // VehicleType @Title 获取车流量分车型统计数据
  808. // @Description 获取车流量分车型统计数据
  809. // @Param body controllers.ReqVehicleData true "请求参数"
  810. // @Success 0 {int} BaseResponse.Code "成功"
  811. // @Failure 1 {int} BaseResponse.Code "失败"
  812. // @router /v1/its/vehicletype [post]
  813. func (o *DataController) VehicleType() {
  814. var obj ReqVehicleData
  815. if err := json.Unmarshal(o.Ctx.Input.RequestBody, &obj); err != nil {
  816. beego.Error(fmt.Sprintf("数据包解析错误:%s", err.Error()))
  817. o.Response(Failure, fmt.Sprintf("数据包解析错误:%s", err.Error()), nil)
  818. return
  819. }
  820. if err := obj.Validate(); err != nil {
  821. beego.Error(fmt.Sprintf("请求参数校验错误:%s", err.Error()))
  822. o.Response(Failure, fmt.Sprintf("请求参数校验错误:%s", err.Error()), nil)
  823. return
  824. }
  825. arr, err := models.GetVehicleType(obj.Codes, obj.Start, obj.End, obj.Flag)
  826. if err != nil {
  827. o.Response(Failure, fmt.Sprintf("数据查询错误:%s", err.Error()), nil)
  828. return
  829. }
  830. o.Response(Success, "成功", arr)
  831. }
  832. // VehicleTypeEx @Title 获取车流量分车型统计数据
  833. // @Description 获取车流量分车型统计数据
  834. // @Param body controllers.ReqVehicleData true "请求参数"
  835. // @Success 0 {int} BaseResponse.Code "成功"
  836. // @Failure 1 {int} BaseResponse.Code "失败"
  837. // @router /v1/its/vehicletypeex [post]
  838. func (o *DataController) VehicleTypeEx() {
  839. var obj ReqVehicleData
  840. if err := json.Unmarshal(o.Ctx.Input.RequestBody, &obj); err != nil {
  841. beego.Error(fmt.Sprintf("数据包解析错误:%s", err.Error()))
  842. o.Response(Failure, fmt.Sprintf("数据包解析错误:%s", err.Error()), nil)
  843. return
  844. }
  845. if err := obj.Validate(); err != nil {
  846. beego.Error(fmt.Sprintf("请求参数校验错误:%s", err.Error()))
  847. o.Response(Failure, fmt.Sprintf("请求参数校验错误:%s", err.Error()), nil)
  848. return
  849. }
  850. arr, err := models.GetVehicleTypeEx(obj.Codes, obj.Start, obj.End, obj.Types, obj.Flag)
  851. if err != nil {
  852. o.Response(Failure, fmt.Sprintf("数据查询错误:%s", err.Error()), nil)
  853. return
  854. }
  855. o.Response(Success, "成功", arr)
  856. }
  857. // VehicleTotal @Title 获取车流量统计数据
  858. // @Description 获取车流量统计数据
  859. // @Param body controllers.ReqVehicleData true "请求参数"
  860. // @Success 0 {int} BaseResponse.Code "成功"
  861. // @Failure 1 {int} BaseResponse.Code "失败"
  862. // @router /v1/its/vehicletotal [post]
  863. func (o *DataController) VehicleTotal() {
  864. var obj ReqVehicleData
  865. if err := json.Unmarshal(o.Ctx.Input.RequestBody, &obj); err != nil {
  866. beego.Error(fmt.Sprintf("数据包解析错误:%s", err.Error()))
  867. o.Response(Failure, fmt.Sprintf("数据包解析错误:%s", err.Error()), nil)
  868. return
  869. }
  870. if err := obj.Validate(); err != nil {
  871. beego.Error(fmt.Sprintf("请求参数校验错误:%s", err.Error()))
  872. o.Response(Failure, fmt.Sprintf("请求参数校验错误:%s", err.Error()), nil)
  873. return
  874. }
  875. arr, err := models.GetVehicleStreamsTag(obj.Codes, obj.Start, obj.End, obj.Flag)
  876. if err != nil {
  877. o.Response(Failure, fmt.Sprintf("数据查询错误:%s", err.Error()), nil)
  878. return
  879. }
  880. o.Response(Success, "成功", arr)
  881. }
  882. // VehicleHourTotal @Title 获取车流量按小时统计数据
  883. // @Description 获取车流量按小时统计数据
  884. // @Param body controllers.ReqVehicleData true "请求参数"
  885. // @Success 0 {int} BaseResponse.Code "成功"
  886. // @Failure 1 {int} BaseResponse.Code "失败"
  887. // @router /v1/its/vehiclehourtotal [post]
  888. func (o *DataController) VehicleHourTotal() {
  889. var obj ReqVehicleData
  890. if err := json.Unmarshal(o.Ctx.Input.RequestBody, &obj); err != nil {
  891. beego.Error(fmt.Sprintf("数据包解析错误:%s", err.Error()))
  892. o.Response(Failure, fmt.Sprintf("数据包解析错误:%s", err.Error()), nil)
  893. return
  894. }
  895. if err := obj.Validate(); err != nil {
  896. beego.Error(fmt.Sprintf("请求参数校验错误:%s", err.Error()))
  897. o.Response(Failure, fmt.Sprintf("请求参数校验错误:%s", err.Error()), nil)
  898. return
  899. }
  900. arr, err := models.GetVehicleHourTotalTag(obj.Codes, obj.Start, obj.End)
  901. if err != nil {
  902. o.Response(Failure, fmt.Sprintf("数据查询错误:%s", err.Error()), nil)
  903. return
  904. }
  905. o.Response(Success, "成功", arr)
  906. }
  907. // VehicleSpeedTotal @Title 获取速度区间统计数据
  908. // @Description 获取速度区间统计数据
  909. // @Param body controllers.ReqVehicleData true "请求参数"
  910. // @Success 0 {int} BaseResponse.Code "成功"
  911. // @Failure 1 {int} BaseResponse.Code "失败"
  912. // @router /v1/its/vehiclespeedtotal [post]
  913. func (o *DataController) VehicleSpeedTotal() {
  914. var obj ReqVehicleData
  915. if err := json.Unmarshal(o.Ctx.Input.RequestBody, &obj); err != nil {
  916. beego.Error(fmt.Sprintf("数据包解析错误:%s", err.Error()))
  917. o.Response(Failure, fmt.Sprintf("数据包解析错误:%s", err.Error()), nil)
  918. return
  919. }
  920. if err := obj.Validate(); err != nil {
  921. beego.Error(fmt.Sprintf("请求参数校验错误:%s", err.Error()))
  922. o.Response(Failure, fmt.Sprintf("请求参数校验错误:%s", err.Error()), nil)
  923. return
  924. }
  925. arr, err := models.GetVehicleSpeedRange(obj.Codes, obj.Start, obj.End, obj.Flag)
  926. if err != nil {
  927. o.Response(Failure, fmt.Sprintf("数据查询错误:%s", err.Error()), nil)
  928. return
  929. }
  930. o.Response(Success, "成功", arr)
  931. }
  932. // VehicleOverSpeedTotal @Title 获取车辆超速统计数据
  933. // @Description 获取车辆超速统计数据
  934. // @Param body controllers.ReqVehicleData true "请求参数"
  935. // @Success 0 {int} BaseResponse.Code "成功"
  936. // @Failure 1 {int} BaseResponse.Code "失败"
  937. // @router /v1/its/vehicleoverspeedtotal [post]
  938. func (o *DataController) VehicleOverSpeedTotal() {
  939. var obj ReqVehicleData
  940. if err := json.Unmarshal(o.Ctx.Input.RequestBody, &obj); err != nil {
  941. beego.Error(fmt.Sprintf("数据包解析错误:%s", err.Error()))
  942. o.Response(Failure, fmt.Sprintf("数据包解析错误:%s", err.Error()), nil)
  943. return
  944. }
  945. if err := obj.Validate(); err != nil {
  946. beego.Error(fmt.Sprintf("请求参数校验错误:%s", err.Error()))
  947. o.Response(Failure, fmt.Sprintf("请求参数校验错误:%s", err.Error()), nil)
  948. return
  949. }
  950. arr, err := models.GetVehicleOverSpeed(obj.Codes, obj.Start, obj.End, obj.Flag)
  951. if err != nil {
  952. o.Response(Failure, fmt.Sprintf("数据查询错误:%s", err.Error()), nil)
  953. return
  954. }
  955. o.Response(Success, "成功", arr)
  956. }
  957. // VehiclePlate @Title 获取车牌数据
  958. // @Description 获取车牌数据
  959. // @Param body controllers.ReqVehicleData true "请求参数"
  960. // @Success 0 {int} BaseResponse.Code "成功"
  961. // @Failure 1 {int} BaseResponse.Code "失败"
  962. // @router /v1/its/vehicleplate [post]
  963. func (o *DataController) VehiclePlate() {
  964. var obj ReqVehicleData
  965. if err := json.Unmarshal(o.Ctx.Input.RequestBody, &obj); err != nil {
  966. beego.Error(fmt.Sprintf("数据包解析错误:%s", err.Error()))
  967. o.Response(Failure, fmt.Sprintf("数据包解析错误:%s", err.Error()), nil)
  968. return
  969. }
  970. if err := obj.Validate(); err != nil {
  971. beego.Error(fmt.Sprintf("请求参数校验错误:%s", err.Error()))
  972. o.Response(Failure, fmt.Sprintf("请求参数校验错误:%s", err.Error()), nil)
  973. return
  974. }
  975. arr, err := models.GetVehiclePlate(obj.Codes, obj.Start, obj.End, obj.Types)
  976. if err != nil {
  977. o.Response(Failure, fmt.Sprintf("数据查询错误:%s", err.Error()), nil)
  978. return
  979. }
  980. o.Response(Success, "成功", arr)
  981. }
  982. // OverSpeedPlateSync @Title 超速车牌数据同步
  983. // @Description 超速车牌数据同步
  984. // @Param body controllers.ReqAlarmData true "请求参数"
  985. // @Success 0 {int} BaseResponse.Code "成功"
  986. // @Failure 1 {int} BaseResponse.Code "失败"
  987. // @router /v1/its/overspeed/sync [get]
  988. func (o *DataController) OverSpeedPlateSync() {
  989. id, _ := o.GetInt64("id", 0) //ID
  990. start := o.GetString("start") //开始时间
  991. end := o.GetString("end") //结束时间
  992. arr, err := models.GetOverSpeedPlate(id, start, end)
  993. if err != nil {
  994. o.Response(Failure, fmt.Sprintf("数据查询错误:%s", err.Error()), nil)
  995. return
  996. }
  997. o.Response(Success, "成功", arr)
  998. }
  999. // NBIOTData @Title NB-IOT井盖监测数据订阅
  1000. // @Description NB-IOT井盖监测数据订阅
  1001. // @Success 0 {int} BaseResponse.Code "成功"
  1002. // @Failure 1 {int} BaseResponse.Code "失败"
  1003. // @router /v1/nbiotdata [get,post]
  1004. func (o *DataController) NBIOTData() {
  1005. beego.Info(o.Ctx.Request.RequestURI)
  1006. beego.Info(string(o.Ctx.Input.RequestBody))
  1007. }
  1008. // RadarDataList @Title 获取雷达详细数据
  1009. // @Description 获取雷达详细数据
  1010. // @Param body controllers.ReqRadarDataList "请求参数"
  1011. // @Success 0 {int} BaseResponse.Code "成功"
  1012. // @Failure 1 {int} BaseResponse.Code "失败"
  1013. // @router /v1/radar/list [post]
  1014. func (o *DataController) RadarDataList() {
  1015. var obj ReqRadarDataList
  1016. if err := json.Unmarshal(o.Ctx.Input.RequestBody, &obj); err != nil {
  1017. o.Response(Failure, fmt.Sprintf("数据包解析错误:%s", err.Error()), nil)
  1018. return
  1019. }
  1020. ret := make(map[string][]RadarData)
  1021. arr, err := models.GetRadarDataList(obj.Codes, obj.Start, obj.End, obj.Model)
  1022. if err != nil {
  1023. o.Response(Failure, fmt.Sprintf("数据查询错误:%s", err.Error()), nil)
  1024. return
  1025. }
  1026. for _, v := range arr {
  1027. d := RadarData{
  1028. Time: util.MLTime(v.Time),
  1029. Model: v.Type,
  1030. Speed: v.Speed,
  1031. Dist: v.Dist,
  1032. }
  1033. if m, ok := ret[v.DID]; !ok {
  1034. m = append(m, d)
  1035. ret[v.DID] = m
  1036. } else {
  1037. m = append(m, d)
  1038. }
  1039. }
  1040. o.Response(Success, "成功", ret)
  1041. }
  1042. // RadarDataSummary @Title 获取雷达统计数据
  1043. // @Description 获取雷达统计数据
  1044. // @Param body controllers.ReqRadarSummaryData "请求参数"
  1045. // @Success 0 {int} BaseResponse.Code "成功"
  1046. // @Failure 1 {int} BaseResponse.Code "失败"
  1047. // @router /v1/radar/summary [post]
  1048. func (o *DataController) RadarDataSummary() {
  1049. var obj ReqRadarSummaryData
  1050. if err := json.Unmarshal(o.Ctx.Input.RequestBody, &obj); err != nil {
  1051. o.Response(Failure, fmt.Sprintf("数据包解析错误:%s", err.Error()), nil)
  1052. return
  1053. }
  1054. ret := make(map[string][]RadarSummaryData)
  1055. if obj.Type == 1 {
  1056. arr, err := models.GetRadarSummaryHourData(obj.Codes, obj.Start, obj.End, obj.Model)
  1057. if err != nil {
  1058. o.Response(Failure, fmt.Sprintf("数据查询错误:%s", err.Error()), nil)
  1059. return
  1060. }
  1061. for _, v := range arr {
  1062. d := RadarSummaryData{
  1063. Time: util.MLTime(v.Time),
  1064. Model: v.Type,
  1065. Speed20Number: v.Speed20Number,
  1066. Speed40Number: v.Speed40Number,
  1067. Speed60Number: v.Speed60Number,
  1068. Speed80Number: v.Speed80Number,
  1069. Speed100Number: v.Speed100Number,
  1070. Speed120Number: v.Speed120Number,
  1071. OverSpeedNumber: v.OverSpeedNumber,
  1072. SpeedMaxNumber: v.SpeedMaxNumber,
  1073. Total: v.Total,
  1074. }
  1075. if m, ok := ret[v.DID]; !ok {
  1076. m = append(m, d)
  1077. ret[v.DID] = m
  1078. } else {
  1079. m = append(m, d)
  1080. }
  1081. }
  1082. // 默认为2 查询日统计
  1083. } else if obj.Type == 2 || obj.Type == 0 {
  1084. arr, err := models.GetRadarSummaryDayData(obj.Codes, obj.Start, obj.End, obj.Model)
  1085. if err != nil {
  1086. o.Response(Failure, fmt.Sprintf("数据查询错误:%s", err.Error()), nil)
  1087. return
  1088. }
  1089. for _, v := range arr {
  1090. d := RadarSummaryData{
  1091. Time: util.MLTime(v.Date),
  1092. Model: v.Type,
  1093. Speed20Number: v.Speed20Number,
  1094. Speed40Number: v.Speed40Number,
  1095. Speed60Number: v.Speed60Number,
  1096. Speed80Number: v.Speed80Number,
  1097. Speed100Number: v.Speed100Number,
  1098. Speed120Number: v.Speed120Number,
  1099. OverSpeedNumber: v.OverSpeedNumber,
  1100. SpeedMaxNumber: v.SpeedMaxNumber,
  1101. Total: v.Total,
  1102. }
  1103. if m, ok := ret[v.DID]; !ok {
  1104. m = append(m, d)
  1105. ret[v.DID] = m
  1106. } else {
  1107. m = append(m, d)
  1108. }
  1109. }
  1110. }
  1111. o.Response(Success, "成功", ret)
  1112. }