From ff16ea09d283f0a4b1cb4d59bc50056415cd7354 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 4 Mar 2026 01:03:04 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dresisted=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E8=A2=AB=E9=BB=98=E8=AE=A4=E5=80=BC=E8=A6=86=E7=9B=96=E4=B8=BA?= =?UTF-8?q?1=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/smoke/service/smoke_log_service.go | 44 ++++++++++-- .../smoke/service/smoke_log_service_test.go | 70 +++++++++++++++++++ 2 files changed, 110 insertions(+), 4 deletions(-) create mode 100644 internal/smoke/service/smoke_log_service_test.go diff --git a/internal/smoke/service/smoke_log_service.go b/internal/smoke/service/smoke_log_service.go index 49570d4..4b7c9f9 100644 --- a/internal/smoke/service/smoke_log_service.go +++ b/internal/smoke/service/smoke_log_service.go @@ -19,6 +19,24 @@ type SmokeLogService struct { db *gorm.DB } +// smokeLogCreateRow 用于写入 fa_smoke_log,避免 SmokeLog 的 default 标签覆盖 0 值。 +type smokeLogCreateRow struct { + ID int `gorm:"column:id;primaryKey;autoIncrement"` + UID int `gorm:"column:uid"` + SmokeTime *time.Time `gorm:"column:smoke_time"` + SmokeAt *time.Time `gorm:"column:smoke_at"` + Remark string `gorm:"column:remark"` + CreateTime *int64 `gorm:"column:createtime"` + UpdateTime *int64 `gorm:"column:updatetime"` + DeleteTime *int64 `gorm:"column:deletetime"` + Level *int64 `gorm:"column:level"` + Num *int `gorm:"column:num"` +} + +func (smokeLogCreateRow) TableName() string { + return "fa_smoke_log" +} + func NewSmokeLogService(db *gorm.DB) *SmokeLogService { return &SmokeLogService{db: db} } @@ -59,20 +77,38 @@ func (s *SmokeLogService) Create(ctx context.Context, uid int, req CreateSmokeLo smokeTime = &startOfDay } - record := smokemodel.SmokeLog{ + insert := smokeLogCreateRow{ UID: uid, SmokeTime: smokeTime, SmokeAt: smokeAt, Remark: req.Remark, CreateTime: &createTime, UpdateTime: &updateTime, - Level: level, - Num: num, + Level: &level, + Num: &num, } - if err := s.db.WithContext(ctx).Create(&record).Error; err != nil { + if err := s.db.WithContext(ctx).Create(&insert).Error; err != nil { return nil, fmt.Errorf("create smoke log: %w", err) } + + record := smokemodel.SmokeLog{ + ID: insert.ID, + UID: insert.UID, + SmokeTime: insert.SmokeTime, + SmokeAt: insert.SmokeAt, + Remark: insert.Remark, + CreateTime: insert.CreateTime, + UpdateTime: insert.UpdateTime, + DeleteTime: insert.DeleteTime, + } + if insert.Level != nil { + record.Level = *insert.Level + } + if insert.Num != nil { + record.Num = *insert.Num + } + return &record, nil } diff --git a/internal/smoke/service/smoke_log_service_test.go b/internal/smoke/service/smoke_log_service_test.go new file mode 100644 index 0000000..bf789a3 --- /dev/null +++ b/internal/smoke/service/smoke_log_service_test.go @@ -0,0 +1,70 @@ +package service + +import ( + "context" + "testing" + "time" + + smokemodel "wx_service/internal/smoke/model" + + "gorm.io/driver/sqlite" + "gorm.io/gorm" + "gorm.io/gorm/logger" +) + +func setupSmokeLogServiceTestDB(t *testing.T) *gorm.DB { + t.Helper() + + db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{ + Logger: logger.Default.LogMode(logger.Silent), + }) + if err != nil { + t.Fatalf("open sqlite: %v", err) + } + + if err := db.Exec(` +CREATE TABLE fa_smoke_log ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + uid INTEGER NOT NULL, + smoke_time DATE NULL, + smoke_at DATETIME NULL, + remark TEXT, + createtime INTEGER, + updatetime INTEGER, + deletetime INTEGER, + level INTEGER DEFAULT 1, + num INTEGER DEFAULT 1 +)`).Error; err != nil { + t.Fatalf("create fa_smoke_log: %v", err) + } + + return db +} + +func TestSmokeLogServiceCreateKeepsZeroForResisted(t *testing.T) { + t.Parallel() + + db := setupSmokeLogServiceTestDB(t) + svc := NewSmokeLogService(db) + + smokeAt := time.Date(2026, 3, 4, 0, 59, 0, 0, time.Local) + _, err := svc.Create(context.Background(), 1001, CreateSmokeLogRequest{ + SmokeAt: &smokeAt, + Remark: "resist", + Level: 0, + Num: 0, + }) + if err != nil { + t.Fatalf("create resisted log: %v", err) + } + + var got smokemodel.SmokeLog + if err := db.Where("uid = ?", 1001).Order("id DESC").First(&got).Error; err != nil { + t.Fatalf("load created record: %v", err) + } + + if got.Level != 0 || got.Num != 0 { + t.Fatalf("created resisted log level/num=(%d,%d), want=(0,0)", got.Level, got.Num) + } +} +