|
|
@@ -1,121 +1,251 @@
|
|
|
-@extends('admin::layouts.content')
|
|
|
+<x-admin::layouts>
|
|
|
+ <x-slot:title>
|
|
|
+ {{ __('rewardpoints::rewardpoints.admin.details-title', ['name' => $customer->first_name . ' ' . $customer->last_name]) }}
|
|
|
+ </x-slot:title>
|
|
|
|
|
|
-@section('page_title')
|
|
|
- {{ __('rewardpoints::app.admin.customers.details-title', ['name' => $customer->first_name . ' ' . $customer->last_name]) }}
|
|
|
-@stop
|
|
|
+ {{-- 页面标题 --}}
|
|
|
+ <div class="flex items-center gap-3 mb-6">
|
|
|
+ <div class="icon-users text-2xl text-blue-500"></div>
|
|
|
+ <h1 class="text-2xl text-gray-800 dark:text-white font-bold">
|
|
|
+ {{ $customer->first_name . ' ' . $customer->last_name }}
|
|
|
+ </h1>
|
|
|
+ </div>
|
|
|
|
|
|
-@section('content')
|
|
|
- <div class="content">
|
|
|
- <div class="page-header">
|
|
|
- <div class="page-title">
|
|
|
- <h1>{{ $customer->first_name . ' ' . $customer->last_name }}</h1>
|
|
|
+ {{-- 客户信息卡片 --}}
|
|
|
+ <div class="bg-white dark:bg-gray-900 rounded-lg shadow-sm border border-gray-200 dark:border-gray-800 p-6 mb-6">
|
|
|
+ <h2 class="text-lg font-semibold text-gray-800 dark:text-white mb-4">
|
|
|
+ @lang('rewardpoints::rewardpoints.admin.customer-info')
|
|
|
+ </h2>
|
|
|
+ <div class="grid grid-cols-1 md:grid-cols-3 gap-4">
|
|
|
+ <div>
|
|
|
+ <label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">
|
|
|
+ @lang('rewardpoints::rewardpoints.admin.name')
|
|
|
+ </label>
|
|
|
+ <input
|
|
|
+ type="text"
|
|
|
+ class="flex w-full min-h-[39px] py-2 px-3 border border-gray-300 dark:border-gray-800 rounded-md text-sm text-gray-600 dark:text-gray-300 bg-gray-50 dark:bg-gray-900"
|
|
|
+ value="{{ $customer->first_name . ' ' . $customer->last_name }}"
|
|
|
+ readonly
|
|
|
+ >
|
|
|
+ </div>
|
|
|
+ <div>
|
|
|
+ <label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">
|
|
|
+ @lang('rewardpoints::rewardpoints.admin.email')
|
|
|
+ </label>
|
|
|
+ <input
|
|
|
+ type="text"
|
|
|
+ class="flex w-full min-h-[39px] py-2 px-3 border border-gray-300 dark:border-gray-800 rounded-md text-sm text-gray-600 dark:text-gray-300 bg-gray-50 dark:bg-gray-900"
|
|
|
+ value="{{ $customer->email }}"
|
|
|
+ readonly
|
|
|
+ >
|
|
|
+ </div>
|
|
|
+ <div>
|
|
|
+ <label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1">
|
|
|
+ @lang('rewardpoints::rewardpoints.admin.points-balance')
|
|
|
+ </label>
|
|
|
+ <input
|
|
|
+ type="text"
|
|
|
+ class="flex w-full min-h-[39px] py-2 px-3 border border-yellow-300 dark:border-yellow-800 rounded-md text-sm text-yellow-600 dark:text-yellow-400 bg-yellow-50 dark:bg-yellow-900/20 font-bold"
|
|
|
+ value="{{ number_format($rewardData->mw_reward_point) }}"
|
|
|
+ readonly
|
|
|
+ >
|
|
|
</div>
|
|
|
</div>
|
|
|
+ </div>
|
|
|
|
|
|
- <div class="page-content">
|
|
|
- <accordian :title="'{{ __('rewardpoints::app.admin.customers.customer-info') }}'" :active="true">
|
|
|
- <div slot="body">
|
|
|
- <div class="form-container">
|
|
|
- <div class="control-group">
|
|
|
- <label>{{ __('rewardpoints::app.admin.customers.name') }}</label>
|
|
|
- <input type="text" class="control" value="{{ $customer->first_name . ' ' . $customer->last_name }}" readonly>
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="control-group">
|
|
|
- <label>{{ __('rewardpoints::app.admin.customers.email') }}</label>
|
|
|
- <input type="text" class="control" value="{{ $customer->email }}" readonly>
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="control-group">
|
|
|
- <label>{{ __('rewardpoints::app.admin.customers.reward-points') }}</label>
|
|
|
- <input type="text" class="control" value="{{ $rewardData->mw_reward_point }}" readonly>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </accordian>
|
|
|
+ {{-- 积分历史 --}}
|
|
|
+ <div class="bg-white dark:bg-gray-900 rounded-lg shadow-sm border border-gray-200 dark:border-gray-800 overflow-hidden mb-6">
|
|
|
+ <div class="p-6 border-b border-gray-200 dark:border-gray-800">
|
|
|
+ <h2 class="text-lg font-semibold text-gray-800 dark:text-white">
|
|
|
+ @lang('rewardpoints::rewardpoints.admin.points-history')
|
|
|
+ </h2>
|
|
|
+ </div>
|
|
|
+ <div class="overflow-x-auto">
|
|
|
+ <table class="min-w-full divide-y divide-gray-200 dark:divide-gray-800">
|
|
|
+ <thead class="bg-gray-50 dark:bg-gray-800">
|
|
|
+ <tr>
|
|
|
+ <th class="px-6 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider">
|
|
|
+ @lang('rewardpoints::rewardpoints.admin.type')
|
|
|
+ </th>
|
|
|
+ <th class="px-6 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider">
|
|
|
+ @lang('rewardpoints::rewardpoints.admin.amount')
|
|
|
+ </th>
|
|
|
+ <th class="px-6 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider">
|
|
|
+ @lang('rewardpoints::rewardpoints.admin.balance')
|
|
|
+ </th>
|
|
|
+ <th class="px-6 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider">
|
|
|
+ @lang('rewardpoints::rewardpoints.admin.date')
|
|
|
+ </th>
|
|
|
+ <th class="px-6 py-3 text-left text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wider">
|
|
|
+ @lang('rewardpoints::rewardpoints.admin.description')
|
|
|
+ </th>
|
|
|
+ </tr>
|
|
|
+ </thead>
|
|
|
+ <tbody class="bg-white dark:bg-gray-900 divide-y divide-gray-200 dark:divide-gray-800">
|
|
|
+ @forelse ($history as $record)
|
|
|
+ <tr class="hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors">
|
|
|
+ <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900 dark:text-gray-300">
|
|
|
+ @php
|
|
|
+ $typeNames = [
|
|
|
+ 1 => 'Daily Sign In',
|
|
|
+ 2 => 'Registration',
|
|
|
+ 3 => 'Order',
|
|
|
+ 4 => 'Product Review',
|
|
|
+ 5 => 'Referral',
|
|
|
+ 6 => 'Birthday',
|
|
|
+ 7 => 'Share',
|
|
|
+ 8 => 'Subscribe',
|
|
|
+ 9 => 'Login',
|
|
|
+ 99 => 'Admin Action'
|
|
|
+ ];
|
|
|
+ @endphp
|
|
|
+ <span class="px-2 py-1 inline-flex text-xs leading-5 font-semibold rounded-full bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-200">
|
|
|
+ {{ $typeNames[$record->type_of_transaction] ?? 'Unknown' }}
|
|
|
+ </span>
|
|
|
+ </td>
|
|
|
+ <td class="px-6 py-4 whitespace-nowrap text-sm">
|
|
|
+ <span class="font-semibold {{ $record->amount > 0 ? 'text-green-600 dark:text-green-400' : 'text-red-600 dark:text-red-400' }}">
|
|
|
+ {{ $record->amount > 0 ? '+' : '' }}{{ number_format($record->amount) }}
|
|
|
+ </span>
|
|
|
+ </td>
|
|
|
+ <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900 dark:text-gray-300">
|
|
|
+ {{ number_format($record->balance) }}
|
|
|
+ </td>
|
|
|
+ <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900 dark:text-gray-300">
|
|
|
+ {{ \Carbon\Carbon::parse($record->transaction_time)->format('Y-m-d H:i') }}
|
|
|
+ </td>
|
|
|
+ <td class="px-6 py-4 text-sm text-gray-900 dark:text-gray-300 max-w-xs truncate">
|
|
|
+ {{ $record->transaction_detail }}
|
|
|
+ </td>
|
|
|
+ </tr>
|
|
|
+ @empty
|
|
|
+ <tr>
|
|
|
+ <td colspan="5" class="px-6 py-12 text-center">
|
|
|
+ <div class="flex flex-col items-center gap-4">
|
|
|
+ <div class="w-20 h-20 bg-gray-100 dark:bg-gray-800 rounded-full flex items-center justify-center">
|
|
|
+ <span class="icon-list text-4xl text-gray-400"></span>
|
|
|
+ </div>
|
|
|
+ <div>
|
|
|
+ <p class="text-lg font-medium text-gray-600 dark:text-gray-400 mb-1">
|
|
|
+ @lang('rewardpoints::rewardpoints.admin.no-reward-points-records')
|
|
|
+ </p>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </td>
|
|
|
+ </tr>
|
|
|
+ @endforelse
|
|
|
+ </tbody>
|
|
|
+ </table>
|
|
|
+ </div>
|
|
|
|
|
|
- <accordian :title="'{{ __('rewardpoints::app.admin.customers.points-history') }}'" :active="true">
|
|
|
- <div slot="body">
|
|
|
- <div class="table">
|
|
|
- <table>
|
|
|
- <thead>
|
|
|
- <tr>
|
|
|
- <th>{{ __('rewardpoints::app.admin.customers.type') }}</th>
|
|
|
- <th>{{ __('rewardpoints::app.admin.customers.amount') }}</th>
|
|
|
- <th>{{ __('rewardpoints::app.admin.customers.balance') }}</th>
|
|
|
- <th>{{ __('rewardpoints::app.admin.customers.date') }}</th>
|
|
|
- <th>{{ __('rewardpoints::app.admin.customers.description') }}</th>
|
|
|
- </tr>
|
|
|
- </thead>
|
|
|
- <tbody>
|
|
|
- @foreach ($history as $record)
|
|
|
- <tr>
|
|
|
- <td>{{ $record->type_of_transaction }}</td>
|
|
|
- <td>{{ $record->amount }}</td>
|
|
|
- <td>{{ $record->balance }}</td>
|
|
|
- <td>{{ $record->transaction_time }}</td>
|
|
|
- <td>{{ $record->transaction_detail }}</td>
|
|
|
- </tr>
|
|
|
- @endforeach
|
|
|
- </tbody>
|
|
|
- </table>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </accordian>
|
|
|
+ {{-- 分页 --}}
|
|
|
+ @if($history->hasPages())
|
|
|
+ <div class="p-4 border-t border-gray-200 dark:border-gray-800">
|
|
|
+ {{ $history->links() }}
|
|
|
+ </div>
|
|
|
+ @endif
|
|
|
+ </div>
|
|
|
|
|
|
- <accordian :title="'{{ __('rewardpoints::app.admin.customers.adjust-points') }}'" :active="false">
|
|
|
- <div slot="body">
|
|
|
- <form method="POST" action="{{ route('admin.reward-points.customers.add-points') }}">
|
|
|
- @csrf
|
|
|
- <input type="hidden" name="customer_id" value="{{ $customer->id }}">
|
|
|
+ {{-- 调整积分 --}}
|
|
|
+ <div class="bg-white dark:bg-gray-900 rounded-lg shadow-sm border border-gray-200 dark:border-gray-800 p-6">
|
|
|
+ <h2 class="text-lg font-semibold text-gray-800 dark:text-white mb-4">
|
|
|
+ @lang('rewardpoints::rewardpoints.admin.adjust-points')
|
|
|
+ </h2>
|
|
|
|
|
|
- <div class="form-container">
|
|
|
- <div class="control-group">
|
|
|
- <label for="points">{{ __('rewardpoints::app.admin.customers.points') }}</label>
|
|
|
- <input type="number" class="control" id="points" name="points" required>
|
|
|
- </div>
|
|
|
+ {{-- 增加积分表单 --}}
|
|
|
+ <form method="POST" action="{{ route('admin.reward-points.customers.add-points') }}" class="mb-6">
|
|
|
+ @csrf
|
|
|
+ <input type="hidden" name="customer_id" value="{{ $customer->id }}">
|
|
|
|
|
|
- <div class="control-group">
|
|
|
- <label for="type">{{ __('rewardpoints::app.admin.customers.type') }}</label>
|
|
|
- <select class="control" id="type" name="type" required>
|
|
|
- <option value="1">{{ __('rewardpoints::app.admin.transactions.order') }}</option>
|
|
|
- <option value="2">{{ __('rewardpoints::app.admin.transactions.registration') }}</option>
|
|
|
- <option value="3">{{ __('rewardpoints::app.admin.transactions.review') }}</option>
|
|
|
- <option value="4">{{ __('rewardpoints::app.admin.transactions.sign-in') }}</option>
|
|
|
- <option value="5">{{ __('rewardpoints::app.admin.transactions.referral') }}</option>
|
|
|
- <option value="6">{{ __('rewardpoints::app.admin.transactions.birthday') }}</option>
|
|
|
- </select>
|
|
|
- </div>
|
|
|
+ <div class="grid grid-cols-1 md:grid-cols-3 gap-4 mb-4">
|
|
|
+ <div>
|
|
|
+ <label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1.5">
|
|
|
+ @lang('rewardpoints::rewardpoints.admin.points')
|
|
|
+ </label>
|
|
|
+ <input
|
|
|
+ type="number"
|
|
|
+ name="points"
|
|
|
+ required
|
|
|
+ min="1"
|
|
|
+ class="flex w-full min-h-[39px] py-2 px-3 border border-gray-300 dark:border-gray-800 rounded-md text-sm text-gray-600 dark:text-gray-300 transition-all hover:border-gray-400 dark:hover:border-gray-400 focus:border-gray-400 dark:focus:border-gray-400"
|
|
|
+ >
|
|
|
+ </div>
|
|
|
|
|
|
- <div class="control-group">
|
|
|
- <label for="reason">{{ __('rewardpoints::app.admin.customers.reason') }}</label>
|
|
|
- <input type="text" class="control" id="reason" name="reason">
|
|
|
- </div>
|
|
|
+ <div>
|
|
|
+ <label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1.5">
|
|
|
+ @lang('rewardpoints::rewardpoints.admin.type')
|
|
|
+ </label>
|
|
|
+ <select
|
|
|
+ name="type"
|
|
|
+ required
|
|
|
+ class="flex w-full min-h-[39px] py-2 px-3 border border-gray-300 dark:border-gray-800 rounded-md text-sm text-gray-600 dark:text-gray-300 transition-all hover:border-gray-400 dark:hover:border-gray-400 focus:border-gray-400 dark:focus:border-gray-400"
|
|
|
+ >
|
|
|
+ <option value="3">@lang('Order')</option>
|
|
|
+ <option value="2">@lang('Registration')</option>
|
|
|
+ <option value="4">@lang('Product Review')</option>
|
|
|
+ <option value="1">@lang('Daily Sign In')</option>
|
|
|
+ <option value="5">@lang('Referral')</option>
|
|
|
+ <option value="6">@lang('Birthday')</option>
|
|
|
+ <option value="7">@lang('Share')</option>
|
|
|
+ <option value="8">@lang('Subscribe')</option>
|
|
|
+ <option value="9">@lang('Login')</option>
|
|
|
+ <option value="99">@lang('Admin Action')</option>
|
|
|
+ </select>
|
|
|
+ </div>
|
|
|
|
|
|
- <button type="submit" class="btn btn-md btn-primary">{{ __('rewardpoints::app.admin.customers.add-points') }}</button>
|
|
|
- </div>
|
|
|
- </form>
|
|
|
+ <div>
|
|
|
+ <label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1.5">
|
|
|
+ @lang('rewardpoints::rewardpoints.admin.reason')
|
|
|
+ </label>
|
|
|
+ <input
|
|
|
+ type="text"
|
|
|
+ name="reason"
|
|
|
+ class="flex w-full min-h-[39px] py-2 px-3 border border-gray-300 dark:border-gray-800 rounded-md text-sm text-gray-600 dark:text-gray-300 transition-all hover:border-gray-400 dark:hover:border-gray-400 focus:border-gray-400 dark:focus:border-gray-400"
|
|
|
+ >
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
|
|
|
- <form method="POST" action="{{ route('admin.reward-points.customers.deduct-points') }}" style="margin-top: 20px;">
|
|
|
- @csrf
|
|
|
- <input type="hidden" name="customer_id" value="{{ $customer->id }}">
|
|
|
+ <button type="submit" class="primary-button">
|
|
|
+ <span class="icon-plus text-lg"></span>
|
|
|
+ @lang('rewardpoints::rewardpoints.admin.add-points')
|
|
|
+ </button>
|
|
|
+ </form>
|
|
|
|
|
|
- <div class="form-container">
|
|
|
- <div class="control-group">
|
|
|
- <label for="deduct_points">{{ __('rewardpoints::app.admin.customers.points') }}</label>
|
|
|
- <input type="number" class="control" id="deduct_points" name="points" required>
|
|
|
- </div>
|
|
|
+ {{-- 扣除积分表单 --}}
|
|
|
+ <form method="POST" action="{{ route('admin.reward-points.customers.deduct-points') }}">
|
|
|
+ @csrf
|
|
|
+ <input type="hidden" name="customer_id" value="{{ $customer->id }}">
|
|
|
|
|
|
- <div class="control-group">
|
|
|
- <label for="deduct_reason">{{ __('rewardpoints::app.admin.customers.reason') }}</label>
|
|
|
- <input type="text" class="control" id="deduct_reason" name="reason">
|
|
|
- </div>
|
|
|
+ <div class="grid grid-cols-1 md:grid-cols-2 gap-4 mb-4">
|
|
|
+ <div>
|
|
|
+ <label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1.5">
|
|
|
+ @lang('rewardpoints::rewardpoints.admin.points')
|
|
|
+ </label>
|
|
|
+ <input
|
|
|
+ type="number"
|
|
|
+ name="points"
|
|
|
+ required
|
|
|
+ min="1"
|
|
|
+ class="flex w-full min-h-[39px] py-2 px-3 border border-gray-300 dark:border-gray-800 rounded-md text-sm text-gray-600 dark:text-gray-300 transition-all hover:border-gray-400 dark:hover:border-gray-400 focus:border-gray-400 dark:focus:border-gray-400"
|
|
|
+ >
|
|
|
+ </div>
|
|
|
|
|
|
- <button type="submit" class="btn btn-md btn-danger">{{ __('rewardpoints::app.admin.customers.deduct-points') }}</button>
|
|
|
- </div>
|
|
|
- </form>
|
|
|
+ <div>
|
|
|
+ <label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1.5">
|
|
|
+ @lang('rewardpoints::rewardpoints.admin.reason')
|
|
|
+ </label>
|
|
|
+ <input
|
|
|
+ type="text"
|
|
|
+ name="reason"
|
|
|
+ class="flex w-full min-h-[39px] py-2 px-3 border border-gray-300 dark:border-gray-800 rounded-md text-sm text-gray-600 dark:text-gray-300 transition-all hover:border-gray-400 dark:hover:border-gray-400 focus:border-gray-400 dark:focus:border-gray-400"
|
|
|
+ >
|
|
|
</div>
|
|
|
- </accordian>
|
|
|
- </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <button type="submit" class="secondary-button" style="background-color: #ef4444; color: white;">
|
|
|
+ <span class="icon-minus text-lg"></span>
|
|
|
+ @lang('rewardpoints::rewardpoints.admin.deduct-points')
|
|
|
+ </button>
|
|
|
+ </form>
|
|
|
</div>
|
|
|
-@endsection
|
|
|
+</x-admin::layouts>
|