feat: 收益全额直入商城余额、存量结转与奖项名称全局规范化对齐
这个提交包含在:
@@ -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,
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
在新工单中引用
屏蔽一个用户