order = $order; $this->isFinish = $is_finish; } /** * 检测升级 * * @param MallOrder $order * @return void */ public function checkUpgrade(MallOrder $order, int $is_finish = 0) { /* // 触发购物升级 $order = $order->toArray(); $upgrade = new BuyGoodsUpgrade(); $buy_uid = $upgrade->execute( AddonsEnum::ADDONS_NAME_OPERATION_CENTER, (new UserCenter()), (new Level()), $order ); if (!empty($buy_uid)) $upgrade_uids[] = $buy_uid; // 触发条件升级 $cond_upgrade = new ConditionUpgrade(); $cond_uids = $cond_upgrade->execute( AddonsEnum::ADDONS_NAME_OPERATION_CENTER, (new UserCenter()), (new Level()), $order ); */ $this->initLevel($order, $is_finish); // 购买商品升级 $this->setUpgradeLevel( $this->checkBuyGoodsUpgrade(), UpgradeLog::GOODS ); // 满足条件升级 $this->setUpgradeLevel( $this->checkConditionUpgrade(), UpgradeLog::CONDITION ); $this->upgradeLevel(); } /** * 购买商品 * * @return Level|false */ public function checkBuyGoodsUpgrade() { $center = $this->order->center; if (empty($center)) return false; // 等级 $levels = $this->getLevels($center); // 订单详情 $details = $this->order->detail; foreach ($details as $detail) { foreach ($levels as $item) { /** * @var Level */ $item = $item; if ( // 开启自动升级 $item->hasUpgrade() && // 开启购物升级 $item->openGoodsUpgrade() && // 是否订单完成 或者支付完成 $item->buyGoodsType($this->isFinish) && // 是否指定商品 $item->isUpgradeGoods($detail->goods_id) ) { return $item; } } } return false; } /** * 条件 * * @return Level|false */ public function checkConditionUpgrade() { return false; } /** * @param UserCenter $center * @return array */ protected function getLevels(UserCenter $center) { if (!empty($this->levelList)) return $this->levelList; return Level::getLevelByGtLevel($this->mall_id, $center->level); } /** * 设置Level * * @param Level|false $level * @return void */ protected function setUpgradeLevel($level, int $type) { $this->upgradeLevel[$type] = $level; } /** * 获取升级 * * @return array */ protected function getUpgradeLevel() { $level = null; $type = null; foreach ($this->upgradeLevel as $level1) { foreach ($this->upgradeLevel as $type => $level2) { if ($level2 && ($level1 == false)) { $level = $level2; $type = $type; } if ($level2 && $level1 && $level2->level > $level1->level) { $level = $level2; $type = $type; } } } return [$level, $type]; } /** * 升级 * * @return void */ protected function upgradeLevel() { list($level, $type) = $this->getUpgradeLevel(); if ($level) { /** * @var UserCenter */ $center = $this->order->center; $t = Yii::$app->db->beginTransaction(); try { $center->setLevel($level); UpgradeLog::addUpgradeLog( $this->mall_id, $center->user_id, $level->id, $type ); } catch (Exception $e) { $t->rollBack(); Yii::error('升级失败, 订单ID: %s', $this->order->id); } $t->commit(); } } }