@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
查看订单
续费缺订阅
|
| 暂无线索 | |||||||||