老八
老八
发布于 2026-08-21 / 3 阅读
0

整体架构与数据流

一张图看懂

整套系统分五层,数据只往一个方向流:

① 录入层      ② 存储层        ③ 统计层        ④ 报告层         ⑤ 展示层
我在聊天里  →  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 对拍脚本,用不依赖统计层的方式重算一遍来交叉验证。