From abc7edc3c8ad59ff213c85413d0d6a10d7a0b6f7 Mon Sep 17 00:00:00 2001
From: quanwei <419654421@qq.com>
Date: Wed, 17 Dec 2025 18:03:09 +0800
Subject: [PATCH] 1.	发布供需消耗连盟币,连盟币数量在后台独立设置 2.	小程序供需个人中心可自由切换身份 3.	增加私信系统 4.	增加评论系统,用户可在发布者详情页进行评论操作,评论获得的连盟币可在后台设置 5.	增加发布者的等级,以好评个数为条件进行升级,小程序端会显示该等级的图标,如没有等级则不会显示图标 6.	增加设置消耗连盟币可以解锁、查看发布的信息,费用可在后台设置 7.	小程序供需大厅界面优化,以及增加了推荐栏目,该栏目按发布的分类相似进行匹配,比如A用户发布了 互联网 分类的需求,则会优先推荐匹配互联网分类的供应需求给他。

---
 admin/app/api/service/order/settled/OrderSettledService.php |  172 +++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 166 insertions(+), 6 deletions(-)

diff --git a/admin/app/api/service/order/settled/OrderSettledService.php b/admin/app/api/service/order/settled/OrderSettledService.php
index 11e0069..31cecd8 100644
--- a/admin/app/api/service/order/settled/OrderSettledService.php
+++ b/admin/app/api/service/order/settled/OrderSettledService.php
@@ -7,11 +7,12 @@
 use app\api\model\order\OrderAddress as OrderAddress;
 use app\api\model\plus\coupon\UserCoupon as UserCouponModel;
 use app\api\model\product\Category;
+use app\api\service\consumption\ConsumptionDeductService;
+use app\api\service\points\PointsDeductService;
 use app\common\enum\order\OrderPayTypeEnum;
 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\PointsDeductService;
 use app\api\service\coupon\ProductDeductService;
 use app\common\model\store\Store as StoreModel;
 use app\api\service\user\UserService;
@@ -54,6 +55,7 @@
         'is_user_grade' => true,     // 会员等级折扣
         'is_agent' => true,     // 商品是否开启分销,最终还是支付成功后判断分销活动是否开启
         'is_reduce' => true, //是否满减
+        'is_use_consumption' => true, // 是否使用消费券抵扣
     ];
 
     /**
@@ -94,7 +96,10 @@
         $expressPrice = 0;
         $totalPointsMoney = 0;
         $totalPoints = 0;
+        $totalConsumptionMoney = 0;
+        $totalConsumption = 0;
         $totalProductReduce = 0;
+        $settlementPrice=0;
         $this->commonOrderData = $this->getCommonOrderData();
         // 供应商
         foreach ($this->supplierData as &$supplier) {
@@ -107,6 +112,9 @@
             // 设置订单商品总金额(不含优惠折扣)
             $this->setOrderTotalPrice($supplier['productList']);
             $orderTotalPrice += $this->orderData['order_total_price'];
+            // 设置订单商品总结算金额
+            $this->setOrderSettlementPrice($supplier['productList']);
+            $settlementPrice += $this->orderData['settlement_price'];
             // 先计算商品满减
             $this->setProductReduce($supplier['productList']);
             $totalProductReduce += $this->orderData['product_reduce_money'];
@@ -141,6 +149,10 @@
             $this->setOrderPoints($supplier['productList']);
             $totalPointsMoney += $this->orderData['points_money'];
             $totalPoints += $this->orderData['points_num'];
+            // 计算可用消费券抵扣
+            $this->setOrderConsumption($supplier['productList']);
+            $totalConsumptionMoney += $this->orderData['consumption_money'];
+            $totalConsumption += $this->orderData['consumption_num'];
             // 计算订单商品的实际付款金额
             $this->setOrderProductPayPrice($supplier['productList']);
 
@@ -158,9 +170,9 @@
 					$delivery = $deliveryType[0];
 				}
 				
-                $this->orderData['delivery'] = $supplier['productList'][0]['is_virtual'] == 1 || $supplier['productList'][0]['is_virtual'] == 2 ?30:$delivery;
+                $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){
+                if($supplier['productList'][0]['is_virtual'] == 1 || $supplier['productList'][0]['is_virtual'] == 2||$supplier['productList'][0]['is_virtual'] == 3){
                     $this->orderData['delivery'] = 30;
                 }else {
                     $this->orderData['delivery'] = $this->params['supplier'][$supplier['shop_supplier_id']]['delivery'];
@@ -207,17 +219,23 @@
         $orderPayPrice = $this->setOrderFinalPrice();
         // 计算订单积分赠送数量
         $this->setOrderPointsBonus();
+        // 计算订单消费券赠送数量
+        $this->setOrderConsumptionBonus();
         //订单数据
         $this->commonOrderData = array_merge([
             'order_total_num' => $orderTotalNum,        // 商品总数量
             'order_total_price' => helper::number2($orderTotalPrice),        // 商品总价
+            'settlement_price' => helper::number2($settlementPrice),        // 商品总结算价
             'order_pay_price' => helper::number2($orderPayPrice),        // 商品总价,最终支付
             'coupon_list' => $couponList,
             'coupon_id_sys' => $coupon_id,
             'coupon_money_sys' => 0,
             'points_money' => $totalPointsMoney,
             'points_num' => $totalPoints,
+            'consumption_money' => $totalConsumptionMoney,
+            'consumption_num' => $totalConsumption,
             'is_real_use_points' => $this->params['is_use_points'],
+            'is_real_use_consumption' => $this->params['is_use_consumption'],
             'product_reduce_money' => $totalProductReduce,
             'verify_data' => $verify_data,
             'last_extract' => UserService::getLastExtract($this->user['user_id']),
@@ -247,6 +265,10 @@
             'is_allow_points' => true,
             // 是否使用积分抵扣
             'is_use_points' => $this->params['is_use_points'],
+            // 是否使用消费券抵扣
+            'is_use_consumption' => $this->params['is_use_consumption'],
+            // 是否允许使用消费券抵扣
+            'is_allow_consumption' => true,
             // 支付方式
             'pay_type' => isset($this->params['pay_type']) ? $this->params['pay_type'] : OrderPayTypeEnum::WECHAT,
             'pay_source' => isset($this->params['pay_source']) ? $this->params['pay_source'] : '',
@@ -313,6 +335,14 @@
     {
         // 订单商品的总金额(不含优惠券折扣)
         $this->orderData['order_total_price'] = helper::number2(helper::getArrayColumnSum($productList, 'total_price'));
+    }
+    /**
+     * 设置订单的商品总结算金额(不含优惠折扣)
+     */
+    private function setOrderSettlementPrice($productList)
+    {
+        // 订单商品的总金额(不含优惠券折扣)
+        $this->orderData['settlement_price'] = helper::number2(helper::getArrayColumnSum($productList, 'total_settlement_price'));
     }
 
     /**
@@ -395,6 +425,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']);
+            }
             // 减去满减金额
             if($this->settledRule['is_reduce'] && $this->orderData['reduce']){
                 $value = helper::bcsub($value, $product['fullreduce_money']);
@@ -428,7 +462,7 @@
 			}
 		}
 
-        if(!empty($productList) && $productList[0]['is_virtual'] == 1){
+        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, //必须是手动发货并且支持核销
@@ -597,6 +631,11 @@
                 $describe = "用户消费:{$this->model['order_no']}";
                 $this->user->setIncPoints(-$commomOrder['points_num'], $describe);
             }
+            // 积分抵扣情况下扣除用户积分
+            if ($commomOrder['is_allow_consumption'] && $commomOrder['is_real_use_consumption'] && $commomOrder['consumption_num'] > 0) {
+                $describe = "用户消费:{$this->model['order_no']}";
+                $this->user->setIncConsumption(-$commomOrder['consumption_num'], $describe);
+            }
         }
         return $status;
     }
@@ -612,6 +651,7 @@
             'user_id' => $this->user['user_id'],
             'order_no' => $this->model->orderNo(),
             'total_price' => $order['order_total_price'],
+            'settlement_price' => $order['settlement_price'],
             'order_price' => $order['order_price'],
             'coupon_id' => $supplier['orderData']['coupon_id'],
             'coupon_money' => $supplier['orderData']['coupon_money'],
@@ -619,6 +659,8 @@
             'coupon_money_sys'=>$supplier['orderData']['coupon_money_sys'],
             'points_money' => $commomOrder['is_real_use_points'] == 1?abs($supplier['orderData']['points_money']):0,
             'points_num' => $commomOrder['is_real_use_points'] == 1?$supplier['orderData']['points_num']:0,
+            'consumption_money' => $commomOrder['is_real_use_consumption'] == 1?abs($supplier['orderData']['consumption_money']):0,
+            'consumption_num' => $commomOrder['is_real_use_consumption'] == 1?$supplier['orderData']['consumption_num']:0,
             'pay_price' => $order['order_pay_price'],
             'delivery_type' => $supplier['orderData']['delivery'],
             'pay_type' => $commomOrder['pay_type'],
@@ -626,9 +668,11 @@
             'buyer_remark' => $this->params['supplier'][$supplier['shop_supplier_id']]['remark'],
             'order_source' => $this->orderSource['source'],
             'points_bonus' => $supplier['orderData']['points_bonus'],
+            'consumption_bonus' => $supplier['orderData']['consumption_bonus'],
             'is_agent' => $this->settledRule['is_agent']? 1:0,
-            'shop_supplier_id' => $supplier['shop_supplier_id'],
+            'shop_supplier_id' => ($supplier['productList'][0]['is_newcomer'] == 0||$supplier['productList'][0]['belonging_shop_supplier_id'] == 0)?$supplier['shop_supplier_id']:$supplier['productList'][0]['belonging_shop_supplier_id'],
             'supplier_money' => $order['supplier_money'],
+            'is_newcomer' => $supplier['productList'][0]['is_newcomer'],
             'sys_money' => $order['sys_money'],
             'app_id' => $this->app_id,
             'room_id' => $commomOrder['room_id'],
@@ -735,6 +779,7 @@
                 'product_no' => $product['product_sku']['product_no'],
                 'product_price' => $product['product_sku']['product_price'],
                 'line_price' => $product['product_sku']['line_price'],
+                'settlement_price' => $product['product_sku']['settlement_price'],
                 'product_weight' => $product['product_sku']['product_weight'],
                 'is_user_grade' => (int)$product['is_user_grade'],
                 'grade_ratio' => $product['grade_ratio'],
@@ -744,8 +789,12 @@
                 'points_money' => isset($product['points_money']) && $commomOrder['is_real_use_points']?abs($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,
+                'consumption_money' => isset($product['consumption_money']) && $commomOrder['is_real_use_consumption']?abs($product['consumption_money']):0,
+                'consumption_num' => isset($product['consumption_num']) && $commomOrder['is_real_use_consumption']?$product['consumption_num']:0,
+                'consumption_bonus' => isset($product['consumption_bonus'])?$product['consumption_bonus']:0,
                 'total_num' => $product['total_num'],
                 'total_price' => $product['total_price'],
+                'total_settlement_price' => $product['total_settlement_price'],
                 'total_pay_price' => $product['total_pay_price'],
                 'supplier_money' => $product['supplier_money'],
                 'is_agent' => $product['is_agent'],
@@ -757,12 +806,18 @@
                 'third_money' => $product['third_money'],
                 'fullreduce_money' => isset($product['fullreduce_money'])?$product['fullreduce_money']:0,
                 'virtual_content' => $product['virtual_content'],
+                'service_content' => $product['service_content'],
                 'is_alone_team' => $product['is_alone_team'],
                 'alone_team_equity' => $product['alone_team_equity'],
                 'product_reduce_money' => $product['product_reduce_money'],
                 'is_verify' => $product['is_verify'],
                 'verify_type' => $product['verify_type'],
                 'verify_day' => $product['verify_day'],
+                'is_newcomer' => $product['is_newcomer'],
+                'is_vip' => $product['is_vip'],
+                'is_repurchase' => $product['is_repurchase'],
+                'is_viewpoint_money' => $product['is_viewpoint_money'],
+                'viewpoint_money' => $product['viewpoint_money'],
                 'deduction_price' => empty($product['deduction_price']) ? 0 : $product['deduction_price'],//券商品的抵扣金额 by yj 2024.1.10
             ];
             // 记录订单商品来源id
@@ -854,7 +909,7 @@
                 $product['max_points_num'] = $product['points_num'];
             } else {
                 // 商品不允许积分抵扣
-                if (!$product['is_points_discount']) continue;
+                if (!$product['is_points_discount']||$product['is_vip']||$product['is_newcomer']||$product['is_repurchase']) continue;
                 // 积分抵扣比例
                 $deductionRatio = helper::bcdiv($setting['discount']['max_money_ratio'], 100);
                 // 最多可抵扣的金额
@@ -905,6 +960,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 setOrderGrade($productList)

--
Gitblit v1.9.2