User.php 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. <?php
  2. namespace app\shop\model\plus\agent;
  3. use app\common\model\user\User as RealUserModel;
  4. use app\shop\model\plus\agent\Referee as RefereeModel;
  5. use app\common\model\plus\agent\User as UserModel;
  6. /**
  7. * 分销商用户模型
  8. * Class User
  9. * @package app\shop\model\plus\agent
  10. */
  11. class User extends UserModel
  12. {
  13. /**
  14. * 获取分销商用户列表
  15. */
  16. public function getList($search, $limit = 15)
  17. {
  18. // 构建查询规则
  19. $model = $this->alias('agent')
  20. ->field('agent.*, user.nickName, user.avatarUrl')
  21. ->with(['referee'])
  22. ->join('user', 'user.user_id = agent.user_id')
  23. ->where('agent.is_delete', '=', 0)
  24. ->order(['agent.create_time' => 'desc']);
  25. // 查询条件
  26. if (!empty($search)) {
  27. $model = $model->where('user.nickName|agent.real_name|agent.mobile', 'like', '%' . $search . '%');
  28. }
  29. // 获取列表数据
  30. $list = $model->paginate($limit);
  31. foreach ($list as $user){
  32. $user['total_money'] = sprintf('%.2f', $user['money'] + $user['freeze_money'] + $user['total_money']);
  33. }
  34. return $list;
  35. }
  36. /**
  37. * 编辑分销商用户
  38. * @param $data
  39. * @return bool
  40. */
  41. public function edit($data)
  42. {
  43. // 开启事务
  44. $this->startTrans();
  45. try {
  46. if(isset($data['referee_id']) && $data['referee_id'] > 0){
  47. // 删除原推荐人关系
  48. $this->onDeleteReferee($this['user_id']);
  49. // 修改用户推荐人
  50. (new RealUserModel())->where('user_id', '=', $this['user_id'])->update([
  51. 'referee_id' => $data['referee_id']
  52. ]);
  53. // 记录推荐人关系,
  54. RefereeModel::updateRelation($this['user_id'], $data['referee_id']);
  55. }
  56. $this->save($data);
  57. $this->commit();
  58. return true;
  59. } catch (\Exception $e) {
  60. $this->error = $e->getMessage();
  61. $this->rollback();
  62. return false;
  63. }
  64. }
  65. /**
  66. * 删除分销商用户
  67. * @return mixed
  68. */
  69. public function setDelete()
  70. {
  71. return $this->transaction(function () {
  72. // 获取一级团队成员ID集
  73. $RefereeModel = new RefereeModel;
  74. $team1Ids = $RefereeModel->getTeamUserIds($this['user_id'], 1);
  75. if (!empty($team1Ids)) {
  76. // 一级团队成员归属到平台
  77. $this->setFromplatform($team1Ids);
  78. // 一级推荐人ID
  79. $referee1Id = RefereeModel::getRefereeUserId($this['user_id'], 1, true);
  80. if ($referee1Id > 0) {
  81. // 一级推荐人的成员数量(二级)
  82. $this->setDecTeamNum($referee1Id, 2, count($team1Ids));
  83. // 一级推荐人的成员数量(三级)
  84. $team2Ids = $RefereeModel->getTeamUserIds($this['user_id'], 2);
  85. !empty($team2Ids) && $this->setDecTeamNum($referee1Id, 3, count($team2Ids));
  86. // 二级推荐人的成员数量(三级)
  87. $referee2Id = RefereeModel::getRefereeUserId($this['user_id'], 2, true);
  88. $referee2Id > 0 && $this->setDecTeamNum($referee2Id, 3, count($team1Ids));
  89. // 清空分销商下级成员与上级推荐人的关系记录
  90. $RefereeModel->onClearTop(array_merge($team1Ids, $team2Ids));
  91. }
  92. }
  93. // 清空下级推荐记录
  94. $RefereeModel->onClearTeam($this['user_id']);
  95. // 标记当前分销商记录为已删除
  96. return $this->save([
  97. 'is_delete' => 1
  98. ]);
  99. });
  100. }
  101. /**
  102. * 一级团队成员归属到平台
  103. * @param $userIds
  104. * @return false|int
  105. */
  106. private function setFromplatform($userIds)
  107. {
  108. return $this->where('user_id', 'in', $userIds)
  109. ->where('is_delete', '=', 0)
  110. ->save(['referee_id' => 0]);
  111. }
  112. /**
  113. * 递减分销商成员数量
  114. */
  115. private function setDecTeamNum($agent_id, $level, $number)
  116. {
  117. $field = [1 => 'first_num', 2 => 'second_num', 3 => 'third_num'];
  118. return $this->where('user_id', '=', $agent_id)
  119. ->where('is_delete', '=', 0)
  120. ->dec($field[$level], $number);
  121. }
  122. /**
  123. * 提现打款成功:累积提现佣金
  124. */
  125. public static function totalMoney($user_id, $money)
  126. {
  127. $model = self::detail($user_id);
  128. return $model->save([
  129. 'freeze_money' => $model['freeze_money'] - $money,
  130. 'total_money' => $model['total_money'] + $money,
  131. ]);
  132. }
  133. /**
  134. * 提现驳回:解冻分销商资金
  135. */
  136. public static function backFreezeMoney($user_id, $money)
  137. {
  138. $model = self::detail($user_id);
  139. return $model->save([
  140. 'money' => $model['money'] + $money,
  141. 'freeze_money' => $model['freeze_money'] - $money,
  142. ]);
  143. }
  144. /**
  145. * 删除用户的上级推荐关系
  146. * @param $userId
  147. * @return bool
  148. * @throws \think\Exception
  149. */
  150. public function onDeleteReferee($userId)
  151. {
  152. // 获取推荐人列表
  153. $list = RefereeModel::getRefereeList($userId);
  154. if (!$list->isEmpty()) {
  155. // 递减推荐人的下级成员数量
  156. foreach ($list as $item) {
  157. $item['agent1'] && $this->setDecTeamNum($item['agent_id'], $item['level'], 1);
  158. }
  159. // 清空上级推荐关系
  160. (new RefereeModel)->onClearReferee($userId);
  161. }
  162. return true;
  163. }
  164. }