execute(function () use ($request) { $data = $request->validate([ 'page' => ['nullable', 'integer', 'min:1'], 'limit' => ['nullable', 'integer', 'min:1', 'max:100'], 'order_no' => ['nullable', 'string', 'max:48'], 'category' => ['nullable', 'string', 'max:32'], 'profit_status' => ['nullable', 'in:pending,credited'], 'start_date' => ['nullable', 'date_format:Y-m-d'], 'end_date' => ['nullable', 'date_format:Y-m-d', 'after_or_equal:start_date'], ]); $query = AgentRebateRecord::query()->where('agent_id', $this->currentAgent()->id); if (!empty($data['order_no'])) $query->where('order_no', $data['order_no']); if (!empty($data['category'])) $query->where('platform', $data['category']); if (!empty($data['profit_status'])) $query->where('profit_status', $data['profit_status']); if (!empty($data['start_date'])) $query->where('settlement_date', '>=', $data['start_date']); if (!empty($data['end_date'])) $query->where('settlement_date', '<=', $data['end_date']); return $this->page($query, $data, 'settlement_date'); }); } /** 合营分成注单明细(实时,含未入账)。 */ public function entries(Request $request) { return $this->execute(function () use ($request) { $data = $request->validate([ 'page' => ['nullable', 'integer', 'min:1'], 'limit' => ['nullable', 'integer', 'min:1', 'max:100'], 'category' => ['nullable', 'string', 'max:32'], 'user_id' => ['nullable', 'integer'], 'status' => ['nullable', 'in:counted,skipped_inactive,skipped_no_plan,skipped_category'], 'credited' => ['nullable', 'boolean'], 'start_date' => ['nullable', 'date_format:Y-m-d'], 'end_date' => ['nullable', 'date_format:Y-m-d', 'after_or_equal:start_date'], ]); $query = AgentProfitEntry::query()->where('agent_id', $this->currentAgent()->id); foreach (['category', 'user_id', 'status'] as $field) if (!empty($data[$field])) $query->where($field, $data[$field]); if (isset($data['credited'])) $request->boolean('credited') ? $query->whereNotNull('rebate_record_id') : $query->whereNull('rebate_record_id'); if (!empty($data['start_date'])) $query->where('settle_date', '>=', $data['start_date']); if (!empty($data['end_date'])) $query->where('settle_date', '<=', $data['end_date']); return $this->page($query, $data, 'settled_at'); }); } public function plans(AgentPlanApplicationService $service) { return $this->execute(fn () => $service->plans($this->currentAgent()->fresh())); } public function applyPlan(Request $request, AgentPlanApplicationService $service) { return $this->execute(function () use ($request, $service) { $data = $request->validate([ 'profile_id' => ['required', 'integer'], 'remark' => ['nullable', 'string', 'max:500'], ]); return $service->apply($this->currentAgent(), (int) $data['profile_id'], (string) ($data['remark'] ?? '')); }); } public function planApplications(Request $request, AgentPlanApplicationService $service) { return $this->execute(function () use ($request, $service) { $data = $request->validate([ 'page' => ['nullable', 'integer', 'min:1'], 'limit' => ['nullable', 'integer', 'min:1', 'max:100'], 'status' => ['nullable', 'in:pending,approved,rejected'], ]); return $service->paginate($data, $this->currentAgent()); }); } private function page($query, array $data, string $orderBy): array { $page = max(1, (int) ($data['page'] ?? 1)); $limit = min(100, max(1, (int) ($data['limit'] ?? 20))); $total = (clone $query)->count(); $list = $query->orderByDesc($orderBy)->orderByDesc('id')->forPage($page, $limit)->get(); return compact('total', 'page', 'limit', 'list'); } }