db->beginTransaction(); try { $user_relationship_log = UserRelationshipLog::find()->where(['user_id' => $user_id])->orderBy('id desc')->one(); if (empty($user_relationship_log)) { return; } $grant = AchievementGrantLog::findOne(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'is_wait' => 0, 'is_create' => 0]); $new_parent_id = $user_relationship_log->after_id;//修改后的上级id $old_parent_id = $user_relationship_log->before_id;//修改前的上级id $old_parent_id_arr = UserPartitionRelationship::getParentIdArr($old_parent_id); $old_parent_id_arr[] = $old_parent_id; $old_parent_id_arr = array_reverse($old_parent_id_arr); $res = self::changeParentTeam($user_id, $grant); if ($res == false) {//修改关系链的会员不是团长,需要修改他的下级的上级团长id self::userNoTeamsChangeParentTeam($user_id, $grant, $old_parent_id_arr); } self::changeParentTeamByEmpty($grant['id']); $grant->award_proportion = json_decode($grant['award_proportion'], true); AchievementLogic::fixParentAchievement($grant, $old_parent_id); AchievementLogic::fixParentAchievement($grant, $new_parent_id); $grant['award_proportion'] = json_encode($grant['award_proportion']); AchievementOrderLogic::updateGrant($grant); $t->commit(); return true; } catch (\Exception $e) { $t->rollBack(); var_dump($e->getMessage() . $e->getFile() . $e->getLine()); return true; } } /** * 修改关系链的会员不是团长,且有业绩,,修改后,需要修正他的上级团长id * * @param $user_id * @param $grant * @return bool */ public static function changeParentTeam($user_id, $grant) { $award_log = AchievementAwardLog::getOne([ ['user_id' => $user_id], ['grant_id' => $grant['id']], ['status' => StatusEnum::ENABLED], ]); if (empty($award_log)) { return false; } $award_log->parent_team = AchievementLogic::getParentAchievementUser($user_id); $award_log->save(); return true; } /** * 修改关系链的会员不是团长,但是他的下级们是团长,且有业绩,而他的所有上级们有些是团长,修改后,需要修正他们的上级团长id * * @param $user_id * @param $grant * @param $old_parent_id_arr * @return array|void */ public static function userNoTeamsChangeParentTeam($user_id, $grant, $old_parent_id_arr) { $grant_id = $grant['id']; $old_parent_achievement_award_log_list_sort = self::getParentAchievementAwardLogListSort($grant_id, $old_parent_id_arr); if (empty($old_parent_achievement_award_log_list_sort)) { return; } $old_parent_id = $old_parent_achievement_award_log_list_sort[0]['user_id']; $child_achievement_award_log_list = AchievementAwardLog::lists([ 'where' => [ ['parent_team' => $old_parent_id], ['grant_id' => $grant_id], ['status' => StatusEnum::ENABLED], ], ], false); if (empty($child_achievement_award_log_list)) { return; } foreach ($child_achievement_award_log_list as $k => $log) { $temp_parent_id_arr = UserPartitionRelationship::getParentIdArr($log->user_id); if (!in_array($user_id, $temp_parent_id_arr)) { unset($child_achievement_award_log_list[$k]); } } if (empty($child_achievement_award_log_list)) { return; } foreach ($child_achievement_award_log_list as $log) { $log->parent_team = AchievementLogic::getParentAchievementUser($log['user_id']); $log->save(); } return; } /** * 修改前,修改关系链的会员不是团长,但是他的下级们是团长,且有业绩,而他的所有上级们都不是团长,修改后,需要修正他们的上级团长id * @param $grant_id * @return void */ public static function changeParentTeamByEmpty($grant_id) { $achievement_award_log_list = AchievementAwardLog::lists([ 'where' => [ ['parent_team' => ''], ['grant_id' => $grant_id], ['status' => StatusEnum::ENABLED], ], ], false); if (empty($achievement_award_log_list)) { return; } foreach ($achievement_award_log_list as $log) { $log->parent_team = AchievementLogic::getParentAchievementUser($log['user_id']); $log->save(); } return; } /** * @desc:获取父级团长业绩奖励记录,排序后 * * @param $grant_id * @param $parent_id_arr * @return array */ public static function getParentAchievementAwardLogListSort($grant_id, $parent_id_arr) { $achievement_award_log_list = AchievementAwardLog::lists([ 'where' => [ ['user_id' => $parent_id_arr], ['grant_id' => $grant_id], ['status' => StatusEnum::ENABLED], ], 'index' => 'user_id' ], false); if (empty($achievement_award_log_list)) { return []; //旧上级没有本周期的业绩奖励记录 } $achievement_award_log_list_sort = []; foreach ($parent_id_arr as $pid) { if (isset($achievement_award_log_list[$pid])) { $achievement_award_log_list_sort[] = $achievement_award_log_list[$pid]; } } return $achievement_award_log_list_sort; } }