From 7fb2ba4dcfa178cde47e50a220fe2e993908da11 Mon Sep 17 00:00:00 2001 From: leon <916117771@qq.com> Date: Sun, 26 Apr 2026 16:52:22 +0800 Subject: [PATCH] =?UTF-8?q?feat(dashboard):=20=E6=96=B0=E5=A2=9E=E7=94=9F?= =?UTF-8?q?=E8=82=96=E8=BD=AC=E7=A7=BB=E6=A6=82=E7=8E=87=E8=A1=A8=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在控制台页面转移概率区域新增生肖(12生肖)转移概率矩阵,与现有 的区域转移和波色转移保持一致的展示风格。 --- application/admin/controller/History.php | 17 +++++- application/admin/model/History.php | 67 +++++++++++++++++++++++- public/assets/js/backend/dashboard.js | 23 ++++++++ 3 files changed, 105 insertions(+), 2 deletions(-) diff --git a/application/admin/controller/History.php b/application/admin/controller/History.php index 72ab07e..bf393b6 100644 --- a/application/admin/controller/History.php +++ b/application/admin/controller/History.php @@ -22,7 +22,7 @@ class History extends Backend * 无需额外权限检查的方法(但仍在 admin 模块内,需要 admin 登录) * @var array */ - protected $noNeedRight = ['missingNum', 'trendData', 'hotColdNumbers', 'colorWaveAnalysis', 'zodiacAnalysis', 'oddEvenAnalysis', 'bigSmallAnalysis', 'specialTrend', 'consecutiveNumbers', 'tailNumbers', 'dashboard', 'specialHeatmap', 'specialHotColdAction', 'zoneTransition', 'colorWaveTransition', 'zoneToColorTransition']; + protected $noNeedRight = ['missingNum', 'trendData', 'hotColdNumbers', 'colorWaveAnalysis', 'zodiacAnalysis', 'oddEvenAnalysis', 'bigSmallAnalysis', 'specialTrend', 'consecutiveNumbers', 'tailNumbers', 'dashboard', 'specialHeatmap', 'specialHotColdAction', 'zoneTransition', 'colorWaveTransition', 'zoneToColorTransition', 'zodiacTransition']; public function _initialize() { @@ -343,5 +343,20 @@ class History extends Backend } } + /** + * 生肖转移概率统计 + */ + public function zodiacTransition() + { + if ($this->request->isAjax()) { + $periods = $this->request->get('periods', 100, 'intval'); + if ($periods < 10 || $periods > 500) { + $this->error('期数范围必须在 10-500 之间'); + } + $result = $this->model->getZodiacTransition($periods); + $this->success('查询成功', null, $result); + } + } + } diff --git a/application/admin/model/History.php b/application/admin/model/History.php index 275b6e4..ceb538e 100644 --- a/application/admin/model/History.php +++ b/application/admin/model/History.php @@ -467,7 +467,8 @@ class History extends Model 'heatmap' => $this->getSpecialHeatmap($periods), 'zonetransition' => $this->getZoneTransition($periods), 'colorwavetransition' => $this->getColorWaveTransition($periods), - 'zonetocolortransition' => $this->getZoneToZoneColor($periods) + 'zonetocolortransition' => $this->getZoneToZoneColor($periods), + 'zodiactransition' => $this->getZodiacTransition($periods) ]; } @@ -796,6 +797,70 @@ class History extends Model ]; } + /** + * 生肖转移概率统计 + * 统计特码从一种生肖转移到另一种生肖的概率(12生肖) + * @param int $periods 查询最近多少期 + * @return array {animals: [], matrix: [], probabilities: [], row_totals: [], total_transitions: int} + */ + public function getZodiacTransition($periods = 100) + { + $history = $this + ->field('expect,num7,openTime') + ->order('openTime', 'desc') + ->limit($periods) + ->select(); + + if (empty($history) || count($history) < 2) { + return ['animals' => ['鼠','牛','虎','兔','龙','蛇','马','羊','猴','鸡','狗','猪'], 'matrix' => [], 'probabilities' => [], 'row_totals' => [], 'total_transitions' => 0]; + } + + $history = array_reverse($history); + $num_model = new Num(); + $animalMap = $num_model->column('animal', 'num'); + + $animalLabels = ['鼠', '牛', '虎', '兔', '龙', '蛇', '马', '羊', '猴', '鸡', '狗', '猪']; + $numAnimals = 12; + $matrix = array_fill(0, $numAnimals, array_fill(0, $numAnimals, 0)); + $rowTotals = array_fill(0, $numAnimals, 0); + + $getAnimalIdx = function ($num) use ($animalMap, $animalLabels) { + $animal = $animalMap[$num] ?? ''; + $idx = array_search($animal, $animalLabels); + return $idx === false ? -1 : $idx; + }; + + $totalTransitions = 0; + for ($i = 0; $i < count($history) - 1; $i++) { + $currentNum = (int)$history[$i]['num7']; + $nextNum = (int)$history[$i + 1]['num7']; + $from = $getAnimalIdx($currentNum); + $to = $getAnimalIdx($nextNum); + if ($from < 0 || $to < 0) continue; + + $matrix[$from][$to]++; + $rowTotals[$from]++; + $totalTransitions++; + } + + $probabilities = array_fill(0, $numAnimals, array_fill(0, $numAnimals, 0)); + for ($i = 0; $i < $numAnimals; $i++) { + if ($rowTotals[$i] > 0) { + for ($j = 0; $j < $numAnimals; $j++) { + $probabilities[$i][$j] = round($matrix[$i][$j] / $rowTotals[$i] * 100, 1); + } + } + } + + return [ + 'animals' => $animalLabels, + 'matrix' => $matrix, + 'probabilities' => $probabilities, + 'row_totals' => $rowTotals, + 'total_transitions' => $totalTransitions + ]; + } + /** * 区域→区域转移矩阵,单元格内显示波色概率 * 统计上一期特码所在区域后,下一期特码在各区域的分布,以及每个区域内的波色占比 diff --git a/public/assets/js/backend/dashboard.js b/public/assets/js/backend/dashboard.js index 2df510b..c2c3212 100644 --- a/public/assets/js/backend/dashboard.js +++ b/public/assets/js/backend/dashboard.js @@ -88,6 +88,7 @@ define(['jquery'], function ($) { // 区域转移概率 + 波色转移概率 if (zt && zt.matrix && zt.matrix.length > 0) { var cwt = data.colorwavetransition; + var zt2 = data.zodiactransition; html += '
| 特码 | '; + for (var z = 0; z < zt2.animals.length; z++) { + html += '' + zt2.animals[z] + ' | '; + } + html += '
|---|---|
| ' + zt2.animals[r] + ' | '; + for (var c = 0; c < zt2.animals.length; c++) { + var pct = zt2.probabilities[r][c]; + var cnt = zt2.matrix[r][c]; + var bg = pct > 30 ? '#e74c3c' : pct > 20 ? '#f39c12' : pct > 10 ? '#3498db' : pct > 0 ? '#95a5a6' : '#f5f5f5'; + var txt = pct > 10 ? '#fff' : '#333'; + html += '' + cnt + '次 ' + pct + '% | ';
+ }
+ html += '