LotteryController.php 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. <?php
  2. namespace App\Http\Controllers\Mobile\Lottery;
  3. use App\Http\Controllers\Mobile\MobileBaseController;
  4. use App\Models\LotteryLog;
  5. use App\Models\LotteryPrize;
  6. use App\Models\LotteryWin;
  7. use App\Models\Thirdlogin;
  8. use App\Services\Auth\AuthService;
  9. use App\Services\Common\WechatService;
  10. use Illuminate\Http\Request;
  11. use Illuminate\Support\Facades\Session;
  12. class LotteryController extends MobileBaseController
  13. {
  14. /**
  15. * @var WechatService
  16. */
  17. private $wechatService;
  18. /**
  19. * @var AuthService
  20. */
  21. private $authService;
  22. public function __construct(WechatService $wechatService, AuthService $authService)
  23. {
  24. $this->wechatService = $wechatService;
  25. $this->authService = $authService;
  26. }
  27. /**
  28. * 微信登录
  29. */
  30. public function login(Request $request)
  31. {
  32. //type:web-电脑端,mobile-手机端,
  33. $app_id = subsite_config('aix.system.oauth.wechat_official.app_id');
  34. $redirect_uri = urlencode(route('mobile.lottery.wechat_back'));
  35. $type = $request->input('type', 1);
  36. $wechat_url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid={$app_id}&redirect_uri={$redirect_uri}&response_type=code&scope=snsapi_userinfo&state={$type}#wechat_redirect";
  37. return redirect($wechat_url);
  38. }
  39. /**
  40. * 微信回调
  41. */
  42. public function wechat_back(Request $request)
  43. {
  44. //微信登录
  45. $officialAccount = $this->wechatService->getOfficialAccount();
  46. $wechatUser = $officialAccount->oauth->user()->getOriginal();
  47. $thirdlogin = Thirdlogin::where('openid', $wechatUser['openid'])->first();
  48. if (!$thirdlogin && $wechatUser['unionid']) {
  49. $thirdlogin = Thirdlogin::where('unionid', $wechatUser['unionid'])->first();
  50. }
  51. if ($thirdlogin) {
  52. $member = $thirdlogin->member()->withTrashed()->first();
  53. $this->authService->login($member, 1);
  54. } else {
  55. Session::put('open_id', $wechatUser['openid']);
  56. Session::put('union_id', $wechatUser['unionid'] ?: '');
  57. Session::save();
  58. }
  59. $type = $request->input('state', 1);
  60. $url = route('mobile.active.spring', ['type' => $type]);
  61. return redirect($url);
  62. }
  63. /**
  64. * 抽奖页
  65. */
  66. public function index(Request $request)
  67. {
  68. //是否登录
  69. $user = auth('web-member')->user();
  70. if (empty($user)) {
  71. $open_id = Session::get('open_id');
  72. if (empty($open_id)) {
  73. return redirect(route('mobile.lottery.login'));
  74. }
  75. } else {
  76. $third = Thirdlogin::where('uid', $user->id)->first();
  77. $open_id = $third['openid'];
  78. }
  79. // $open_id = '11';
  80. //抽奖次数
  81. $type = $request->input('type', 1);
  82. $date = date('Y-m-d');
  83. $log = LotteryLog::where([
  84. ['create_time', '=', $date],
  85. ['type', '=', $type],
  86. ['open_id', '=', $open_id],
  87. ])->first();
  88. $number = 1;
  89. if (!empty($log)) {
  90. $number = 0;
  91. }
  92. //奖品列表
  93. $prize = LotteryPrize::all();
  94. $ids = [];
  95. $restaraunts = [];
  96. $colors = [];
  97. $images = [];
  98. foreach ($prize as $v) {
  99. $ids[] = $v->id;
  100. $restaraunts[] = $v->prize_name;
  101. $colors[] = $v->prize_bg;
  102. $images[] = upload_asset($v->prize_image);
  103. }
  104. $return_data = [
  105. 'open_id' => $open_id,
  106. 'current_url' => \Illuminate\Support\Facades\Request::getRequestUri(),
  107. 'number' => $number,
  108. 'type' => $type,
  109. 'prize' => $prize,
  110. 'ids' => $ids,
  111. 'restaraunts' => $restaraunts,
  112. 'colors' => $colors,
  113. 'images' => $images,
  114. 'wap_title' => '抽奖',
  115. 'share_title' => '抽奖',
  116. 'share_desc' => '找工作还可抽奖',
  117. 'share_link' => route('mobile.lottery.login'),
  118. ];
  119. return view('mobile.app.lottery.index', $return_data);
  120. }
  121. /**
  122. * 抽奖
  123. */
  124. public function lottery_post(Request $request)
  125. {
  126. //抽奖次数
  127. $data = $request->all();
  128. // $date = date('Y-m-d');
  129. $date = "2025-01-01";
  130. $log = LotteryLog::where([
  131. ['create_time', '=', $date],
  132. ['type', '=', $data['type']],
  133. ['open_id', '=', $data['open_id']],
  134. ])->first();
  135. if (!empty($log)) {
  136. return response()->json(['status' => 0, 'msg' => '您已抽过奖!']);
  137. }
  138. //奖品列表
  139. $model = new LotteryPrize();
  140. $prize_arr = $model->where('prize_number', '>', 0)->get();
  141. $arr = [];
  142. foreach ($prize_arr as $key => $val) {
  143. $arr[$val['id']] = $val['prize_odds'] * 100;
  144. }
  145. if (array_sum($arr) == 0) {
  146. return response()->json(['status' => 0, 'msg' => '奖品已全部抽完,请联系管理员!']);
  147. }
  148. //增加抽奖记录
  149. LotteryLog::create([
  150. 'create_time' => $date,
  151. 'type' => $data['type'],
  152. 'number' => 1,
  153. 'open_id' => $data['open_id'],
  154. ]);
  155. $rid = $this->_get_rand($arr); //根据概率获取奖项id
  156. //增加奖品
  157. $prize_win = $model->where('id', $rid)->first();
  158. $prize_win->prize_number--;
  159. $prize_win->save();
  160. $user = auth('web-member')->user();
  161. if (empty($user)) {
  162. Session::put('prize_id', $rid);
  163. Session::save();
  164. } else {
  165. $prize = LotteryPrize::where('id', $rid)->first();
  166. $win = new LotteryWin();
  167. $win->member_id = $user->id;
  168. $win->prize_id = $rid;
  169. $win->prize_name = $prize->prize_name;
  170. $win->created_at = date('Y-m-d H:i:s');
  171. $win->save();
  172. }
  173. return response()->json(['status' => 1, 'msg' => '恭喜你,获得' . $prize_win->prize_name.'。请点击领奖按钮进行领奖。', 'id' => $rid]);
  174. }
  175. private function _get_rand($proArr)
  176. {
  177. $result = '';
  178. //概率数组的总概率精度
  179. $proSum = array_sum($proArr);
  180. //概率数组循环
  181. foreach ($proArr as $key => $proCur) {
  182. $randNum = mt_rand(1, $proSum);
  183. if ($randNum <= $proCur) {
  184. $result = $key;
  185. break;
  186. } else {
  187. $proSum -= $proCur;
  188. }
  189. }
  190. return $result;
  191. }
  192. }