From ca425b889f3c1b5847ffc26a0229307f7f8ef43e Mon Sep 17 00:00:00 2001
From: quanwei <419654421@qq.com>
Date: Tue, 09 Dec 2025 16:11:31 +0800
Subject: [PATCH] 添加消费券 商户端添加页面diy
---
admin/app/api/service/order/settled/OrderSettledService.php | 155 +++++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 149 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..f7f4f77 100644
--- a/admin/app/api/service/order/settled/OrderSettledService.php
+++ b/admin/app/api/service/order/settled/OrderSettledService.php
@@ -7,11 +7,11 @@
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\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 +54,7 @@
'is_user_grade' => true, // 会员等级折扣
'is_agent' => true, // 商品是否开启分销,最终还是支付成功后判断分销活动是否开启
'is_reduce' => true, //是否满减
+ 'is_use_consumption' => true, // 是否使用消费券抵扣
];
/**
@@ -94,6 +95,8 @@
$expressPrice = 0;
$totalPointsMoney = 0;
$totalPoints = 0;
+ $totalConsumptionMoney = 0;
+ $totalConsumption = 0;
$totalProductReduce = 0;
$this->commonOrderData = $this->getCommonOrderData();
// 供应商
@@ -141,6 +144,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 +165,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,6 +214,8 @@
$orderPayPrice = $this->setOrderFinalPrice();
// 计算订单积分赠送数量
$this->setOrderPointsBonus();
+ // 计算订单消费券赠送数量
+ $this->setOrderConsumptionBonus();
//订单数据
$this->commonOrderData = array_merge([
'order_total_num' => $orderTotalNum, // 商品总数量
@@ -217,7 +226,10 @@
'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 +259,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'] : '',
@@ -395,6 +411,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 +448,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 +617,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;
}
@@ -619,6 +644,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 +653,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'],
@@ -744,6 +773,9 @@
'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_pay_price' => $product['total_pay_price'],
@@ -757,12 +789,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
@@ -829,7 +867,7 @@
return false;
}
// 计算订单商品实际抵扣的积分数量和金额
- $ProductDeduct = new PointsDeductService($productList);
+ $ProductDeduct = new ConsumptionDeductService($productList);
$ProductDeduct->setProductPoints($maxPointsNumCount, $actualPointsNum);
// 积分抵扣总金额
$orderPointsMoney = helper::getArrayColumnSum($productList, 'points_money');
@@ -905,6 +943,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