From 73b874c72ad55eb9eef21c36160ac0de58f0189e Mon Sep 17 00:00:00 2001
From: quanwei <419654421@qq.com>
Date: Thu, 05 Feb 2026 10:30:43 +0800
Subject: [PATCH] 优化名片

---
 admin/app/api/service/order/settled/BranchActivitySettledService.php |  325 +++++++++++++++++++++++++++++++++++++----------------
 1 files changed, 226 insertions(+), 99 deletions(-)

diff --git a/admin/app/api/service/order/settled/BranchActivitySettledService.php b/admin/app/api/service/order/settled/BranchActivitySettledService.php
index e186a7f..e03aa2a 100644
--- a/admin/app/api/service/order/settled/BranchActivitySettledService.php
+++ b/admin/app/api/service/order/settled/BranchActivitySettledService.php
@@ -9,7 +9,7 @@
 use app\common\enum\order\OrderSourceEnum;
 use app\common\enum\order\OrderTypeEnum;
 use app\common\model\settings\Setting as SettingModel;
-use app\api\service\points\ConsumptionDeductService;
+use app\api\service\consumption\ConsumptionDeductService;
 use app\api\model\store\Store as StoreModel;
 use app\api\service\user\UserService;
 use app\common\enum\settings\DeliveryTypeEnum;
@@ -18,10 +18,13 @@
 use app\common\service\BaseService;
 use app\common\service\product\factory\ProductFactory;
 use app\api\service\fullreduce\FullDeductService;
-use app\common\model\plus\table\Record as RecordModel; //by lyzflash
+use app\common\model\plus\table\Record as RecordModel;
+
+//by lyzflash
 use app\common\model\order\OrderTrade as OrderTradeModel;
 use app\common\model\branch\ActivityOrder as BranchActivityOrderModel;
 use app\common\model\user\PointsLog as PointsLogModel;
+use app\api\service\points\PointsDeductService;
 
 /**
  * 订单结算服务基类
@@ -98,11 +101,13 @@
         $totalPoints = 0;
         $totalProductReduce = 0;
         $totalServicePrice = 0;
+        $totalConsumptionMoney = 0;
+        $totalConsumption = 0;
         $this->commonOrderData = $this->getCommonOrderData();
         // 供应商
         foreach ($this->supplierData as &$supplier) {
             // 整理订单数据
-            $this->orderData = $this->getOrderData($supplier['shop_supplier_id'],$supplier['productList']);
+            $this->orderData = $this->getOrderData($supplier['shop_supplier_id'], $supplier['productList']);
             // 订单商品总数量
             $orderTotalNum += helper::getArrayColumnSum($supplier['productList'], 'total_num');
             // 设置订单商品总服务费用
@@ -114,33 +119,35 @@
             $orderTotalPrice += $this->orderData['order_total_price'];
             // 计算积分商城抵扣
             $this->setOrderPoints($supplier['productList'], $this->settledRule['force_points']);
+            // 计算积分商城抵扣
+            $this->setOrderConsumption($supplier['productList']);
             // 计算订单商品的实际付款金额
             $this->setOrderProductPayPrice($supplier['productList']);
 
             // 设置默认配送方式
-            if(!isset($this->params['supplier'])){
-				$deliveryType=SettingModel::getItem('store')['delivery_type'];
-				$delivery=$this->params['delivery'];
-				if(in_array($delivery,$deliveryType)){
-					$delivery=$delivery;
-				}else if(in_array("10",$deliveryType)){
-					$delivery=10;
-				}else if(in_array("40",$deliveryType)){
-					$delivery=40;
-				}else{
-					$delivery = $deliveryType[0];
-				}
-				
+            if (!isset($this->params['supplier'])) {
+                $deliveryType = SettingModel::getItem('store')['delivery_type'];
+                $delivery = $this->params['delivery'];
+                if (in_array($delivery, $deliveryType)) {
+                    $delivery = $delivery;
+                } else if (in_array("10", $deliveryType)) {
+                    $delivery = 10;
+                } else if (in_array("40", $deliveryType)) {
+                    $delivery = 40;
+                } else {
+                    $delivery = $deliveryType[0];
+                }
+
                 $this->orderData['delivery'] = $supplier['productList'][0]['is_virtual'] == 1 || $supplier['productList'][0]['is_virtual'] == 2 || $supplier['productList'][0]['is_virtual'] == 3 ? 30 : $delivery;
-            }else{
-                if($supplier['productList'][0]['is_virtual'] == 1 || $supplier['productList'][0]['is_virtual'] == 2 || $supplier['productList'][0]['is_virtual'] == 3){
+            } else {
+                if ($supplier['productList'][0]['is_virtual'] == 1 || $supplier['productList'][0]['is_virtual'] == 2 || $supplier['productList'][0]['is_virtual'] == 3) {
                     $this->orderData['delivery'] = 30;
-                }else {
+                } else {
                     $this->orderData['delivery'] = $this->params['supplier'][$supplier['shop_supplier_id']]['delivery'];
                 }
                 $this->orderData['store_id'] = $this->params['supplier'][$supplier['shop_supplier_id']]['store_id'];
             }
-		 
+
             // 处理配送方式
             if ($this->orderData['delivery'] == DeliveryTypeEnum::EXPRESS) {
                 $this->setOrderExpress($supplier['productList']);
@@ -148,8 +155,8 @@
             } elseif ($this->orderData['delivery'] == DeliveryTypeEnum::EXTRACT) {
                 $this->orderData['store_id'] > 0 && $this->orderData['extract_store'] = StoreModel::detail($this->params['supplier'][$supplier['shop_supplier_id']]['store_id']);
             } elseif ($this->orderData['delivery'] == DeliveryTypeEnum::STORESS) {
-				 $this->orderData['extract_store_id'] = isset($this->params['delivery_store']) ? $this->params['delivery_store'] : $this->orderData['store_id'];
-			}
+                $this->orderData['extract_store_id'] = isset($this->params['delivery_store']) ? $this->params['delivery_store'] : $this->orderData['store_id'];
+            }
 
             // 计算订单最终金额
             $this->setOrderPayPrice($supplier['productList']);
@@ -169,12 +176,19 @@
             $this->setOrderPoints($supplier['productList'], $this->settledRule['force_points']);
             $totalPointsMoney += $this->orderData['points_money'];
             $totalPoints += $this->orderData['points_num'];
+            // 计算可用消费券抵扣
+            $this->setOrderConsumption($supplier['productList']);
+            $totalConsumptionMoney += $this->orderData['consumption_money'];
+            $totalConsumption += $this->orderData['consumption_num'];
             // 商品总价 - 积分抵扣
             foreach ($supplier['productList'] as &$product) {
                 $value = $product['total_pay_price'];
                 // 减去积分抵扣金额
                 if ($this->orderData['is_allow_points'] && $this->commonOrderData['is_use_points'] && !$this->settledRule['force_points']) {
                     $value = helper::bcsub($product['total_pay_price'], $product['points_money']);
+                }// 减去消费券抵扣金额
+                if ($this->orderData['is_allow_consumption'] && $this->commonOrderData['is_use_consumption'] && !$this->settledRule['force_points']) {
+                    $value = helper::bcsub($value, $product['consumption_money']);
                 }
                 $product['total_pay_price'] = helper::number2($value);
             }
@@ -185,6 +199,8 @@
         $this->commonOrderData['is_use_points'] && $orderPayPrice = $orderPayPrice - $totalPointsMoney;
         // 计算订单积分赠送数量
         $this->setOrderPointsBonus();
+        // 计算订单消费券赠送数量
+        $this->setOrderConsumptionBonus();
 
         //订单数据
         $this->commonOrderData = array_merge([
@@ -193,20 +209,22 @@
             'order_pay_price' => helper::number2($orderPayPrice),        // 商品总价,最终支付
             'total_service_price' => helper::number2($totalServicePrice),  // 商品总服务费
             'coupon_list' => [],
-            'coupon_id_sys' =>'',
+            'coupon_id_sys' => '',
             'coupon_money_sys' => 0,
             'points_money' => $totalPointsMoney,
             'points_num' => $totalPoints,
             'is_real_use_points' => $this->params['is_use_points'],
             'is_real_use_consumption' => $this->params['is_use_consumption'],
             'product_reduce_money' => $totalProductReduce,
+            'consumption_money' => $totalConsumptionMoney,
+            'consumption_num' => $totalConsumption,
             'verify_data' => $verify_data,
             'booking_data' => $booking_data,
             'last_extract' => UserService::getLastExtract($this->user['user_id']),
             // 房间id
             'room_id' => isset($this->params['room_id']) && $this->params['room_id'] > 0 ? $this->params['room_id'] : 0,
             // 计次卡
-            'counting_id' =>  0,
+            'counting_id' => 0,
             'user_counting_data' => [],
             'activity_id' => $this->params['activity_id'], //活动id
         ], $this->commonOrderData, $this->settledRule);
@@ -269,9 +287,9 @@
                     return false;
                 }
                 // 判断是否超过限购数量
-                if($product['limit_num'] > 0){
+                if ($product['limit_num'] > 0) {
                     $hasNum = OrderModel::getHasBuyOrderNum($this->user['user_id'], $product['product_id']);
-                    if($hasNum + $product['total_num'] > $product['limit_num']){
+                    if ($hasNum + $product['total_num'] > $product['limit_num']) {
                         $this->error = "很抱歉,购买超过此商品最大限购数量";
                         return false;
                     }
@@ -345,6 +363,10 @@
             if ($this->orderData['is_allow_points'] && $this->commonOrderData['is_use_points'] && !$this->settledRule['force_points']) {
                 $value = helper::bcsub($value, $product['points_money']);
             }
+            // 减去消费券抵扣金额
+            if ($this->orderData['is_allow_consumption'] && $this->commonOrderData['is_use_consumption'] && !$this->settledRule['force_points']) {
+                $value = helper::bcsub($value, $product['consumption_money']);
+            }
             $product['total_pay_price'] = helper::number2($value);
         }
 
@@ -354,27 +376,27 @@
     /**
      * 整理订单数据(结算台初始化)
      */
-    private function getOrderData($shop_supplier_id,$productList=[])
+    private function getOrderData($shop_supplier_id, $productList = [])
     {
         // 系统支持的配送方式 (后台设置)
-		$deliveryType = SettingModel::getItem('store')['delivery_type'];
-		
+        $deliveryType = SettingModel::getItem('store')['delivery_type'];
+
         // 积分设置
         $pointsSetting = SettingModel::getItem('points');
 
-        if(isset($this->params['supplier'])){
+        if (isset($this->params['supplier'])) {
             $delivery = $this->params['supplier'][$shop_supplier_id]['delivery'];
-		}else{
-			if(in_array("10",$deliveryType)){
-				$delivery=10;
-			}else if(in_array("40",$deliveryType)){
-				$delivery=40;
-			}else{
-				$delivery = $deliveryType[0];
-			}
-		}
+        } else {
+            if (in_array("10", $deliveryType)) {
+                $delivery = 10;
+            } else if (in_array("40", $deliveryType)) {
+                $delivery = 40;
+            } else {
+                $delivery = $deliveryType[0];
+            }
+        }
 
-        if(!empty($productList) && ($productList[0]['is_virtual'] == 1 || $productList[0]['is_virtual'] == 3)){
+        if (!empty($productList) && ($productList[0]['is_virtual'] == 1 || $productList[0]['is_virtual'] == 3)) {
             //虚拟商品核销 by yj
             $verify_data = [
                 'is_verify' => $productList[0]['is_verify'] && empty($productList[0]['virtual_auto']) ? 1 : 0, //必须是手动发货并且支持核销
@@ -387,15 +409,15 @@
                 $verify_data['verify_start_time'] = date('Y-m-d', $productList[0]['verify_start_time']);
                 $verify_data['verify_end_time'] = date('Y-m-d', $productList[0]['verify_end_time']);
             }
-        }else{
+        } else {
             $verify_data = [];
         }
 
         //通过收货地址获取最近的门店
-        if(!empty($this->user['address_default'])){
+        if (!empty($this->user['address_default'])) {
             $address = $this->user['address_default'];
-            $store_list = (new storeModel())->getList(false,$address["longitude"],$address["latitude"],false,$shop_supplier_id);
-            if(!empty($store_list)){
+            $store_list = (new storeModel())->getList(false, $address["longitude"], $address["latitude"], false, $shop_supplier_id);
+            if (!empty($store_list)) {
                 $sell_store_id = $store_list[0]["store_id"];
             }
         }
@@ -436,9 +458,9 @@
             //优惠券id
             'coupon_id' => 0,
             //优惠金额
-            'coupon_money'=>0,
+            'coupon_money' => 0,
             //总服务费用金额
-            'total_service_price'=>0,
+            'total_service_price' => 0,
             // 通过收货地址获取最近的门店出货
             'sell_store_id' => empty($sell_store_id) ? 0 : $sell_store_id,
         ];
@@ -459,10 +481,10 @@
         /*if( $this->user['user_id'] == 8743){
             print_r("a".$cityId);exit;
         }*/
-       /* if(empty($cityId)){
-            $this->error = "请先完善您的收货地址再提交订单";
-            return false;
-        }*/
+        /* if(empty($cityId)){
+             $this->error = "请先完善您的收货地址再提交订单";
+             return false;
+         }*/
 
         // 初始化配送服务类
         $ExpressService = new ExpressService(
@@ -514,7 +536,7 @@
         //如果是积分兑换,判断用户积分是否足够
         if ($this->settledRule['force_points']) {
             //因为积分会过期问题 所以现在读取现在有的积分
-            $points = ( new PointsLogModel())->getUserPoints($this->user['user_id']);
+            $points = (new PointsLogModel())->getUserPoints($this->user['user_id']);
             if ($points < $order['orderData']['points_num']) {
                 $this->error = '用户积分不足,无法使用积分兑换';
                 return false;
@@ -535,9 +557,9 @@
             $this->saveOrderAddress($commomOrder['address'], $status);
         } elseif ($supplier['orderData']['delivery'] == DeliveryTypeEnum::EXTRACT) {
             // 记录自提信息
-            if(!empty($this->params['linkman']) && !empty($this->params['phone'])){
+            if (!empty($this->params['linkman']) && !empty($this->params['phone'])) {
                 $this->saveOrderExtract($this->params['linkman'], $this->params['phone']);
-            }else{
+            } else {
                 $this->saveOrderExtract($commomOrder['address']['name'], $commomOrder['address']['phone']);
             }
         }
@@ -549,13 +571,13 @@
         $this->saveOrderProduct($supplier, $status, $commomOrder);
 
         // 更新商品库存 (针对下单减库存的商品)
-        if(!empty($commomOrder["extract_store_id"])){
+        if (!empty($commomOrder["extract_store_id"])) {
             //自提门店
             $sell_store_id = $commomOrder["extract_store_id"];
-        }elseif(!empty($commomOrder["sell_store_id"])){
+        } elseif (!empty($commomOrder["sell_store_id"])) {
             //没有自提门店,判断出货门店
             $sell_store_id = $supplier['orderData']["sell_store_id"];
-        }else{
+        } else {
             $sell_store_id = 0;
         }
         // 减库存
@@ -564,16 +586,16 @@
         // 积分兑换扣除用户积分
         if ($commomOrder['force_points']) {
             $describe = "用户积分兑换消费:{$this->model['order_no']}";
-            $this->user->setIncPoints(-$commomOrder['points_num'], $describe,0,true,$status);
+            $this->user->setIncPoints(-$commomOrder['points_num'], $describe, 0, true, $status);
         } else {
             // 积分抵扣情况下扣除用户积分
             if ($commomOrder['is_allow_points'] && $commomOrder['is_real_use_points'] && $commomOrder['points_num'] > 0) {
                 $describe = "用户消费:{$this->model['order_no']}";
-                $this->user->setIncPoints(-$commomOrder['points_num'], $describe,0,true,$status);
+                $this->user->setIncPoints(-$commomOrder['points_num'], $describe, 0, true, $status);
             }
             if ($commomOrder['is_allow_consumption'] && $commomOrder['is_real_use_consumption'] && $commomOrder['consumption_num'] > 0) {
                 $describe = "用户消费:{$this->model['order_no']}";
-                $this->user->setIncConsumption(-$commomOrder['consumptions_num'], $describe,0,true,$status);
+                $this->user->setIncConsumption(-$commomOrder['consumptions_num'], $describe, 0, true, $status);
             }
         }
         return $status;
@@ -600,10 +622,10 @@
             'order_price' => $order['order_price'],
             'coupon_id' => 0,
             'coupon_money' => $supplier['orderData']['coupon_money'],
-            'coupon_id_sys'=>0,
-            'coupon_money_sys'=>0,
-            'points_money' => $commomOrder['is_real_use_points'] == 1?$supplier['orderData']['points_money']:0,
-            'points_num' => $commomOrder['is_real_use_points'] == 1?$supplier['orderData']['points_num']:0,
+            'coupon_id_sys' => 0,
+            'coupon_money_sys' => 0,
+            'points_money' => $commomOrder['is_real_use_points'] == 1 ? $supplier['orderData']['points_money'] : 0,
+            'points_num' => $commomOrder['is_real_use_points'] == 1 ? $supplier['orderData']['points_num'] : 0,
             'pay_price' => $order['order_pay_price'],
             'delivery_type' => $supplier['orderData']['delivery'],
             'pay_type' => $commomOrder['pay_type'],
@@ -611,16 +633,16 @@
             'buyer_remark' => $this->params['supplier'][$supplier['shop_supplier_id']]['remark'],
             'order_source' => $this->orderSource['source'],
             'points_bonus' => $supplier['orderData']['points_bonus'],
-            'is_agent' => $this->settledRule['is_agent']? 1:0,
+            'is_agent' => $this->settledRule['is_agent'] ? 1 : 0,
             'shop_supplier_id' => $supplier['shop_supplier_id'],
             'supplier_money' => $order['supplier_money'],
             'sys_money' => $order['sys_money'],
             'app_id' => $this->app_id,
             'room_id' => $commomOrder['room_id'],
             'virtual_auto' => $supplier['productList'][0]['virtual_auto'],
-            'is_verify' => isset($supplier['productList'][0]['is_verify'])?$supplier['productList'][0]['is_verify']:0, //是否支持核销 by yj
+            'is_verify' => isset($supplier['productList'][0]['is_verify']) ? $supplier['productList'][0]['is_verify'] : 0, //是否支持核销 by yj
             'is_virtual' => $supplier['productList'][0]['is_virtual'], //是否是服务商品 by yj
-	        'product_reduce_money' => 0,
+            'product_reduce_money' => 0,
             'user_counting_id' => empty($commomOrder['user_counting_data']) ? 0 : $commomOrder['user_counting_data']["order_id"],
             'total_service_price' => empty($order['total_service_price']) ? 0 : $order['total_service_price'],
             // 'sell_store_id' => empty($sell_store_id) ? 0 : $sell_store_id,
@@ -631,11 +653,11 @@
             $data['express_price'] = $order['express_price'];
         } elseif ($supplier['orderData']['delivery'] == DeliveryTypeEnum::EXTRACT) {
             $data['extract_store_id'] = $order['extract_store']['store_id'];
-        }elseif ($supplier['orderData']['delivery'] == DeliveryTypeEnum::STORESS) {
+        } elseif ($supplier['orderData']['delivery'] == DeliveryTypeEnum::STORESS) {
             //配送门店
-			$data['delivery_store'] = isset($this->params['delivery_store']) ? $this->params['delivery_store'] : $order['extract_store_id'];
-			$data['extract_store_id'] = isset($this->params['delivery_store']) ? $this->params['delivery_store'] : $order['extract_store_id'];
-		}
+            $data['delivery_store'] = isset($this->params['delivery_store']) ? $this->params['delivery_store'] : $order['extract_store_id'];
+            $data['extract_store_id'] = isset($this->params['delivery_store']) ? $this->params['delivery_store'] : $order['extract_store_id'];
+        }
 
         //随主订单配置
         $config = SettingModel::getItem('trade');
@@ -645,7 +667,7 @@
         $this->model->save($data);
         $order_id = $this->model['order_id'];
         $activity_order = new BranchActivityOrderModel();
-        $activity_order->save(['order_id'=>$order_id,'activity_id'=>$commomOrder['activity_id'], 'app_id' => $this->app_id, 'shop_supplier_id' => $supplier['shop_supplier_id']]);
+        $activity_order->save(['order_id' => $order_id, 'activity_id' => $commomOrder['activity_id'], 'app_id' => $this->app_id, 'shop_supplier_id' => $supplier['shop_supplier_id']]);
         return $order_id;
     }
 
@@ -728,13 +750,13 @@
                 'line_price' => $product['product_sku']['line_price'],
                 'product_weight' => empty($product['product_sku']['product_weight']) ? 0 : $product['product_sku']['product_weight'],
                 'is_user_grade' => (int)$product['is_user_grade'],
-                'grade_ratio' => $product['grade_ratio']??0,
-                'grade_product_price' => isset($product['grade_product_price'])?$product['grade_product_price']:0,
-                'grade_total_money' => $product['grade_total_money']??0,
-                'coupon_money' => isset($product['coupon_money'])?$product['coupon_money']:0,
-                'points_money' => isset($product['points_money']) && $commomOrder['is_real_use_points']?$product['points_money']:0,
-                'points_num' => isset($product['points_num']) && $commomOrder['is_real_use_points']?$product['points_num']:0,
-                'points_bonus' => isset($product['points_bonus'])?$product['points_bonus']:0,
+                'grade_ratio' => $product['grade_ratio'] ?? 0,
+                'grade_product_price' => isset($product['grade_product_price']) ? $product['grade_product_price'] : 0,
+                'grade_total_money' => $product['grade_total_money'] ?? 0,
+                'coupon_money' => isset($product['coupon_money']) ? $product['coupon_money'] : 0,
+                'points_money' => isset($product['points_money']) && $commomOrder['is_real_use_points'] ? $product['points_money'] : 0,
+                'points_num' => isset($product['points_num']) && $commomOrder['is_real_use_points'] ? $product['points_num'] : 0,
+                'points_bonus' => isset($product['points_bonus']) ? $product['points_bonus'] : 0,
                 'total_num' => $product['total_num'],
                 'total_price' => $product['total_price'],
                 'total_pay_price' => $product['total_pay_price'],
@@ -746,7 +768,7 @@
                 'first_money' => $product['first_money'],
                 'second_money' => $product['second_money'],
                 'third_money' => $product['third_money'],
-                'fullreduce_money' => isset($product['fullreduce_money'])?$product['fullreduce_money']:0,
+                'fullreduce_money' => isset($product['fullreduce_money']) ? $product['fullreduce_money'] : 0,
                 'virtual_content' => $product['virtual_content'],
                 'is_alone_team' => $product['is_alone_team'],
                 'alone_team_equity' => $product['alone_team_equity'],
@@ -754,8 +776,8 @@
                 'is_verify' => $product['is_verify'],
                 'verify_type' => $product['verify_type'],
                 'verify_day' => $product['verify_day'],
-                'service_name' => !empty($product['service_name'])?$product['service_name']:'',
-                'service_price' => !empty($product['service_price'])?$product['service_price']:0,
+                'service_name' => !empty($product['service_name']) ? $product['service_name'] : '',
+                'service_price' => !empty($product['service_price']) ? $product['service_price'] : 0,
             ];
 
             // 记录订单商品来源id
@@ -794,18 +816,18 @@
             $this->orderData['is_allow_points'] = true;
 
             //因为积分会过期问题 所以现在读取现在有的积分
-            $points = ( new PointsLogModel())->getUserPoints($this->user['user_id']);
+            $points = (new PointsLogModel())->getUserPoints($this->user['user_id']);
             if ($points < $productList[0]['points_num']) {
                 $this->error = '用户积分不足,无法使用积分兑换';
                 return false;
             }
-/*            if ($this->user['points'] < $productList[0]['points_num']) {
-                $this->error = '积分不足,去多赚点积分吧!';
-                return false;
-            }*/
+            /*            if ($this->user['points'] < $productList[0]['points_num']) {
+                            $this->error = '积分不足,去多赚点积分吧!';
+                            return false;
+                        }*/
             return true;
         }
-        if($force_points){
+        if ($force_points) {
             return true;
         }
         // 积分设置
@@ -833,7 +855,7 @@
             return false;
         }
         // 计算订单商品实际抵扣的积分数量和金额
-        $ProductDeduct = new ConsumptionDeductService($productList);
+        $ProductDeduct = new PointsDeductService($productList);
         $ProductDeduct->setProductPoints($maxPointsNumCount, $actualPointsNum);
         // 积分抵扣总金额
         $orderPointsMoney = helper::getArrayColumnSum($productList, 'points_money');
@@ -866,7 +888,7 @@
                 // 最多可抵扣的积分数量
                 $product['max_points_num'] = helper::bcdiv($maxPointsMoney, $setting['discount']['discount_ratio'], 0);
                 // 如果超过商品最大抵扣数量
-                if($product['max_points_discount'] > 0 && $product['max_points_num'] > $product['max_points_discount'] * $product['total_num']){
+                if ($product['max_points_discount'] > 0 && $product['max_points_num'] > $product['max_points_discount'] * $product['total_num']) {
                     $product['max_points_num'] = $product['max_points_discount'] * $product['total_num'];
                 }
             }
@@ -881,8 +903,8 @@
     private function setOrderPointsBonus()
     {
         // 初始化商品积分赠送数量
-        foreach ($this->supplierData as &$supplier){
-            foreach ($supplier['productList'] as $product){
+        foreach ($this->supplierData as &$supplier) {
+            foreach ($supplier['productList'] as $product) {
                 $product['points_bonus'] = 0;
             }
             $supplier['orderData']['points_bonus'] = 0;
@@ -910,6 +932,111 @@
 
 
     /**
+     * 计算订单可用消费券抵扣
+     */
+    private function setOrderConsumption($productList)
+    {
+        $this->orderData['consumption_money'] = 0;
+        // 消费券抵扣总数量
+        $this->orderData['consumption_num'] = 0;
+        // 允许消费券抵扣
+        $this->orderData['is_allow_consumption'] = false;
+        // 消费券设置
+        $setting = SettingModel::getItem('consumption');
+        // 条件:后台开启下单使用消费券抵扣
+        if (!$setting['is_shopping_discount']) {
+            return false;
+        }
+        // 条件:订单金额满足[?]元
+        if (helper::bccomp($setting['discount']['full_order_price'], $this->orderData['order_total_price']) === 1) {
+            return false;
+        }
+        // 计算订单商品最多可抵扣的消费券数量
+        $this->setOrderConsumptionMaxPointsNum($productList);
+        // 订单最多可抵扣的消费券总数量
+        $maxConsumptionNumCount = helper::getArrayColumnSum($productList, 'max_consumption_num');
+        // 实际可抵扣的消费券数量
+        $actualConsumptionNum = min($maxConsumptionNumCount, $this->user['consumer_coupon']);
+        if ($actualConsumptionNum < 1) {
+            $this->orderData['consumption_money'] = 0;
+            // 消费券抵扣总数量
+            $this->orderData['consumption_num'] = 0;
+            // 允许消费券抵扣
+            $this->orderData['is_allow_consumption'] = true;
+            return false;
+        }
+        // 计算订单商品实际抵扣的消费券数量和金额
+        $ProductDeduct = new ConsumptionDeductService($productList);
+        $ProductDeduct->setProductConsumption($maxConsumptionNumCount, $actualConsumptionNum);
+        // 消费券抵扣总金额
+        $orderConsumptionMoney = helper::getArrayColumnSum($productList, 'consumption_money');
+        $this->orderData['consumption_money'] = helper::number2($orderConsumptionMoney);
+        // 消费券抵扣总数量
+        $this->orderData['consumption_num'] = $actualConsumptionNum;
+        // 允许消费券抵扣
+        $this->orderData['is_allow_consumption'] = true;
+        return true;
+    }
+
+    /**
+     * 计算订单商品最多可抵扣的消费券数量
+     */
+    private function setOrderConsumptionMaxPointsNum($productList)
+    {
+        // 消费券设置
+        $setting = SettingModel::getItem('consumption');
+        foreach ($productList as &$product) {
+            // 商品不允许消费券抵扣
+            if (!$product['is_consumption_discount'] || $product['is_repurchase'] || $product['is_newcomer'] || $product['is_vip']) continue;
+            // 消费券抵扣比例
+            $deductionRatio = helper::bcdiv($setting['discount']['max_money_ratio'], 100);
+            // 最多可抵扣的金额
+            $maxPointsMoney = helper::bcmul($product['total_price'], $deductionRatio);
+            // 最多可抵扣的消费券数量
+            $product['max_consumption_num'] = helper::bcdiv($maxPointsMoney, $setting['discount']['discount_ratio'], 0);
+            // 如果超过商品最大抵扣数量
+            if ($product['max_consumption_discount'] > 0 && $product['max_consumption_num'] > $product['max_consumption_discount'] * $product['total_num']) {
+                $product['max_consumption_num'] = $product['max_consumption_discount'] * $product['total_num'];
+            }
+        }
+        return true;
+    }
+
+
+    /**
+     * 计算订单消费券赠送数量
+     */
+    private function setOrderConsumptionBonus()
+    {
+        // 初始化商品消费券赠送数量
+        foreach ($this->supplierData as &$supplier) {
+            foreach ($supplier['productList'] as $product) {
+                $product['consumption_bonus'] = 0;
+            }
+            $supplier['orderData']['consumption_bonus'] = 0;
+        }
+        // 消费券设置
+        $setting = SettingModel::getItem('consumption');
+        // 条件:后台开启开启购物送消费券
+        if (!$setting['is_shopping_gift']) {
+            return false;
+        }
+        // 设置商品消费券赠送数量
+        foreach ($this->supplierData as &$supplier) {
+            foreach ($supplier['productList'] as &$product) {
+                // 消费券赠送比例
+                $ratio = $setting['gift_ratio'] / 100;
+                // 计算抵扣的消费券数量
+                $product['consumption_bonus'] = !$product['is_consumption_gift'] ? 0 : helper::bcmul($product['total_pay_price'], $ratio, 0);
+            }
+            //  订单消费券赠送数量
+            $supplier['orderData']['consumption_bonus'] = helper::getArrayColumnSum($supplier['productList'], 'consumption_bonus');
+        }
+
+        return true;
+    }
+
+    /**
      * 设置订单商品服务费用
      */
     private function setProductService($productList)
@@ -933,7 +1060,7 @@
         $productListTemp = helper::getArrayColumns($productList, ['total_price']);
         $service = new FullDeductService;
         $completed = $service->setProductFullreduceMoney($productListTemp, $reduce['reduced_price']);
-        if($completed){
+        if ($completed) {
             // 分配订单商品优惠券抵扣金额
             foreach ($productList as $key => &$product) {
                 $product['fullreduce_money'] = $completed[$key]['fullreduce_money'] / 100;
@@ -948,25 +1075,25 @@
     private function setOrderFinalPrice()
     {
 
-        foreach ($this->supplierData as &$supplier){
+        foreach ($this->supplierData as &$supplier) {
             //商户独立抽成
             $config = SettingModel::getSupplierCommissionRate($supplier["shop_supplier_id"]);
             $sys_percent = intval($config['commission_rate']);
             $supplier_percent = 100 - $sys_percent;
             // 供应商结算金额,包括运费
-            $supplier['orderData']['supplier_money'] = helper::number2($supplier['orderData']['order_price'] * $supplier_percent/100 + $supplier['orderData']['express_price']);
+            $supplier['orderData']['supplier_money'] = helper::number2($supplier['orderData']['order_price'] * $supplier_percent / 100 + $supplier['orderData']['express_price']);
             // 平台分佣金额
-            $supplier['orderData']['sys_money'] = helper::number2($supplier['orderData']['order_price'] * $sys_percent/100);
+            $supplier['orderData']['sys_money'] = helper::number2($supplier['orderData']['order_price'] * $sys_percent / 100);
             // 产品价格
             // 结算金额不包括运费
-            foreach ($supplier['productList'] as &$product){
+            foreach ($supplier['productList'] as &$product) {
 
-                $product['supplier_money'] = helper::number2($product['total_pay_price'] * $supplier_percent/100);
-                $product['sys_money'] = helper::number2($product['total_pay_price'] * $sys_percent/100);
+                $product['supplier_money'] = helper::number2($product['total_pay_price'] * $supplier_percent / 100);
+                $product['sys_money'] = helper::number2($product['total_pay_price'] * $sys_percent / 100);
             }
         }
         $price = 0;
-        foreach ($this->supplierData as &$supplier){
+        foreach ($this->supplierData as &$supplier) {
             $price += $supplier['orderData']['order_pay_price'];
         }
 

--
Gitblit v1.9.2