ReferralController.php 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. <?php
  2. namespace App\Http\Controllers\agent;
  3. use App\Http\Controllers\AgentApiController;
  4. use App\Services\Agent\AgentDomainService;
  5. use Illuminate\Http\Request;
  6. use Illuminate\Support\Facades\DB;
  7. use App\Models\User;
  8. use Carbon\Carbon;
  9. class ReferralController extends AgentApiController
  10. {
  11. public function resolve(Request $request, AgentDomainService $domains)
  12. {
  13. return $this->execute(function () use ($request, $domains) {
  14. $data = $request->validate([
  15. 'agent_code' => ['nullable', 'string', 'max:32', 'required_without:domain'],
  16. 'domain' => ['nullable', 'string', 'max:255', 'required_without:agent_code'],
  17. ]);
  18. $agent = $domains->resolve($data['agent_code'] ?? null, $data['domain'] ?? null);
  19. if (!$agent) throw new \RuntimeException('代理推广信息不存在或已禁用');
  20. return [
  21. 'agent_id' => (int) $agent->id,
  22. 'agent_code' => $agent->invitation_code,
  23. 'agent_name' => $agent->username,
  24. ];
  25. });
  26. }
  27. public function bind(Request $request, AgentDomainService $domains)
  28. {
  29. return $this->execute(function () use ($request, $domains) {
  30. $data = $request->validate([
  31. 'agent_code' => ['nullable', 'string', 'max:32', 'required_without:domain'],
  32. 'domain' => ['nullable', 'string', 'max:255', 'required_without:agent_code'],
  33. ]);
  34. $agent = $domains->resolve($data['agent_code'] ?? null, $data['domain'] ?? null);
  35. if (!$agent) {
  36. throw new \RuntimeException('代理推广信息不存在或已禁用');
  37. }
  38. return DB::transaction(function () use ($request, $agent) {
  39. $user = User::query()->lockForUpdate()->findOrFail($request->user->id);
  40. if ($user->agent_id !== null && (int) $user->agent_id !== (int) $agent->id) {
  41. throw new \RuntimeException('会员已绑定其他代理,不能重复修改');
  42. }
  43. if ($user->agent_id !== null) {
  44. return ['user_id' => (int) $user->id, 'agent_id' => (int) $agent->id];
  45. }
  46. $createdAt = $user->getRawOriginal('created_at');
  47. if (!$createdAt || Carbon::parse($createdAt)->lt(now()->subMinutes(config('agent.referral_bind_minutes', 30)))) {
  48. throw new \RuntimeException('推广归属只能在新会员注册后及时绑定');
  49. }
  50. $user->agent_id = $agent->id;
  51. $user->save();
  52. return ['user_id' => (int) $user->id, 'agent_id' => (int) $agent->id];
  53. });
  54. });
  55. }
  56. }