AwardLake.php 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. <?php
  2. namespace app\common\model\user;
  3. use app\common\model\BaseModel;
  4. use app\common\repositories\user\AwardIntegralPriceRepository;
  5. use app\common\repositories\user\UserBillRepository;
  6. use think\db\exception\DataNotFoundException;
  7. use think\db\exception\DbException;
  8. use think\db\exception\ModelNotFoundException;
  9. use think\Exception;
  10. class AwardLake extends BaseModel
  11. {
  12. public static function tablePk(): ?string
  13. {
  14. return 'id';
  15. }
  16. public static function tableName(): string
  17. {
  18. return 'award_lake';
  19. }
  20. /**
  21. * 奖池累加
  22. * @param int $lake_type 奖池类型 1:节能油,2:礼包
  23. * @param float $order_price 订单价格
  24. * @param int $order_id 订单ID
  25. * @return true
  26. * @throws Exception
  27. * @throws DataNotFoundException
  28. * @throws DbException
  29. * @throws ModelNotFoundException
  30. */
  31. public function addOrderLakes($lake_type, $order_price, $order_id)
  32. {
  33. switch ($lake_type) {
  34. case 1:
  35. $model = new OilLevel();
  36. break;
  37. case 2:
  38. $model = new GiftLevel();
  39. break;
  40. default :
  41. throw new Exception('奖池类型错误');
  42. }
  43. $levels = $model->select();
  44. foreach ($levels as $level) {
  45. $lake = self::where('level', $level['id'])->where('type', $lake_type)
  46. ->find();
  47. if (!$lake) $lake = self::create([
  48. 'level' => $level['id'],
  49. 'type' => $lake_type,
  50. 'award_name' => $level['name'] . '分红',
  51. 'num' => 0,
  52. 'send_time' => time()
  53. ]);
  54. $award = bcdiv(bcmul((string)$order_price, (string)$level['award_ratio']), '100', 2);
  55. AwardLakeLog::income($lake['id'], 'order_add', $award, $order_id, '用户购买商品添加分红池');
  56. }
  57. return true;
  58. }
  59. //30秒执行一次
  60. public function autoSend()
  61. {
  62. $time = strtotime(date('Y-m-d 01:00:00'));
  63. if (time() < $time) {
  64. return true;
  65. }
  66. $lakes = self::where('send_time', '<', $time)->select();
  67. @file_put_contents('quanju.txt',$time."-1点的时间戳\r\n",8);
  68. @file_put_contents('quanju.txt',json_encode($lakes)."-发放时间小于1点的\r\n",8);
  69. foreach ($lakes as $lake) {
  70. $this->sendAward($lake['id']);
  71. }
  72. return true;
  73. }
  74. public function sendAward($lake_id)
  75. {
  76. $lake = self::where('id', $lake_id)->find();
  77. @file_put_contents('quanju.txt',json_encode($lake)."-奖池信息\r\n",8);
  78. if (!$lake) return true;
  79. if ($lake['num'] <= 0) {
  80. self::where('id', $lake['id'])->update(['send_time' => time()]);
  81. return true;
  82. }
  83. switch ($lake['type']) {
  84. case 1:
  85. $model = new OilLevel();
  86. $field = 'oil_level';
  87. $name = '节能油';
  88. $title = '节能油积分分红';
  89. break;
  90. case 2:
  91. $model = new GiftLevel();
  92. $field = 'gift_level';
  93. $name = '礼包';
  94. $title = '礼包积分分红';
  95. break;
  96. default :
  97. $model = new OilLevel();
  98. $field = 'oil_level';
  99. $name = '节能油';
  100. $title = '节能油积分分红';
  101. }
  102. $level = $model->where('id', $lake['level'])->find();
  103. $levels = $model->where('grade', '>=', $level['grade'])->column('id');
  104. $users = User::where($field, 'in', $levels)->where('status', 1)->select();
  105. $every = bcdiv($lake['num'], count($users), 2); //每个用户分得的奖励
  106. if ($every <= 0) {
  107. self::where('id', $lake['id'])->update(['send_time' => time()]);
  108. return true;
  109. }
  110. $real_send = 0;
  111. $price = app()->make(AwardIntegralPriceRepository::class)->awardIntegralPrice(); //分红积分价格
  112. foreach ($users as $user) {
  113. //todo 添加用户积分 用户分的奖励除以积分价格就是积分数量
  114. $integral = bcdiv($every, $price, 2);
  115. $award_integral=User::where('uid', $user['uid'])->value('award_integral');
  116. $after = bcadd($award_integral, $integral, 2);
  117. // 创建用户账单仓库实例
  118. $make = app()->make(UserBillRepository::class);
  119. $make->incBill($user['uid'], 'award_integral', 'oil_integral', [
  120. 'number' => $award_integral,
  121. 'title' => $title,
  122. 'balance' => $after,
  123. 'status' => 1,
  124. 'link_id' => 0,
  125. 'mark' => $user['nickname'] . '获得' .$name.'分红积分'.$award_integral ,
  126. ]);
  127. User::where('uid', $user['uid'])->update(['award_integral' => $after]);
  128. //todo end
  129. $real_send = bcadd($real_send, $every, 2);
  130. }
  131. AwardLakeLog::expend($lake['id'], 'send', $real_send, 0, '奖池分红');
  132. self::where('id', $lake['id'])->update(['send_time' => time()]);
  133. }
  134. }