feat: 收益全额直入商城余额、存量结转与奖项名称全局规范化对齐

这个提交包含在:
chen
2026-09-19 11:49:57 +08:00
父节点 85947e43ae
当前提交 aca0d3c671
共有 83 个文件被更改,包括 4146 次插入 和 443 次删除

查看文件

@@ -19,20 +19,102 @@ class WalletLog extends Common
$list_rows = $this->request->param('list_rows', 10);
$date = $this->request->param('date/a');
$user = auth_user();
$where['user_id'] = $user->id;
$rewardEvents = [
'push3', 'maker_diff', 'maker_peer', 'maker_overtaken',
'team_venue', 'team_county', 'venue_peer', 'county_peer',
'venue_share', 'county_share', 'reward_income', 'transfer_by_commission', 'transfer_to_money'
];
$baseQuery = function () use ($user, $type, $rewardEvents) {
$model = UserWalletLogModel::where('user_id', $user->id);
if ($type === 'commission') {
// 收益记录:既包含历史 commission 流水,也对齐直入 money 的收益分成流水
$model->where(function ($query) use ($rewardEvents) {
$query->where('type', 'commission')
->whereOr(function ($sub) use ($rewardEvents) {
$sub->where('type', 'money')->whereIn('event', $rewardEvents);
});
});
} else {
$model->where('type', $type);
}
return $model;
};
$filterQuery = $baseQuery();
if (!empty($date) && is_array($date) && count($date) === 2) {
$filterQuery->whereTime('createtime', 'between', $date);
}
switch ($tab) {
case 'reward':
$filterQuery->where('amount', '>', 0)->whereIn('event', $rewardEvents);
break;
case 'income':
$where['amount'] = ['>', 0];
$filterQuery->where('amount', '>', 0);
break;
case 'expense':
$where['amount'] = ['<', 0];
$filterQuery->where('amount', '<', 0);
break;
}
$income = UserWalletLogModel::where('user_id', $user->id)->{$type}()->where('amount', '>', 0)->whereTime('createtime', 'between', $date)->sum('amount');
$expense = UserWalletLogModel::where('user_id', $user->id)->{$type}()->where('amount', '<', 0)->whereTime('createtime', 'between', $date)->sum('amount');
$logs = UserWalletLogModel::where($where)->{$type}()->whereTime('createtime', 'between', $date)->order('createtime', 'desc')->paginate($list_rows);
$this->success('获取成功', ['list' => $logs, 'income' => $income, 'expense' => $expense]);
// 统计收入与支出(统一统计口径,避免内部互转重叠统计造成误导)
$incomeQuery = $baseQuery();
$expenseQuery = $baseQuery();
$rewardQuery = $baseQuery();
if (!empty($date) && is_array($date) && count($date) === 2) {
$incomeQuery->whereTime('createtime', 'between', $date);
$expenseQuery->whereTime('createtime', 'between', $date);
$rewardQuery->whereTime('createtime', 'between', $date);
}
$actualRewardEvents = [
'push3', 'maker_diff', 'maker_peer', 'maker_overtaken',
'team_venue', 'team_county', 'venue_peer', 'county_peer',
'venue_share', 'county_share', 'reward_income'
];
if ($type === 'commission') {
// 收益流水统计口径对齐:
// 1. 真实收益(总收入):排除内部互转入账事件 transfer_by_commission,避免佣金转入余额时重复计入收益
// 2. 真实扣减(总支出):排除内部结转转出事件 transfer_to_money 与 commission_transfer,避免误导用户认为产生了消费支出
$income = (float) $incomeQuery->where('amount', '>', 0)
->where(function ($q) use ($actualRewardEvents) {
$q->where(function ($sub) use ($actualRewardEvents) {
$sub->where('type', 'money')->whereIn('event', $actualRewardEvents);
})->whereOr(function ($sub) {
$sub->where('type', 'commission')->whereNotIn('event', ['transfer_by_commission']);
});
})->sum('amount');
$expense = (float) $expenseQuery->where('amount', '<', 0)
->whereNotIn('event', ['transfer_to_money', 'commission_transfer'])
->sum('amount');
$rewardIncome = (float) $rewardQuery->where('amount', '>', 0)
->where(function ($q) use ($actualRewardEvents) {
$q->where(function ($sub) use ($actualRewardEvents) {
$sub->where('type', 'money')->whereIn('event', $actualRewardEvents);
})->whereOr(function ($sub) {
$sub->where('type', 'commission')->whereNotIn('event', ['transfer_by_commission']);
});
})->sum('amount');
} else {
$income = (float) $incomeQuery->where('amount', '>', 0)->sum('amount');
$expense = (float) $expenseQuery->where('amount', '<', 0)->sum('amount');
$rewardIncome = (float) $rewardQuery->where('amount', '>', 0)->whereIn('event', $actualRewardEvents)->sum('amount');
}
$logs = $filterQuery->order('id', 'desc')->paginate($list_rows);
$this->success('获取成功', [
'list' => $logs,
'income' => $income,
'expense' => $expense,
'reward_income' => $rewardIncome,
]);
}
}