| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308 |
- @extends('base.base')
- @section('base')
- <div class="main-panel">
- <div class="content-wrapper">
- <div class="page-header">
- <h3 class="page-title">
- <span class="page-title-icon bg-gradient-primary text-white mr-2">
- <i class="mdi mdi-trophy"></i>
- </span>
- World Cup 奖励审核
- </h3>
- <nav aria-label="breadcrumb">
- <ol class="breadcrumb">
- <li class="breadcrumb-item"><a href="#">活动管理</a></li>
- <li class="breadcrumb-item active" aria-current="page">奖励审核</li>
- </ol>
- </nav>
- </div>
- <div class="row">
- <div class="col-md-3 stretch-card grid-margin">
- <div class="card bg-gradient-warning text-white">
- <div class="card-body">
- <h4 class="font-weight-normal mb-3">待审核</h4>
- <h2 class="mb-0">{{ $kpi['reviewing_count'] ?? 0 }}</h2>
- </div>
- </div>
- </div>
- <div class="col-md-3 stretch-card grid-margin">
- <div class="card bg-gradient-success text-white">
- <div class="card-body">
- <h4 class="font-weight-normal mb-3">已通过</h4>
- <h2 class="mb-0">{{ $kpi['approved_count'] ?? 0 }}</h2>
- </div>
- </div>
- </div>
- <div class="col-md-3 stretch-card grid-margin">
- <div class="card bg-gradient-danger text-white">
- <div class="card-body">
- <h4 class="font-weight-normal mb-3">已驳回</h4>
- <h2 class="mb-0">{{ $kpi['rejected_count'] ?? 0 }}</h2>
- </div>
- </div>
- </div>
- <div class="col-md-3 stretch-card grid-margin">
- <div class="card bg-gradient-info text-white">
- <div class="card-body">
- <h4 class="font-weight-normal mb-3">已赔付</h4>
- <h2 class="mb-0">${{ number_format(($kpi['paid_liability'] ?? 0) / 100, 2) }}</h2>
- </div>
- </div>
- </div>
- </div>
- <div class="row">
- <div class="col-lg-12 grid-margin stretch-card">
- <div class="card">
- <div class="card-body">
- <h4 class="card-title">审核队列</h4>
- <form class="form-inline mb-3" method="get" action="/admin/world-cup/rewards">
- <div class="form-group mr-2 mb-2">
- <label class="mr-2">状态</label>
- <select class="form-control" name="status">
- @foreach(['reviewing' => '待审核', 'approved' => '已通过', 'rejected' => '已驳回', 'on_hold' => '挂起', 'clawed_back' => '已追回', '' => '全部'] as $value => $label)
- <option value="{{ $value }}" @if(($filters['status'] ?? '') === $value) selected @endif>{{ $label }}</option>
- @endforeach
- </select>
- </div>
- <div class="form-group mr-2 mb-2">
- <label class="mr-2">风险</label>
- <select class="form-control" name="risk">
- @foreach(['' => '全部', 'low' => 'Low', 'medium' => 'Medium', 'high' => 'High'] as $value => $label)
- <option value="{{ $value }}" @if(($filters['risk'] ?? '') === $value) selected @endif>{{ $label }}</option>
- @endforeach
- </select>
- </div>
- <div class="form-group mr-2 mb-2">
- <label class="mr-2">搜索</label>
- <input class="form-control" name="q" value="{{ $filters['q'] ?? '' }}" placeholder="Reward/User ID">
- </div>
- <div class="form-group mr-2 mb-2">
- <label class="mr-2">条数</label>
- <input class="form-control" name="limit" value="{{ $filters['limit'] ?? 100 }}" style="width: 90px;">
- </div>
- <button type="submit" class="btn btn-gradient-primary btn-sm mb-2">查询</button>
- </form>
- <div class="mb-3">
- <button type="button" class="btn btn-success btn-sm js-batch" data-action="approve">批量通过</button>
- <button type="button" class="btn btn-danger btn-sm js-batch" data-action="reject">批量驳回</button>
- <span class="text-muted ml-2">High risk 奖励必须单笔审核,批量通过会被服务端拒绝。</span>
- </div>
- <div class="table-responsive">
- <table class="table table-bordered table-hover">
- <thead>
- <tr>
- <th><input type="checkbox" class="batch-all"></th>
- <th>Reward ID</th>
- <th>邀请人</th>
- <th>被邀请人</th>
- <th>首充</th>
- <th>各得奖励</th>
- <th>总赔付</th>
- <th>风险</th>
- <th>状态</th>
- <th>提交时间</th>
- <th>审核人</th>
- <th>操作</th>
- </tr>
- </thead>
- <tbody>
- @forelse($list as $row)
- <tr>
- <td><input type="checkbox" class="td-check reward-check" value="{{ $row['reward_id'] }}"></td>
- <td>{{ $row['reward_id'] }}</td>
- <td>{{ $row['referrer_id'] }}</td>
- <td>{{ $row['invitee_id'] }}</td>
- <td>${{ number_format(($row['first_deposit_amt'] ?? 0) / 100, 2) }}</td>
- <td>${{ number_format(($row['reward_each'] ?? 0) / 100, 2) }}</td>
- <td>${{ number_format(($row['total_liability'] ?? 0) / 100, 2) }}</td>
- <td>
- <span class="badge badge-{{ ($row['risk_level'] ?? '') === 'high' ? 'danger' : (($row['risk_level'] ?? '') === 'medium' ? 'warning' : 'success') }}">
- {{ $row['risk_level'] ?? '-' }} / {{ $row['risk_score'] ?? 0 }}
- </span>
- </td>
- <td>{{ $row['status'] ?? '-' }}</td>
- <td>{{ $row['submitted_at'] ?? '-' }}</td>
- <td>{{ $row['review_by'] ?? '-' }}</td>
- <td style="min-width: 240px;">
- <button type="button" class="btn btn-outline-info btn-sm js-detail" data-id="{{ $row['reward_id'] }}">详情</button>
- @if(($row['status'] ?? '') === 'reviewing')
- <button type="button" class="btn btn-success btn-sm js-action" data-action="approve" data-id="{{ $row['reward_id'] }}">通过</button>
- <button type="button" class="btn btn-danger btn-sm js-action" data-action="reject" data-id="{{ $row['reward_id'] }}">驳回</button>
- <button type="button" class="btn btn-warning btn-sm js-action" data-action="hold" data-id="{{ $row['reward_id'] }}">挂起</button>
- @elseif(($row['status'] ?? '') === 'approved')
- <button type="button" class="btn btn-dark btn-sm js-action" data-action="clawback" data-id="{{ $row['reward_id'] }}">追回</button>
- @endif
- </td>
- </tr>
- @empty
- <tr>
- <td colspan="12" class="text-center text-muted">暂无数据</td>
- </tr>
- @endforelse
- </tbody>
- </table>
- </div>
- </div>
- </div>
- </div>
- </div>
- <div class="row">
- <div class="col-lg-12 grid-margin stretch-card">
- <div class="card">
- <div class="card-body">
- <h4 class="card-title">最近审核日志</h4>
- <div class="table-responsive">
- <table class="table table-bordered">
- <thead>
- <tr>
- <th>ID</th>
- <th>Reward ID</th>
- <th>操作人</th>
- <th>动作</th>
- <th>原因</th>
- <th>状态变化</th>
- <th>时间</th>
- </tr>
- </thead>
- <tbody>
- @forelse($logs as $log)
- <tr>
- <td>{{ $log['id'] ?? '-' }}</td>
- <td>{{ $log['reward_id'] ?? '-' }}</td>
- <td>{{ $log['actor'] ?? '-' }}</td>
- <td>{{ $log['action'] ?? '-' }}</td>
- <td>{{ $log['reason_code'] ?? '-' }}</td>
- <td>{{ $log['before_status'] ?? '-' }} -> {{ $log['after_status'] ?? '-' }}</td>
- <td>{{ $log['created_at'] ?? '-' }}</td>
- </tr>
- @empty
- <tr>
- <td colspan="7" class="text-center text-muted">暂无日志</td>
- </tr>
- @endforelse
- </tbody>
- </table>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- <script>
- (function () {
- function showMessage(message) {
- if (window.layer) {
- layer.msg(message);
- return;
- }
- alert(message);
- }
- function reloadWhenSuccess(res) {
- showMessage(res.msg || 'success');
- if (res.code === 200) {
- window.location.reload();
- }
- }
- function postReview(url, data) {
- myRequest(url, 'post', data || {}, reloadWhenSuccess);
- }
- function requireReason(title) {
- return window.prompt(title || '请输入原因代码,例如 same_device / bulk_signup / fraud');
- }
- $('.js-action').on('click', function () {
- var id = $(this).data('id');
- var action = $(this).data('action');
- var data = {};
- if (action === 'reject') {
- data.reason_code = requireReason('请输入驳回原因代码');
- if (!data.reason_code) {
- return;
- }
- }
- if (action === 'clawback') {
- data.reason_code = requireReason('请输入追回原因代码');
- if (!data.reason_code) {
- return;
- }
- data.ban_users = window.confirm('是否同时封禁邀请人与被邀请人?') ? 1 : 0;
- }
- if (action === 'approve' && !window.confirm('确认通过并立即给双方发放奖励?')) {
- return;
- }
- postReview('/admin/world-cup/rewards/' + id + '/' + action, data);
- });
- $('.js-batch').on('click', function () {
- var action = $(this).data('action');
- var ids = $('.reward-check:checked').map(function () {
- return $(this).val();
- }).get();
- var data = {
- action: action,
- reward_ids: ids
- };
- if (ids.length === 0) {
- showMessage('请先选择奖励单');
- return;
- }
- if (action === 'reject') {
- data.reason_code = requireReason('请输入批量驳回原因代码');
- if (!data.reason_code) {
- return;
- }
- }
- if (action === 'approve' && !window.confirm('确认批量通过?High risk 会被服务端拒绝。')) {
- return;
- }
- postReview('/admin/world-cup/rewards/batch', data);
- });
- $('.js-detail').on('click', function () {
- var id = $(this).data('id');
- myRequest('/admin/world-cup/rewards/' + id, 'get', {}, function (res) {
- if (res.code !== 200) {
- showMessage(res.msg || '查询失败');
- return;
- }
- var content = '<pre style="white-space: pre-wrap; padding: 12px;">'
- + $('<div/>').text(JSON.stringify(res.data.reward, null, 2)).html()
- + '</pre>';
- if (window.layer) {
- layer.open({
- type: 1,
- area: ['720px', '620px'],
- title: '奖励详情 #' + id,
- content: content
- });
- return;
- }
- alert(JSON.stringify(res.data.reward, null, 2));
- });
- });
- })();
- </script>
- @endsection
|