'app\common\model\order\Order', ]; // 模型 private $model; /* @var UserModel $model */ private $UserModel; private $supplierModel; /** * 构造方法 */ public function __construct($orderType = OrderTypeEnum::MASTER) { $this->orderType = $orderType; $this->model = $this->getOrderModel(); $this->UserModel = new UserModel; $this->supplierModel = new SupplierModel(); } /** * 初始化订单模型类 */ private function getOrderModel() { $class = $this->orderModelClass[$this->orderType]; return new $class; } /** * 执行订单完成后的操作 */ public function complete($orderList, $appId) { // 已完成订单结算 // 条件:后台订单流程设置 - 已完成订单设置0天不允许申请售后 if (SettingModel::getItem('trade', $appId)['order']['refund_days'] == 0) { $this->settled($orderList); } // 发放分销商佣金,发放团队分红 foreach ($orderList as $order) { AgentOrderModel::grantMoney($order, $this->orderType); // 发放团队分红 by yj TeamOrderModel::grantMoney($order, $this->orderType); // 发放会员分红 VipOrderModel::grantMoney($order); //发放分红 BonusOrderModel::grantMoney($order, $this->orderType); // 生成区域代理订单 by yj RegionOrderModel::createOrder($order); // 生成股东分红订单 by yj ShareholderOrderModel::createOrder($order); // 更新队长等级 by yj event('TeamUserGrade', $order['user_id']); event('VipUserGrade', $order['user_id']); if (ShareholderSettingModel::getItem('basic')['self_buy_money']) { // 更新股东等级 by lyzflash $shareholderModel = new ShareholderApplyModel; $shareholderModel->becomeShareholderByTeam($order['user_id'], 70, $order['app_id']); event('ShareholderUserGrade', $order['user_id']); } } return true; } /** * 执行订单结算 */ public function settled($orderList) { // 订单id集 $orderIds = helper::getArrayColumn($orderList, 'order_id'); // 累积用户实际消费金额 $this->setIncUserExpend($orderList); // 处理订单赠送的积分 $this->setGiftPointsBonus($orderList); // 将订单设置为已结算 $this->model->onBatchUpdate($orderIds, ['is_settled' => 1,'settled_time' => time(),'is_settled_team' => 1]); // 供应商结算 $this->setIncSupplierMoney($orderList); // 用户实际消费金额兑换成积分 $this->setIncUserPoints($orderList); return true; } /** * 供应商金额=支付金额-运费 */ private function setIncSupplierMoney($orderList) { // 计算并累积实际消费金额(需减去售后退款的金额) $supplierData = []; $supplierCapitalData = []; // 订单结算记录 $orderSettledData = []; foreach ($orderList as $order) { if($order['shop_supplier_id'] == 0){ continue; } if($order['supplier_money'] == 0){ continue; } // 供应价格+运费 $supplierMoney = $order['supplier_money']; $sysMoney = $order['sys_money']; // B2b模式,如果有参与分销,减去分销的佣金 // 商城设置 $settings = Setting::getItem('store'); $refundSupplierMoney = 0; $refundSysMoney = 0; // 减去订单退款的金额 foreach ($order['product'] as $product) { if ( !empty($product['refund']) && $product['refund']['type']['value'] == 10 // 售后类型:退货退款 && $product['refund']['is_agree']['value'] == 10 // 商家审核:已同意 ) { $supplierMoney -= $product['supplier_money']; $sysMoney -= $product['sys_money']; $refundSupplierMoney += $product['supplier_money']; $refundSysMoney += $product['sys_money']; } } // 分销佣金,只要未失效,都算结算,不管后续是否有退款,因此结算时间设置要注意 $agentOrder = AgentOrderModel::getDetailByOrderId($order['order_id'], OrderTypeEnum::MASTER); $agentMoney = 0; if(!empty($agentOrder) && $agentOrder['is_invalid'] == 0){ $agentMoney = $agentOrder['first_money'] + $agentOrder['second_money'] + $agentOrder['third_money']; $supplierMoney -= $agentMoney; } // 团队分红,只要未失效,都算结算,不管后续是否有退款,因此结算时间设置要注意 $teamOrder = TeamOrderModel::getDetailByOrderId($order['order_id'], OrderTypeEnum::MASTER); $teamMoney = 0; if(!empty($teamOrder)){ foreach($teamOrder as $v){ if($v['is_invalid'] == 0){ $teamTemMoney = $v['first_money'] + $v['second_money'] + $v['third_money'] + $v['bonus_money']; $teamMoney += $teamTemMoney; } } $supplierMoney -= $teamMoney; } // 获取区域分红金额 $regionOrder = RegionOrderModel::getDetailByOrderId($order['order_id'], OrderTypeEnum::MASTER); $regionMoney = 0; if(!empty($regionOrder)){ foreach($regionOrder as $v){ if($v['is_invalid'] == 0){ $regionTemMoney = RegionBonusModel::getBonusPriceByBonusId($v["bonus_id"]); $regionMoney += $regionTemMoney; } } $supplierMoney -= $regionMoney; } // 获取股东分红金额 $shareholderOrder = ShareholderOrderModel::getDetailByOrderId($order['order_id'], OrderTypeEnum::MASTER); $shareholderMoney = 0; if(!empty($shareholderOrder)){ foreach($shareholderOrder as $v){ if($v['is_invalid'] == 0){ $shareholderTemMoney = ShareholderBonusModel::getBonusPriceByBonusId($v["bonus_id"]); $shareholderMoney += $shareholderTemMoney; } } $supplierMoney -= $shareholderMoney; } //扣减门店提成,配送费 2021-11-19确定需求,暂不扣减 // $StoreOrder=StoreOrderModel::detail($order['order_id']); // if(!empty($StoreOrder)){ // $supplierMoney -= $StoreOrder['commission']; // $supplierMoney -= $StoreOrder['delivery_fee']; // } !isset($supplierData[$order['shop_supplier_id']]) && $supplierData[$order['shop_supplier_id']] = 0.00; $supplierMoney > 0 && $supplierData[$order['shop_supplier_id']] += $supplierMoney; $orderSettledData[] = [ 'order_id' => $order['order_id'], 'shop_supplier_id' => $order['shop_supplier_id'], 'order_money' => $order['order_price'], 'pay_money' => $order['pay_price'], 'express_money' => $order['express_price'], 'supplier_money' => $order['supplier_money'], 'real_supplier_money' => $supplierMoney, 'sys_money' => $order['sys_money'], 'real_sys_money' => $sysMoney, 'agent_money' => $agentMoney, 'team_money' => $teamMoney, 'region_money' => $regionMoney, 'shareholder_money' => $shareholderMoney, 'refund_money' => $refundSupplierMoney + $refundSysMoney, 'refund_supplier_money' => $refundSupplierMoney, 'refund_sys_money' => $refundSysMoney, 'app_id' => $order['app_id'] ]; // 商家结算记录 $supplierCapitalData[] = [ 'shop_supplier_id' => $order['shop_supplier_id'], 'money' => $supplierMoney, 'describe' => '订单结算,订单号:' . $order['order_no'], 'app_id' => $order['app_id'] ]; } // 累积到供应商表记录 $this->supplierModel->onBatchIncSupplierMoney($supplierData); // 修改平台结算金额 (new OrderSettledModel())->saveAll($orderSettledData); // 供应商结算明细金额 (new SupplierCapitalModel())->saveAll($supplierCapitalData); return true; } /** * 处理订单赠送的积分 */ private function setGiftPointsBonus($orderList) { // 计算用户所得积分 $userData = []; $logData = []; foreach ($orderList as $order) { // 计算用户所得积分 $pointsBonus = $order['points_bonus']; if ($pointsBonus <= 0) continue; // 减去订单退款的积分 foreach ($order['product'] as $product) { if ( !empty($product['refund']) && $product['refund']['type']['value'] == 10 // 售后类型:退货退款 && $product['refund']['is_agree']['value'] == 10 // 商家审核:已同意 ) { $pointsBonus -= $product['points_bonus']; } } // 计算用户所得积分 !isset($userData[$order['user_id']]) && $userData[$order['user_id']] = 0; $userData[$order['user_id']] += $pointsBonus; // 整理用户积分变动明细 $logData[] = [ 'user_id' => $order['user_id'], 'value' => $pointsBonus, 'describe' => "订单赠送:{$order['order_no']}", 'app_id' => $order['app_id'], ]; } if (!empty($userData)) { // 累积到会员表记录 $this->UserModel->onBatchIncPoints($userData); // 批量新增积分明细记录 (new PointsLogModel)->onBatchAdd($logData); } return true; } /** * 累积用户实际消费金额 */ private function setIncUserExpend($orderList) { // 计算并累积实际消费金额(需减去售后退款的金额) $userData = []; foreach ($orderList as $order) { // 订单实际支付金额 $expendMoney = $order['pay_price']; // 减去订单退款的金额 foreach ($order['product'] as $product) { if ( !empty($product['refund']) && $product['refund']['type']['value'] == 10 // 售后类型:退货退款 && $product['refund']['is_agree']['value'] == 10 // 商家审核:已同意 ) { $expendMoney -= $product['refund']['refund_money']; } } !isset($userData[$order['user_id']]) && $userData[$order['user_id']] = 0.00; $expendMoney > 0 && $userData[$order['user_id']] += $expendMoney; } // 累积到会员表记录 $this->UserModel->onBatchIncExpendMoney($userData); return true; } /** * 用户实际消费金额兑换成积分 */ private function setIncUserPoints($orderList) { // 计算并累积实际消费金额(需减去售后退款的金额) foreach ($orderList as $order) { // 订单实际支付金额 $expendMoney = $order['pay_price']; if($expendMoney == 0){ continue;//没有支付金额则没有积分 } $user = UserModel::detail($order['user_id']); if(empty($user["grade"]) || (!empty($user["grade"]) && empty($user["grade"]["exchange_rate"]))){ continue;//该等级没有设置积分兑换比例 } // 减去订单退款的金额 foreach ($order['product'] as $product) { if ( !empty($product['refund']) && $product['refund']['type']['value'] == 10 // 售后类型:退货退款 && $product['refund']['is_agree']['value'] == 10 // 商家审核:已同意 ) { $expendMoney -= $product['refund']['refund_money']; } } // 消费金额赠送积分 if($expendMoney > 0 && $user["grade"]["exchange_rate"] > 0){ $give_points = $expendMoney * $user["grade"]["exchange_rate"]; $user->setIncPoints($give_points, '消费金额兑换成积分', 0, false); } } return true; } }