163 lines
4.8 KiB
Go
163 lines
4.8 KiB
Go
package lib
|
||
|
||
import (
|
||
"fmt"
|
||
entity2 "node_rabbit_go/app/entity"
|
||
"strings"
|
||
"time"
|
||
)
|
||
|
||
type DeviceRegistry struct {
|
||
DeviceRegistry map[string]entity2.Device
|
||
DeviceUptimeRegistry map[string]entity2.DeviceUptime
|
||
RequestController *RequestController
|
||
OnlineDevices []string
|
||
TempBeforeUpdateTSSYNC []string
|
||
}
|
||
|
||
func NewDeviceRegistry(rc *RequestController) *DeviceRegistry {
|
||
dr := &DeviceRegistry{
|
||
DeviceRegistry: make(map[string]entity2.Device),
|
||
DeviceUptimeRegistry: make(map[string]entity2.DeviceUptime),
|
||
RequestController: rc,
|
||
OnlineDevices: []string{},
|
||
TempBeforeUpdateTSSYNC: []string{},
|
||
}
|
||
go dr.initializeRegistry()
|
||
return dr
|
||
}
|
||
|
||
func (dr *DeviceRegistry) initializeRegistry() {
|
||
getDeviceList, _ := dr.RequestController.MySQL.Query(`select * from device where 1`)
|
||
//defer getDeviceList.Close()
|
||
for getDeviceList.Next() {
|
||
var device entity2.Device
|
||
err := getDeviceList.Scan(&device.Id, &device.Name)
|
||
if err != nil {
|
||
fmt.Println("Error scanning device:", err)
|
||
continue
|
||
}
|
||
dr.DeviceRegistry[device.Id] = device
|
||
}
|
||
|
||
getUptimeList, _ := dr.RequestController.MySQL.Query(`select * from device_uptime where 1`)
|
||
for getUptimeList.Next() {
|
||
var uptime entity2.DeviceUptime
|
||
err := getUptimeList.Scan(&uptime.Id, &uptime.Device_id)
|
||
if err != nil {
|
||
fmt.Println("Error scanning uptime:", err)
|
||
continue
|
||
}
|
||
dr.DeviceUptimeRegistry[uptime.Device_id] = uptime
|
||
}
|
||
}
|
||
|
||
func (dr *DeviceRegistry) FindDevice(mid string) entity2.Device {
|
||
device, found := dr.DeviceRegistry[mid]
|
||
if !found {
|
||
rows, err := dr.RequestController.MySQL.Query(fmt.Sprintf("select * from device where mid = '%s'", mid))
|
||
if err != nil {
|
||
fmt.Println("Error querying device:", err)
|
||
return entity2.Device{} // Предположим, что у вас есть структура для устройства
|
||
}
|
||
//defer rows.Close()
|
||
|
||
if rows.Next() {
|
||
var d entity2.Device // Предположим, что у вас есть структура для устройства
|
||
err := rows.Scan(&d.Id, &d.Name) // Пример сканирования значений
|
||
if err != nil {
|
||
fmt.Println("Error scanning device:", err)
|
||
return entity2.Device{} // Предположим, что у вас есть структура для устройства
|
||
}
|
||
dr.DeviceRegistry[d.Mid] = d
|
||
return d
|
||
}
|
||
}
|
||
return device
|
||
}
|
||
|
||
func (dr *DeviceRegistry) CheckOnline(device entity2.Device) {
|
||
tsNow := time.Now().Unix()
|
||
dr.UpdateDeviceTsSync(device.Id)
|
||
device.Ts_sync = tsNow
|
||
}
|
||
|
||
func (dr *DeviceRegistry) WriteMM_AgentData(deviceID string, uptime string, queueSize string) {
|
||
if deviceID != "" && uptime != "" && queueSize != "" {
|
||
_, err := dr.RequestController.MySQL.Query(fmt.Sprintf("UPDATE `device_uptime` SET `uptime`='%s', `queue_size`='%s' WHERE `device_id`='%s'", uptime, queueSize, deviceID))
|
||
if err != nil {
|
||
return
|
||
}
|
||
}
|
||
}
|
||
|
||
func (dr *DeviceRegistry) UpdateDeviceTsSync(deviceID string) {
|
||
dr.MarkDeviceOnline([]string{deviceID})
|
||
if !contains(dr.OnlineDevices, deviceID) {
|
||
dr.OnlineDevices = append(dr.OnlineDevices, deviceID)
|
||
}
|
||
}
|
||
|
||
func (dr *DeviceRegistry) MarkDeviceOnline(deviceList []string) {
|
||
for _, deviceID := range deviceList {
|
||
uptime, _ := dr.FindUptime(deviceID)
|
||
//if uptime != nil
|
||
uptime.Status = 1
|
||
|
||
}
|
||
}
|
||
|
||
func (dr *DeviceRegistry) MarkDeviceOffline(mid string) {
|
||
device := dr.FindDevice(mid)
|
||
uptime, _ := dr.FindUptime(device.Id)
|
||
uptime.Status = 0
|
||
}
|
||
|
||
func (dr *DeviceRegistry) FindUptime(id string) (entity2.DeviceUptime, error) {
|
||
record, found := dr.DeviceUptimeRegistry[id]
|
||
if !found {
|
||
rows, _ := dr.RequestController.MySQL.Query(fmt.Sprintf("select * from device_uptime where device_id = '%s'", id))
|
||
|
||
//defer rows.Close()
|
||
|
||
if rows.Next() {
|
||
var uptime entity2.DeviceUptime
|
||
err := rows.Scan(&uptime.Id, &uptime.Device_id)
|
||
if err != nil {
|
||
fmt.Println("Error scanning uptime record:", err)
|
||
|
||
}
|
||
dr.DeviceUptimeRegistry[uptime.Device_id] = uptime
|
||
return uptime, nil
|
||
}
|
||
}
|
||
return record, nil
|
||
}
|
||
|
||
func (dr *DeviceRegistry) GlobalUpdateTsSync() {
|
||
dr.TempBeforeUpdateTSSYNC = append([]string{}, dr.OnlineDevices...)
|
||
dr.OnlineDevices = []string{}
|
||
if len(dr.TempBeforeUpdateTSSYNC) > 0 {
|
||
deviceIDsStr := strings.Join(dr.TempBeforeUpdateTSSYNC, ",")
|
||
_, err := dr.RequestController.MySQL.Query(fmt.Sprintf("UPDATE `device` SET `ts_sync` = %d WHERE `id` IN (%s)", time.Now().Unix(), deviceIDsStr))
|
||
if err != nil {
|
||
fmt.Println("Error in GlobalUpdateTsSync")
|
||
}
|
||
|
||
}
|
||
dr.TempBeforeUpdateTSSYNC = []string{}
|
||
}
|
||
|
||
func (dr *DeviceRegistry) CheckDeviceOnline(deviceID string) bool {
|
||
return contains(dr.OnlineDevices, deviceID) || contains(dr.TempBeforeUpdateTSSYNC, deviceID)
|
||
}
|
||
|
||
func contains(arr []string, val string) bool {
|
||
for _, item := range arr {
|
||
if item == val {
|
||
return true
|
||
}
|
||
}
|
||
return false
|
||
}
|