diff --git a/app/Http/Controllers/Admin/PlatformLeadController.php b/app/Http/Controllers/Admin/PlatformLeadController.php index 02a3fbe..29a356b 100644 --- a/app/Http/Controllers/Admin/PlatformLeadController.php +++ b/app/Http/Controllers/Admin/PlatformLeadController.php @@ -6,7 +6,9 @@ use App\Http\Controllers\Concerns\ResolvesPlatformAdminContext; use App\Http\Controllers\Controller; use App\Models\PlatformLead; use Illuminate\Database\Eloquent\Builder; +use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; +use Illuminate\Validation\Rule; use Illuminate\View\View; class PlatformLeadController extends Controller @@ -40,13 +42,32 @@ class PlatformLeadController extends Controller return view('admin.platform_leads.index', [ 'leads' => $leads, 'filters' => $filters, - 'statusLabels' => [ - 'new' => '新线索', - 'contacted' => '已联系', - 'qualified' => '已确认需求', - 'converted' => '已转化', - 'closed' => '已关闭', - ], + 'statusLabels' => $this->statusLabels(), ]); } + + public function setStatus(Request $request, PlatformLead $lead): RedirectResponse + { + $this->ensurePlatformAdmin($request); + + $data = $request->validate([ + 'status' => ['required', Rule::in(array_keys($this->statusLabels()))], + ]); + + $lead->status = (string) $data['status']; + $lead->save(); + + return redirect()->back()->with('success', '线索状态已更新:#' . $lead->id . ' → ' . ($this->statusLabels()[$lead->status] ?? $lead->status)); + } + + private function statusLabels(): array + { + return [ + 'new' => '新线索', + 'contacted' => '已联系', + 'qualified' => '已确认需求', + 'converted' => '已转化', + 'closed' => '已关闭', + ]; + } } diff --git a/resources/views/admin/platform_leads/index.blade.php b/resources/views/admin/platform_leads/index.blade.php index e15977c..3877120 100644 --- a/resources/views/admin/platform_leads/index.blade.php +++ b/resources/views/admin/platform_leads/index.blade.php @@ -88,7 +88,26 @@ @forelse($leads as $l) {{ $l->id }} - {{ $statusLabels[$l->status] ?? $l->status }} + +
+ {{ $statusLabels[$l->status] ?? $l->status }} +
+ @csrf + + +
+
+ @csrf + + +
+
+ @csrf + + +
+
+ {{ $l->name }} {{ $l->mobile }} {{ $l->email }} diff --git a/routes/web.php b/routes/web.php index 2a7791c..1e6b0e3 100644 --- a/routes/web.php +++ b/routes/web.php @@ -150,6 +150,7 @@ Route::prefix('admin')->group(function () { Route::post('/settings/payments/{id}', [PlatformSettingController::class, 'updatePayment']); Route::get('/platform-leads', [\App\Http\Controllers\Admin\PlatformLeadController::class, 'index']); + Route::post('/platform-leads/{lead}/set-status', [\App\Http\Controllers\Admin\PlatformLeadController::class, 'setStatus']); }); }); diff --git a/tests/Feature/AdminPlatformLeadSetStatusTest.php b/tests/Feature/AdminPlatformLeadSetStatusTest.php new file mode 100644 index 0000000..52beeec --- /dev/null +++ b/tests/Feature/AdminPlatformLeadSetStatusTest.php @@ -0,0 +1,69 @@ +seed(); + + $this->post('/admin/login', [ + 'email' => 'platform.admin@demo.local', + 'password' => 'Platform@123456', + ])->assertRedirect('/admin'); + } + + public function test_platform_admin_can_set_lead_status(): void + { + $this->loginAsPlatformAdmin(); + + $lead = PlatformLead::query()->create([ + 'name' => '测试线索', + 'mobile' => '13800000000', + 'email' => 't@example.com', + 'company' => '测试公司', + 'source' => 'test', + 'status' => 'new', + 'plan_id' => null, + 'meta' => ['from' => 'test'], + ]); + + $res = $this->post('/admin/platform-leads/' . $lead->id . '/set-status', [ + 'status' => 'contacted', + ]); + + $res->assertRedirect(); + $this->assertSame('contacted', $lead->fresh()->status); + } + + public function test_set_status_should_reject_invalid_status_value(): void + { + $this->loginAsPlatformAdmin(); + + $lead = PlatformLead::query()->create([ + 'name' => '测试线索2', + 'mobile' => '13800000001', + 'email' => 't2@example.com', + 'company' => '测试公司2', + 'source' => 'test', + 'status' => 'new', + 'plan_id' => null, + 'meta' => ['from' => 'test'], + ]); + + $res = $this->from('/admin/platform-leads')->post('/admin/platform-leads/' . $lead->id . '/set-status', [ + 'status' => 'hacked_status', + ]); + + $res->assertRedirect('/admin/platform-leads'); + $res->assertSessionHasErrors('status'); + $this->assertSame('new', $lead->fresh()->status); + } +}