UserBrokerageRepository.php 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. <?php
  2. namespace app\common\repositories\user;
  3. use app\common\dao\user\UserBrokerageDao;
  4. use app\common\model\user\User;
  5. use app\common\model\user\UserBrokerage;
  6. use app\common\repositories\BaseRepository;
  7. use think\facade\Db;
  8. /**
  9. * @mixin UserBrokerageDao
  10. */
  11. class UserBrokerageRepository extends BaseRepository
  12. {
  13. public const BROKERAGE_RULE_TYPE = ['spread_user', 'pay_money', 'pay_num', 'spread_money', 'spread_pay_num'];
  14. public function __construct(UserBrokerageDao $dao)
  15. {
  16. $this->dao = $dao;
  17. }
  18. public function getList(array $where, $page, $limit)
  19. {
  20. $query = $this->dao->search($where)->order('brokerage_level DESC,create_time DESC');
  21. $count = $query->count();
  22. $list = $query->page($page, $limit)->select();
  23. return compact('list', 'count');
  24. }
  25. public function getNextLevel($level)
  26. {
  27. return $this->search(['next_level' => $level])->order('brokerage_level ASC,create_time DESC')->find();
  28. }
  29. public function options()
  30. {
  31. return $this->dao->search([])->field('brokerage_level as value,brokerage_name as label')->order('brokerage_level ASC,create_time DESC')->select();
  32. }
  33. public function all()
  34. {
  35. return $this->dao->search([])->order('brokerage_level ASC,create_time DESC')->select();
  36. }
  37. public function inc(User $user, $type, $inc)
  38. {
  39. $nextLevel = $this->getNextLevel($user->brokerage_level);
  40. if (!$nextLevel) return false;
  41. $make = app()->make(UserBillRepository::class);
  42. $bill = $make->getWhere(['uid' => $user->uid, 'link_id' => $nextLevel->user_brokerage_id, 'category' => 'sys_brokerage', 'type' => $type]);
  43. if ($bill) {
  44. $bill->number = bcadd($bill->number, $inc, 2);
  45. $bill->save();
  46. } else {
  47. $make->incBill($user->uid, 'sys_brokerage', $type, [
  48. 'number' => $inc,
  49. 'title' => $type,
  50. 'balance' => 0,
  51. 'status' => 0,
  52. 'link_id' => $nextLevel->user_brokerage_id
  53. ]);
  54. }
  55. return $this->checkLevel($user, $nextLevel);
  56. }
  57. public function checkLevel(User $user, UserBrokerage $nextLevel)
  58. {
  59. $info = app()->make(UserBillRepository::class)->search(['uid' => $user->uid, 'category' => 'sys_brokerage', 'link_id' => $nextLevel->user_brokerage_id])
  60. ->column('number', 'type');
  61. foreach ($nextLevel['brokerage_rule'] as $k => $rule) {
  62. if (!isset($info[$k]) && $rule['num'] > 0) return false;
  63. if ($rule['num'] > 0 && $rule['num'] > $info[$k]) return false;
  64. }
  65. $nextLevel->user_num++;
  66. Db::transaction(function () use ($nextLevel, $user) {
  67. $nextLevel->save();
  68. if ($user->brokerage && $user->brokerage->user_num > 0) {
  69. $user->brokerage->user_num--;
  70. $user->brokerage->save();
  71. }
  72. $user->brokerage_level = $nextLevel->brokerage_level;
  73. $user->save();
  74. });
  75. return true;
  76. }
  77. public function getLevelRate(User $user, UserBrokerage $nextLevel)
  78. {
  79. $info = app()->make(UserBillRepository::class)->search(['uid' => $user->uid, 'category' => 'sys_brokerage', 'link_id' => $nextLevel->user_brokerage_id])
  80. ->column('number', 'type');
  81. $brokerage_rule = $nextLevel['brokerage_rule'];
  82. foreach ($nextLevel['brokerage_rule'] as $k => $rule) {
  83. if ($rule['num'] <= 0) {
  84. unset($brokerage_rule[$k]);
  85. continue;
  86. }
  87. if (!isset($info[$k])) {
  88. $rate = 0;
  89. } else if ($rule['num'] > $info[$k]) {
  90. $rate = bcdiv($info[$k], $rule['num'], 2) * 100;
  91. } else {
  92. $rate = 100;
  93. }
  94. $brokerage_rule[$k]['rate'] = $rate;
  95. $brokerage_rule[$k]['task'] = (float)(min($info[$k] ?? 0, $rule['num']));
  96. }
  97. return $brokerage_rule;
  98. }
  99. }