TeamPoolForm.php 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. <?php
  2. namespace app\modules\admin\models\team_grades;
  3. use app\models\SaasUser;
  4. use app\models\TeamGrades;
  5. use app\models\TeamGradesLevel;
  6. use app\models\TeamGradesPool;
  7. use app\models\TeamGradesPoolDetail;
  8. use app\models\User;
  9. use yii\base\Model;
  10. class TeamPoolForm extends Model
  11. {
  12. public $pool_id;
  13. public $store_id;
  14. public $is_send;
  15. public $start_time;
  16. public $end_time;
  17. public $nickname;
  18. public $mobile;
  19. public function rules()
  20. {
  21. return [
  22. [['pool_id', 'store_id', 'is_send'], 'integer'],
  23. [['start_time', 'end_time', 'nickname', 'mobile'], 'string'],
  24. ];
  25. }
  26. public function list() {
  27. $store_id = $this->store_id;
  28. $start_time = $this->start_time;
  29. $end_time = $this->end_time;
  30. $is_send = $this->is_send;
  31. $query = TeamGradesPool::find()->where(['store_id' => $store_id]);
  32. if ($start_time) {
  33. $start_time = strtotime($start_time);
  34. $query->andWhere(['>=', 'start_time', $start_time]);
  35. }
  36. if ($end_time) {
  37. $end_time = strtotime($end_time);
  38. $query->andWhere(['<=', 'end_time', $end_time]);
  39. }
  40. if ($is_send !== null && in_array($is_send, [TeamGradesPoolDetail::SEND_STATUS_NO, TeamGradesPoolDetail::SEND_STATUS_YES])) {
  41. $query->andWhere(['is_send' => $is_send]);
  42. }
  43. $query->orderBy(['id' => SORT_DESC])->select('id, start_time, end_time, is_send, bonus_type');
  44. $pagination = pagination_make($query);
  45. foreach ($pagination['list'] as &$list) {
  46. $list['start_time'] = date('Y-m-d H:i:s', $list['start_time']);
  47. $list['end_time'] = date('Y-m-d H:i:s', $list['end_time']);
  48. $list['is_send'] = intval($list['is_send']);
  49. //分红人数
  50. $list['team_grades_num'] = TeamGradesPoolDetail::find()->alias('pd')->where(['pd.pool_id' => $list['id']])
  51. ->leftJoin(['tg' => TeamGrades::tableName()], 'pd.user_id = tg.user_id')
  52. ->leftJoin(['u' => User::tableName()], 'pd.user_id = u.id')
  53. ->leftJoin(['su' => SaasUser::tableName()], 'su.mobile = u.binding')
  54. ->andWhere(['u.is_delete' => 0, 'su.is_delete' => 0])
  55. ->andWhere(['<>', 'u.binding', ''])->andWhere(['IS NOT', 'tg.id', NULL])->count();
  56. // TeamGradesPoolDetail::find()->alias('tgpd')->leftJoin(['tg' => TeamGrades::tableName()], 'tgpd.user_id = tg.user_id')
  57. // ->where(['tgpd.pool_id' => $list['id']])->andWhere(['tg.is_delete' => 0])->count();
  58. }
  59. return [
  60. 'code' => 0,
  61. 'msg' => 'success',
  62. 'data' => [
  63. 'data' => $pagination['list'],
  64. 'pageNo' => $pagination['pageNo'],
  65. 'totalCount' => $pagination['totalCount'],
  66. ]
  67. ];
  68. }
  69. /**
  70. * 分红详情
  71. */
  72. public function detail() {
  73. try {
  74. $pool_id = $this->pool_id;
  75. if (!$pool_id) {
  76. throw new \Exception('参数错误');
  77. }
  78. $store_id = $this->store_id;
  79. $nickname = $this->nickname;
  80. $mobile = $this->mobile;
  81. $start_time = $this->start_time;
  82. $end_time = $this->end_time;
  83. $is_send = $this->is_send;
  84. $pool = TeamGradesPool::findOne($pool_id);
  85. $query = TeamGradesPoolDetail::find()->alias('pd')->where(['pd.pool_id' => $pool_id]);
  86. $query->leftJoin(['tg' => TeamGrades::tableName()], 'pd.user_id = tg.user_id');
  87. $query->leftJoin(['u' => User::tableName()], 'pd.user_id = u.id')
  88. ->leftJoin(['su' => SaasUser::tableName()], 'su.mobile = u.binding')
  89. ->andWhere(['u.is_delete' => 0, 'su.is_delete' => 0])
  90. ->andWhere(['<>', 'u.binding', ''])->andWhere(['IS NOT', 'tg.id', NULL]);
  91. if (!empty(trim($nickname))) {
  92. $query->andWhere(['LIKE', 'su.name', $nickname]);
  93. }
  94. if (!empty(trim($mobile))) {
  95. $query->andWhere(['LIKE', 'su.mobile', $mobile]);
  96. }
  97. if ($start_time) {
  98. $start_time = strtotime($start_time);
  99. $query->andWhere(['>=', 'pd.send_time', $start_time]);
  100. }
  101. if ($end_time) {
  102. $end_time = strtotime($end_time);
  103. $query->andWhere(['<=', 'pd.send_time', $end_time]);
  104. }
  105. if ($is_send !== null && in_array($is_send, [TeamGradesPoolDetail::SEND_STATUS_NO, TeamGradesPoolDetail::SEND_STATUS_YES])) {
  106. $query->andWhere(['pd.is_send' => $is_send]);
  107. }
  108. //2025年4月28日10:04:33 此处新增排序:按用户团队等级从低到高,防止级差模式计算错误
  109. $query->select('pd.id, su.name as nickname, su.mobile, su.avatar, pd.amount, pd.price, pd.is_send, pd.send_time, pd.user_id, pd.profit, pd.level')->orderBy(['tg.team_grades_level' => SORT_ASC]);
  110. $pagination = pagination_make($query);
  111. $last_tiered_bonus = 0;
  112. foreach ($pagination['list'] as &$list) {
  113. $list['is_send'] = intval($list['is_send']);
  114. $list['send_time'] = $list['send_time'] ? date('Y-m-d H:i:s', $list['send_time']) : '';
  115. $userTeamGrades = TeamGrades::getUserTeamGrades($list['user_id']);
  116. //等级名称显示 如果列表无等级(奖励未发放)就显示的当前团队分红人员的实际等级 否则就显示下单时候的等级
  117. $list['team_grades_level_name'] = TeamGradesLevel::getLevelInfo($list['level'], $store_id, 'level_name') ?: '';
  118. if (empty($list['level'])) {
  119. $list['team_grades_level_name'] = $userTeamGrades['team_grades_level_name'] ?: '';
  120. }
  121. if ($list['profit'] <= 0) {
  122. if (!empty($userTeamGrades['id'])) {
  123. if($pool->bonus_type == 0) {
  124. $result = TeamGradesPoolDetail::getPrice($list['amount'], $userTeamGrades['team_grades_level'], $store_id);
  125. $list['price'] = $result['price']; //获取当前等级可能的实际分红
  126. $list['profit'] = $result['profit']; //获取当前等级的实际分红比例
  127. } elseif($pool->bonus_type == 1) {
  128. $result = TeamGradesPoolDetail::getPrice($list['amount'], $userTeamGrades['team_grades_level'], $store_id, $last_tiered_bonus);
  129. $list['price'] = $result['price']; //获取当前等级可能的实际分红
  130. $list['profit'] = $result['profit']; //获取当前等级的实际分红比例
  131. $last_tiered_bonus = $result['tiered_bonus'];
  132. } else {
  133. $list['price'] = 0;
  134. $list['profit'] = 0;
  135. }
  136. }
  137. }
  138. }
  139. return [
  140. 'code' => 0,
  141. 'msg' => 'success',
  142. 'data' => [
  143. 'data' => $pagination['list'],
  144. 'pageNo' => $pagination['pageNo'],
  145. 'totalCount' => $pagination['totalCount'],
  146. 'bonus_type' => $pool->bonus_type,
  147. ]
  148. ];
  149. } catch (\Exception $e) {
  150. return [
  151. 'code' => 1,
  152. 'msg' => $e->getMessage()
  153. ];
  154. }
  155. }
  156. public function send() {
  157. try {
  158. $pool_id = $this->pool_id;
  159. if (!$pool_id) {
  160. throw new \Exception('参数错误');
  161. }
  162. $pool = TeamGradesPool::findOne($pool_id);
  163. if (!$pool) {
  164. throw new \Exception('数据不存在');
  165. }
  166. if (intval($pool->is_send)) {
  167. throw new \Exception('团队业绩分红均已发放');
  168. }
  169. return TeamGradesPoolDetail::sendPool($pool_id);
  170. } catch (\Exception $e) {
  171. return [
  172. 'code' => 1,
  173. 'msg' => $e->getMessage()
  174. ];
  175. }
  176. }
  177. }