一张图看懂
整套系统分五层,数据只往一个方向流:
① 录入层 ② 存储层 ③ 统计层 ④ 报告层 ⑤ 展示层
我在聊天里 → SQLite → 统一计算 → 日报/周报/ → 飞书消息
报当天数据 数据库 口径函数 月报/年报 网页面板
(add_orders) (rideshare.db) (rideshare_calc) (8899)
↓
车辆基金/免佣卡等专题计算
关键原则:上层只读下层,绝不反向写;同一层里同一件事只有一个实现。
逐层说明(对应到具体文件)
① 录入层 —— add_orders.py
我收工后在聊天里用大白话发当天数据:日期、出门到家时间、每单的平台/金额/时间。脚本解析后即时写入数据库,同时写一条审计日志(audit_log)。
- 我没明确报到账金额时,脚本会按平台规则给一个兜底估算(标记为自动计算),一律以我实测报的为准。
- 录单成功后会自动刷新数据基线,不影响录入。
② 存储层 —— rideshare.db(SQLite)
数据库是唯一事实来源。Excel 导出已经退役,现在以库为准。主要表:
| 表 | 存什么 |
|---|---|
orders |
每一笔订单:日期、平台、起止时间、流水、到账、备注 |
shifts |
每一个班次:出门日期、到家时间 |
commission_cards |
免佣卡:购买/到期时间、卡费 |
vehicle_expenses |
车辆相关支出 |
weather |
天气采集(长期观察用,统计暂缓) |
audit_log |
录入审计记录 |
日期契约:库里日期一律用完整格式 YYYY-MM-DD,统计只按记录自带的年份分组,不依赖"当前是哪一年"——这样跨年后数据不会串。
③ 统计层 —— rideshare_calc.py
全系统唯一的统计实现,提供三个核心口径函数:
daily_stats():按天(班次)统计month_stats():按月统计year_stats():按年统计
以及专题计算:免佣卡 calc_commission_cards()、车辆基金 calc_vehicle_fund()。
所有报告和看板都调这一层,自己不算总数——这保证四个出口数字永远同源。
④ 报告层
| 报告 | 生成脚本 | 时效语义 |
|---|---|---|
| 日报 | gen_daily_report.py |
收工生成,补录后更新重推 |
| 周报 | gen_weekly_report.py |
滚动 |
| 月报 | rides_monthly_watch.py |
月末定格,永久不可变 |
| 年报 | rides_yearly_watch.py |
年度滚动,跨年封盘后冻结 |
注意月报和年报时效不同:月报是月末快照,之后补录绝不能回改旧月报,否则等于篡改历史。
⑤ 展示层
- 飞书消息:日报等推送到飞书,一眼看结论。
- 网页面板:本机 8899 端口的静态页面,由数据文件驱动,数据变化时自动刷新,用来细看数据和对账。
一致性怎么保证
改了口径或数据后,跑 check_consistency.py 校验日报/月报/年报/看板四者数字同源;另有独立 SQL 对拍脚本,用不依赖统计层的方式重算一遍来交叉验证。