TimestampBehavior::class, 'attributes' => [ ActiveRecord::EVENT_BEFORE_INSERT => ['created_at'], ActiveRecord::EVENT_BEFORE_UPDATE => ['updated_at'] ] ] ]; } /** * @inheritdoc */ public function rules() { return [ [['store_id', 'user_id', 'is_send', 'type', 'type_id', 'created_at', 'updated_at', 'is_delete', 'send_time'], 'integer'], [['money'], 'number'], [['desc', 'remark'], 'string'], [['created_at', 'updated_at'], 'safe'] ]; } public function afterSave($insert, $changedAttributes) { parent::afterSave($insert, $changedAttributes); // TODO: Change the autogenerated stub $share_detail_arr = [ ShareDetail::TYPE_HOLDER_PROFIT, ShareDetail::TYPE_RANGE_PROFIT, ShareDetail::TYPE_TWO_PLUS_ONE_SHARE_PROFIT, ShareDetail::TYPE_TWO_PLUS_ONE_SHARE_TEAM_PROFIT, ShareDetail::TYPE_RANGE_PROFIT_OLD, ShareDetail::TYPE_TWO_PLUS_ONE_SHARE_TEAM_PROFIT_OLD, ShareDetail::TYPE_RANGE_PROFIT_OLD_USER_LEVEL ]; // if (in_array($this->type, $share_detail_arr) && intval($this->is_send)) { //// $this->handleChildData($this->user_id); // } } public static function handleChildData($id, $parent_id = 0) { //$t = \Yii::$app->db->beginTransaction(); // $user = User::findOne($user_id); // $parent_id = $user->old_parent_id; if (!$parent_id) { $share_detail = self::findOne($id); $parent_id = $share_detail->user_id; $store_id = $share_detail->store_id; } else { $user = User::findOne($parent_id); $store_id = $user->store_id; } $holder_level_list = ShareHolderLevel::find()->where([ 'is_delete' => 0, 'status' => 1, 'store_id' => $store_id, ])->all(); // 找出符合条件的等级 $current_level = null; foreach ($holder_level_list as $holder_level) { $condition = json_decode($holder_level->condition); if ((bool)$condition->shareholder->is_open && (int)$condition->shareholder->num > 0 && (bool)$condition->shareholder->independent_team ) { $current_level = $holder_level; break; } } if ($current_level == null) { return; } $share_detail_arr = [ ShareDetail::TYPE_HOLDER_PROFIT, ShareDetail::TYPE_RANGE_PROFIT, ShareDetail::TYPE_TWO_PLUS_ONE_SHARE_PROFIT, ShareDetail::TYPE_TWO_PLUS_ONE_SHARE_TEAM_PROFIT, ShareDetail::TYPE_RANGE_PROFIT_OLD, ShareDetail::TYPE_TWO_PLUS_ONE_SHARE_TEAM_PROFIT_OLD, ShareDetail::TYPE_RANGE_PROFIT_OLD_USER_LEVEL ]; //比如滑落设置为2 ,那么就是满2个人第三个人贡献了直推佣金后,放到第一个下级下面 //设置滑落数量时需要判断是否大于 可助力出局人数 $shareHolderChangeOldParentSwitch = Option::get('shareHolderChangeOldParentSwitch', $store_id, 'bonus_pool', 0)['value']; $shareHolderChangeOldParentNumber = Option::get('shareHolderChangeOldParentNumber', $store_id, 'bonus_pool', 0)['value']; $shareHolderChangeChildMinNumber = Option::get('shareHolderChangeChildMinNumber', $store_id, 'bonus_pool', 0)['value']; /*debug_log([ 'shareHolderChangeOldParentSwitch' => $shareHolderChangeOldParentSwitch, 'shareHolderChangeOldParentNumber' => $shareHolderChangeOldParentNumber, 'shareHolderChangeChildMinNumber' => $shareHolderChangeChildMinNumber ], 'user_new.log');*/ //设置滑落数量时需要判断是否大于 可助力出局人数 $condition = json_decode($current_level->condition, true); //设置滑落数量时需要判断是否大于 可助力出局人数 // if ($condition['shareholder']['num'] > $shareHolderChangeOldParentNumber) { // return; // } if (!intval($shareHolderChangeOldParentSwitch) || $shareHolderChangeOldParentNumber <= 1 || $shareHolderChangeOldParentNumber <= $shareHolderChangeChildMinNumber) { return; } $i = 0; reset: if ($i > $shareHolderChangeOldParentNumber) { return; } //查询真实id $real_child_id = User::find()->alias('u') ->leftJoin(['h' => ShareHolder::tableName()], 'u.id=h.user_id') ->where(['u.parent_id' => $parent_id, 'u.is_delete' => 0, 'h.is_delete' => 0, 'h.status' => 1])->andWhere('h.id is not null')->select('u.id')->column(); //查询自己下的所有历史下级 $query = UserTreePath::find()->alias('ut') ->leftJoin(['h' => ShareHolder::tableName()], 'ut.parent_id=h.user_id') ->where(['ut.parent_id' => $parent_id]) ->andWhere('h.id is not null') ->andWhere('ut.child_id != ut.parent_id') ->andWhere(['IN', 'ut.child_id', $real_child_id]) ->orderBy(['ut.created_at' => SORT_ASC]); /*debug_log([ 'sql' => $query->createCommand()->getRawSql() ], 'user_new.log');*/ $user_child = $query->asArray()->all(); $user_child = array_values($user_child); debug_log([ 'old_parent_id' => $parent_id, 'user_child' => $user_child, 'real_child' => $real_child_id ], 'user_new.log'); $old_child_id = array_column($user_child, 'child_id'); //判断自己下级是否超过三项 if (count($user_child) > $shareHolderChangeOldParentNumber) { //重新组合数据 便于遍历除前三项剩余的下级 $data = $user_child; foreach ($data as $old_index => $old_item) { if ($old_index < $shareHolderChangeOldParentNumber) { unset($data[$old_index]); continue; } } $data = array_values($data);//剩余的下级开始遍历分配上级 debug_log([ 'data' => $data ], 'user_new.log'); //判断第三项是否已经出局 $share_holder_3 = ShareHolder::findOne(['user_id' => $user_child[$i]['child_id'], 'is_delete' => 0]); debug_log([ 'share_holder_3_id' => $share_holder_3->id ], 'user_new.log'); if (!$share_holder_3) { ++$i; goto reset; } //未出局 //获取是自己发展的下级人数 $user_child_id_arr = User::find()->where(['old_parent_id' => $user_child[$i]['child_id'], 'is_delete' => 0]) ->select('id')->column(); /*debug_log([ 'user_child_id_arr' => $user_child_id_arr ], 'user_new.log');*/ $shareHolderParentOutQuery= ShareHolderParentOutLog::find() ->where([ 'change_type' => ShareHolderParentOutLog::CHANGE_TYPE_NORMAL, 'parent_user_id' => $user_child[$i]['child_id'], 'type' => 1, 'user_id' => $user_child_id_arr ]); /*debug_log([ 'shareHolderParentOutLogSql' => $shareHolderParentOutQuery->createCommand()->getRawSql() ], 'user_new.log');*/ $shareHolderParentOutLog = $shareHolderParentOutQuery->asArray()->count() ?? 0; /*debug_log([ 'shareHolderParentOutLog' => $shareHolderParentOutLog ], 'user_new.log');*/ foreach ($data as $d_item) { $user_ = User::findOne($d_item['child_id']); $beforeParentId = $user_->parent_id; $beforeOldParentId = $user_->old_parent_id; if ($user_) { //贡献了直推佣金后,放到第一个下级下面 $share_detail = ShareDetail::find()->alias('sd') ->leftJoin(['o' => Order::tableName()], 'o.id = sd.type_id') ->where(['o.user_id' => $d_item['child_id'], 'sd.type' => $share_detail_arr, 'sd.user_id' => $user_->old_parent_id]) ->asArray()->one(); if (!$share_detail) { continue; } //获取下级人数 $user_child_count = User::find()->where(['old_parent_id' => $user_child[$i]['child_id'], 'is_delete' => 0]) ->select('id')->count(); /*debug_log([ 'new_user_count' => $user_child_count ], 'user_new.log');*/ if ($user_child_count >= $shareHolderChangeOldParentNumber) { self::handleChildData(0, $user_child[$i]['child_id']); ++$i; goto reset; } //判断下级人数是否符合滑落需求 if (($shareHolderParentOutLog < $shareHolderChangeChildMinNumber && ($shareHolderChangeChildMinNumber + $user_child_count) >= $shareHolderChangeOldParentNumber)) { self::handleChildData(0, $user_child[$i]['child_id']); ++$i; goto reset; } // 2 if ($shareHolderChangeChildMinNumber <= $shareHolderParentOutLog) {//0 < 1 $count = $condition['shareholder']['num'] - $user_child_count; if ($count > 0) { $user_->old_parent_id = $user_child[$i]['child_id']; $user_->parent_id = $user_child[$i]['child_id']; $user_->save(); $result = \app\utils\Share\BonusPool::addShareHolderParentOutLog($user_, $beforeOldParentId, ShareHolderParentOutLog::getConditionName(101), 1, ShareHolderParentOutLog::CHANGE_TYPE_CHANGE_OLD_PARENT); $result = \app\utils\Share\BonusPool::addShareHolderParentOutLog($user_, $beforeParentId, ShareHolderParentOutLog::getConditionName(101), 0, ShareHolderParentOutLog::CHANGE_TYPE_CHANGE_OLD_PARENT); } //检测是否可以出局 BonusPool::checkChildHolderUpdateLevel($d_item['child_id']); } else { if ($user_child_count - $condition['shareholder']['num'] >= 0) {//2 3 //检测是否可以出局 BonusPool::checkChildHolderUpdateLevel($d_item['child_id']); } else {//3 2 1 $count = $condition['shareholder']['num'] - $shareHolderChangeChildMinNumber; if ($count > 0) {//2 > 2 $user_->old_parent_id = $user_child[$i]['child_id']; $user_->parent_id = $user_child[$i]['child_id']; $user_->save(); $result = \app\utils\Share\BonusPool::addShareHolderParentOutLog($user_, $beforeOldParentId, ShareHolderParentOutLog::getConditionName(101), 1, ShareHolderParentOutLog::CHANGE_TYPE_CHANGE_OLD_PARENT); $result = \app\utils\Share\BonusPool::addShareHolderParentOutLog($user_, $beforeParentId, ShareHolderParentOutLog::getConditionName(101), 0, ShareHolderParentOutLog::CHANGE_TYPE_CHANGE_OLD_PARENT); //检测是否可以出局 BonusPool::checkChildHolderUpdateLevel($d_item['child_id']); } } } $user_share_holder_ = ShareHolder::findOne(['user_id' => $user_->id, 'status' => 1, 'is_delete' => 0]); if (intval($user_share_holder_->is_out)) { ++$i; goto reset; } } } } //$t->rollBack(); } }