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. 完整登录
|
// 2. 完整登录
|
||||||
appShiro, room, result, err := fullLoginFlow()
|
appShiro, room, result, err := fullLoginFlow()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
fmt.Println("[登录] fullLoginFlow 失败:", err)
|
||||||
clearCache()
|
clearCache()
|
||||||
return &electricResult{OK: false, Error: err.Error()}
|
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()
|
records := getRecords()
|
||||||
|
|
||||||
// 获取充值记录(用于精确耗电计算)
|
// 获取充值记录(用于精确耗电计算);缓存会话失效时自动重建
|
||||||
rechargeMap := map[string]float64{}
|
rechargeMap, buyRecords := fetchRechargeData()
|
||||||
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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
allDaily := buildDailyStats(records, "", rechargeMap) // 全量(用于可用月份列表)
|
allDaily := buildDailyStats(records, "", rechargeMap) // 全量(用于可用月份列表)
|
||||||
monthDaily := buildDailyStats(records, month, 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,降序)
|
// availableMonths 返回所有有记录的月份(YYYY-MM,降序)
|
||||||
func availableMonths(records []record) []string {
|
func availableMonths(records []record) []string {
|
||||||
seen := map[string]bool{}
|
seen := map[string]bool{}
|
||||||
|
|||||||
Reference in New Issue
Block a user