| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278 |
- <?php
- namespace addons\ServeBonus\common\logic;
- use addons\CloudStock\common\models\CloudStockAgent;
- use addons\CloudStock\common\models\CloudStockPriceDifferenceUserTeamStatistics;
- use addons\ServeBonus\common\models\ServeBonus;
- use common\enums\AddonsEnum;
- use common\enums\StatusEnum;
- use common\enums\UpgradeEnum;
- use common\helpers\ArrayHelper;
- use common\helpers\FormatHelper;
- use common\models\common\UpgradeCondition;
- use common\models\statistics\UserStatistics;
- use common\models\user\UserPartitionRelationship;
- use common\models\user\UserTeamStatistics;
- use common\traits\ErrorTrait;
- use Exception;
- use yii;
- /**
- * Class ConditionUpgradeLogic
- * @Author: lun
- * @DateTime: 2023/4/4 0004 15:27
- * @Copyright: copyright (c) 2021 广东七件事集团
- * @package addons\ServeBonus\common\logic
- */
- class ConditionUpgradeLogic
- {
- use ErrorTrait;
- /**
- * 购物升级执行
- * 样式:execute(AddonsEnum::ADDONS_NAME_BOSS, (new AddonsBoss()), (new AddonsBossLevel()), $order);
- * @Author: lun
- * @DateTime: 2021/11/18 0018 16:56
- * @Copyright: copyright (c) 2021 广东七件事集团
- * @param $identity_desc - 用户身份描述
- * @param $identity_obj - 用户身份空对象
- * @param $level_obj - 用户权重空对象
- * @param $order
- * @param int $shopping_upgrade_uid 购物升级用户
- * @return bool | array
- */
- public function execute(string $identity_desc, object $identity_obj, object $level_obj, array $order, $shopping_upgrade_uid = 0)
- {
- try {
- //开启条件升级
- $mall_id = $order['mall_id'];
- $user_id = $order['user_id'];
- // 获取基础配置
- $configs = \Yii::$app->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;
- }
- }
|