| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- <?php
- namespace App\Http\Controllers\agent;
- use App\Http\Controllers\AgentApiController;
- use App\Models\Agent\AgentProfitEntry;
- use App\Models\Agent\AgentRebateRecord;
- use App\Services\Agent\AgentPlanApplicationService;
- use Illuminate\Http\Request;
- class CommissionController extends AgentApiController
- {
- /** 合营分成每日入账记录。 */
- public function records(Request $request)
- {
- return $this->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');
- }
- }
|