Compare commits

...
5 Commits
Author SHA1 Message Date
testadmin aa74a6edc1 fix: 荷官端卡住根因修复 — endBet防抖+状态同步+WaybillRemind越界
1. end_bet_error翻译从'停止成功'改为'已停止下注'(误导荷官以为操作成功)
2. endBet()加2秒防抖,防止连按Enter导致重复请求
3. Numpad 0加状态守卫,只在bet_status=1时才调endBet
4. endBet失败时前端自动同步服务端bet_status,不再弹错误框
5. 后端end_bet_error响应附带当前bet_status供前端同步
6. WaybillRemindService路子珠pattern检测加try-catch,消除每日59次offset -1错误
2026-05-19 00:28:02 +08:00
testadmin f3fb7628ab fix: Enter key at bet_status=1 now calls endBet() instead of silently ignoring
When endBet fails on server, client stays stuck at status=1 where Enter
key did nothing. Dealer had to void the round to recover. Now Enter at
status=1 triggers endBet(), allowing manual recovery without voiding.
2026-05-18 21:06:07 +08:00
testadmin cd149d5478 fix: add 3s debounce to opening() across all 8 dealer JS files 2026-05-17 12:16:54 +08:00
testadmin 3533758405 fix: 'Please hold on' → '请稍等' across all 8 dealer JS files 2026-05-17 12:13:50 +08:00
testadmin 444235b393 style: dragon 7 bead road circle border lineWidth 3→4 2026-05-16 16:41:07 +08:00
13 changed files with 162 additions and 38 deletions
+1 -1
View File
@@ -3,7 +3,7 @@
//应用公共文件
// 版本号
define('VERSION_V','?ver=v10.1.0');
define('VERSION_V','?ver=v10.1.1');
// 强制加载中文语言包
\think\facade\Lang::load(__DIR__ . '/lang/zh-cn.php');
+1 -1
View File
@@ -492,7 +492,7 @@ return [
'exceeds_limit_table' => '下注超出桌子限紅',
'exceeds_limit_user' => '下注超出个人限紅',
'under_limit_user' => '下注低于个人限紅',
'end_bet_error' => '停止成功',
'end_bet_error' => '停止下注',
'end_bet_error_1' => '当前局状态不在下注状态,不能停止',
'end_bet_error_2' => '停止下注失败',
'repeated_entry' => '你的账号在其他地方登陆了,即将退出',
+1 -1
View File
@@ -136,7 +136,7 @@ class NumberTab extends BaseModel
{
$numberTabInfo = self::get(['id' => $numberTabId]);
if (!$numberTabInfo) return ['status' => false, 'msg' => 'end_bet_fail'];
if ($numberTabInfo['bet_status'] != 1) return ['status' => false, 'msg' => 'end_bet_error'];
if ($numberTabInfo['bet_status'] != 1) return ['status' => false, 'msg' => 'end_bet_error', 'bet_status' => $numberTabInfo['bet_status']];
self::where(['id' => $numberTabInfo['id']])->update(['bet_status' => 2, 'bet_end_time' => time()]);
$numberTabInfo['bet_status'] = 2;
$numberTabInfo['bet_start_time'] = time();
+2 -2
View File
@@ -44,8 +44,8 @@ class EndBetService
]);
Logger::info(Logger::CAT_GAME, 'end_bet', ['table_id' => $tableInfo['id'], 'nt_id' => $numberTabId]);
}else{
Logger::warn(Logger::CAT_GAME, 'end_bet_fail', ['table_id' => $tableInfo['id'], 'msg' => $modelRes['msg']]);
$ws->emit('endBet', ['status' => false, 'msg' => $modelRes['msg']]);
Logger::warn(Logger::CAT_GAME, 'end_bet_fail', ['table_id' => $tableInfo['id'], 'msg' => $modelRes['msg'], 'bet_status' => $modelRes['bet_status'] ?? null]);
$ws->emit('endBet', ['status' => false, 'msg' => $modelRes['msg'], 'bet_status' => $modelRes['bet_status'] ?? null]);
}
}
}
@@ -99,6 +99,7 @@ class WaybillRemindService{
}
}
$bigRoad_lenth = count($bigRoadLocation);
try {
if($bigRoad_lenth >= 4){
//y=1
if($bigRoadLocation[$bigRoad_lenth-1]['show_y'] == 1){
@@ -616,6 +617,9 @@ class WaybillRemindService{
}
}
}
} catch (\Throwable $e) {
// 路子珠数据不足时跳过 pattern 检测
}
$table = WaybillRemind::where('table_id',$table_id)->find();
$create_time = time();
$bigRoadLocation = json_encode($bigRoadLocation);
+20 -5
View File
@@ -182,7 +182,11 @@ websocket.on('reconnect', (timeout) => {
var startBet = function(){
websocket.emit('startBet',{table_id : table_id, number_tab_id : number_tab_id});
};
var isEndingBet = false;
var endBet = function (){
if(isEndingBet) return;
isEndingBet = true;
setTimeout(function(){ isEndingBet = false; }, 2000);
websocket.emit('endBet',{table_id : table_id, number_tab_id : number_tab_id});
};
var startRob = function(){
@@ -227,7 +231,11 @@ var resetBoot = function(){
layer.close(index);
});
};
var isOpening = false;
var opening = function(){
if(isOpening) return;
isOpening = true;
setTimeout(function(){ isOpening = false; }, 3000);
$('.control-box .btn-box2 span').removeClass('on');
if(game_id == 1){
websocket.emit('openingBaccarat',{table_id : table_id, number_tab_id : number_tab_id});
@@ -585,7 +593,11 @@ websocket.on('endBet',function(data){
}else{
if (data.table_id != undefined && data.table_id == table_id) {
layer.msg(lang[data.msg]);
if(data.msg == 'end_bet_error' && data.bet_status != undefined){
$('#number_tab_status').val(data.bet_status);
} else {
layer.msg(lang[data.msg]);
}
}
}
});
@@ -707,7 +719,7 @@ $(function(){
if(!cookieValue){
$.cookie("enter_time", 1, { expires: 1/86400*3 });
}else{
layer.msg('Please hold on');
layer.msg('请稍等');
return false
}
@@ -730,6 +742,8 @@ $(function(){
}else{
layer.msg("请稍等!");
}
}else if (numberTabStatus == 1) {
endBet();
}else if (numberTabStatus == 2) {
opening();
}
@@ -769,11 +783,12 @@ $(function(){
var number_tab_status=$("#number_tab_status").val();
if((number_rob_status==1&&number_tab_status==0)||(number_rob_status==2&&number_tab_status==0)){
endRob();
}else{
}else if(number_tab_status == 1){
endBet();
}
}else{
endBet();
var _s = $("#number_tab_status").val();
if(_s == 1) endBet();
}
}
if(game_id == 6){
@@ -1951,7 +1966,7 @@ function SoloPath(ctb,unit,x,y,type,corners,luck_six,dragon_seven,panda_eight){
var color='#b8860b';
var fonts="7";
ctb.strokeStyle = "#ff2202";
ctb.lineWidth = 3;
ctb.lineWidth = 4;
} else if(game_id==1 && panda_eight > 0){
var color='#34495e';
var fonts="8";
+19 -4
View File
@@ -34,7 +34,11 @@ websocket.on('reconnect', (timeout) => {
var startBet = function(){
websocket.emit('startBet',{table_id : table_id, number_tab_id : number_tab_id});
};
var isEndingBet = false;
var endBet = function (){
if(isEndingBet) return;
isEndingBet = true;
setTimeout(function(){ isEndingBet = false; }, 2000);
websocket.emit('endBet',{table_id : table_id, number_tab_id : number_tab_id});
};
var startRob = function(){
@@ -79,7 +83,11 @@ var resetBoot = function(){
layer.close(index);
});
};
var isOpening = false;
var opening = function(){
if(isOpening) return;
isOpening = true;
setTimeout(function(){ isOpening = false; }, 3000);
$('.control-box .btn-box2 span').removeClass('on');
if(game_id == 1){
var opening = $('#opening').val();
@@ -312,7 +320,11 @@ websocket.on('endBet',function(data){
}else{
if (data.table_id != undefined && data.table_id == table_id) {
layer.msg(lang[data.msg]);
if(data.msg == 'end_bet_error' && data.bet_status != undefined){
$('#number_tab_status').val(data.bet_status);
} else {
layer.msg(lang[data.msg]);
}
}
}
});
@@ -381,7 +393,7 @@ $(function(){
if(!cookieValue){
$.cookie("enter_time", 1, { expires: 1/86400*3 });
}else{
layer.msg('Please hold on');
layer.msg('请稍等');
return false
}
@@ -404,6 +416,8 @@ $(function(){
}else{
layer.msg("请稍等!");
}
}else if (numberTabStatus == 1) {
endBet();
}else if (numberTabStatus == 2) {
opening();
}
@@ -444,7 +458,8 @@ $(function(){
}
// 停止倒计时
if(e.keyCode == 96){
endBet();
var _s = $("#number_tab_status").val();
if(_s == 1) endBet();
}
var betStatus = $("#number_tab_status").val();
if(betStatus == 2){
@@ -1365,7 +1380,7 @@ function SoloPath(ctb,unit,x,y,type,corners,luck_six,dragon_seven,panda_eight){
}else if(game_id==1 && dragon_seven > 0){
var color='#b8860b', fonts="7";
ctb.strokeStyle = "#ff2202";
ctb.lineWidth = 3;
ctb.lineWidth = 4;
}else if(game_id==1 && panda_eight > 0){
var color='#34495e', fonts="8";
ctb.strokeStyle = "#506878";
+19 -4
View File
@@ -137,7 +137,11 @@ var startBet = function(){
sbSocket.emit("stop",{"tableCode":casinoTableId, "type":"SYS"});
websocket.emit('startBet',{table_id : table_id, number_tab_id : number_tab_id});
};
var isEndingBet = false;
var endBet = function (){
if(isEndingBet) return;
isEndingBet = true;
setTimeout(function(){ isEndingBet = false; }, 2000);
websocket.emit('endBet',{table_id : table_id, number_tab_id : number_tab_id});
};
var startRob = function(){
@@ -193,7 +197,11 @@ var resetBoot = function(){
layer.close(index);
});
};
var isOpening = false;
var opening = function(){
if(isOpening) return;
isOpening = true;
setTimeout(function(){ isOpening = false; }, 3000);
$('.control-box .btn-box2 span').removeClass('on');
if(game_id == 1){
websocket.emit('openingBaccarat',{table_id : table_id, number_tab_id : number_tab_id});
@@ -538,7 +546,11 @@ websocket.on('endBet',function(data){
}else{
if (data.table_id != undefined && data.table_id == table_id) {
layer.msg(lang[data.msg]);
if(data.msg == 'end_bet_error' && data.bet_status != undefined){
$('#number_tab_status').val(data.bet_status);
} else {
layer.msg(lang[data.msg]);
}
}
}
});
@@ -805,7 +817,7 @@ $(function(){
if(!cookieValue){
$.cookie("enter_time", 1, { expires: 1/86400*3 });
}else{
layer.msg('Please hold on');
layer.msg('请稍等');
return false
}
@@ -828,6 +840,8 @@ $(function(){
}else{
layer.msg("请稍等!");
}
}else if (numberTabStatus == 1) {
endBet();
}else if (numberTabStatus == 2) {
opening();
}
@@ -867,11 +881,12 @@ $(function(){
var number_tab_status=$("#number_tab_status").val();
if((number_rob_status==1&&number_tab_status==0)||(number_rob_status==2&&number_tab_status==0)){
endRob();
}else{
}else if(number_tab_status == 1){
endBet();
}
}else{
endBet();
var _s = $("#number_tab_status").val();
if(_s == 1) endBet();
}
}
if(game_id == 6){
@@ -137,7 +137,11 @@ var startBet = function(){
sbSocket.emit("stop",{"tableCode":casinoTableId, "type":"SYS"});
websocket.emit('startBet',{table_id : table_id, number_tab_id : number_tab_id});
};
var isEndingBet = false;
var endBet = function (){
if(isEndingBet) return;
isEndingBet = true;
setTimeout(function(){ isEndingBet = false; }, 2000);
websocket.emit('endBet',{table_id : table_id, number_tab_id : number_tab_id});
};
var startRob = function(){
@@ -194,7 +198,11 @@ var resetBoot = function(){
layer.close(index);
});
};
var isOpening = false;
var opening = function(){
if(isOpening) return;
isOpening = true;
setTimeout(function(){ isOpening = false; }, 3000);
$('.control-box .btn-box2 span').removeClass('on');
if(game_id == 1){
websocket.emit('openingBaccarat',{table_id : table_id, number_tab_id : number_tab_id});
@@ -555,7 +563,11 @@ websocket.on('endBet',function(data){
}else{
if (data.table_id != undefined && data.table_id == table_id) {
layer.msg(lang[data.msg]);
if(data.msg == 'end_bet_error' && data.bet_status != undefined){
$('#number_tab_status').val(data.bet_status);
} else {
layer.msg(lang[data.msg]);
}
}
}
});
@@ -932,7 +944,7 @@ $(function(){
if(!cookieValue){
$.cookie("enter_time", 1, { expires: 1/86400*3 });
}else{
layer.msg('Please hold on');
layer.msg('请稍等');
return false
}
@@ -955,6 +967,8 @@ $(function(){
}else{
layer.msg("请稍等!");
}
}else if (numberTabStatus == 1) {
endBet();
}else if (numberTabStatus == 2) {
opening();
}
@@ -994,11 +1008,12 @@ $(function(){
var number_tab_status=$("#number_tab_status").val();
if((number_rob_status==1&&number_tab_status==0)||(number_rob_status==2&&number_tab_status==0)){
endRob();
}else{
}else if(number_tab_status == 1){
endBet();
}
}else{
endBet();
var _s = $("#number_tab_status").val();
if(_s == 1) endBet();
}
}
if(game_id == 6){
+19 -4
View File
@@ -28,7 +28,11 @@ websocket.on('reconnect', (timeout) => {
var startBet = function(){
websocket.emit('startBet',{table_id : table_id, number_tab_id : number_tab_id});
};
var isEndingBet = false;
var endBet = function (){
if(isEndingBet) return;
isEndingBet = true;
setTimeout(function(){ isEndingBet = false; }, 2000);
websocket.emit('endBet',{table_id : table_id, number_tab_id : number_tab_id});
};
var resetNumberTab = function(){
@@ -71,7 +75,11 @@ var resetBoot = function(){
layer.close(index);
});
};
var isOpening = false;
var opening = function(){
if(isOpening) return;
isOpening = true;
setTimeout(function(){ isOpening = false; }, 3000);
$('.control-box .btn-box2 span').removeClass('on');
let result = $('#dice_result').val();
websocket.emit('openingDice',{table_id : table_id, number_tab_id : number_tab_id, result : result});
@@ -211,7 +219,11 @@ websocket.on('endBet',function(data){
setBetStatus(data.round.number_tab_status);
}else{
if (data.table_id != undefined && data.table_id == table_id) {
layer.msg(lang[data.msg]);
if(data.msg == 'end_bet_error' && data.bet_status != undefined){
$('#number_tab_status').val(data.bet_status);
} else {
layer.msg(lang[data.msg]);
}
}
}
});
@@ -241,7 +253,7 @@ $(function(){
if(!cookieValue){
$.cookie("enter_time", 1, { expires: 1/86400*3 });
}else{
layer.msg('Please hold on');
layer.msg('请稍等');
return false
}
@@ -264,6 +276,8 @@ $(function(){
}else{
layer.msg("请稍等!");
}
}else if (numberTabStatus == 1) {
endBet();
}else if (numberTabStatus == 2) {
opening();
}
@@ -303,11 +317,12 @@ $(function(){
var number_tab_status=$("#number_tab_status").val();
if((number_rob_status==1&&number_tab_status==0)||(number_rob_status==2&&number_tab_status==0)){
endRob();
}else{
}else if(number_tab_status == 1){
endBet();
}
}else{
endBet();
var _s = $("#number_tab_status").val();
if(_s == 1) endBet();
}
}
// 骰宝结果选择
+19 -4
View File
@@ -123,7 +123,11 @@ var startBet = function(){
sbSocket.emit("stop",{"tableCode":casinoTableId, "type":"SYS"});
websocket.emit('startBet',{table_id : table_id, number_tab_id : number_tab_id});
};
var isEndingBet = false;
var endBet = function (){
if(isEndingBet) return;
isEndingBet = true;
setTimeout(function(){ isEndingBet = false; }, 2000);
websocket.emit('endBet',{table_id : table_id, number_tab_id : number_tab_id});
};
var startRob = function(){
@@ -179,7 +183,11 @@ var resetBoot = function(){
layer.close(index);
});
};
var isOpening = false;
var opening = function(){
if(isOpening) return;
isOpening = true;
setTimeout(function(){ isOpening = false; }, 3000);
$('.control-box .btn-box2 span').removeClass('on');
if(game_id == 1){
websocket.emit('openingBaccarat',{table_id : table_id, number_tab_id : number_tab_id});
@@ -527,7 +535,11 @@ websocket.on('endBet',function(data){
}else{
if (data.table_id != undefined && data.table_id == table_id) {
layer.msg(lang[data.msg]);
if(data.msg == 'end_bet_error' && data.bet_status != undefined){
$('#number_tab_status').val(data.bet_status);
} else {
layer.msg(lang[data.msg]);
}
}
}
});
@@ -774,7 +786,7 @@ $(function(){
if(!cookieValue){
$.cookie("enter_time", 1, { expires: 1/86400*3 });
}else{
layer.msg('Please hold on');
layer.msg('请稍等');
return false
}
@@ -797,6 +809,8 @@ $(function(){
}else{
layer.msg("请稍等!");
}
}else if (numberTabStatus == 1) {
endBet();
}else if (numberTabStatus == 2) {
opening();
}
@@ -836,11 +850,12 @@ $(function(){
var number_tab_status=$("#number_tab_status").val();
if((number_rob_status==1&&number_tab_status==0)||(number_rob_status==2&&number_tab_status==0)){
endRob();
}else{
}else if(number_tab_status == 1){
endBet();
}
}else{
endBet();
var _s = $("#number_tab_status").val();
if(_s == 1) endBet();
}
}
if(game_id == 6){
+19 -4
View File
@@ -184,7 +184,11 @@ var startBet = function(){
sbSocket.emit("stop",{"tableCode":casinoTableId, "type":"SYS"});
websocket.emit('startBet',{table_id : table_id, number_tab_id : number_tab_id});
};
var isEndingBet = false;
var endBet = function (){
if(isEndingBet) return;
isEndingBet = true;
setTimeout(function(){ isEndingBet = false; }, 2000);
websocket.emit('endBet',{table_id : table_id, number_tab_id : number_tab_id});
};
var startRob = function(){
@@ -240,7 +244,11 @@ var resetBoot = function(){
layer.close(index);
});
};
var isOpening = false;
var opening = function(){
if(isOpening) return;
isOpening = true;
setTimeout(function(){ isOpening = false; }, 3000);
$('.control-box .btn-box2 span').removeClass('on');
if(game_id == 1){
websocket.emit('openingBaccarat',{table_id : table_id, number_tab_id : number_tab_id});
@@ -602,7 +610,11 @@ websocket.on('endBet',function(data){
}else{
if (data.table_id != undefined && data.table_id == table_id) {
layer.msg(lang[data.msg]);
if(data.msg == 'end_bet_error' && data.bet_status != undefined){
$('#number_tab_status').val(data.bet_status);
} else {
layer.msg(lang[data.msg]);
}
}
}
});
@@ -908,7 +920,7 @@ $(function(){
if(!cookieValue){
$.cookie("enter_time", 1, { expires: 1/86400*3 });
}else{
layer.msg('Please hold on');
layer.msg('请稍等');
return false
}
@@ -931,6 +943,8 @@ $(function(){
}else{
layer.msg("请稍等!");
}
}else if (numberTabStatus == 1) {
endBet();
}else if (numberTabStatus == 2) {
opening();
}
@@ -970,11 +984,12 @@ $(function(){
var number_tab_status=$("#number_tab_status").val();
if((number_rob_status==1&&number_tab_status==0)||(number_rob_status==2&&number_tab_status==0)){
endRob();
}else{
}else if(number_tab_status == 1){
endBet();
}
}else{
endBet();
var _s = $("#number_tab_status").val();
if(_s == 1) endBet();
}
}
if(game_id == 6){
+19 -4
View File
@@ -28,7 +28,11 @@ websocket.on('reconnect', (timeout) => {
var startBet = function(){
websocket.emit('startBet',{table_id : table_id, number_tab_id : number_tab_id});
};
var isEndingBet = false;
var endBet = function (){
if(isEndingBet) return;
isEndingBet = true;
setTimeout(function(){ isEndingBet = false; }, 2000);
websocket.emit('endBet',{table_id : table_id, number_tab_id : number_tab_id});
};
var resetNumberTab = function(){
@@ -69,7 +73,11 @@ var resetBoot = function(){
layer.close(index);
});
};
var isOpening = false;
var opening = function(){
if(isOpening) return;
isOpening = true;
setTimeout(function(){ isOpening = false; }, 3000);
let result = $('#roulette_result').val();
websocket.emit('openingRoulette',{table_id : table_id, number_tab_id : number_tab_id, result : result});
};
@@ -185,7 +193,11 @@ websocket.on('endBet',function(data){
setBetStatus(data.round.number_tab_status);
}else{
if (data.table_id != undefined && data.table_id == table_id) {
layer.msg(lang[data.msg]);
if(data.msg == 'end_bet_error' && data.bet_status != undefined){
$('#number_tab_status').val(data.bet_status);
} else {
layer.msg(lang[data.msg]);
}
}
}
});
@@ -216,7 +228,7 @@ $(function(){
if(!cookieValue){
$.cookie("enter_time", 1, { expires: 1/86400*3 });
}else{
layer.msg('Please hold on');
layer.msg('请稍等');
return false
}
@@ -239,6 +251,8 @@ $(function(){
}else{
layer.msg("请稍等!");
}
}else if (numberTabStatus == 1) {
endBet();
}else if (numberTabStatus == 2) {
var result = $('#roulette_result').val();
if(result.length == 0){
@@ -282,11 +296,12 @@ $(function(){
var number_tab_status=$("#number_tab_status").val();
if((number_rob_status==1&&number_tab_status==0)||(number_rob_status==2&&number_tab_status==0)){
endRob();
}else{
}else if(number_tab_status == 1){
endBet();
}
}else{
endBet();
var _s = $("#number_tab_status").val();
if(_s == 1) endBet();
}
}
// 骰宝结果选择