fix: shiro 缓存失效时自动重新登录获取充值记录

- /api/history 充值记录获取失败时触发 fullLoginFlow 重建会话

- 重建后重试一次, 彻底失败才降级为无充值计算

- 补充 fullLoginFlow 失败日志便于排查

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
2026-08-23 21:48:41 +08:00
parent f2cb2e796d
commit 36985771d5
2 changed files with 43 additions and 11 deletions

View File

@@ -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{}