ShopController.php 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. <?php
  2. namespace App\Http\Controllers\User;
  3. use App\Http\Controllers\Controller;
  4. use App\Models\Coupon;
  5. use App\Models\Goods;
  6. use App\Models\Node;
  7. use App\Models\Order;
  8. use App\Services\CouponService;
  9. use App\Utils\Helpers;
  10. use Illuminate\Contracts\View\View;
  11. use Illuminate\Http\JsonResponse;
  12. use Illuminate\Http\Request;
  13. use Illuminate\Validation\Rule;
  14. use Validator;
  15. class ShopController extends Controller
  16. {
  17. public function index(): View
  18. { // 商品列表
  19. $user = auth()->user();
  20. // 获取可用商品列表
  21. $goodsList = Goods::whereStatus(1)->where('type', '<=', 2)->orderByDesc('type')->orderByDesc('sort')->get();
  22. // 获取用户节点信息
  23. $nodes = $user->userGroup ? $user->userGroup->nodes() : Node::query();
  24. // 为每个商品计算节点数量和国家
  25. $goodsList->each(function ($goods) use ($nodes) {
  26. $filteredNodes = $nodes->where('level', '<=', $goods->level)->where('status', 1);
  27. $goods->node_count = $filteredNodes->count();
  28. $goods->node_countries = $filteredNodes->pluck('country_code')->unique();
  29. });
  30. // 获取续费订单和价格
  31. $renewOrder = Order::userActivePlan($user->id)->first();
  32. $renewPrice = $renewOrder?->goods->renew ?? 0;
  33. // 计算数据增加天数
  34. $dataPlusDays = $user->reset_time ?? $user->expired_at;
  35. return view('user.services', [
  36. 'chargeGoodsList' => Goods::type(3)->orderBy('price')->get(),
  37. 'goodsList' => $goodsList,
  38. 'renewTraffic' => $renewPrice ? Helpers::getPriceTag($renewPrice) : 0,
  39. 'dataPlusDays' => $dataPlusDays > now() ? $dataPlusDays->diffInDays() : 0,
  40. ]);
  41. }
  42. public function resetTraffic(): JsonResponse
  43. { // 重置流量
  44. $user = auth()->user();
  45. $order = Order::userActivePlan()->firstOrFail();
  46. $renewCost = $order->goods->renew;
  47. // 检查余额是否足够
  48. if ($user->credit < $renewCost) {
  49. return response()->json(['status' => 'fail', 'message' => trans('user.payment.insufficient_balance')]);
  50. }
  51. // 重置用户流量
  52. $user->update(['u' => 0, 'd' => 0]);
  53. // 记录余额操作日志并扣费
  54. Helpers::addUserCreditLog($user->id, null, $user->credit, $user->credit - $renewCost, -1 * $renewCost, 'The user manually reset the data.');
  55. $user->updateCredit(-$renewCost);
  56. return response()->json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.reset')])]);
  57. }
  58. public function checkBonus(Request $request, Goods $good): JsonResponse
  59. { // 兑换优惠券码
  60. $coupon_sn = $request->input('coupon_sn');
  61. if (empty($coupon_sn)) {
  62. return response()->json(['status' => 'fail', 'title' => trans('common.failed'), 'message' => trans('user.coupon.error.unknown')]);
  63. }
  64. $coupon = (new CouponService($coupon_sn))->search($good); // 检查券合规性
  65. if (! $coupon instanceof Coupon) {
  66. return $coupon;
  67. }
  68. $data = [
  69. 'name' => $coupon->name,
  70. 'type' => $coupon->type,
  71. 'value' => $coupon->type === 2 ? $coupon->value : Helpers::getPriceTag($coupon->value),
  72. ];
  73. return response()->json(['status' => 'success', 'data' => $data, 'message' => trans('common.applied', ['attribute' => trans('model.coupon.attribute')])]);
  74. }
  75. public function show(Goods $good): View
  76. { // 显示服务详细
  77. $user = auth()->user();
  78. // 有重置日时按照重置日为标准,否则就以过期日为标准
  79. $dataPlusDays = $user->reset_time ?? $user->expired_at;
  80. return view('user.buy', [
  81. 'dataPlusDays' => $dataPlusDays > now() ? $dataPlusDays->diffInDays() : 0,
  82. 'activePlan' => Order::userActivePlan()->exists(),
  83. 'goods' => $good,
  84. ]);
  85. }
  86. public function charge(Request $request): JsonResponse
  87. {
  88. $validator = Validator::make($request->all(), [
  89. 'coupon_sn' => [
  90. 'required', Rule::exists('coupon', 'sn')->where(static function ($query) {
  91. $query->whereType(3)->whereStatus(0);
  92. }),
  93. ],
  94. ]);
  95. if ($validator->fails()) {
  96. return response()->json(['status' => 'fail', 'message' => $validator->errors()->all()]);
  97. }
  98. if ((new CouponService($request->input('coupon_sn')))->charge()) {
  99. return response()->json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('user.recharge')])]);
  100. }
  101. return response()->json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('user.recharge')])]);
  102. }
  103. }