Để tạo báo cáo với biểu đồ trực quan, chúng ta sẽ sử dụng thư viện rất mạnh về biểu đồ là ChartJS
Step 1: download thư viện và tích hợp vào dự án
ChartJS
public
├───vendor
│ └───Chart.jS
│ │ * -> các file css, js của thư viện Chart.JS
NumeralJS
public
├───vendor
│ └───numeraljs
│ │ numeraljs.min.js
Step 2: tạo controller Quản lý báo cáo Backend\BaoCaoController
Chạy câu lệnh để tạo controller
php artisan make:controller Backend\BaoCaoController
Step 3: route hiển thị báo cáo
Hiệu chỉnh file routes/web.php
// Tạo route Báo cáo Đơn hàng
Route::get('/admin/baocao/donhang', 'Backend\BaoCaoController@donhang')->name('backend.baocao.donhang');
Route::get('/admin/baocao/donhang/data', 'Backend\BaoCaoController@donhangData')->name('backend.baocao.donhang.data');
Step 4: tạo action donhang() :
Hiệu chỉnh file app\Http\Controllers\Backend\BaoCaoController.php
<?php
namespace App\Http\Controllers\Backend;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use DB;
class BaoCaoController extends Controller
{
/**
* Action hiển thị view Báo cáo đơn hàng
*/
public function donhang()
{
return view('backend.reports.donhang');
}
/**
* Action AJAX get data cho báo cáo Đơn hàng
*/
public function donhangData(Request $request)
{
$parameter = [
'tuNgay' => $request->tuNgay,
'denNgay' => $request->denNgay
];
// dd($parameter);
$data = DB::select('
SELECT dh.dh_thoiGianDatHang as thoiGian
, SUM(ctdh.ctdh_soLuong * ctdh.ctdh_donGia) as tongThanhTien
FROM cusc_donhang dh
JOIN cusc_chitietdonhang ctdh ON dh.dh_ma = ctdh.dh_ma
WHERE dh.dh_thoiGianDatHang BETWEEN :tuNgay AND :denNgay
GROUP BY dh.dh_thoiGianDatHang
', $parameter);
return response()->json(array(
'code' => 200,
'data' => $data,
));
}
}
Step 5: tạo view báo cáo Đơn hàng
- Tạo view theo cấu trúc thư mục như sau:
resources/views/backend/reports/donhang.blade.php
@extends('backend.layout.master')
@section('title')
Báo cáo Đơn hàng
@endsection
@section('feature-title')
Báo cáo Đơn hàng
@endsection
@section('feature-description')
Báo cáo Đơn hàng
@endsection
@section('content')
<div class="row">
<div class="col-md-12">
<form method="get" action="#" enctype="multipart/form-data">
{{ csrf_field() }}
<div class="form-group">
<label for="tuNgay">Từ ngày</label>
<input type="text" class="form-control" id="tuNgay" name="tuNgay">
</div>
<div class="form-group">
<label for="denNgay">Đến ngày</label>
<input type="text" class="form-control" id="denNgay" name="denNgay">
</div>
<button type="submit" class="btn btn-primary" id="btnLapBaoCao">Lập báo cáo</button>
</form>
</div>
<div class="col-md-12">
<canvas id="chartOfobjChart" style="width: 100%;height: 400px;"></canvas>
</div>
</div>
@endsection
@section('custom-scripts')
<!-- Các script dành cho thư viện Numeraljs -->
<script src="{{ asset('vendor/numeraljs/numeral.min.js') }}"></script>
<script>
// Đăng ký tiền tệ VNĐ
numeral.register('locale', 'vi', {
delimiters: {
thousands: ',',
decimal: '.'
},
abbreviations: {
thousand: 'k',
million: 'm',
billion: 'b',
trillion: 't'
},
ordinal: function(number) {
return number === 1 ? 'một' : 'không';
},
currency: {
symbol: 'vnđ'
}
});
// Sử dụng locate vi (Việt nam)
numeral.locale('vi');
</script>
<!-- Các script dành cho thư viện ChartJS -->
<script src="{{ asset('vendor/Chart.js/Chart.min.js') }}"></script>
<script>
$(document).ready(function() {
var objChart;
var $chartOfobjChart = document.getElementById("chartOfobjChart").getContext("2d");
$("#btnLapBaoCao").click(function(e) {
e.preventDefault();
$.ajax({
url: '{{ route('backend.baocao.donhang.data') }}',
type: "GET",
data: {
tuNgay: $('#tuNgay').val(),
denNgay: $('#denNgay').val(),
},
success: function(response) {
var myLabels = [];
var myData = [];
$(response.data).each(function() {
myLabels.push((this.thoiGian));
myData.push(this.tongThanhTien);
});
myData.push(0); // creates a '0' index on the graph
if (typeof $objChart !== "undefined") {
$objChart.destroy();
}
$objChart = new Chart($chartOfobjChart, {
// The type of chart we want to create
type: "bar",
data: {
labels: myLabels,
datasets: [{
data: myData,
borderColor: "#9ad0f5",
backgroundColor: "#9ad0f5",
borderWidth: 1
}]
},
// Configuration options go here
options: {
legend: {
display: false
},
title: {
display: true,
text: "Báo cáo đơn hàng"
},
scales: {
xAxes: [{
scaleLabel: {
display: true,
labelString: 'Ngày nhận đơn hàng'
}
}],
yAxes: [{
ticks: {
callback: function(value) {
return numeral(value).format('0,0 $')
}
},
scaleLabel: {
display: true,
labelString: 'Tổng thành tiền'
}
}]
},
tooltips: {
callbacks: {
label: function(tooltipItem, data) {
return numeral(tooltipItem.value).format('0,0 $')
}
}
},
responsive: true,
maintainAspectRatio: false,
}
});
}
});
});
});
</script>
@endsection
|