package busmodels import ( "device-manage/app/admin/models" orm "device-manage/common/global" "errors" "fmt" "strconv" "time" ) //ServerIp mqtt server ip地址, 因为设备可能会在多个mqtt 服务切换, 保存最近一次的mqtt ip //LastTime 最后在线时间, 每次设备报上报, lasttime都会更新, 是最后在线时间,也是当前设备在线时间. type BusDevice struct { DeviceId int `json:"deviceId" gorm:"primary_key;AUTO_INCREMENT"` DeviceName string `json:"deviceName" gorm:"size:128;"` DeviceSn string `json:"deviceSn" gorm:"size:128; unique; not null"` DeviceType string `json:"deviceType" gorm:"size:128;"` GroupId int `json:"groupId"` Gps string `json:"gps" gorm:"size:128;"` DeviceIp string `json:"deviceIp" gorm:"size:32;"` ServerIp string `json:"serverIp" gorm:"size:32;"` Remark string `json:"remark" gorm:"size:255;"` Status int `json:"status"` Nettype int `json:"nettype"` LastTime time.Time `json:"lastTime"` OnlineTime string `json:"onlineTime" gorm:"size:128;"` TotallTime string `json:"totallTime" gorm:"size:255;"` IsRegister int `json:"isRegister"` RegisterTime time.Time `json:"registerTime"` CreateBy string `json:"createBy" gorm:"size:128;"` UpdateBy string `json:"updateBy" gorm:"size:128;"` BaseModel BusAppDeviceBind BusAppDeviceBind `gorm:"foreignKey:DeviceId;references:DeviceId"` BusDeviceLog BusDeviceLog `gorm:"foreignKey:DeviceSn;references:DeviceSn"` } type DeviceInfo struct { BusDevice GroupName string `json:"groupName" gorm:"size:128;"` } func (BusDevice) TableName() string { return "bus_device" } type QueryParams struct { DeviceName string `json:"deviceName" gorm:"size:128;"` DeviceSn string `json:"deviceSn" gorm:"size:128;"` Status int `json:"status"` PageSize int `json:"pageSize"` PageIndex int `json:"pageIndex"` Gids []int `json:"gids"` } type StaticticsParams struct { Gids []int `json:"gids"` } type Statictics struct { OnlineCount int `json:"onlineCount"` OfflineCount int `json:"offlineCount"` } func (e *BusDevice) Get() (DeviceInfo, error) { var doc DeviceInfo var group BusGroup table := orm.Eloquent.Table(e.TableName()) tableGroup := orm.Eloquent.Table("bus_group") if e.DeviceId != 0 { table = table.Where("device_id = ?", e.DeviceId) } if err := table.First(&doc).Error; err != nil { return doc, err } if err := tableGroup.Where("group_id = ?", doc.GroupId).Find(&group).Error; err != nil { return doc, err } else { doc.GroupName = group.GroupName } fmt.Println(doc.ServerIp) return doc, nil } func (e *BusDevice) GetDeviceByDeviceSn() (BusDevice, error) { var doc BusDevice table := orm.Eloquent.Table(e.TableName()) if e.DeviceId != 0 { table = table.Where("device_sn = ?", e.DeviceSn) } if err := table.First(&doc).Error; err != nil { return doc, err } fmt.Println(doc.ServerIp) return doc, nil } //根据群组id查询所有的设备 func (e *BusDevice) GetDevices() ([]DeviceInfo, error) { var doc []DeviceInfo table := orm.Eloquent.Table(e.TableName()) if e.GroupId != 0 { table = table.Where("group_id = ?", e.GroupId) } if err := table.Find(&doc).Error; err != nil { return doc, err } return doc, nil } //查询设备是否已经注册 IsRegister:1 已经注册, IsRegister:0 未注册. func (e *BusDevice) IsRegist() bool { var result bool = true var deviceInfo BusDevice table := orm.Eloquent.Table(e.TableName()) if e.DeviceSn != "" { table = table.Where("device_sn = ?", e.DeviceSn) } if err := table.Find(&deviceInfo).Error; err != nil { result = false } if deviceInfo.IsRegister == 0 { result = false } return result } //查询设备是否存在, 新设备添加, 已添加才能注册. func (e *BusDevice) IsExist() bool { var result bool = true var count int64 table := orm.Eloquent.Table(e.TableName()) if e.DeviceSn != "" { table = table.Where("device_sn = ?", e.DeviceSn) } if err := table.Find(&BusDevice{}).Count(&count).Error; err != nil { result = false } if count <= 0 { result = false } return result } func (e *BusDevice) GetPage(pageSize int, pageIndex int, gids []int) ([]DeviceInfo, int, error) { var doc []DeviceInfo table := orm.Eloquent.Table(e.TableName()) tableUser := orm.Eloquent.Table("sys_user") if e.DeviceName != "" { table = table.Where("device_name like ?", "%"+e.DeviceName+"%") } if e.DeviceSn != "" { table = table.Where("device_sn like ?", "%"+e.DeviceSn+"%") } if len(gids) > 0 { table = table.Where("group_id in (?)", gids) } var count int64 if err := table.Order("device_id desc").Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Offset(-1).Limit(-1).Count(&count).Error; err != nil { return nil, 0, err } for k, v := range doc { //fmt.Println(v) var group BusGroup tableGroup := orm.Eloquent.Table("bus_group") user := models.SysUser{} id, _ := strconv.Atoi(v.CreateBy) if err := tableUser.Where("user_id = ?", id).Find(&user).Error; err == nil { doc[k].CreateBy = user.Username } tableUser := orm.Eloquent.Table("sys_user") id, _ = strconv.Atoi(v.UpdateBy) if err := tableUser.Where("user_id = ?", id).Find(&user).Error; err == nil { doc[k].UpdateBy = user.Username } if err := tableGroup.Where("group_id = ?", v.GroupId).Find(&group).Error; err == nil { doc[k].GroupName = group.GroupName } } return doc, int(count), nil } func (e *BusDevice) GetDeviceStatistics(gids []int) (Statictics, error) { var statictics Statictics if len(gids) <= 0 { return statictics, errors.New("null") } var onlineCount, offlineCount int64 if err := orm.Eloquent.Table(e.TableName()).Where("group_id in (?)", gids).Where("status = ?", 1).Find(&[]BusDevice{}).Count(&onlineCount).Error; err != nil { return statictics, err } statictics.OnlineCount = int(onlineCount) if err := orm.Eloquent.Table(e.TableName()).Where("group_id in (?)", gids).Where("status = ?", 0).Find(&[]BusDevice{}).Count(&offlineCount).Error; err != nil { return statictics, err } statictics.OfflineCount = int(offlineCount) return statictics, nil } func (e *BusDevice) GetMonitorPage(pageSize int, pageIndex int, gids []int) ([]DeviceInfo, int, error) { var doc []DeviceInfo table := orm.Eloquent.Table(e.TableName()) tableUser := orm.Eloquent.Table("sys_user") if e.DeviceName != "" { table = table.Where("device_name like ?", "%"+e.DeviceName+"%") } if e.DeviceSn != "" { table = table.Where("device_sn like ?", "%"+e.DeviceSn+"%") } if len(gids) > 0 { table = table.Where("group_id in (?)", gids) } //status 0 离线设备, status 1 在线设备. status x 其他设备. fmt.Println("status", e.Status) if e.Status == 0 || e.Status == 1 { table = table.Where("status = ?", e.Status) } if e.IsRegister > 0 { table = table.Where("is_register = ?", e.IsRegister) } var count int64 if err := table.Order("device_id desc").Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Offset(-1).Limit(-1).Count(&count).Error; err != nil { return nil, 0, err } for k, v := range doc { fmt.Println(v) var group BusGroup tableGroup := orm.Eloquent.Table("bus_group") user := models.SysUser{} id, _ := strconv.Atoi(v.CreateBy) if err := tableUser.Where("user_id = ?", id).Find(&user).Error; err == nil { doc[k].CreateBy = user.Username } tableUser := orm.Eloquent.Table("sys_user") id, _ = strconv.Atoi(v.UpdateBy) if err := tableUser.Where("user_id = ?", id).Find(&user).Error; err == nil { doc[k].UpdateBy = user.Username } if err := tableGroup.Where("group_id = ?", v.GroupId).Find(&group).Error; err == nil { doc[k].GroupName = group.GroupName } } return doc, int(count), nil } func (e *BusDevice) GetOnlineDevices() (devs []BusDevice, err error) { if err = orm.Eloquent.Table(e.TableName()).Where("status = ?", 1).Find(&devs).Error; err != nil { fmt.Println(err) } return devs, err } func (e *BusDevice) Insert() (id int, err error) { // check 用户名 var count int64 orm.Eloquent.Table(e.TableName()).Where("device_sn = ?", e.DeviceSn).Count(&count) if count > 0 { err = errors.New("device 已存在!") return } //添加数据 if err = orm.Eloquent.Table(e.TableName()).Create(&e).Error; err != nil { return } id = e.DeviceId return } func (e *BusDevice) Update(id int) (update BusDevice, err error) { if err = orm.Eloquent.Table(e.TableName()).First(&update, id).Error; err != nil { return } //参数1:是要修改的数据 //参数2:是修改的数据 //fmt.Println("new data:", e) //fmt.Println("old data:", update) if err = orm.Eloquent.Table(e.TableName()).Model(&update).Updates(&e).Error; err != nil { return } return } //gorm int类型字段 默认值是0,通过struct更新, 不能直接更新为0.通过map可以将int字段更新为0值 func (e *BusDevice) UpdateByMap(id int) (update BusDevice, err error) { if err = orm.Eloquent.Table(e.TableName()).First(&update, id).Error; err != nil { return } //参数1:是要修改的数据 //参数2:是修改的数据 fmt.Println("new data:", e) fmt.Println("old data:", update) if err = orm.Eloquent.Table(e.TableName()).Model(&update).Updates(map[string]interface{}{"status": e.Status, "online_time": e.OnlineTime, "nettype": e.Nettype}).Error; err != nil { return } return } //delelte log func (e *BusDevice) Delete(id int) (success bool, err error) { if err = orm.Eloquent.Table(e.TableName()).Where("device_id = ?", id).Delete(&BusDevice{}).Error; err != nil { success = false return } success = true return } func (e *BusDevice) BatchDelete(id []int) (Result bool, err error) { if err = orm.Eloquent.Table(e.TableName()).Where("device_id in (?)", id).Delete(&BusDevice{}).Error; err != nil { return } Result = true return }