Settlement.php 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. <?php
  2. namespace App\Jobs;
  3. use Illuminate\Bus\Queueable;
  4. use Illuminate\Queue\SerializesModels;
  5. use Illuminate\Queue\InteractsWithQueue;
  6. use Illuminate\Contracts\Queue\ShouldQueue;
  7. use Illuminate\Foundation\Bus\Dispatchable;
  8. use App\Model\Option;
  9. use App\Model\User;
  10. use App\Model\Room;
  11. use App\Model\RoomUser;
  12. use App\Model\RoomAnswer;
  13. use App\Model\RoomQuestion;
  14. use App\Jobs\Distribute;
  15. use GuzzleHttp\Client;
  16. use Illuminate\Support\Facades\Redis;
  17. use GatewayWorker\Lib\Gateway;
  18. class Settlement implements ShouldQueue
  19. {
  20. use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
  21. protected $room_id; //房间ID
  22. /**
  23. * Create a new job instance.
  24. *
  25. * @return void
  26. */
  27. public function __construct($room_id)
  28. {
  29. $this->room_id = $room_id;
  30. }
  31. /**
  32. * Execute the job.
  33. *
  34. * @return void
  35. */
  36. public function handle()
  37. {
  38. //获取当前房间回答情况
  39. $question_id = RoomQuestion::where("room_id", $this->room_id)->whereNull("end_at")->value("question_id");
  40. if(!$question_id){
  41. echo "找不到题目";
  42. return 0;
  43. }
  44. //获取当前房间获取问题数
  45. $room_question_count = RoomQuestion::where("room_id", $this->room_id)->count();
  46. //注册gateway地址
  47. Gateway::$registerAddress = '127.0.0.1:1238';
  48. //进行结算
  49. if($room_question_count > 4){
  50. //结算当前局
  51. $update_data["end_at"] = date("Y-m-d H:i:s");
  52. RoomQuestion::where([
  53. "room_id" => $this->room_id,
  54. "question_id" => $question_id,
  55. ])->update($update_data);
  56. //当前房间结束
  57. $update_data["end_at"] = date("Y-m-d H:i:s");
  58. Room::where("room_id", $this->room_id)->update($update_data);
  59. //获取胜利者
  60. $players = RoomUser::select("user_id","score")->where([
  61. "room_id" => $this->room_id,
  62. ])->get();
  63. $winer = '';
  64. $winer_score = 0;
  65. foreach ($players as $k => $player) {
  66. if($player->score > $winer_score){
  67. $winer = $player->user_id;
  68. $winer_score = $player->score;
  69. }
  70. }
  71. //通知卓望平台跟用户端
  72. foreach ($players as $k => $player) {
  73. $is_win = 0;
  74. //获取用户令牌
  75. $user = User::where("user_id", $player->user_id)->first();
  76. if($winer == $player->user_id){
  77. //更新胜利局数
  78. User::where("user_id", $player->user_id)->increment('win_count', 1);
  79. $is_win = 1;
  80. }else{
  81. User::where("user_id", $player->user_id)->increment('lose_count', 1);
  82. }
  83. //更新用户在房间的信息
  84. unset($update_data);
  85. $update_data['state'] = 2;
  86. $update_data['is_win'] = $is_win;
  87. $update_data['updated_at'] = date("Y-m-d H:i:s");
  88. RoomUser::where([
  89. "user_id" => $player->user_id,
  90. "room_id" => $this->room_id,
  91. ])->update($update_data);
  92. //非机器人上传游戏得分
  93. if($user->is_robot != 1){
  94. $client = new Client([
  95. 'verify' => false,
  96. ]);
  97. $ip = '211.139.191.175';
  98. $port = '38083';
  99. $req_time = date('YmdHis');
  100. $sign = md5($user->cmcc_id . $req_time . $user->mt);
  101. $params['req_param'] = [
  102. "pub_info" => [
  103. "req_src" => 1,
  104. "ver" => "1.0",
  105. "req_time" => $req_time,
  106. "sign" => $sign,
  107. ],
  108. "page_info" => [
  109. "current_page" => 1,
  110. "page_size" => 10,
  111. ],
  112. "busi_info" => [],
  113. ];
  114. // $response = $client->request('POST', "http://{$ip}:{$port}/hgs/biz/pktaskresult",[
  115. // 'form_params' => [
  116. // 'username' => $user->name,
  117. // ]
  118. // ]);
  119. // $result = $response->getBody()->getContents();
  120. }
  121. //测试固定用户信息
  122. $info['user_id'] = $user->user_id;
  123. $info['name'] = $user->name;
  124. $info['avatar'] = $user->avatar;
  125. $info['is_win'] = $is_win;
  126. $info['play_next'] = 1;
  127. //获取用户星力变化等信息返回
  128. $message['info'] = $info;
  129. $message['winer'] = $winer;
  130. $message['winer_score'] = $winer_score;
  131. $message['type'] = 'game_end';
  132. Gateway::sendToUid($user->user_id, json_encode($message));
  133. //结束当前房间
  134. Gateway::ungroup($this->room_id);
  135. }
  136. }else{
  137. //结算当前局
  138. $update_data["end_at"] = date("Y-m-d H:i:s");
  139. RoomQuestion::where([
  140. "room_id" => $this->room_id,
  141. "question_id" => $question_id,
  142. ])->update($update_data);
  143. //返回各个用户回答的问题
  144. $group_users = Gateway::getUidListByGroup($this->room_id);
  145. $anwsers = RoomAnswer::select('user_id', 'option_id', 'question_id')->where([
  146. "question_id" => $question_id,
  147. "room_id" => $this->room_id,
  148. ])->whereIn("user_id", array_values($group_users))->get();
  149. $option_id = Option::where([
  150. "question_id" => $question_id,
  151. "is_answer" => 1,
  152. ])->value("option_id");
  153. $info['anwser'] = $option_id;
  154. $info['players_answer'] = $anwsers;
  155. //发送回合结算信息
  156. $message['info'] = $info;
  157. $message['type'] = 'round_end';
  158. Gateway::sendToGroup($this->room_id, json_encode($message));
  159. sleep(3);
  160. //执行发题
  161. Distribute::dispatch($this->room_id)->onQueue('distribute');
  162. }
  163. }
  164. }