AwardLake.php 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. <?php
  2. namespace app\common\model\user;
  3. use app\common\model\BaseModel;
  4. use app\common\repositories\user\AwardIntegralPriceRepository;
  5. use think\db\exception\DataNotFoundException;
  6. use think\db\exception\DbException;
  7. use think\db\exception\ModelNotFoundException;
  8. use think\Exception;
  9. class Awardlake extends BaseModel
  10. {
  11. public static function tablePk(): ?string
  12. {
  13. return 'id';
  14. }
  15. public static function tableName(): string
  16. {
  17. return 'award_integral_price';
  18. }
  19. /**
  20. * @param int $lake_type 奖池类型 1:节能油,2:礼包
  21. * @param float $order_price 订单价格
  22. * @param int $order_id 订单ID
  23. * @return true
  24. * @throws Exception
  25. * @throws DataNotFoundException
  26. * @throws DbException
  27. * @throws ModelNotFoundException
  28. */
  29. public function addOrderLakes($lake_type, $order_price, $order_id)
  30. {
  31. switch ($lake_type) {
  32. case 1:
  33. $model = new OilLevel();
  34. break;
  35. case 2:
  36. $model = new GiftLevel();
  37. break;
  38. default :
  39. throw new Exception('奖池类型错误');
  40. }
  41. $levels = $model->select();
  42. foreach ($levels as $level) {
  43. $lake = self::where('level', $level['id'])->where('type', $lake_type)
  44. ->find();
  45. if (!$lake) $lake = self::create([
  46. 'level' => $level['id'],
  47. 'type' => $lake_type,
  48. 'award_name' => $level['name'] . '分红',
  49. 'num' => 0,
  50. 'send_time' => time()
  51. ]);
  52. $award = bcdiv(bcmul((string)$order_price, (string)$level['award_ratio']), '100', 2);
  53. AwardLakeLog::income($lake['id'], 'order_add', $award, $order_id, '用户购买商品添加分红池');
  54. }
  55. return true;
  56. }
  57. //30秒执行一次
  58. public function autoSend()
  59. {
  60. $time = strtotime(date('Y-m-d 01:00:00'));
  61. if (time() < $time) {
  62. return true;
  63. }
  64. $lakes = self::where('send_time', '<', $time)->select();
  65. foreach ($lakes as $lake) {
  66. $this->sendAward($lake['id']);
  67. }
  68. }
  69. public function sendAward($lake_id)
  70. {
  71. $lake = self::where('id', $lake_id)->find();
  72. if (!$lake) return true;
  73. if ($lake['num'] <= 0) {
  74. self::where('id', $lake['id'])->update(['send_time' => time()]);
  75. return true;
  76. }
  77. switch ($lake['type']) {
  78. case 1:
  79. $model = new OilLevel();
  80. $field = 'oil_level';
  81. break;
  82. case 2:
  83. $model = new GiftLevel();
  84. $field = 'gift_level';
  85. break;
  86. default :
  87. $model = new OilLevel();
  88. $field = 'oil_level';
  89. }
  90. $level = $model->where('id', $lake['level'])->find();
  91. $levels = $model->where('grade', '>=', $level['grade'])->column('id');
  92. $users = User::where($field, 'in', $levels)->where('status', 1)->select();
  93. $every = bcdiv($lake['num'], count($users), 2); //每个用户分得的奖励
  94. if ($every <= 0) {
  95. self::where('id', $lake['id'])->update(['send_time' => time()]);
  96. return true;
  97. }
  98. $real_send = 0;
  99. $price = app()->make(AwardIntegralPriceRepository::class)->awardIntegralPrice(); //分红积分价格
  100. foreach ($users as $user) {
  101. //todo 添加用户积分
  102. //todo end
  103. $real_send = bcadd($real_send, $every, 2);
  104. }
  105. AwardLakeLog::expend($lake['id'], 'send', $real_send, 0, '奖池分红');
  106. self::where('id', $lake['id'])->update(['send_time' => time()]);
  107. }
  108. }