1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- package service
- import (
- "designs/global"
- "designs/model"
- "strconv"
- "time"
- )
- type logData struct {
- LogTime time.Time `json:"LogTime"`
- Type int `json:"Type"`
- }
- func UserOnlineSummary(gid string, pf string, date string, startTime string, endTime string) (map[int]string, error) {
- var onlineData []model.UserOnline
- //从数据库中查询出所有的数据
- query := global.App.DB.Table("user_online").Where("gid", gid)
- if date != "" {
- query = query.Where("date", "=", date).Where("pf", pf)
- }
- if startTime != "" && endTime != "" {
- query = query.Where("logTime", ">=", startTime).Where("logTime", "<=", endTime)
- }
- err := query.Scan(&onlineData).Error
- if err != nil {
- return nil, err
- }
- //对数据进行分组
- userOnlineData := make(map[int][]logData)
- for _, v := range onlineData {
- value, exists := userOnlineData[v.UserId]
- if exists {
- userOnlineData[v.UserId] = append(value, logData{v.LogTime, v.Type})
- } else {
- userOnlineData[v.UserId] = []logData{{v.LogTime, v.Type}}
- }
- }
- onlineData = nil
- userLogMsg := make(map[int]string)
- //分组后对于每个用户的数据进行处理,得到他们的具体在线时长
- for k, v := range userOnlineData {
- userLogMsg[k] = calculateUserOnlineTime(v)
- }
- userOnlineData = nil
- return userLogMsg, nil
- }
- func calculateUserOnlineTime(logData []logData) string {
- var lastLog int64
- var isStart bool
- var onlineTimeTotal int64
- for k, v := range logData {
- if v.Type == 1 && isStart == false {
- isStart = true
- lastLog = v.LogTime.Unix()
- continue
- }
- if v.Type == 1 && isStart == true {
- logTime := v.LogTime.Unix()
- onlineTimeTotal = onlineTimeTotal + (logTime - lastLog)
- lastLog = logTime
- //如果下一次的心跳,间隔时间大于6分钟了,就可以认为,这次就算是结束了
- if k+1 == len(logData) || logData[k+1].LogTime.Unix() > logTime+60*6 {
- isStart = false
- }
- continue
- }
- if v.Type == 2 && isStart == true {
- logTime := v.LogTime.Unix()
- onlineTimeTotal = onlineTimeTotal + (logTime - lastLog)
- isStart = false
- continue
- }
- }
- return "用户在线时长:" + strconv.Itoa(int(onlineTimeTotal))
- }
|