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 }