yaojianjun 9 mesi fa
parent
commit
9ce1a57744

+ 2 - 0
.gitignore

@@ -16,3 +16,5 @@ Tech/frp/frp_0.65.0_linux_amd64/frps.toml
 Tech/log
 Tech/log/app.log
 Tech/log/info.log
+
+*.md

+ 11 - 0
Tech/build.bat

@@ -0,0 +1,11 @@
+@echo off
+cd /d %~dp0
+echo 开始编译...
+go build -o Tech.exe
+if %errorlevel% equ 0 (
+    echo 编译成功!
+) else (
+    echo 编译失败!
+    pause
+)
+pause

+ 330 - 0
Tech/common/electrical_data_fetcher.go

@@ -0,0 +1,330 @@
+package common
+
+import (
+	"Tech/models"
+	"bytes"
+	"crypto/md5"
+	"encoding/hex"
+	"encoding/json"
+	"fmt"
+	"io"
+	"net/http"
+	"time"
+
+	"github.com/beego/beego/v2/client/orm"
+	beego "github.com/beego/beego/v2/server/web"
+	"github.com/sirupsen/logrus"
+)
+
+// EquipmentData 表示设备数据
+type EquipmentData struct {
+	DataID      string `json:"dataId"`
+	DataName    string `json:"dataName"`
+	Value       string `json:"value"`
+	ID          string `json:"id"`
+	EqpmtTypeID int    `json:"eqpmtTypeID"`
+}
+
+// ElectricalDataFetcher 电调数据获取器
+type ElectricalDataFetcher struct {
+	manager        *models.ElectricModelManager
+	electricalIP   string
+	electricalPort int
+	lastDataHash   string
+	lastEquipments []map[string]interface{} // 记录上次广播的设备数据
+	isRunning      bool
+}
+
+var fetcher *ElectricalDataFetcher
+
+// InitElectricalDataFetcher 初始化电调数据获取器
+func InitElectricalDataFetcher() {
+	fetcher = &ElectricalDataFetcher{
+		manager:        models.GetInstance(),
+		isRunning:      false,
+		lastEquipments: nil, // 初始化为空,第一次会推送全量数据
+	}
+
+	// 从配置文件读取电调服务配置
+	electricalIP, err := beego.AppConfig.String("ElectricalIP")
+	if err != nil {
+		LogError("读取电调服务IP配置失败", err)
+		return
+	}
+
+	electricalPort, err := beego.AppConfig.Int("ElectricalPort")
+	if err != nil {
+		LogError("读取电调服务端口配置失败", err)
+		return
+	}
+
+	fetcher.electricalIP = electricalIP
+	fetcher.electricalPort = electricalPort
+
+	// 启动WebSocket管理器
+	GlobalWSManager.Start()
+
+	// 启动定时获取数据任务
+	fetcher.Start()
+}
+
+// Start 启动定时获取数据任务
+func (f *ElectricalDataFetcher) Start() {
+	if f.isRunning {
+		return
+	}
+	f.isRunning = true
+
+	// 获取全量数据更新间隔配置,默认5秒
+	intervalSeconds := 5
+	if interval, err := beego.AppConfig.Int("EGetAllDataInterval"); err == nil {
+		intervalSeconds = interval
+	}
+
+	ticker := time.NewTicker(time.Duration(intervalSeconds) * time.Second)
+
+	go func() {
+		// 初始延迟1秒执行,避免系统启动时的资源竞争
+		time.Sleep(1 * time.Second)
+
+		for range ticker.C {
+			f.fetchAndBroadcastData()
+		}
+	}()
+
+	LogInfo(fmt.Sprintf("电调数据定时获取任务已启动,间隔 %d 秒", intervalSeconds))
+}
+
+// fetchAndBroadcastData 获取并广播数据
+func (f *ElectricalDataFetcher) fetchAndBroadcastData() {
+	defer func() {
+		if r := recover(); r != nil {
+			LogError("获取电调数据时发生异常", nil, logrus.Fields{
+				"panic": r,
+			})
+		}
+	}()
+
+	// 获取最新的课程运行记录以获取线路号
+	o := orm.NewOrm()
+	var latestCourse models.CourseRunLog
+	err := o.QueryTable(new(models.CourseRunLog)).
+		OrderBy("-RunLogID").
+		One(&latestCourse)
+
+	lineID := 0
+	if err == nil && err != orm.ErrNoRows {
+		// 根据运行课程ID查询课程信息以获取线路号
+		var courseInfo models.CourseInfo
+		err = o.QueryTable(new(models.CourseInfo)).
+			Filter("CourseID", latestCourse.RunCourseID).
+			One(&courseInfo)
+
+		if err == nil {
+			lineID = courseInfo.LineNo
+		}
+	}
+
+	// 构造电调服务地址
+	electricalAddr := fmt.Sprintf("http://%s:%d/ServerCtrl/AllEqpmtList", f.electricalIP, f.electricalPort)
+
+	// 准备请求数据
+	type RequestData struct {
+		LineID    int `json:"lineID"`
+		StationID int `json:"StationID"`
+		ViewID    int `json:"ViewID"`
+	}
+	reqData := RequestData{
+		LineID:    lineID,
+		StationID: 0,
+		ViewID:    0,
+	}
+
+	// 将请求数据转换为JSON
+	reqBody, err := json.Marshal(reqData)
+	if err != nil {
+		LogError("构造请求数据失败", err)
+		return
+	}
+
+	// 调用电调服务获取所有设备列表接口
+	resp, err := http.Post(electricalAddr, "application/json", bytes.NewBuffer(reqBody))
+	if err != nil {
+		LogError("调用电调服务获取所有设备列表接口失败", err)
+		return
+	}
+	defer resp.Body.Close()
+
+	// 检查响应状态
+	if resp.StatusCode != http.StatusOK {
+		bodyBytes, _ := io.ReadAll(resp.Body)
+		LogError("电调服务返回异常状态码", fmt.Errorf("状态码: %d, 响应: %s", resp.StatusCode, string(bodyBytes)))
+		return
+	}
+
+	// 读取并解析响应体
+	bodyBytes, err := io.ReadAll(resp.Body)
+	if err != nil {
+		LogError("读取电调服务响应失败", err)
+		return
+	}
+
+	// 解析JSON响应
+	var result map[string]interface{}
+	if err := json.Unmarshal(bodyBytes, &result); err != nil {
+		LogError("解析电调服务JSON响应失败", err)
+		return
+	}
+
+	// 检查是否有data字段
+	data, exists := result["data"]
+	if !exists {
+		LogError("电调服务响应中没有data字段", nil)
+		return
+	}
+
+	// 解析data中的设备列表
+	var equipments []models.DiandiaoModel
+	if equipBytes, err := json.Marshal(data); err == nil {
+		if err := json.Unmarshal(equipBytes, &equipments); err != nil {
+			LogError("解析设备列表数据失败", err)
+			return
+		}
+	}
+
+	// 更新模型管理器的总包设备数据
+	f.manager.UpdateBatchData(equipments)
+
+	// 转换为标准设备数据格式
+	equipmentsData := f.manager.ConvertToEquipmentData(equipments)
+
+	// 加入测试代码:生成随机值修改第一个设备数据
+	// if len(equipmentsData) > 0 {
+	// 	// 生成0-100之间的随机值
+	// 	randomValue := time.Now().Unix() % 101
+	// 	equipmentsData[0]["value"] = fmt.Sprintf("%d", randomValue)
+	// 	LogDebug(fmt.Sprintf("测试:修改第一个设备数据的值为 %d", randomValue), nil)
+	// }
+
+	// 比较数据差异,获取变化的设备
+	changedEquipments := f.compareWithLastData(equipmentsData)
+
+	// 如果没有变化,则跳过广播
+	if len(changedEquipments) == 0 {
+		return
+	}
+
+	// 更新上次广播的数据
+	f.lastEquipments = equipmentsData
+
+	// 广播变化的设备数据到所有WebSocket连接
+	GlobalWSManager.Broadcast(changedEquipments)
+
+	LogDebug(fmt.Sprintf("成功获取并广播变化设备数据,变化数量: %d", len(changedEquipments)), logrus.Fields{
+		"lineID":       lineID,
+		"totalCount":   len(equipmentsData),
+		"changedCount": len(changedEquipments),
+	})
+}
+
+// compareWithLastData 比较当前数据与上次数据的差异
+func (f *ElectricalDataFetcher) compareWithLastData(currentData []map[string]interface{}) []map[string]interface{} {
+	// 如果是第一次(没有上次数据),返回所有数据
+	if f.lastEquipments == nil {
+		return currentData
+	}
+
+	// 构建上次数据的映射
+	lastDataMap := make(map[string]map[string]interface{})
+	for _, equip := range f.lastEquipments {
+		if id, ok := equip["id"].(string); ok {
+			lastDataMap[id] = equip
+		}
+	}
+
+	// 构建当前数据的映射
+	currentDataMap := make(map[string]map[string]interface{})
+	for _, equip := range currentData {
+		if id, ok := equip["id"].(string); ok {
+			currentDataMap[id] = equip
+		}
+	}
+
+	// 查找变化的设备
+	var changedEquipments []map[string]interface{}
+	allIDs := make(map[string]bool)
+
+	// 检查上次数据中的设备
+	for id, lastEquip := range lastDataMap {
+		allIDs[id] = true
+		currentEquip, exists := currentDataMap[id]
+
+		if !exists {
+			// 设备被删除了,不推送删除的设备
+			continue
+		}
+
+		// 比较值是否变化
+		if lastEquip["value"] != currentEquip["value"] {
+			changedEquipments = append(changedEquipments, currentEquip)
+		}
+	}
+
+	// 检查新增加的设备
+	for id, currentEquip := range currentDataMap {
+		if !allIDs[id] {
+			changedEquipments = append(changedEquipments, currentEquip)
+		}
+	}
+
+	return changedEquipments
+}
+
+// calculateDataHash 计算数据哈希
+func (f *ElectricalDataFetcher) calculateDataHash(data []map[string]interface{}) string {
+	// 将数据序列化为JSON
+	jsonData, err := json.Marshal(data)
+	if err != nil {
+		return ""
+	}
+
+	// 计算MD5哈希
+	hash := md5.Sum(jsonData)
+	return hex.EncodeToString(hash[:])
+}
+
+// GetCurrentData 获取当前缓存的设备数据
+func (f *ElectricalDataFetcher) GetCurrentData() ([]map[string]interface{}, error) {
+	// 获取所有设备数据
+	equipments := f.manager.GetAllEquipmentData()
+
+	// 转换为标准设备数据格式
+	equipmentsData := f.manager.ConvertToEquipmentData(equipments)
+
+	return equipmentsData, nil
+}
+
+// SendCurrentDataToClient 发送当前数据到指定客户端
+func SendCurrentDataToClient(clientID string) {
+	if fetcher == nil {
+		LogError("电调数据获取器未初始化", nil)
+		return
+	}
+
+	// 获取当前数据
+	equipments, err := fetcher.GetCurrentData()
+	if err != nil {
+		LogError("获取当前设备数据失败", err)
+		return
+	}
+
+	// 发送到指定客户端(直接发送设备数组)
+	if err := GlobalWSManager.BroadcastToClient(clientID, equipments); err != nil {
+		LogError("发送设备数据到客户端失败", err, logrus.Fields{
+			"clientID": clientID,
+		})
+		return
+	}
+
+	LogInfo(fmt.Sprintf("成功发送全量设备数据到客户端 %s,设备数量: %d", clientID, len(equipments)))
+}

+ 235 - 0
Tech/common/websocket_manager.go

@@ -0,0 +1,235 @@
+package common
+
+import (
+	"encoding/json"
+	"log"
+	"net/http"
+	"sync"
+	"time"
+
+	"github.com/gorilla/websocket"
+)
+
+var upgrader = websocket.Upgrader{
+	CheckOrigin: func(r *http.Request) bool {
+		return true // 允许所有来源
+	},
+}
+
+// WebSocketConnection WebSocket连接信息
+type WebSocketConnection struct {
+	ID             string
+	Conn           *websocket.Conn
+	LastSendTime   time.Time
+	LastDataHash   string
+	IsFirstSend    bool
+	SendChan       chan []byte
+	mu             sync.Mutex
+}
+
+// WebSocketManager WebSocket管理器
+type WebSocketManager struct {
+	connections map[string]*WebSocketConnection
+	mutex       sync.RWMutex
+	broadcast   chan []byte
+	register    chan *WebSocketConnection
+	unregister  chan *WebSocketConnection
+}
+
+// 全局WebSocket管理器实例
+var GlobalWSManager = &WebSocketManager{
+	connections: make(map[string]*WebSocketConnection),
+	broadcast:   make(chan []byte, 100),
+	register:    make(chan *WebSocketConnection, 10),
+	unregister:  make(chan *WebSocketConnection, 10),
+}
+
+// Start 启动WebSocket管理器
+func (m *WebSocketManager) Start() {
+	go m.handleMessages()
+	go m.cleanupStaleConnections()
+}
+
+// handleMessages 处理连接消息
+func (m *WebSocketManager) handleMessages() {
+	for {
+		select {
+		case conn := <-m.register:
+			m.mutex.Lock()
+			m.connections[conn.ID] = conn
+			m.mutex.Unlock()
+			log.Printf("WebSocket客户端已连接: %s", conn.ID)
+
+		case conn := <-m.unregister:
+			m.mutex.Lock()
+			if _, exists := m.connections[conn.ID]; exists {
+				delete(m.connections, conn.ID)
+				conn.Conn.Close()
+				close(conn.SendChan)
+			}
+			m.mutex.Unlock()
+			log.Printf("WebSocket客户端已断开: %s", conn.ID)
+
+		case message := <-m.broadcast:
+			m.mutex.RLock()
+			for _, conn := range m.connections {
+				select {
+				case conn.SendChan <- message:
+					conn.LastSendTime = time.Now()
+				default:
+					log.Printf("发送队列已满,关闭连接: %s", conn.ID)
+					go func(c *WebSocketConnection) {
+						m.unregister <- c
+					}(conn)
+				}
+			}
+			m.mutex.RUnlock()
+		}
+	}
+}
+
+// cleanupStaleConnections 清理超时连接
+func (m *WebSocketManager) cleanupStaleConnections() {
+	ticker := time.NewTicker(30 * time.Second)
+	defer ticker.Stop()
+
+	for range ticker.C {
+		m.mutex.Lock()
+		now := time.Now()
+		for id, conn := range m.connections {
+			// 如果连接超过5分钟没有发送数据,则关闭
+			if now.Sub(conn.LastSendTime) > 5*time.Minute {
+				log.Printf("清理超时WebSocket连接: %s", id)
+				delete(m.connections, id)
+				conn.Conn.Close()
+				close(conn.SendChan)
+			}
+		}
+		m.mutex.Unlock()
+	}
+}
+
+// Register 注册新连接
+func (m *WebSocketManager) Register(id string, conn *websocket.Conn) *WebSocketConnection {
+	wsConn := &WebSocketConnection{
+		ID:           id,
+		Conn:         conn,
+		LastSendTime: time.Now(),
+		IsFirstSend:  true,
+		SendChan:     make(chan []byte, 10),
+	}
+
+	// 启动发送协程
+	go wsConn.writePump()
+
+	m.register <- wsConn
+	return wsConn
+}
+
+// Unregister 注销连接
+func (m *WebSocketManager) Unregister(id string) {
+	m.mutex.RLock()
+	if conn, exists := m.connections[id]; exists {
+		m.unregister <- conn
+	}
+	m.mutex.RUnlock()
+}
+
+// GetConnection 获取连接
+func (m *WebSocketManager) GetConnection(id string) (*WebSocketConnection, bool) {
+	m.mutex.RLock()
+	defer m.mutex.RUnlock()
+
+	conn, exists := m.connections[id]
+	return conn, exists
+}
+
+// Broadcast 广播消息到所有连接
+func (m *WebSocketManager) Broadcast(data interface{}) error {
+	message, err := json.Marshal(data)
+	if err != nil {
+		return err
+	}
+
+	m.broadcast <- message
+	return nil
+}
+
+// BroadcastToClient 发送消息到指定客户端
+func (m *WebSocketManager) BroadcastToClient(id string, data interface{}) error {
+	m.mutex.RLock()
+	conn, exists := m.connections[id]
+	m.mutex.RUnlock()
+
+	if !exists {
+		return nil
+	}
+
+	message, err := json.Marshal(data)
+	if err != nil {
+		return err
+	}
+
+	select {
+	case conn.SendChan <- message:
+		conn.LastSendTime = time.Now()
+	default:
+		return nil
+	}
+
+	return nil
+}
+
+// writePump 写入数据到WebSocket连接
+func (c *WebSocketConnection) writePump() {
+	defer func() {
+		c.Conn.Close()
+		GlobalWSManager.Unregister(c.ID)
+	}()
+
+	for {
+		select {
+		case message, ok := <-c.SendChan:
+			if !ok {
+				return
+			}
+
+			c.mu.Lock()
+			err := c.Conn.WriteMessage(websocket.TextMessage, message)
+			c.mu.Unlock()
+
+			if err != nil {
+				log.Printf("WebSocket发送消息失败 %s: %v", c.ID, err)
+				return
+			}
+		}
+	}
+}
+
+// UpdateLastDataHash 更新最后发送的数据哈希
+func (c *WebSocketConnection) UpdateLastDataHash(hash string) {
+	c.mu.Lock()
+	defer c.mu.Unlock()
+	c.LastDataHash = hash
+}
+
+// GetLastDataHash 获取最后发送的数据哈希
+func (c *WebSocketConnection) GetLastDataHash() string {
+	c.mu.Lock()
+	defer c.mu.Unlock()
+	return c.LastDataHash
+}
+
+// SetIsFirstSend 设置是否首次发送
+func (c *WebSocketConnection) SetIsFirstSend(isFirst bool) {
+	c.mu.Lock()
+	defer c.mu.Unlock()
+	c.IsFirstSend = isFirst
+}
+
+// GetIsFirstSend 获取是否首次发送
+func (c *WebSocketConnection) GetIsFirstSend() bool {
+	c.mu.Lock()
+	defer c.mu.Unlock()
+	return c.IsFirstSend
+}

+ 76 - 0
Tech/controllers/websocket.go

@@ -0,0 +1,76 @@
+package controllers
+
+import (
+	"Tech/common"
+	"Tech/models"
+	"fmt"
+	"sync/atomic"
+
+	"github.com/beego/beego/v2/client/orm"
+	beego "github.com/beego/beego/v2/server/web"
+	"github.com/gorilla/websocket"
+)
+
+// WebSocketController WebSocket处理器
+type WebSocketController struct {
+	beego.Controller
+}
+
+var wsClientCounter int64
+
+// WebSocket处理连接
+func (c *WebSocketController) Handle() {
+	// 升级HTTP连接到WebSocket
+	conn, err := websocket.Upgrade(c.Ctx.ResponseWriter, c.Ctx.Request, nil, 1024, 1024)
+	if err != nil {
+		c.Data["json"] = map[string]interface{}{
+			"code": 500,
+			"msg":  "WebSocket连接升级失败: " + err.Error(),
+		}
+		c.ServeJSON()
+		return
+	}
+
+	// 生成唯一的客户端ID
+	clientID := fmt.Sprintf("ws_client_%d", atomic.AddInt64(&wsClientCounter, 1))
+
+	// 注册WebSocket连接
+	wsConn := common.GlobalWSManager.Register(clientID, conn)
+	defer func() {
+		common.GlobalWSManager.Unregister(clientID)
+	}()
+
+	// 获取最新的课程运行记录以获取线路号
+	o := orm.NewOrm()
+	var latestCourse models.CourseRunLog
+	err = o.QueryTable(new(models.CourseRunLog)).
+		OrderBy("-RunLogID").
+		One(&latestCourse)
+
+	lineID := 0
+	if err == nil && err != orm.ErrNoRows {
+		// 根据运行课程ID查询课程信息以获取线路号
+		var courseInfo models.CourseInfo
+		err = o.QueryTable(new(models.CourseInfo)).
+			Filter("CourseID", latestCourse.RunCourseID).
+			One(&courseInfo)
+
+		if err == nil {
+			lineID = courseInfo.LineNo
+		}
+	}
+
+	// 发送连接成功消息
+	wsConn.SendChan <- []byte(fmt.Sprintf(`{"event":"connected","data":{"clientID":"%s","message":"WebSocket连接已建立","lineID":%d}}`, clientID, lineID))
+
+	// 立即发送所有缓存的设备数据(首次连接推送全量数据)
+	common.SendCurrentDataToClient(clientID)
+
+	// 读取客户端消息
+	for {
+		_, _, err := conn.ReadMessage()
+		if err != nil {
+			break
+		}
+	}
+}

+ 1 - 0
Tech/go.mod

@@ -4,6 +4,7 @@ go 1.24.0
 
 require (
 	github.com/beego/beego/v2 v2.3.8
+	github.com/gorilla/websocket v1.5.1
 	github.com/sirupsen/logrus v1.9.3
 	gopkg.in/natefinch/lumberjack.v2 v2.2.1
 )

+ 2 - 0
Tech/go.sum

@@ -20,6 +20,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
 github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
 github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
+github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY=
+github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY=
 github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=
 github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
 github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=

+ 518 - 0
Tech/log/app.log

@@ -161,3 +161,521 @@
 {"error":"发送HTTP请求失败: Post \"http://124.222.28.5:7321/TMS/api/ms/uploadHeartbeatCommand\": dial tcp 124.222.28.5:7321: connectex: No connection could be made because the target machine actively refused it.","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"发送心跳任务出现错误","time":"2025-12-27 22:53:00"}
 {"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"接收到关闭信号,正在优雅关闭服务...","time":"2025-12-27 22:53:23"}
 {"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:559","func":"Tech/common.CloseLogger","level":"info","msg":"SCADA培训系统关闭","time":"2025-12-27 22:53:23"}
+{"event":"system_startup","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:87","func":"Tech/common.InitLogger","level":"info","msg":"SCADA培训系统启动","pid":25876,"time":"2025-12-28 17:54:11"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"日志系统初始化成功","time":"2025-12-28 17:54:11"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"数据库连接监控任务已启动,间隔10秒","time":"2025-12-28 17:54:11"}
+{"action":"cache_init","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:333","func":"Tech/common.LogInfo","level":"info","module":"user","msg":"开始初始化用户信息缓存...","time":"2025-12-28 17:54:11"}
+{"action":"cache_init_complete","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:333","func":"Tech/common.LogInfo","level":"info","module":"user","msg":"用户信息缓存初始化完成","time":"2025-12-28 17:54:14","user_count":3574}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"电调数据定时获取任务已启动,间隔 5 秒","time":"2025-12-28 17:54:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"SCADA培训系统服务启动中...","time":"2025-12-28 17:54:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"心跳发送任务已启动,间隔30秒","time":"2025-12-28 17:54:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:54:19"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:54:24"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:54:29"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:54:34"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:54:39"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 17:54:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:54:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:54:49"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 17:55:17"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:55:30"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:55:32"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:55:43"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:55:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 17:55:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:55:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:55:49"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:55:54"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:55:59"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:56:04"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:56:09"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 17:56:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:56:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:56:19"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:56:24"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:56:29"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:56:34"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:56:39"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:56:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 17:56:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:56:49"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:56:54"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:56:59"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:57:04"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:57:09"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 17:57:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:57:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:57:19"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:57:24"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:57:29"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:57:34"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:57:39"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 17:57:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:57:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:57:49"}
+{"error":"Post \"http://124.222.28.5:7314/ServerCtrl/AllEqpmtList\": EOF","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"调用电调服务获取所有设备列表接口失败","time":"2025-12-28 17:57:54"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:57:59"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:58:04"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:58:09"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:58:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 17:58:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:58:19"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:58:24"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:58:29"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:58:34"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:58:39"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:58:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 17:58:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:58:49"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:58:54"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:58:59"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:59:04"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:59:09"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 17:59:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:59:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:59:19"}
+{"error":"Post \"http://124.222.28.5:7314/ServerCtrl/AllEqpmtList\": EOF","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"调用电调服务获取所有设备列表接口失败","time":"2025-12-28 17:59:24"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:59:29"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:59:34"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:59:39"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 17:59:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:59:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:59:49"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:59:54"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 17:59:59"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:00:04"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:00:09"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:00:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:00:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:00:19"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:00:24"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:00:29"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:00:34"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:00:39"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:00:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:00:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:00:49"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:00:54"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:00:59"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:01:04"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:01:09"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:01:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:01:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:01:19"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:01:24"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:01:29"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:01:34"}
+{"error":"Post \"http://124.222.28.5:7314/ServerCtrl/AllEqpmtList\": read tcp 192.168.31.197:57232-\u003e124.222.28.5:7314: wsarecv: An existing connection was forcibly closed by the remote host.","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"调用电调服务获取所有设备列表接口失败","time":"2025-12-28 18:24:11"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:24:11"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:24:11"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:24:15"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:24:15"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:24:19"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:24:24"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:24:29"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:24:34"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:24:39"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:24:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:24:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:24:49"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:24:54"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:24:59"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:25:04"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:25:09"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:25:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:25:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:25:19"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:25:24"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:25:29"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:25:34"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:25:39"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:25:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:25:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:25:49"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:25:54"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:25:59"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:26:04"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:26:09"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:26:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:26:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:26:19"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:26:24"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:26:29"}
+{"error":"Post \"http://124.222.28.5:7314/ServerCtrl/AllEqpmtList\": EOF","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"调用电调服务获取所有设备列表接口失败","time":"2025-12-28 18:26:34"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:26:39"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:26:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:26:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:26:49"}
+{"error":"Post \"http://124.222.28.5:7314/ServerCtrl/AllEqpmtList\": EOF","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"调用电调服务获取所有设备列表接口失败","time":"2025-12-28 18:26:54"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:26:59"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:27:04"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:27:09"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:27:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:27:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:27:19"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:27:24"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:27:29"}
+{"error":"Post \"http://124.222.28.5:7314/ServerCtrl/AllEqpmtList\": EOF","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"调用电调服务获取所有设备列表接口失败","time":"2025-12-28 18:27:34"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:27:39"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:27:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:27:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:27:49"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:27:54"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:27:59"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:28:04"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:28:09"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:28:14"}
+{"error":"Post \"http://124.222.28.5:7314/ServerCtrl/AllEqpmtList\": EOF","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"调用电调服务获取所有设备列表接口失败","time":"2025-12-28 18:28:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:28:19"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:28:24"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:28:29"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:28:34"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:28:39"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:28:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:28:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:28:49"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:28:54"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:28:59"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:29:04"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:29:09"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:29:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:29:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:29:19"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:29:24"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:29:29"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:29:34"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:29:39"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:29:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:29:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:29:49"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:29:54"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:29:59"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:30:04"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:30:09"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:30:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:30:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:30:19"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:30:24"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:30:29"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:30:34"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:30:39"}
+{"error":"Post \"http://124.222.28.5:7314/ServerCtrl/AllEqpmtList\": EOF","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"调用电调服务获取所有设备列表接口失败","time":"2025-12-28 18:30:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:30:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:31:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:31:44"}
+{"error":"Post \"http://124.222.28.5:7314/ServerCtrl/AllEqpmtList\": EOF","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"调用电调服务获取所有设备列表接口失败","time":"2025-12-28 18:31:59"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:32:04"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:32:09"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:32:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:32:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:32:19"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:32:24"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:32:29"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:32:34"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:32:39"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:32:44"}
+{"error":"Post \"http://124.222.28.5:7314/ServerCtrl/AllEqpmtList\": EOF","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"调用电调服务获取所有设备列表接口失败","time":"2025-12-28 18:32:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:32:49"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:32:54"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:32:59"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:33:04"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:33:09"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:33:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:33:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:33:19"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:33:24"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:33:29"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:33:34"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:33:39"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:33:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:33:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:33:49"}
+{"error":"Post \"http://124.222.28.5:7314/ServerCtrl/AllEqpmtList\": EOF","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"调用电调服务获取所有设备列表接口失败","time":"2025-12-28 18:33:54"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:33:59"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:34:04"}
+{"error":"Post \"http://124.222.28.5:7314/ServerCtrl/AllEqpmtList\": EOF","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"调用电调服务获取所有设备列表接口失败","time":"2025-12-28 18:34:09"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:34:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:34:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:35:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:35:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:36:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:36:19"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:36:24"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:36:29"}
+{"error":"Post \"http://124.222.28.5:7314/ServerCtrl/AllEqpmtList\": EOF","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"调用电调服务获取所有设备列表接口失败","time":"2025-12-28 18:36:34"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:36:39"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:36:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:36:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:36:49"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:36:54"}
+{"error":"Post \"http://124.222.28.5:7314/ServerCtrl/AllEqpmtList\": EOF","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"调用电调服务获取所有设备列表接口失败","time":"2025-12-28 18:36:59"}
+{"error":"Post \"http://124.222.28.5:7314/ServerCtrl/AllEqpmtList\": EOF","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"调用电调服务获取所有设备列表接口失败","time":"2025-12-28 18:37:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:37:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:37:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:38:09"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:38:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:38:14"}
+{"error":"Post \"http://124.222.28.5:7314/ServerCtrl/AllEqpmtList\": EOF","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"调用电调服务获取所有设备列表接口失败","time":"2025-12-28 18:38:19"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:38:24"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:38:29"}
+{"error":"Post \"http://124.222.28.5:7314/ServerCtrl/AllEqpmtList\": EOF","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"调用电调服务获取所有设备列表接口失败","time":"2025-12-28 18:38:34"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:38:39"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:38:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:38:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:38:49"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:38:54"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:38:59"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:39:04"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:39:09"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:39:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:39:14"}
+{"error":"Post \"http://124.222.28.5:7314/ServerCtrl/AllEqpmtList\": EOF","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"调用电调服务获取所有设备列表接口失败","time":"2025-12-28 18:39:19"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:39:24"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:39:29"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:39:34"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:39:39"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:39:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:39:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:39:49"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:39:54"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:39:59"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:40:04"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:40:09"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:40:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:40:39"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:40:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:40:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:40:49"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:40:54"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:40:59"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:41:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:41:29"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:41:34"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:41:39"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:41:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:41:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:41:49"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:41:54"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:41:59"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:42:04"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:42:09"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:42:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:42:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:42:19"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:42:24"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:42:29"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:42:34"}
+{"error":"Post \"http://124.222.28.5:7314/ServerCtrl/AllEqpmtList\": EOF","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"调用电调服务获取所有设备列表接口失败","time":"2025-12-28 18:42:39"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:42:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:42:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:42:49"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:42:54"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:42:59"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:43:04"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:43:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:43:34"}
+{"error":"Post \"http://124.222.28.5:7314/ServerCtrl/AllEqpmtList\": EOF","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"调用电调服务获取所有设备列表接口失败","time":"2025-12-28 18:43:39"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:43:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:43:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:43:49"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:43:54"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:43:59"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:44:04"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:44:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:44:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:45:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:45:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:45:49"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:45:54"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:45:59"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:46:04"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:46:09"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:46:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:46:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:47:04"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:47:09"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:47:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:47:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:47:19"}
+{"error":"Post \"http://124.222.28.5:7314/ServerCtrl/AllEqpmtList\": EOF","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"调用电调服务获取所有设备列表接口失败","time":"2025-12-28 18:47:24"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:47:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:47:54"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:47:59"}
+{"error":"Post \"http://124.222.28.5:7314/ServerCtrl/AllEqpmtList\": EOF","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"调用电调服务获取所有设备列表接口失败","time":"2025-12-28 18:48:04"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:48:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:48:34"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:48:39"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:48:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:48:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:48:49"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:48:54"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:48:59"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:49:04"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:49:09"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:49:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:49:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:49:19"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:49:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:50:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:50:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:50:19"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:50:24"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:50:29"}
+{"error":"Post \"http://124.222.28.5:7314/ServerCtrl/AllEqpmtList\": EOF","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"调用电调服务获取所有设备列表接口失败","time":"2025-12-28 18:50:34"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:50:39"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:50:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:50:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:50:49"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:50:54"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:50:59"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:51:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:51:29"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:51:34"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:51:39"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:51:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:51:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:51:49"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:52:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:52:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:52:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:52:49"}
+{"error":"Post \"http://124.222.28.5:7314/ServerCtrl/AllEqpmtList\": EOF","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"调用电调服务获取所有设备列表接口失败","time":"2025-12-28 18:52:54"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:53:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:53:24"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:53:29"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:53:34"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:53:39"}
+{"error":"Post \"http://124.222.28.5:7314/ServerCtrl/AllEqpmtList\": EOF","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"调用电调服务获取所有设备列表接口失败","time":"2025-12-28 18:53:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:53:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:54:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:54:14"}
+{"error":"Post \"http://124.222.28.5:7314/ServerCtrl/AllEqpmtList\": EOF","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"调用电调服务获取所有设备列表接口失败","time":"2025-12-28 18:54:19"}
+{"error":"Post \"http://124.222.28.5:7314/ServerCtrl/AllEqpmtList\": EOF","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"调用电调服务获取所有设备列表接口失败","time":"2025-12-28 18:54:24"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:54:29"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:54:34"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"电调服务响应中没有data字段","time":"2025-12-28 18:54:39"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:54:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:55:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:55:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:56:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:56:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:57:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:57:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:58:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:58:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:59:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:59:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 19:00:14"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 19:00:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 19:01:14"}
+{"event":"system_startup","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:87","func":"Tech/common.InitLogger","level":"info","msg":"SCADA培训系统启动","pid":10180,"time":"2025-12-28 19:01:47"}
+{"event":"system_startup","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:87","func":"Tech/common.InitLogger","level":"info","msg":"SCADA培训系统启动","pid":10180,"time":"2025-12-28 19:01:47"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"数据库连接监控任务已启动,间隔10秒","time":"2025-12-28 19:01:47"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"日志系统初始化成功","time":"2025-12-28 19:01:47"}
+{"action":"cache_init","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:333","func":"Tech/common.LogInfo","level":"info","module":"user","msg":"开始初始化用户信息缓存...","time":"2025-12-28 19:01:47"}
+{"action":"cache_init_complete","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:333","func":"Tech/common.LogInfo","level":"info","module":"user","msg":"用户信息缓存初始化完成","time":"2025-12-28 19:01:50","user_count":3574}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"电调数据定时获取任务已启动,间隔 5 秒","time":"2025-12-28 19:01:50"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"SCADA培训系统服务启动中...","time":"2025-12-28 19:01:50"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"心跳发送任务已启动,间隔30秒","time":"2025-12-28 19:01:50"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送全量设备数据到客户端 ws_client_1,设备数量: 0","time":"2025-12-28 19:01:55"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 19:02:20"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 19:02:50"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 19:03:20"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 19:03:50"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 19:04:20"}
+{"event":"system_startup","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:87","func":"Tech/common.InitLogger","level":"info","msg":"SCADA培训系统启动","pid":9156,"time":"2025-12-28 19:04:45"}
+{"event":"system_startup","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:87","func":"Tech/common.InitLogger","level":"info","msg":"SCADA培训系统启动","pid":9156,"time":"2025-12-28 19:04:45"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"数据库连接监控任务已启动,间隔10秒","time":"2025-12-28 19:04:45"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"日志系统初始化成功","time":"2025-12-28 19:04:45"}
+{"action":"cache_init","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:333","func":"Tech/common.LogInfo","level":"info","module":"user","msg":"开始初始化用户信息缓存...","time":"2025-12-28 19:04:45"}
+{"action":"cache_init_complete","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:333","func":"Tech/common.LogInfo","level":"info","module":"user","msg":"用户信息缓存初始化完成","time":"2025-12-28 19:04:48","user_count":3574}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"电调数据定时获取任务已启动,间隔 5 秒","time":"2025-12-28 19:04:48"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"心跳发送任务已启动,间隔30秒","time":"2025-12-28 19:04:48"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"SCADA培训系统服务启动中...","time":"2025-12-28 19:04:48"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送全量设备数据到客户端 ws_client_1,设备数量: 535","time":"2025-12-28 19:04:55"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 19:05:18"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 19:05:48"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 19:06:18"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 19:06:48"}
+{"event":"system_startup","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:87","func":"Tech/common.InitLogger","level":"info","msg":"SCADA培训系统启动","pid":20132,"time":"2025-12-28 19:07:05"}
+{"event":"system_startup","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:87","func":"Tech/common.InitLogger","level":"info","msg":"SCADA培训系统启动","pid":20132,"time":"2025-12-28 19:07:05"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"数据库连接监控任务已启动,间隔10秒","time":"2025-12-28 19:07:05"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"日志系统初始化成功","time":"2025-12-28 19:07:05"}
+{"action":"cache_init","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:333","func":"Tech/common.LogInfo","level":"info","module":"user","msg":"开始初始化用户信息缓存...","time":"2025-12-28 19:07:05"}
+{"action":"cache_init_complete","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:333","func":"Tech/common.LogInfo","level":"info","module":"user","msg":"用户信息缓存初始化完成","time":"2025-12-28 19:07:07","user_count":3574}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"电调数据定时获取任务已启动,间隔 5 秒","time":"2025-12-28 19:07:07"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"SCADA培训系统服务启动中...","time":"2025-12-28 19:07:07"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"心跳发送任务已启动,间隔30秒","time":"2025-12-28 19:07:07"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送全量设备数据到客户端 ws_client_1,设备数量: 535","time":"2025-12-28 19:07:20"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 19:07:38"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送全量设备数据到客户端 ws_client_2,设备数量: 535","time":"2025-12-28 19:07:40"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送全量设备数据到客户端 ws_client_3,设备数量: 535","time":"2025-12-28 19:07:43"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送全量设备数据到客户端 ws_client_4,设备数量: 535","time":"2025-12-28 19:07:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送全量设备数据到客户端 ws_client_5,设备数量: 535","time":"2025-12-28 19:07:51"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送全量设备数据到客户端 ws_client_6,设备数量: 535","time":"2025-12-28 19:07:52"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送全量设备数据到客户端 ws_client_7,设备数量: 535","time":"2025-12-28 19:07:53"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 19:08:08"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送全量设备数据到客户端 ws_client_8,设备数量: 535","time":"2025-12-28 19:08:28"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送全量设备数据到客户端 ws_client_9,设备数量: 535","time":"2025-12-28 19:08:32"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 19:08:38"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送全量设备数据到客户端 ws_client_10,设备数量: 535","time":"2025-12-28 19:08:42"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 19:09:08"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送全量设备数据到客户端 ws_client_11,设备数量: 535","time":"2025-12-28 19:09:22"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送全量设备数据到客户端 ws_client_12,设备数量: 535","time":"2025-12-28 19:09:24"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 19:09:38"}
+{"event":"system_startup","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:87","func":"Tech/common.InitLogger","level":"info","msg":"SCADA培训系统启动","pid":21564,"time":"2025-12-28 19:09:47"}
+{"event":"system_startup","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:87","func":"Tech/common.InitLogger","level":"info","msg":"SCADA培训系统启动","pid":21564,"time":"2025-12-28 19:09:47"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"数据库连接监控任务已启动,间隔10秒","time":"2025-12-28 19:09:47"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"日志系统初始化成功","time":"2025-12-28 19:09:47"}
+{"action":"cache_init","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:333","func":"Tech/common.LogInfo","level":"info","module":"user","msg":"开始初始化用户信息缓存...","time":"2025-12-28 19:09:47"}
+{"action":"cache_init_complete","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:333","func":"Tech/common.LogInfo","level":"info","module":"user","msg":"用户信息缓存初始化完成","time":"2025-12-28 19:09:49","user_count":3574}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"心跳发送任务已启动,间隔30秒","time":"2025-12-28 19:09:49"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"电调数据定时获取任务已启动,间隔 5 秒","time":"2025-12-28 19:09:49"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"SCADA培训系统服务启动中...","time":"2025-12-28 19:09:49"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送全量设备数据到客户端 ws_client_1,设备数量: 0","time":"2025-12-28 19:09:49"}
+{"event":"system_startup","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:87","func":"Tech/common.InitLogger","level":"info","msg":"SCADA培训系统启动","pid":20608,"time":"2025-12-28 19:10:15"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"日志系统初始化成功","time":"2025-12-28 19:10:15"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"数据库连接监控任务已启动,间隔10秒","time":"2025-12-28 19:10:15"}
+{"action":"cache_init","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:333","func":"Tech/common.LogInfo","level":"info","module":"user","msg":"开始初始化用户信息缓存...","time":"2025-12-28 19:10:15"}
+{"action":"cache_init_complete","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:333","func":"Tech/common.LogInfo","level":"info","module":"user","msg":"用户信息缓存初始化完成","time":"2025-12-28 19:10:18","user_count":3574}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"电调数据定时获取任务已启动,间隔 5 秒","time":"2025-12-28 19:10:18"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"SCADA培训系统服务启动中...","time":"2025-12-28 19:10:18"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"心跳发送任务已启动,间隔30秒","time":"2025-12-28 19:10:18"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送全量设备数据到客户端 ws_client_1,设备数量: 0","time":"2025-12-28 19:10:18"}
+{"error":"Post \"http://124.222.28.5:7314/ServerCtrl/AllEqpmtList\": EOF","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:375","func":"Tech/common.LogError","level":"error","msg":"调用电调服务获取所有设备列表接口失败","time":"2025-12-28 19:10:43"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 19:10:48"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 19:11:18"}
+{"event":"system_startup","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:87","func":"Tech/common.InitLogger","level":"info","msg":"SCADA培训系统启动","pid":21840,"time":"2025-12-28 19:13:17"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"日志系统初始化成功","time":"2025-12-28 19:13:17"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"数据库连接监控任务已启动,间隔10秒","time":"2025-12-28 19:13:17"}
+{"action":"cache_init","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:333","func":"Tech/common.LogInfo","level":"info","module":"user","msg":"开始初始化用户信息缓存...","time":"2025-12-28 19:13:17"}
+{"action":"cache_init_complete","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:333","func":"Tech/common.LogInfo","level":"info","module":"user","msg":"用户信息缓存初始化完成","time":"2025-12-28 19:13:19","user_count":3574}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"电调数据定时获取任务已启动,间隔 5 秒","time":"2025-12-28 19:13:19"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"心跳发送任务已启动,间隔30秒","time":"2025-12-28 19:13:19"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"SCADA培训系统服务启动中...","time":"2025-12-28 19:13:19"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送全量设备数据到客户端 ws_client_1,设备数量: 535","time":"2025-12-28 19:13:41"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 19:13:50"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 19:14:20"}
+{"event":"system_startup","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:87","func":"Tech/common.InitLogger","level":"info","msg":"SCADA培训系统启动","pid":16548,"time":"2025-12-28 19:17:20"}
+{"event":"system_startup","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:87","func":"Tech/common.InitLogger","level":"info","msg":"SCADA培训系统启动","pid":16548,"time":"2025-12-28 19:17:20"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"数据库连接监控任务已启动,间隔10秒","time":"2025-12-28 19:17:20"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"日志系统初始化成功","time":"2025-12-28 19:17:20"}
+{"action":"cache_init","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:333","func":"Tech/common.LogInfo","level":"info","module":"user","msg":"开始初始化用户信息缓存...","time":"2025-12-28 19:17:20"}
+{"action":"cache_init_complete","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:333","func":"Tech/common.LogInfo","level":"info","module":"user","msg":"用户信息缓存初始化完成","time":"2025-12-28 19:17:22","user_count":3574}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"心跳发送任务已启动,间隔30秒","time":"2025-12-28 19:17:22"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"电调数据定时获取任务已启动,间隔 5 秒","time":"2025-12-28 19:17:22"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"SCADA培训系统服务启动中...","time":"2025-12-28 19:17:22"}
+{"event":"system_startup","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:87","func":"Tech/common.InitLogger","level":"info","msg":"SCADA培训系统启动","pid":30032,"time":"2025-12-28 19:20:23"}
+{"event":"system_startup","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:87","func":"Tech/common.InitLogger","level":"info","msg":"SCADA培训系统启动","pid":30032,"time":"2025-12-28 19:20:23"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"数据库连接监控任务已启动,间隔10秒","time":"2025-12-28 19:20:23"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"日志系统初始化成功","time":"2025-12-28 19:20:23"}
+{"action":"cache_init","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:333","func":"Tech/common.LogInfo","level":"info","module":"user","msg":"开始初始化用户信息缓存...","time":"2025-12-28 19:20:23"}
+{"action":"cache_init_complete","file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:333","func":"Tech/common.LogInfo","level":"info","module":"user","msg":"用户信息缓存初始化完成","time":"2025-12-28 19:20:26","user_count":3574}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"心跳发送任务已启动,间隔30秒","time":"2025-12-28 19:20:26"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"电调数据定时获取任务已启动,间隔 5 秒","time":"2025-12-28 19:20:26"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"SCADA培训系统服务启动中...","time":"2025-12-28 19:20:26"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送全量设备数据到客户端 ws_client_1,设备数量: 535","time":"2025-12-28 19:20:44"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 19:20:56"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 19:21:26"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 19:21:56"}
+{"file":"D:/Work/教员/SCADATrainSys/Tech/common/logger.go:337","func":"Tech/common.LogInfo","level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 19:22:26"}

+ 193 - 0
Tech/log/info.log

@@ -38,3 +38,196 @@
 {"level":"info","msg":"SCADA培训系统服务启动中...","time":"2025-12-27 22:25:28"}
 {"level":"info","msg":"心跳发送任务已启动,间隔30秒","time":"2025-12-27 22:25:28"}
 {"level":"info","msg":"接收到关闭信号,正在优雅关闭服务...","time":"2025-12-27 22:53:23"}
+{"level":"info","msg":"日志系统初始化成功","time":"2025-12-28 17:54:11"}
+{"level":"info","msg":"数据库连接监控任务已启动,间隔10秒","time":"2025-12-28 17:54:11"}
+{"action":"cache_init","level":"info","module":"user","msg":"开始初始化用户信息缓存...","time":"2025-12-28 17:54:11"}
+{"action":"cache_init_complete","level":"info","module":"user","msg":"用户信息缓存初始化完成","time":"2025-12-28 17:54:14","user_count":3574}
+{"level":"info","msg":"电调数据定时获取任务已启动,间隔 5 秒","time":"2025-12-28 17:54:14"}
+{"level":"info","msg":"SCADA培训系统服务启动中...","time":"2025-12-28 17:54:14"}
+{"level":"info","msg":"心跳发送任务已启动,间隔30秒","time":"2025-12-28 17:54:14"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 17:54:44"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 17:55:17"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 17:55:44"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 17:56:14"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 17:56:44"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 17:57:14"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 17:57:44"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 17:58:14"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 17:58:44"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 17:59:14"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 17:59:44"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:00:14"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:00:44"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:01:14"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:24:11"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:24:15"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:24:44"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:25:14"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:25:44"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:26:14"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:26:44"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:27:14"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:27:44"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:28:14"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:28:44"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:29:14"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:29:44"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:30:14"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:30:44"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:31:14"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:31:44"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:32:14"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:32:44"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:33:14"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:33:44"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:34:14"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:34:44"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:35:14"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:35:44"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:36:14"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:36:44"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:37:14"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:37:44"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:38:14"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:38:44"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:39:14"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:39:44"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:40:14"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:40:44"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:41:14"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:41:44"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:42:14"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:42:44"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:43:14"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:43:44"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:44:14"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:44:44"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:45:14"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:45:44"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:46:14"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:46:44"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:47:14"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:47:44"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:48:14"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:48:44"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:49:14"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:49:44"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:50:14"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:50:44"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:51:14"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:51:44"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:52:14"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:52:44"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:53:14"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:53:44"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:54:14"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:54:44"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:55:14"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:55:44"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:56:14"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:56:44"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:57:14"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:57:44"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:58:14"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:58:44"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:59:14"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 18:59:44"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 19:00:14"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 19:00:44"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 19:01:14"}
+{"level":"info","msg":"数据库连接监控任务已启动,间隔10秒","time":"2025-12-28 19:01:47"}
+{"level":"info","msg":"日志系统初始化成功","time":"2025-12-28 19:01:47"}
+{"action":"cache_init","level":"info","module":"user","msg":"开始初始化用户信息缓存...","time":"2025-12-28 19:01:47"}
+{"action":"cache_init_complete","level":"info","module":"user","msg":"用户信息缓存初始化完成","time":"2025-12-28 19:01:50","user_count":3574}
+{"level":"info","msg":"电调数据定时获取任务已启动,间隔 5 秒","time":"2025-12-28 19:01:50"}
+{"level":"info","msg":"SCADA培训系统服务启动中...","time":"2025-12-28 19:01:50"}
+{"level":"info","msg":"心跳发送任务已启动,间隔30秒","time":"2025-12-28 19:01:50"}
+{"level":"info","msg":"成功发送全量设备数据到客户端 ws_client_1,设备数量: 0","time":"2025-12-28 19:01:55"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 19:02:20"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 19:02:50"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 19:03:20"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 19:03:50"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 19:04:20"}
+{"level":"info","msg":"数据库连接监控任务已启动,间隔10秒","time":"2025-12-28 19:04:45"}
+{"level":"info","msg":"日志系统初始化成功","time":"2025-12-28 19:04:45"}
+{"action":"cache_init","level":"info","module":"user","msg":"开始初始化用户信息缓存...","time":"2025-12-28 19:04:45"}
+{"action":"cache_init_complete","level":"info","module":"user","msg":"用户信息缓存初始化完成","time":"2025-12-28 19:04:48","user_count":3574}
+{"level":"info","msg":"电调数据定时获取任务已启动,间隔 5 秒","time":"2025-12-28 19:04:48"}
+{"level":"info","msg":"心跳发送任务已启动,间隔30秒","time":"2025-12-28 19:04:48"}
+{"level":"info","msg":"SCADA培训系统服务启动中...","time":"2025-12-28 19:04:48"}
+{"level":"info","msg":"成功发送全量设备数据到客户端 ws_client_1,设备数量: 535","time":"2025-12-28 19:04:55"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 19:05:18"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 19:05:48"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 19:06:18"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 19:06:48"}
+{"level":"info","msg":"数据库连接监控任务已启动,间隔10秒","time":"2025-12-28 19:07:05"}
+{"level":"info","msg":"日志系统初始化成功","time":"2025-12-28 19:07:05"}
+{"action":"cache_init","level":"info","module":"user","msg":"开始初始化用户信息缓存...","time":"2025-12-28 19:07:05"}
+{"action":"cache_init_complete","level":"info","module":"user","msg":"用户信息缓存初始化完成","time":"2025-12-28 19:07:07","user_count":3574}
+{"level":"info","msg":"电调数据定时获取任务已启动,间隔 5 秒","time":"2025-12-28 19:07:07"}
+{"level":"info","msg":"SCADA培训系统服务启动中...","time":"2025-12-28 19:07:07"}
+{"level":"info","msg":"心跳发送任务已启动,间隔30秒","time":"2025-12-28 19:07:07"}
+{"level":"info","msg":"成功发送全量设备数据到客户端 ws_client_1,设备数量: 535","time":"2025-12-28 19:07:20"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 19:07:38"}
+{"level":"info","msg":"成功发送全量设备数据到客户端 ws_client_2,设备数量: 535","time":"2025-12-28 19:07:40"}
+{"level":"info","msg":"成功发送全量设备数据到客户端 ws_client_3,设备数量: 535","time":"2025-12-28 19:07:43"}
+{"level":"info","msg":"成功发送全量设备数据到客户端 ws_client_4,设备数量: 535","time":"2025-12-28 19:07:44"}
+{"level":"info","msg":"成功发送全量设备数据到客户端 ws_client_5,设备数量: 535","time":"2025-12-28 19:07:51"}
+{"level":"info","msg":"成功发送全量设备数据到客户端 ws_client_6,设备数量: 535","time":"2025-12-28 19:07:52"}
+{"level":"info","msg":"成功发送全量设备数据到客户端 ws_client_7,设备数量: 535","time":"2025-12-28 19:07:53"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 19:08:08"}
+{"level":"info","msg":"成功发送全量设备数据到客户端 ws_client_8,设备数量: 535","time":"2025-12-28 19:08:28"}
+{"level":"info","msg":"成功发送全量设备数据到客户端 ws_client_9,设备数量: 535","time":"2025-12-28 19:08:32"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 19:08:38"}
+{"level":"info","msg":"成功发送全量设备数据到客户端 ws_client_10,设备数量: 535","time":"2025-12-28 19:08:42"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 19:09:08"}
+{"level":"info","msg":"成功发送全量设备数据到客户端 ws_client_11,设备数量: 535","time":"2025-12-28 19:09:22"}
+{"level":"info","msg":"成功发送全量设备数据到客户端 ws_client_12,设备数量: 535","time":"2025-12-28 19:09:24"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 19:09:38"}
+{"level":"info","msg":"数据库连接监控任务已启动,间隔10秒","time":"2025-12-28 19:09:47"}
+{"level":"info","msg":"日志系统初始化成功","time":"2025-12-28 19:09:47"}
+{"action":"cache_init","level":"info","module":"user","msg":"开始初始化用户信息缓存...","time":"2025-12-28 19:09:47"}
+{"action":"cache_init_complete","level":"info","module":"user","msg":"用户信息缓存初始化完成","time":"2025-12-28 19:09:49","user_count":3574}
+{"level":"info","msg":"心跳发送任务已启动,间隔30秒","time":"2025-12-28 19:09:49"}
+{"level":"info","msg":"电调数据定时获取任务已启动,间隔 5 秒","time":"2025-12-28 19:09:49"}
+{"level":"info","msg":"SCADA培训系统服务启动中...","time":"2025-12-28 19:09:49"}
+{"level":"info","msg":"成功发送全量设备数据到客户端 ws_client_1,设备数量: 0","time":"2025-12-28 19:09:49"}
+{"level":"info","msg":"日志系统初始化成功","time":"2025-12-28 19:10:15"}
+{"level":"info","msg":"数据库连接监控任务已启动,间隔10秒","time":"2025-12-28 19:10:15"}
+{"action":"cache_init","level":"info","module":"user","msg":"开始初始化用户信息缓存...","time":"2025-12-28 19:10:15"}
+{"action":"cache_init_complete","level":"info","module":"user","msg":"用户信息缓存初始化完成","time":"2025-12-28 19:10:18","user_count":3574}
+{"level":"info","msg":"电调数据定时获取任务已启动,间隔 5 秒","time":"2025-12-28 19:10:18"}
+{"level":"info","msg":"SCADA培训系统服务启动中...","time":"2025-12-28 19:10:18"}
+{"level":"info","msg":"心跳发送任务已启动,间隔30秒","time":"2025-12-28 19:10:18"}
+{"level":"info","msg":"成功发送全量设备数据到客户端 ws_client_1,设备数量: 0","time":"2025-12-28 19:10:18"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 19:10:48"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 19:11:18"}
+{"level":"info","msg":"日志系统初始化成功","time":"2025-12-28 19:13:17"}
+{"level":"info","msg":"数据库连接监控任务已启动,间隔10秒","time":"2025-12-28 19:13:17"}
+{"action":"cache_init","level":"info","module":"user","msg":"开始初始化用户信息缓存...","time":"2025-12-28 19:13:17"}
+{"action":"cache_init_complete","level":"info","module":"user","msg":"用户信息缓存初始化完成","time":"2025-12-28 19:13:19","user_count":3574}
+{"level":"info","msg":"电调数据定时获取任务已启动,间隔 5 秒","time":"2025-12-28 19:13:19"}
+{"level":"info","msg":"心跳发送任务已启动,间隔30秒","time":"2025-12-28 19:13:19"}
+{"level":"info","msg":"SCADA培训系统服务启动中...","time":"2025-12-28 19:13:19"}
+{"level":"info","msg":"成功发送全量设备数据到客户端 ws_client_1,设备数量: 535","time":"2025-12-28 19:13:41"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 19:13:50"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 19:14:20"}
+{"level":"info","msg":"数据库连接监控任务已启动,间隔10秒","time":"2025-12-28 19:17:20"}
+{"level":"info","msg":"日志系统初始化成功","time":"2025-12-28 19:17:20"}
+{"action":"cache_init","level":"info","module":"user","msg":"开始初始化用户信息缓存...","time":"2025-12-28 19:17:20"}
+{"action":"cache_init_complete","level":"info","module":"user","msg":"用户信息缓存初始化完成","time":"2025-12-28 19:17:22","user_count":3574}
+{"level":"info","msg":"心跳发送任务已启动,间隔30秒","time":"2025-12-28 19:17:22"}
+{"level":"info","msg":"电调数据定时获取任务已启动,间隔 5 秒","time":"2025-12-28 19:17:22"}
+{"level":"info","msg":"SCADA培训系统服务启动中...","time":"2025-12-28 19:17:22"}
+{"level":"info","msg":"数据库连接监控任务已启动,间隔10秒","time":"2025-12-28 19:20:23"}
+{"level":"info","msg":"日志系统初始化成功","time":"2025-12-28 19:20:23"}
+{"action":"cache_init","level":"info","module":"user","msg":"开始初始化用户信息缓存...","time":"2025-12-28 19:20:23"}
+{"action":"cache_init_complete","level":"info","module":"user","msg":"用户信息缓存初始化完成","time":"2025-12-28 19:20:26","user_count":3574}
+{"level":"info","msg":"心跳发送任务已启动,间隔30秒","time":"2025-12-28 19:20:26"}
+{"level":"info","msg":"电调数据定时获取任务已启动,间隔 5 秒","time":"2025-12-28 19:20:26"}
+{"level":"info","msg":"SCADA培训系统服务启动中...","time":"2025-12-28 19:20:26"}
+{"level":"info","msg":"成功发送全量设备数据到客户端 ws_client_1,设备数量: 535","time":"2025-12-28 19:20:44"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 19:20:56"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 19:21:26"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 19:21:56"}
+{"level":"info","msg":"成功发送心跳到信息化服务器","time":"2025-12-28 19:22:26"}

+ 2 - 0
Tech/main.go

@@ -164,6 +164,8 @@ func main() {
 	controllers.InitUserInfoCache()
 	// 启动定时发送心跳任务
 	go sendHeartbeatPeriodically()
+	// 初始化电调数据获取器
+	common.InitElectricalDataFetcher()
 
 	common.LogInfo("SCADA培训系统服务启动中...")
 	beego.Run()

+ 36 - 0
Tech/models/电调模型.go

@@ -241,3 +241,39 @@ func (em *ElectricModelManager) cleanupInactiveClients() {
 		}
 	}
 }
+
+// GetAllEquipmentData 获取所有设备数据
+func (em *ElectricModelManager) GetAllEquipmentData() []DiandiaoModel {
+	em.Mutex.RLock()
+	defer em.Mutex.RUnlock()
+
+	var allModels []DiandiaoModel
+	for _, viewMapModel := range em.Models {
+		allModels = append(allModels, viewMapModel.Models...)
+	}
+	return allModels
+}
+
+// ConvertToEquipmentData 转换设备数据格式
+func (em *ElectricModelManager) ConvertToEquipmentData(models []DiandiaoModel) []map[string]interface{} {
+	var equipmentsData []map[string]interface{}
+
+	for _, model := range models {
+		equip := map[string]interface{}{
+			"dataId":      model.EqpmtStrID,
+			"id":          model.EqpmtStrID,
+			"dataName":    model.EqpmtStdName,
+			"eqpmtTypeID": model.EqpmtTypeID,
+		}
+
+		if model.CMDType == 0 { // 设备状态
+			equip["value"] = fmt.Sprintf("%d", model.EqpmtStatus)
+		} else if model.CMDType == 1 { // 设备数据控制
+			equip["value"] = fmt.Sprintf("%d", model.FValue)
+		}
+
+		equipmentsData = append(equipmentsData, equip)
+	}
+
+	return equipmentsData
+}

+ 3 - 0
Tech/routers/router.go

@@ -124,4 +124,7 @@ func init() {
 	beego.Router("/log/download", &controllers.LogController{}, "get:LogDownload")
 	beego.Router("/log/level/set", &controllers.LogController{}, "post:LogLevelSet")
 	beego.Router("/log/delete", &controllers.LogController{}, "post:LogDelete")
+
+	// WebSocket路由
+	beego.Router("/ws/equipment", &controllers.WebSocketController{}, "get:Handle")
 }

+ 249 - 0
Tech/static/equipment_monitor.html

@@ -0,0 +1,249 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>设备监控</title>
+    <style>
+        body {
+            font-family: Arial, sans-serif;
+            margin: 20px;
+            background-color: #f5f5f5;
+        }
+        .container {
+            max-width: 1400px;
+            margin: 0 auto;
+            background-color: white;
+            padding: 20px;
+            border-radius: 8px;
+            box-shadow: 0 2px 4px rgba(0,0,0,0.1);
+        }
+        .header {
+            display: flex;
+            justify-content: space-between;
+            align-items: center;
+            margin-bottom: 20px;
+            padding-bottom: 20px;
+            border-bottom: 2px solid #007bff;
+        }
+        .status {
+            display: inline-block;
+            padding: 5px 15px;
+            border-radius: 4px;
+            font-weight: bold;
+        }
+        .status.connected {
+            background-color: #28a745;
+            color: white;
+        }
+        .status.disconnected {
+            background-color: #dc3545;
+            color: white;
+        }
+        .equipment-grid {
+            display: grid;
+            grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
+            gap: 15px;
+        }
+        .equipment-card {
+            background-color: #f9f9f9;
+            border: 2px solid #ddd;
+            border-radius: 8px;
+            padding: 15px;
+            transition: all 0.3s ease;
+        }
+        .equipment-card.changed {
+            background-color: #fff3cd;
+            border-color: #ffc107;
+            transform: scale(1.05);
+        }
+        .equipment-name {
+            font-size: 14px;
+            color: #666;
+            margin-bottom: 10px;
+        }
+        .equipment-value {
+            font-size: 24px;
+            font-weight: bold;
+            color: #007bff;
+            margin-bottom: 5px;
+        }
+        .equipment-id {
+            font-size: 12px;
+            color: #999;
+        }
+        .info-bar {
+            display: flex;
+            gap: 30px;
+            margin-bottom: 20px;
+            padding: 10px;
+            background-color: #e9ecef;
+            border-radius: 4px;
+        }
+        .info-item {
+            display: flex;
+            flex-direction: column;
+        }
+        .info-label {
+            font-size: 12px;
+            color: #666;
+        }
+        .info-value {
+            font-size: 18px;
+            font-weight: bold;
+            color: #007bff;
+        }
+    </style>
+</head>
+<body>
+    <div class="container">
+        <div class="header">
+            <h1>实时设备监控系统</h1>
+            <div id="status" class="status disconnected">未连接</div>
+        </div>
+
+        <div class="info-bar">
+            <div class="info-item">
+                <span class="info-label">设备数量</span>
+                <span class="info-value" id="equipmentCount">0</span>
+            </div>
+            <div class="info-item">
+                <span class="info-label">线路号</span>
+                <span class="info-value" id="lineID">0</span>
+            </div>
+            <div class="info-item">
+                <span class="info-label">最后更新</span>
+                <span class="info-value" id="lastUpdate">-</span>
+            </div>
+        </div>
+
+        <div id="equipmentGrid" class="equipment-grid"></div>
+    </div>
+
+    <script>
+        let ws = null;
+        let equipmentData = {};
+
+        function connect() {
+            const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';
+            const host = window.location.host;
+            const url = `${protocol}//${host}/ws/equipment`;
+
+            console.log('正在连接到WebSocket:', url);
+
+            ws = new WebSocket(url);
+
+            ws.onopen = function(event) {
+                console.log('WebSocket连接成功');
+                updateStatus(true);
+            };
+
+        ws.onmessage = function(event) {
+            try {
+                const message = JSON.parse(event.data);
+
+                if (message.event === 'connected') {
+                    console.log('已连接,客户端ID:', message.data.clientID);
+                    document.getElementById('lineID').textContent = message.data.lineID || 0;
+                } else if (Array.isArray(message)) {
+                    // 直接处理设备数组
+                    console.log('收到设备数据,数量:', message.length);
+                    updateEquipmentList(message);
+                    document.getElementById('equipmentCount').textContent = message.length;
+                    document.getElementById('lastUpdate').textContent = new Date().toLocaleTimeString();
+                }
+            } catch (e) {
+                console.error('解析消息失败:', e);
+            }
+        };
+
+            ws.onerror = function(error) {
+                console.error('WebSocket错误:', error);
+            };
+
+            ws.onclose = function(event) {
+                console.log('WebSocket连接已关闭');
+                updateStatus(false);
+                // 自动重连
+                setTimeout(connect, 3000);
+            };
+        }
+
+        function updateStatus(connected) {
+            const statusDiv = document.getElementById('status');
+            if (connected) {
+                statusDiv.className = 'status connected';
+                statusDiv.textContent = '已连接';
+            } else {
+                statusDiv.className = 'status disconnected';
+                statusDiv.textContent = '未连接';
+            }
+        }
+
+        function updateEquipmentList(equipments) {
+            const container = document.getElementById('equipmentGrid');
+
+            // 标记现有设备
+            const existingElements = {};
+            container.querySelectorAll('.equipment-card').forEach(element => {
+                existingElements[element.dataset.id] = element;
+            });
+
+            // 更新或添加设备
+            equipments.forEach(equip => {
+                let element = existingElements[equip.id];
+                const oldValue = equipmentData[equip.id];
+
+                // 检查值是否变化
+                const valueChanged = oldValue !== undefined && oldValue !== equip.value;
+
+                if (element) {
+                    // 更新现有设备
+                    const valueElement = element.querySelector('.equipment-value');
+                    valueElement.textContent = equip.value;
+
+                    if (valueChanged) {
+                        element.classList.add('changed');
+                        setTimeout(() => {
+                            element.classList.remove('changed');
+                        }, 1000);
+                    }
+
+                    // 移除已处理标记
+                    delete existingElements[equip.id];
+                } else {
+                    // 添加新设备
+                    element = document.createElement('div');
+                    element.className = 'equipment-card changed';
+                    element.dataset.id = equip.id;
+                    element.innerHTML = `
+                        <div class="equipment-name">${equip.dataName}</div>
+                        <div class="equipment-value">${equip.value}</div>
+                        <div class="equipment-id">ID: ${equip.dataId}</div>
+                    `;
+                    container.appendChild(element);
+
+                    setTimeout(() => {
+                        element.classList.remove('changed');
+                    }, 1000);
+                }
+
+                // 更新数据缓存
+                equipmentData[equip.id] = equip.value;
+            });
+
+            // 移除不存在的设备
+            Object.values(existingElements).forEach(element => {
+                element.remove();
+                const id = element.dataset.id;
+                delete equipmentData[id];
+            });
+        }
+
+        // 页面加载时自动连接
+        window.onload = function() {
+            connect();
+        };
+    </script>
+</body>
+</html>

+ 335 - 0
Tech/websocket_test.html

@@ -0,0 +1,335 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>WebSocket设备数据测试</title>
+    <style>
+        body {
+            font-family: Arial, sans-serif;
+            margin: 20px;
+            padding: 20px;
+            background-color: #f5f5f5;
+        }
+        .container {
+            max-width: 1200px;
+            margin: 0 auto;
+            background-color: white;
+            padding: 20px;
+            border-radius: 8px;
+            box-shadow: 0 2px 4px rgba(0,0,0,0.1);
+        }
+        .status {
+            padding: 10px;
+            margin: 10px 0;
+            border-radius: 4px;
+        }
+        .status.connected {
+            background-color: #d4edda;
+            color: #155724;
+            border: 1px solid #c3e6cb;
+        }
+        .status.disconnected {
+            background-color: #f8d7da;
+            color: #721c24;
+            border: 1px solid #f5c6cb;
+        }
+        button {
+            background-color: #007bff;
+            color: white;
+            border: none;
+            padding: 10px 20px;
+            border-radius: 4px;
+            cursor: pointer;
+            font-size: 14px;
+            margin: 5px;
+        }
+        button:hover {
+            background-color: #0056b3;
+        }
+        button:disabled {
+            background-color: #cccccc;
+            cursor: not-allowed;
+        }
+        .equipment-list {
+            display: grid;
+            grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
+            gap: 10px;
+            margin-top: 20px;
+        }
+        .equipment-item {
+            padding: 10px;
+            border: 1px solid #ddd;
+            border-radius: 4px;
+            background-color: #f9f9f9;
+        }
+        .equipment-item.changed {
+            background-color: #fff3cd;
+            border-color: #ffc107;
+            animation: highlight 2s;
+        }
+        @keyframes highlight {
+            0% { background-color: #ffc107; }
+            100% { background-color: #fff3cd; }
+        }
+        .equipment-name {
+            font-weight: bold;
+            margin-bottom: 5px;
+        }
+        .equipment-value {
+            color: #007bff;
+            font-size: 18px;
+        }
+        .equipment-type {
+            color: #666;
+            font-size: 12px;
+        }
+        .stats {
+            display: flex;
+            gap: 20px;
+            margin: 20px 0;
+            padding: 10px;
+            background-color: #e9ecef;
+            border-radius: 4px;
+        }
+        .stat-item {
+            display: flex;
+            flex-direction: column;
+        }
+        .stat-label {
+            font-size: 12px;
+            color: #666;
+        }
+        .stat-value {
+            font-size: 18px;
+            font-weight: bold;
+        }
+        .log-container {
+            margin-top: 20px;
+            border: 1px solid #ddd;
+            border-radius: 4px;
+            padding: 10px;
+            height: 200px;
+            overflow-y: auto;
+            background-color: #f9f9f9;
+        }
+        .log-entry {
+            margin: 5px 0;
+            padding: 5px;
+            border-bottom: 1px solid #eee;
+            font-size: 12px;
+        }
+        .log-entry.info {
+            color: #007bff;
+        }
+        .log-entry.error {
+            color: #dc3545;
+        }
+        .log-entry.success {
+            color: #28a745;
+        }
+    </style>
+</head>
+<body>
+    <div class="container">
+        <h1>WebSocket设备数据实时推送测试</h1>
+
+        <div id="status" class="status disconnected">
+            状态: 未连接
+        </div>
+
+        <div>
+            <button id="connectBtn" onclick="connect()">连接WebSocket</button>
+            <button id="disconnectBtn" onclick="disconnect()" disabled>断开连接</button>
+            <button onclick="clearLog()">清空日志</button>
+            <button onclick="clearEquipment()">清空设备列表</button>
+        </div>
+
+        <div class="stats">
+            <div class="stat-item">
+                <span class="stat-label">设备数量</span>
+                <span class="stat-value" id="equipmentCount">0</span>
+            </div>
+            <div class="stat-item">
+                <span class="stat-label">接收消息数</span>
+                <span class="stat-value" id="messageCount">0</span>
+            </div>
+            <div class="stat-item">
+                <span class="stat-label">线路号</span>
+                <span class="stat-value" id="lineID">0</span>
+            </div>
+        </div>
+
+        <h2>设备列表</h2>
+        <div id="equipmentList" class="equipment-list"></div>
+
+        <h2>连接日志</h2>
+        <div id="logContainer" class="log-container"></div>
+    </div>
+
+    <script>
+        let ws = null;
+        let messageCount = 0;
+        let equipmentData = {};
+
+        function connect() {
+            // 根据当前页面协议选择ws或wss
+            const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';
+            const host = window.location.host;
+            const url = `${protocol}//${host}/ws/equipment`;
+
+            log('info', `正在连接到WebSocket: ${url}`);
+
+            ws = new WebSocket(url);
+
+            ws.onopen = function(event) {
+                log('success', 'WebSocket连接成功');
+                updateStatus(true);
+                document.getElementById('connectBtn').disabled = true;
+                document.getElementById('disconnectBtn').disabled = false;
+            };
+
+            ws.onmessage = function(event) {
+                messageCount++;
+                document.getElementById('messageCount').textContent = messageCount;
+
+                try {
+                    const message = JSON.parse(event.data);
+
+                    if (message.event === 'connected') {
+                        log('success', `已连接,客户端ID: ${message.data.clientID},线路号: ${message.data.lineID}`);
+                        document.getElementById('lineID').textContent = message.data.lineID || 0;
+                    } else if (Array.isArray(message)) {
+                        // 直接处理设备数组
+                        log('info', `收到设备数据,数量: ${message.length}`);
+                        updateEquipmentList(message);
+                        document.getElementById('equipmentCount').textContent = message.length;
+                    }
+                } catch (e) {
+                    log('error', `解析消息失败: ${e.message}`);
+                }
+            };
+
+            ws.onerror = function(event) {
+                log('error', 'WebSocket发生错误');
+                console.error('WebSocket error:', event);
+            };
+
+            ws.onclose = function(event) {
+                log('info', 'WebSocket连接已关闭');
+                updateStatus(false);
+                document.getElementById('connectBtn').disabled = false;
+                document.getElementById('disconnectBtn').disabled = true;
+            };
+        }
+
+        function disconnect() {
+            if (ws) {
+                ws.close();
+                ws = null;
+            }
+        }
+
+        function updateStatus(connected) {
+            const statusDiv = document.getElementById('status');
+            if (connected) {
+                statusDiv.className = 'status connected';
+                statusDiv.textContent = '状态: 已连接';
+            } else {
+                statusDiv.className = 'status disconnected';
+                statusDiv.textContent = '状态: 未连接';
+            }
+        }
+
+        function updateEquipmentList(equipments) {
+            const container = document.getElementById('equipmentList');
+
+            // 标记现有设备
+            const existingElements = {};
+            container.querySelectorAll('.equipment-item').forEach(element => {
+                existingElements[element.dataset.id] = element;
+            });
+
+            // 更新或添加设备
+            equipments.forEach(equip => {
+                let element = existingElements[equip.id];
+                const oldValue = equipmentData[equip.id];
+
+                // 检查值是否变化
+                const valueChanged = oldValue !== undefined && oldValue !== equip.value;
+
+                if (element) {
+                    // 更新现有设备
+                    const valueElement = element.querySelector('.equipment-value');
+                    valueElement.textContent = equip.value;
+
+                    if (valueChanged) {
+                        element.classList.add('changed');
+                        setTimeout(() => {
+                            element.classList.remove('changed');
+                        }, 2000);
+                    }
+
+                    // 移除已处理标记
+                    delete existingElements[equip.id];
+                } else {
+                    // 添加新设备
+                    element = document.createElement('div');
+                    element.className = 'equipment-item changed';
+                    element.dataset.id = equip.id;
+                    element.innerHTML = `
+                        <div class="equipment-name">${equip.dataName}</div>
+                        <div class="equipment-value">${equip.value}</div>
+                        <div class="equipment-type">ID: ${equip.dataId}</div>
+                    `;
+                    container.appendChild(element);
+
+                    setTimeout(() => {
+                        element.classList.remove('changed');
+                    }, 2000);
+                }
+
+                // 更新数据缓存
+                equipmentData[equip.id] = equip.value;
+            });
+
+            // 移除不存在的设备
+            Object.values(existingElements).forEach(element => {
+                element.remove();
+                const id = element.dataset.id;
+                delete equipmentData[id];
+            });
+        }
+
+        function log(type, message) {
+            const container = document.getElementById('logContainer');
+            const entry = document.createElement('div');
+            entry.className = `log-entry ${type}`;
+
+            const time = new Date().toLocaleTimeString();
+            entry.textContent = `[${time}] ${message}`;
+
+            container.insertBefore(entry, container.firstChild);
+
+            // 限制日志条数
+            while (container.children.length > 100) {
+                container.removeChild(container.lastChild);
+            }
+        }
+
+        function clearLog() {
+            document.getElementById('logContainer').innerHTML = '';
+        }
+
+        function clearEquipment() {
+            document.getElementById('equipmentList').innerHTML = '';
+            equipmentData = {};
+        }
+
+        // 页面加载时自动连接
+        window.onload = function() {
+            log('info', '页面已加载,点击"连接WebSocket"按钮开始连接');
+        };
+    </script>
+</body>
+</html>