chunkById(200, function ($preIncomes) use ($walletService) { $preIncomes->load('user'); foreach ($preIncomes as $preIncome) { try { DB::beginTransaction(); $walletService->changeBalance( $preIncome->user, bcmul($preIncome->total_revenue, 100), WalletLog::ACTION_DISTRIBUTION_PRE_INCOME, $preIncome->remarks, $preIncome ); // 计算配额 $quota = round(bcmul($preIncome->total_revenue, app_settings('distribution.quota_v2_rate', 0), 4), 3); $preIncome->user->userInfo()->update([ 'quota_v2' => DB::raw("quota_v2+{$quota}"), ]); $preIncome->user->quotaLogs()->create([ 'loggable_id' => $preIncome->id, 'loggable_type' => $preIncome->getMorphClass(), 'change_quota' => $quota, ]); // 将预收益标记为已结算 $preIncome->update([ 'completed_at' => now(), 'status' => DistributionPreIncome::STATUS_PROCESSED, ]); DB::commit(); } catch (Throwable $e) { DB::rollBack(); report($e); } } }); } }