diff --git a/public/assets/js/backend/history.js b/public/assets/js/backend/history.js index 43b9be8..e62fa52 100644 --- a/public/assets/js/backend/history.js +++ b/public/assets/js/backend/history.js @@ -102,6 +102,11 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin $(document).off('click', '.btn-numberfilter').on('click', '.btn-numberfilter', function () { Controller.api.showNumberFilterDialog(); }); + + // 预测号码按钮事件 + $(document).off('click', '.btn-predict').on('click', '.btn-predict', function () { + Controller.api.showPredictDialog(); + }); }, add: function () { Controller.api.bindevent(); @@ -1520,6 +1525,441 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin html += ''; $('#dash-result', layero).html(html); + }, + + /** + * 预测号码弹窗 + */ + showPredictDialog: function () { + var html = '
' + + '
' + + '
预测算法说明
' + + '
' + + ' V1版本:基于转移概率分析(区域、生肖、尾号、首号、波色转移 + 冷热系数)
' + + ' V2版本:基于统计回归分析(遗漏回归、频率回归、区域平衡、波色平衡等)+ 历史回测验证
' + + ' V3版本(推荐):多维度综合预测,新增转移概率(马尔可夫链)、单双规律、大小规律、走势方向分析' + + '
' + + '
' + + '
' + + ' ' + + ' ' + + ' ' + + ' ' + + '
' + + '
' + + ' ' + + ' ' + + ' 留空则预测下一期' + + '
' + + '
' + + ' ' + + ' ' + + ' 建议200期以上' + + '
' + + // V3权重配置 + '
' + + ' ' + + '
' + + '
遗漏回归:
' + + '
频率回归:
' + + '
转移概率:
' + + '
单双平衡:
' + + '
大小平衡:
' + + '
走势方向:
' + + '
区域平衡:
' + + '
波色平衡:
' + + '
' + + '
' + + // V2权重配置 + '' + + // V1权重配置 + '' + + '
' + + ' ' + + '
' + + '
' + + '
'; + + Layer.open({ + type: 1, + title: '🎯 智能预测号码', + area: ['850px', '750px'], + content: html, + shadeClose: true, + success: function (layero, index) { + // 切换版本时显示对应权重配置 + $('input[name="predict-version"]', layero).on('change', function () { + var val = $(this).val(); + $('#predict-v3-weights', layero).hide(); + $('#predict-v2-weights', layero).hide(); + $('#predict-v1-weights', layero).hide(); + if (val === 'v3') { + $('#predict-v3-weights', layero).show(); + $('#predict-periods', layero).val(200); + } else if (val === 'v2') { + $('#predict-v2-weights', layero).show(); + $('#predict-periods', layero).val(200); + } else { + $('#predict-v1-weights', layero).show(); + $('#predict-periods', layero).val(100); + } + }); + $('#btn-predict-query', layero).on('click', function () { + Controller.api.queryPredict(layero); + }); + } + }); + }, + + /** + * 查询预测结果 + */ + queryPredict: function (layero) { + var $btn = $('#btn-predict-query', layero); + $btn.prop('disabled', true); + $('#predict-result', layero).html('
正在分析历史数据...
'); + + var version = $('input[name="predict-version"]:checked', layero).val(); + var periods = parseInt($('#predict-periods', layero).val()) || 200; + var targetExpect = $('#predict-target', layero).val().trim(); + var weights = {}; + + // 根据版本获取权重 + if (version === 'v3') { + $('.predict-weight-v3', layero).each(function () { + var key = $(this).data('key'); + var val = parseFloat($(this).val()) || 0; + weights[key] = val; + }); + } else if (version === 'v2') { + $('.predict-weight-v2', layero).each(function () { + var key = $(this).data('key'); + var val = parseFloat($(this).val()) || 0; + weights[key] = val; + }); + } else { + $('.predict-weight', layero).each(function () { + var key = $(this).data('key'); + var val = parseFloat($(this).val()) || 0; + weights[key] = val; + }); + } + + // 根据版本选择URL + var url = 'history/predict'; + if (version === 'v3') { + url = 'history/predictV3'; + } else if (version === 'v2') { + url = 'history/predictV2'; + } + + $.ajax({ + url: url, + type: 'GET', + data: { periods: periods, weights: JSON.stringify(weights), target_expect: targetExpect }, + dataType: 'json', + success: function (ret) { + if (ret.code == 1) { + Controller.api.renderPredict(ret.data, layero, version); + } else { + $('#predict-result', layero).html('
' + (ret.msg || '预测失败') + '
'); + } + }, + error: function () { + $('#predict-result', layero).html('
预测请求失败
'); + }, + complete: function () { + $btn.prop('disabled', false); + } + }); + }, + + /** + * 渲染预测结果 + */ + renderPredict: function (data, layero, version) { + var predictions = data.predictions || []; + var analysis = data.analysis || {}; + var hitInfo = data.hit_info || null; + var actualResult = data.actual_result || null; + var backtest = data.backtest || null; + var confidence = data.confidence || null; + + if (predictions.length === 0) { + $('#predict-result', layero).html('
暂无预测结果
'); + return; + } + + // 上期特码信息 + var lastSpecial = analysis.last_special || 0; + var lastExpect = analysis.last_expect || ''; + var lastColor = Controller.api.getColorByNum(lastSpecial); + var lastAnimal = Controller.api.getAnimalByNum(lastSpecial); + + // 版本名称映射 + var versionNames = { + 'v1': 'V1(转移概率)', + 'v2': 'V2(统计回归)', + 'v3': 'V3(多维度综合)' + }; + + var html = '
'; + + // 基准期号标题 + html += '
基于期号 ' + lastExpect + '(特码 ' + lastSpecial + ')进行预测 | 算法版本: ' + versionNames[version] + '
'; + + // 置信度评估展示(V2和V3版本) + if (confidence && (version === 'v2' || version === 'v3')) { + html += '
'; + html += '
预测置信度评估
'; + + // 数据警告提示(数据不足时显示) + if (confidence.data_warning) { + html += '
' + confidence.data_warning + '
'; + } + + html += '
'; + html += '
' + confidence.overall_confidence + '%
整体置信度
'; + + // 各排名置信度(使用得分集中度维度) + if (confidence.confidence_scores && confidence.confidence_scores.length > 0) { + html += '
'; + for (var i = 0; i < confidence.confidence_scores.length; i++) { + var cs = confidence.confidence_scores[i]; + // 阈值定义:>=70%高(绿)、50-70%中(橙)、<50%低(红) + var confLevel = cs.confidence >= 70 ? '高' : (cs.confidence >= 50 ? '中' : '低'); + var confColor = cs.confidence >= 70 ? '#4caf50' : (cs.confidence >= 50 ? '#ff9800' : '#f44336'); + html += '
'; + html += '
' + cs.confidence + '%
'; + html += '
#' + cs.rank + '
'; + html += '
'; + } + html += '
'; + } + html += '
'; + } + + // 回测验证结果(V2和V3版本) + if (backtest && (version === 'v2' || version === 'v3')) { + html += '
'; + html += '
历史回测验证(最近' + backtest.total_tests + '期)
'; + + // 回测数据警告提示 + if (backtest.data_warning) { + html += '
' + backtest.data_warning + '
'; + } + + html += '
'; + html += '
' + backtest.hit_rate + '%
命中率(Top5)
'; + html += '
' + backtest.total_hits + '/' + backtest.total_tests + '
命中次数
'; + html += '
' + (backtest.avg_rank || '—') + '
平均排名
'; + + // 新增指标:NDCG@5 和 MRR(百分比展示) + if (backtest.ndcg_5 !== undefined) { + html += '
' + (backtest.ndcg_5 * 100).toFixed(1) + '%
NDCG@5
'; + } + if (backtest.mrr !== undefined) { + html += '
' + (backtest.mrr * 100).toFixed(1) + '%
MRR
'; + } + + // 转移概率阶数显示(来自analysis.transition_order字段) + if (analysis && analysis.transition_order !== undefined) { + html += '
' + analysis.transition_order + '阶
转移概率
'; + } + html += '
'; + + // 命中分布柱状图(使用rank_1..rank_5键名) + if (backtest.hit_distribution && Object.keys(backtest.hit_distribution).length > 0) { + var distribution = backtest.hit_distribution; + var maxHit = 0; + // 找最大值用于计算柱状图高度比例 + for (var r = 1; r <= 5; r++) { + var key = 'rank_' + r; + if (distribution[key] > maxHit) { + maxHit = distribution[key]; + } + } + + html += '
命中分布(各排名命中次数):
'; + html += '
'; + for (var r = 1; r <= 5; r++) { + var key = 'rank_' + r; + var hitCount = distribution[key] || 0; + var barHeight = maxHit > 0 ? (hitCount / maxHit * 45) : 0; + var barColor = hitCount > 0 ? '#4caf50' : '#e0e0e0'; + html += '
'; + html += '
'; + html += '
#' + r + '
'; + html += '
' + hitCount + '
'; + html += '
'; + } + html += '
'; + } + + // 回测详情 + if (backtest.details && backtest.details.length > 0) { + html += '
最近' + backtest.details.length + '期验证详情:
'; + html += '
'; + for (var i = 0; i < backtest.details.length; i++) { + var bd = backtest.details[i]; + var hitTag = bd.hit ? '' : ''; + html += '
期号' + bd.expect + ': 实际' + bd.actual + ' ' + hitTag + ' 预测[' + bd.predictions.join(',') + ']
'; + } + html += '
'; + } + html += '
'; + } + + // V3版本特有的分析信息 + if (version === 'v3' && analysis) { + html += '
'; + html += '
V3多维度分析
'; + + // 单双统计 + if (analysis.oddeven_stats) { + var oe = analysis.oddeven_stats; + html += '
单双规律: 单号' + oe.odd_pct + '% / 双号' + oe.even_pct + '%'; + if (oe.recent_streak >= 2) { + html += ' | 近期连续' + (oe.recent_type === 'odd' ? '单号' : '双号') + oe.recent_streak + '期'; + html += '(平均连续' + (oe.recent_type === 'odd' ? oe.avg_odd_streak : oe.avg_even_streak) + '期)'; + } + html += '
'; + } + + // 大小统计 + if (analysis.bigsmall_stats) { + var bs = analysis.bigsmall_stats; + html += '
大小规律: 大号' + bs.big_pct + '% / 小号' + bs.small_pct + '%'; + if (bs.recent_streak >= 2) { + html += ' | 近期连续' + (bs.recent_type === 'big' ? '大号' : '小号') + bs.recent_streak + '期'; + html += '(平均连续' + (bs.recent_type === 'big' ? bs.avg_big_streak : bs.avg_small_streak) + '期)'; + } + html += '
'; + } + + // 走势方向 + if (analysis.trend_direction) { + var td = analysis.trend_direction; + var trendNames = { 'ascending': '上升(号码减小)', 'descending': '下降(号码增大)', 'jump': '跳跃震荡' }; + html += '
走势方向: ' + trendNames[td.trend_type]; + html += ' | 强度' + (td.trend_strength * 100).toFixed(0) + '% | 平均变化' + td.avg_change + '
'; + } + + // 上期属性 + html += '
上期属性: 区域[' + (analysis.last_zone || '') + '] 尾数[' + (analysis.last_tail || '') + '] 首号[' + (analysis.last_head || '') + ']
'; + html += '
'; + } + + // 遗漏统计信息(V2和V3版本) + if (analysis.omit_stats && (version === 'v2' || version === 'v3')) { + html += '
'; + html += '遗漏值统计: 平均遗漏 ' + (analysis.omit_stats.avg || 0).toFixed(1) + ' 期 | 最大遗漏 ' + (analysis.omit_stats.max || 0) + ' 期 | 期望频率 ' + analysis.expected_freq + ''; + html += '
'; + } + + // 命中结果(验证模式下显示) + if (hitInfo && actualResult) { + var hitBgColor = hitInfo.hit ? '#d4edda' : '#f8d7da'; + var hitBorderColor = hitInfo.hit ? '#28a745' : '#dc3545'; + var hitTitleColor = hitInfo.hit ? '#155724' : '#721c24'; + var actualColorHex = Controller.api.getColorByNum(hitInfo.actual_num); + + html += '
'; + html += '
'; + if (hitInfo.hit) { + html += ' 预测命中!排名第 ' + hitInfo.rank + ' 位'; + } else { + html += ' 未命中(实际号码不在预测Top' + predictions.length + '中)'; + } + html += '
'; + html += '
'; + html += '
期号 ' + hitInfo.actual_expect + ' 实际开奖:
'; + html += '' + hitInfo.actual_num + ''; + html += '
' + hitInfo.actual_animal + ' / ' + hitInfo.actual_color + '
'; + html += '
'; + } + + // 预测号码列表 + var topCount = predictions.length; + html += '
'; + html += '
预测推荐号码(Top ' + topCount + ')
'; + html += '
'; + + for (var i = 0; i < predictions.length; i++) { + var p = predictions[i]; + var colorHex = Controller.api.getColorByNum(p.num); + var animal = Controller.api.getAnimalByNum(p.num); + // 验证模式下,命中号码高亮 + var isHit = hitInfo && hitInfo.hit && p.num === hitInfo.actual_num; + var cardBg = isHit ? '#fffacd' : '#fff'; + var cardBorder = isHit ? '2px solid #f39c12' : 'none'; + var rankBadge = i < 3 ? '' + (i + 1) + '' : ''; + + // 根据版本显示不同的详情信息 + var detailInfo = ''; + if (p.detail) { + if (version === 'v3') { + // V3版本显示更多维度信息 + var omitInfo = p.detail.omit || 0; + var transScore = p.detail.trans_score || 0; + var oddevenScore = p.detail.oddeven_score || 0; + var bigsmallScore = p.detail.bigsmall_score || 0; + var trendScore = p.detail.trend_score || 0; + detailInfo = '
'; + detailInfo += '遗漏:' + omitInfo + '期 | '; + detailInfo += '转移:' + transScore + ' | '; + detailInfo += (p.detail.is_odd ? '单' : '双') + ':' + oddevenScore + ' | '; + detailInfo += (p.detail.is_big ? '大' : '小') + ':' + bigsmallScore; + detailInfo += '
'; + } else if (version === 'v2') { + var omitInfo = p.detail.omit || 0; + detailInfo = '
遗漏:' + omitInfo + '期
'; + } + } + + html += '
' + rankBadge; + html += '' + p.num + ''; + html += '
' + animal + '
'; + html += '
得分:' + p.score + '
'; + + // 显示置信度(V3版本) + if (version === 'v3' && confidence && confidence.confidence_scores) { + var csForNum = confidence.confidence_scores.find(function(c) { return c.num === p.num; }); + if (csForNum) { + // 阈值定义:>=70%高(绿)、50-70%中(橙)、<50%低(红) + var confLevel = csForNum.confidence >= 70 ? '高' : (csForNum.confidence >= 50 ? '中' : '低'); + var confColor = csForNum.confidence >= 70 ? '#4caf50' : (csForNum.confidence >= 50 ? '#ff9800' : '#f44336'); + html += '
置信度:' + confLevel + ' (' + csForNum.confidence + '%)
'; + } + } + + html += detailInfo; + html += '
'; + } + html += '
'; + + html += '
'; + $('#predict-result', layero).html(html); } } };