sporttery.csh.space之前的赛果 数据获取TAB数据 是通过桌面软件或者大陆服务器CRON计划任务定时将数据上传到/www/wwwroot/www.csh.space/sporttery/data目录下 ,类似的还有盘口雷达的数据现在也需要换到这个/www/wwwroot/www.csh.space/sporttery/data新目录下 ,就目录是/www/wwwroot/sporttery.csh.space/data# 雷达日报 · UI 说明文档
版本:v1.0 · 更新日期:2026-11-04
对应当前实现:gui.py·_export_report()+_review_block()
一、功能概述
日报是盘口规律雷达的每日终稿输出,以纯文本 .txt 形式保存到 reports/ 目录。与界面内的实时滚动列表不同,日报整合了"今日待分析场次"和"昨日已完赛复盘"两部分,方便用户在一天结束后回看分析命中率。
触发方式
主界面底部 "导出日报" 按钮 → 弹出"日报已保存:reports/雷达日报_YYYYMMDD.txt"状态栏提示。
输出文件路径
<工作目录>/reports/雷达日报_20261104.txt
文件名带日期,每天覆盖当日的同名文件(不会累积旧日报)。
二、日报结构总览
盘口规律雷达 2026-11-04 周三
33 场 · 主胜 15 · 平 2 · 客胜 8 · 分歧 5 · 共振 4 · 预警 3
[当日气候摘要 · 可选]
—— 假降水速查 ——
[日内出现假降水信号的场次列表,不变]
—— 今日场次(未完赛 N 场)——
◆ 共振 / 预警
周三001 欧冠 ... ← 每场完整规则明细
阶段:赛前(距开赛 2h)
倾向:客胜 · 共振
规则命中:R01、R12
...
◆ 其余场次
周三003 欧罗巴 ...
...
—— 昨日复盘(已完赛 N 场)——
命中统计:倾向命中 6/7(86%)· 分歧/未判 1 场不计 · 共振场命中 3/4
周二004 欧冠 加拉塔萨 vs 斯图加特 2:0
倾向:主胜 → 实际:主胜 √ 命中
周二011 欧冠 博德闪耀 vs 里尔 0:0
倾向:主胜 → 实际:平 × 未中 · 共振
三、分组与排序规则
3.1 分组依据:phase 字段
| 分组 | phase 值 | 含义 | 排序键 |
|---|---|---|---|
| 今日场次 | pre / live / pending | 未开赛、进行中、赛果未回填 | 赛事编号升序(周三001→周三099) |
| 昨日复盘 | post | 已完赛,score 有值 | 赛事编号升序(周二001→周二099) |
分组先后:今日在前、昨日在后。这样用户打开日报先看到"今天还有哪些没踢",再对照昨日的命中记录。
3.2 今日场次内部排序
- 共振/预警优先(
◆ 共振 / 预警):info["resonant"] == True或赛前阶段存在冲突/预警规则命中 - 其余场次(
◆ 其余场次):非共振非预警的普通场次 - 两组内都按赛事编号升序
3.3 赛事编号排序
竞彩编号格式固定为 周几+三位数字(如 周二004、周三011)。Python 字符串字典序恰好等于自然顺序,直接 sorted(results, key=lambda r: r.num) 即可得到正确排列——无需额外提取前缀/数字部分。
四、今日场次内容
文件:gui.py · _match_text()(第 1628–1675 行)
今日场次复用界面内卡片详情的完整规则明细,每场输出 6–8 行:
周三001 欧冠 浦项制铁 vs 大阪钢巴
阶段:赛前(距开赛 2h)
玩法:胜平负
倾向:客胜 · 共振
核心规则:初赔主胜过高+临盘共振
投票:主胜3 平1 客胜5
初赔:主2.35 平3.40 客2.85
临赔:主2.10 平3.40 客3.10
| 行 | 内容来源 |
|---|---|
| 编号/联赛/对阵 | result.num / result.league / result.home / result.away |
| 阶段 | result.phase_label + result.phase_note |
| 玩法 | info["play_label"] + 让球盘口(若 market=hhad) |
| 倾向 | info["lean"] + 共振/冲突/预警标记 |
| 规则命中 | _blurb(result, info) 生成的核心规则摘要 |
| 投票 | info["votes"] 字典按 side 拼接 |
| 初赔/临赔 | result.feat["first_odds"] / ["last_odds"] |
五、昨日复盘内容
文件:gui.py · _review_block()(第 1786–1831 行)
5.1 逐场格式
复盘用紧凑两行,不重复赛前规则明细——重点是"倾向 vs 实际赛果"的对照:
周二004 欧冠 加拉塔萨 vs 斯图加特 2:0
倾向:主胜 → 实际:主胜 √ 命中
周二011 欧冠 博德闪耀 vs 里尔 0:0
倾向:主胜 → 实际:平 × 未中 · 共振
| 字段 | 取值 | 说明 |
|---|---|---|
| 编号/联赛/对阵 | 同今日场次 | — |
| 比分 | result.score | 完赛有值,否则显示 — |
| 倾向 | info["lean"] | 主胜 / 平 / 客胜 / 让胜 / 让平 / 让负 / 分歧 / 未判 |
| 实际 | result.actual_had 或 result.actual_hhad | 让球玩法对照 actual_hhad,胜平负对照 actual_had |
| 命中判定 | √ 命中 / × 未中 / — 未判 | 由 archive._judge_hit() 统一判定 |
| 共振标记 | · 共振(可选) | 该场赛前被标记为共振信号,方便单独看共振命中率 |
5.2 命中判定逻辑
复用 archive.py 的 _judge_hit(),口径与归档统计完全一致:
| 倾向 | 实际 | 判定 |
|---|---|---|
| 主胜 / 平 / 客胜 | 对比 actual_had | 字符串相等即命中 |
| 让胜 / 让平 / 让负 | 对比 actual_hhad | 字符串相等即命中 |
| 分歧 | — | 返回 None,不计入分母 |
| 未判 | — | 返回 None,不计入分母 |
5.3 汇总统计(复盘开头)
命中统计:倾向命中 6/7(86%)· 分歧/未判 1 场不计 · 共振场命中 3/4
| 指标 | 公式 | 说明 |
|---|---|---|
| 倾向命中 | hits / judged | 可判定场数(排除分歧/未判) |
| 分歧/未判 | undecided | 不计入命中率分母 |
| 共振场命中 | res_hits / res_judged | 有共振标记的场次单独统计,帮助判断"共振信号是否更准" |
分母口径:分歧和未判场不计入命中率分母(_judge_hit() 返回 None),避免"分歧=错"的误读。
六、数据来源与前置条件
6.1 今日场次数据
来自本次扫描的 self._results(DailyScanner.scan_date() 返回值)。phase != "post" 的场次进入今日分组。
6.2 昨日复盘赛果
必须满足:result.phase == "post" 且 result.actual_had / result.actual_hhad 非空。
赛果回填由 archive.py 在每日归档时自动完成——归档会读取 jcw_history.db 的完赛比分并计算 actual_had/actual_hhad。因此:
- 刚完赛的场次:如果归档还没跑过,
phase可能还是live或pending,不会进复盘分组——等归档回填后下次扫描自动进入 - 跨天扫描:
jcw_history.db里有多个比赛日的场次,归档按match_date分组,20261104的归档文件里可能同时含周三(今日)和周二(昨日)的场次,phase字段天然区分
6.3 归档文件
reports/archive/20261104.json
归档 JSON 的 matches 字典结构:
{
"matches": {
"周二011": { "phase": "post", "lean": "主胜", "actual_had": "平", "hit": false },
"周三001": { "phase": "pre", "lean": "客胜", "actual_had": null, "hit": null }
}
}
日报不直接读归档 JSON,而是从 MatchScanResult 对象取 actual_had / actual_hhad——这些字段在 scanner 扫描时就从归档回填了。
七、异常与边界
| 场景 | 行为 |
|---|---|
| 没有扫描结果 | 状态栏提示"没有可导出的扫描结果",不写文件 |
| 全部场次都是 pre(今日无已完赛场) | 昨日复盘区块不显示 |
| 全部场次都是 post(罕见,如只扫历史日期) | 今日场次区块不显示 |
| 归档未运行,赛果未回填 | actual_had 为空的 post 场也会进复盘,但实际赛果显示 —,命中判定为"— 未判" |
_judge_hit() 抛异常 | 外层无 try/except,异常会传播到导出按钮。正常情况下不应发生 |
八、技术实现索引
| 元素 | 文件 | 行号 |
|---|---|---|
| 导出入口 | gui.py · MainApp._export_report | 1735–1784 |
| 今日 vs 昨日分组 | 同上 | 1758–1759 |
| 今日场次内部排序(共振优先) | 同上 | 1762–1776 |
| 昨日复盘完整逻辑 | gui.py · MainApp._review_block | 1786–1831 |
| 今日单场文本生成 | gui.py · MainApp._match_text | 1628–1675 |
| 命中判定算法 | archive.py · _judge_hit | ~151 |
| 归档 JSON 写入 | archive.py · _build_record | ~80 |
| 赛果回填 | archive.py · backfill_results | ~200 |
| scanner 归档调用 | scanner.py | ~130 |
九、后续规划
| 优先级 | 内容 |
|---|---|
| 低 | 昨日复盘增加"爆冷场次"高亮标记(倾向主胜→实际客胜 等方向反转的场) |
| 低 | 复盘命中率做 7 天滑动窗口图表(需要 archive_analyzer 配合) |
| 中 | 今日场次支持按"联赛"子分组(同一联赛多场时聚合显示) |