85 lines
2.2 KiB
Go
85 lines
2.2 KiB
Go
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,
|
|
})
|
|
}
|