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, ]); } }