ChangePosLogic.php 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. <?php
  2. namespace addons\DoubleCopy\common\logic;
  3. use addons\DoubleCopy\common\enums\DoubleCopyEnum;
  4. use addons\DoubleCopy\common\models\DoubleCopyChangePos;
  5. use addons\DoubleCopy\common\models\DoubleCopyChangeTopid;
  6. use addons\DoubleCopy\common\models\DoubleCopyLevel;
  7. use addons\DoubleCopy\common\models\DoubleCopyUser;
  8. use common\enums\StatusEnum;
  9. use common\models\user\UserPartitionRelationship;
  10. use common\traits\ErrorTrait;
  11. use Yii;
  12. use yii\db\Exception;
  13. use yii\helpers\Json;
  14. /**
  15. * 二二复制修改位置
  16. * Class ChangePosLogic
  17. * @Author: lun
  18. * @DateTime: 2023/6/1 0001 17:28
  19. * @Copyright: copyright (c) 2021 广东七件事集团
  20. * @package addons\DoubleCopy\common\logic
  21. */
  22. class ChangePosLogic
  23. {
  24. use ErrorTrait;
  25. public $config;
  26. public $order;
  27. public $order_status;
  28. public static function handle($params)
  29. {
  30. // 读取数据
  31. $change = DoubleCopyChangePos::findOne(['id' => $params['id'], 'change_status' => StatusEnum::DISABLED, 'status' => StatusEnum::ENABLED]);
  32. if (empty($change)) return true;
  33. $mallId = $change['mall_id'];
  34. $change_arr = json_decode($change['content'], true);
  35. $trans = Yii::$app->db->beginTransaction();
  36. try {
  37. foreach ($change_arr as $item) {
  38. $user = DoubleCopyUser::find()->where(['user_id' => $item['user_id'], 'status' => StatusEnum::ENABLED])->one();// 用户1
  39. $user->pos = $item['now_pos'];
  40. if (!$user->save()) throw new Exception('用户ID='.$item['user_id'].'位置修改失败:' . $user->getErrorMessage());
  41. }
  42. $boss_level = DoubleCopyLevel::find()->select('upgrade_type_condition, checked_condition_values')->where(['mall_id' => $mallId, 'level' => DoubleCopyEnum::LEVEL_BOSS, 'status' => StatusEnum::ENABLED])->asArray()->one();
  43. $upgrade_num = 0;// 需要直推的升级数量
  44. if ($boss_level['upgrade_type_condition'] == 1) {
  45. // json解析升级条件数量
  46. $json = Json::decode($boss_level['checked_condition_values'], true);
  47. $upgrade_num = $json[0]['value']['val0'] ?? 0;
  48. }
  49. // topid修改
  50. foreach ($change_arr as $item) {
  51. $copy_user = DoubleCopyUser::findOne(['user_id' => $item['user_id'], 'status' => StatusEnum::ENABLED]);
  52. self::batchGetUsers($copy_user, $upgrade_num, $change->id);// 用户下级批量修改
  53. }
  54. // 修改完成
  55. $change->change_status = StatusEnum::ENABLED;
  56. if (!$change->save()) throw new Exception($change->getErrorMessage());
  57. $trans->commit();
  58. return true;
  59. } catch (\Exception $e) {
  60. $trans->rollBack();
  61. $reason = $e->getFile().',第'.$e->getLine().'行,原因:' . $e->getMessage();
  62. Yii::error('二二复制位置修改失败:' . $e->getFile().',第'.$e->getLine().'行,原因:' . $e->getMessage());
  63. }
  64. $change->change_status = StatusEnum::DELETE;// 失败
  65. $change->reason = $reason;
  66. $change->save();
  67. return true;
  68. }
  69. /**
  70. * 批量修改用户位置
  71. * @Author: lun
  72. * @DateTime: 2023/6/1 0001 18:44
  73. * @Copyright: copyright (c) 2021 广东七件事集团
  74. * @param DoubleCopyUser $changeUser
  75. * @param $upgrade_num
  76. * @param $change_pos_id
  77. */
  78. public static function batchGetUsers(DoubleCopyUser $changeUser, $upgrade_num, $change_pos_id)
  79. {
  80. $i = 1;
  81. $page_size = 1000;
  82. list($tree, $parent_deep, $all_tree, $all_tree_arr) = UserPartitionRelationship::getTree($changeUser->user_id);
  83. while ($child_list = UserPartitionRelationship::find()->where(['like', 'tree', $tree . '%', false])
  84. ->select('user_id')
  85. ->offset(($i - 1) * $page_size)->groupBy('user_id,deep')->limit($page_size)->all()) {
  86. foreach ($child_list as $item) {
  87. if ($item['user_id'] == $changeUser->user_id) {
  88. $user = $changeUser;
  89. } else {
  90. $user = DoubleCopyUser::findOne(['user_id' => $item['user_id'], 'status' => StatusEnum::ENABLED]);
  91. }
  92. if ($user) {
  93. self::updateTopId($user, $upgrade_num, $change_pos_id);
  94. }
  95. }
  96. $i++;
  97. }
  98. }
  99. /**
  100. *
  101. * @Author: lun
  102. * @DateTime: 2023/6/1 0001 18:22
  103. * @Copyright: copyright (c) 2021 广东七件事集团
  104. * @param DoubleCopyUser $user
  105. * @param $upgrade_num
  106. * @param $change_pos_id
  107. */
  108. public static function updateTopId(DoubleCopyUser $user, $upgrade_num, $change_pos_id)
  109. {
  110. $parent_ids = UserPartitionRelationship::getParentIdArr($user->user_id);
  111. $parent_ids = array_reverse($parent_ids);// 倒序数组
  112. array_unshift($parent_ids, $user->user_id);
  113. foreach ($parent_ids as $key => $pid) {
  114. // 查询上级是否有身份
  115. $pdc_user = DoubleCopyUser::find()->select('user_id,pos,pid')->where(['user_id' => $pid, 'status' => StatusEnum::ENABLED])->asArray()->one();
  116. if (empty($pdc_user)) {
  117. // 获取当前用户的上级uid
  118. $ppuid = $parent_ids[$key + 1] ?? 0;
  119. if ($ppuid) {
  120. // 统计跟此用户同级人数,并且判断当前用户的平级数量是否大于或等于2号位
  121. $equal_num = DoubleCopyUser::find()->where(['pid' => $ppuid, 'status' => StatusEnum::ENABLED])->count();
  122. if ($equal_num >= $upgrade_num) {// 符合位置则表示当前用户的上级必定是拿平台补贴用户(拿平台补贴用户可以没有身份)
  123. $topid = $ppuid;
  124. break;
  125. }
  126. }
  127. } else {
  128. // 如果当前位置是大于或等于3号位则表示此用户上级必定是老板
  129. if ($pdc_user['pos'] > $upgrade_num) {
  130. $topid = $pdc_user['pid'];
  131. break;
  132. }
  133. }
  134. $topid = $pid;
  135. }
  136. // 临时检测的平台补贴用户id跟之前不同则需要修改平台补贴用户id
  137. if ($user->topid != $topid) {
  138. $old_topid = $user->topid;
  139. $user->topid = $topid;
  140. $user->save();
  141. // 保存topid修改记录
  142. $res = DoubleCopyChangeTopid::setData([
  143. 'change_pos_id' => $change_pos_id,
  144. 'mall_id' => $user->mall_id,
  145. 'user_id' => $user->user_id,
  146. 'old_topid' => $old_topid,
  147. 'now_topid' => $topid,
  148. ]);
  149. if ($res == false) throw new \Exception(DoubleCopyChangeTopid::getStaticError());
  150. }
  151. }
  152. }