diff --git a/go/electric.go b/go/electric.go index e5d65d2..689b20f 100644 --- a/go/electric.go +++ b/go/electric.go @@ -404,6 +404,7 @@ func queryElectric() *electricResult { // 2. 完整登录 appShiro, room, result, err := fullLoginFlow() if err != nil { + fmt.Println("[登录] fullLoginFlow 失败:", err) clearCache() return &electricResult{OK: false, Error: err.Error()} } diff --git a/go/main.go b/go/main.go index bac4643..2f70d50 100644 --- a/go/main.go +++ b/go/main.go @@ -101,17 +101,8 @@ func apiHistory(w http.ResponseWriter, r *http.Request) { records := getRecords() - // 获取充值记录(用于精确耗电计算) - rechargeMap := map[string]float64{} - var buyRecords []buyRecord - if c, err := loadCache(); err == nil { - if recs, err := getBuyRecordsCached(c.AppShiro, &c.Room); err == nil { - rechargeMap = rechargeKwhByDate(recs) - buyRecords = recs - } else { - fmt.Println("[充值] 获取充值记录失败:", err) - } - } + // 获取充值记录(用于精确耗电计算);缓存会话失效时自动重建 + rechargeMap, buyRecords := fetchRechargeData() allDaily := buildDailyStats(records, "", rechargeMap) // 全量(用于可用月份列表) monthDaily := buildDailyStats(records, month, rechargeMap) @@ -132,6 +123,46 @@ func apiHistory(w http.ResponseWriter, r *http.Request) { }) } +// fetchRechargeData 获取充值记录。缓存会话失效时自动重新登录并重试一次。 +// 返回 (date->充值电量 map, 充值记录列表);彻底失败时返回空(降级为无充值计算)。 +func fetchRechargeData() (map[string]float64, []buyRecord) { + rechargeMap := map[string]float64{} + empty := []buyRecord{} + + // 辅助:用当前缓存会话获取充值记录 + tryFetch := func() (map[string]float64, []buyRecord, bool) { + c, err := loadCache() + if err != nil { + return nil, nil, false + } + recs, err := getBuyRecordsCached(c.AppShiro, &c.Room) + if err != nil { + return nil, nil, false + } + return rechargeKwhByDate(recs), recs, true + } + + // 第一次尝试(可能命中 10 分钟缓存或有效会话) + if m, recs, ok := tryFetch(); ok { + return m, recs + } + + // 失败:通过 queryElectric 重建会话(内部 fullLoginFlow + 回写缓存) + fmt.Println("[充值] 会话失效,尝试重新登录...") + res := queryElectric() + if res == nil || !res.OK { + fmt.Println("[充值] 重新登录失败,降级为无充值计算") + return rechargeMap, empty + } + + // 重建后重试一次 + if m, recs, ok := tryFetch(); ok { + return m, recs + } + fmt.Println("[充值] 重建会话后仍失败,降级为无充值计算") + return rechargeMap, empty +} + // availableMonths 返回所有有记录的月份(YYYY-MM,降序) func availableMonths(records []record) []string { seen := map[string]bool{}