Compare commits

...
14 Commits
Author SHA1 Message Date
OG Backup 911ef2ce2c Merge branch 'main' of https://git.20031227.de5.net/og/Socket 2026-06-14 14:21:35 +08:00
OG Backup 2cd31285f0 backup: 线上最终版本全量备份
包含所有线上运行的改动:
- 荷官端倒计时卡顿修复(CountdownService TTL+10/前端watchdog)
- 停止下注debounce防重复(8个handle.js)
- 洗码量规则重写(单边/双边/开和不计/百家乐+龙虎)
- 龙虎和局不杀庄闲(全额退回)
- 日志系统(Logger工具类/日志查看/清理脚本)
- 好路提醒异常处理(WaybillRemindService try-catch)
- 扫牌器连接改进(ScanConnectService)
- 牛牛/三卡开牌修复
- .gitignore更新/.DS_Store清理
2026-06-14 14:20:43 +08:00
fengshao1227 73a8847ceb docs: 洗码量计算规则文档(客户2026-05-28确认的完整规则) 2026-05-29 06:14:20 +08:00
fengshao1227 e44d645547 fix: 洗码量按客户完整规则重写
百家乐+龙虎:
- 单边洗码(type_xima=2):输口计洗码,开和不计
- 双边洗码(type_xima=1):所有投注都计洗码,开和不计(庄闲退回部分除外)
- 龙虎和局不杀龙虎,全额退回
2026-05-29 05:37:40 +08:00
fengshao1227 c3621121ca fix: 龙虎洗码量改为所有输口之和,和局通杀龙虎计入洗码 2026-05-28 18:04:53 +08:00
fengshao1227 477ca7f6c9 fix: 百家乐洗码量改为所有输口投注额之和
原逻辑只算庄/闲的投注额,对子、和、幸运6、大小的输口不计入。
改为:所有输的位置的投注额都计入洗码量(庄、闲、和、庄对、闲对、幸运6、大小)。
2026-05-28 18:03:35 +08:00
testadmin 8edc071997 fix: 倒计时卡住根因修复 — Redis TTL缓冲+前端watchdog兜底
根因:CountdownService用while(sleep(1))阻塞循环推送倒计时,
Redis key TTL=wait_time,3台同时运行时worker争用导致循环慢于
Redis过期时间,key先过期→循环中断→倒计时冻结在当前秒数。

修复:
1. Redis TTL加10秒缓冲(waitTime+10),防止key提前过期
2. 前端加watchdog兜底:服务端2秒没推送就本地继续倒计时
2026-05-19 14:25:48 +08:00
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
testadmin 3bac9960b8 refine: normalize bet log names and init_table_fail level 2026-05-14 11:50:59 +08:00
testadmin a180fe8385 feat: complete logging audit - fill all gaps
- Filter noisy audio play() errors from frontend log
- Add logging to ALL 8 ToBet services (was only Baccarat)
- Add InitTableService logging (Sumday/Boot/NumberTab creation & failure)
- Add logview.sh for quick log viewing
- Add log_cleanup.sh for 30-day rotation
2026-05-14 11:49:36 +08:00
30 changed files with 487 additions and 81 deletions
Executable
+1
View File
@@ -0,0 +1 @@
APP_DEBUG=true␍␍[APP]␍DEFAULT_TIMEZONE=Asia/Shanghai␍␍[DATABASE]␍TYPE=mysql␍HOSTNAME=127.0.0.1␍DATABASE=tnt_game␍USERNAME=root␍PASSWORD=shuijizai720␍HOSTPORT=3306␍CHARSET=utf8␍DEBUG=true␍␍[LANG]␍default_lang=zh-cn␍␍[SYSTEM]␍WEBSOCKET=ws.poker4u.club␍PROTOCOL=https␍LOGO_PATH=/static/logo/fop_180_180.png␍PLAYER=https://i.55player.com/zb.html␍dt_half = 1␍SB_SERVER=http://192.168.6.32:8080␍␍[SWOOLE]␍HOST=127.0.0.1␍PORT=8082␍DAEMONIZE=false␍␍[DOMAIN]␍CONSOLE=cz.poker4u.club␍BET=bet.poker4u.club
+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();
+4
View File
@@ -3,6 +3,7 @@
namespace app\services\bet;
use app\models\bet\Bet;
use app\utils\Logger;
use freedom\utils\DiceUtil;
use freedom\utils\SocketSession;
@@ -33,6 +34,7 @@ class ToBetDiceService{
$time = time();
$toBetCheck = ToBetCommonService::toBetCheck($tableInfo,$event,$data);
if ($toBetCheck['status'] == false){
Logger::warn(Logger::CAT_BET, 'dice_bet_fail', ['table_id' => $tableInfo['id'], 'msg' => $toBetCheck['msg']]);
$ws->emit('toBet',['status' => false, 'table_id' => $tableInfo['id'], 'msg' => $toBetCheck['msg']]);
SocketSession::resetRepeat($fd,'user','isToBet');
return;
@@ -90,6 +92,7 @@ class ToBetDiceService{
$res = Bet::toBet($tableInfo,$userInfo,$numberTabInfo,$prevBetInfo,$data,$seat_num,$betTotalAmount,$time,0);
$numberTabAmount = string_to_array($numberTabInfo['dice_amount']);
if($res){
Logger::info(Logger::CAT_BET, 'dice_bet_success', ['user_id' => $userInfo['id'], 'table_id' => $tableInfo['id'], 'amount' => $amount]);
$ws->emit('toBet',['status' => true, 'table_id' => $tableInfo['id'], 'bet_amount_msg' => $betTotalAmount, 'money' => ($userInfo['money'] - $amount),'seat_num' => $seat_num, 'msg' => 'to_bet_success']);
$totalAmountArray = DiceUtil::amountInc($numberTabAmount, $data);
$round = [
@@ -98,6 +101,7 @@ class ToBetDiceService{
];
$ws->to(SocketSession::HOUSE_NAME)->emit('allBetAmount',['status' => true, 'table_id' => $tableInfo['id'], 'round' => $round]);
}else{
Logger::warn(Logger::CAT_BET, 'dice_bet_db_fail', ['user_id' => $userInfo['id'], 'table_id' => $tableInfo['id'], 'amount' => $amount]);
$ws->emit('toBet',['status' => false, 'table_id' => $tableInfo['id'], 'msg' => 'to_bet_fail']);
}
SocketSession::resetRepeat($fd,'user','isToBet');
+4
View File
@@ -5,6 +5,7 @@ namespace app\services\bet;
use app\models\bet\Bet;
use app\utils\Logger;
use freedom\utils\SocketSession;
/**
@@ -32,6 +33,7 @@ class ToBetDtService
$time = time();
$toBetCheck = ToBetCommonService::toBetCheck($tableInfo,$event,$data);
if ($toBetCheck['status'] == false){
Logger::warn(Logger::CAT_BET, 'dt_bet_fail', ['table_id' => $tableInfo['id'], 'msg' => $toBetCheck['msg']]);
$ws->emit('toBet',['status' => false, 'table_id' => $tableInfo['id'], 'msg' => $toBetCheck['msg']]);
SocketSession::resetRepeat($fd,'user','isToBet');
return;
@@ -107,6 +109,7 @@ class ToBetDtService
$res = Bet::toBet($tableInfo,$userInfo,$numberTabInfo,$prevBetInfo,$data,$seat_num,$betTotalAmount,$time,0);
if($res){
Logger::info(Logger::CAT_BET, 'dt_bet_success', ['user_id' => $userInfo['id'], 'table_id' => $tableInfo['id'], 'amount' => $amount]);
$ws->emit('toBet',['status' => true, 'table_id' => $tableInfo['id'], 'bet_amount_msg' => $betTotalAmount, 'money' => ($userInfo['money'] - $amount),'seat_num' => $seat_num, 'msg' => 'to_bet_success']);
if($userInfo['bet_type'] == 2){
$tableManager = app('swoole.table.manager');
@@ -128,6 +131,7 @@ class ToBetDtService
);
$ws->to(SocketSession::HOUSE_NAME)->emit('allBetAmount',['status' => true, 'table_id' => $tableInfo['id'], 'round' => $round]);
}else{
Logger::warn(Logger::CAT_BET, 'dt_bet_db_fail', ['user_id' => $userInfo['id'], 'table_id' => $tableInfo['id'], 'amount' => $amount]);
$ws->emit('toBet',['status' => false, 'table_id' => $tableInfo['id'], 'msg' => 'to_bet_fail']);
}
SocketSession::resetRepeat($fd,'user','isToBet');
+4
View File
@@ -4,6 +4,7 @@
namespace app\services\bet;
use app\models\bet\Bet;
use app\utils\Logger;
use freedom\utils\SocketSession;
/**
@@ -49,6 +50,7 @@ class ToBetNnService
$time = time();
$toBetCheck = ToBetCommonService::toBetCheck($tableInfo,$event,$data);
if ($toBetCheck['status'] == false){
Logger::warn(Logger::CAT_BET, 'nn_bet_fail', ['table_id' => $tableInfo['id'], 'msg' => $toBetCheck['msg']]);
$ws->emit('toBet',['status' => false, 'table_id' => $tableInfo['id'], 'msg' => $toBetCheck['msg']]);
SocketSession::resetRepeat($fd,'user','isToBet');
return;
@@ -181,9 +183,11 @@ class ToBetNnService
$res = Bet::toBet($tableInfo,$userInfo,$numberTabInfo,$prevBetInfo,$data,$seat_num,$betTotalAmount,$time,0);
if($res){
Logger::info(Logger::CAT_BET, 'nn_bet_success', ['user_id' => $userInfo['id'], 'table_id' => $tableInfo['id'], 'amount' => $amount]);
$ws->emit('toBet',['status' => true, 'table_id' => $tableInfo['id'], 'bet_amount_msg' => $betTotalAmount, 'money' => ($userInfo['money'] - $amount),'seat_num' => $seat_num, 'msg' => 'to_bet_success']);
// 待确定是否推送即时彩池,现不推送
}else{
Logger::warn(Logger::CAT_BET, 'nn_bet_db_fail', ['user_id' => $userInfo['id'], 'table_id' => $tableInfo['id'], 'amount' => $amount]);
$ws->emit('toBet',['status' => false, 'table_id' => $tableInfo['id'], 'msg' => 'to_bet_fail']);
}
SocketSession::resetRepeat($fd,'user','isToBet');
@@ -3,6 +3,7 @@
namespace app\services\bet;
use app\models\bet\Bet;
use app\utils\Logger;
use freedom\utils\RouletteUtil;
use freedom\utils\SocketSession;
@@ -36,6 +37,7 @@ class ToBetRouletteService{
$time = time();
$toBetCheck = ToBetCommonService::toBetCheck($tableInfo,$event,$data);
if ($toBetCheck['status'] == false){
Logger::warn(Logger::CAT_BET, 'roulette_bet_fail', ['table_id' => $tableInfo['id'], 'msg' => $toBetCheck['msg']]);
$ws->emit('toBet',['status' => false, 'table_id' => $tableInfo['id'], 'msg' => $toBetCheck['msg']]);
SocketSession::resetRepeat($fd,'user','isToBet');
return;
@@ -54,6 +56,7 @@ class ToBetRouletteService{
$res = Bet::toBet($tableInfo,$userInfo,$numberTabInfo,$prevBetInfo,$data,$seat_num,$betTotalAmount,$time,0,$fieldName);
$numberTabAmount = string_to_array($numberTabInfo[$fieldName]);
if($res){
Logger::info(Logger::CAT_BET, 'roulette_bet_success', ['user_id' => $userInfo['id'], 'table_id' => $tableInfo['id'], 'amount' => $amount]);
$ws->emit('toBet',['status' => true, 'table_id' => $tableInfo['id'], 'bet_amount_msg' => [$fieldName => $betTotalAmount], 'money' => ($userInfo['money'] - $amount),'seat_num' => $seat_num, 'msg' => 'to_bet_success']);
$totalAmountArray = RouletteUtil::amountInc($numberTabAmount, $data);
$round = [
@@ -62,6 +65,7 @@ class ToBetRouletteService{
];
$ws->to(SocketSession::HOUSE_NAME)->emit('allBetAmount',['status' => true, 'table_id' => $tableInfo['id'], 'round' => $round]);
}else{
Logger::warn(Logger::CAT_BET, 'roulette_bet_db_fail', ['user_id' => $userInfo['id'], 'table_id' => $tableInfo['id'], 'amount' => $amount]);
$ws->emit('toBet',['status' => false, 'table_id' => $tableInfo['id'], 'msg' => 'to_bet_fail']);
}
SocketSession::resetRepeat($fd,'user','isToBet');
+4
View File
@@ -4,6 +4,7 @@
namespace app\services\bet;
use app\models\bet\Bet;
use app\utils\Logger;
use freedom\utils\SocketSession;
/**
@@ -50,6 +51,7 @@ class ToBetTcService
$time = time();
$toBetCheck = ToBetCommonService::toBetCheck($tableInfo,$event,$data);
if ($toBetCheck['status'] == false){
Logger::warn(Logger::CAT_BET, 'tc_bet_fail', ['table_id' => $tableInfo['id'], 'msg' => $toBetCheck['msg']]);
$ws->emit('toBet',['status' => false, 'table_id' => $tableInfo['id'], 'msg' => $toBetCheck['msg']]);
SocketSession::resetRepeat($fd,'user','isToBet');
return;
@@ -182,9 +184,11 @@ class ToBetTcService
$res = Bet::toBet($tableInfo,$userInfo,$numberTabInfo,$prevBetInfo,$data,$seat_num,$betTotalAmount,$time,0);
if($res){
Logger::info(Logger::CAT_BET, 'tc_bet_success', ['user_id' => $userInfo['id'], 'table_id' => $tableInfo['id'], 'amount' => $amount]);
$ws->emit('toBet',['status' => true, 'table_id' => $tableInfo['id'], 'bet_amount_msg' => $betTotalAmount, 'money' => ($userInfo['money'] - $amount),'seat_num' => $seat_num, 'msg' => 'to_bet_success']);
// 待确定是否推送即时彩池,现不推送
}else{
Logger::warn(Logger::CAT_BET, 'tc_bet_db_fail', ['user_id' => $userInfo['id'], 'table_id' => $tableInfo['id'], 'amount' => $amount]);
$ws->emit('toBet',['status' => false, 'table_id' => $tableInfo['id'], 'msg' => 'to_bet_fail']);
}
SocketSession::resetRepeat($fd,'user','isToBet');
+4
View File
@@ -4,6 +4,7 @@
namespace app\services\bet;
use app\models\bet\Bet;
use app\utils\Logger;
use freedom\utils\SocketSession;
/**
@@ -36,6 +37,7 @@ class ToBetToningService
$time = time();
$toBetCheck = ToBetCommonService::toBetCheck($tableInfo,$event,$data);
if ($toBetCheck['status'] == false){
Logger::warn(Logger::CAT_BET, 'toning_bet_fail', ['table_id' => $tableInfo['id'], 'msg' => $toBetCheck['msg']]);
$ws->emit('toBet',['status' => false, 'table_id' => $tableInfo['id'], 'msg' => $toBetCheck['msg']]);
SocketSession::resetRepeat($fd,'user','isToBet');
return;
@@ -89,6 +91,7 @@ class ToBetToningService
$res = Bet::toBet($tableInfo,$userInfo,$numberTabInfo,$prevBetInfo,$data,$seat_num,$betTotalAmount,$time,0);
$numberTabAmount = string_to_array($numberTabInfo['toning_amount']);
if($res){
Logger::info(Logger::CAT_BET, 'toning_bet_success', ['user_id' => $userInfo['id'], 'table_id' => $tableInfo['id'], 'amount' => $amount]);
$ws->emit('toBet',['status' => true, 'table_id' => $tableInfo['id'], 'bet_amount_msg' => $betTotalAmount, 'money' => ($userInfo['money'] - $amount),'seat_num' => $seat_num, 'msg' => 'to_bet_success']);
$round = array(
'toning_zero' => isset($numberTabAmount['toning_zero']) ? intval($numberTabAmount['toning_zero'] + $data['toning_zero']) : $data['toning_zero'],
@@ -113,6 +116,7 @@ class ToBetToningService
);
$ws->to(SocketSession::HOUSE_NAME)->emit('allBetAmount',['status' => true, 'table_id' => $tableInfo['id'], 'round' => $round]);
}else{
Logger::warn(Logger::CAT_BET, 'toning_bet_db_fail', ['user_id' => $userInfo['id'], 'table_id' => $tableInfo['id'], 'amount' => $amount]);
$ws->emit('toBet',['status' => false, 'table_id' => $tableInfo['id'], 'msg' => 'to_bet_fail']);
}
SocketSession::resetRepeat($fd,'user','isToBet');
+16 -6
View File
@@ -7,6 +7,7 @@ namespace app\services\connect;
use app\models\process\Boot;
use app\models\process\NumberTab;
use app\models\process\Sumday;
use app\utils\Logger;
/**
* TODO 桌子状态服务
@@ -22,15 +23,24 @@ class InitTableService
*/
public static function initTable(array $tableInfo): array
{
//查询日结
$lastSumday = Sumday::getByTableIdOrderByIdDesc($tableInfo);
if (!$lastSumday) $lastSumday = Sumday::addByTable($tableInfo);
//查询靴
if (!$lastSumday) {
$lastSumday = Sumday::addByTable($tableInfo);
Logger::info(Logger::CAT_GAME, 'init_create_sumday', ['table_id' => $tableInfo['id']]);
}
$lastBoot = Boot::getByTableIdOrderByIdDesc($tableInfo);
if (!$lastBoot) $lastBoot = Boot::addBySumday($lastSumday);
//查询铺
if (!$lastBoot) {
$lastBoot = Boot::addBySumday($lastSumday);
Logger::info(Logger::CAT_GAME, 'init_create_boot', ['table_id' => $tableInfo['id'], 'sumday_id' => $lastSumday['id'] ?? '']);
}
$lastNumberTab = NumberTab::getByBootIdOrderByIdDesc($lastBoot);
if (!$lastNumberTab) $lastNumberTab = NumberTab::addByBoot($lastBoot);
if (!$lastNumberTab) {
$lastNumberTab = NumberTab::addByBoot($lastBoot);
Logger::info(Logger::CAT_GAME, 'init_create_number_tab', ['table_id' => $tableInfo['id'], 'boot_id' => $lastBoot['id'] ?? '']);
}
if (!$lastNumberTab) {
Logger::warn(Logger::CAT_GAME, 'init_table_fail', ['table_id' => $tableInfo['id'], 'table_name' => $tableInfo['table_name'] ?? '']);
}
return $lastNumberTab;
}
+24 -19
View File
@@ -188,11 +188,7 @@ class OpeningBaccaratService
}
$amount = $v['banker_amount'] + $v['player_amount'] + $v['tie_amount'] + $v['banker_pair_amount'] + $v['player_pair_amount'] + $v['luck_six_amount'] + $v['big_amount'] + $v['small_amount'];
$winMoney = 0;
// 双边洗码
$ximaliang = 0;
if($userInfo['type_xima'] == 1){
$ximaliang = abs($v['banker_amount'] - $v['player_amount']);
}
if($numberTabInfo['result'] == 1){
// 庄赢
if ($v['banker_amount'] > 0){
@@ -206,26 +202,26 @@ class OpeningBaccaratService
$winMoney = round($v['banker_amount'] * (1 + $userInfo['price_banker']),2) + $winMoney;
}
}
// 单边洗码
if($userInfo['type_xima'] == 2){
$ximaliang = $v['player_amount'];
if($userInfo['type_xima'] == 1){
$ximaliang = $amount;
}else{
$ximaliang += $v['player_amount'] + $v['tie_amount'];
}
}elseif($numberTabInfo['result'] == 2){
// 闲赢
if($v['player_amount'] > 0){
$winMoney = $v['player_amount'] * (1 + $userInfo['price_player']) + $winMoney;
}
// 单边洗码
if($userInfo['type_xima'] == 2){
$ximaliang = $v['banker_amount'];
if($userInfo['type_xima'] == 1){
$ximaliang = $amount;
}else{
$ximaliang += $v['banker_amount'] + $v['tie_amount'];
}
}elseif($numberTabInfo['result'] == 3) {
$ximaliang = 0;
// 和赢
// 和赢:庄闲退回,开和不计洗码
if($v['tie_amount'] > 0){
$winMoney = $v['tie_amount'] * (1 + $userInfo['price_tie_baccarat']) + $winMoney;
}
// 开 和,下注庄和闲不扣钱
if($v['banker_amount'] > 0 && $v['player_amount'] > 0){
$winMoney = $v['player_amount'] + $v['banker_amount'] + $winMoney;
}elseif($v['banker_amount'] > 0){
@@ -234,12 +230,11 @@ class OpeningBaccaratService
$winMoney = $v['player_amount'] + $winMoney;
}
}
// 对子
if($numberTabInfo['pair'] == 3){
// 计算庄对下注的赢钱金额
if ($v['banker_pair_amount'] > 0) {
$winMoney = $v['banker_pair_amount'] * (1 + $userInfo['price_pair']) + $winMoney;
}
//计算闲对下注的赢钱金额
if ($v['player_pair_amount'] > 0) {
$winMoney = $v['player_pair_amount'] * (1 + $userInfo['price_pair']) + $winMoney;
}
@@ -247,22 +242,32 @@ class OpeningBaccaratService
if ($v['banker_pair_amount'] > 0) {
$winMoney = $v['banker_pair_amount'] * (1 + $userInfo['price_pair']) + $winMoney;
}
if($userInfo['type_xima'] != 1) $ximaliang += $v['player_pair_amount'];
}elseif($numberTabInfo['pair'] == 2){
if ($v['player_pair_amount'] > 0) {
$winMoney = $v['player_pair_amount'] * (1 + $userInfo['price_pair']) + $winMoney;
}
if($userInfo['type_xima'] != 1) $ximaliang += $v['banker_pair_amount'];
}else{
if($userInfo['type_xima'] != 1) $ximaliang += $v['banker_pair_amount'] + $v['player_pair_amount'];
}
// 幸运6
if ($numberTabInfo['luck_six'] == 2 && $v['luck_six_amount'] > 0){
$winMoney = $v['luck_six_amount'] * (1 + $userInfo['price_luck_six_2']) + $winMoney;
}
if ($numberTabInfo['luck_six'] == 3 && $v['luck_six_amount'] > 0){
}elseif ($numberTabInfo['luck_six'] == 3 && $v['luck_six_amount'] > 0){
$winMoney = $v['luck_six_amount'] * (1 + $userInfo['price_luck_six_3']) + $winMoney;
}else{
if($userInfo['type_xima'] != 1) $ximaliang += $v['luck_six_amount'];
}
// 大小
if ($numberTabInfo['big_small'] == 1){
$winMoney = $v['big_amount'] * (1 + $userInfo['price_big']) + $winMoney;
}
if ($numberTabInfo['big_small'] == 2){
if($userInfo['type_xima'] != 1) $ximaliang += $v['small_amount'];
}elseif ($numberTabInfo['big_small'] == 2){
$winMoney = $v['small_amount'] * (1 + $userInfo['price_small']) + $winMoney;
if($userInfo['type_xima'] != 1) $ximaliang += $v['big_amount'];
}else{
if($userInfo['type_xima'] != 1) $ximaliang += $v['big_amount'] + $v['small_amount'];
}
// 计算最终赢钱金额
$winTotal = $winMoney - $amount;
+10 -16
View File
@@ -131,19 +131,16 @@ class OpeningDtService
}
$amount = $v['banker_amount'] + $v['player_amount'] + $v['tie_amount'];
$winMoney = 0;
// 双边洗码
$ximaliang = 0;
if($userInfo['type_xima'] == 1){
$ximaliang = abs($v['banker_amount'] - $v['player_amount']);
}
// 龙赢
if ($numberTabInfo['result'] == 1) {
if($v['banker_amount'] > 0){
$winMoney = round($v['banker_amount'] * (1 + $userInfo['price_dragon']),2) + $winMoney;
}
// 单边洗码
if($userInfo['type_xima'] == 2){
$ximaliang = $v['player_amount'];
if($userInfo['type_xima'] == 1){
$ximaliang = $amount;
}else{
$ximaliang = $v['player_amount'] + $v['tie_amount'];
}
}
// 虎赢
@@ -151,18 +148,15 @@ class OpeningDtService
if($v['player_amount'] > 0){
$winMoney = round($v['player_amount'] * (1 + $userInfo['price_tiger']),2) + $winMoney;
}
// 单边洗码
if($userInfo['type_xima'] == 2){
$ximaliang = $v['banker_amount'];
if($userInfo['type_xima'] == 1){
$ximaliang = $amount;
}else{
$ximaliang = $v['banker_amount'] + $v['tie_amount'];
}
}
// 和
// 和:不杀龙虎,全额退回
if ($numberTabInfo['result'] == 3) {
if (Env::get('system.dt_half') == 1) {
$winMoney = round(($v['banker_amount'] + $v['player_amount']) / 2, 2) + $winMoney;
} else {
$winMoney = $v['banker_amount'] + $v['player_amount'] + $winMoney;
}
$winMoney = $v['banker_amount'] + $v['player_amount'] + $winMoney;
$ximaliang = 0;
if ($v['tie_amount'] > 0) {
$winMoney = $v['tie_amount'] * (1 + $userInfo['price_tie_dt']) + $winMoney;
+1 -1
View File
@@ -27,7 +27,7 @@ class CountdownService
//处理倒计时
$waitTime = intval($tableInfo['wait_time']);
//将倒计时用作是redis的过期时间
RedisUtil::save('countdown_'.$numberTabInfo['id'],$waitTime,$waitTime);
RedisUtil::save('countdown_'.$numberTabInfo['id'],$waitTime,$waitTime + 10);
while($waitTime >= 0){
$countdown = Cache::store('redis')->get('countdown_'.$numberTabInfo['id']);
if ($countdown){
+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);
+61
View File
@@ -0,0 +1,61 @@
# 洗码量(码量)计算规则
> 客户在 2026-05-28 明确的完整规则,由此重写了开奖结算逻辑。
> 实现位置:`app/services/opening/OpeningBaccaratService.php`、`OpeningDtService.php`
## 核心定义
**洗码量 = 投注额(按原投注额度计,不乘赔率)**
系统有两种洗码模式,存于 `cg_user.type_xima`
| type_xima | 模式 | 规则 |
|-----------|------|------|
| 1 | 双边洗码 | **所有投注**都计洗码,开和不计 |
| 2 | 单边洗码 | 只有**输口**计洗码,开和不计 |
> 注意:历史代码里 type_xima 的语义曾被误用为 `1=双边/2=单边`,已确认数据库中
> 单边洗码会员是 `type_xima=2`。
## 百家乐(game_id=1
下注位置:庄、闲、和、庄对、闲对、幸运6、大、小
**单边洗码(type_xima=2)— 输口计洗码:**
- 庄赢:洗码 = 闲 + 和 + 没中的对子 + 没中的幸运6 + 没中的大小
- 闲赢:洗码 = 庄 + 和 + 没中的对子 + 没中的幸运6 + 没中的大小
- 和局:庄闲退回不计,洗码 = 没中的对子 + 没中的幸运6 + 没中的大小
**双边洗码(type_xima=1)— 所有投注都计洗码:**
- 庄赢/闲赢:洗码 = 全部投注额(`$amount`
- 和局:庄闲退回部分不计,其余照常(开和不计核心投注)
## 龙虎(game_id=2
下注位置:龙、虎、和
- **和局不杀龙虎**,龙虎全额退回(dt_half 旧逻辑"和局杀一半"已废除)
- 单边洗码:龙赢→洗码=虎+和;虎赢→洗码=龙+和
- 双边洗码:龙赢/虎赢→洗码=全部投注额;和局→0
- 赔率:龙/虎 1:0.97,和 1:40
## 百家乐赔率补充
- 庄 1:0.95,闲 1:1,和 1:8
- 免佣模式(baccarat_type=1):庄赢且非幸运6 时 1:1,幸运6 时 1:0.5
## 关键代码模式
```php
// 输口判断:开出的结果 != 投注位置 → 该位置投注额计入 ximaliang
if($userInfo['type_xima'] == 1){
$ximaliang = $amount; // 双边:全部投注
}else{
$ximaliang += <各输口投注额>; // 单边:仅输口
}
// 开和:庄闲退回,ximaliang 不累加这部分
```
## 数据落地
- 洗码记录写入 `cg_xima` 表,字段 `ximaliang`(原投注额)、`maliang`=ximaliang×码率)、`net_maliang`
- 开奖时(OpeningXxxService→Bet::openingBet)实时按各级代理当前码率计算并落库
- **码率/占成在开奖时实时读 DB**,改了码率只影响之后开的局,已开未结的局不变
+6
View File
@@ -0,0 +1,6 @@
#!/bin/bash
# OG 日志清理 - 删除30天前的日志文件
LOG_DIR="/www/wwwroot/Socket/runtime/log"
find "$LOG_DIR" -name "*.log" -type f -mtime +30 -delete 2>/dev/null
find "$LOG_DIR" -type d -empty -delete 2>/dev/null
echo "[$(date)] log cleanup done, current size: $(du -sh $LOG_DIR | cut -f1)"
Executable
+63
View File
@@ -0,0 +1,63 @@
#!/bin/bash
# OG 日志快速查看工具
# 用法: ./logview.sh [分类] [选项]
# 分类: frontend | game | connect | bet | error | all
# 选项: -f 实时跟踪 | -t N 查看最后N行 | -g "关键词" 搜索
#
# 示例:
# ./logview.sh frontend # 查看今天的前端错误
# ./logview.sh game -f # 实时跟踪游戏事件
# ./logview.sh game -g "table_id.*12" # 搜索805牛牛台
# ./logview.sh connect -t 50 # 最近50条连接日志
# ./logview.sh all -g "WARN\|ERROR" # 所有分类的警告和错误
# ./logview.sh frontend -d 2026-05-13 # 查看指定日期
LOG_DIR="/www/wwwroot/Socket/runtime/log"
DATE=$(date +%Y-%m-%d)
CATEGORY=${1:-all}
shift 2>/dev/null
MODE="tail"
LINES=30
GREP=""
CUSTOM_DATE=""
while [[ $# -gt 0 ]]; do
case $1 in
-f) MODE="follow"; shift ;;
-t) LINES=$2; shift 2 ;;
-g) GREP=$2; shift 2 ;;
-d) CUSTOM_DATE=$2; shift 2 ;;
*) shift ;;
esac
done
[[ -n "$CUSTOM_DATE" ]] && DATE=$CUSTOM_DATE
if [[ "$CATEGORY" == "all" ]]; then
CATS="frontend game connect bet error"
else
CATS=$CATEGORY
fi
for cat in $CATS; do
FILE="$LOG_DIR/$cat/$DATE.log"
if [[ ! -f "$FILE" ]]; then
echo "[$cat] 无日志: $FILE"
continue
fi
if [[ "$MODE" == "follow" ]]; then
echo "=== 实时跟踪 $cat ==="
tail -f "$FILE"
exit 0
fi
echo "=== $cat ($DATE) ==="
if [[ -n "$GREP" ]]; then
grep -i "$GREP" "$FILE" | tail -$LINES
else
tail -$LINES "$FILE"
fi
echo
done
Regular → Executable
+1 -1
View File
@@ -1 +1 @@
open_basedir=/www/wwwroot/tnt-game-socket/:/tmp/
open_basedir=/www/wwwroot/Socket/:/tmp/
+7
View File
@@ -0,0 +1,7 @@
<?php
//花式
$pattern = intval(substr(113,0,1));
//点数
$number = intval(substr(413,1,2));
var_dump($pattern);
var_dump($number);
+15
View File
@@ -2,9 +2,24 @@
var reportUrl = '/log/report';
var queue = [];
var sending = false;
var ignorePatterns = [
'play() request was interrupted',
'The play() request was interrupted',
'NotAllowedError',
'AbortError'
];
function shouldIgnore(msg) {
if (!msg) return false;
for (var i = 0; i < ignorePatterns.length; i++) {
if (msg.indexOf(ignorePatterns[i]) !== -1) return true;
}
return false;
}
function send(data) {
if (queue.length >= 10) return;
if (shouldIgnore(data.message)) return;
data.source = 'handle';
data.time = new Date().toISOString();
data.url = location.href;
+32 -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});
@@ -524,9 +532,21 @@ websocket.on('resetBoot',function(data){
}
}
});
var _cdTimer = null;
var _cdVal = 0;
websocket.on('startBetCountDown',function(data){
if(data.status == true && data.table_id == table_id){
_cdVal = data.count_down;
countDown(data.count_down);
if(_cdTimer) clearTimeout(_cdTimer);
if(_cdVal > 0){
_cdTimer = setTimeout(function _tick(){
_cdVal--;
if(_cdVal >= 0) countDown(_cdVal);
if(_cdVal > 0) _cdTimer = setTimeout(_tick, 1000);
else _cdTimer = null;
}, 2000);
}
}
});
websocket.on('endBet',function(data){
@@ -585,7 +605,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 +731,7 @@ $(function(){
if(!cookieValue){
$.cookie("enter_time", 1, { expires: 1/86400*3 });
}else{
layer.msg('Please hold on');
layer.msg('请稍等');
return false
}
@@ -730,6 +754,8 @@ $(function(){
}else{
layer.msg("请稍等!");
}
}else if (numberTabStatus == 1) {
endBet();
}else if (numberTabStatus == 2) {
opening();
}
@@ -769,11 +795,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 +1978,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";
+31 -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();
@@ -251,9 +259,21 @@ websocket.on('resetBoot',function(data){
layer.msg(lang[data.msg]);
}
});
var _cdTimer = null;
var _cdVal = 0;
websocket.on('startBetCountDown',function(data){
if(data.status == true && data.table_id == table_id){
_cdVal = data.count_down;
countDown(data.count_down);
if(_cdTimer) clearTimeout(_cdTimer);
if(_cdVal > 0){
_cdTimer = setTimeout(function _tick(){
_cdVal--;
if(_cdVal >= 0) countDown(_cdVal);
if(_cdVal > 0) _cdTimer = setTimeout(_tick, 1000);
else _cdTimer = null;
}, 2000);
}
}
});
websocket.on('endBet',function(data){
@@ -312,7 +332,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 +405,7 @@ $(function(){
if(!cookieValue){
$.cookie("enter_time", 1, { expires: 1/86400*3 });
}else{
layer.msg('Please hold on');
layer.msg('请稍等');
return false
}
@@ -404,6 +428,8 @@ $(function(){
}else{
layer.msg("请稍等!");
}
}else if (numberTabStatus == 1) {
endBet();
}else if (numberTabStatus == 2) {
opening();
}
@@ -444,7 +470,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 +1392,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";
+31 -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});
@@ -496,9 +504,21 @@ websocket.on('resetBoot',function(data){
}
}
});
var _cdTimer = null;
var _cdVal = 0;
websocket.on('startBetCountDown',function(data){
if(data.status == true && data.table_id == table_id){
_cdVal = data.count_down;
countDown(data.count_down);
if(_cdTimer) clearTimeout(_cdTimer);
if(_cdVal > 0){
_cdTimer = setTimeout(function _tick(){
_cdVal--;
if(_cdVal >= 0) countDown(_cdVal);
if(_cdVal > 0) _cdTimer = setTimeout(_tick, 1000);
else _cdTimer = null;
}, 2000);
}
}
});
websocket.on('endBet',function(data){
@@ -538,7 +558,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 +829,7 @@ $(function(){
if(!cookieValue){
$.cookie("enter_time", 1, { expires: 1/86400*3 });
}else{
layer.msg('Please hold on');
layer.msg('请稍等');
return false
}
@@ -828,6 +852,8 @@ $(function(){
}else{
layer.msg("请稍等!");
}
}else if (numberTabStatus == 1) {
endBet();
}else if (numberTabStatus == 2) {
opening();
}
@@ -867,11 +893,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});
@@ -512,9 +520,21 @@ websocket.on('resetBoot',function(data){
}
}
});
var _cdTimer = null;
var _cdVal = 0;
websocket.on('startBetCountDown',function(data){
if(data.status == true && data.table_id == table_id){
_cdVal = data.count_down;
countDown(data.count_down);
if(_cdTimer) clearTimeout(_cdTimer);
if(_cdVal > 0){
_cdTimer = setTimeout(function _tick(){
_cdVal--;
if(_cdVal >= 0) countDown(_cdVal);
if(_cdVal > 0) _cdTimer = setTimeout(_tick, 1000);
else _cdTimer = null;
}, 2000);
}
}
});
websocket.on('endBet',function(data){
@@ -555,7 +575,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 +956,7 @@ $(function(){
if(!cookieValue){
$.cookie("enter_time", 1, { expires: 1/86400*3 });
}else{
layer.msg('Please hold on');
layer.msg('请稍等');
return false
}
@@ -955,6 +979,8 @@ $(function(){
}else{
layer.msg("请稍等!");
}
}else if (numberTabStatus == 1) {
endBet();
}else if (numberTabStatus == 2) {
opening();
}
@@ -994,11 +1020,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){
+31 -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});
@@ -189,9 +197,21 @@ websocket.on('resetBoot',function(data){
}
}
});
var _cdTimer = null;
var _cdVal = 0;
websocket.on('startBetCountDown',function(data){
if(data.status == true && data.table_id == table_id){
_cdVal = data.count_down;
countDown(data.count_down);
if(_cdTimer) clearTimeout(_cdTimer);
if(_cdVal > 0){
_cdTimer = setTimeout(function _tick(){
_cdVal--;
if(_cdVal >= 0) countDown(_cdVal);
if(_cdVal > 0) _cdTimer = setTimeout(_tick, 1000);
else _cdTimer = null;
}, 2000);
}
}
});
websocket.on('endBet',function(data){
@@ -211,7 +231,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 +265,7 @@ $(function(){
if(!cookieValue){
$.cookie("enter_time", 1, { expires: 1/86400*3 });
}else{
layer.msg('Please hold on');
layer.msg('请稍等');
return false
}
@@ -264,6 +288,8 @@ $(function(){
}else{
layer.msg("请稍等!");
}
}else if (numberTabStatus == 1) {
endBet();
}else if (numberTabStatus == 2) {
opening();
}
@@ -303,11 +329,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();
}
}
// 骰宝结果选择
+31 -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});
@@ -487,9 +495,21 @@ websocket.on('resetBoot',function(data){
}
}
});
var _cdTimer = null;
var _cdVal = 0;
websocket.on('startBetCountDown',function(data){
if(data.status == true && data.table_id == table_id){
_cdVal = data.count_down;
countDown(data.count_down);
if(_cdTimer) clearTimeout(_cdTimer);
if(_cdVal > 0){
_cdTimer = setTimeout(function _tick(){
_cdVal--;
if(_cdVal >= 0) countDown(_cdVal);
if(_cdVal > 0) _cdTimer = setTimeout(_tick, 1000);
else _cdTimer = null;
}, 2000);
}
}
});
websocket.on('endBet',function(data){
@@ -527,7 +547,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 +798,7 @@ $(function(){
if(!cookieValue){
$.cookie("enter_time", 1, { expires: 1/86400*3 });
}else{
layer.msg('Please hold on');
layer.msg('请稍等');
return false
}
@@ -797,6 +821,8 @@ $(function(){
}else{
layer.msg("请稍等!");
}
}else if (numberTabStatus == 1) {
endBet();
}else if (numberTabStatus == 2) {
opening();
}
@@ -836,11 +862,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){
+31 -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});
@@ -557,9 +565,21 @@ websocket.on('resetBoot',function(data){
}
}
});
var _cdTimer = null;
var _cdVal = 0;
websocket.on('startBetCountDown',function(data){
if(data.status == true && data.table_id == table_id){
_cdVal = data.count_down;
countDown(data.count_down);
if(_cdTimer) clearTimeout(_cdTimer);
if(_cdVal > 0){
_cdTimer = setTimeout(function _tick(){
_cdVal--;
if(_cdVal >= 0) countDown(_cdVal);
if(_cdVal > 0) _cdTimer = setTimeout(_tick, 1000);
else _cdTimer = null;
}, 2000);
}
}
});
websocket.on('endBet',function(data){
@@ -602,7 +622,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 +932,7 @@ $(function(){
if(!cookieValue){
$.cookie("enter_time", 1, { expires: 1/86400*3 });
}else{
layer.msg('Please hold on');
layer.msg('请稍等');
return false
}
@@ -931,6 +955,8 @@ $(function(){
}else{
layer.msg("请稍等!");
}
}else if (numberTabStatus == 1) {
endBet();
}else if (numberTabStatus == 2) {
opening();
}
@@ -970,11 +996,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){
+31 -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});
};
@@ -169,9 +177,21 @@ websocket.on('resetBoot',function(data){
}
}
});
var _cdTimer = null;
var _cdVal = 0;
websocket.on('startBetCountDown',function(data){
if(data.status == true && data.table_id == table_id){
_cdVal = data.count_down;
countDown(data.count_down);
if(_cdTimer) clearTimeout(_cdTimer);
if(_cdVal > 0){
_cdTimer = setTimeout(function _tick(){
_cdVal--;
if(_cdVal >= 0) countDown(_cdVal);
if(_cdVal > 0) _cdTimer = setTimeout(_tick, 1000);
else _cdTimer = null;
}, 2000);
}
}
});
websocket.on('endBet',function(data){
@@ -185,7 +205,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 +240,7 @@ $(function(){
if(!cookieValue){
$.cookie("enter_time", 1, { expires: 1/86400*3 });
}else{
layer.msg('Please hold on');
layer.msg('请稍等');
return false
}
@@ -239,6 +263,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 +308,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();
}
}
// 骰宝结果选择