@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

后续会在此处逐步接入:一键生成站点/订阅/平台订单、跟进记录、转化漏斗与治理提示。

筛选

线索列表

当前阶段仅提供查询与筛选;已补“从线索创建订单”入口,先把收费闭环跑起来。
@forelse($leads as $l) @empty @endforelse
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)
@csrf
@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') }}
创建订单 @php $viewOrdersUrl = '/admin/platform-orders?' . \Illuminate\Support\Arr::query([ 'lead_id' => $l->id, 'back' => $selfWithoutBack, ]); @endphp 查看订单
暂无线索
{{ $leads->links() }}
@endsection