OrderService.php 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. <?php
  2. namespace App\Services;
  3. use App\Components\Helpers;
  4. use App\Models\Order;
  5. use App\Models\ReferralLog;
  6. use App\Models\User;
  7. use Log;
  8. class OrderService
  9. {
  10. public static $order;
  11. public static $user;
  12. public static $goods;
  13. public static $payment;
  14. public function __construct(Order $order)
  15. {
  16. // 获取需要的信息
  17. self::$order = $order;
  18. self::$user = $order->user;
  19. self::$goods = $order->goods;
  20. self::$payment = $order->payment;
  21. }
  22. public function receivedPayment(): bool
  23. { // 支付成功后处理
  24. if (self::$payment && self::$payment->status !== 1) {// 是否为余额购买套餐
  25. self::$payment->complete();
  26. }
  27. if (self::$order->goods_id === null) {
  28. $ret = $this->chargeCredit();
  29. } else {
  30. $goods = self::$order->goods;
  31. switch ($goods->type) {// 商品为流量或者套餐
  32. case 1: // 流量包
  33. $ret = $this->activatePackage();
  34. break;
  35. case 2: // 套餐
  36. if (Order::userActivePlan(self::$user->id)->where('id', '<>', self::$order->id)->exists()) {// 判断套餐是否直接激活
  37. $ret = $this->setPrepaidPlan();
  38. } else {
  39. $ret = $this->activatePlan();
  40. }
  41. $this->setCommissionExpense(self::$user); // 返利
  42. break;
  43. default:
  44. Log::emergency('【处理订单】出现错误-未知套餐类型');
  45. }
  46. }
  47. return $ret ?? true;
  48. }
  49. private function chargeCredit(): bool
  50. { // 余额充值
  51. $credit = self::$user->credit;
  52. $ret = self::$user->updateCredit(self::$order->origin_amount);
  53. // 余额变动记录日志
  54. if ($ret) {
  55. Helpers::addUserCreditLog(self::$order->user_id, self::$order->id, $credit, self::$user->credit, self::$order->amount, '用户通过'.self::$order->pay_way.'充值余额');
  56. }
  57. return $ret;
  58. }
  59. private function activatePackage(): bool
  60. { // 激活流量包
  61. if (self::$user->incrementData(self::$goods->traffic * MB)) {
  62. return Helpers::addUserTrafficModifyLog(self::$order->user_id, self::$user->transfer_enable - self::$goods->traffic * MB, self::$user->transfer_enable, '['.self::$order->pay_way.']加上用户购买的套餐流量', self::$order->id);
  63. }
  64. return false;
  65. }
  66. private function setPrepaidPlan(): bool
  67. { // 设置预支付套餐, 刷新账号有效时间用于流量重置判断
  68. Order::whereId(self::$order->id)->first()->prepay(); // 直接编辑self::$order->prepay() [手动修改]会加不上
  69. return self::$user->update(['expired_at' => date('Y-m-d', strtotime(self::$user->expired_at.' +'.self::$goods->days.' days'))]);
  70. }
  71. public function activatePlan(): bool
  72. { // 激活套餐
  73. Order::whereId(self::$order->id)->first()->update(['expired_at' => date('Y-m-d H:i:s', strtotime(self::$goods->days.' days'))]);
  74. $oldData = self::$user->transfer_enable;
  75. $updateData = [
  76. 'invite_num' => self::$user->invite_num + (self::$goods->invite_num ?: 0),
  77. 'level' => self::$goods->level,
  78. 'speed_limit' => self::$goods->speed_limit,
  79. 'enable' => 1,
  80. ];
  81. // 无端口用户 添加端口
  82. if (empty(self::$user->port)) {
  83. $updateData['port'] = Helpers::getPort();
  84. }
  85. if (self::$user->update(array_merge($this->resetTimeAndData(), $updateData))) {
  86. return Helpers::addUserTrafficModifyLog(self::$order->user_id, $oldData, self::$user->transfer_enable, '【'.self::$order->pay_way.'】加上用户购买的套餐流量', self::$order->id);
  87. }
  88. return false;
  89. }
  90. public function resetTimeAndData($expired_at = null): array
  91. { // 计算下次重置与账号过期时间
  92. $data = ['u' => 0, 'd' => 0];
  93. // 账号有效期
  94. if (! $expired_at) {
  95. $expired_at = date('Y-m-d', strtotime(self::$goods->days.' days'));
  96. foreach (Order::userPrepay(self::$order->user_id)->with('goods')->get() as $paidOrder) {//拿出可能存在的其余套餐, 推算最新的到期时间
  97. //取出对应套餐信息
  98. $expired_at = date('Y-m-d', strtotime("$expired_at +".$paidOrder->goods->days.' days'));
  99. }
  100. $data['expired_at'] = $expired_at;
  101. }
  102. //账号流量重置日期
  103. $nextResetTime = date('Y-m-d', strtotime(self::$goods->period.' days'));
  104. if ($nextResetTime >= $expired_at) {
  105. $nextResetTime = null;
  106. }
  107. return array_merge($data, [
  108. 'transfer_enable' => self::$goods->traffic * MB,
  109. 'reset_time' => $nextResetTime,
  110. ]);
  111. }
  112. private function setCommissionExpense(User $user)
  113. { // 佣金计算
  114. $referralType = sysConfig('referral_type');
  115. if ($referralType && $user->inviter_id) {// 是否需要支付佣金
  116. $inviter = $user->inviter;
  117. // 获取历史返利记录
  118. $referral = ReferralLog::whereInviteeId($user->id)->doesntExist();
  119. // 无记录 / 首次返利
  120. if ($referral && sysConfig('is_invite_register')) {
  121. // 邀请注册功能开启时,返还邀请者邀请名额
  122. $inviter->increment('invite_num');
  123. }
  124. // 按照返利模式进行返利判断
  125. if ($referralType === '2' || $referral) {
  126. return $inviter->commissionLogs()
  127. ->create([
  128. 'invitee_id' => $user->id,
  129. 'order_id' => self::$order->id,
  130. 'amount' => self::$order->amount,
  131. 'commission' => self::$order->amount * sysConfig('referral_percent'),
  132. ]);
  133. }
  134. }
  135. return true;
  136. }
  137. public function activatePrepaidPlan(): bool
  138. { // 激活预支付套餐
  139. self::$order->complete();
  140. return $this->activatePlan();
  141. }
  142. }