services->setting->addons->get($mall_id, $identity_desc, 'basic'); $upgrade_user_id_arr = UserPartitionRelationship::getParentIdArr($user_id); if(empty($configs['is_open_level_limit']) || !empty($configs['is_open_level_limit']) && $user_id != $shopping_upgrade_uid) $upgrade_user_id_arr [] = $user_id;// 如果开启了逐级升级,并且购物升级就是本人则不能进行条件升级 $upgrade_user_id_arr = array_reverse($upgrade_user_id_arr); $model_list = $identity_obj::find()->where(['user_id' => $upgrade_user_id_arr, 'status' => StatusEnum::ENABLED])->indexBy('user_id')->all(); $model_arr = $upgrade_user_ids = []; foreach ($upgrade_user_id_arr as $id){ if(!isset($model_list[$id])){ } if(!empty($model_list[$id])) { $model_arr[] = $model_list[$id]; }else{ $model = new $identity_obj; $model->mall_id = $mall_id; $model->user_id = $id; $model->level = 0; $model->upgrade_level_at = 0; $model_arr[] = $model; } } $where = []; $where[] = ['mall_id' => $mall_id]; $where[] = ['status' => StatusEnum::ENABLED]; $params = []; if($configs && isset($configs['is_open_level_limit']) && !empty($configs['is_open_level_limit'])){ $params['order'] = 'level asc'; $is_open_level_limit = true; }else{ $params['order'] = 'level desc'; $is_open_level_limit = false; } $params['where'] = $where; $level_list = $level_obj::lists($params); if (empty($level_list)) return []; foreach ($model_arr as $identity) { $flag = false; $can_upgrade_level = 0; $upgrade_status = 0; $upgrade_level = 0;// 升级次数 if($level_list){ foreach ($level_list as $identity_level_arr) { // 当前权重大于或等于可以升级的权重则直接退出 if(!$is_open_level_limit && $identity->level >= $identity_level_arr['level']){ break; } if($is_open_level_limit && $identity->level >= $identity_level_arr['level']){ continue; } $can_upgrade_level = $identity_level_arr['level']; $upgrade_level ++; //开启条件升级 if ($identity_level_arr['upgrade_type_condition']&&$identity_level_arr['is_auto_upgrade']) { $upgrade_status = UpgradeEnum::UPGRADE_STATUS_CONDITION; $res = UpgradeCondition::check($identity->user_id, $identity_level_arr, $mall_id, $identity_level_arr['level'],$order['id']); if ($res) { $flag = true; break; } } } } if ($flag && $can_upgrade_level > $identity->level) { // 开启了逐级升级,跳级升级的用户无法升级 if($is_open_level_limit && $upgrade_level > 1) continue; $identity->level = $can_upgrade_level; $identity->upgrade_status = $upgrade_status; $identity->upgrade_level_at = time(); if (!$identity->save()) throw new Exception("{用户ID:$identity->user_id},订单ID:{$order['id']},". AddonsEnum::getAddonsNameMap($identity_desc) ."条件升级失败"); $upgrade_user_ids[] = $identity->user_id; } } return $upgrade_user_ids; } catch (Exception $e) { $exception = FormatHelper::exception($e, AddonsEnum::getAddonsNameMap($identity_desc) . "条件升级失败"); echo $exception; $this->setError($exception); Yii::error($exception); return false; } } public static function condition704($params) { $key = $params['key']; $arr = $params['arr']; $cloud_stock_level = $arr[$key]['value'][$params['condition_data'][$params['key']]['setting'][0]['name']]; $day_num = $arr[$key]['value'][$params['condition_data'][$params['key']]['setting'][1]['name']]; $line_num = $arr[$key]['value'][$params['condition_data'][$params['key']]['setting'][2]['name']]; $child_cloud_stock_level = $arr[$key]['value'][$params['condition_data'][$params['key']]['setting'][3]['name']]; $accumulated_performance = $arr[$key]['value'][$params['condition_data'][$params['key']]['setting'][4]['name']]; $max_accumulated_performance = $arr[$key]['value'][$params['condition_data'][$params['key']]['setting'][5]['name']]; $user_id = $params['user_id']; $agent = CloudStockAgent::findOne(['user_id' => $user_id, 'status' => StatusEnum::ENABLED, 'level' => $cloud_stock_level]); $is_bool = false; if (empty($agent)) { return $is_bool; } $upgrade_at = $agent['upgrade_at']; $end_at = $upgrade_at + 86400 * $day_num; $direct_user_ids = UserPartitionRelationship::getChildIdArr($user_id, 1, $upgrade_at, $end_at); if (count($direct_user_ids) < $line_num) { return $is_bool; } foreach ($direct_user_ids as $uid) { $child_user_ids = UserPartitionRelationship::getChildIdArr($uid, 0, $upgrade_at, $end_at); $child_user_ids[] = $uid; $count = CloudStockAgent::find()->where(['user_id' => $child_user_ids, 'status' => StatusEnum::ENABLED, 'level' => $child_cloud_stock_level]) ->count(); if (empty($count)) { return $is_bool; } } $self_performance = 0; $performance_arr = self::getTeamPerformance($direct_user_ids, $user_id, $self_performance); $max = array_pop($performance_arr); $max_money = $max['money'] ?? 0; $total_money = array_sum(array_column($performance_arr, 'money')); $max_accumulated_performance = $max_accumulated_performance * 10000; $accumulated_performance = $accumulated_performance * 10000; if ($max_money > $max_accumulated_performance) { $max_money = $max_accumulated_performance; } if (($total_money + $max_money + $self_performance) < $accumulated_performance) { return false; } return true; } public static function condition705($params) { $key = $params['key']; $arr = $params['arr']; $cloud_stock_level = $arr[$key]['value'][$params['condition_data'][$params['key']]['setting'][0]['name']]; $day_num = $arr[$key]['value'][$params['condition_data'][$params['key']]['setting'][1]['name']]; $line_num = $arr[$key]['value'][$params['condition_data'][$params['key']]['setting'][2]['name']]; $serve_bonus_level = $arr[$key]['value'][$params['condition_data'][$params['key']]['setting'][3]['name']]; $accumulated_performance = $arr[$key]['value'][$params['condition_data'][$params['key']]['setting'][4]['name']]; $max_accumulated_performance = $arr[$key]['value'][$params['condition_data'][$params['key']]['setting'][5]['name']]; $user_id = $params['user_id']; $agent = CloudStockAgent::findOne(['user_id' => $user_id, 'status' => StatusEnum::ENABLED, 'level' => $cloud_stock_level]); $is_bool = false; if (empty($agent)) { return $is_bool; } $upgrade_at = $agent['upgrade_at']; $end_at = $upgrade_at + 86400 * $day_num; $direct_user_ids = UserPartitionRelationship::getChildIdArr($user_id, 1, $upgrade_at, $end_at); if (count($direct_user_ids) < $line_num) { return $is_bool; } foreach ($direct_user_ids as $uid) { $child_user_ids = UserPartitionRelationship::getChildIdArr($uid, 0, $upgrade_at, $end_at); $child_user_ids[] = $uid; $count = ServeBonus::find()->where(['user_id' => $child_user_ids, 'status' => StatusEnum::ENABLED, 'level' => $serve_bonus_level]) ->count(); if (empty($count)) { return $is_bool; } } $self_performance = 0; $performance_arr = self::getTeamPerformance($direct_user_ids, $user_id, $self_performance); $max = array_pop($performance_arr); $max_money = $max['money'] ?? 0; $total_money = array_sum(array_column($performance_arr, 'money')); $max_accumulated_performance = $max_accumulated_performance * 10000; $accumulated_performance = $accumulated_performance * 10000; if ($max_money > $max_accumulated_performance) { $max_money = $max_accumulated_performance; } if (($total_money + $max_money + $self_performance) < $accumulated_performance) { return false; } return true; } protected static function getTeamPerformance($direct_user_ids, $user_id, &$self_performance) { $user_team_statistics_list = UserTeamStatistics::lists([ 'where' => [ ['user_id' => $direct_user_ids] ], 'index' => 'user_id' ]);//直推的团队业绩 $user_statistics_list = UserStatistics::lists([ 'where' => [ ['user_id' => array_merge($direct_user_ids, [$user_id])] ], 'index' => 'user_id' ]);//直推自己的业绩 $cloud_user_team_statistics_list = CloudStockPriceDifferenceUserTeamStatistics::lists([ 'where' => [ ['user_id' => array_merge($direct_user_ids, [$user_id])] ], 'index' => 'user_id' ]);//直推差价礼包业绩 $performance_arr = []; foreach ($direct_user_ids as $uid) { $pay_money = 0; if (isset($user_statistics_list[$uid])) { $pay_money += $user_statistics_list[$uid]['pay_money']; } if (isset($user_team_statistics_list[$uid])) { $pay_money += $user_team_statistics_list[$uid]['team_pay_selling_price']; } if (isset($cloud_user_team_statistics_list[$uid])) { $pay_money += $cloud_user_team_statistics_list[$uid]['team_pay_selling_price']; $pay_money += $cloud_user_team_statistics_list[$uid]['self_selling_price']; } $performance_arr[] = ['user_id' => $uid, 'money' => $pay_money]; } $performance_arr = ArrayHelper::arraySort($performance_arr, 'money'); if (isset($user_statistics_list[$user_id]['pay_money'])) { $self_performance = $user_statistics_list[$user_id]['pay_money']; } if (isset($cloud_user_team_statistics_list[$user_id]['self_selling_price'])) { $self_performance = $cloud_user_team_statistics_list[$user_id]['self_selling_price']; } return $performance_arr; } }