浏览代码

积分修复

bianjunhui 6 天之前
父节点
当前提交
64e0c1a0e6

+ 14 - 8
packages/Longyi/RewardPoints/src/Listeners/CustomerEvents.php

@@ -30,16 +30,22 @@ class CustomerEvents
         $pointsList = [];
 
         // 注册积分
-        $registrationPoints = $this->getRegistrationPoints($customer);
-        if ($registrationPoints > 0) {
-            $pointsList[] = $this->buildPointsItem($registrationPoints, RewardActiveRule::TYPE_REGISTRATION, 'Registration bonus');
+        $registrationRule = RewardActiveRule::active()->ofType(RewardActiveRule::TYPE_REGISTRATION)->first();
+        if ($registrationRule) {
+            $registrationPoints = $this->getPointsFromRuleOrConfig($registrationRule, 'rewardpoints.registration.points_per_registration', 100);
+            if ($registrationPoints > 0) {
+                $pointsList[] = $this->buildPointsItem($registrationPoints, RewardActiveRule::TYPE_REGISTRATION, 'Registration bonus', $registrationRule);
+            }
         }
 
         // 订阅积分(仅当用户订阅了新闻通讯)
         if ($this->isSubscribedToNewsletter($customer)) {
-            $subscribePoints = $this->getSubscribePoints($customer);
-            if ($subscribePoints > 0) {
-                $pointsList[] = $this->buildPointsItem($subscribePoints, RewardActiveRule::TYPE_SUBSCRIBE, 'Newsletter subscription bonus');
+            $subscribeRule = RewardActiveRule::active()->ofType(RewardActiveRule::TYPE_SUBSCRIBE)->first();
+            if ($subscribeRule) {
+                $subscribePoints = $this->getPointsFromRuleOrConfig($subscribeRule, 'rewardpoints.newsletter_subscribe.points_per_subscription', 200);
+                if ($subscribePoints > 0) {
+                    $pointsList[] = $this->buildPointsItem($subscribePoints, RewardActiveRule::TYPE_SUBSCRIBE, 'Newsletter subscription bonus', $subscribeRule);
+                }
             }
         }
 
@@ -192,13 +198,13 @@ class CustomerEvents
     /**
      * 构建积分项
      */
-    protected function buildPointsItem(int $amount, int $type, string $detail): array
+    protected function buildPointsItem(int $amount, int $type, string $detail, ?RewardActiveRule $rule = null): array
     {
         return [
             'amount' => $amount,
             'type' => $type,
             'detail' => $detail,
-            'rule' => null,
+            'rule' => $rule,
         ];
     }
 

+ 44 - 20
packages/Longyi/RewardPoints/src/Listeners/ReviewEvents.php

@@ -6,6 +6,7 @@ use Longyi\RewardPoints\Repositories\RewardPointRepository;
 use Longyi\RewardPoints\Models\RewardActiveRule;
 use Webkul\Customer\Models\Customer;
 use Illuminate\Support\Facades\Log;
+use Carbon\Carbon;
 
 class ReviewEvents
 {
@@ -32,19 +33,19 @@ class ReviewEvents
         // 获取客户信息
         $customer = $this->getCustomer($review->customer_id);
         if (!$customer) {
-            Log::warning('Customer not found for review points', [
-                'review_id' => $review->id,
-                'customer_id' => $review->customer_id
-            ]);
+            // Log::warning('Customer not found for review points', [
+            //     'review_id' => $review->id,
+            //     'customer_id' => $review->customer_id
+            // ]);
             return;
         }
 
         // 【简化】只需要调用 isApplicableToCustomer,它会内部处理所有适用性检查
         if (!$rule->isApplicableToCustomer($customer)) {
-            Log::info('Review rule not applicable', [
-                'review_id' => $review->id,
-                'customer_id' => $customer->id,
-            ]);
+            // Log::info('Review rule not applicable', [
+            //     'review_id' => $review->id,
+            //     'customer_id' => $customer->id,
+            // ]);
             return;
         }
 
@@ -52,19 +53,28 @@ class ReviewEvents
         $points = $rule->getPointsForCustomer($customer);
 
         if ($points <= 0) {
-            Log::info('Review points is 0, skipping', [
-                'review_id' => $review->id,
-                'points' => $points
-            ]);
+            // Log::info('Review points is 0, skipping', [
+            //     'review_id' => $review->id,
+            //     'points' => $points
+            // ]);
             return;
         }
 
         // 检查是否已经为该评价发放过积分
         if ($this->hasReceivedReviewPoints($review->id, $customer->id)) {
-            Log::info('Review points already granted', [
+            /*Log::info('Review points already granted', [
                 'review_id' => $review->id,
                 'customer_id' => $customer->id
-            ]);
+            ]);*/
+            return;
+        }
+
+        // 检查今日是否已获得评价积分(一个用户一天只发放一次)
+        if ($this->hasReceivedReviewPointsToday($customer->id)) {
+            /*Log::info('Customer already received review points today', [
+                'review_id' => $review->id,
+                'customer_id' => $customer->id
+            ]);*/
             return;
         }
 
@@ -78,11 +88,11 @@ class ReviewEvents
             $rule
         );
 
-        Log::info('Review points added', [
+        /*Log::info('Review points added', [
             'review_id' => $review->id,
             'customer_id' => $customer->id,
             'points' => $points
-        ]);
+        ]);*/
     }
 
     /**
@@ -95,9 +105,9 @@ class ReviewEvents
         }
 
         if (empty($review->customer_id)) {
-            Log::info('Review has no customer_id', [
-                'review_id' => $review->id ?? null
-            ]);
+            // Log::info('Review has no customer_id', [
+            //     'review_id' => $review->id ?? null
+            // ]);
             return false;
         }
 
@@ -130,7 +140,21 @@ class ReviewEvents
         // 通过备注字段判断(需要存储评价ID)
         return \Longyi\RewardPoints\Models\RewardPointHistory::where('customer_id', $customerId)
             ->where('type_of_transaction', RewardActiveRule::TYPE_REVIEW)
-            ->where('description', 'LIKE', "%Review ID: {$reviewId}%")
+            ->where('transaction_detail', 'LIKE', "%Review ID: {$reviewId}%")
+            ->exists();
+    }
+
+    /**
+     * 检查今日是否已获得评价积分
+     */
+    protected function hasReceivedReviewPointsToday(int $customerId): bool
+    {
+        $today = Carbon::now()->format('Y-m-d');
+
+        return \Longyi\RewardPoints\Models\RewardPointHistory::where('customer_id', $customerId)
+            ->where('type_of_transaction', RewardActiveRule::TYPE_REVIEW)
+            ->whereDate('transaction_time', $today)
+            ->where('status', \Longyi\RewardPoints\Models\RewardPointHistory::STATUS_COMPLETED)
             ->exists();
     }
 

+ 1 - 1
packages/Longyi/RewardPoints/src/Resources/views/admin/transactions/index.blade.php

@@ -311,7 +311,7 @@
         {{-- 分页 --}}
         @if($transactions->hasPages())
             <div class="p-4 border-t border-gray-200 dark:border-gray-800">
-                {{ $transactions->links() }}
+                {{ $transactions->appends(request()->query())->links() }}
             </div>
         @endif
     </div>

+ 6 - 3
packages/Webkul/BagistoApi/src/State/ProductReviewProcessor.php

@@ -88,6 +88,9 @@ class ProductReviewProcessor implements ProcessorInterface
 
         $review->save();
 
+        // 触发评价创建事件(用于积分系统等)
+        event('customer.review.create.after', $review);
+
         $attachments = [];
 
         if (! empty($data->attachments) && $review?->id) {
@@ -206,7 +209,7 @@ class ProductReviewProcessor implements ProcessorInterface
                 case 'product_id':
                 case 'rating':
                     $output->$key = (int)$value;
-                    
+
                     break;
 
                 case 'title':
@@ -224,7 +227,7 @@ class ProductReviewProcessor implements ProcessorInterface
                     if ($value instanceof \DateTime) {
                         $output->$key = $value->format('Y-m-d H:i:s');
                     } else {
-                        $output->$key = $value; 
+                        $output->$key = $value;
                     }
                     break;
                 default:
@@ -232,7 +235,7 @@ class ProductReviewProcessor implements ProcessorInterface
                     break;
             }
         }
- 
+
         return $output;
     }