| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199 |
- package models
- import (
- "bytes"
- "fmt"
- "time"
- "lc/common/util"
- )
- type EventType int
- const (
- ET_ONLINE EventType = 1 //上线
- ET_OFFLINE EventType = 2 //下线
- ET_ONLAMP EventType = 3 //开灯
- ET_OFFLAMP EventType = 4 //关灯
- )
- type DeviceEvents struct {
- ID uint `gorm:"primary_key"` //主键,自增长
- DID string `gorm:"type:varchar(32)"` //设备编码
- EType EventType `gorm:"type:smallint"` //事件类型,上线,掉线
- Time time.Time `gorm:"type:datetime"` //事件发生时间
- CreatedAt time.Time
- }
- func (DeviceEvents) TableName() string {
- return "t_device_events"
- }
- type DeviceLampEvents struct {
- ID uint `gorm:"primary_key"` //主键,自增长
- DID string `gorm:"type:varchar(32)"` //设备编码
- TStart time.Time `gorm:"type:datetime"` //开灯时间
- TEnd time.Time `gorm:"type:datetime;default:null"` //关灯时间
- Brightness uint8 `gorm:"type:smallint"` //亮度,百分比数值
- LcModel
- }
- func (DeviceLampEvents) TableName() string {
- return "device_lamp_events"
- }
- func (o DeviceLampEvents) Update() error {
- return G_db.Model(&o).Updates(DeviceLampEvents{TEnd: o.TEnd}).Error
- }
- func GetLampEvents(Codes []string, Start, End string) ([]DeviceLampEvents, error) {
- var array []DeviceLampEvents
- err := G_db.Model(&DeviceLampEvents{}).Where("d_id IN (?) and t_start >= ? and t_start <= ?",
- Codes, Start, End).Order("id asc").Find(&array).Error
- return array, err
- }
- //用于web端告警信息同步
- func GetUpdateLampEvents(id uint64, update string) ([]DeviceLampEvents, error) {
- var array []DeviceLampEvents
- err := G_db.Model(&DeviceLampEvents{}).Where("id > ? OR updated_at > ?", id, update).Order("id asc").Find(&array).Error
- return array, err
- }
- //分割事件记录
- func (o DeviceLampEvents) Split() error {
- var dle DeviceLampEvents
- err := G_db.First(&dle, o.ID).Error
- if err != nil {
- return err
- }
- create := util.MlNow()
- var arrsplit []DeviceLampEventsSplit
- if util.New(dle.TStart).BeginningOfDay() != util.New(dle.TEnd).BeginningOfDay() {
- tmpStart := dle.TStart
- for !util.New(tmpStart).BeginningOfDay().After(util.New(dle.TEnd).BeginningOfDay()) {
- tmpEnd := util.New(tmpStart).EndOfDay()
- if util.New(tmpStart).BeginningOfDay().Equal(util.New(dle.TEnd).BeginningOfDay()) {
- tmpEnd = dle.TEnd
- }
- dle := DeviceLampEventsSplit{
- OrgID: dle.ID,
- DID: dle.DID,
- TStart: tmpStart,
- TEnd: tmpEnd,
- Brightness: dle.Brightness,
- CreatedAt: create,
- }
- arrsplit = append(arrsplit, dle)
- tmpStart = util.New(tmpStart).BeginningOfDay().AddDate(0, 0, 1)
- }
- } else {
- dle := DeviceLampEventsSplit{
- OrgID: dle.ID,
- DID: dle.DID,
- TStart: dle.TStart,
- TEnd: dle.TEnd,
- Brightness: dle.Brightness,
- CreatedAt: create,
- }
- arrsplit = append(arrsplit, dle)
- }
- return MultiInsertDeviceLampEventsSplit(arrsplit)
- }
- type DeviceLampEventsSplit struct {
- ID uint `gorm:"primary_key"` //主键,自增长
- OrgID uint `gorm:"type:bigint"` //对应事件表ID
- DID string `gorm:"type:varchar(32)"` //设备编码
- TStart time.Time `gorm:"type:datetime"` //开灯时间
- TEnd time.Time `gorm:"type:datetime;default:null"` //关灯时间
- Brightness uint8 `gorm:"type:smallint"` //亮度,百分比数值
- CreatedAt time.Time
- }
- func (DeviceLampEventsSplit) TableName() string {
- return "device_lamp_events_split"
- }
- func MultiInsertDeviceLampEventsSplit(datas []DeviceLampEventsSplit) error {
- if len(datas) == 0 {
- return nil
- }
- var buffer bytes.Buffer
- sql := "insert into device_lamp_events_split (org_id,d_id,t_start,t_end,brightness,created_at) values"
- if _, err := buffer.WriteString(sql); err != nil {
- return err
- }
- for i, e := range datas {
- if i == len(datas)-1 {
- buffer.WriteString(fmt.Sprintf("(%d,'%s','%s','%s',%d,'%s');",
- e.OrgID, e.DID,
- e.TStart.Format("2006-01-02 15:04:05"),
- e.TEnd.Format("2006-01-02 15:04:05"),
- e.Brightness,
- e.CreatedAt.Format("2006-01-02 15:04:05")))
- } else {
- buffer.WriteString(fmt.Sprintf("(%d,'%s','%s','%s',%d,'%s'),",
- e.OrgID, e.DID,
- e.TStart.Format("2006-01-02 15:04:05"),
- e.TEnd.Format("2006-01-02 15:04:05"),
- e.Brightness,
- e.CreatedAt.Format("2006-01-02 15:04:05")))
- }
- }
- return G_db.Exec(buffer.String()).Error
- }
- func CalcLightingRate(t time.Time) error {
- strDate := t.Format("2006-01-02")
- return G_db.Exec("CALL CalcLightingRate(?)", strDate).Error
- }
- func CalcLightingMiniteRate(t time.Time) error {
- return G_db.Exec("CALL CalcLightingMiniteRate(?)", t.Format("2006-01-02 15:04:05")).Error
- }
- //获取已熄灯的开灯记录,对于跨日期的记录,按日期拆分
- //全量处理时临时使用
- func SplitDeviceLampEvents(t time.Time) error {
- var arr []DeviceLampEvents
- err := G_db.Model(DeviceLampEvents{}).Where("t_end IS NOT NULL AND DATE(t_start) = ?", t.Format("2006-01-02")).Find(&arr).Error
- if err != nil {
- return err
- }
- create := util.MlNow()
- arrsplit := make([]DeviceLampEventsSplit, 0, len(arr))
- for _, v := range arr {
- //开始日期和结束日期,不是同一日,则需要拆分
- if util.New(v.TStart).BeginningOfDay() != util.New(v.TEnd).BeginningOfDay() {
- tmpStart := v.TStart
- for !util.New(tmpStart).BeginningOfDay().After(util.New(v.TEnd).BeginningOfDay()) {
- tmpEnd := util.New(tmpStart).EndOfDay()
- if util.New(tmpStart).BeginningOfDay().Equal(util.New(v.TEnd).BeginningOfDay()) {
- tmpEnd = v.TEnd
- }
- dle := DeviceLampEventsSplit{
- OrgID: v.ID,
- DID: v.DID,
- TStart: tmpStart,
- TEnd: tmpEnd,
- Brightness: v.Brightness,
- CreatedAt: create,
- }
- arrsplit = append(arrsplit, dle)
- tmpStart = util.New(tmpStart).BeginningOfDay().AddDate(0, 0, 1)
- }
- } else {
- dle := DeviceLampEventsSplit{
- OrgID: v.ID,
- DID: v.DID,
- TStart: v.TStart,
- TEnd: v.TEnd,
- Brightness: v.Brightness,
- CreatedAt: create,
- }
- arrsplit = append(arrsplit, dle)
- }
- }
- return MultiInsertDeviceLampEventsSplit(arrsplit)
- }
|