From 020dd802d69ef3d91ba347baa7bb139b23e22f4e Mon Sep 17 00:00:00 2001 From: li Date: Fri, 29 May 2026 06:43:21 +0800 Subject: [PATCH] =?UTF-8?q?feat(agent):=20=E7=BC=96=E8=BE=91=E4=BB=A3?= =?UTF-8?q?=E7=90=86=E8=B4=B9=E7=8E=87=E6=97=B6=E6=A3=80=E6=B5=8B=E4=B8=8B?= =?UTF-8?q?=E7=BA=A7=E6=9C=AA=E7=BB=93=E7=AE=97=E6=B3=A8=E5=8D=95=E5=B9=B6?= =?UTF-8?q?=E4=BA=8C=E6=AC=A1=E7=A1=AE=E8=AE=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 洗码率/返水率/占成率在下注未结算期间被修改, 结算(openingBet)会按新值 参与代理分账, 导致本局佣金与下注时预期不符。新增编辑时检测: 费率确有 变动且下级存在近1小时内 is_end=0 的注单时返回 code=2, 前端弹框二次 确认, 确认后带 confirm_pending 重提。纯增量护栏, 不改结算逻辑。 --- application/agent/controller/Agent.php | 32 ++++++++++++++++++++++++++ application/agent/view/agent/edit.html | 27 ++++++++++++++++++++++ 2 files changed, 59 insertions(+) diff --git a/application/agent/controller/Agent.php b/application/agent/controller/Agent.php index 4de06d1..11ee619 100755 --- a/application/agent/controller/Agent.php +++ b/application/agent/controller/Agent.php @@ -682,6 +682,38 @@ class Agent Extends Common{ die(json_encode(['code'=>0,'msg'=>$lang['rebate_cannot_lower_agent'].' '.$childMaxRebateRate.'%'])); } + // —— 时序风险检测 —— + // 洗码率/返水率/占成率在「下注未结算」期间被修改,结算(openingBet)会按新值参与代理分账, + // 导致本局佣金与下注时预期不符。仅当上述费率确有变化、且该代理下级存在未结算注单时,要求二次确认。 + // 限红(limit_*)不参与结算、赔率(price_*)代理端只读,故不在检测范围。 + $confirm_pending = Request::instance()->post('confirm_pending'); + $rateChanged = ( + abs($agent_ximalv - (float)$user['agent_ximalv']) > 0.001 || + abs($agent_ximalv_dt - (float)$user['agent_ximalv_dt']) > 0.001 || + abs($agent_ximalv_nn - (float)$user['agent_ximalv_nn']) > 0.001 || + abs($agent_ximalv_tc - (float)$user['agent_ximalv_tc']) > 0.001 || + abs($agent_cs - (float)$user['agent_cs']) > 0.001 || + abs((float)$rebate_rate - (float)$user['rebate_rate']) > 0.001 + ); + if($rateChanged && !$confirm_pending){ + // bet 表位于 DB2 连接(与 Report 模块一致);下级注单路径匹配沿用全站约定的两段 LIKE。 + // create_time 限定近 1 小时,规避历史异常残留的 is_end=0 注单造成的误报。 + $pendingCount = Db::connect('DB2')->name('bet') + ->where('is_end', 0) + ->where('create_time', '>=', time() - 3600) + ->where(function($q) use ($user_id){ + $q->where('agent_parent_id_path', 'like', '%,'.$user_id.',%') + ->whereOr('agent_parent_id_path', 'like', $user_id.',%'); + }) + ->count(); + if($pendingCount > 0){ + die(json_encode([ + 'code' => 2, + 'pending' => $pendingCount, + 'msg' => '该代理下级当前有 '.$pendingCount.' 笔注单尚未结算。本次修改的洗码率 / 返水率 / 占成率将按新值参与这些注单的代理分账,可能使本局佣金与下注时预期不符。确定仍要立即保存吗?', + ])); + } + } // 拼装数据创建代理 $user_data = array(); diff --git a/application/agent/view/agent/edit.html b/application/agent/view/agent/edit.html index 07b279d..08f692b 100755 --- a/application/agent/view/agent/edit.html +++ b/application/agent/view/agent/edit.html @@ -277,6 +277,33 @@ x_admin_close(); parent.location.reload(); }); + } else if (data.code == 2) { + // 时序风险:下级有未结算注单,二次确认后带 confirm_pending 重新提交 + layer.confirm(data.msg, { + title: lang.message, + btn: ['确定保存', '取消'] + }, function (idx) { + layer.close(idx); + query.confirm_pending = 1; + $.ajax({ + url: '/agent/do_edit', + data: query, + type: 'POST', + dataType: 'JSON', + success: function (d) { + if (d.code == 0) { + layer.msg(d.msg); + } else if (d.code == 1) { + layer.alert(d.msg, { + title: lang.message + }, function () { + x_admin_close(); + parent.location.reload(); + }); + } + } + }); + }); } } })