CommissionController.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. <?php
  2. namespace App\Http\Controllers\agent;
  3. use App\Http\Controllers\AgentApiController;
  4. use App\Models\Agent\AgentProfitEntry;
  5. use App\Models\Agent\AgentRebateRecord;
  6. use App\Services\Agent\AgentPlanApplicationService;
  7. use Illuminate\Http\Request;
  8. class CommissionController extends AgentApiController
  9. {
  10. /** 合营分成每日入账记录。 */
  11. public function records(Request $request)
  12. {
  13. return $this->execute(function () use ($request) {
  14. $data = $request->validate([
  15. 'page' => ['nullable', 'integer', 'min:1'], 'limit' => ['nullable', 'integer', 'min:1', 'max:100'],
  16. 'order_no' => ['nullable', 'string', 'max:48'], 'category' => ['nullable', 'string', 'max:32'],
  17. 'profit_status' => ['nullable', 'in:pending,credited'],
  18. 'start_date' => ['nullable', 'date_format:Y-m-d'], 'end_date' => ['nullable', 'date_format:Y-m-d', 'after_or_equal:start_date'],
  19. ]);
  20. $query = AgentRebateRecord::query()->where('agent_id', $this->currentAgent()->id);
  21. if (!empty($data['order_no'])) $query->where('order_no', $data['order_no']);
  22. if (!empty($data['category'])) $query->where('platform', $data['category']);
  23. if (!empty($data['profit_status'])) $query->where('profit_status', $data['profit_status']);
  24. if (!empty($data['start_date'])) $query->where('settlement_date', '>=', $data['start_date']);
  25. if (!empty($data['end_date'])) $query->where('settlement_date', '<=', $data['end_date']);
  26. return $this->page($query, $data, 'settlement_date');
  27. });
  28. }
  29. /** 合营分成注单明细(实时,含未入账)。 */
  30. public function entries(Request $request)
  31. {
  32. return $this->execute(function () use ($request) {
  33. $data = $request->validate([
  34. 'page' => ['nullable', 'integer', 'min:1'], 'limit' => ['nullable', 'integer', 'min:1', 'max:100'],
  35. 'category' => ['nullable', 'string', 'max:32'], 'user_id' => ['nullable', 'integer'],
  36. 'status' => ['nullable', 'in:counted,skipped_inactive,skipped_no_plan,skipped_category'],
  37. 'credited' => ['nullable', 'boolean'],
  38. 'start_date' => ['nullable', 'date_format:Y-m-d'], 'end_date' => ['nullable', 'date_format:Y-m-d', 'after_or_equal:start_date'],
  39. ]);
  40. $query = AgentProfitEntry::query()->where('agent_id', $this->currentAgent()->id);
  41. foreach (['category', 'user_id', 'status'] as $field) if (!empty($data[$field])) $query->where($field, $data[$field]);
  42. if (isset($data['credited'])) $request->boolean('credited') ? $query->whereNotNull('rebate_record_id') : $query->whereNull('rebate_record_id');
  43. if (!empty($data['start_date'])) $query->where('settle_date', '>=', $data['start_date']);
  44. if (!empty($data['end_date'])) $query->where('settle_date', '<=', $data['end_date']);
  45. return $this->page($query, $data, 'settled_at');
  46. });
  47. }
  48. public function plans(AgentPlanApplicationService $service)
  49. {
  50. return $this->execute(fn () => $service->plans($this->currentAgent()->fresh()));
  51. }
  52. public function applyPlan(Request $request, AgentPlanApplicationService $service)
  53. {
  54. return $this->execute(function () use ($request, $service) {
  55. $data = $request->validate([
  56. 'profile_id' => ['required', 'integer'], 'remark' => ['nullable', 'string', 'max:500'],
  57. ]);
  58. return $service->apply($this->currentAgent(), (int) $data['profile_id'], (string) ($data['remark'] ?? ''));
  59. });
  60. }
  61. public function planApplications(Request $request, AgentPlanApplicationService $service)
  62. {
  63. return $this->execute(function () use ($request, $service) {
  64. $data = $request->validate([
  65. 'page' => ['nullable', 'integer', 'min:1'], 'limit' => ['nullable', 'integer', 'min:1', 'max:100'],
  66. 'status' => ['nullable', 'in:pending,approved,rejected'],
  67. ]);
  68. return $service->paginate($data, $this->currentAgent());
  69. });
  70. }
  71. private function page($query, array $data, string $orderBy): array
  72. {
  73. $page = max(1, (int) ($data['page'] ?? 1));
  74. $limit = min(100, max(1, (int) ($data['limit'] ?? 20)));
  75. $total = (clone $query)->count();
  76. $list = $query->orderByDesc($orderBy)->orderByDesc('id')->forPage($page, $limit)->get();
  77. return compact('total', 'page', 'limit', 'list');
  78. }
  79. }