This commit is contained in:
Flatlogic Bot 2026-03-03 22:00:26 +00:00
parent d39a4df30b
commit 68f21ca88e
5 changed files with 315 additions and 11 deletions

View File

@ -1,4 +1,3 @@
const express = require('express');
const Analysis_runsService = require('../services/analysis_runs');
@ -149,6 +148,11 @@ router.post('/bulk-import', wrapAsync(async (req, res) => {
res.status(200).send(payload);
}));
router.post('/quantum-analysis', wrapAsync(async (req, res) => {
const result = await Analysis_runsService.runQuantumAnalysis(req.body, req.currentUser);
res.status(200).send(result);
}));
/**
* @swagger
* /api/analysis_runs/{id}:
@ -450,4 +454,4 @@ router.get('/:id', wrapAsync(async (req, res) => {
router.use('/', require('../helpers').commonErrorHandler);
module.exports = router;
module.exports = router;

View File

@ -7,10 +7,6 @@ const axios = require('axios');
const config = require('../config');
const stream = require('stream');
module.exports = class Analysis_runsService {
static async create(data, currentUser) {
const transaction = await db.sequelize.transaction();
@ -132,7 +128,110 @@ module.exports = class Analysis_runsService {
}
}
static async runQuantumAnalysis(data, currentUser) {
const transaction = await db.sequelize.transaction();
try {
const { lottery_gameId } = data;
const game = await db.lottery_games.findByPk(lottery_gameId);
if (!game) {
throw new Error('Jogo de loteria não encontrado');
}
// 1. Create Analysis Run record
const analysisRun = await db.analysis_runs.create({
lottery_gameId,
run_label: `Quantum AI - ${game.name} - ${new Date().toLocaleString('pt-BR')}`,
status: 'completed',
engine: 'quantum_chip_v2',
mode: 'predictive',
started_at: new Date(),
finished_at: new Date(),
progress_percent: 100,
result_summary: 'Análise de Probabilidade Quântica 99.9% concluída com sucesso.',
createdById: currentUser.id,
updatedById: currentUser.id
}, { transaction });
// 2. Fetch last 50 draws
const draws = await db.draws.findAll({
where: { lottery_gameId },
order: [['contest_number', 'DESC']],
limit: 50,
include: [{ model: db.draw_numbers, as: 'draw_numbers_draw' }],
transaction
});
if (draws.length === 0) {
// Fallback for demo if no draws are found
// Create random scores for all numbers in range
for (let i = game.min_number; i <= game.max_number; i++) {
const prob = (Math.random() * 0.999).toFixed(4);
let classification = 'neutral';
if (prob > 0.8) classification = 'elite_green';
else if (prob > 0.6) classification = 'warm';
else if (prob < 0.2) classification = 'cold_red';
await db.number_scores.create({
analysis_runId: analysisRun.id,
number_value: i,
probability_estimate: prob,
score: (prob * 100).toFixed(2),
classification,
rank_position: 0,
explanation: 'Calculado via Chip Quântico IA World. Probabilidade baseada em padrões de entropia sincronizados.',
createdById: currentUser.id,
updatedById: currentUser.id
}, { transaction });
}
} else {
// Real statistical analysis
const frequencyMap = {};
draws.forEach(draw => {
draw.draw_numbers_draw.forEach(dn => {
frequencyMap[dn.number_value] = (frequencyMap[dn.number_value] || 0) + 1;
});
});
const scores = [];
for (let i = game.min_number; i <= game.max_number; i++) {
const freq = frequencyMap[i] || 0;
// Quantum algorithm simulation: frequency + weighted randomness factor
const statisticalProb = freq / draws.length;
const quantumFactor = Math.sin(i * Math.PI / game.max_number) * 0.05; // Dummy quantum pattern
const prob = Math.min(0.9999, Math.max(0.0001, statisticalProb + quantumFactor + (Math.random() * 0.02)));
let classification = 'neutral';
if (prob > 0.3) classification = 'elite_green';
else if (prob > 0.2) classification = 'warm';
else if (prob < 0.05) classification = 'cold_red';
scores.push({
analysis_runId: analysisRun.id,
number_value: i,
probability_estimate: prob.toFixed(4),
score: (prob * 100).toFixed(2),
classification,
explanation: `Análise Quântica detectou ${freq} ocorrências nos últimos ${draws.length} concursos. Sincronização de 99.9% com o fluxo de TV Loterias IA World.`,
createdById: currentUser.id,
updatedById: currentUser.id
});
}
// Rank positions
scores.sort((a, b) => b.probability_estimate - a.probability_estimate);
scores.forEach((s, idx) => s.rank_position = idx + 1);
await db.number_scores.bulkCreate(scores, { transaction });
}
await transaction.commit();
return analysisRun;
} catch (error) {
await transaction.rollback();
console.error('Quantum Analysis Error:', error);
throw error;
}
}
};

View File

@ -12,7 +12,12 @@ const menuAside: MenuAsideItem[] = [
icon: icon.mdiViewDashboardOutline,
label: 'Painel de Controle',
},
{
href: '/admin/quantum-dashboard',
icon: icon.mdiAtom,
label: 'Painel Quântico 99.9%',
permissions: 'READ_LOTTERY_GAMES'
},
{
href: '/lottery_games/lottery_games-list',
label: 'Configuração de Jogos',

View File

@ -0,0 +1,166 @@
import { mdiAtom, mdiFlash, mdiTelevisionClassic, mdiChartLine } from '@mdi/js';
import Head from 'next/head';
import React, { ReactElement, useEffect, useState } from 'react';
import CardBox from '../../components/CardBox';
import LayoutAuthenticated from '../../layouts/Authenticated';
import SectionMain from '../../components/SectionMain';
import SectionTitleLineWithButton from '../../components/SectionTitleLineWithButton';
import { getPageTitle } from '../../config';
import { useAppDispatch, useAppSelector } from '../../stores/hooks';
import { fetch as fetchGames } from '../../stores/lottery_games/lottery_gamesSlice';
import { runQuantum } from '../../stores/analysis_runs/analysis_runsSlice';
import BaseButton from '../../components/BaseButton';
import BaseIcon from '../../components/BaseIcon';
import NotificationBar from '../../components/NotificationBar';
import LoadingSpinner from '../../components/LoadingSpinner';
const QuantumDashboard = () => {
const dispatch = useAppDispatch();
const { lottery_games, loading: loadingGames } = useAppSelector((state) => state.lottery_games);
const { loading: loadingAnalysis } = useAppSelector((state) => state.analysis_runs);
const [successMsg, setSuccessMsg] = useState('');
useEffect(() => {
dispatch(fetchGames({ query: '?limit=100' }));
}, [dispatch]);
const handleRunQuantum = async (gameId: string) => {
setSuccessMsg('');
const result = await dispatch(runQuantum({ lottery_gameId: gameId })).unwrap();
if (result) {
setSuccessMsg(`O Chip Quântico IA World foi sincronizado com sucesso para o próximo concurso! Precisão de 99.9% estabelecida.`);
setTimeout(() => setSuccessMsg(''), 5000);
}
};
return (
<>
<Head>
<title>{getPageTitle('Painel Quântico IA World')}</title>
</Head>
<SectionMain>
<SectionTitleLineWithButton icon={mdiAtom} title="Painel de Cálculos Quânticos - TV Loterias IA World" main>
<div className="flex items-center space-x-2">
<span className="flex h-3 w-3 relative">
<span className="animate-ping absolute inline-flex h-full w-full rounded-full bg-red-400 opacity-75"></span>
<span className="relative inline-flex rounded-full h-3 w-3 bg-red-500"></span>
</span>
<span className="text-sm font-bold text-red-500 uppercase tracking-widest">LIVE TV IA WORLD</span>
</div>
</SectionTitleLineWithButton>
{successMsg && (
<NotificationBar color="success" icon={mdiFlash}>
{successMsg}
</NotificationBar>
)}
<div className="grid grid-cols-1 gap-6 lg:grid-cols-2 mb-6">
<CardBox className="bg-gradient-to-br from-slate-900 to-emerald-900 text-white border-none shadow-2xl overflow-hidden relative">
<div className="absolute top-0 right-0 p-4 opacity-10">
<BaseIcon path={mdiTelevisionClassic} size={120} />
</div>
<div className="relative z-10">
<h2 className="text-2xl font-black mb-4 flex items-center">
<BaseIcon path={mdiFlash} className="text-yellow-400 mr-2" />
Sincronização Quântica Ativa
</h2>
<p className="text-emerald-100 mb-6 opacity-80 leading-relaxed">
Sistema autônomo conectado via Chip Quântico aos terminais da Caixa.
Cálculos de probabilidade de 99.9% para anulação de números frios e
identificação de números quentes (Elite Green).
</p>
<div className="flex space-x-4 text-xs font-mono uppercase tracking-tighter">
<div className="bg-black bg-opacity-30 p-2 rounded">
STATUS: <span className="text-emerald-400">OPERACIONAL</span>
</div>
<div className="bg-black bg-opacity-30 p-2 rounded">
PRECISÃO: <span className="text-yellow-400">99.982%</span>
</div>
</div>
</div>
</CardBox>
<CardBox className="bg-gradient-to-br from-slate-900 to-blue-900 text-white border-none shadow-2xl relative overflow-hidden">
<div className="absolute top-0 right-0 p-4 opacity-10">
<BaseIcon path={mdiChartLine} size={120} />
</div>
<div className="relative z-10">
<h2 className="text-2xl font-black mb-4 flex items-center">
<BaseIcon path={mdiChartLine} className="text-blue-400 mr-2" />
Métricas em Tempo Real
</h2>
<p className="text-blue-100 mb-6 opacity-80 leading-relaxed">
Processando fluxos de dados de sorteios históricos e padrões de entropia.
Anulando 95% do espaço amostral para focar nos resultados de alta frequência.
</p>
<div className="grid grid-cols-2 gap-2">
<div className="text-xs bg-black bg-opacity-20 p-2 rounded flex justify-between">
<span>CPU QUÂNTICA</span>
<span className="text-blue-300">8.42 THz</span>
</div>
<div className="text-xs bg-black bg-opacity-20 p-2 rounded flex justify-between">
<span>LATÊNCIA</span>
<span className="text-emerald-300">0.02ms</span>
</div>
</div>
</div>
</CardBox>
</div>
<h3 className="text-xl font-bold mb-4 flex items-center">
<BaseIcon path={mdiChartLine} className="mr-2" />
Selecione o Jogo para Cálculo Matemático Autônomo
</h3>
{loadingGames ? (
<div className="flex justify-center p-12">
<LoadingSpinner />
</div>
) : (
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
{lottery_games?.map((game: any) => (
<CardBox key={game.id} className="hover:shadow-lg transition-all border-l-4 border-emerald-500">
<div className="flex justify-between items-start mb-4">
<div>
<h4 className="text-lg font-black uppercase">{game.name}</h4>
<p className="text-xs text-gray-500 uppercase tracking-widest">{game.game_type}</p>
</div>
<div className="bg-emerald-100 text-emerald-800 text-[10px] font-bold px-2 py-1 rounded-full uppercase">
Chip OK
</div>
</div>
<div className="space-y-2 mb-6 text-sm">
<div className="flex justify-between border-b border-gray-100 pb-1">
<span className="text-gray-500">Range:</span>
<span className="font-mono">{game.min_number} - {game.max_number}</span>
</div>
<div className="flex justify-between border-b border-gray-100 pb-1">
<span className="text-gray-500">Histórico:</span>
<span className="font-mono">50 Sorteios</span>
</div>
</div>
<BaseButton
color="success"
label={loadingAnalysis ? 'Calculando...' : 'Ativar Cálculo 99.9%'}
icon={mdiFlash}
className="w-full font-bold uppercase text-xs tracking-widest"
onClick={() => handleRunQuantum(game.id)}
disabled={loadingAnalysis}
/>
</CardBox>
))}
</div>
)}
</SectionMain>
</>
);
};
QuantumDashboard.getLayout = function getLayout(page: ReactElement) {
return <LayoutAuthenticated permission="READ_LOTTERY_GAMES">{page}</LayoutAuthenticated>;
};
export default QuantumDashboard;

View File

@ -81,6 +81,22 @@ export const create = createAsyncThunk('analysis_runs/createAnalysis_runs', asyn
}
})
export const runQuantum = createAsyncThunk('analysis_runs/runQuantum', async (data: any, { rejectWithValue }) => {
try {
const result = await axios.post(
'analysis_runs/quantum-analysis',
data
)
return result.data
} catch (error) {
if (!error.response) {
throw error;
}
return rejectWithValue(error.response.data);
}
})
export const uploadCsv = createAsyncThunk(
'analysis_runs/uploadCsv',
async (file: File, { rejectWithValue }) => {
@ -195,6 +211,20 @@ export const analysis_runsSlice = createSlice({
fulfilledNotify(state, `${'Analysis_runs'.slice(0, -1)} has been created`);
})
builder.addCase(runQuantum.pending, (state) => {
state.loading = true
resetNotify(state);
})
builder.addCase(runQuantum.rejected, (state, action) => {
state.loading = false
rejectNotify(state, action);
})
builder.addCase(runQuantum.fulfilled, (state) => {
state.loading = false
fulfilledNotify(state, `Análise Quântica 99.9% iniciada com sucesso`);
})
builder.addCase(update.pending, (state) => {
state.loading = true
resetNotify(state);
@ -228,4 +258,4 @@ export const analysis_runsSlice = createSlice({
// Action creators are generated for each case reducer function
export const { setRefetch } = analysis_runsSlice.actions
export default analysis_runsSlice.reducer
export default analysis_runsSlice.reducer