AchievementUserChangeRelationshipLogic.php 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. <?php
  2. namespace addons\Achievement\common\logic;
  3. use addons\Achievement\common\models\AchievementAwardLog;
  4. use addons\Achievement\common\models\AchievementGrantLog;
  5. use common\enums\StatusEnum;
  6. use common\models\user\UserPartitionRelationship;
  7. use common\models\user\UserRelationshipLog;
  8. /**
  9. * 修改关系链后,修正旧上级和新上级们的团队业绩
  10. *
  11. */
  12. class AchievementUserChangeRelationshipLogic
  13. {
  14. /**
  15. * 处理开始入口
  16. *
  17. * @param $mall_id
  18. * @param $user_id
  19. * @return true|void
  20. */
  21. public static function handle($mall_id, $user_id)
  22. {
  23. $t = \Yii::$app->db->beginTransaction();
  24. try {
  25. $user_relationship_log = UserRelationshipLog::find()->where(['user_id' => $user_id])->orderBy('id desc')->one();
  26. if (empty($user_relationship_log)) {
  27. return;
  28. }
  29. $grant = AchievementGrantLog::findOne(['mall_id' => $mall_id, 'status' => StatusEnum::ENABLED, 'is_wait' => 0, 'is_create' => 0]);
  30. $new_parent_id = $user_relationship_log->after_id;//修改后的上级id
  31. $old_parent_id = $user_relationship_log->before_id;//修改前的上级id
  32. $old_parent_id_arr = UserPartitionRelationship::getParentIdArr($old_parent_id);
  33. $old_parent_id_arr[] = $old_parent_id;
  34. $old_parent_id_arr = array_reverse($old_parent_id_arr);
  35. $res = self::changeParentTeam($user_id, $grant);
  36. if ($res == false) {//修改关系链的会员不是团长,需要修改他的下级的上级团长id
  37. self::userNoTeamsChangeParentTeam($user_id, $grant, $old_parent_id_arr);
  38. }
  39. self::changeParentTeamByEmpty($grant['id']);
  40. $grant->award_proportion = json_decode($grant['award_proportion'], true);
  41. AchievementLogic::fixParentAchievement($grant, $old_parent_id);
  42. AchievementLogic::fixParentAchievement($grant, $new_parent_id);
  43. $grant['award_proportion'] = json_encode($grant['award_proportion']);
  44. AchievementOrderLogic::updateGrant($grant);
  45. $t->commit();
  46. return true;
  47. } catch (\Exception $e) {
  48. $t->rollBack();
  49. var_dump($e->getMessage() . $e->getFile() . $e->getLine());
  50. return true;
  51. }
  52. }
  53. /**
  54. * 修改关系链的会员不是团长,且有业绩,,修改后,需要修正他的上级团长id
  55. *
  56. * @param $user_id
  57. * @param $grant
  58. * @return bool
  59. */
  60. public static function changeParentTeam($user_id, $grant)
  61. {
  62. $award_log = AchievementAwardLog::getOne([
  63. ['user_id' => $user_id],
  64. ['grant_id' => $grant['id']],
  65. ['status' => StatusEnum::ENABLED],
  66. ]);
  67. if (empty($award_log)) {
  68. return false;
  69. }
  70. $award_log->parent_team = AchievementLogic::getParentAchievementUser($user_id);
  71. $award_log->save();
  72. return true;
  73. }
  74. /**
  75. * 修改关系链的会员不是团长,但是他的下级们是团长,且有业绩,而他的所有上级们有些是团长,修改后,需要修正他们的上级团长id
  76. *
  77. * @param $user_id
  78. * @param $grant
  79. * @param $old_parent_id_arr
  80. * @return array|void
  81. */
  82. public static function userNoTeamsChangeParentTeam($user_id, $grant, $old_parent_id_arr)
  83. {
  84. $grant_id = $grant['id'];
  85. $old_parent_achievement_award_log_list_sort = self::getParentAchievementAwardLogListSort($grant_id, $old_parent_id_arr);
  86. if (empty($old_parent_achievement_award_log_list_sort)) {
  87. return;
  88. }
  89. $old_parent_id = $old_parent_achievement_award_log_list_sort[0]['user_id'];
  90. $child_achievement_award_log_list = AchievementAwardLog::lists([
  91. 'where' => [
  92. ['parent_team' => $old_parent_id],
  93. ['grant_id' => $grant_id],
  94. ['status' => StatusEnum::ENABLED],
  95. ],
  96. ], false);
  97. if (empty($child_achievement_award_log_list)) {
  98. return;
  99. }
  100. foreach ($child_achievement_award_log_list as $k => $log) {
  101. $temp_parent_id_arr = UserPartitionRelationship::getParentIdArr($log->user_id);
  102. if (!in_array($user_id, $temp_parent_id_arr)) {
  103. unset($child_achievement_award_log_list[$k]);
  104. }
  105. }
  106. if (empty($child_achievement_award_log_list)) {
  107. return;
  108. }
  109. foreach ($child_achievement_award_log_list as $log) {
  110. $log->parent_team = AchievementLogic::getParentAchievementUser($log['user_id']);
  111. $log->save();
  112. }
  113. return;
  114. }
  115. /**
  116. * 修改前,修改关系链的会员不是团长,但是他的下级们是团长,且有业绩,而他的所有上级们都不是团长,修改后,需要修正他们的上级团长id
  117. * @param $grant_id
  118. * @return void
  119. */
  120. public static function changeParentTeamByEmpty($grant_id)
  121. {
  122. $achievement_award_log_list = AchievementAwardLog::lists([
  123. 'where' => [
  124. ['parent_team' => ''],
  125. ['grant_id' => $grant_id],
  126. ['status' => StatusEnum::ENABLED],
  127. ],
  128. ], false);
  129. if (empty($achievement_award_log_list)) {
  130. return;
  131. }
  132. foreach ($achievement_award_log_list as $log) {
  133. $log->parent_team = AchievementLogic::getParentAchievementUser($log['user_id']);
  134. $log->save();
  135. }
  136. return;
  137. }
  138. /**
  139. * @desc:获取父级团长业绩奖励记录,排序后
  140. *
  141. * @param $grant_id
  142. * @param $parent_id_arr
  143. * @return array
  144. */
  145. public static function getParentAchievementAwardLogListSort($grant_id, $parent_id_arr)
  146. {
  147. $achievement_award_log_list = AchievementAwardLog::lists([
  148. 'where' => [
  149. ['user_id' => $parent_id_arr],
  150. ['grant_id' => $grant_id],
  151. ['status' => StatusEnum::ENABLED],
  152. ],
  153. 'index' => 'user_id'
  154. ], false);
  155. if (empty($achievement_award_log_list)) {
  156. return []; //旧上级没有本周期的业绩奖励记录
  157. }
  158. $achievement_award_log_list_sort = [];
  159. foreach ($parent_id_arr as $pid) {
  160. if (isset($achievement_award_log_list[$pid])) {
  161. $achievement_award_log_list_sort[] = $achievement_award_log_list[$pid];
  162. }
  163. }
  164. return $achievement_award_log_list_sort;
  165. }
  166. }