added new graph instatkpi
This commit is contained in:
@@ -154,6 +154,27 @@ while ($row = $productBySupplierResult->fetch_assoc()) {
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// New Query: Distribution of analyses (for pie chart)
|
||||||
|
$analysisDistributionQuery = "
|
||||||
|
SELECT a.nameanalysisvoc AS analysisName, COUNT(DISTINCT rp.idreports, rp.idPart, rp.result_TestName) AS totalTests
|
||||||
|
FROM result_project rp
|
||||||
|
LEFT JOIN analysisvocabulary a ON rp.result_TestName = a.idanalysisvocabulary
|
||||||
|
LEFT JOIN reports r ON rp.idreports = r.idreports
|
||||||
|
LEFT JOIN products p ON r.idproducts = p.idproducts
|
||||||
|
$filters
|
||||||
|
GROUP BY rp.result_TestName
|
||||||
|
ORDER BY totalTests DESC
|
||||||
|
";
|
||||||
|
|
||||||
|
$analysisDistributionResult = $conn->query($analysisDistributionQuery);
|
||||||
|
$analysisDistribution = [];
|
||||||
|
while ($row = $analysisDistributionResult->fetch_assoc()) {
|
||||||
|
$analysisDistribution[] = [
|
||||||
|
'analysisName' => $row['analysisName'],
|
||||||
|
'totalTests' => $row['totalTests']
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
// Ora controlliamo se è una richiesta AJAX
|
// Ora controlliamo se è una richiesta AJAX
|
||||||
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||||
// Rispondi ai dati aggiornati tramite AJAX
|
// Rispondi ai dati aggiornati tramite AJAX
|
||||||
@@ -170,7 +191,8 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|||||||
'otherReportsPie' => $otherReportsPie,
|
'otherReportsPie' => $otherReportsPie,
|
||||||
'topFailingAnalysis' => $topFailingAnalysis,
|
'topFailingAnalysis' => $topFailingAnalysis,
|
||||||
'worstSuppliers' => $worstSuppliers,
|
'worstSuppliers' => $worstSuppliers,
|
||||||
'productBySupplier' => $productBySupplier
|
'productBySupplier' => $productBySupplier,
|
||||||
|
'analysisDistribution' => $analysisDistribution // Distribuzione delle analisi per il grafico a torta
|
||||||
]);
|
]);
|
||||||
exit; // Ferma l'esecuzione del resto dello script dopo aver risposto all'AJAX
|
exit; // Ferma l'esecuzione del resto dello script dopo aver risposto all'AJAX
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -388,6 +388,18 @@ include('parsedatachart.php');
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-12">
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-body">
|
||||||
|
<h5 class="card-title">Analysis Distribution</h5>
|
||||||
|
<div id="analysisDistributionChart"></div> <!-- Il grafico verrà inserito qui -->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</div><!-- container -->
|
</div><!-- container -->
|
||||||
@@ -404,13 +416,80 @@ include('parsedatachart.php');
|
|||||||
</div>
|
</div>
|
||||||
<!-- END wrapper -->
|
<!-- END wrapper -->
|
||||||
<script>
|
<script>
|
||||||
$(document).ready(function() {
|
// Define the horizontal bar chart for analysis distribution
|
||||||
// Inizializza Select2 per il filtro supplier
|
var analysisBarChartOptions = {
|
||||||
$('#supplierFilter').select2({
|
series: [{
|
||||||
placeholder: 'Select a supplier',
|
name: 'Total Tests',
|
||||||
allowClear: true
|
data: [] // Initially empty, will be filled via AJAX
|
||||||
});
|
}],
|
||||||
|
chart: {
|
||||||
|
type: 'bar',
|
||||||
|
height: 500
|
||||||
|
},
|
||||||
|
plotOptions: {
|
||||||
|
bar: {
|
||||||
|
horizontal: true,
|
||||||
|
columnWidth: '100%',
|
||||||
|
endingShape: 'rounded'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
dataLabels: {
|
||||||
|
enabled: true
|
||||||
|
},
|
||||||
|
stroke: {
|
||||||
|
show: true,
|
||||||
|
width: 2,
|
||||||
|
colors: ['transparent']
|
||||||
|
},
|
||||||
|
xaxis: {
|
||||||
|
title: {
|
||||||
|
text: 'Number of Tests'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
yaxis: {
|
||||||
|
labels: {
|
||||||
|
show: true,
|
||||||
|
maxWidth: 700, // Increased max width for labels
|
||||||
|
style: {
|
||||||
|
fontSize: '12px',
|
||||||
|
colors: ['#000']
|
||||||
|
}
|
||||||
|
},
|
||||||
|
title: {
|
||||||
|
text: 'Analysis Name'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
fill: {
|
||||||
|
opacity: 1,
|
||||||
|
colors: ['#004d00']
|
||||||
|
},
|
||||||
|
tooltip: {
|
||||||
|
y: {
|
||||||
|
formatter: function(val) {
|
||||||
|
return val + " tests";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
title: {
|
||||||
|
text: 'Analysis Distribution',
|
||||||
|
align: 'center'
|
||||||
|
},
|
||||||
|
grid: {
|
||||||
|
padding: {
|
||||||
|
left: 10 // Increased left padding for more label space
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Create the initial chart
|
||||||
|
var analysisBarChart = new ApexCharts(document.querySelector("#analysisDistributionChart"), analysisBarChartOptions);
|
||||||
|
analysisBarChart.render();
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<script>
|
||||||
|
$(document).ready(function() {
|
||||||
// Funzione per aggiornare i dati con AJAX
|
// Funzione per aggiornare i dati con AJAX
|
||||||
function updateData() {
|
function updateData() {
|
||||||
var startDate = $('#startDate').val();
|
var startDate = $('#startDate').val();
|
||||||
@@ -426,7 +505,6 @@ include('parsedatachart.php');
|
|||||||
supplier: supplier
|
supplier: supplier
|
||||||
},
|
},
|
||||||
success: function(response) {
|
success: function(response) {
|
||||||
// Assicurati di fare il parsing della risposta JSON
|
|
||||||
var data = JSON.parse(response);
|
var data = JSON.parse(response);
|
||||||
|
|
||||||
// Aggiorna le cards con i nuovi dati
|
// Aggiorna le cards con i nuovi dati
|
||||||
@@ -438,19 +516,30 @@ include('parsedatachart.php');
|
|||||||
$('#failedTests').text(data.failedTests);
|
$('#failedTests').text(data.failedTests);
|
||||||
$('#failedTestsPercent').text('(' + data.failedTestsPercent.toFixed(2) + '%)');
|
$('#failedTestsPercent').text('(' + data.failedTestsPercent.toFixed(2) + '%)');
|
||||||
|
|
||||||
// Aggiorna il grafico dei report (Pie Chart)
|
// Aggiorna il grafico della distribuzione delle analisi
|
||||||
chart.updateSeries([data.failReportsPie, data.passReportsPie, data.otherReportsPie]);
|
if (data.analysisDistribution && data.analysisDistribution.length > 0) {
|
||||||
|
// Ordina i dati per numero di test e prendi solo i primi 15
|
||||||
|
var sortedData = data.analysisDistribution.sort(function(a, b) {
|
||||||
|
return b.totalTests - a.totalTests;
|
||||||
|
}).slice(0, 15); // Prendi solo le prime 15 analisi
|
||||||
|
|
||||||
// Mostra i filtri attivi
|
var analysisLabels = sortedData.map(function(item) {
|
||||||
var filterText = '';
|
return item.analysisName;
|
||||||
if (startDate && endDate) {
|
});
|
||||||
filterText += 'Date: ' + startDate + ' to ' + endDate + ' ';
|
var analysisCounts = sortedData.map(function(item) {
|
||||||
|
return parseInt(item.totalTests, 10); // Converte il conteggio dei test in numeri interi
|
||||||
|
});
|
||||||
|
|
||||||
|
// Aggiorna il grafico a barre verticali
|
||||||
|
analysisBarChart.updateOptions({
|
||||||
|
xaxis: {
|
||||||
|
categories: analysisLabels // Aggiorna le etichette
|
||||||
|
}
|
||||||
|
});
|
||||||
|
analysisBarChart.updateSeries([{
|
||||||
|
data: analysisCounts // Aggiorna i dati del grafico
|
||||||
|
}]);
|
||||||
}
|
}
|
||||||
if (supplier) {
|
|
||||||
filterText += 'Supplier: ' + $('#supplierFilter option:selected').text();
|
|
||||||
}
|
|
||||||
$('#filterDisplay').text(filterText);
|
|
||||||
$('#activeFilters').show();
|
|
||||||
},
|
},
|
||||||
error: function() {
|
error: function() {
|
||||||
alert('Error retrieving data.');
|
alert('Error retrieving data.');
|
||||||
@@ -477,6 +566,7 @@ include('parsedatachart.php');
|
|||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
document.getElementById('totalProducts').innerText = <?php echo $totalProducts; ?>;
|
document.getElementById('totalProducts').innerText = <?php echo $totalProducts; ?>;
|
||||||
document.getElementById('totalReports').innerText = <?php echo $totalReports; ?>;
|
document.getElementById('totalReports').innerText = <?php echo $totalReports; ?>;
|
||||||
|
|||||||
Reference in New Issue
Block a user