| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180 |
- package controllers
- import (
- "fmt"
- "strconv"
- "time"
- validation "github.com/go-ozzo/ozzo-validation/v4"
- "github.com/astaxie/beego"
- "lc/common/models"
- "lc/common/util"
- )
- // 各种统计数据
- const (
- DevStatusPrefix string = "dev_stat_"
- DevDataPrefix string = "dev_data_"
- ONLINE string = "online"
- TLast string = "tlast"
- //TIME string = "time"
- )
- type DataController struct {
- BaseController
- }
- // ReqHisData 历史数据
- type ReqHisData struct {
- Code string `json:"code"` //设备编码
- Sids []uint16 `json:"sids"` //SID编号
- Start string `json:"start"`
- End string `json:"end"`
- Type int `json:"type"` //1:每小时数据;2:每天数据
- }
- // ReqBHisData 多设备历史数据
- type ReqBHisData struct {
- Codes []string `json:"codes"` //设备编码
- Start string `json:"start"`
- End string `json:"end"`
- Type int `json:"type"` //1:每小时数据;2:每天数据
- }
- type HisData struct {
- Time util.MLTime `json:"time"`
- Val float32 `json:"val"`
- ValMin float32 `json:"minval"`
- ValMax float32 `json:"maxval"`
- }
- type RespHisData struct {
- Code string `json:"code"` //设备编码
- MapData map[uint16][]HisData `json:"data"` //sid->数据
- }
- type RespBHisData struct {
- MapData map[string]map[uint16][]HisData `json:"data"` //sid->数据
- }
- // ReqRTData 实时数据
- type ReqRTData struct {
- Codes []string `json:"codes"` //设备编码列表
- }
- type RTData struct {
- Time util.MLTime `json:"time"`
- Data map[uint16]float32 `json:"data"`
- }
- type RTStatus struct {
- Online int `json:"online"`
- Time util.MLTime `json:"time"`
- }
- // ReqAlarmData 告警数据
- type ReqAlarmData struct {
- Codes []string `json:"codes"` //设备编码
- Flag int `json:"flag"` //0所有告警,1结束的告警,2未结束的告警
- }
- type RespAlarm struct {
- ID int64 `json:"id"`
- DID string `json:"code"`
- TStart util.MLTime `json:"tstart"`
- TEnd util.MLTime `json:"tend,omitempty"`
- Content string `json:"content"` //告警内容
- AlarmType uint16 `json:"alarmtype"` //告警类型
- Level uint8 `json:"level"` //告警等级,0:普通,1:重要,2:严重
- Threshold float32 `json:"threshold"`
- Value float32 `json:"value"`
- Sid uint16 `json:"sid"` //sid,对应物模型的sid
- Cid int `json:"cid"` //策略编号
- Cname string `json:"cname"` //策略名称
- UpdatedAt util.MLTime `json:"updatedat"` //更新时间
- }
- // ReqEnergy 能耗数据
- type ReqEnergy struct {
- Codes []string `json:"codes"`
- Start string `json:"start"`
- End string `json:"end"`
- Flag int `json:"flag"` //1:每日数据;2:每月数据
- }
- type RespEnergy struct {
- Date string `json:"date"`
- Beginning float32 `json:"beginning"`
- Ending float32 `json:"ending"`
- Difference float32 `json:"difference"`
- }
- // ReqLightingRate 亮灯率数据
- type ReqLightingRate struct {
- Tenant string `json:"tenant"`
- Start string `json:"start"`
- End string `json:"end"`
- Quarter int `json:"quarter"`
- Flag int `json:"flag"`
- }
- func (a ReqLightingRate) Validate() error {
- return validation.ValidateStruct(&a,
- validation.Field(&a.Tenant, validation.Required, validation.Length(4, 8)),
- validation.Field(&a.Start, validation.Required, validation.Date("2006-01-02")),
- validation.Field(&a.End, validation.Required, validation.Date("2006-01-02")),
- validation.Field(&a.Quarter, validation.In(0, 1, 2, 3, 4)),
- validation.Field(&a.Flag, validation.In(0, 1, 2, 3)),
- )
- }
- // ReqVehicleData 请求抓拍单元统计数据
- type ReqVehicleData struct {
- Codes []string `json:"codes"`
- Start string `json:"start"`
- End string `json:"end"`
- Types []int `json:"types"`
- Flag int `json:"flag"`
- }
- func (a ReqVehicleData) Validate() error {
- return validation.ValidateStruct(&a,
- validation.Field(&a.Codes, validation.Length(1, 0)),
- validation.Field(&a.Start, validation.Required, validation.Date("2006-01-02 15:04:05")),
- validation.Field(&a.End, validation.Required, validation.Date("2006-01-02 15:04:05")),
- validation.Field(&a.Flag, validation.In(0, 1, 2, 3)),
- )
- }
- type DayLightingRateData struct {
- Date string `json:"date"`
- Total int `json:"total"`
- Number int `json:"number"`
- Rate float64 `json:"rate"`
- }
- type RespDayLightingRateData struct {
- Tenant string `json:"tenant"`
- Flag int `json:"flag"`
- Data []DayLightingRateData `json:"data"`
- }
- type MonthLightingRate struct {
- Month string `json:"month"`
- Rate float64 `json:"rate"`
- }
- type RespMonthLightingRate struct {
- Tenant string `json:"tenant"`
- Flag int `json:"flag"`
- Data []MonthLightingRate `json:"data"`
- }
- type QuarterLightingRate struct {
- Quarter string `json:"quarter"`
- Rate float64 `json:"rate"`
- }
- type RespQuarterLightingRate struct {
- Tenant string `json:"tenant"`
- Flag int `json:"flag"`
- Data []QuarterLightingRate `json:"data"`
- }
- type YearLightingRate struct {
- Year string `json:"year"`
- Rate float64 `json:"rate"`
- }
- type RespYearLightingRate struct {
- Tenant string `json:"tenant"`
- Flag int `json:"flag"`
- Data []YearLightingRate `json:"data"`
- }
- type ReqSosAlarm struct {
- Tenant string `json:"tenant"`
- Start string `json:"start"`
- End string `json:"end"`
- Codes []string `json:"codes"`
- }
- type RespSosAlarm struct {
- ID int64 `json:"id"`
- DID string `json:"code"`
- TStart util.MLTime `json:"tstart"`
- TEnd util.MLTime `json:"tend,omitempty"`
- Duration uint `json:"duration"`
- UpdatedAt util.MLTime `json:"updatedat"` //更新时间
- }
- type ReqLampEvent struct {
- Tenant string `json:"tenant"`
- Start string `json:"start"`
- End string `json:"end"`
- Codes []string `json:"codes"`
- }
- type RespLampEvent struct {
- ID int64 `json:"id"`
- DID string `json:"code"`
- TStart util.MLTime `json:"tstart"`
- TEnd util.MLTime `json:"tend,omitempty"`
- Brightness uint8 `json:"brightness"`
- Duration uint `json:"duration"`
- UpdatedAt util.MLTime `json:"updatedat"` //更新时间
- }
- // ReqRadarDataList 雷达详细数据
- type ReqRadarDataList struct {
- Codes []string `json:"codes"` //设备编码
- Start string `json:"start"`
- End string `json:"end"`
- Model uint8 `json:"model"` //类型 0点目标 1车目标 所有目标2
- }
- type RadarData struct {
- Time util.MLTime `json:"time"`
- Model uint8 `json:"model"`
- Speed float64 `json:"speed"`
- Dist float64 `json:"dist"`
- }
- // ReqRadarSummaryData 雷达统计数据
- type ReqRadarSummaryData struct {
- Codes []string `json:"codes"` //设备编码
- Start string `json:"start"`
- End string `json:"end"`
- Type uint8 `json:"type"` //1:小时数据,每个网关、雷达每小时有一条数据2:日数据,每个网关、雷达每天有一条数据
- Model uint8 `json:"model"` //类型 0点目标 1车目标 所有目标2
- }
- type RadarSummaryData struct {
- Time util.MLTime `json:"time"`
- Model uint8 `json:"model"`
- OverSpeedNumber int `json:"over_speed_number"` // 超速数量
- Speed20Number int `json:"speed0_20_number"` // 0-20 速度区间数量
- Speed40Number int `json:"speed20_40_number"` // 20-40 速度区间数量
- Speed60Number int `json:"speed40_60_number"` // 40-60 速度区间数量
- Speed80Number int `json:"speed60_80_number"` // 60-80 速度区间数量
- Speed100Number int `json:"speed80_100_number"` // 80-100 速度区间数量
- Speed120Number int `json:"speed100_120_number"` // 100-120 速度区间数量
- SpeedMaxNumber int `json:"speed_over120_number"` // >120 速度区间数量
- Total int `json:"total"`
- }
- // History @Title 获取历史数据
- // @Description 获取历史数据
- // @Param body controllers.ReqHisData true "请求参数"
- // @Success 0 {int} BaseResponse.Code "成功"
- // @Failure 1 {int} BaseResponse.Code "失败"
- // @router /v1/history [post]
- func (o *DataController) History() {
- var obj ReqHisData
- if err := json.Unmarshal(o.Ctx.Input.RequestBody, &obj); err != nil {
- //beego.Debug(string(o.Ctx.Input.RequestBody))
- //beego.Error(fmt.Sprintf("数据包解析错误:%s", err.Error()))
- o.Response(Failure, fmt.Sprintf("数据包解析错误:%s", err.Error()), nil)
- return
- }
- ret := RespHisData{
- Code: obj.Code,
- MapData: make(map[uint16][]HisData),
- }
- if obj.Type == 1 {
- arr, err := models.GetDeviceHourData(obj.Code, obj.Start, obj.End, obj.Sids)
- if err != nil {
- o.Response(Failure, fmt.Sprintf("数据查询错误:%s", err.Error()), nil)
- return
- }
- for _, v := range arr {
- d := HisData{
- Time: util.MLTime(v.Time),
- Val: v.Val,
- }
- ret.MapData[v.Sid] = append(ret.MapData[v.Sid], d)
- }
- } else if obj.Type == 2 {
- arr, err := models.GetDeviceDayData(obj.Code, obj.Start, obj.End, obj.Sids)
- if err != nil {
- o.Response(Failure, fmt.Sprintf("数据查询错误:%s", err.Error()), nil)
- return
- }
- for _, v := range arr {
- d := HisData{
- Time: util.MLTime(v.Time),
- Val: v.ValAvg,
- ValMin: v.ValMin,
- ValMax: v.ValMax,
- }
- ret.MapData[v.Sid] = append(ret.MapData[v.Sid], d)
- }
- }
- o.Response(Success, "成功", ret)
- }
- // BatchHistory @Title 获取多设备历史数据
- // @Description 获取多设备历史数据
- // @Param body controllers.ReqHisData true "请求参数"
- // @Success 0 {int} BaseResponse.Code "成功"
- // @Failure 1 {int} BaseResponse.Code "失败"
- // @router /v1/bhistory [post]
- func (o *DataController) BatchHistory() {
- var obj ReqBHisData
- if err := json.Unmarshal(o.Ctx.Input.RequestBody, &obj); err != nil {
- //beego.Debug(string(o.Ctx.Input.RequestBody))
- //beego.Error(fmt.Sprintf("数据包解析错误:%s", err.Error()))
- o.Response(Failure, fmt.Sprintf("数据包解析错误:%s", err.Error()), nil)
- return
- }
- ret := RespBHisData{
- MapData: make(map[string]map[uint16][]HisData),
- }
- if obj.Type == 1 {
- arr, err := models.GetBDeviceHourData(obj.Codes, obj.Start, obj.End)
- if err != nil {
- o.Response(Failure, fmt.Sprintf("数据查询错误:%s", err.Error()), nil)
- return
- }
- for _, v := range arr {
- d := HisData{
- Time: util.MLTime(v.Time),
- Val: v.Val,
- }
- if m, ok := ret.MapData[v.ID]; !ok {
- m = make(map[uint16][]HisData)
- m[v.Sid] = append(m[v.Sid], d)
- ret.MapData[v.ID] = m
- } else {
- m[v.Sid] = append(m[v.Sid], d)
- }
- }
- } else if obj.Type == 2 {
- arr, err := models.GetBDeviceDayData(obj.Codes, obj.Start, obj.End)
- if err != nil {
- o.Response(Failure, fmt.Sprintf("数据查询错误:%s", err.Error()), nil)
- return
- }
- for _, v := range arr {
- d := HisData{
- Time: util.MLTime(v.Time),
- Val: v.ValAvg,
- ValMin: v.ValMin,
- ValMax: v.ValMax,
- }
- if m, ok := ret.MapData[v.ID]; !ok {
- m = make(map[uint16][]HisData)
- m[v.Sid] = append(m[v.Sid], d)
- ret.MapData[v.ID] = m
- } else {
- m[v.Sid] = append(m[v.Sid], d)
- }
- }
- }
- o.Response(Success, "成功", ret)
- }
- // Realtime @Title 获取实时数据
- // @Description 获取历史数据
- // @Param body map[string]controllers.RTData true "请求参数"
- // @Success 0 {int} BaseResponse.Code "成功"
- // @Failure 1 {int} BaseResponse.Code "失败"
- // @router /v1/realtime [post]
- func (o *DataController) Realtime() {
- var obj ReqRTData
- err := json.Unmarshal(o.Ctx.Input.RequestBody, &obj)
- if err != nil {
- beego.Debug(string(o.Ctx.Input.RequestBody))
- beego.Error(fmt.Sprintf("数据包解析错误:%s", err.Error()))
- o.Response(Failure, fmt.Sprintf("数据包解析错误:%s", err.Error()), nil)
- return
- }
- ret := make(map[string]*RTData)
- for _, v0 := range obj.Codes {
- var rtdata RTData
- rtdata.Data = make(map[uint16]float32)
- if mapdata, err := redisCltRawdata.HGetAll(DevDataPrefix + v0).Result(); err == nil {
- for k, v1 := range mapdata {
- if k == TIME {
- if t, err := util.MlParseTime(v1); err == nil {
- rtdata.Time = util.MLTime(t)
- }
- } else {
- if sid, err := strconv.Atoi(k); err == nil {
- if fval, err := strconv.ParseFloat(v1, 64); err == nil {
- rtdata.Data[uint16(sid)] = float32(fval)
- }
- }
- }
- }
- //时间和数据均有,则返回给调用方
- if !time.Time(rtdata.Time).IsZero() && len(rtdata.Data) > 0 {
- ret[v0] = &rtdata
- }
- }
- }
- o.Response(Success, "成功", ret)
- }
- // RealtimestatusGet @Title 获取实时状态
- // @Description 获取实时状态
- // @Param body controllers.ReqRTData true "请求参数"
- // @Success 0 {int} BaseResponse.Code "成功"
- // @Failure 1 {int} BaseResponse.Code "失败"
- // @router /v1/rtstatus [post]
- func (o *DataController) RealtimestatusGet() {
- var obj ReqRTData
- err := json.Unmarshal(o.Ctx.Input.RequestBody, &obj)
- if err != nil {
- beego.Debug(string(o.Ctx.Input.RequestBody))
- beego.Error(fmt.Sprintf("数据包解析错误:%s", err.Error()))
- o.Response(Failure, fmt.Sprintf("数据包解析错误:%s", err.Error()), nil)
- return
- }
- ret := make(map[string]*RTStatus)
- for _, v0 := range obj.Codes {
- if mapdata, err := redisCltRawdata.HGetAll(DevStatusPrefix + v0).Result(); err == nil {
- var rtstatus RTStatus
- for k, v1 := range mapdata {
- if k == TLast {
- if t, err := util.MlParseTime(v1); err == nil {
- rtstatus.Time = util.MLTime(t)
- }
- } else if k == ONLINE {
- if n, err := strconv.Atoi(v1); err == nil {
- rtstatus.Online = n
- }
- }
- }
- ret[v0] = &rtstatus
- }
- }
- o.Response(Success, "成功", ret)
- }
- // AlarmSync @Title 同步告警数据
- // @Description 同步告警数据
- // @Param body body controllers.ReqAlarmData true "请求参数"
- // @Success 0 {int} BaseResponse.Code "成功"
- // @Failure 1 {int} BaseResponse.Code "失败"
- // @router /v1/alarm/sync [get]
- func (o *DataController) AlarmSync() {
- id, _ := o.GetUint64("id") //ID
- updatedat := o.GetString("updatedat") //更新时间
- arr, err := models.GetUpdateAlarm(id, updatedat)
- if err != nil {
- o.Response(Failure, fmt.Sprintf("数据查询错误:%s", err.Error()), nil)
- return
- }
- ret := make([]RespAlarm, 0, len(arr))
- for _, v := range arr {
- oo := RespAlarm{
- ID: v.ID,
- DID: v.DID,
- TStart: util.MLTime(v.TStart),
- TEnd: util.MLTime(v.TEnd),
- Content: v.Content,
- AlarmType: v.AlarmType,
- Level: v.Level,
- Threshold: v.Threshold,
- Value: v.SValue,
- Sid: v.Sid,
- Cid: int(v.Cid),
- Cname: v.Cname,
- UpdatedAt: util.MLTime(v.UpdatedAt),
- }
- ret = append(ret, oo)
- }
- o.Response(Success, "成功", ret)
- }
- // Alarm @Title 获取告警数据
- // @Description 获取告警数据
- // @Param body controllers.ReqAlarmData true "请求参数"
- // @Success 0 {int} BaseResponse.Code "成功"
- // @Failure 1 {int} BaseResponse.Code "失败"
- // @router /v1/alarm [post]
- func (o *DataController) Alarm() {
- var obj ReqAlarmData
- if err := json.Unmarshal(o.Ctx.Input.RequestBody, &obj); err != nil {
- beego.Error(fmt.Sprintf("数据包解析错误:%s", err.Error()))
- o.Response(Failure, fmt.Sprintf("数据包解析错误:%s", err.Error()), nil)
- return
- }
- arr, err := models.GetAlarmByCodes(obj.Codes, obj.Flag)
- if err != nil {
- o.Response(Failure, fmt.Sprintf("数据查询错误:%s", err.Error()), nil)
- return
- }
- ret := make([]RespAlarm, 0, len(arr))
- for _, v := range arr {
- oo := RespAlarm{
- ID: v.ID,
- DID: v.DID,
- TStart: util.MLTime(v.TStart),
- TEnd: util.MLTime(v.TEnd),
- Content: v.Content,
- AlarmType: v.AlarmType,
- Level: v.Level,
- Threshold: v.Threshold,
- Value: v.SValue,
- Sid: v.Sid,
- Cid: int(v.Cid),
- Cname: v.Cname,
- UpdatedAt: util.MLTime(v.UpdatedAt),
- }
- ret = append(ret, oo)
- }
- o.Response(Success, "成功", ret)
- }
- // Energy @Title 获取能耗数据
- // @Description 获取能耗数据
- // @Param body controllers.ReqEnergy true "请求参数"
- // @Success 0 {int} BaseResponse.Code "成功"
- // @Failure 1 {int} BaseResponse.Code "失败"
- // @router /v1/energy [post]
- func (o *DataController) Energy() {
- var obj ReqEnergy
- if err := json.Unmarshal(o.Ctx.Input.RequestBody, &obj); err != nil {
- beego.Error(fmt.Sprintf("数据包解析错误:%s", err.Error()))
- o.Response(Failure, fmt.Sprintf("数据包解析错误:%s", err.Error()), nil)
- return
- }
- ret := make(map[string][]RespEnergy)
- if obj.Flag == 1 {
- arr, err := models.GetDeviceEnergyDayData(obj.Codes, obj.Start, obj.End)
- if err != nil {
- o.Response(Failure, fmt.Sprintf("数据查询错误:%s", err.Error()), nil)
- return
- }
- for _, v := range arr {
- en := RespEnergy{
- Date: v.Date.Format("2006-01-02"),
- Beginning: v.Beginning,
- Ending: v.Ending,
- Difference: v.Difference,
- }
- ret[v.ID] = append(ret[v.ID], en)
- }
- } else if obj.Flag == 2 {
- arr, err := models.GetDeviceEnergyMonthData(obj.Codes, obj.Start, obj.End)
- if err != nil {
- o.Response(Failure, fmt.Sprintf("数据查询错误:%s", err.Error()), nil)
- return
- }
- for _, v := range arr {
- en := RespEnergy{
- Date: v.Date.Format("2006-01-02"),
- Beginning: v.Beginning,
- Ending: v.Ending,
- Difference: v.Difference,
- }
- ret[v.ID] = append(ret[v.ID], en)
- }
- } else {
- o.Response(Failure, fmt.Sprintf("flag为不支持的标识:flag=", obj.Flag), nil)
- return
- }
- o.Response(Success, "成功", ret)
- }
- // LightingRate @Title 获取亮灯率
- // @Description 获取亮灯率
- // @Param body controllers.ReqLightingRate true "请求参数"
- // @Success 0 {int} BaseResponse.Code "成功"
- // @Failure 1 {int} BaseResponse.Code "失败"
- // @router /v1/lightingrate [post]
- func (o *DataController) LightingRate() {
- var obj ReqLightingRate
- if err := json.Unmarshal(o.Ctx.Input.RequestBody, &obj); err != nil {
- beego.Error(fmt.Sprintf("数据包解析错误:%s", err.Error()))
- o.Response(Failure, fmt.Sprintf("数据包解析错误:%s", err.Error()), nil)
- return
- }
- if err := obj.Validate(); err != nil {
- beego.Error(fmt.Sprintf("请求参数验证失败:%s", err.Error()))
- o.Response(Failure, fmt.Sprintf("请求参数验证失败:%s", err.Error()), nil)
- return
- }
- ret := RespDayLightingRateData{
- Tenant: obj.Tenant,
- Flag: obj.Flag,
- }
- if obj.Flag == 0 {
- arr, err := models.GetDayLightingRateData(obj.Tenant, obj.Start, obj.End)
- if err == nil { //日
- Data := make([]DayLightingRateData, 0, len(arr))
- for _, v := range arr {
- lrd := DayLightingRateData{
- Date: v.Date.Format("2006-01-02"),
- Total: v.Total,
- Number: v.Number,
- Rate: float64(v.Rate),
- }
- Data = append(Data, lrd)
- }
- o.Response(Success, "成功", RespDayLightingRateData{Tenant: obj.Tenant, Flag: obj.Flag, Data: Data})
- }
- } else if obj.Flag == 1 { //月
- ts, _ := time.Parse("2006-01-02", obj.Start)
- te, _ := time.Parse("2006-01-02", obj.End)
- arr, err := models.GetMonthLightingRateData(obj.Tenant, ts.Format("2006-01"), te.Format("2006-01"))
- if err == nil {
- Data := make([]MonthLightingRate, 0, len(arr))
- for _, v := range arr {
- Data = append(Data, MonthLightingRate{Month: v.Time, Rate: float64(v.Rate)})
- }
- o.Response(Success, "成功", RespMonthLightingRate{Tenant: obj.Tenant, Flag: obj.Flag, Data: Data})
- }
- } else if obj.Flag == 2 { //季度
- ts, _ := time.Parse("2006-01-02", obj.Start)
- te, _ := time.Parse("2006-01-02", obj.End)
- arr, err := models.GetQuarterLightingRateData(obj.Tenant, ts.Format("2006"), te.Format("2006"), obj.Quarter)
- if err == nil {
- Data := make([]QuarterLightingRate, 0, len(arr))
- for _, v := range arr {
- Data = append(Data, QuarterLightingRate{Quarter: v.Time, Rate: float64(v.Rate)})
- }
- o.Response(Success, "成功", RespQuarterLightingRate{Tenant: obj.Tenant, Flag: obj.Flag, Data: Data})
- }
- } else if obj.Flag == 3 { //年度
- ts, _ := time.Parse("2006-01-02", obj.Start)
- te, _ := time.Parse("2006-01-02", obj.End)
- arr, err := models.GetYearLightingRateData(obj.Tenant, ts.Format("2006"), te.Format("2006"))
- if err == nil {
- Data := make([]YearLightingRate, 0, len(arr))
- for _, v := range arr {
- Data = append(Data, YearLightingRate{Year: v.Time, Rate: float64(v.Rate)})
- }
- o.Response(Success, "成功", RespYearLightingRate{Tenant: obj.Tenant, Flag: obj.Flag, Data: Data})
- }
- }
- o.Response(Success, "成功", ret)
- }
- // Sos @Title 获取一键求助报警记录
- // @Description 获取一键求助报警记录
- // @Param body body controllers.ReqSosAlarm true "请求参数"
- // @Success 0 {int} BaseResponse.Code "成功"
- // @Failure 1 {int} BaseResponse.Code "失败"
- // @router /v1/sos [post]
- func (o *DataController) Sos() {
- var obj ReqSosAlarm
- if err := json.Unmarshal(o.Ctx.Input.RequestBody, &obj); err != nil {
- beego.Error(fmt.Sprintf("数据包解析错误:%s", err.Error()))
- o.Response(Failure, fmt.Sprintf("数据包解析错误:%s", err.Error()), nil)
- return
- }
- arr, err := models.GetSosAlarm(obj.Codes, obj.Start, obj.End)
- if err != nil {
- o.Response(Failure, fmt.Sprintf("数据查询错误:%s", err.Error()), nil)
- return
- }
- ret := make([]RespSosAlarm, 0, len(arr))
- var duration uint = 0
- for _, v := range arr {
- if v.TEnd.IsZero() {
- duration = 0
- } else {
- duration = uint(v.TEnd.Sub(v.TStart).Seconds())
- }
- oo := RespSosAlarm{
- ID: v.ID,
- DID: v.DID,
- TStart: util.MLTime(v.TStart),
- TEnd: util.MLTime(v.TEnd),
- Duration: duration,
- UpdatedAt: util.MLTime(v.UpdatedAt),
- }
- ret = append(ret, oo)
- }
- o.Response(Success, "成功", ret)
- }
- // SosSync @Title 同步一键求助报警记录
- // @Description 同步一键求助报警记录
- // @Param body controllers.ReqAlarmData true "请求参数"
- // @Success 0 {int} BaseResponse.Code "成功"
- // @Failure 1 {int} BaseResponse.Code "失败"
- // @router /v1/sos/sync [get]
- func (o *DataController) SosSync() {
- id, _ := o.GetUint64("id") //ID
- updatedat := o.GetString("updatedat") //更新时间
- arr, err := models.GetUpdateSosAlarm(id, updatedat)
- if err != nil {
- o.Response(Failure, fmt.Sprintf("数据查询错误:%s", err.Error()), nil)
- return
- }
- ret := make([]RespSosAlarm, 0, len(arr))
- var duration uint = 0
- for _, v := range arr {
- if v.TEnd.IsZero() {
- duration = 0
- } else {
- duration = uint(v.TEnd.Sub(v.TStart).Seconds())
- }
- oo := RespSosAlarm{
- ID: v.ID,
- DID: v.DID,
- TStart: util.MLTime(v.TStart),
- TEnd: util.MLTime(v.TEnd),
- Duration: duration,
- UpdatedAt: util.MLTime(v.UpdatedAt),
- }
- ret = append(ret, oo)
- }
- o.Response(Success, "成功", ret)
- }
- // LampEvent @Title 获取开关灯记录
- // @Description 获取开关灯记录
- // @Param body body controllers.ReqLampEvent true "请求参数"
- // @Success 0 {int} BaseResponse.Code "成功"
- // @Failure 1 {int} BaseResponse.Code "失败"
- // @router /v1/lampevent [post]
- func (o *DataController) LampEvent() {
- var obj ReqLampEvent
- if err := json.Unmarshal(o.Ctx.Input.RequestBody, &obj); err != nil {
- beego.Error(fmt.Sprintf("数据包解析错误:%s", err.Error()))
- o.Response(Failure, fmt.Sprintf("数据包解析错误:%s", err.Error()), nil)
- return
- }
- arr, err := models.GetLampEvents(obj.Codes, obj.Start, obj.End)
- if err != nil {
- o.Response(Failure, fmt.Sprintf("数据查询错误:%s", err.Error()), nil)
- return
- }
- ret := make([]RespLampEvent, 0, len(arr))
- var duration uint = 0
- for _, v := range arr {
- if v.TEnd.IsZero() {
- duration = 0
- } else {
- duration = uint(v.TEnd.Sub(v.TStart).Minutes())
- }
- oo := RespLampEvent{
- ID: int64(v.ID),
- DID: v.DID,
- TStart: util.MLTime(v.TStart),
- TEnd: util.MLTime(v.TEnd),
- Brightness: v.Brightness,
- Duration: duration,
- UpdatedAt: util.MLTime(v.UpdatedAt),
- }
- ret = append(ret, oo)
- }
- o.Response(Success, "成功", ret)
- }
- // LampEventSync @Title 同步开关灯记录
- // @Description 同步开关灯记录
- // @Param body body controllers.ReqAlarmData true "请求参数"
- // @Success 0 {int} BaseResponse.Code "成功"
- // @Failure 1 {int} BaseResponse.Code "失败"
- // @router /v1/lampevent/sync [get]
- func (o *DataController) LampEventSync() {
- id, _ := o.GetUint64("id") //ID
- updatedat := o.GetString("updatedat") //更新时间
- arr, err := models.GetUpdateLampEvents(id, updatedat)
- if err != nil {
- o.Response(Failure, fmt.Sprintf("数据查询错误:%s", err.Error()), nil)
- return
- }
- ret := make([]RespLampEvent, 0, len(arr))
- var duration uint = 0
- for _, v := range arr {
- if v.TEnd.IsZero() {
- duration = 0
- } else {
- duration = uint(v.TEnd.Sub(v.TStart).Seconds())
- }
- oo := RespLampEvent{
- ID: int64(v.ID),
- DID: v.DID,
- TStart: util.MLTime(v.TStart),
- TEnd: util.MLTime(v.TEnd),
- Brightness: v.Brightness,
- Duration: duration,
- UpdatedAt: util.MLTime(v.UpdatedAt),
- }
- ret = append(ret, oo)
- }
- o.Response(Success, "成功", ret)
- }
- // VehicleProvince @Title 获取车流量分省统计数据
- // @Description 获取车流量分省统计数据
- // @Param body controllers.ReqVehicleData true "请求参数"
- // @Success 0 {int} BaseResponse.Code "成功"
- // @Failure 1 {int} BaseResponse.Code "失败"
- // @router /v1/its/province [post]
- func (o *DataController) VehicleProvince() {
- var obj ReqVehicleData
- if err := json.Unmarshal(o.Ctx.Input.RequestBody, &obj); err != nil {
- beego.Error(fmt.Sprintf("数据包解析错误:%s", err.Error()))
- o.Response(Failure, fmt.Sprintf("数据包解析错误:%s", err.Error()), nil)
- return
- }
- if err := obj.Validate(); err != nil {
- beego.Error(fmt.Sprintf("请求参数校验错误:%s", err.Error()))
- o.Response(Failure, fmt.Sprintf("请求参数校验错误:%s", err.Error()), nil)
- return
- }
- arr, err := models.GetVehicleProvince(obj.Codes, obj.Start, obj.End, obj.Flag)
- if err != nil {
- o.Response(Failure, fmt.Sprintf("数据查询错误:%s", err.Error()), nil)
- return
- }
- o.Response(Success, "成功", arr)
- }
- // VehicleCity @Title 获取车流量分城市统计数据
- // @Description 获取车流量分城市统计数据
- // @Param body controllers.ReqVehicleData true "请求参数"
- // @Success 0 {int} BaseResponse.Code "成功"
- // @Failure 1 {int} BaseResponse.Code "失败"
- // @router /v1/its/provincecity [post]
- func (o *DataController) VehicleCity() {
- var obj ReqVehicleData
- if err := json.Unmarshal(o.Ctx.Input.RequestBody, &obj); err != nil {
- beego.Error(fmt.Sprintf("数据包解析错误:%s", err.Error()))
- o.Response(Failure, fmt.Sprintf("数据包解析错误:%s", err.Error()), nil)
- return
- }
- if err := obj.Validate(); err != nil {
- beego.Error(fmt.Sprintf("请求参数校验错误:%s", err.Error()))
- o.Response(Failure, fmt.Sprintf("请求参数校验错误:%s", err.Error()), nil)
- return
- }
- arr, err := models.GetVehicleProvinceCity(obj.Codes, obj.Start, obj.End, obj.Flag)
- if err != nil {
- o.Response(Failure, fmt.Sprintf("数据查询错误:%s", err.Error()), nil)
- return
- }
- o.Response(Success, "成功", arr)
- }
- // VehicleType @Title 获取车流量分车型统计数据
- // @Description 获取车流量分车型统计数据
- // @Param body controllers.ReqVehicleData true "请求参数"
- // @Success 0 {int} BaseResponse.Code "成功"
- // @Failure 1 {int} BaseResponse.Code "失败"
- // @router /v1/its/vehicletype [post]
- func (o *DataController) VehicleType() {
- var obj ReqVehicleData
- if err := json.Unmarshal(o.Ctx.Input.RequestBody, &obj); err != nil {
- beego.Error(fmt.Sprintf("数据包解析错误:%s", err.Error()))
- o.Response(Failure, fmt.Sprintf("数据包解析错误:%s", err.Error()), nil)
- return
- }
- if err := obj.Validate(); err != nil {
- beego.Error(fmt.Sprintf("请求参数校验错误:%s", err.Error()))
- o.Response(Failure, fmt.Sprintf("请求参数校验错误:%s", err.Error()), nil)
- return
- }
- arr, err := models.GetVehicleType(obj.Codes, obj.Start, obj.End, obj.Flag)
- if err != nil {
- o.Response(Failure, fmt.Sprintf("数据查询错误:%s", err.Error()), nil)
- return
- }
- o.Response(Success, "成功", arr)
- }
- // VehicleTypeEx @Title 获取车流量分车型统计数据
- // @Description 获取车流量分车型统计数据
- // @Param body controllers.ReqVehicleData true "请求参数"
- // @Success 0 {int} BaseResponse.Code "成功"
- // @Failure 1 {int} BaseResponse.Code "失败"
- // @router /v1/its/vehicletypeex [post]
- func (o *DataController) VehicleTypeEx() {
- var obj ReqVehicleData
- if err := json.Unmarshal(o.Ctx.Input.RequestBody, &obj); err != nil {
- beego.Error(fmt.Sprintf("数据包解析错误:%s", err.Error()))
- o.Response(Failure, fmt.Sprintf("数据包解析错误:%s", err.Error()), nil)
- return
- }
- if err := obj.Validate(); err != nil {
- beego.Error(fmt.Sprintf("请求参数校验错误:%s", err.Error()))
- o.Response(Failure, fmt.Sprintf("请求参数校验错误:%s", err.Error()), nil)
- return
- }
- arr, err := models.GetVehicleTypeEx(obj.Codes, obj.Start, obj.End, obj.Types, obj.Flag)
- if err != nil {
- o.Response(Failure, fmt.Sprintf("数据查询错误:%s", err.Error()), nil)
- return
- }
- o.Response(Success, "成功", arr)
- }
- // VehicleTotal @Title 获取车流量统计数据
- // @Description 获取车流量统计数据
- // @Param body controllers.ReqVehicleData true "请求参数"
- // @Success 0 {int} BaseResponse.Code "成功"
- // @Failure 1 {int} BaseResponse.Code "失败"
- // @router /v1/its/vehicletotal [post]
- func (o *DataController) VehicleTotal() {
- var obj ReqVehicleData
- if err := json.Unmarshal(o.Ctx.Input.RequestBody, &obj); err != nil {
- beego.Error(fmt.Sprintf("数据包解析错误:%s", err.Error()))
- o.Response(Failure, fmt.Sprintf("数据包解析错误:%s", err.Error()), nil)
- return
- }
- if err := obj.Validate(); err != nil {
- beego.Error(fmt.Sprintf("请求参数校验错误:%s", err.Error()))
- o.Response(Failure, fmt.Sprintf("请求参数校验错误:%s", err.Error()), nil)
- return
- }
- arr, err := models.GetVehicleStreamsTag(obj.Codes, obj.Start, obj.End, obj.Flag)
- if err != nil {
- o.Response(Failure, fmt.Sprintf("数据查询错误:%s", err.Error()), nil)
- return
- }
- o.Response(Success, "成功", arr)
- }
- // VehicleHourTotal @Title 获取车流量按小时统计数据
- // @Description 获取车流量按小时统计数据
- // @Param body controllers.ReqVehicleData true "请求参数"
- // @Success 0 {int} BaseResponse.Code "成功"
- // @Failure 1 {int} BaseResponse.Code "失败"
- // @router /v1/its/vehiclehourtotal [post]
- func (o *DataController) VehicleHourTotal() {
- var obj ReqVehicleData
- if err := json.Unmarshal(o.Ctx.Input.RequestBody, &obj); err != nil {
- beego.Error(fmt.Sprintf("数据包解析错误:%s", err.Error()))
- o.Response(Failure, fmt.Sprintf("数据包解析错误:%s", err.Error()), nil)
- return
- }
- if err := obj.Validate(); err != nil {
- beego.Error(fmt.Sprintf("请求参数校验错误:%s", err.Error()))
- o.Response(Failure, fmt.Sprintf("请求参数校验错误:%s", err.Error()), nil)
- return
- }
- arr, err := models.GetVehicleHourTotalTag(obj.Codes, obj.Start, obj.End)
- if err != nil {
- o.Response(Failure, fmt.Sprintf("数据查询错误:%s", err.Error()), nil)
- return
- }
- o.Response(Success, "成功", arr)
- }
- // VehicleSpeedTotal @Title 获取速度区间统计数据
- // @Description 获取速度区间统计数据
- // @Param body controllers.ReqVehicleData true "请求参数"
- // @Success 0 {int} BaseResponse.Code "成功"
- // @Failure 1 {int} BaseResponse.Code "失败"
- // @router /v1/its/vehiclespeedtotal [post]
- func (o *DataController) VehicleSpeedTotal() {
- var obj ReqVehicleData
- if err := json.Unmarshal(o.Ctx.Input.RequestBody, &obj); err != nil {
- beego.Error(fmt.Sprintf("数据包解析错误:%s", err.Error()))
- o.Response(Failure, fmt.Sprintf("数据包解析错误:%s", err.Error()), nil)
- return
- }
- if err := obj.Validate(); err != nil {
- beego.Error(fmt.Sprintf("请求参数校验错误:%s", err.Error()))
- o.Response(Failure, fmt.Sprintf("请求参数校验错误:%s", err.Error()), nil)
- return
- }
- arr, err := models.GetVehicleSpeedRange(obj.Codes, obj.Start, obj.End, obj.Flag)
- if err != nil {
- o.Response(Failure, fmt.Sprintf("数据查询错误:%s", err.Error()), nil)
- return
- }
- o.Response(Success, "成功", arr)
- }
- // VehicleOverSpeedTotal @Title 获取车辆超速统计数据
- // @Description 获取车辆超速统计数据
- // @Param body controllers.ReqVehicleData true "请求参数"
- // @Success 0 {int} BaseResponse.Code "成功"
- // @Failure 1 {int} BaseResponse.Code "失败"
- // @router /v1/its/vehicleoverspeedtotal [post]
- func (o *DataController) VehicleOverSpeedTotal() {
- var obj ReqVehicleData
- if err := json.Unmarshal(o.Ctx.Input.RequestBody, &obj); err != nil {
- beego.Error(fmt.Sprintf("数据包解析错误:%s", err.Error()))
- o.Response(Failure, fmt.Sprintf("数据包解析错误:%s", err.Error()), nil)
- return
- }
- if err := obj.Validate(); err != nil {
- beego.Error(fmt.Sprintf("请求参数校验错误:%s", err.Error()))
- o.Response(Failure, fmt.Sprintf("请求参数校验错误:%s", err.Error()), nil)
- return
- }
- arr, err := models.GetVehicleOverSpeed(obj.Codes, obj.Start, obj.End, obj.Flag)
- if err != nil {
- o.Response(Failure, fmt.Sprintf("数据查询错误:%s", err.Error()), nil)
- return
- }
- o.Response(Success, "成功", arr)
- }
- // VehiclePlate @Title 获取车牌数据
- // @Description 获取车牌数据
- // @Param body controllers.ReqVehicleData true "请求参数"
- // @Success 0 {int} BaseResponse.Code "成功"
- // @Failure 1 {int} BaseResponse.Code "失败"
- // @router /v1/its/vehicleplate [post]
- func (o *DataController) VehiclePlate() {
- var obj ReqVehicleData
- if err := json.Unmarshal(o.Ctx.Input.RequestBody, &obj); err != nil {
- beego.Error(fmt.Sprintf("数据包解析错误:%s", err.Error()))
- o.Response(Failure, fmt.Sprintf("数据包解析错误:%s", err.Error()), nil)
- return
- }
- if err := obj.Validate(); err != nil {
- beego.Error(fmt.Sprintf("请求参数校验错误:%s", err.Error()))
- o.Response(Failure, fmt.Sprintf("请求参数校验错误:%s", err.Error()), nil)
- return
- }
- arr, err := models.GetVehiclePlate(obj.Codes, obj.Start, obj.End, obj.Types)
- if err != nil {
- o.Response(Failure, fmt.Sprintf("数据查询错误:%s", err.Error()), nil)
- return
- }
- o.Response(Success, "成功", arr)
- }
- // OverSpeedPlateSync @Title 超速车牌数据同步
- // @Description 超速车牌数据同步
- // @Param body controllers.ReqAlarmData true "请求参数"
- // @Success 0 {int} BaseResponse.Code "成功"
- // @Failure 1 {int} BaseResponse.Code "失败"
- // @router /v1/its/overspeed/sync [get]
- func (o *DataController) OverSpeedPlateSync() {
- id, _ := o.GetInt64("id", 0) //ID
- start := o.GetString("start") //开始时间
- end := o.GetString("end") //结束时间
- arr, err := models.GetOverSpeedPlate(id, start, end)
- if err != nil {
- o.Response(Failure, fmt.Sprintf("数据查询错误:%s", err.Error()), nil)
- return
- }
- o.Response(Success, "成功", arr)
- }
- // NBIOTData @Title NB-IOT井盖监测数据订阅
- // @Description NB-IOT井盖监测数据订阅
- // @Success 0 {int} BaseResponse.Code "成功"
- // @Failure 1 {int} BaseResponse.Code "失败"
- // @router /v1/nbiotdata [get,post]
- func (o *DataController) NBIOTData() {
- beego.Info(o.Ctx.Request.RequestURI)
- beego.Info(string(o.Ctx.Input.RequestBody))
- }
- // RadarDataList @Title 获取雷达详细数据
- // @Description 获取雷达详细数据
- // @Param body controllers.ReqRadarDataList "请求参数"
- // @Success 0 {int} BaseResponse.Code "成功"
- // @Failure 1 {int} BaseResponse.Code "失败"
- // @router /v1/radar/list [post]
- func (o *DataController) RadarDataList() {
- var obj ReqRadarDataList
- if err := json.Unmarshal(o.Ctx.Input.RequestBody, &obj); err != nil {
- o.Response(Failure, fmt.Sprintf("数据包解析错误:%s", err.Error()), nil)
- return
- }
- ret := make(map[string][]RadarData)
- arr, err := models.GetRadarDataList(obj.Codes, obj.Start, obj.End, obj.Model)
- if err != nil {
- o.Response(Failure, fmt.Sprintf("数据查询错误:%s", err.Error()), nil)
- return
- }
- for _, v := range arr {
- d := RadarData{
- Time: util.MLTime(v.Time),
- Model: v.Type,
- Speed: v.Speed,
- Dist: v.Dist,
- }
- if m, ok := ret[v.DID]; !ok {
- m = append(m, d)
- ret[v.DID] = m
- } else {
- m = append(m, d)
- }
- }
- o.Response(Success, "成功", ret)
- }
- // RadarDataSummary @Title 获取雷达统计数据
- // @Description 获取雷达统计数据
- // @Param body controllers.ReqRadarSummaryData "请求参数"
- // @Success 0 {int} BaseResponse.Code "成功"
- // @Failure 1 {int} BaseResponse.Code "失败"
- // @router /v1/radar/summary [post]
- func (o *DataController) RadarDataSummary() {
- var obj ReqRadarSummaryData
- if err := json.Unmarshal(o.Ctx.Input.RequestBody, &obj); err != nil {
- o.Response(Failure, fmt.Sprintf("数据包解析错误:%s", err.Error()), nil)
- return
- }
- ret := make(map[string][]RadarSummaryData)
- if obj.Type == 1 {
- arr, err := models.GetRadarSummaryHourData(obj.Codes, obj.Start, obj.End, obj.Model)
- if err != nil {
- o.Response(Failure, fmt.Sprintf("数据查询错误:%s", err.Error()), nil)
- return
- }
- for _, v := range arr {
- d := RadarSummaryData{
- Time: util.MLTime(v.Time),
- Model: v.Type,
- Speed20Number: v.Speed20Number,
- Speed40Number: v.Speed40Number,
- Speed60Number: v.Speed60Number,
- Speed80Number: v.Speed80Number,
- Speed100Number: v.Speed100Number,
- Speed120Number: v.Speed120Number,
- OverSpeedNumber: v.OverSpeedNumber,
- SpeedMaxNumber: v.SpeedMaxNumber,
- Total: v.Total,
- }
- if m, ok := ret[v.DID]; !ok {
- m = append(m, d)
- ret[v.DID] = m
- } else {
- m = append(m, d)
- }
- }
- // 默认为2 查询日统计
- } else if obj.Type == 2 || obj.Type == 0 {
- arr, err := models.GetRadarSummaryDayData(obj.Codes, obj.Start, obj.End, obj.Model)
- if err != nil {
- o.Response(Failure, fmt.Sprintf("数据查询错误:%s", err.Error()), nil)
- return
- }
- for _, v := range arr {
- d := RadarSummaryData{
- Time: util.MLTime(v.Date),
- Model: v.Type,
- Speed20Number: v.Speed20Number,
- Speed40Number: v.Speed40Number,
- Speed60Number: v.Speed60Number,
- Speed80Number: v.Speed80Number,
- Speed100Number: v.Speed100Number,
- Speed120Number: v.Speed120Number,
- OverSpeedNumber: v.OverSpeedNumber,
- SpeedMaxNumber: v.SpeedMaxNumber,
- Total: v.Total,
- }
- if m, ok := ret[v.DID]; !ok {
- m = append(m, d)
- ret[v.DID] = m
- } else {
- m = append(m, d)
- }
- }
- }
- o.Response(Success, "成功", ret)
- }
|