package controllers import ( "github.com/gin-gonic/gin" "gorm.io/gorm" "gorm.io/gorm/clause" "hr_receiver/config" "hr_receiver/models" "net/http" ) type StepTrainingController struct { DB *gorm.DB } func NewStepTrainingController() *StepTrainingController { return &StepTrainingController{DB: config.DB} } // 接收训练记录 func (tc *StepTrainingController) CreateTrainingRecord(c *gin.Context) { var record models.StepTrainRecord // 绑定并验证JSON数据 if err := c.ShouldBindJSON(&record); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } // 使用事务保存数据[4](@ref) err := tc.DB.Transaction(func(tx *gorm.DB) error { // 保存主记录 if err := tx.Clauses(clause.OnConflict{ Columns: []clause.Column{{Name: "train_id"}}, // 指定冲突的列 DoUpdates: clause.Assignments(map[string]interface{}{ "max_heart_rate": record.MaxHeartRate, "start_time": record.StartTime, "end_time": record.EndTime, "duration": record.Duration, "dead_zone": record.DeadZone, "name": record.Name, "evaluation": record.Evaluation, }), }).Omit("HeartRates", "StrideFreqs").Create(&record).Error; err != nil { return err } // 保存关联的心率数据 for i := range record.HeartRates { if err := tx.Clauses( clause.OnConflict{ Columns: []clause.Column{{Name: "identifier"}}, // 指定冲突的列 DoUpdates: clause.Assignments(map[string]interface{}{"value": record.HeartRates[i].Value, "time": record.HeartRates[i].Time}), }, ).Create(&record.HeartRates[i]).Error; err != nil { return err } } for i := range record.StrideFreqs { if err := tx.Clauses( clause.OnConflict{ Columns: []clause.Column{{Name: "identifier"}}, // 指定冲突的列 DoUpdates: clause.Assignments(map[string]interface{}{"value": record.StrideFreqs[i].Value, "time": record.StrideFreqs[i].Time}), }, ).Create(&record.StrideFreqs[i]).Error; err != nil { return err } } return nil }) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } c.JSON(http.StatusCreated, gin.H{ "message": "数据保存成功", "id": record.TrainId, }) }