273 lines
9.0 KiB
PHP
273 lines
9.0 KiB
PHP
<?php
|
||
declare(strict_types=1);
|
||
|
||
namespace app\api\controller\v1;
|
||
|
||
use app\api\logic\UserLogic;
|
||
use app\api\util\ReturnCode;
|
||
use app\dice\model\player\DicePlayer;
|
||
use app\dice\model\play_record\DicePlayRecord;
|
||
use app\dice\model\player_wallet_record\DicePlayerWalletRecord;
|
||
use app\dice\model\player_ticket_record\DicePlayerTicketRecord;
|
||
use support\think\Db;
|
||
use plugin\saiadmin\basic\OpenController;
|
||
use support\Request;
|
||
use support\Response;
|
||
|
||
/**
|
||
* 平台 v1 游戏接口
|
||
* 请求头:auth-token
|
||
*/
|
||
class GameController extends OpenController
|
||
{
|
||
/**
|
||
* 获取游戏地址
|
||
* 根据 username 创建登录 token(JWT),拼接游戏地址返回
|
||
*/
|
||
public function getGameUrl(Request $request): Response
|
||
{
|
||
$username = trim((string) ($request->post('username', '')));
|
||
$password = trim((string) ($request->post('password', '123456')));
|
||
$time = trim((string) ($request->post('time', '')));
|
||
|
||
if ($username === '') {
|
||
return $this->fail('username 不能为空', ReturnCode::PARAMS_ERROR);
|
||
}
|
||
if ($password === '') {
|
||
$password = '123456';
|
||
}
|
||
if ($time === '') {
|
||
$time = (string) time();
|
||
}
|
||
|
||
try {
|
||
$logic = new UserLogic();
|
||
$result = $logic->loginByUsername($username, $password, 'chs', 0.0, $time);
|
||
} catch (\plugin\saiadmin\exception\ApiException $e) {
|
||
return $this->fail($e->getMessage(), ReturnCode::PARAMS_ERROR);
|
||
}
|
||
|
||
$gameUrlBase = rtrim(config('api.game_url', 'dice-game.yuliao666.top'), '/');
|
||
$tokenInUrl = str_replace('%3D', '=', urlencode($result['token']));
|
||
$url = $gameUrlBase . '/?token=' . $tokenInUrl;
|
||
|
||
return $this->success([
|
||
'url' => $url,
|
||
]);
|
||
}
|
||
|
||
/**
|
||
* 获取用户信息
|
||
* POST 参数:username
|
||
* 返回 DicePlayer 中非敏感信息
|
||
*/
|
||
public function getPlayerInfo(Request $request): Response
|
||
{
|
||
$username = trim((string) ($request->post('username', '')));
|
||
|
||
if ($username === '') {
|
||
return $this->fail('username 不能为空', ReturnCode::PARAMS_ERROR);
|
||
}
|
||
|
||
$player = DicePlayer::where('username', $username)->find();
|
||
if (!$player) {
|
||
return $this->fail('用户不存在', ReturnCode::NOT_FOUND);
|
||
}
|
||
|
||
$hidden = ['password', 'lottery_config_id', 't1_weight', 't2_weight', 't3_weight', 't4_weight', 't5_weight', 'delete_time'];
|
||
$info = $player->hidden($hidden)->toArray();
|
||
|
||
return $this->success($info);
|
||
}
|
||
|
||
/**
|
||
* 获取游戏记录
|
||
* POST 参数:username(非必填,没填则不按用户筛选), start_create_time, end_create_time(非必填,没填则不筛选时间)
|
||
* 返回 DicePlayRecord 中非敏感信息
|
||
*/
|
||
public function getPlayerGameRecord(Request $request): Response
|
||
{
|
||
$username = trim((string) ($request->post('username', '')));
|
||
$startCreateTime = trim((string) ($request->post('start_create_time', '')));
|
||
$endCreateTime = trim((string) ($request->post('end_create_time', '')));
|
||
$page = (int) $request->post('page', 1);
|
||
$limit = (int) $request->post('limit', 20);
|
||
|
||
if ($page < 1) {
|
||
$page = 1;
|
||
}
|
||
if ($limit < 1 || $limit > 100) {
|
||
$limit = 20;
|
||
}
|
||
|
||
$query = DicePlayRecord::order('id', 'desc');
|
||
|
||
if ($username !== '') {
|
||
$player = DicePlayer::where('username', $username)->find();
|
||
if (!$player) {
|
||
return $this->success([]);
|
||
}
|
||
$query->where('player_id', (int) $player->id);
|
||
}
|
||
|
||
if ($startCreateTime !== '') {
|
||
$query->where('create_time', '>=', $startCreateTime);
|
||
}
|
||
if ($endCreateTime !== '') {
|
||
$query->where('create_time', '<=', $endCreateTime);
|
||
}
|
||
|
||
$list = $query->page($page, $limit)->select()->toArray();
|
||
|
||
return $this->success($list);
|
||
}
|
||
|
||
/**
|
||
* 获取钱包流水
|
||
* POST 参数:username(非必填,没填则不按用户筛选), start_create_time, end_create_time(非必填,没填则不筛选时间)
|
||
* 返回 DicePlayerWalletRecord 中非敏感信息
|
||
*/
|
||
public function getPlayerWalletRecord(Request $request): Response
|
||
{
|
||
$username = trim((string) ($request->post('username', '')));
|
||
$startCreateTime = trim((string) ($request->post('start_create_time', '')));
|
||
$endCreateTime = trim((string) ($request->post('end_create_time', '')));
|
||
$page = (int) $request->post('page', 1);
|
||
$limit = (int) $request->post('limit', 20);
|
||
|
||
if ($page < 1) {
|
||
$page = 1;
|
||
}
|
||
if ($limit < 1 || $limit > 100) {
|
||
$limit = 20;
|
||
}
|
||
|
||
$query = DicePlayerWalletRecord::order('id', 'desc');
|
||
|
||
if ($username !== '') {
|
||
$player = DicePlayer::where('username', $username)->find();
|
||
if (!$player) {
|
||
return $this->success([]);
|
||
}
|
||
$query->where('player_id', (int) $player->id);
|
||
}
|
||
|
||
if ($startCreateTime !== '') {
|
||
$query->where('create_time', '>=', $startCreateTime);
|
||
}
|
||
if ($endCreateTime !== '') {
|
||
$query->where('create_time', '<=', $endCreateTime);
|
||
}
|
||
|
||
$list = $query->page($page, $limit)->select()->toArray();
|
||
|
||
return $this->success($list);
|
||
}
|
||
|
||
/**
|
||
* 获取用户中奖券获取记录
|
||
* POST 参数:username(非必填,没填则不按用户筛选), start_create_time, end_create_time(非必填,没填则不筛选时间)
|
||
* 返回 DicePlayerTicketRecord 中非敏感信息
|
||
*/
|
||
public function getPlayerTicketRecord(Request $request): Response
|
||
{
|
||
$username = trim((string) ($request->post('username', '')));
|
||
$startCreateTime = trim((string) ($request->post('start_create_time', '')));
|
||
$endCreateTime = trim((string) ($request->post('end_create_time', '')));
|
||
$page = (int) $request->post('page', 1);
|
||
$limit = (int) $request->post('limit', 20);
|
||
|
||
if ($page < 1) {
|
||
$page = 1;
|
||
}
|
||
if ($limit < 1 || $limit > 100) {
|
||
$limit = 20;
|
||
}
|
||
|
||
$query = DicePlayerTicketRecord::order('id', 'desc');
|
||
|
||
if ($username !== '') {
|
||
$player = DicePlayer::where('username', $username)->find();
|
||
if (!$player) {
|
||
return $this->success([]);
|
||
}
|
||
$query->where('player_id', (int) $player->id);
|
||
}
|
||
|
||
if ($startCreateTime !== '') {
|
||
$query->where('create_time', '>=', $startCreateTime);
|
||
}
|
||
if ($endCreateTime !== '') {
|
||
$query->where('create_time', '<=', $endCreateTime);
|
||
}
|
||
|
||
$list = $query->page($page, $limit)->select()->toArray();
|
||
|
||
return $this->success($list);
|
||
}
|
||
|
||
/**
|
||
* 钱包转入转出
|
||
* POST 参数:username(必填), coin(转入>0 或 转出<0)
|
||
* 创建 DicePlayerWalletRecord,type: 0=充值(coin>0), 1=提现(coin<0)
|
||
* 返回创建的记录
|
||
*/
|
||
public function setPlayerWallet(Request $request): Response
|
||
{
|
||
$username = trim((string) ($request->post('username', '')));
|
||
$coin = $request->post('coin');
|
||
|
||
if ($username === '') {
|
||
return $this->fail('username 不能为空', ReturnCode::PARAMS_ERROR);
|
||
}
|
||
if ($coin === null || $coin === '') {
|
||
return $this->fail('coin 不能为空', ReturnCode::PARAMS_ERROR);
|
||
}
|
||
|
||
$coinVal = (float) $coin;
|
||
if ($coinVal === 0.0) {
|
||
return $this->fail('coin 不能为 0', ReturnCode::PARAMS_ERROR);
|
||
}
|
||
|
||
$player = DicePlayer::where('username', $username)->find();
|
||
if (!$player) {
|
||
return $this->fail('用户不存在', ReturnCode::NOT_FOUND);
|
||
}
|
||
|
||
$walletBefore = (float) ($player->coin ?? 0);
|
||
$walletAfter = $walletBefore + $coinVal;
|
||
|
||
if ($coinVal < 0 && $walletBefore < -$coinVal) {
|
||
return $this->fail('余额不足,无法转出', ReturnCode::BUSINESS_ERROR);
|
||
}
|
||
|
||
$type = $coinVal > 0 ? 0 : 1;
|
||
$remark = $coinVal > 0 ? '充值' : '提现';
|
||
|
||
try {
|
||
Db::startTrans();
|
||
$player->coin = $walletAfter;
|
||
$player->save();
|
||
|
||
$record = DicePlayerWalletRecord::create([
|
||
'player_id' => (int) $player->id,
|
||
'coin' => $coinVal,
|
||
'type' => $type,
|
||
'wallet_before' => $walletBefore,
|
||
'wallet_after' => $walletAfter,
|
||
'total_ticket_count' => 0,
|
||
'paid_ticket_count' => 0,
|
||
'free_ticket_count' => 0,
|
||
'remark' => $remark,
|
||
'user_id' => 0,
|
||
]);
|
||
Db::commit();
|
||
} catch (\Throwable $e) {
|
||
Db::rollback();
|
||
return $this->fail('操作失败:' . $e->getMessage(), ReturnCode::SERVER_ERROR);
|
||
}
|
||
|
||
return $this->success($record->toArray());
|
||
}
|
||
}
|