package service import ( "encoding/json" "errors" "fmt" ) type premiumTrait struct { Gift string Caution string Field string Rhythm string } type premiumSnapshot struct { ID string `json:"id"` Result struct { EightChar struct { DayMaster string `json:"dayMaster"` DayMasterElement string `json:"dayMasterElement"` } `json:"eightChar"` DecadeFortunes []struct { Ganzhi string `json:"ganzhi"` StartAge int `json:"startAge"` } `json:"decadeFortunes"` } `json:"result"` Elements struct { Dominant string `json:"dominant"` Weakest string `json:"weakest"` } `json:"elements"` Shensha []struct { Name string `json:"name"` Type string `json:"type"` } `json:"shensha"` Sections []premiumSection `json:"sections"` } type premiumSection struct { Index string `json:"index"` Title string `json:"title"` Kicker string `json:"kicker"` Summary string `json:"summary"` Details []string `json:"details"` } var premiumTraits = map[string]premiumTrait{ "木": {Gift: "成长力、规划感与同理心", Caution: "容易把长期目标变成眼前压力", Field: "教育、内容、设计与长期经营", Rhythm: "先建立根基,再持续放大优势"}, "火": {Gift: "表达力、行动力与感染力", Caution: "节奏过快时容易透支专注", Field: "传播、品牌、销售与创新项目", Rhythm: "抓住窗口,但为决策保留冷静期"}, "土": {Gift: "稳定性、承诺感与资源整合力", Caution: "求稳过度时会错过变化", Field: "管理、运营、资产与服务业", Rhythm: "稳中求变,用小步试错替代停滞"}, "金": {Gift: "判断力、边界感与执行标准", Caution: "标准过高时容易显得紧绷", Field: "技术、金融、法律与精细管理", Rhythm: "先定规则,再给关系留出弹性"}, "水": {Gift: "洞察力、适应力与信息敏感度", Caution: "选择过多时容易分散心力", Field: "研究、咨询、贸易与流动型工作", Rhythm: "聚焦一个主航道,让变化服务目标"}, } var supportingElements = map[string]string{"木": "水", "火": "木", "土": "火", "金": "土", "水": "金"} func buildPremiumSnapshot(raw string) (string, error) { var snapshot premiumSnapshot if err := json.Unmarshal([]byte(raw), &snapshot); err != nil { return "", fmt.Errorf("invalid report snapshot: %w", err) } if snapshot.ID == "" || snapshot.Result.EightChar.DayMaster == "" || snapshot.Elements.Dominant == "" { return "", errors.New("report snapshot is missing chart data") } dominant := premiumTraits[snapshot.Elements.Dominant] dayMaster := premiumTraits[snapshot.Result.EightChar.DayMasterElement] if dayMaster.Gift == "" { dayMaster = dominant } helpful := supportingElements[snapshot.Result.EightChar.DayMasterElement] if helpful == "" { helpful = snapshot.Elements.Weakest } positiveStars := make([]string, 0, 3) cautionStars := make([]string, 0, 2) for _, star := range snapshot.Shensha { if star.Type == "吉" && len(positiveStars) < 3 { positiveStars = append(positiveStars, star.Name) } if star.Type == "凶" && len(cautionStars) < 2 { cautionStars = append(cautionStars, star.Name) } } starText := "命局本身的稳定结构" if len(positiveStars) > 0 { starText = joinChinese(positiveStars) } cautionText := "节奏失衡" if len(cautionStars) > 0 { cautionText = joinChinese(cautionStars) } firstFortune := "人生节奏呈阶段性变化。" if len(snapshot.Result.DecadeFortunes) > 0 { fortune := snapshot.Result.DecadeFortunes[0] firstFortune = fmt.Sprintf("首步大运为%s,约从%d岁进入阶段转换。", fortune.Ganzhi, fortune.StartAge) } snapshot.Sections = []premiumSection{ {Index: "壹", Title: "性格底色", Kicker: snapshot.Result.EightChar.DayMaster + " · 内在驱动力", Summary: fmt.Sprintf("你的日主为%s,核心优势集中在%s。", snapshot.Result.EightChar.DayMaster, dayMaster.Gift), Details: []string{fmt.Sprintf("五行以%s较突出,做事更重视%s。", snapshot.Elements.Dominant, dominant.Gift), fmt.Sprintf("需要留意:%s。", dayMaster.Caution), fmt.Sprintf("真正适合你的成长方式是:%s。", dayMaster.Rhythm)}}, {Index: "贰", Title: "事业天赋", Kicker: "能力结构 · 职场定位", Summary: fmt.Sprintf("你的优势更容易在%s中形成复利。", dominant.Field), Details: []string{fmt.Sprintf("适合承担需要%s的角色。", dayMaster.Gift), fmt.Sprintf("命局中的%s,提示你应主动经营专业信用与协作关系。", starText), "比起频繁换方向,更适合建立可重复的方法与个人标签。"}}, {Index: "叁", Title: "财富节奏", Kicker: "积累方式 · 风险边界", Summary: fmt.Sprintf("财富策略宜围绕“%s”展开。", dominant.Rhythm), Details: []string{fmt.Sprintf("优先把%s转化成可计价的产品或服务。", dayMaster.Gift), fmt.Sprintf("遇到%s对应的冲动时,应延迟重大财务决定。", cautionText), "收入结构宜同时保留稳定现金流与小比例成长投入。"}}, {Index: "肆", Title: "关系模式", Kicker: "亲密关系 · 沟通课题", Summary: fmt.Sprintf("关系中的吸引力来自%s,长久则依赖清晰表达。", dayMaster.Gift), Details: []string{"你更需要能理解你节奏、也尊重边界的伴侣。", "情绪紧张时,先描述事实与需要,避免用结论代替沟通。", "重要关系中要刻意安排稳定相处,而不是只依赖临时热情。"}}, {Index: "伍", Title: "身心能量", Kicker: "五行平衡 · 日常建议", Summary: fmt.Sprintf("%s相对偏弱,日常可借%s的意象建立平衡感。", snapshot.Elements.Weakest, helpful), Details: []string{"把作息、运动和独处时间当作长期资产。", "高压期减少多线程任务,让注意力回到一个明确目标。", "所有健康问题应以正规医疗意见为准,本报告不替代诊断。"}}, {Index: "陆", Title: "大运路线", Kicker: "阶段重点 · 行动窗口", Summary: firstFortune, Details: []string{"大运用于观察阶段主题,不代表确定事件。", fmt.Sprintf("顺势的关键是持续放大%s,并管理%s。", dayMaster.Gift, dayMaster.Caution), "完整报告保留十步大运时间轴,方便长期回看。"}}, } encoded, err := json.Marshal(snapshot) if err != nil { return "", fmt.Errorf("encode premium snapshot: %w", err) } return string(encoded), nil } func joinChinese(values []string) string { result := "" for index, value := range values { if index > 0 { result += "、" } result += value } return result }