bianjunhui 6 روز پیش
والد
کامیت
970bc4d424

+ 5 - 0
packages/Longyi/Gift/src/Listeners/ApplepayBreakdownHandler.php

@@ -20,5 +20,10 @@ class ApplepayBreakdownHandler
         if (! empty($order->giftcard_amount)) {
             $event->breakdown->addDiscount((float) $order->giftcard_amount);
         }
+
+        // 积分抵扣金额 -> discount(正数递减总额)
+        if (! empty($order->reward_points_amount)) {
+            $event->breakdown->addDiscount((float) $order->reward_points_amount);
+        }
     }
 }

+ 6 - 2
packages/Longyi/Gift/src/Repositories/CustomInvoiceRepository.php

@@ -19,6 +19,7 @@ class CustomInvoiceRepository extends BaseInvoiceRepository
         $invoice->vip_plus_amount = $invoice->base_vip_plus_amount = 0;
         $invoice->vip_discount_amount = $invoice->base_vip_discount_amount = 0;
         $invoice->shipping_insurance_amount = $invoice->base_shipping_insurance_amount = 0;
+        $invoice->reward_points_amount = $invoice->base_reward_points_amount = 0;
 
         foreach ($invoice->items as $item) {
             $invoice->tax_amount += $item->tax_amount;
@@ -55,6 +56,9 @@ class CustomInvoiceRepository extends BaseInvoiceRepository
         $invoice->shipping_insurance_amount += $invoice->order->shipping_insurance_amount;
         $invoice->base_shipping_insurance_amount += $invoice->order->base_shipping_insurance_amount;
 
+        $invoice->reward_points_amount += $invoice->order->reward_points_amount;
+        $invoice->base_reward_points_amount += $invoice->order->base_reward_points_amount;
+
         if ($invoice->order->shipping_tax_amount) {
             $invoice->shipping_tax_amount = $invoice->order->shipping_tax_amount;
 
@@ -89,8 +93,8 @@ class CustomInvoiceRepository extends BaseInvoiceRepository
             }
         }
 
-        $invoice->grand_total = $invoice->sub_total + $invoice->tax_amount + $invoice->shipping_amount - $invoice->discount_amount - $invoice->giftcard_amount + $invoice->vip_plus_amount - $invoice->vip_discount_amount + $invoice->shipping_insurance_amount;
-        $invoice->base_grand_total = $invoice->base_sub_total + $invoice->base_tax_amount + $invoice->base_shipping_amount - $invoice->base_discount_amount - $invoice->base_giftcard_amount + $invoice->base_vip_plus_amount - $invoice->base_vip_discount_amount + $invoice->base_shipping_insurance_amount;
+        $invoice->grand_total = $invoice->sub_total + $invoice->tax_amount + $invoice->shipping_amount - $invoice->discount_amount - $invoice->giftcard_amount + $invoice->vip_plus_amount - $invoice->vip_discount_amount + $invoice->shipping_insurance_amount - $invoice->reward_points_amount;
+        $invoice->base_grand_total = $invoice->base_sub_total + $invoice->base_tax_amount + $invoice->base_shipping_amount - $invoice->base_discount_amount - $invoice->base_giftcard_amount + $invoice->base_vip_plus_amount - $invoice->base_vip_discount_amount + $invoice->base_shipping_insurance_amount - $invoice->base_reward_points_amount;
 
         $invoice->save();
         return $invoice;

+ 6 - 2
packages/Longyi/Gift/src/Repositories/CustomOrderRepository.php

@@ -17,6 +17,7 @@ class CustomOrderRepository extends BaseOrderRepository
         $order->vip_plus_invoiced = $order->base_vip_plus_invoiced = 0;
         $order->vip_discount_invoiced = $order->base_vip_discount_invoiced = 0;
         $order->shipping_insurance_invoiced = $order->base_shipping_insurance_invoiced = 0;
+        $order->reward_points_invoiced = $order->base_reward_points_invoiced = 0;
 
         foreach ($order->invoices as $invoice) {
             $order->sub_total_invoiced += $invoice->sub_total;
@@ -42,10 +43,13 @@ class CustomOrderRepository extends BaseOrderRepository
 
             $order->shipping_insurance_invoiced += $invoice->shipping_insurance_amount;
             $order->base_shipping_insurance_invoiced += $invoice->base_shipping_insurance_amount;
+
+            $order->reward_points_invoiced += $invoice->reward_points_amount;
+            $order->base_reward_points_invoiced += $invoice->base_reward_points_amount;
         }
 
-        $order->grand_total_invoiced = $order->sub_total_invoiced + $order->shipping_invoiced + $order->tax_amount_invoiced - $order->discount_invoiced - $order->giftcard_invoiced + $order->vip_plus_invoiced - $order->vip_discount_invoiced + $order->shipping_insurance_invoiced;
-        $order->base_grand_total_invoiced = $order->base_sub_total_invoiced + $order->base_shipping_invoiced + $order->base_tax_amount_invoiced - $order->base_discount_invoiced - $order->base_giftcard_invoiced + $order->base_vip_plus_invoiced - $order->base_vip_discount_invoiced + $order->base_shipping_insurance_invoiced;
+        $order->grand_total_invoiced = $order->sub_total_invoiced + $order->shipping_invoiced + $order->tax_amount_invoiced - $order->discount_invoiced - $order->giftcard_invoiced + $order->vip_plus_invoiced - $order->vip_discount_invoiced + $order->shipping_insurance_invoiced - $order->reward_points_invoiced;
+        $order->base_grand_total_invoiced = $order->base_sub_total_invoiced + $order->base_shipping_invoiced + $order->base_tax_amount_invoiced - $order->base_discount_invoiced - $order->base_giftcard_invoiced + $order->base_vip_plus_invoiced - $order->base_vip_discount_invoiced + $order->base_shipping_insurance_invoiced - $order->base_reward_points_invoiced;
 
         // order refund total
         $order->sub_total_refunded = $order->base_sub_total_refunded = 0;

+ 40 - 0
packages/Longyi/RewardPoints/src/Database/Migrations/2026_08_21_000001_add_reward_points_fields_to_orders_table.php

@@ -0,0 +1,40 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    /**
+     * Run the migrations.
+     */
+    public function up(): void
+    {
+        if (! Schema::hasColumn('orders', 'reward_points_used')) {
+            Schema::table('orders', function (Blueprint $table) {
+                $table->integer('reward_points_used')->default(0)->after('base_vip_discount_amount')->comment('下单使用的积分数');
+                $table->decimal('reward_points_amount', 12, 4)->default(0)->after('reward_points_used')->comment('积分抵扣金额');
+                $table->decimal('base_reward_points_amount', 12, 4)->default(0)->after('reward_points_amount')->comment('基础币种积分抵扣金额');
+                $table->integer('reward_points_earned')->default(0)->after('base_reward_points_amount')->comment('下单赚取的积分数');
+            });
+        }
+    }
+
+    /**
+     * Reverse the migrations.
+     */
+    public function down(): void
+    {
+        if (Schema::hasColumn('orders', 'reward_points_used')) {
+            Schema::table('orders', function (Blueprint $table) {
+                $table->dropColumn([
+                    'reward_points_used',
+                    'reward_points_amount',
+                    'base_reward_points_amount',
+                    'reward_points_earned',
+                ]);
+            });
+        }
+    }
+};

+ 54 - 0
packages/Longyi/RewardPoints/src/Database/Migrations/2026_08_21_000002_add_reward_points_invoiced_fields.php

@@ -0,0 +1,54 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    /**
+     * Run the migrations.
+     */
+    public function up(): void
+    {
+        // 订单表:积分抵扣已开票金额
+        if (! Schema::hasColumn('orders', 'reward_points_invoiced')) {
+            Schema::table('orders', function (Blueprint $table) {
+                $table->decimal('reward_points_invoiced', 12, 4)->default(0)->after('base_reward_points_amount')->comment('积分抵扣已开票金额');
+                $table->decimal('base_reward_points_invoiced', 12, 4)->default(0)->after('reward_points_invoiced')->comment('基础币种积分抵扣已开票金额');
+            });
+        }
+
+        // 发票表:单张发票的积分抵扣金额
+        if (! Schema::hasColumn('invoices', 'reward_points_amount')) {
+            Schema::table('invoices', function (Blueprint $table) {
+                $table->decimal('reward_points_amount', 12, 4)->default(0)->after('base_shipping_insurance_amount')->comment('积分抵扣金额');
+                $table->decimal('base_reward_points_amount', 12, 4)->default(0)->after('reward_points_amount')->comment('基础币种积分抵扣金额');
+            });
+        }
+    }
+
+    /**
+     * Reverse the migrations.
+     */
+    public function down(): void
+    {
+        if (Schema::hasColumn('orders', 'reward_points_invoiced')) {
+            Schema::table('orders', function (Blueprint $table) {
+                $table->dropColumn([
+                    'reward_points_invoiced',
+                    'base_reward_points_invoiced',
+                ]);
+            });
+        }
+
+        if (Schema::hasColumn('invoices', 'reward_points_amount')) {
+            Schema::table('invoices', function (Blueprint $table) {
+                $table->dropColumn([
+                    'reward_points_amount',
+                    'base_reward_points_amount',
+                ]);
+            });
+        }
+    }
+};

+ 4 - 0
packages/Longyi/RewardPoints/src/Listeners/OrderEvents.php

@@ -72,6 +72,10 @@ class OrderEvents
                 $rule
             );
 
+            // 将赚取的积分写回订单表
+            $order->reward_points_earned = $points;
+            $order->save();
+
             Log::info('Order points added as PENDING', [
                 'order_id' => $order->id,
                 'customer_id' => $order->customer_id,

+ 2 - 0
packages/Longyi/RewardPoints/src/Resources/lang/en/rewardpoints.php

@@ -1,6 +1,8 @@
 <?php
 
 return [
+    'reward-points-amount' => 'Reward Points Amount',
+
     'customer' => [
         'my-reward-points' => 'My Reward Points',
         'available-points' => 'Available Points',

+ 2 - 0
packages/Longyi/RewardPoints/src/Resources/lang/zh_CN/rewardpoints.php

@@ -1,6 +1,8 @@
 <?php
 
 return [
+    'reward-points-amount' => '积分抵扣金额',
+
     'customer' => [
         'my-reward-points' => '我的积分',
         'available-points' => '可用积分',

+ 6 - 0
packages/Webkul/BagistoApi/src/Models/CustomerOrder.php

@@ -130,6 +130,12 @@ class CustomerOrder extends Model
         'customer_id'                   => 'int',
         'channel_id'                    => 'int',
         'applied_cart_rule_ids'         => 'string',
+        'reward_points_used'            => 'int',
+        'reward_points_amount'          => 'float',
+        'base_reward_points_amount'     => 'float',
+        'reward_points_earned'          => 'int',
+        'reward_points_invoiced'        => 'float',
+        'base_reward_points_invoiced'   => 'float',
         'created_at'                    => 'datetime',
         'updated_at'                    => 'datetime',
     ];

+ 5 - 0
packages/Webkul/BagistoApi/src/Transformers/ExpressOrderResource.php

@@ -73,6 +73,11 @@ class ExpressOrderResource extends JsonResource
                 'shipping_insurance_amount'      => $this->shipping_insurance_amount,
                 'base_shipping_insurance_amount' => $this->base_shipping_insurance_amount,
             ]),
+            $this->mergeWhen($this->reward_points_used && $this->reward_points_used > 0, [
+                'reward_points_used'             => $this->reward_points_used,
+                'reward_points_amount'           => $this->reward_points_amount,
+                'base_reward_points_amount'      => $this->base_reward_points_amount,
+            ]),
             'billing_address'          => $billing,
             'shipping_address'         => $shipping,
             'payment'                  => (new OrderPaymentResource($this->payment))->jsonSerialize(),

+ 4 - 1
packages/Webkul/Checkout/src/Models/Cart.php

@@ -38,7 +38,10 @@ class Cart extends Model implements CartContract
      * @var array
      */
     protected $casts = [
-        'additional' => 'json',
+        'additional'                => 'json',
+        'reward_points_used'        => 'integer',
+        'reward_points_amount'      => 'float',
+        'base_reward_points_amount' => 'float',
     ];
 
     /**

+ 11 - 0
packages/Webkul/Sales/src/Repositories/RefundRepository.php

@@ -231,6 +231,9 @@ class RefundRepository extends Repository
         $vipDiscountAmount = round($order->vip_discount_amount * $subtotalRatio, 2);
         $baseVipDiscountAmount = round($order->base_vip_discount_amount * $subtotalRatio, 2);
 
+        $rewardPointsAmount = round($order->reward_points_amount * $subtotalRatio, 2);
+        $baseRewardPointsAmount = round($order->base_reward_points_amount * $subtotalRatio, 2);
+
         $refund->grand_total = $refund->sub_total
             + $refund->tax_amount
             + $refund->shipping_amount
@@ -238,6 +241,7 @@ class RefundRepository extends Repository
             - $giftcardAmount
             + $vipPlusAmount
             - $vipDiscountAmount
+            - $rewardPointsAmount
             + $refund->adjustment_refund
             - $refund->adjustment_fee
             - $refund->discount_amount;
@@ -249,6 +253,7 @@ class RefundRepository extends Repository
             - $baseGiftcardAmount
             + $baseVipPlusAmount
             - $baseVipDiscountAmount
+            - $baseRewardPointsAmount
             + $refund->base_adjustment_refund
             - $refund->base_adjustment_fee
             - $refund->base_discount_amount;
@@ -329,6 +334,11 @@ class RefundRepository extends Repository
             'label'      => trans('member::app.member.vip_discount'),
         ];
 
+        $totals['reward_points'] = [
+            'price'      => round($order->base_reward_points_amount * $subtotalRatio, 2),
+            'label'      => trans('rewardpoints::rewardpoints.reward-points-amount'),
+        ];
+
         $totals['grand_total']['price'] += $totals['subtotal']['price']
             + $totals['tax']['price']
             + $totals['shipping']['price']
@@ -336,6 +346,7 @@ class RefundRepository extends Repository
             - $totals['giftcard']['price']
             + $totals['vip_plus']['price']
             - $totals['vip_discount']['price']
+            - $totals['reward_points']['price']
             + $data['adjustment_refund']
             - $data['adjustment_fee']
             - $totals['discount']['price'];

+ 5 - 0
packages/Webkul/Sales/src/Transformers/OrderResource.php

@@ -90,6 +90,11 @@ class OrderResource extends JsonResource
                 'shipping_insurance_amount'      => $this->shipping_insurance_amount,
                 'base_shipping_insurance_amount' => $this->base_shipping_insurance_amount,
             ]),
+            $this->mergeWhen($this->reward_points_used && $this->reward_points_used > 0, [
+                'reward_points_used'             => $this->reward_points_used,
+                'reward_points_amount'           => $this->reward_points_amount,
+                'base_reward_points_amount'      => $this->base_reward_points_amount,
+            ]),
         ];
     }
 }