lzf_0626
b3da1b65ed
fix(risk): 修正风控的时区缺陷——凌晨规则与日报日界
docs/25 P1 #6。根因是"库内存 UTC naive"这个约定在**业务判断层**没被遵守,
而展示层其实已经是对的(risk_daily_report_service.py:418 按配置时区转换)。
1. 新增 app/core/timeutil.py 作为统一换算入口:约定库内 UTC naive,提供
local_hour / local_date / local_day_bounds(后两者用于查库时必须返回 UTC naive,
否则区间与库内值整体错开 8 小时),带时区的入参按其自身时区解释。
2. risk_scan_service.py:248:0 <= confirmed_at.hour < 6 → local_hour(...)。
原先 [0,6) UTC 被当成"凌晨",实际是北京时间 08:00-14:00,整条
「凌晨时段小额操作」规则判的是上午。
3. risk_judgement_service.py:238/243:判断**与展示**都换算。展示不改的话,
风控专员看到的时刻与直觉差 8 小时,无法与客户核对。
4. risk_daily_report_service.py:89:日界改用 local_day_bounds(按北京时间自然日,
再折回 UTC naive)。原先按 UTC 日期切日,北京 08:00 前生成的日报统计窗口跨零点。
测试:
- 新增 tests/unit/core/test_timeutil.py(8 条),含"UTC 凌晨 0-6 点不是北京凌晨"
这一缺陷复现,以及"日界必须返回 UTC naive"。
- 改写 test_risk_scan_service.py::test_night_small_trade_boundaries:它原本就拿
UTC 小时构造数据(写 0 点/6 点),等于在测北京 08:00/14:00;语义一并修正为
北京 00:00(含)与 06:00(不含)两个边界,三个边界场景保持不变。
ruff / mypy(135 文件) / 603 unit+contract 全绿。
2026-09-11 12:50:52 +08:00
..
2026-09-10 15:55:54 +08:00
2026-09-09 21:55:37 +08:00
2026-09-09 21:55:37 +08:00
2026-09-09 21:55:37 +08:00
2026-09-09 21:55:37 +08:00
2026-09-10 15:55:54 +08:00
2026-09-10 15:55:54 +08:00
2026-09-09 21:55:37 +08:00
2026-09-10 15:55:54 +08:00
2026-09-10 15:55:54 +08:00
2026-09-10 22:53:29 +08:00
2026-09-10 22:48:56 +08:00
2026-09-10 22:53:29 +08:00
2026-09-09 21:55:37 +08:00
2026-09-09 23:40:35 +08:00
2026-09-09 23:40:35 +08:00
2026-09-09 23:40:35 +08:00
2026-09-09 23:40:35 +08:00
2026-09-10 15:55:54 +08:00
2026-09-09 21:55:37 +08:00
2026-09-09 21:55:37 +08:00
2026-09-10 15:55:54 +08:00
2026-09-10 22:29:23 +08:00
2026-09-10 22:15:50 +08:00
2026-09-10 15:55:54 +08:00
2026-09-10 15:55:54 +08:00
2026-09-10 15:55:54 +08:00
2026-09-10 15:55:54 +08:00
2026-09-10 15:55:54 +08:00
2026-09-10 15:55:54 +08:00
2026-09-10 15:55:54 +08:00
2026-09-09 21:55:37 +08:00
2026-09-10 15:55:54 +08:00
2026-09-09 21:55:37 +08:00
2026-09-09 21:55:37 +08:00
2026-09-10 15:55:54 +08:00
2026-09-10 21:03:44 +08:00
2026-09-10 21:03:44 +08:00
2026-09-10 21:03:44 +08:00
2026-09-11 11:10:33 +08:00
2026-09-11 11:42:53 +08:00
2026-09-10 21:03:44 +08:00
2026-09-10 21:03:44 +08:00
2026-09-10 21:03:44 +08:00
2026-09-10 21:03:44 +08:00
2026-09-11 09:49:21 +08:00
2026-09-11 12:50:52 +08:00
2026-09-10 21:03:44 +08:00
2026-09-10 15:55:54 +08:00
2026-09-10 15:55:54 +08:00
2026-09-10 15:55:54 +08:00
2026-09-09 21:55:37 +08:00
2026-09-09 21:55:37 +08:00
2026-09-09 21:55:37 +08:00
2026-09-09 21:55:37 +08:00