| | |
| | | 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; |
| | |
| | | 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; |
| | | |
| | | /** |
| | | * 订单结算服务基类 |
| | |
| | | $totalPoints = 0; |
| | | $totalProductReduce = 0; |
| | | $totalServicePrice = 0; |
| | | $totalConsumptionMoney = 0; |
| | | $totalConsumption = 0; |
| | | $this->commonOrderData = $this->getCommonOrderData(); |
| | | // 供应商 |
| | | foreach ($this->supplierData as &$supplier) { |
| | |
| | | $orderTotalPrice += $this->orderData['order_total_price']; |
| | | // 计算积分商城抵扣 |
| | | $this->setOrderPoints($supplier['productList'], $this->settledRule['force_points']); |
| | | // 计算积分商城抵扣 |
| | | $this->setOrderConsumption($supplier['productList']); |
| | | // 计算订单商品的实际付款金额 |
| | | $this->setOrderProductPayPrice($supplier['productList']); |
| | | |
| | |
| | | $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); |
| | | } |
| | |
| | | $this->commonOrderData['is_use_points'] && $orderPayPrice = $orderPayPrice - $totalPointsMoney; |
| | | // 计算订单积分赠送数量 |
| | | $this->setOrderPointsBonus(); |
| | | // 计算订单消费券赠送数量 |
| | | $this->setOrderConsumptionBonus(); |
| | | |
| | | //订单数据 |
| | | $this->commonOrderData = array_merge([ |
| | |
| | | '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']), |
| | |
| | | // 减去积分抵扣金额 |
| | | 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); |
| | | } |
| | |
| | | return false; |
| | | } |
| | | // 计算订单商品实际抵扣的积分数量和金额 |
| | | $ProductDeduct = new ConsumptionDeductService($productList); |
| | | $ProductDeduct = new PointsDeductService($productList); |
| | | $ProductDeduct->setProductPoints($maxPointsNumCount, $actualPointsNum); |
| | | // 积分抵扣总金额 |
| | | $orderPointsMoney = helper::getArrayColumnSum($productList, 'points_money'); |
| | |
| | | |
| | | |
| | | /** |
| | | * 计算订单可用消费券抵扣 |
| | | */ |
| | | 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) |