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 }}
+
+
+
+
+ |
{{ $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);
+ }
+}