deviceevent.go 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. package models
  2. import (
  3. "bytes"
  4. "fmt"
  5. "time"
  6. "lc/common/util"
  7. )
  8. type EventType int
  9. const (
  10. ET_ONLINE EventType = 1 //上线
  11. ET_OFFLINE EventType = 2 //下线
  12. ET_ONLAMP EventType = 3 //开灯
  13. ET_OFFLAMP EventType = 4 //关灯
  14. )
  15. type DeviceEvents struct {
  16. ID uint `gorm:"primary_key"` //主键,自增长
  17. DID string `gorm:"type:varchar(32)"` //设备编码
  18. EType EventType `gorm:"type:smallint"` //事件类型,上线,掉线
  19. Time time.Time `gorm:"type:datetime"` //事件发生时间
  20. CreatedAt time.Time
  21. }
  22. func (DeviceEvents) TableName() string {
  23. return "t_device_events"
  24. }
  25. type DeviceLampEvents struct {
  26. ID uint `gorm:"primary_key"` //主键,自增长
  27. DID string `gorm:"type:varchar(32)"` //设备编码
  28. TStart time.Time `gorm:"type:datetime"` //开灯时间
  29. TEnd time.Time `gorm:"type:datetime;default:null"` //关灯时间
  30. Brightness uint8 `gorm:"type:smallint"` //亮度,百分比数值
  31. LcModel
  32. }
  33. func (DeviceLampEvents) TableName() string {
  34. return "device_lamp_events"
  35. }
  36. func (o DeviceLampEvents) Update() error {
  37. return G_db.Model(&o).Updates(DeviceLampEvents{TEnd: o.TEnd}).Error
  38. }
  39. func GetLampEvents(Codes []string, Start, End string) ([]DeviceLampEvents, error) {
  40. var array []DeviceLampEvents
  41. err := G_db.Model(&DeviceLampEvents{}).Where("d_id IN (?) and t_start >= ? and t_start <= ?",
  42. Codes, Start, End).Order("id asc").Find(&array).Error
  43. return array, err
  44. }
  45. //用于web端告警信息同步
  46. func GetUpdateLampEvents(id uint64, update string) ([]DeviceLampEvents, error) {
  47. var array []DeviceLampEvents
  48. err := G_db.Model(&DeviceLampEvents{}).Where("id > ? OR updated_at > ?", id, update).Order("id asc").Find(&array).Error
  49. return array, err
  50. }
  51. //分割事件记录
  52. func (o DeviceLampEvents) Split() error {
  53. var dle DeviceLampEvents
  54. err := G_db.First(&dle, o.ID).Error
  55. if err != nil {
  56. return err
  57. }
  58. create := util.MlNow()
  59. var arrsplit []DeviceLampEventsSplit
  60. if util.New(dle.TStart).BeginningOfDay() != util.New(dle.TEnd).BeginningOfDay() {
  61. tmpStart := dle.TStart
  62. for !util.New(tmpStart).BeginningOfDay().After(util.New(dle.TEnd).BeginningOfDay()) {
  63. tmpEnd := util.New(tmpStart).EndOfDay()
  64. if util.New(tmpStart).BeginningOfDay().Equal(util.New(dle.TEnd).BeginningOfDay()) {
  65. tmpEnd = dle.TEnd
  66. }
  67. dle := DeviceLampEventsSplit{
  68. OrgID: dle.ID,
  69. DID: dle.DID,
  70. TStart: tmpStart,
  71. TEnd: tmpEnd,
  72. Brightness: dle.Brightness,
  73. CreatedAt: create,
  74. }
  75. arrsplit = append(arrsplit, dle)
  76. tmpStart = util.New(tmpStart).BeginningOfDay().AddDate(0, 0, 1)
  77. }
  78. } else {
  79. dle := DeviceLampEventsSplit{
  80. OrgID: dle.ID,
  81. DID: dle.DID,
  82. TStart: dle.TStart,
  83. TEnd: dle.TEnd,
  84. Brightness: dle.Brightness,
  85. CreatedAt: create,
  86. }
  87. arrsplit = append(arrsplit, dle)
  88. }
  89. return MultiInsertDeviceLampEventsSplit(arrsplit)
  90. }
  91. type DeviceLampEventsSplit struct {
  92. ID uint `gorm:"primary_key"` //主键,自增长
  93. OrgID uint `gorm:"type:bigint"` //对应事件表ID
  94. DID string `gorm:"type:varchar(32)"` //设备编码
  95. TStart time.Time `gorm:"type:datetime"` //开灯时间
  96. TEnd time.Time `gorm:"type:datetime;default:null"` //关灯时间
  97. Brightness uint8 `gorm:"type:smallint"` //亮度,百分比数值
  98. CreatedAt time.Time
  99. }
  100. func (DeviceLampEventsSplit) TableName() string {
  101. return "device_lamp_events_split"
  102. }
  103. func MultiInsertDeviceLampEventsSplit(datas []DeviceLampEventsSplit) error {
  104. if len(datas) == 0 {
  105. return nil
  106. }
  107. var buffer bytes.Buffer
  108. sql := "insert into device_lamp_events_split (org_id,d_id,t_start,t_end,brightness,created_at) values"
  109. if _, err := buffer.WriteString(sql); err != nil {
  110. return err
  111. }
  112. for i, e := range datas {
  113. if i == len(datas)-1 {
  114. buffer.WriteString(fmt.Sprintf("(%d,'%s','%s','%s',%d,'%s');",
  115. e.OrgID, e.DID,
  116. e.TStart.Format("2006-01-02 15:04:05"),
  117. e.TEnd.Format("2006-01-02 15:04:05"),
  118. e.Brightness,
  119. e.CreatedAt.Format("2006-01-02 15:04:05")))
  120. } else {
  121. buffer.WriteString(fmt.Sprintf("(%d,'%s','%s','%s',%d,'%s'),",
  122. e.OrgID, e.DID,
  123. e.TStart.Format("2006-01-02 15:04:05"),
  124. e.TEnd.Format("2006-01-02 15:04:05"),
  125. e.Brightness,
  126. e.CreatedAt.Format("2006-01-02 15:04:05")))
  127. }
  128. }
  129. return G_db.Exec(buffer.String()).Error
  130. }
  131. func CalcLightingRate(t time.Time) error {
  132. strDate := t.Format("2006-01-02")
  133. return G_db.Exec("CALL CalcLightingRate(?)", strDate).Error
  134. }
  135. func CalcLightingMiniteRate(t time.Time) error {
  136. return G_db.Exec("CALL CalcLightingMiniteRate(?)", t.Format("2006-01-02 15:04:05")).Error
  137. }
  138. //获取已熄灯的开灯记录,对于跨日期的记录,按日期拆分
  139. //全量处理时临时使用
  140. func SplitDeviceLampEvents(t time.Time) error {
  141. var arr []DeviceLampEvents
  142. err := G_db.Model(DeviceLampEvents{}).Where("t_end IS NOT NULL AND DATE(t_start) = ?", t.Format("2006-01-02")).Find(&arr).Error
  143. if err != nil {
  144. return err
  145. }
  146. create := util.MlNow()
  147. arrsplit := make([]DeviceLampEventsSplit, 0, len(arr))
  148. for _, v := range arr {
  149. //开始日期和结束日期,不是同一日,则需要拆分
  150. if util.New(v.TStart).BeginningOfDay() != util.New(v.TEnd).BeginningOfDay() {
  151. tmpStart := v.TStart
  152. for !util.New(tmpStart).BeginningOfDay().After(util.New(v.TEnd).BeginningOfDay()) {
  153. tmpEnd := util.New(tmpStart).EndOfDay()
  154. if util.New(tmpStart).BeginningOfDay().Equal(util.New(v.TEnd).BeginningOfDay()) {
  155. tmpEnd = v.TEnd
  156. }
  157. dle := DeviceLampEventsSplit{
  158. OrgID: v.ID,
  159. DID: v.DID,
  160. TStart: tmpStart,
  161. TEnd: tmpEnd,
  162. Brightness: v.Brightness,
  163. CreatedAt: create,
  164. }
  165. arrsplit = append(arrsplit, dle)
  166. tmpStart = util.New(tmpStart).BeginningOfDay().AddDate(0, 0, 1)
  167. }
  168. } else {
  169. dle := DeviceLampEventsSplit{
  170. OrgID: v.ID,
  171. DID: v.DID,
  172. TStart: v.TStart,
  173. TEnd: v.TEnd,
  174. Brightness: v.Brightness,
  175. CreatedAt: create,
  176. }
  177. arrsplit = append(arrsplit, dle)
  178. }
  179. }
  180. return MultiInsertDeviceLampEventsSplit(arrsplit)
  181. }