60 lines
5.5 KiB
PHP
60 lines
5.5 KiB
PHP
<x-layouts.admin>
|
|
<x-slot name="title">流程审核权限</x-slot>
|
|
<x-slot name="content">
|
|
<div class="my-6" data-settings-workspace>
|
|
@include('system_settings.partials.navigation')
|
|
<section class="rounded-xl border border-gray-200 bg-white p-6" aria-label="快递入驻审核人员">
|
|
<h2 class="text-sm font-semibold mb-3">快递入驻审核人员</h2>
|
|
<p class="text-sm text-gray-600 mb-4">初审、复审按顺序进行,各环节任意一名指定人员通过即可。完成初审的人不能再处理同一申请的复审。</p>
|
|
@if (session('success'))<p class="mb-4 text-sm" role="status">{{ session('success') }}</p>@endif
|
|
@if ($errors->any())<div class="mb-4 text-sm text-red-700" role="alert">@foreach ($errors->all() as $error)<p>{{ $error }}</p>@endforeach</div>@endif
|
|
@if (empty($reviewers['first']) || empty($reviewers['final']))<p class="mb-4 text-sm" role="status">尚未配置审核人员,待审核申请暂不能通过。请先完成下面的设置。</p>@endif
|
|
<form method="POST" action="{{ route('system-settings.workflow-reviewers.update') }}" data-reviewers-form data-search-url="{{ route('system-settings.workflow-reviewers.search') }}">
|
|
@csrf @method('PATCH')
|
|
<label for="reviewer-search" class="block text-xs font-semibold mb-2">查找钉钉花名册人员</label>
|
|
<div class="flex flex-wrap gap-2 mb-2">
|
|
<input id="reviewer-search" data-reviewer-search type="search" maxlength="50" placeholder="输入姓名或花名" class="settings-field-focus rounded-lg border border-gray-300 px-3 py-2 text-sm" autocomplete="off">
|
|
<button type="button" data-reviewer-search-button class="settings-primary rounded-lg px-4 py-2 text-sm">查询人员</button>
|
|
</div>
|
|
<p class="text-xs text-gray-600 mb-3">人员须已登录绑定钉钉,账号已启用且有快递入驻页面权限。保存和审核时均核验当前花名册资格,每环节最多 10 人。</p>
|
|
<p data-reviewer-search-status role="status" class="text-sm mb-3" aria-live="polite"></p>
|
|
<div data-reviewer-results class="mb-5"></div>
|
|
<div class="grid grid-cols-1 md:grid-cols-2 gap-6 border-t border-gray-200 pt-5">
|
|
@foreach (['first' => '初审人员', 'final' => '复审人员'] as $stage => $label)
|
|
<div>
|
|
<h3 class="text-sm font-semibold mb-2">{{ $label }} <span class="text-xs text-gray-600">· 任意一人通过</span></h3>
|
|
<ul data-reviewer-selected="{{ $stage }}" class="space-y-2" aria-label="{{ $label }}">
|
|
@foreach (old($stage, array_column($reviewers[$stage], 'dingtalk_user_id')) as $dingId)
|
|
@php $person = collect($reviewers[$stage])->firstWhere('dingtalk_user_id', $dingId); @endphp
|
|
<li class="flex items-center justify-between gap-3 rounded-lg border border-gray-200 px-3 py-2 text-sm">
|
|
<input type="hidden" name="{{ $stage }}[]" value="{{ $dingId }}">
|
|
<span>{{ $person['display_name'] ?? '所选人员(保存时重新核验)' }}</span>
|
|
<button type="button" data-reviewer-remove class="settings-accent" aria-label="移除{{ $person['display_name'] ?? '所选人员' }}">移除</button>
|
|
</li>
|
|
@endforeach
|
|
</ul>
|
|
<p class="text-xs text-gray-600 mt-2">至少选择 1 人。{{ $stage === 'final' ? '任意一人通过后生成首版报价,其余人无需重复审核。' : '通过后转交复审人员处理。' }}</p>
|
|
</div>
|
|
@endforeach
|
|
</div>
|
|
<div class="flex flex-wrap items-center gap-4 mt-6">
|
|
<button type="submit" class="settings-primary rounded-lg px-4 py-2 text-sm">保存审核人员</button>
|
|
<span class="text-xs text-gray-600">保存后立即对待审核申请生效,不会改变已完成的审核记录。</span>
|
|
</div>
|
|
</form>
|
|
</section>
|
|
<section class="mt-5 rounded-xl border border-gray-200 bg-white p-6" aria-label="配置变更记录">
|
|
<h2 class="text-sm font-semibold mb-3">配置变更记录(最近 10 次)</h2>
|
|
@forelse ($history as $entry)
|
|
<div class="border-t border-gray-200 py-3 text-sm">
|
|
<p>{{ $entry['actor'] }} · {{ \Illuminate\Support\Carbon::parse($entry['at'])->format('Y-m-d H:i') }}</p>
|
|
<p class="text-xs text-gray-600 mt-1">初审:{{ implode('、', array_column($entry['after']['first'], 'display_name')) }};复审:{{ implode('、', array_column($entry['after']['final'], 'display_name')) }}</p>
|
|
</div>
|
|
@empty
|
|
<p class="text-sm text-gray-600">尚无变更记录,首次保存后会记录操作人、时间及人员名单。</p>
|
|
@endforelse
|
|
</section>
|
|
</div>
|
|
</x-slot>
|
|
</x-layouts.admin>
|