feat: complete logging coverage - all services + frontend route fix
Backend additions: - UserConnectService, ScanConnectService: connection logging - ToBetCommonService, ToBetBaccaratService: bet rejection/success logging - ResetBoot, ResetNumberTab, ResetBaccarat, ResetDt: reset event logging - handle/Index: log_report controller method (fixes route for dealer端) - index/Log: log_report controller for player端 (no auth required) Frontend: - error-report.js: fix report URL to /index/log_report (matches handle controller) Total: 21 backend files with 60 Logger calls across 5 categories
This commit is contained in:
@@ -65,6 +65,24 @@ class Index extends Common{
|
||||
//View::assign('localSbServer',Env::get('system.SB_SERVER'));
|
||||
View::assign('localSbServer', $tableInfo['media_near_rtmp']); // 无用的字段来作为本地识别设备IP
|
||||
}
|
||||
public function log_report(): Json
|
||||
{
|
||||
if (!Request::instance()->isPost()) return json(['status' => 0]);
|
||||
$data = Request::instance()->post();
|
||||
\app\utils\Logger::error(\app\utils\Logger::CAT_FRONTEND, $data['message'] ?? 'unknown', [
|
||||
'source' => $data['source'] ?? 'unknown',
|
||||
'type' => $data['type'] ?? 'error',
|
||||
'stack' => isset($data['stack']) ? substr($data['stack'], 0, 2000) : '',
|
||||
'file' => $data['file'] ?? '',
|
||||
'url' => $data['url'] ?? '',
|
||||
'line' => $data['line'] ?? '',
|
||||
'col' => $data['col'] ?? '',
|
||||
'ua' => Request::instance()->header('user-agent', ''),
|
||||
'ip' => Request::instance()->ip(),
|
||||
]);
|
||||
return json(['status' => 1]);
|
||||
}
|
||||
|
||||
function get_lang(): Json
|
||||
{
|
||||
if (!Request::instance()->isPost()) return json();
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
<?php
|
||||
declare (strict_types = 1);
|
||||
|
||||
namespace app\index\controller;
|
||||
|
||||
use think\facade\Request;
|
||||
use think\response\Json;
|
||||
|
||||
class Log
|
||||
{
|
||||
public function report(): Json
|
||||
{
|
||||
if (!Request::instance()->isPost()) return json(['status' => 0]);
|
||||
$data = Request::instance()->post();
|
||||
\app\utils\Logger::error(\app\utils\Logger::CAT_FRONTEND, $data['message'] ?? 'unknown', [
|
||||
'source' => $data['source'] ?? 'unknown',
|
||||
'type' => $data['type'] ?? 'error',
|
||||
'stack' => isset($data['stack']) ? substr($data['stack'], 0, 2000) : '',
|
||||
'file' => $data['file'] ?? '',
|
||||
'url' => $data['url'] ?? '',
|
||||
'line' => $data['line'] ?? '',
|
||||
'col' => $data['col'] ?? '',
|
||||
'ua' => Request::instance()->header('user-agent', ''),
|
||||
'ip' => Request::instance()->ip(),
|
||||
]);
|
||||
return json(['status' => 1]);
|
||||
}
|
||||
}
|
||||
@@ -4,6 +4,7 @@ declare (strict_types = 1);
|
||||
namespace app\listener\space;
|
||||
|
||||
use app\models\process\Sumday;
|
||||
use app\utils\Logger;
|
||||
use freedom\utils\SocketSession;
|
||||
use think\swoole\Websocket;
|
||||
|
||||
@@ -22,11 +23,14 @@ class ResetBoot
|
||||
$modelRes = Sumday::resetBoot($tableInfo);
|
||||
if ($modelRes['status'] == true){
|
||||
$ws->to(SocketSession::HOUSE_NAME)->emit('resetBoot',['status' => true, 'table_id' => $tableInfo['id'], 'round' => $modelRes['data']]);
|
||||
Logger::info(Logger::CAT_GAME, 'reset_boot_success', ['table_id' => $tableInfo['id']]);
|
||||
}else{
|
||||
$ws->emit('resetBoot', ['status' => false, 'msg' => $modelRes['msg']]);
|
||||
Logger::warn(Logger::CAT_GAME, 'reset_boot_fail', ['table_id' => $tableInfo['id'], 'reason' => $modelRes['msg']]);
|
||||
}
|
||||
}else{
|
||||
$ws->emit('resetBoot', ['status' => false, 'msg' => $preliminaryCheckRes['msg']]);
|
||||
Logger::warn(Logger::CAT_GAME, 'reset_boot_fail', ['reason' => $preliminaryCheckRes['msg']]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
namespace app\services\bet;
|
||||
|
||||
use app\models\bet\Bet;
|
||||
use app\utils\Logger;
|
||||
use freedom\utils\SocketSession;
|
||||
|
||||
/**
|
||||
@@ -156,8 +157,10 @@ class ToBetBaccaratService
|
||||
),
|
||||
);
|
||||
$ws->to(SocketSession::HOUSE_NAME)->emit('allBetAmount',['status' => true, 'table_id' => $tableInfo['id'], 'round' => $round]);
|
||||
Logger::info(Logger::CAT_BET, 'baccarat_bet_success', ['user_id' => $userInfo['id'], 'table_id' => $tableInfo['id'], 'amount' => $amount]);
|
||||
}else{
|
||||
$ws->emit('toBet',['status' => false, 'table_id' => $tableInfo['id'], 'msg' => 'to_bet_fail']);
|
||||
Logger::warn(Logger::CAT_BET, 'baccarat_bet_db_fail', ['user_id' => $userInfo['id'], 'table_id' => $tableInfo['id'], 'amount' => $amount]);
|
||||
}
|
||||
SocketSession::resetRepeat($fd,'user','isToBet');
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@ use app\models\process\NumberTab;
|
||||
use app\models\user\User;
|
||||
use app\models\user\Session;
|
||||
use app\services\connect\InitTableService;
|
||||
use app\utils\Logger;
|
||||
|
||||
class ToBetCommonService
|
||||
{
|
||||
@@ -24,48 +25,61 @@ class ToBetCommonService
|
||||
/** 通用检验重复部分开始 */
|
||||
$amount = array_sum($data);
|
||||
if ($amount == 0){
|
||||
Logger::warn(Logger::CAT_BET, 'bet_rejected', ['reason' => 'to_bet_fail_6', 'detail' => 'zero_amount']);
|
||||
return ['status' => false, 'msg' => 'to_bet_fail_6'];
|
||||
}
|
||||
$numberTabId = isset($event['number_tab_id']) && intval($event['number_tab_id']) > 0 ? intval($event['number_tab_id']) : 0;
|
||||
$userId = isset($event['user_id']) && intval($event['user_id']) > 0 ? intval($event['user_id']) : 0;
|
||||
$userInfo = User::get(['id' => $userId, 'status' => 1, 'is_delete' => 0]);
|
||||
if (!$userInfo) return ['status' => false, 'msg' => 'to_bet_fail_2'];
|
||||
if (!$userInfo) {
|
||||
Logger::warn(Logger::CAT_BET, 'bet_rejected', ['user_id' => $userId, 'table_id' => $tableInfo['id'] ?? 0, 'reason' => 'to_bet_fail_2', 'detail' => 'user_not_found']);
|
||||
return ['status' => false, 'msg' => 'to_bet_fail_2'];
|
||||
}
|
||||
if($userInfo['bet_type'] == 2){
|
||||
$session_id = $userInfo['api_token'];
|
||||
$sessionInfo = Session::get(['session_id' => $session_id]);
|
||||
if(!$sessionInfo){
|
||||
Logger::warn(Logger::CAT_BET, 'bet_rejected', ['user_id' => $userId, 'table_id' => $tableInfo['id'] ?? 0, 'reason' => 'to_bet_fail_9', 'detail' => 'session_not_found']);
|
||||
return ['status' => false, 'msg' => 'to_bet_fail_9'];
|
||||
}
|
||||
if(!$sessionInfo['server_status']){
|
||||
Logger::warn(Logger::CAT_BET, 'bet_rejected', ['user_id' => $userId, 'table_id' => $tableInfo['id'] ?? 0, 'reason' => 'to_bet_fail_10', 'detail' => 'server_status_off']);
|
||||
return ['status' => false, 'msg' => 'to_bet_fail_10'];
|
||||
}
|
||||
}
|
||||
// 使用 InitTableService::initTable 获取当前靴的最新一局,与其他服务保持一致
|
||||
$numberTabInfo = InitTableService::initTable($tableInfo);
|
||||
if ($numberTabInfo['id'] != $numberTabId){
|
||||
Logger::warn(Logger::CAT_BET, 'bet_rejected', ['user_id' => $userId, 'table_id' => $tableInfo['id'] ?? 0, 'reason' => 'to_bet_fail_5', 'detail' => 'number_tab_mismatch']);
|
||||
return ['status' => false, 'msg' => 'to_bet_fail_5'];
|
||||
}
|
||||
if ($numberTabInfo['bet_status'] != 1 || time() > ($numberTabInfo['bet_start_time'] + $tableInfo['wait_time'])){
|
||||
Logger::warn(Logger::CAT_BET, 'bet_rejected', ['user_id' => $userId, 'table_id' => $tableInfo['id'] ?? 0, 'reason' => 'to_bet_fail_4', 'detail' => 'bet_closed_or_timeout']);
|
||||
return ['status' => false, 'msg' => 'to_bet_fail_4'];
|
||||
}
|
||||
// 超过50局幸运6禁止下注
|
||||
if ($numberTabInfo['number'] > 50 && isset($event['luck_six_amount']) && $event['luck_six_amount'] > 0){
|
||||
Logger::warn(Logger::CAT_BET, 'bet_rejected', ['user_id' => $userId, 'table_id' => $tableInfo['id'] ?? 0, 'reason' => 'to_bet_fail_7', 'detail' => 'luck_six_over_50_rounds']);
|
||||
return ['status' => false, 'msg' => 'to_bet_fail_7'];
|
||||
}
|
||||
// 超过30局大小禁止下注
|
||||
if ($numberTabInfo['number'] > 30 && isset($event['big_amount']) && $event['big_amount'] > 0){
|
||||
Logger::warn(Logger::CAT_BET, 'bet_rejected', ['user_id' => $userId, 'table_id' => $tableInfo['id'] ?? 0, 'reason' => 'to_bet_fail_8', 'detail' => 'big_over_30_rounds']);
|
||||
return ['status' => false, 'msg' => 'to_bet_fail_8'];
|
||||
}
|
||||
if ($numberTabInfo['number'] > 30 && isset($event['small_amount']) && $event['small_amount'] > 0){
|
||||
Logger::warn(Logger::CAT_BET, 'bet_rejected', ['user_id' => $userId, 'table_id' => $tableInfo['id'] ?? 0, 'reason' => 'to_bet_fail_8', 'detail' => 'small_over_30_rounds']);
|
||||
return ['status' => false, 'msg' => 'to_bet_fail_8'];
|
||||
}
|
||||
if($userInfo['win_limit'] > 0){
|
||||
$winTotalToday = Bet::getWinTotalToday($userInfo['id']);
|
||||
if($winTotalToday >= $userInfo['win_limit']){
|
||||
Logger::warn(Logger::CAT_BET, 'bet_rejected', ['user_id' => $userId, 'table_id' => $tableInfo['id'] ?? 0, 'reason' => 'win_limit_tip', 'detail' => 'daily_win_limit_reached']);
|
||||
return ['status' => false, 'msg' => 'win_limit_tip'];
|
||||
}
|
||||
}
|
||||
if ($userInfo['money'] < $amount){
|
||||
Logger::warn(Logger::CAT_BET, 'bet_rejected', ['user_id' => $userId, 'table_id' => $tableInfo['id'] ?? 0, 'reason' => 'to_bet_fail_1', 'detail' => 'insufficient_balance']);
|
||||
return ['status' => false, 'msg' => 'to_bet_fail_1'];
|
||||
}
|
||||
return ['status' => true, 'numberTabInfo' => $numberTabInfo, 'userInfo' => $userInfo];
|
||||
|
||||
@@ -6,6 +6,7 @@ namespace app\services\connect;
|
||||
|
||||
use app\models\process\NumberTab;
|
||||
use app\models\table\Table;
|
||||
use app\utils\Logger;
|
||||
use freedom\utils\SocketSession;
|
||||
use think\Request;
|
||||
|
||||
@@ -30,6 +31,7 @@ class ScanConnectService
|
||||
if (!$numberTabInfo){
|
||||
$ws->emit('onlineLogin',['status' => false, 'msg' => 'Not NumberTab Data']);
|
||||
$ws->close();
|
||||
Logger::warn(Logger::CAT_CONNECT, 'scan_connect_fail', ['table_id' => $tableId, 'reason' => 'no_number_tab_data']);
|
||||
return;
|
||||
}
|
||||
$round = array();
|
||||
@@ -45,5 +47,6 @@ class ScanConnectService
|
||||
}
|
||||
$ws->join(SocketSession::HOUSE_NAME);
|
||||
$ws->emit('onlineLogin',['status' => true, 'table_id' => $tableInfo['id'], 'round' => $round]);
|
||||
Logger::info(Logger::CAT_CONNECT, 'scan_connect_success', ['table_id' => $tableId]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ namespace app\services\connect;
|
||||
|
||||
|
||||
use app\models\user\User;
|
||||
use app\utils\Logger;
|
||||
use freedom\utils\SocketSession;
|
||||
use think\Request;
|
||||
|
||||
@@ -30,13 +31,16 @@ class UserConnectService
|
||||
if($userInfo && $userInfo['login_token'] == $loginToken && $username == $userInfo['username']){
|
||||
SocketSession::saveSocketSession(['user_id' => $userId, 'username' => $username],'user');
|
||||
$ws->emit('onlineLogin',['status' => true, 'money' => $userInfo['money']]);
|
||||
Logger::info(Logger::CAT_CONNECT, 'user_login_success', ['user_id' => $userId, 'username' => $username]);
|
||||
}else{
|
||||
$ws->emit('onlineLogin',['status' => false, 'money' => 0, 'msg' => 'link_server_fail']);
|
||||
$ws->close();
|
||||
Logger::warn(Logger::CAT_CONNECT, 'user_login_auth_fail', ['user_id' => $userId, 'username' => $username, 'reason' => 'token_or_user_mismatch']);
|
||||
}
|
||||
}else{
|
||||
$ws->emit('onlineLogin',['status' => false, 'money' => 0, 'msg' => 'link_server_fail']);
|
||||
$ws->close();
|
||||
Logger::warn(Logger::CAT_CONNECT, 'user_login_param_missing', ['user_id' => $userId, 'username' => $username ?? '']);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -6,6 +6,7 @@ namespace app\services\process;
|
||||
|
||||
use app\models\process\NumberTab;
|
||||
use app\services\connect\InitTableService;
|
||||
use app\utils\Logger;
|
||||
use freedom\utils\SocketSession;
|
||||
|
||||
/**
|
||||
@@ -26,15 +27,15 @@ class ResetNumberTabService
|
||||
$numberTabInfo = InitTableService::initTable($tableInfo);
|
||||
if (!$numberTabInfo){
|
||||
$ws->emit('resetNumberTab', ['status' => false, 'msg' => 'not_number_tab_data']);
|
||||
Logger::warn(Logger::CAT_GAME, 'reset_number_tab_fail', ['table_id' => $tableInfo['id'], 'reason' => 'not_number_tab_data']);
|
||||
return;
|
||||
}
|
||||
// 调试日志
|
||||
\think\facade\Log::write('resetNumberTab debug: bet_status=' . $numberTabInfo['bet_status'] . ', rob_status=' . $numberTabInfo['rob_status'] . ', id=' . $numberTabInfo['id'] . ', boot_id=' . $numberTabInfo['boot_id'], 'info');
|
||||
Logger::info(Logger::CAT_GAME, 'reset_number_tab_attempt', ['table_id' => $tableInfo['id'], 'bet_status' => $numberTabInfo['bet_status'], 'nt_id' => $numberTabInfo['id']]);
|
||||
if($numberTabInfo['bet_status'] == 1 || $numberTabInfo['bet_status'] == 2 || $numberTabInfo['bet_status'] == 3 || ($numberTabInfo['bet_status'] == 0 && ($numberTabInfo['rob_status'] == 1 || $numberTabInfo['rob_status'] == 2))){
|
||||
//事务处理
|
||||
$res = NumberTab::resetNumberTab($numberTabInfo);
|
||||
\think\facade\Log::write('resetNumberTab result: ' . ($res ? 'true' : 'false'), 'info');
|
||||
if (!$res){
|
||||
Logger::warn(Logger::CAT_GAME, 'reset_number_tab_fail', ['table_id' => $tableInfo['id'], 'nt_id' => $numberTabInfo['id']]);
|
||||
$ws->emit('resetNumberTab', ['status' => false, 'msg' => 'reset_number_fail']);
|
||||
return;
|
||||
}
|
||||
@@ -55,8 +56,10 @@ class ResetNumberTabService
|
||||
$ws->to(SocketSession::HOUSE_NAME)->emit('resetNumberTab', $responseData);
|
||||
// 同时发送给请求者
|
||||
$ws->emit('resetNumberTab', $responseData);
|
||||
Logger::info(Logger::CAT_GAME, 'reset_number_tab', ['table_id' => $tableInfo['id'], 'nt_id' => $numberTabInfo['id']]);
|
||||
}else{
|
||||
$ws->emit('resetNumberTab', ['status' => false, 'msg' => 'reset_number_fail']);
|
||||
Logger::warn(Logger::CAT_GAME, 'reset_number_tab_fail', ['table_id' => $tableInfo['id'], 'number_tab_id' => $numberTabInfo['id'], 'reason' => 'invalid_bet_status']);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4,6 +4,7 @@
|
||||
namespace app\services\reset;
|
||||
|
||||
use app\models\process\NumberTab;
|
||||
use app\utils\Logger;
|
||||
use freedom\utils\SocketSession;
|
||||
use think\swoole\Websocket;
|
||||
|
||||
@@ -27,14 +28,17 @@ class ResetBaccaratService
|
||||
$numberTabInfo = NumberTab::getByTableIdOrderByIdDesc_two($tableInfo);
|
||||
if (!$numberTabInfo){
|
||||
$ws->emit('resetBaccarat', ['status' => false, 'msg' => 'not_number_tab_data']);
|
||||
Logger::warn(Logger::CAT_GAME, 'reset_baccarat_fail', ['table_id' => $tableInfo['id'], 'reason' => 'not_number_tab_data']);
|
||||
return;
|
||||
}
|
||||
if(count($numberTabInfo) != 2){
|
||||
$ws->emit('resetBaccarat', ['status' => false, 'msg' => '上一铺数据不存在']);
|
||||
Logger::warn(Logger::CAT_GAME, 'reset_baccarat_fail', ['table_id' => $tableInfo['id'], 'reason' => 'previous_round_not_found']);
|
||||
return;
|
||||
}
|
||||
if($numberTabInfo[0]['boot_id'] != $numberTabInfo[1]['boot_id']){
|
||||
$ws->emit('resetBaccarat', ['status' => false, 'msg' => '上一铺不在同一靴']);
|
||||
Logger::warn(Logger::CAT_GAME, 'reset_baccarat_fail', ['table_id' => $tableInfo['id'], 'reason' => 'boot_mismatch']);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -46,6 +50,7 @@ class ResetBaccaratService
|
||||
$res = NumberTab::resetBaccarat($event,$numberTabInfo,$tableInfo);
|
||||
if (!$res){
|
||||
$ws->emit('resetBaccarat', ['status' => false, 'msg' => '修改上一局结果失败']);
|
||||
Logger::warn(Logger::CAT_GAME, 'reset_baccarat_fail', ['table_id' => $tableInfo['id'], 'number_tab_id' => $numberTabInfo['id'], 'reason' => 'db_update_failed']);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -56,5 +61,6 @@ class ResetBaccaratService
|
||||
'previous_number_tab_id' => $numberTabInfo['id']
|
||||
]
|
||||
]);
|
||||
Logger::info(Logger::CAT_GAME, 'reset_baccarat', ['table_id' => $tableInfo['id'], 'opening' => $event['opening'], 'pair' => $event['pair']]);
|
||||
}
|
||||
}
|
||||
@@ -4,6 +4,7 @@
|
||||
namespace app\services\reset;
|
||||
|
||||
use app\models\process\NumberTab;
|
||||
use app\utils\Logger;
|
||||
use freedom\utils\SocketSession;
|
||||
use think\swoole\Websocket;
|
||||
|
||||
@@ -27,14 +28,17 @@ class ResetDtService
|
||||
$numberTabInfo = NumberTab::getByTableIdOrderByIdDesc_two($tableInfo);
|
||||
if (!$numberTabInfo){
|
||||
$ws->emit('resetDt', ['status' => false, 'msg' => 'not_number_tab_data']);
|
||||
Logger::warn(Logger::CAT_GAME, 'reset_dt_fail', ['table_id' => $tableInfo['id'], 'reason' => 'not_number_tab_data']);
|
||||
return;
|
||||
}
|
||||
if(count($numberTabInfo) != 2){
|
||||
$ws->emit('resetDt', ['status' => false, 'msg' => '上一铺数据不存在']);
|
||||
Logger::warn(Logger::CAT_GAME, 'reset_dt_fail', ['table_id' => $tableInfo['id'], 'reason' => 'previous_round_not_found']);
|
||||
return;
|
||||
}
|
||||
if($numberTabInfo[0]['boot_id'] != $numberTabInfo[1]['boot_id']){
|
||||
$ws->emit('resetDt', ['status' => false, 'msg' => '上一铺不在同一靴']);
|
||||
Logger::warn(Logger::CAT_GAME, 'reset_dt_fail', ['table_id' => $tableInfo['id'], 'reason' => 'boot_mismatch']);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -46,6 +50,7 @@ class ResetDtService
|
||||
$res = NumberTab::resetDt($event,$numberTabInfo,$tableInfo);
|
||||
if (!$res){
|
||||
$ws->emit('resetDt', ['status' => false, 'msg' => '修改上一局结果失败']);
|
||||
Logger::warn(Logger::CAT_GAME, 'reset_dt_fail', ['table_id' => $tableInfo['id'], 'number_tab_id' => $numberTabInfo['id'], 'reason' => 'db_update_failed']);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -56,5 +61,6 @@ class ResetDtService
|
||||
'previous_number_tab_id' => $numberTabInfo['id']
|
||||
]
|
||||
]);
|
||||
Logger::info(Logger::CAT_GAME, 'reset_dt', ['table_id' => $tableInfo['id'], 'opening' => $event['opening']]);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user