Explorar el Código

temp: 临时提交

jerry.liang hace 1 año
padre
commit
13c2a86634

+ 25 - 1
service/jobs/getAlarmSnapshot.go

@@ -10,6 +10,7 @@ import (
 	"io"
 	"net/http"
 	"os"
+	"path/filepath"
 
 	"go.uber.org/zap"
 )
@@ -79,12 +80,35 @@ func GetAlarmSnapshot(sn, logTime string) error {
 	defer os.RemoveAll(tempDir) // 程序结束时清理临时目录
 
 	for _, info := range snapshotList {
+		snapFileName := filepath.Join(tempDir, info.FileName)
 		// 下载快照文件
-		if err = files.DownloadFile(info.FileUrl, tempDir+"/"+info.FileName); err != nil {
+		if err = files.DownloadFile(info.FileUrl, snapFileName); err != nil {
+			zap.L().Error("快照文件下载失败。", zap.String("err", err.Error()))
 			return err
 		}
 
+		// 创建解压目标文件夹
+		snapDir := filepath.Join(tempDir, fmt.Sprintf("AlarmSnapshot_%d", info.Id))
+		if err = files.CheckAndCreateDir(snapDir); err != nil {
+			zap.L().Error("文件夹创建失败", zap.String("err", err.Error()))
+			return err
+		}
+
+		// 解压包文件
+		if err = files.AutoExtract(snapFileName, snapDir); err != nil {
+			zap.L().Error("解压快照包失败", zap.String("err", err.Error()))
+			return err
+		}
+
+		// 包文件有两个版本:
+		// 1 - 包中文件内容为字符串,直接读取即可
+		// 2 - 包中数据为16进制数据,须配合VID/PID表解析
+
+		// 判断包类型
+		// TODO
+
 		// 解析文件并写入数据库
+
 	}
 
 	return nil

+ 18 - 0
service/models/siteAlarmSnapshot.go

@@ -0,0 +1,18 @@
+package models
+
+import (
+	"fwh-toolbox-server/database"
+	"time"
+
+	"gorm.io/datatypes"
+)
+
+var db = database.PgSQL
+
+type SiteAlarmSnapshotModel struct {
+	ID        int64          `gorm:"primaryKey"` // 使用雪花ID算法
+	SN        string         `gorm:"size:64;not null;uniqueIndex:idx_type_sn_time"`
+	PackageID uint64         `gorm:"not null"`
+	LogTime   time.Time      `gorm:"type:timestamp;not null;uniqueIndex:idx_type_sn_time"` // TIMESTAMP WITHOUT TIME ZONE
+	JsonData  datatypes.JSON `gorm:"type:jsonb"`
+}

+ 2 - 2
service/models/siteOriginalData.go

@@ -29,7 +29,7 @@ const (
  * MQTT类型数据的ChildType为cmdType,如:0、101、201等
  */
 
-type SiteOriginalData struct {
+type SiteOriginalDataModel struct {
 	ID           int64          `gorm:"primaryKey"` // 使用雪花ID算法
 	DataType     DataTypes      `gorm:"size:64;not null;uniqueIndex:idx_type_sn_time"`
 	ChildType    string         `gorm:"size:64;not null;uniqueIndex:idx_type_sn_time"`
@@ -40,7 +40,7 @@ type SiteOriginalData struct {
 }
 
 // 指定 schema
-func (SiteOriginalData) TableName() string {
+func (SiteOriginalDataModel) TableName() string {
 	return "original.site_original_data"
 }
 

+ 29 - 0
service/utils/files/dir.go

@@ -0,0 +1,29 @@
+package files
+
+import (
+	"os"
+)
+
+// CheckAndCreateDir 检查文件夹是否存在,不存在则创建(包括各级父目录)
+func CheckAndCreateDir(dirPath string) error {
+	// 检查文件夹是否存在
+	_, err := os.Stat(dirPath)
+	if err == nil {
+		// 文件夹已存在
+		return nil
+	}
+
+	// 判断错误类型是否为不存在
+	if os.IsNotExist(err) {
+		// 创建文件夹,0755表示权限:所有者可读写执行,组和其他用户可读执行
+		// MkdirAll会递归创建所有不存在的父目录
+		err := os.MkdirAll(dirPath, 0755)
+		if err != nil {
+			return err
+		}
+		return nil
+	}
+
+	// 其他错误(如权限问题等)
+	return err
+}