From 36985771d50365b4f1f1da17a3dc9b75c898cbc5 Mon Sep 17 00:00:00 2001 From: fallensigh Date: Sun, 23 Aug 2026 21:48:41 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20shiro=20=E7=BC=93=E5=AD=98=E5=A4=B1?= =?UTF-8?q?=E6=95=88=E6=97=B6=E8=87=AA=E5=8A=A8=E9=87=8D=E6=96=B0=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E8=8E=B7=E5=8F=96=E5=85=85=E5=80=BC=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - /api/history 充值记录获取失败时触发 fullLoginFlow 重建会话 - 重建后重试一次, 彻底失败才降级为无充值计算 - 补充 fullLoginFlow 失败日志便于排查 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus --- go/electric.go | 1 + go/main.go | 53 +++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 43 insertions(+), 11 deletions(-) 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{}