quanwei
2025-12-10 898043fc97d2ab8b793fd317a049b874ed207c6d
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,6 +101,8 @@
        $totalPoints = 0;
        $totalProductReduce = 0;
        $totalServicePrice = 0;
        $totalConsumptionMoney = 0;
        $totalConsumption = 0;
        $this->commonOrderData = $this->getCommonOrderData();
        // 供应商
        foreach ($this->supplierData as &$supplier) {
@@ -114,6 +119,8 @@
            $orderTotalPrice += $this->orderData['order_total_price'];
            // 计算积分商城抵扣
            $this->setOrderPoints($supplier['productList'], $this->settledRule['force_points']);
            // 计算积分商城抵扣
            $this->setOrderConsumption($supplier['productList']);
            // 计算订单商品的实际付款金额
            $this->setOrderProductPayPrice($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([
@@ -200,6 +216,8 @@
            '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']),
@@ -344,6 +362,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);
        }
@@ -833,7 +855,7 @@
            return false;
        }
        // 计算订单商品实际抵扣的积分数量和金额
        $ProductDeduct = new ConsumptionDeductService($productList);
        $ProductDeduct = new PointsDeductService($productList);
        $ProductDeduct->setProductPoints($maxPointsNumCount, $actualPointsNum);
        // 积分抵扣总金额
        $orderPointsMoney = helper::getArrayColumnSum($productList, 'points_money');
@@ -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)