ソースを参照

用户列表添加用用户plus字段

llp 1 週間 前
コミット
96dba85098

+ 94 - 92
bootstrap/cache/services.php

@@ -56,52 +56,53 @@
     52 => 'Longyi\\Blog\\Providers\\BlogServiceProvider',
     53 => 'Longyi\\Core\\Providers\\LongyiCoreServiceProvider',
     54 => 'Longyi\\DynamicMenu\\Providers\\DynamicMenuServiceProvider',
-    55 => 'Longyi\\Email\\Providers\\EmailServiceProvider',
-    56 => 'Longyi\\ImageUpload\\Providers\\ImageUploadServiceProvider',
-    57 => 'Longyi\\RewardPoints\\Providers\\RewardPointsServiceProvider',
-    58 => 'Longyi\\Member\\Providers\\MemberServiceProvider',
-    59 => 'Longyi\\Gift\\Providers\\GiftServiceProvider',
-    60 => 'Longyi\\ShippingInsurance\\Providers\\ShippingInsuranceServiceProvider',
-    61 => 'Longyi\\Pay\\AwxAfterpay\\Providers\\AwxAfterpayServiceProvider',
-    62 => 'Longyi\\Pay\\AwxKlarna\\Providers\\AwxKlarnaServiceProvider',
-    63 => 'Longyi\\Pay\\Applepay\\Providers\\ApplepayServiceProvider',
-    64 => 'Longyi\\Pay\\Airwallex\\Providers\\AirwallexServiceProvider',
-    65 => 'Longyi\\Pay\\Afterpay\\Providers\\AfterpayServiceProvider',
-    66 => 'Longyi\\Pay\\Klarna\\Providers\\KlarnaServiceProvider',
-    67 => 'Webkul\\Attribute\\Providers\\AttributeServiceProvider',
-    68 => 'Webkul\\BookingProduct\\Providers\\BookingProductServiceProvider',
-    69 => 'Webkul\\CMS\\Providers\\CMSServiceProvider',
-    70 => 'Webkul\\CartRule\\Providers\\CartRuleServiceProvider',
-    71 => 'Webkul\\CatalogRule\\Providers\\CatalogRuleServiceProvider',
-    72 => 'Webkul\\Category\\Providers\\CategoryServiceProvider',
-    73 => 'Webkul\\Checkout\\Providers\\CheckoutServiceProvider',
-    74 => 'Webkul\\Core\\Providers\\CoreServiceProvider',
-    75 => 'Webkul\\Core\\Providers\\EnvValidatorServiceProvider',
-    76 => 'Webkul\\Customer\\Providers\\CustomerServiceProvider',
-    77 => 'Webkul\\DataGrid\\Providers\\DataGridServiceProvider',
-    78 => 'Webkul\\DataTransfer\\Providers\\DataTransferServiceProvider',
-    79 => 'Webkul\\DebugBar\\Providers\\DebugBarServiceProvider',
-    80 => 'Webkul\\FPC\\Providers\\FPCServiceProvider',
-    81 => 'Webkul\\GDPR\\Providers\\GDPRServiceProvider',
-    82 => 'Webkul\\Installer\\Providers\\InstallerServiceProvider',
-    83 => 'Webkul\\Inventory\\Providers\\InventoryServiceProvider',
-    84 => 'Webkul\\MagicAI\\Providers\\MagicAIServiceProvider',
-    85 => 'Webkul\\Marketing\\Providers\\MarketingServiceProvider',
-    86 => 'Webkul\\Notification\\Providers\\NotificationServiceProvider',
-    87 => 'Webkul\\Payment\\Providers\\PaymentServiceProvider',
-    88 => 'Webkul\\Paypal\\Providers\\PaypalServiceProvider',
-    89 => 'Webkul\\Product\\Providers\\ProductServiceProvider',
-    90 => 'Webkul\\Rule\\Providers\\RuleServiceProvider',
-    91 => 'Webkul\\Sales\\Providers\\SalesServiceProvider',
-    92 => 'Webkul\\Shipping\\Providers\\ShippingServiceProvider',
-    93 => 'Webkul\\Shop\\Providers\\ShopServiceProvider',
-    94 => 'Webkul\\Sitemap\\Providers\\SitemapServiceProvider',
-    95 => 'Webkul\\SocialLogin\\Providers\\SocialLoginServiceProvider',
-    96 => 'Webkul\\SocialShare\\Providers\\SocialShareServiceProvider',
-    97 => 'Webkul\\Tax\\Providers\\TaxServiceProvider',
-    98 => 'Webkul\\Theme\\Providers\\ThemeServiceProvider',
-    99 => 'Webkul\\User\\Providers\\UserServiceProvider',
-    100 => 'Webkul\\BagistoApi\\Providers\\BagistoApiServiceProvider',
+    55 => 'Longyi\\FrontMenu\\Providers\\FrontMenuServiceProvider',
+    56 => 'Longyi\\Email\\Providers\\EmailServiceProvider',
+    57 => 'Longyi\\ImageUpload\\Providers\\ImageUploadServiceProvider',
+    58 => 'Longyi\\RewardPoints\\Providers\\RewardPointsServiceProvider',
+    59 => 'Longyi\\Member\\Providers\\MemberServiceProvider',
+    60 => 'Longyi\\Gift\\Providers\\GiftServiceProvider',
+    61 => 'Longyi\\ShippingInsurance\\Providers\\ShippingInsuranceServiceProvider',
+    62 => 'Longyi\\Pay\\AwxAfterpay\\Providers\\AwxAfterpayServiceProvider',
+    63 => 'Longyi\\Pay\\AwxKlarna\\Providers\\AwxKlarnaServiceProvider',
+    64 => 'Longyi\\Pay\\Applepay\\Providers\\ApplepayServiceProvider',
+    65 => 'Longyi\\Pay\\Airwallex\\Providers\\AirwallexServiceProvider',
+    66 => 'Longyi\\Pay\\Afterpay\\Providers\\AfterpayServiceProvider',
+    67 => 'Longyi\\Pay\\Klarna\\Providers\\KlarnaServiceProvider',
+    68 => 'Webkul\\Attribute\\Providers\\AttributeServiceProvider',
+    69 => 'Webkul\\BookingProduct\\Providers\\BookingProductServiceProvider',
+    70 => 'Webkul\\CMS\\Providers\\CMSServiceProvider',
+    71 => 'Webkul\\CartRule\\Providers\\CartRuleServiceProvider',
+    72 => 'Webkul\\CatalogRule\\Providers\\CatalogRuleServiceProvider',
+    73 => 'Webkul\\Category\\Providers\\CategoryServiceProvider',
+    74 => 'Webkul\\Checkout\\Providers\\CheckoutServiceProvider',
+    75 => 'Webkul\\Core\\Providers\\CoreServiceProvider',
+    76 => 'Webkul\\Core\\Providers\\EnvValidatorServiceProvider',
+    77 => 'Webkul\\Customer\\Providers\\CustomerServiceProvider',
+    78 => 'Webkul\\DataGrid\\Providers\\DataGridServiceProvider',
+    79 => 'Webkul\\DataTransfer\\Providers\\DataTransferServiceProvider',
+    80 => 'Webkul\\DebugBar\\Providers\\DebugBarServiceProvider',
+    81 => 'Webkul\\FPC\\Providers\\FPCServiceProvider',
+    82 => 'Webkul\\GDPR\\Providers\\GDPRServiceProvider',
+    83 => 'Webkul\\Installer\\Providers\\InstallerServiceProvider',
+    84 => 'Webkul\\Inventory\\Providers\\InventoryServiceProvider',
+    85 => 'Webkul\\MagicAI\\Providers\\MagicAIServiceProvider',
+    86 => 'Webkul\\Marketing\\Providers\\MarketingServiceProvider',
+    87 => 'Webkul\\Notification\\Providers\\NotificationServiceProvider',
+    88 => 'Webkul\\Payment\\Providers\\PaymentServiceProvider',
+    89 => 'Webkul\\Paypal\\Providers\\PaypalServiceProvider',
+    90 => 'Webkul\\Product\\Providers\\ProductServiceProvider',
+    91 => 'Webkul\\Rule\\Providers\\RuleServiceProvider',
+    92 => 'Webkul\\Sales\\Providers\\SalesServiceProvider',
+    93 => 'Webkul\\Shipping\\Providers\\ShippingServiceProvider',
+    94 => 'Webkul\\Shop\\Providers\\ShopServiceProvider',
+    95 => 'Webkul\\Sitemap\\Providers\\SitemapServiceProvider',
+    96 => 'Webkul\\SocialLogin\\Providers\\SocialLoginServiceProvider',
+    97 => 'Webkul\\SocialShare\\Providers\\SocialShareServiceProvider',
+    98 => 'Webkul\\Tax\\Providers\\TaxServiceProvider',
+    99 => 'Webkul\\Theme\\Providers\\ThemeServiceProvider',
+    100 => 'Webkul\\User\\Providers\\UserServiceProvider',
+    101 => 'Webkul\\BagistoApi\\Providers\\BagistoApiServiceProvider',
   ),
   'eager' => 
   array (
@@ -143,52 +144,53 @@
     35 => 'Longyi\\Blog\\Providers\\BlogServiceProvider',
     36 => 'Longyi\\Core\\Providers\\LongyiCoreServiceProvider',
     37 => 'Longyi\\DynamicMenu\\Providers\\DynamicMenuServiceProvider',
-    38 => 'Longyi\\Email\\Providers\\EmailServiceProvider',
-    39 => 'Longyi\\ImageUpload\\Providers\\ImageUploadServiceProvider',
-    40 => 'Longyi\\RewardPoints\\Providers\\RewardPointsServiceProvider',
-    41 => 'Longyi\\Member\\Providers\\MemberServiceProvider',
-    42 => 'Longyi\\Gift\\Providers\\GiftServiceProvider',
-    43 => 'Longyi\\ShippingInsurance\\Providers\\ShippingInsuranceServiceProvider',
-    44 => 'Longyi\\Pay\\AwxAfterpay\\Providers\\AwxAfterpayServiceProvider',
-    45 => 'Longyi\\Pay\\AwxKlarna\\Providers\\AwxKlarnaServiceProvider',
-    46 => 'Longyi\\Pay\\Applepay\\Providers\\ApplepayServiceProvider',
-    47 => 'Longyi\\Pay\\Airwallex\\Providers\\AirwallexServiceProvider',
-    48 => 'Longyi\\Pay\\Afterpay\\Providers\\AfterpayServiceProvider',
-    49 => 'Longyi\\Pay\\Klarna\\Providers\\KlarnaServiceProvider',
-    50 => 'Webkul\\Attribute\\Providers\\AttributeServiceProvider',
-    51 => 'Webkul\\BookingProduct\\Providers\\BookingProductServiceProvider',
-    52 => 'Webkul\\CMS\\Providers\\CMSServiceProvider',
-    53 => 'Webkul\\CartRule\\Providers\\CartRuleServiceProvider',
-    54 => 'Webkul\\CatalogRule\\Providers\\CatalogRuleServiceProvider',
-    55 => 'Webkul\\Category\\Providers\\CategoryServiceProvider',
-    56 => 'Webkul\\Checkout\\Providers\\CheckoutServiceProvider',
-    57 => 'Webkul\\Core\\Providers\\CoreServiceProvider',
-    58 => 'Webkul\\Core\\Providers\\EnvValidatorServiceProvider',
-    59 => 'Webkul\\Customer\\Providers\\CustomerServiceProvider',
-    60 => 'Webkul\\DataGrid\\Providers\\DataGridServiceProvider',
-    61 => 'Webkul\\DataTransfer\\Providers\\DataTransferServiceProvider',
-    62 => 'Webkul\\DebugBar\\Providers\\DebugBarServiceProvider',
-    63 => 'Webkul\\FPC\\Providers\\FPCServiceProvider',
-    64 => 'Webkul\\GDPR\\Providers\\GDPRServiceProvider',
-    65 => 'Webkul\\Installer\\Providers\\InstallerServiceProvider',
-    66 => 'Webkul\\Inventory\\Providers\\InventoryServiceProvider',
-    67 => 'Webkul\\MagicAI\\Providers\\MagicAIServiceProvider',
-    68 => 'Webkul\\Marketing\\Providers\\MarketingServiceProvider',
-    69 => 'Webkul\\Notification\\Providers\\NotificationServiceProvider',
-    70 => 'Webkul\\Payment\\Providers\\PaymentServiceProvider',
-    71 => 'Webkul\\Paypal\\Providers\\PaypalServiceProvider',
-    72 => 'Webkul\\Product\\Providers\\ProductServiceProvider',
-    73 => 'Webkul\\Rule\\Providers\\RuleServiceProvider',
-    74 => 'Webkul\\Sales\\Providers\\SalesServiceProvider',
-    75 => 'Webkul\\Shipping\\Providers\\ShippingServiceProvider',
-    76 => 'Webkul\\Shop\\Providers\\ShopServiceProvider',
-    77 => 'Webkul\\Sitemap\\Providers\\SitemapServiceProvider',
-    78 => 'Webkul\\SocialLogin\\Providers\\SocialLoginServiceProvider',
-    79 => 'Webkul\\SocialShare\\Providers\\SocialShareServiceProvider',
-    80 => 'Webkul\\Tax\\Providers\\TaxServiceProvider',
-    81 => 'Webkul\\Theme\\Providers\\ThemeServiceProvider',
-    82 => 'Webkul\\User\\Providers\\UserServiceProvider',
-    83 => 'Webkul\\BagistoApi\\Providers\\BagistoApiServiceProvider',
+    38 => 'Longyi\\FrontMenu\\Providers\\FrontMenuServiceProvider',
+    39 => 'Longyi\\Email\\Providers\\EmailServiceProvider',
+    40 => 'Longyi\\ImageUpload\\Providers\\ImageUploadServiceProvider',
+    41 => 'Longyi\\RewardPoints\\Providers\\RewardPointsServiceProvider',
+    42 => 'Longyi\\Member\\Providers\\MemberServiceProvider',
+    43 => 'Longyi\\Gift\\Providers\\GiftServiceProvider',
+    44 => 'Longyi\\ShippingInsurance\\Providers\\ShippingInsuranceServiceProvider',
+    45 => 'Longyi\\Pay\\AwxAfterpay\\Providers\\AwxAfterpayServiceProvider',
+    46 => 'Longyi\\Pay\\AwxKlarna\\Providers\\AwxKlarnaServiceProvider',
+    47 => 'Longyi\\Pay\\Applepay\\Providers\\ApplepayServiceProvider',
+    48 => 'Longyi\\Pay\\Airwallex\\Providers\\AirwallexServiceProvider',
+    49 => 'Longyi\\Pay\\Afterpay\\Providers\\AfterpayServiceProvider',
+    50 => 'Longyi\\Pay\\Klarna\\Providers\\KlarnaServiceProvider',
+    51 => 'Webkul\\Attribute\\Providers\\AttributeServiceProvider',
+    52 => 'Webkul\\BookingProduct\\Providers\\BookingProductServiceProvider',
+    53 => 'Webkul\\CMS\\Providers\\CMSServiceProvider',
+    54 => 'Webkul\\CartRule\\Providers\\CartRuleServiceProvider',
+    55 => 'Webkul\\CatalogRule\\Providers\\CatalogRuleServiceProvider',
+    56 => 'Webkul\\Category\\Providers\\CategoryServiceProvider',
+    57 => 'Webkul\\Checkout\\Providers\\CheckoutServiceProvider',
+    58 => 'Webkul\\Core\\Providers\\CoreServiceProvider',
+    59 => 'Webkul\\Core\\Providers\\EnvValidatorServiceProvider',
+    60 => 'Webkul\\Customer\\Providers\\CustomerServiceProvider',
+    61 => 'Webkul\\DataGrid\\Providers\\DataGridServiceProvider',
+    62 => 'Webkul\\DataTransfer\\Providers\\DataTransferServiceProvider',
+    63 => 'Webkul\\DebugBar\\Providers\\DebugBarServiceProvider',
+    64 => 'Webkul\\FPC\\Providers\\FPCServiceProvider',
+    65 => 'Webkul\\GDPR\\Providers\\GDPRServiceProvider',
+    66 => 'Webkul\\Installer\\Providers\\InstallerServiceProvider',
+    67 => 'Webkul\\Inventory\\Providers\\InventoryServiceProvider',
+    68 => 'Webkul\\MagicAI\\Providers\\MagicAIServiceProvider',
+    69 => 'Webkul\\Marketing\\Providers\\MarketingServiceProvider',
+    70 => 'Webkul\\Notification\\Providers\\NotificationServiceProvider',
+    71 => 'Webkul\\Payment\\Providers\\PaymentServiceProvider',
+    72 => 'Webkul\\Paypal\\Providers\\PaypalServiceProvider',
+    73 => 'Webkul\\Product\\Providers\\ProductServiceProvider',
+    74 => 'Webkul\\Rule\\Providers\\RuleServiceProvider',
+    75 => 'Webkul\\Sales\\Providers\\SalesServiceProvider',
+    76 => 'Webkul\\Shipping\\Providers\\ShippingServiceProvider',
+    77 => 'Webkul\\Shop\\Providers\\ShopServiceProvider',
+    78 => 'Webkul\\Sitemap\\Providers\\SitemapServiceProvider',
+    79 => 'Webkul\\SocialLogin\\Providers\\SocialLoginServiceProvider',
+    80 => 'Webkul\\SocialShare\\Providers\\SocialShareServiceProvider',
+    81 => 'Webkul\\Tax\\Providers\\TaxServiceProvider',
+    82 => 'Webkul\\Theme\\Providers\\ThemeServiceProvider',
+    83 => 'Webkul\\User\\Providers\\UserServiceProvider',
+    84 => 'Webkul\\BagistoApi\\Providers\\BagistoApiServiceProvider',
   ),
   'deferred' => 
   array (

+ 62 - 0
packages/Webkul/Admin/src/DataGrids/Customers/CustomerDataGrid.php

@@ -33,6 +33,9 @@ class CustomerDataGrid extends DataGrid
     {
         $tablePrefix = DB::getTablePrefix();
 
+        $vipCondition = $tablePrefix.'customers.vip_expire_date IS NOT NULL'
+            .' AND '.$tablePrefix."customers.vip_expire_date >= '".now()->toDateTimeString()."'";
+
         $queryBuilder = DB::table('customers')
             ->leftJoin('addresses', function ($join) {
                 $join->on('customers.id', '=', 'addresses.customer_id')
@@ -50,9 +53,11 @@ class CustomerDataGrid extends DataGrid
                 'customer_groups.name as group',
                 'customers.channel_id',
                 'customers.customer_source',
+                'customers.vip_expire_date',
             )
             ->addSelect(DB::raw('COUNT(DISTINCT '.$tablePrefix.'addresses.id) as address_count'))
             ->addSelect(DB::raw('COUNT(DISTINCT '.$tablePrefix.'orders.id) as order_count'))
+            ->addSelect(DB::raw('CASE WHEN '.$vipCondition.' THEN 1 ELSE 0 END as is_vip'))
             ->addSelect(DB::raw('CONCAT('.$tablePrefix.'customers.first_name, " ", '.$tablePrefix.'customers.last_name) as full_name'))
             ->groupBy('customers.id');
 
@@ -170,6 +175,26 @@ class CustomerDataGrid extends DataGrid
             'sortable' => true,
         ]);
 
+        $this->addColumn([
+            'index'              => 'is_vip',
+            'label'              => trans('admin::app.customers.customers.index.datagrid.vip'),
+            'type'               => 'boolean',
+            'filterable'         => true,
+            'filterable_type'    => 'dropdown',
+            'filterable_options' => [
+                [
+                    'label' => trans('admin::app.customers.customers.index.datagrid.vip-member'),
+                    'value' => 1,
+                ],
+                [
+                    'label' => trans('admin::app.customers.customers.index.datagrid.non-vip-member'),
+                    'value' => 0,
+                ],
+            ],
+            'sortable'   => true,
+            'exportable' => false,
+        ]);
+
         $this->addColumn([
             'index'       => 'revenue',
             'label'       => trans('admin::app.customers.customers.index.datagrid.revenue'),
@@ -257,4 +282,41 @@ class CustomerDataGrid extends DataGrid
             ]);
         }
     }
+
+    /**
+     * Process requested filters.
+     *
+     * The `is_vip` filter is handled here, because the plus membership status
+     * is calculated from the `vip_expire_date` value instead of a table column.
+     *
+     * @return void
+     */
+    protected function processRequestedFilters(array $requestedFilters)
+    {
+        if (array_key_exists('is_vip', $requestedFilters)) {
+            $requestedValues = is_array($requestedFilters['is_vip'])
+                ? $requestedFilters['is_vip']
+                : [$requestedFilters['is_vip']];
+
+            $this->queryBuilder->where(function ($query) use ($requestedValues) {
+                foreach ($requestedValues as $value) {
+                    $query->orWhere(function ($scopeQuery) use ($value) {
+                        if ((int) $value === 1) {
+                            $scopeQuery->whereNotNull('customers.vip_expire_date')
+                                ->where('customers.vip_expire_date', '>=', now());
+                        } else {
+                            $scopeQuery->where(function ($expiredQuery) {
+                                $expiredQuery->whereNull('customers.vip_expire_date')
+                                    ->orWhere('customers.vip_expire_date', '<', now());
+                            });
+                        }
+                    });
+                }
+            });
+
+            unset($requestedFilters['is_vip']);
+        }
+
+        parent::processRequestedFilters($requestedFilters);
+    }
 }

+ 4 - 0
packages/Webkul/Admin/src/Resources/lang/en/app.php

@@ -1820,6 +1820,7 @@ return [
                     'method-error'   => 'Error! Wrong method detected, please check mass action configuration',
                     'name'           => 'Customer Name',
                     'no-resource'    => 'The resource provided for insufficient for the action',
+                    'non-vip-member' => 'Non Member',
                     'order'          => ':order Order(s)',
                     'order-count'    => 'Order Count',
                     'order-pending'  => 'Customer have pending order',
@@ -1831,6 +1832,9 @@ return [
                     'suspended'      => 'Suspended',
                     'update-status'  => 'Update Status',
                     'update-success' => 'Selected Customers successfully updated',
+                    'vip'            => 'Plus Member',
+                    'vip-badge'      => 'PLUS Member',
+                    'vip-member'     => 'Plus Member',
                 ],
 
                 'create' => [

+ 4 - 0
packages/Webkul/Admin/src/Resources/lang/zh_CN/app.php

@@ -1700,6 +1700,7 @@ return [
                     'method-error'   => '错误!检测到错误的方法,请检查大规模操作配置',
                     'name'           => '客户姓名',
                     'no-resource'    => '提供的资源不足以执行操作',
+                    'non-vip-member' => '非会员',
                     'order'          => ':order 订单',
                     'order-count'    => '订单数量',
                     'order-pending'  => '客户有待处理订单',
@@ -1711,6 +1712,9 @@ return [
                     'suspended'      => '已暂停',
                     'update-status'  => '更新状态',
                     'update-success' => '成功更新所选客户',
+                    'vip'            => 'PLUS会员',
+                    'vip-badge'      => 'PLUS会员',
+                    'vip-member'     => 'PLUS会员',
                 ],
 
                 'create' => [

+ 7 - 0
packages/Webkul/Admin/src/Resources/views/customers/customers/index.blade.php

@@ -170,6 +170,13 @@
                             <p class="text-gray-600 dark:text-gray-300">
                                 @{{ record.phone ?? 'N/A' }}
                             </p>
+
+                            <span
+                                class="label-closed w-max"
+                                v-if="record.is_vip == 1"
+                            >
+                                @lang('admin::app.customers.customers.index.datagrid.vip-badge')
+                            </span>
                         </div>
                     </div>