Game.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. <?php
  2. namespace app\api\controller\mlbb;
  3. use think\Db;
  4. /**
  5. * 游戏相关
  6. */
  7. class Game extends Mlbb
  8. {
  9. // 任务列表
  10. protected $taskList = [
  11. 1 => ['mark' => "1", 'title' => '累计登录魔力宝贝旅人 1天', 'status' => 1], // status: 1=未完成,2=已完成,3=已领取
  12. 2 => ['mark' => "2", 'title' => '累计登录魔力宝贝旅人 3天', 'status' => 1],
  13. 3 => ['mark' => "3", 'title' => '累计登录魔力宝贝旅人 5天', 'status' => 1],
  14. 4 => ['mark' => "4", 'title' => '完成一次 职业进阶', 'status' => 1],
  15. 5 => ['mark' => "5", 'title' => '等级达到 Lv33', 'status' => 1],
  16. 6 => ['mark' => "6", 'title' => '等级达到 Lv41', 'status' => 1],
  17. 7 => ['mark' => "7", 'title' => '等级达到 Lv55', 'status' => 1],
  18. 8 => ['mark' => "8", 'title' => '个人评分达到 8000', 'status' => 1],
  19. 9 => ['mark' => "9", 'title' => '个人评分达到 12000', 'status' => 1],
  20. 10 => ['mark' => "10", 'title' => '游戏内完成一次 充值', 'status' => 1],
  21. 11 => ['mark' => "11", 'title' => '累计充值达到 10000魔币', 'status' => 1],
  22. 12 => ['mark' => "12", 'title' => '累计充值达到 20000魔币', 'status' => 1],
  23. ];
  24. // 预约
  25. public function reservation(){
  26. $userInfo = $this->userInfo;
  27. $lrInfo = $userInfo['lr_info'];
  28. if($lrInfo['is_appointment'] == 2){
  29. return $this->resultFail('您已预约,无需重复预约!');
  30. }
  31. if(time() >= $this->expiration_date['end']){
  32. return $this->resultFail('此活动已于2026年01月18号截止!', -100);
  33. }
  34. $nowTime = NOW_TIMESTAMP;
  35. $res = Db::table('lr_user_info')->where(['user_id' => $userInfo['id']])->update([
  36. 'is_appointment' => 2,
  37. 'appointment_time' => date('Y-m-d H:i:s', $nowTime),
  38. 'update_time' => date('Y-m-d H:i:s', $nowTime)
  39. ]);
  40. if($res>0){
  41. return $this->resultSuccess([], '预约成功!');
  42. }
  43. return $this->resultFail('预约失败,请稍后重试!');
  44. }
  45. // 游戏角色列表
  46. public function getRole(){
  47. // 区服ID 判断
  48. $server_id = input('server_id', 0);
  49. if(empty($server_id) || !in_array($server_id, [1000, 10082, 10083, 10084])){
  50. return $this->resultFail('区服数据有误!');
  51. }
  52. // 游戏ID 判断
  53. $game_id = input('game_id', '');
  54. if(!in_array($game_id, [10, 20, 344, 345, 503])){
  55. $this->resultFail('当前游戏不支持此活动!');
  56. }
  57. $roleList = Db::table('nw_member_game_server')
  58. // , 'channel_id' => $this->channel_id
  59. ->where(['member_id' => $this->userInfo['id'], 'game_id' => $game_id, 'serverid' => $server_id])
  60. ->field('mgs_id,roleid as role_id,rolename as role_name,rolelevel as role_level,serverid as server_id,servername as server_name')
  61. ->order('mgs_id desc')->group('roleid')->select();
  62. return $this->resultSuccess(['list' => $roleList]);
  63. }
  64. // 绑定角色
  65. public function bandRole(){
  66. // 角色ID 判断
  67. $mgs_id = input('mgs_id', 0);
  68. if(empty($mgs_id)){
  69. return $this->resultFail('参数有误!');
  70. }
  71. // 区服ID 判断
  72. $server_id = input('server_id', 0);
  73. if(empty($server_id) || !in_array($server_id, [1000, 10082, 10083, 10084])){
  74. return $this->resultFail('区服数据有误!');
  75. }
  76. // 游戏ID 判断
  77. $game_id = input('game_id', '');
  78. if(!in_array($game_id, [10, 20, 344, 345, 503])){
  79. $this->resultFail('当前游戏不支持此活动!');
  80. }
  81. if(!empty($this->userInfo['lr_info']['role_id'])){
  82. return $this->resultFail('已绑定,无法修改!');
  83. }
  84. $roleInfo = Db::table('nw_member_game_server')->where(['mgs_id' => $mgs_id])->find();
  85. if(!$roleInfo){
  86. return $this->resultFail('查询 角色信息 失败!');
  87. }
  88. $sub_username = Db::table('nw_subaccount')->where(['member_id' => $this->userInfo['id'], 'game_id' => $game_id])->value('sub_username');
  89. if(!$sub_username){
  90. return $this->resultFail('查询 账号信息 失败!');
  91. }
  92. $channel_id = Db::table('nw_member_game_server')->where(['member_id' => $this->userInfo['id'], 'game_id' => $game_id, 'serverid' => $server_id])->value('channel_id');
  93. if(!$channel_id){
  94. return $this->resultFail('查询 账户渠道信息 失败!');
  95. }
  96. $this->judgmentChannel($channel_id);
  97. $data = [
  98. 'game_id' => $game_id,
  99. // 'channel_id' => $channel_id,
  100. 'sub_username' => $sub_username,
  101. 'role_id' => $roleInfo['roleid'],
  102. 'role_name' => $roleInfo['rolename'],
  103. 'server_id' => $server_id,
  104. 'server_name' => $roleInfo['servername'],
  105. 'band_role_time' => date('Y-m-d H:i:s', NOW_TIMESTAMP),
  106. 'update_time' => date('Y-m-d H:i:s', NOW_TIMESTAMP),
  107. ];
  108. $res = Db::table('lr_user_info')->where(['id' => $this->userInfo['lr_info']['id']])->update($data);
  109. if(!$res){
  110. return $this->resultFail('绑定失败,请稍后重试!');
  111. }
  112. return $this->resultSuccess([], '绑定成功!');
  113. }
  114. // 任务列表
  115. public function getTask(){
  116. $taskList = $this->taskList;
  117. $list = Db::table('lr_user_task')->where(['user_id' => $this->userInfo['id']])->select();
  118. foreach ($list as $k => $v){
  119. if(isset($taskList[$v['mark']])){
  120. $taskList[$v['mark']]['status'] = $v['status'];
  121. }
  122. }
  123. // 抽奖次数
  124. $lottery_count = Db::table('lr_user_info')->where(['user_id' => $this->userInfo['id']])->value('lottery_count');
  125. return $this->resultSuccess(['list' => $taskList, 'lottery_count' => $lottery_count??0]);
  126. }
  127. // 完成任务 - 测试,不对外
  128. public function getTaskComplete(){
  129. if($this->getJudgmentTask()){
  130. return $this->resultFail('请先绑定角色!');
  131. }
  132. $mark = input('mark', 0);
  133. if(empty($mark)){
  134. return $this->resultFail('参数有误!');
  135. }
  136. $info = Db::table('lr_user_task')->where(['user_id' => $this->userInfo['id'], 'mark' => $mark])->find();
  137. if($info){
  138. if($info['status'] == 2){
  139. return $this->resultFail('任务已完成,请领取奖励!');
  140. } else {
  141. return $this->resultFail('任务已存在,请勿重复提交!');
  142. }
  143. }
  144. $taskList = $this->taskList;
  145. $codeByList = array_column($taskList, 'title', 'mark');
  146. $data = [
  147. 'user_id' => $this->userInfo['id'],
  148. 'mark' => $mark,
  149. 'title' => $codeByList[$mark],
  150. 'status' => 2, // 1=已完成,2=已领取
  151. 'craete_time' => date('Y-m-d H:i:s', NOW_TIMESTAMP)
  152. ];
  153. Db::table('lr_user_task')->insert($data);
  154. // TODO: 增加抽奖次数
  155. return $this->resultSuccess([], '任务完成,奖励已发放!');
  156. }
  157. // 中奖记录
  158. public function getLotteryLog(){
  159. $list = Db::table('lr_user_winning')->where(['user_id' => $this->userInfo['id']])->order('id desc')->select();
  160. return $this->resultSuccess(['list' => $list]);
  161. }
  162. // 抽奖
  163. public function handleLottery(){
  164. if($this->getJudgmentTask()){
  165. return $this->resultFail('请先绑定角色!', -101);
  166. }
  167. if(time() >= $this->expiration_date['end']){
  168. return $this->resultFail('此活动已于2026年01月18号截止!', -100);
  169. }
  170. if($this->userInfo['lr_info']['lottery_count'] <= 0){
  171. return $this->resultFail('暂无抽奖次数,请先完成任务!', -102);
  172. }
  173. // 奖品池配置
  174. $prizePool = [
  175. // ['客户端标识', '奖品名称', '类型', '权重', '标识码|代金卷ID'],
  176. ['prize_mark' => 1, 'prize_name' => '殿堂礼包', 'type' => 'pack', 'weight' => 11, 'mark_code' => 'pack_001'],
  177. ['prize_mark' => 2, 'prize_name' => '勇者晋级礼包', 'type' => 'pack', 'weight' => 11, 'mark_code' => 'pack_002'],
  178. ['prize_mark' => 3, 'prize_name' => '勇者冒险礼包', 'type' => 'pack', 'weight' => 11, 'mark_code' => 'pack_003'],
  179. ['prize_mark' => 4, 'prize_name' => '勇者荣耀礼包', 'type' => 'pack', 'weight' => 11, 'mark_code' => 'pack_004'],
  180. ['prize_mark' => 5, 'prize_name' => '1元代金券', 'type' => 'coupon', 'weight' => 14, 'mark_code' => 'coupon_001'],
  181. ['prize_mark' => 6, 'prize_name' => '25元代金券', 'type' => 'coupon', 'weight' => 11, 'mark_code' => 'coupon_002'],
  182. ['prize_mark' => 7, 'prize_name' => '40元代金券', 'type' => 'coupon', 'weight' => 11, 'mark_code' => 'coupon_003'],
  183. ['prize_mark' => 8, 'prize_name' => '65元代金券', 'type' => 'coupon', 'weight' => 11, 'mark_code' => 'coupon_004'],
  184. ['prize_mark' => 9, 'prize_name' => '100元代金券', 'type' => 'coupon', 'weight' => 11, 'mark_code' => 'coupon_005'],
  185. ];
  186. $drawCount = 0; // 已抽次数
  187. $winningList = Db::table('lr_user_winning')->where(['user_id' => $this->userInfo['id']])->select();
  188. $userWinningHistory = [];
  189. if($winningList){
  190. foreach($winningList as $v){
  191. $userWinningHistory[] = ['prize_mark' => $v['prize_mark'], 'prize_type' => $v['prize_type']];
  192. }
  193. $drawCount = count($userWinningHistory);
  194. }
  195. if($drawCount >= 12){
  196. return $this->resultFail('所有抽奖任务已完成!');
  197. }
  198. $handleService = new \app\api\service\mlbb\HandleService();
  199. // 抽奖
  200. $drawInfo = (new \app\api\library\mlbb\LotteryService($prizePool))->draw($userWinningHistory);
  201. // array(5) { ["prize_mark"]=> int(2) ["prize_name"]=> string(18) "勇者晋级礼包" ["type"]=> string(4) "pack" ["weight"]=> int(11) ["mark_code"]=> string(8) "pack_002"}
  202. Db::startTrans();
  203. try {
  204. $content = "";
  205. // ## 发放奖品获取
  206. if($drawInfo['type'] == 'pack'){ // 礼包兑换码(游戏兑换)
  207. $giftResult = $handleService->getCacheGiftCode($drawInfo['mark_code']);
  208. if($giftResult['code'] != 200 || empty($giftResult['data']['code'])){
  209. throw new \Exception('礼包码发放失败!', -112);
  210. }
  211. $content = $giftResult['data']['code'];
  212. } else { // 代金券(发放到祈盟账户)
  213. $getMemCou = $handleService->getMemberCoupon($drawInfo['mark_code'], $this->userInfo['id']);
  214. if($getMemCou['code'] != 200 || empty($getMemCou['data']['code'])){
  215. throw new \Exception("{$getMemCou['msg']}({$getMemCou['code']})", -114);
  216. }
  217. }
  218. // ## 保存中奖记录
  219. $data = [
  220. 'user_id' => $this->userInfo['id'],
  221. 'prize_mark' => $drawInfo['prize_mark'],
  222. 'prize_name' => $drawInfo['prize_name'],
  223. 'prize_type' => $drawInfo['type']==='pack'?1:2, // 1=礼包,2=代金券
  224. 'content' => $content, // 中奖内容(礼包=兑换码,2=代金卷)
  225. 'create_time' => date('Y-m-d H:i:s', NOW_TIMESTAMP)
  226. ];
  227. $winningRes = Db::table('lr_user_winning')->insert($data);
  228. if(!$winningRes){
  229. return $this->resultFail('记录保存失败!', -120);
  230. }
  231. $userRes = Db::table('lr_user_info')->where(['user_id' => $this->userInfo['id']])->setDec('lottery_count');
  232. if(!$userRes){
  233. return $this->resultFail('抽奖次数扣除失败!', -121);
  234. }
  235. if($drawInfo['type'] == "pack"){ // 更新礼包码状态
  236. $prizeGiftRes = Db::table('lr_prize_gift')->where(['code' => $content])->update(['user_id' => $this->userInfo['id'], 'status' => 2, 'claim_time' => date('Y-m-d H:i:s', NOW_TIMESTAMP)]);
  237. if(!$prizeGiftRes){
  238. return $this->resultFail('礼包记录使用失败!', -122);
  239. }
  240. $res = Db::table('lr_prize')->where(['mark_code' => $drawInfo['mark_code']])->setDec('remaining_num');
  241. if(!$res){
  242. return $this->resultFail('礼包操作失败!', -123);
  243. }
  244. }
  245. // 使用数量+1
  246. $res = Db::table('lr_prize')->where(['mark_code' => $drawInfo['mark_code']])->setInc('use_num');
  247. if(!$res){
  248. return $this->resultFail('礼包操作失败!', -124);
  249. }
  250. $result = [
  251. 'prize_mark' => $drawInfo['prize_mark'],
  252. 'prize_name' => $drawInfo['prize_name'],
  253. 'prize_type' => $drawInfo['type']==='pack'?1:2, // 1=礼包,2=代金券
  254. 'content' => $content, // 中奖内容(礼包=兑换码,2=代金卷)
  255. ];
  256. Db::commit();
  257. } catch (\Exception $e) {
  258. Db::rollback();
  259. if($e->getCode() <= -120){
  260. $handleService->addCacheGiftCode($drawInfo['mark_code'], [$content]); // 回滚礼包码
  261. }
  262. log_message("MLBB#Game.handleLottery - error: {$e->getMessage()}", 'log', LOG_PATH . 'mlbb_log/');
  263. return $this->resultFail("抽奖失败, {$e->getMessage()}({$e->getCode()})", -199);
  264. }
  265. return $this->resultSuccess(['info' => $result]);
  266. }
  267. }