CaiWuXiTong/resources/views/system_settings/partials/quote-workflow-permissions.blade.php

48 lines
4.3 KiB
PHP

<section class="mt-5 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(!$quotePermissions['configured'])<p class="text-sm mb-4" role="status">尚未单独配置报价变价人员,当前沿用原有权限;保存后按下方名单执行。</p>@endif
<form method="POST" action="{{ route('system-settings.workflow-reviewers.quote.update') }}" data-reviewers-form data-search-url="{{ route('system-settings.workflow-reviewers.search', ['workflow' => 'quote']) }}" data-reviewer-stages="{{ json_encode([['initiators', '加入发起人员'], ['reviewers', '加入审核人员']]) }}">
@csrf @method('PATCH')
<label for="quote-reviewer-search" class="block text-xs font-semibold mb-2">查找钉钉花名册人员</label>
<div class="flex flex-wrap gap-2 mb-2">
<input id="quote-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(['initiators' => '变价发起人员', 'reviewers' => '变价审核人员'] as $stage => $label)
<div>
<h3 class="text-sm font-semibold mb-2">{{ $label }}</h3>
<ul data-reviewer-selected="{{ $stage }}" class="space-y-2" aria-label="{{ $label }}">
@foreach(old($stage, array_column($quotePermissions[$stage], 'dingtalk_user_id')) as $dingId)
@php($person = collect($quotePermissions[$stage])->firstWhere('dingtalk_user_id', $dingId))
<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">{{ $stage === 'reviewers' ? '任意一人通过即可,其余人无需重复审核。' : '可创建、保存和提交本人发起的报价变价。' }}</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>
<h3 class="text-sm font-semibold mt-6 mb-3">变价权限变更记录(最近 10 次)</h3>
@forelse($quoteHistory 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']['initiators'], 'display_name')) }};审核:{{ implode('、', array_column($entry['after']['reviewers'], 'display_name')) }}</p>
</div>
@empty
<p class="text-xs text-gray-600">尚无变更记录。</p>
@endforelse
</section>