文件

121 行
5.1 KiB
PHP

<?php
namespace addons\shopro\controller\user;
use addons\shopro\controller\Common;
use app\admin\model\shopro\user\WalletLog as UserWalletLogModel;
class WalletLog extends Common
{
protected $noNeedLogin = [];
protected $noNeedRight = ['*'];
public function index()
{
$type = $this->request->param('type', 'money');
$tab = $this->request->param('tab', 'all');
$list_rows = $this->request->param('list_rows', 10);
$date = $this->request->param('date/a');
$user = auth_user();
$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':
$filterQuery->where('amount', '>', 0);
break;
case 'expense':
$filterQuery->where('amount', '<', 0);
break;
}
// 统计收入与支出(统一统计口径,避免内部互转重叠统计造成误导)
$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,
]);
}
}