UserTreePath.php 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. <?php
  2. /**
  3. * 厦门云联储网络科技有限公司
  4. * https://www.baokuaiyun.com
  5. * Copyright (c) 2023 爆块云 All rights reserved.
  6. */
  7. namespace app\models;
  8. use app\librarys\shareTree\models\AbstractTreePath;
  9. use app\models\userTreeQuery\UserTreePathQuery;
  10. /**
  11. * @property int $parent_id
  12. * @property int $child_id
  13. * @property int $nearest_parent_id
  14. * @property int $parent_level
  15. * @property int $child_level
  16. * @property string $created_at
  17. */
  18. class UserTreePath extends AbstractTreePath
  19. {
  20. public static $team_num;
  21. public static $team_count;
  22. /**
  23. * @inheritDoc
  24. */
  25. public static function tableName(): string
  26. {
  27. return '{{%user_tree_path}}';
  28. }
  29. /**
  30. * @inheritdoc
  31. * @return UserTreePathQuery the active query used by this AR class.
  32. */
  33. public static function find(): UserTreePathQuery
  34. {
  35. return new UserTreePathQuery(get_called_class());
  36. }
  37. /**
  38. * 格式化数据
  39. * @param $array
  40. * @return array
  41. */
  42. public static function formatChildren(array $array, $user_id) {
  43. if (empty($array)) {
  44. return $array;
  45. }
  46. // TODO: 可以添加其他逻辑
  47. $format_data = [];
  48. foreach ($array as $v) {
  49. $saas_user = SaasUser::findOne(['mobile' => $v['binding']]);
  50. $order = Order::find()->where(['store_id' => $v['store_id'], 'is_pay' => 1, 'trade_status' => Order::ORDER_FLOW_CONFIRM, 'is_delete' => 0, 'user_id' => $v['id']]);
  51. $parent_user = User::findOne($v['parent_id']);
  52. $parent_saas_user = SaasUser::findOne(['mobile' => $parent_user->binding]);
  53. $level_name = '普通用户';
  54. $share_holder = ShareHolder::findOne(['store_id' => $v['store_id'], 'user_id' => $v['id'], 'status' => 1, 'is_delete' => 0]);
  55. if ($share_holder) {
  56. $level_name = ShareHolderLevel::findOne($share_holder->level_id)->name;
  57. }
  58. $format_data[] = [
  59. 'id' => $v['id'],
  60. 'parent_id' => $v['parent_id'],
  61. 'avatar' => $saas_user ? $saas_user->avatar : $v['avatar_url'],
  62. 'name' => $saas_user ? $saas_user->name : $v['nickname'],
  63. 'order_count' => count($order->asArray()->all()),
  64. 'order_price' => $order->sum('pay_price') ?: 0,
  65. 'recommend_man' => $parent_saas_user ? $parent_saas_user->name : $parent_user->nickname,
  66. 'level_name' => $level_name
  67. ];
  68. }
  69. self::$team_num = Option::get('team_num', get_store_id(), 'bonus_pool', 0)['value'];
  70. $new_data = self::getChildrenTree($format_data, $user_id);
  71. return $new_data;
  72. }
  73. public static function getChildrenTree(array $data, $pid = 0, $num = 0) {
  74. $tree = [];
  75. if ($num + 1 >= self::$team_num) {
  76. return $tree;
  77. }
  78. if ($num < self::$team_num) {
  79. foreach ($data as $value) {
  80. if ($value['parent_id'] == $pid) {
  81. self::$team_count += 1;
  82. $value['children'] = self::getChildrenTree($data, $value['id'], ++$num);
  83. $tree[] = $value;
  84. }
  85. }
  86. }
  87. return $tree;
  88. }
  89. }