package pgsql_original import ( "errors" "fmt" "fwh-toolbox-server/database" "fwh-toolbox-server/domain" "time" "go.uber.org/zap" "gorm.io/datatypes" "gorm.io/gorm" ) type LogOriginalRecord struct { ID uint `gorm:"primaryKey"` SN string CmdType string Time time.Time `gorm:"type:timestamp without time zone"` Data datatypes.JSON `gorm:"type:jsonb"` // ✅ 指定 PostgreSQL JSONB 类型 } type QuerySitesAnalysisRecord struct { Name string DB *gorm.DB } func CreateSitesAnalysisRecordTable(name string) (*QuerySitesAnalysisRecord, error) { tabName := "original." + name // 动态建表 if !database.PgSQL.Migrator().HasTable(tabName) { if err := database.PgSQL.Table(tabName).AutoMigrate(&LogOriginalRecord{}); err != nil { zap.L().Error("AutoMigrate SitesAnalysisRecordTable failed", zap.String("err", err.Error())) return nil, err } } return &QuerySitesAnalysisRecord{ Name: tabName, DB: database.PgSQL.Table(tabName), }, nil } func (query *QuerySitesAnalysisRecord) InsertSitesAnalysisRecord(data domain.MqttLogItem) error { if query.DB == nil { zap.L().Error("数据库未初始化,请先调用CreateSitesAnalysisRecordTable初始化数据库。") return errors.New("please call CreateSitesAnalysisRecordTable to initialize the database first") } logTime, err := time.Parse(time.DateTime, data.LogTime) if err != nil { zap.L().Error("logTime格式错误", zap.String("time", data.LogTime), zap.String("err", err.Error())) return fmt.Errorf("logTime格式错误 logTime=%s %w", data.LogTime, err) } record := LogOriginalRecord{ SN: data.GatewayId, CmdType: data.CmdType, Time: logTime, Data: datatypes.JSON(data.LogData), } if err := query.DB.Create(&record).Error; err != nil { zap.L().Error("插入LogOriginalRecord数据失败", zap.String("err", err.Error())) return fmt.Errorf("插入LogOriginalRecord数据失败 %w", err) } return nil }