老板要 30 日复购率。BI 还在采购流程里转圈。我先在 Tigshop开源商城系统后台丢了个接口加卡片。活先活下来。不是重做数据分析平台,是 Admin 顶一个统计口径明确的接口。
口径写脚注
已支付。剔取消。复购 = 周期内下过 ≥2 单的用户 / 下过单的用户。不写脚注,下周他换个算法找你麻烦。找麻烦的时候,他不会承认是口径变了。他会说你算错了。
能直接粘的接口
<?php
namespace app\adminapi\controller\report;
class Repurchase
{
public function rate30d()
{
$end = time();
$start = $end - 30 * 86400;
$buyers = Order::where('pay_status', 1)
->whereBetween('pay_time', [$start, $end])
->column('user_id');
$total = count(array_unique($buyers));
$repurchase = 0;
if ($total > 0) {
$counts = array_count_values($buyers);
$repurchase = count(array_filter($counts, fn($c) => $c >= 2));
}
$rate = $total ? round($repurchase / $total * 100, 2) : 0;
return json([
'total_buyers' => $total,
'repurchase_buyers' => $repurchase,
'rate' => $rate,
'note' => '已支付口径,30日',
]);
}
}
Admin 卡片
Dashboard 加一块:复购率、下单用户数、复购用户数。别只放一个百分比。百分比一个人一个算法,明细摆那儿,嘴少很多。
权限
报表角色。别全员看见。有些数,不是人人都该看。
性能
量大再预聚合。别一上来全表扫,看板一打开转圈,老板以为你在糊弄。先顶接口,慢了再加缓存或定时汇总表。
导出明细
老板追问「谁复购了」,接口加 CSV 导出 user_id 列表。能导出,争论少一半。争论少了,你日子好过。
别和 BI 抢活
这个接口是临时的。BI 上了可以关。关之前口径写文档。下个人接手知道 30 日是怎么算的。不知道就算法变成玄学。玄学老板最爱问。最爱问还最答不上来。
缓存策略
数据 T+1 也行。Dashboard 不需要秒级。Cache::set('report:repurchase:30d', $data, 3600) 一小时刷新。老板刷新看板,快就行。快比准晚一小时强。强在不会被骂「打不开」。复购率这种数,老板要的是趋势和口径,不是毫秒级实时。别过度工程。过度工程周会前交不出来。