$params['id'], 'change_status' => StatusEnum::DISABLED, 'status' => StatusEnum::ENABLED]); if (empty($change)) return true; $mallId = $change['mall_id']; $change_arr = json_decode($change['content'], true); $trans = Yii::$app->db->beginTransaction(); try { foreach ($change_arr as $item) { $user = DoubleCopyUser::find()->where(['user_id' => $item['user_id'], 'status' => StatusEnum::ENABLED])->one();// 用户1 $user->pos = $item['now_pos']; if (!$user->save()) throw new Exception('用户ID='.$item['user_id'].'位置修改失败:' . $user->getErrorMessage()); } $boss_level = DoubleCopyLevel::find()->select('upgrade_type_condition, checked_condition_values')->where(['mall_id' => $mallId, 'level' => DoubleCopyEnum::LEVEL_BOSS, 'status' => StatusEnum::ENABLED])->asArray()->one(); $upgrade_num = 0;// 需要直推的升级数量 if ($boss_level['upgrade_type_condition'] == 1) { // json解析升级条件数量 $json = Json::decode($boss_level['checked_condition_values'], true); $upgrade_num = $json[0]['value']['val0'] ?? 0; } // topid修改 foreach ($change_arr as $item) { $copy_user = DoubleCopyUser::findOne(['user_id' => $item['user_id'], 'status' => StatusEnum::ENABLED]); self::batchGetUsers($copy_user, $upgrade_num, $change->id);// 用户下级批量修改 } // 修改完成 $change->change_status = StatusEnum::ENABLED; if (!$change->save()) throw new Exception($change->getErrorMessage()); $trans->commit(); return true; } catch (\Exception $e) { $trans->rollBack(); $reason = $e->getFile().',第'.$e->getLine().'行,原因:' . $e->getMessage(); Yii::error('二二复制位置修改失败:' . $e->getFile().',第'.$e->getLine().'行,原因:' . $e->getMessage()); } $change->change_status = StatusEnum::DELETE;// 失败 $change->reason = $reason; $change->save(); return true; } /** * 批量修改用户位置 * @Author: lun * @DateTime: 2023/6/1 0001 18:44 * @Copyright: copyright (c) 2021 广东七件事集团 * @param DoubleCopyUser $changeUser * @param $upgrade_num * @param $change_pos_id */ public static function batchGetUsers(DoubleCopyUser $changeUser, $upgrade_num, $change_pos_id) { $i = 1; $page_size = 1000; list($tree, $parent_deep, $all_tree, $all_tree_arr) = UserPartitionRelationship::getTree($changeUser->user_id); while ($child_list = UserPartitionRelationship::find()->where(['like', 'tree', $tree . '%', false]) ->select('user_id') ->offset(($i - 1) * $page_size)->groupBy('user_id,deep')->limit($page_size)->all()) { foreach ($child_list as $item) { if ($item['user_id'] == $changeUser->user_id) { $user = $changeUser; } else { $user = DoubleCopyUser::findOne(['user_id' => $item['user_id'], 'status' => StatusEnum::ENABLED]); } if ($user) { self::updateTopId($user, $upgrade_num, $change_pos_id); } } $i++; } } /** * * @Author: lun * @DateTime: 2023/6/1 0001 18:22 * @Copyright: copyright (c) 2021 广东七件事集团 * @param DoubleCopyUser $user * @param $upgrade_num * @param $change_pos_id */ public static function updateTopId(DoubleCopyUser $user, $upgrade_num, $change_pos_id) { $parent_ids = UserPartitionRelationship::getParentIdArr($user->user_id); $parent_ids = array_reverse($parent_ids);// 倒序数组 array_unshift($parent_ids, $user->user_id); foreach ($parent_ids as $key => $pid) { // 查询上级是否有身份 $pdc_user = DoubleCopyUser::find()->select('user_id,pos,pid')->where(['user_id' => $pid, 'status' => StatusEnum::ENABLED])->asArray()->one(); if (empty($pdc_user)) { // 获取当前用户的上级uid $ppuid = $parent_ids[$key + 1] ?? 0; if ($ppuid) { // 统计跟此用户同级人数,并且判断当前用户的平级数量是否大于或等于2号位 $equal_num = DoubleCopyUser::find()->where(['pid' => $ppuid, 'status' => StatusEnum::ENABLED])->count(); if ($equal_num >= $upgrade_num) {// 符合位置则表示当前用户的上级必定是拿平台补贴用户(拿平台补贴用户可以没有身份) $topid = $ppuid; break; } } } else { // 如果当前位置是大于或等于3号位则表示此用户上级必定是老板 if ($pdc_user['pos'] > $upgrade_num) { $topid = $pdc_user['pid']; break; } } $topid = $pid; } // 临时检测的平台补贴用户id跟之前不同则需要修改平台补贴用户id if ($user->topid != $topid) { $old_topid = $user->topid; $user->topid = $topid; $user->save(); // 保存topid修改记录 $res = DoubleCopyChangeTopid::setData([ 'change_pos_id' => $change_pos_id, 'mall_id' => $user->mall_id, 'user_id' => $user->user_id, 'old_topid' => $old_topid, 'now_topid' => $topid, ]); if ($res == false) throw new \Exception(DoubleCopyChangeTopid::getStaticError()); } } }