如何设计一个“后”报表功能
1. 运行环境
LNMP
1). 当前使用的 Laravel 版本?
Laravel 12
//: <> (使用 php artisan --version 命令查看)
2). 当前使用的 php/php-fpm 版本?
PHP 版本:PHP 8.4
php-fpm 版本: 8.4
3). 当前系统
Linux
4). 业务环境
5). 相关软件版本
2. 问题描述?
系统可以看成一个 在线订单 系统,每天针对里面的每笔订单,都需要进行一定的逻辑统计。比如说把归属于北京地址的,计入到日订单统计表A里北京列+1,把安徽的计入到安徽列+1.把客客单价>500的计到日客单价统计表B里 VIP 列,并且累加金额,把客户价 > 2000 的,统计到 SVIP 列,并且累加金额。
当然,实际的逻辑肯定不会这么简单。
3. 您期望得到的结果?
希望可以在不影响订单系统的前提下,对这些订单进行统计,汇总到报表中。因统计量比较大,且逻辑比较复杂,不适合直接通过SQL得到。只能通过程序逻辑计算后写入到某个数据库的表格中。
之前采用过队列,订单系统只放入队列,影响比较小。报表应用从队列取订单数据来进行后续的流程,一笔笔订单处理而不是每隔一段时间重新统计本天的。
但这样引入了一个队列子系统,增加了不确定性。
并且一笔订单并不是只统计或者说消费一次,一笔订单可能在地区统计中统计一次,在客单价统计中又统计一次。
要监听的也不止订单一个数据来源,还会有货物的处理等不同数据源。
4. 您实际得到的结果?
原始的设计思路是保障订单系统的运行,因此脱离了订单处理体系,使用计划任务,每隔一段时间统计一下,更新到报表里。
报表可以容许一小段时间的延迟,但如果能实时则最好不过了。
报表是按日统计的,为了简便都是查出来本日的,直接统计计算生成表,删除本日历史数据然后直接插入。
这样一来,早上的订单会被纳入统计非常多次。因业务高峰发生在下午4点左右,而此时有前面15个小时的数据,数据量又比较大,所以统计出来比较慢。
关于 LearnKu
每天晚上跑定时任务
根据有变更的订单写入一张任务处理表,再起一个定时任务每隔一段时间去扫描查询需要更新的订单生成新报表。如果订单任务还没有扫到订单再次发生变更则删除原记录重新写入。生成报表后做一个标记。保证一个订单在任务表有且只有一条未处理的数据。
做各类报表的前提是先洗好相关基础业务数据表,然后汇总对应报表。 步骤:源数据表->业务基础数据表->业务报表,基础数据表来源于源数据表,报表来源于基础数据表,基础数据表可以根据不同业务维度设计多张表,基础数据表和业务报表业务脚本支持重写覆盖,以便于修正数据用。