Modules_Api_Controllers_CodeController.proxy.php 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. <?php
  2. /**
  3. * 兑换码控制器.
  4. * @author ningque
  5. * @date 2020-02-19 21:13:09
  6. */
  7. declare (strict_types=1);
  8. namespace Modules\Api\Controllers;
  9. use App\Model\UserModel;
  10. use App\Repositories\Service\QueueService;
  11. use App\Repositories\UserRepository;
  12. use Carbon\Carbon;
  13. use Hyperf\DbConnection\Db;
  14. use Hyperf\Validation\Contract\ValidatorFactoryInterface;
  15. class CodeController extends BaseController
  16. {
  17. use \Hyperf\Di\Aop\ProxyTrait;
  18. use \Hyperf\Di\Aop\PropertyHandlerTrait;
  19. function __construct()
  20. {
  21. if (method_exists(parent::class, '__construct')) {
  22. parent::__construct(...func_get_args());
  23. }
  24. $this->__handlePropertyHandler(__CLASS__);
  25. }
  26. /**
  27. * 兑换码信息
  28. */
  29. public function info(ValidatorFactoryInterface $validatorFactory)
  30. {
  31. $inputData = $this->getJsonData();
  32. $rules = ['code' => 'required|string'];
  33. $validator = $validatorFactory->make($inputData, $rules);
  34. if ($validator->fails()) {
  35. // 如果有错误(可能是多个信息),这里只取第一个错误信息返回.
  36. return json_fail($validator->errors()->first());
  37. }
  38. $code = Db::table('vip_code')->where('code', $inputData['code'])->first();
  39. if (!$code) {
  40. return json_fail('无效的兑换码');
  41. }
  42. if ($code->type == 1) {
  43. //活动类
  44. $isExchange = Db::table('vip_code_exchange')->where('uid', $this->getUserId())->where('cid', $code->id)->count();
  45. $code->is_exchange = $isExchange ? 1 : 0;
  46. } else {
  47. $code->is_exchange = !$code->status ? 1 : 0;
  48. }
  49. return json_success($code);
  50. }
  51. /**
  52. * 兑换码兑换
  53. */
  54. public function exchage(ValidatorFactoryInterface $validatorFactory)
  55. {
  56. $inputData = $this->getJsonData();
  57. $rules = ['code' => 'required|string'];
  58. $validator = $validatorFactory->make($inputData, $rules);
  59. if ($validator->fails()) {
  60. // 如果有错误(可能是多个信息),这里只取第一个错误信息返回.
  61. return json_fail($validator->errors()->first());
  62. }
  63. $code = Db::table('vip_code')->where('code', $inputData['code'])->where('status', 1)->first();
  64. if (!$code) {
  65. return json_fail('无效的兑换码或兑换码已被兑换');
  66. }
  67. if ($code->expire < date('Y-m-d')) {
  68. return json_fail('该兑换码已过期');
  69. }
  70. $user_code = $this->getUserId();
  71. Db::beginTransaction();
  72. if ($code->type == 1) {
  73. //活动类
  74. $limit = Db::table('vip_code_exchange')->where('cid', $code->id)->count();
  75. if ($limit > $code->limit) {
  76. return json_fail('该兑换码已达上限');
  77. }
  78. $isExchange = Db::table('vip_code_exchange')->where('uid', $user_code)->where('cid', $code->id)->count();
  79. if ($isExchange) {
  80. return json_fail('你已经兑换了该活动码');
  81. }
  82. $insert = Db::table('vip_code_exchange')->insert(['uid' => $user_code, 'cid' => $code->id, 'created_at' => Carbon::now()->toDateTimeString()]);
  83. $code->is_exchange = 1;
  84. } else {
  85. Db::table('vip_code')->where('code', $inputData['code'])->update(['status' => '0']);
  86. $code->is_exchange = 1;
  87. }
  88. $userInfo = make(UserRepository::class)->getUserInfoFromCache($user_code);
  89. if ($userInfo['is_vip'] == 'y') {
  90. $vipTime = Carbon::parse($userInfo['vip_expired'])->addDays($code->day)->toDateTimeString();
  91. } else {
  92. $vipTime = Carbon::now()->addDays($code->day)->toDateTimeString();
  93. }
  94. $result = UserModel::query()->where('code', $user_code)->update(['vip_expired' => $vipTime]);
  95. if ($result) {
  96. // 加mongodb兑换日志
  97. make(QueueService::class)->addExchangeCodeJob(['nick' => $userInfo['nick'], 'user_id' => $userInfo['id'], 'user_code' => $userInfo['code'], 'code' => $code->code, 'title' => $code->title, 'day' => $code->day]);
  98. Db::commit();
  99. } else {
  100. Db::rollBack();
  101. return json_fail('兑换失败');
  102. }
  103. make(UserRepository::class)->delUserCache($user_code);
  104. return json_success($code);
  105. }
  106. }