@extends('admin.layouts.app') @section('title', '开通线索') @section('page_title', '开通线索') @section('content') @php $incomingBack = (string) request()->query('back', ''); // 为避免 & 被 Blade escape 成 & 导致回退上下文丢失,这里需要原样输出 href。 // 安全护栏:必须为站内相对路径,并拒绝引号/尖括号,且拒绝 nested back。 $safeBack = (str_starts_with($incomingBack, '/') && !preg_match('/["\'<>]/', $incomingBack) && !preg_match('/(?:^|[?&])back=/', $incomingBack)) ? $incomingBack : ''; // back 参数用于“返回上一页(保留上下文)”,但 back 本身不应再包含 back(避免无限嵌套导致 URL 膨胀) $currentQuery = request()->query(); unset($currentQuery['back']); $selfWithoutBack = '/' . ltrim(request()->path(), '/'); if (count($currentQuery) > 0) { $selfWithoutBack .= '?' . \Illuminate\Support\Arr::query($currentQuery); } // 从线索直达“创建平台订单”入口:预填 plan_id/remark,并带 back 回到当前线索列表(保留筛选) // 备注:如果线索 meta 中包含 merchant_id,也会一并预填(用于“已存在站点,但需补单/续费”的场景) $buildCreatePlatformOrderUrl = function (\App\Models\PlatformLead $l) use ($selfWithoutBack) { $remarkParts = array_filter([ '线索#' . $l->id, $l->name, $l->mobile, $l->company, $l->email, // 后续可用于“从线索追溯来源页/入口” $l->source ? ('src:' . $l->source) : '', ], fn ($v) => (string) $v !== ''); $q = [ 'order_type' => 'new_purchase', 'back' => $selfWithoutBack, 'remark' => mb_substr(implode(' / ', $remarkParts), 0, 220), // 轻量联动:从线索创建订单后,把线索标记为已转化(后续可再升级为“创建成功后回写”) 'lead_id' => (int) $l->id, ]; if ((int) $l->plan_id > 0) { $q['plan_id'] = (int) $l->plan_id; } $meta = is_array($l->meta) ? $l->meta : []; $merchantId = (int) ($meta['merchant_id'] ?? 0); if ($merchantId > 0) { $q['merchant_id'] = $merchantId; } return '/admin/platform-orders/create?' . \Illuminate\Support\Arr::query($q); }; @endphp
对外平台(/platform)收集的开通意向线索,用于前期 A(站点开通型)人工运营承接。
@if($safeBack) @endif后续会在此处逐步接入:一键生成站点/订阅/平台订单、跟进记录、转化漏斗与治理提示。
| ID | 状态 | 姓名 | 手机号 | 邮箱 | 公司 | 套餐ID | 来源 | 创建时间 | 操作 |
|---|---|---|---|---|---|---|---|---|---|
| {{ $l->id }} |
{{ $statusLabels[$l->status] ?? $l->status }}
@php
// 轻量运营流转:仅展示“下一步可能动作”,减少噪音/误点。
$nextActions = [];
switch ((string) $l->status) {
case 'new':
$nextActions = ['contacted', 'converted', 'closed'];
break;
case 'contacted':
$nextActions = ['qualified', 'converted', 'closed'];
break;
case 'qualified':
$nextActions = ['converted', 'closed'];
break;
case 'converted':
$nextActions = ['closed'];
break;
default:
$nextActions = [];
}
$actionLabels = [
'contacted' => ['text' => '标记已联系', 'class' => 'btn-secondary btn-sm'],
'qualified' => ['text' => '标记已确认需求', 'class' => 'btn-secondary btn-sm'],
'converted' => ['text' => '标记已转化', 'class' => 'btn btn-sm'],
'closed' => ['text' => '关闭', 'class' => 'btn-danger btn-sm'],
];
@endphp
@foreach($nextActions as $status)
@endforeach
|
{{ $l->name }} | {{ $l->mobile }} | {{ $l->email }} | {{ $l->company }} | {{ $l->plan_id ?: '-' }} | {{ $l->source }} | {{ optional($l->created_at)->format('Y-m-d H:i:s') }} | |
| 暂无线索 | |||||||||