@extends('admin.layouts.app') @section('title', '开通线索') @section('page_title', '开通线索') @section('content') @php // back 安全护栏(全页通用): // - 仅允许站内相对路径(/ 开头) // - 拒绝引号/尖括号(由于本页大量 href 采用 `{!! !!}` 原样输出,必须严控注入风险) // - 拒绝 nested back=(避免 URL 膨胀/绕过) $incomingBack = (string) request()->query('back', ''); $safeBackForLinks = \App\Support\BackUrl::sanitizeForLinks($incomingBack); // back 参数用于“返回上一页(保留上下文)”,但 back 本身不应再包含 back(避免无限嵌套导致 URL 膨胀) $selfWithoutBack = \App\Support\BackUrl::selfWithoutBack(); // 从线索直达“创建平台订单”入口:预填 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); }; // 从线索直达“创建续费订单”入口:本质是 require_subscription 治理链路。 // 线索自身通常没有订阅ID,因此这里不直接传 site_subscription_id,而是引导先去订阅管理选择订阅再返回。 $buildCreateRenewalOrderUrl = function (\App\Models\PlatformLead $l) use ($selfWithoutBack) { $q = []; 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; } // require_subscription:用于“续费必须先选订阅”的治理 UI 口径 $q['require_subscription'] = '1'; $q['lead_id'] = (int) $l->id; $q['back'] = $selfWithoutBack; return '/admin/platform-orders/create?' . \Illuminate\Support\Arr::query($q); }; @endphp
| 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') }} |
创建订单
创建续费订单
@php
$viewOrdersUrl = '/admin/platform-orders?' . \Illuminate\Support\Arr::query([
'lead_id' => $l->id,
'back' => $selfWithoutBack,
]);
$viewRenewalMissingSubOrdersUrl = '/admin/platform-orders?' . \Illuminate\Support\Arr::query([
'lead_id' => $l->id,
'renewal_missing_subscription' => '1',
'back' => $selfWithoutBack,
]);
@endphp
查看订单
续费缺订阅
|
| 暂无线索 | |||||||||