package model // 养护方案:一套「这个物种、这个阶段该做哪些事」的配置。 // 后台可以给同一个 (species, stage) 配多套,建档时让用户挑一套套用, // 也可以不套用、自己排。原来是一个组合只能有一套(唯一索引卡着), // 「让用户选模版」这件事在数据模型上做不到。 // 物种取值 const ( SpeciesCat = "cat" SpeciesDog = "dog" ) // 明细的类别。原来还有个 task(今日任务),已经和 plan 合并—— // 「今天要做的事」就是「今天那一天的计划节点」,两套并存的结果是 // 用户在计划页加的「每天喂药」在首页看不到。 const ( CareKindPlan = "plan" // 计划节点(含每天/每周/每月重复) CareKindReminder = "reminder" // 到期提醒(疫苗、驱虫这类有固定周期的) ) // 重复规则。月度计划要的是「多久做一次」,不是「第几天做」—— // 原来只有 Day 偏移,月底建档的话 day=14/21/30 全落到下个月, // 用户建完档打开计划页发现本月是空的。 const ( RepeatOnce = "once" // 一次性,按 Day 偏移(到家第 N 天,疫苗序列要用) RepeatDaily = "daily" // 每天 RepeatWeekly = "weekly" // 每周某几天,看 Weekdays RepeatMonthly = "monthly" // 每月某天,看 MonthDay ) // CareTemplate 一套方案 type CareTemplate struct { Base Species string `gorm:"size:16;index" json:"species"` // cat | dog Stage string `gorm:"size:48;index" json:"stage"` // 与 onboarding 阶段一致 // Name 方案名。建档时用户看到的就是这个,要能一眼分辨 // (「幼猫标准照护」/「幼猫省心版」) Name string `gorm:"size:64" json:"name"` // Summary 一句话摘要,选择列表里展示 Summary string `gorm:"size:255" json:"summary"` Sort int `json:"sort"` Enabled bool `gorm:"default:true" json:"enabled"` Items []CareTemplateItem `gorm:"foreignKey:TemplateID" json:"items"` } // CareTemplateItem 明细,kind 区分两类;不同类只用到部分字段 type CareTemplateItem struct { Base TemplateID string `gorm:"size:24;index" json:"template_id"` Kind string `gorm:"size:16;index" json:"kind"` // plan | reminder Sort int `json:"sort"` Title string `gorm:"size:128" json:"title"` Description string `gorm:"size:512" json:"description"` // plan 专用 Priority string `gorm:"size:16" json:"priority"` // 重要 / 普通(空) SheetType string `gorm:"size:32" json:"sheet_type"` // 关联记录类型 code:weight/poop/bath... // Repeat 列名用 repeat_rule:repeat 是 MySQL 保留字,GORM 虽然会加反引号, // 但手写 SQL 排查时很容易踩(和 group_key 同样的理由) Repeat string `gorm:"column:repeat_rule;size:16" json:"repeat"` // once | daily | weekly | monthly Day int `json:"day"` // once:从套用日起第 N 天(0=当天) // DayLabel 留着:后台的 AI 生成模板那条链路在产出它。月度计划里日期是绝对的 // 不需要「第 N 天」标签,但删它要连着改 AI 解析,不在这次范围内 DayLabel string `gorm:"size:32" json:"day_label"` // Weekdays weekly 用:逗号分隔的 1-7(1=周一)。 // 存字符串不另开表——一条模板明细最多 7 个数字,开表换来的只是查询灵活性, // 而这份数据从来只整条读出来展开 Weekdays string `gorm:"size:16" json:"weekdays"` MonthDay int `json:"month_day"` // monthly 用:几号(1-31),超出当月天数按月末算 // reminder 专用 ReminderType string `gorm:"size:32" json:"reminder_type"` // vaccine/deworm/weight/monthlyReport OffsetDays int `json:"offset_days"` // 到期 = 今天 + N 天;<=0 表示无固定到期,用频率 Frequency string `gorm:"size:64" json:"frequency"` // 频率描述,如「每周二、周五」 }