Files
wx_service/internal/smoke/model/smoke_profile.go
T
nepiedg fd097729d7 feat: 戒烟成就、梦想图标预设、打卡统计与依赖注入调整
- 成就系统、连续打卡天数计算、管理后台成就 CRUD
- 梦想目标图标预设 DreamPreset 与用户端 dream-presets 接口
- 管理后台梦想图标 CRUD;戒烟打卡 summary 修正
- 忽略根目录编译产物 /api

Made-with: Cursor
2026-04-04 14:55:50 +08:00

89 lines
3.0 KiB
Go

package model
import (
"database/sql/driver"
"encoding/json"
"errors"
"fmt"
"time"
"gorm.io/gorm"
)
// StringSlice 是一个以 JSON 数组形式存储到 MySQL 的 []string。
type StringSlice []string
func (s StringSlice) Value() (driver.Value, error) {
if s == nil {
return "[]", nil
}
b, err := json.Marshal([]string(s))
if err != nil {
return nil, err
}
return string(b), nil
}
func (s *StringSlice) Scan(value any) error {
if s == nil {
return errors.New("StringSlice: Scan on nil receiver")
}
switch v := value.(type) {
case nil:
*s = nil
return nil
case []byte:
if len(v) == 0 {
*s = nil
return nil
}
return json.Unmarshal(v, s)
case string:
if v == "" {
*s = nil
return nil
}
return json.Unmarshal([]byte(v), s)
default:
return fmt.Errorf("StringSlice: unsupported Scan type %T", value)
}
}
// SmokeUserProfile 存储用户“首次进入小程序”的戒烟基础信息,用于:
// - 建立初始基准(例如:基于日均支数计算初始建议间隔)
// - AI 个性化(动机/动力/作息)
// - 看板指标计算(如已省金额、恢复时长等)
type SmokeUserProfile struct {
ID uint `gorm:"primaryKey;comment:主键" json:"id"`
CreatedAt time.Time `gorm:"comment:创建时间" json:"created_at"`
UpdatedAt time.Time `gorm:"comment:更新时间" json:"updated_at"`
DeletedAt gorm.DeletedAt `gorm:"index;comment:删除时间" json:"-"`
UID int `gorm:"uniqueIndex;comment:用户ID" json:"-"`
BaselineCigsPerDay int `gorm:"column:baseline_cigs_per_day;comment:基础烟量(日均抽烟支数)" json:"baseline_cigs_per_day"`
SmokingYears float64 `gorm:"column:smoking_years;type:decimal(6,2);comment:烟龄(年)" json:"smoking_years"`
PackPriceCent int `gorm:"column:pack_price_cent;comment:单包价格(分)" json:"pack_price_cent"`
SmokeMotivations StringSlice `gorm:"column:smoke_motivations;type:json;comment:抽烟动机(JSON数组)" json:"smoke_motivations"`
QuitMotivations StringSlice `gorm:"column:quit_motivations;type:json;comment:戒烟动力(JSON数组)" json:"quit_motivations"`
Mode string `gorm:"column:mode;size:16;default:record;comment:使用模式(quit=戒烟打卡,record=记录抽烟)" json:"mode,omitempty"`
WakeUpTime string `gorm:"column:wake_up_time;size:5;comment:起床时间(HH:MM)" json:"wake_up_time"`
SleepTime string `gorm:"column:sleep_time;size:5;comment:入睡时间(HH:MM)" json:"sleep_time"`
QuitDate *time.Time `gorm:"column:quit_date;type:date;comment:目标戒烟日期" json:"quit_date,omitempty"`
AchievementThemeID *uint `gorm:"column:achievement_theme_id;comment:成就主题ID" json:"achievement_theme_id,omitempty"`
OnboardingCompletedAt *time.Time `gorm:"column:onboarding_completed_at;comment:首次补全完成时间" json:"onboarding_completed_at,omitempty"`
}
func (SmokeUserProfile) TableName() string {
return "fa_smoke_user_profile"
}
func (SmokeUserProfile) TableComment() string {
return "戒烟-用户基础信息"
}