CouponController.php 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. <?php
  2. namespace App\Http\Controllers\Game;
  3. use App\Http\logic\api\CouponLogic;
  4. use App\Models\UserCoupon;
  5. use Illuminate\Http\Request;
  6. /**
  7. * 优惠券 API 控制器
  8. *
  9. * 路由:
  10. * GET /coupon/list 获取用户优惠券列表(自动发放)
  11. * POST /coupon/preview 预估优惠券赠送金额(充值前调用)
  12. */
  13. class CouponController
  14. {
  15. /**
  16. * 获取用户优惠券列表
  17. *
  18. * 同时触发自动发放逻辑:根据配置策略检查用户是否符合条件并自动发放。
  19. *
  20. * GET /api/coupon/list
  21. * 参数: userID (必填)
  22. *
  23. * 响应:
  24. * {
  25. * "code": 200,
  26. * "msg": "success",
  27. * "data": {
  28. * "list": [...], // 当前可用优惠券
  29. * "new_issued": [...] // 本次新发放的优惠券
  30. * }
  31. * }
  32. */
  33. public function list(Request $request)
  34. {
  35. // game.php 中间件设置 globalUser;api.php 使用 userID 参数
  36. $userId = (int) ($request->globalUser->UserID ?? $request->input('userID', 0));
  37. if ($userId <= 0) {
  38. return apiReturnFail('Invalid userID');
  39. }
  40. $logic = new CouponLogic();
  41. $data = $logic->getList($userId);
  42. return apiReturnSuc($data);
  43. }
  44. /**
  45. * 预估优惠券赠送金额(充值前调用)
  46. *
  47. * 用户在充值页面选择优惠券后,可调用此接口查看预计赠送金额。
  48. *
  49. * POST /api/coupon/preview
  50. * 参数: userID (必填), coupon_id (必填), payAmt (必填, 充值金额元)
  51. *
  52. * 响应:
  53. * {
  54. * "code": 200,
  55. * "msg": "success",
  56. * "data": {
  57. * "coupon_id": 1,
  58. * "bonus_amount": 10.00, // 赠送金额(元)
  59. * "bonus_coins": 1000, // 赠送金币(分)
  60. * "total_amount": 60.00 // 到账总额(元) = 充值 + 赠送
  61. * }
  62. * }
  63. */
  64. public function preview(Request $request)
  65. {
  66. // game.php 中间件设置 globalUser;api.php 使用 userID 参数
  67. $userId = (int) ($request->globalUser->UserID ?? $request->input('userID', 0));
  68. $couponId = (int) $request->input('coupon_id');
  69. $payAmt = (float) $request->input('payAmt');
  70. if ($userId <= 0 || $couponId <= 0 || $payAmt <= 0) {
  71. return apiReturnFail('Invalid parameters');
  72. }
  73. $logic = new CouponLogic();
  74. $coupon = $logic->validateForPayment($couponId, $userId, $payAmt);
  75. if ($coupon === false) {
  76. return apiReturnFail($logic->getError());
  77. }
  78. $couponService = new \App\Services\CouponService();
  79. $bonusCoins = $couponService->calcBonusCoins($coupon, $payAmt);
  80. $bonusAmount = $bonusCoins / 100; // 分转元
  81. return apiReturnSuc([
  82. 'coupon_id' => $couponId,
  83. 'bonus_amount' => round($bonusAmount, 2),
  84. 'bonus_coins' => $bonusCoins,
  85. 'total_amount' => round($payAmt + $bonusAmount, 2),
  86. ]);
  87. }
  88. }