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:
@@ -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()}
|
||||
}
|
||||
|
||||
53
go/main.go
53
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{}
|
||||
|
||||
Reference in New Issue
Block a user