207 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			207 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
// app/static/js/borrow_statistics.js
 | 
						|
document.addEventListener('DOMContentLoaded', function() {
 | 
						|
    const timeRangeSelect = document.getElementById('time-range');
 | 
						|
    let trendChart = null;
 | 
						|
    let categoryChart = null;
 | 
						|
 | 
						|
    // 初始加载
 | 
						|
    loadBorrowTrend();
 | 
						|
    loadCategoryDistribution();
 | 
						|
 | 
						|
    // 添加事件监听器
 | 
						|
    timeRangeSelect.addEventListener('change', loadBorrowTrend);
 | 
						|
 | 
						|
    function loadBorrowTrend() {
 | 
						|
        const timeRange = timeRangeSelect.value;
 | 
						|
 | 
						|
        // 调用API获取数据
 | 
						|
        fetch(`/statistics/api/borrow-trend?time_range=${timeRange}`)
 | 
						|
            .then(response => response.json())
 | 
						|
            .then(data => {
 | 
						|
                updateTrendChart(data);
 | 
						|
                updateBorrowSummary(data);
 | 
						|
            })
 | 
						|
            .catch(error => {
 | 
						|
                console.error('加载借阅趋势数据失败:', error);
 | 
						|
            });
 | 
						|
    }
 | 
						|
 | 
						|
    function loadCategoryDistribution() {
 | 
						|
        // 调用API获取数据
 | 
						|
        fetch('/statistics/api/category-distribution')
 | 
						|
            .then(response => response.json())
 | 
						|
            .then(data => {
 | 
						|
                updateCategoryChart(data);
 | 
						|
            })
 | 
						|
            .catch(error => {
 | 
						|
                console.error('加载分类分布数据失败:', error);
 | 
						|
            });
 | 
						|
    }
 | 
						|
 | 
						|
    function updateTrendChart(data) {
 | 
						|
        // 销毁旧图表
 | 
						|
        if (trendChart) {
 | 
						|
            trendChart.destroy();
 | 
						|
        }
 | 
						|
 | 
						|
        if (!data || data.length === 0) {
 | 
						|
            return;
 | 
						|
        }
 | 
						|
 | 
						|
        // 准备图表数据
 | 
						|
        const labels = data.map(item => item.date);
 | 
						|
        const borrowData = data.map(item => item.borrow);
 | 
						|
        const returnData = data.map(item => item.return);
 | 
						|
        const overdueData = data.map(item => item.overdue);
 | 
						|
 | 
						|
        // 创建图表
 | 
						|
        const ctx = document.getElementById('trend-chart').getContext('2d');
 | 
						|
        trendChart = new Chart(ctx, {
 | 
						|
            type: 'line',
 | 
						|
            data: {
 | 
						|
                labels: labels,
 | 
						|
                datasets: [
 | 
						|
                    {
 | 
						|
                        label: '借阅数',
 | 
						|
                        data: borrowData,
 | 
						|
                        borderColor: 'rgba(54, 162, 235, 1)',
 | 
						|
                        backgroundColor: 'rgba(54, 162, 235, 0.1)',
 | 
						|
                        tension: 0.1,
 | 
						|
                        fill: true
 | 
						|
                    },
 | 
						|
                    {
 | 
						|
                        label: '归还数',
 | 
						|
                        data: returnData,
 | 
						|
                        borderColor: 'rgba(75, 192, 192, 1)',
 | 
						|
                        backgroundColor: 'rgba(75, 192, 192, 0.1)',
 | 
						|
                        tension: 0.1,
 | 
						|
                        fill: true
 | 
						|
                    },
 | 
						|
                    {
 | 
						|
                        label: '逾期数',
 | 
						|
                        data: overdueData,
 | 
						|
                        borderColor: 'rgba(255, 99, 132, 1)',
 | 
						|
                        backgroundColor: 'rgba(255, 99, 132, 0.1)',
 | 
						|
                        tension: 0.1,
 | 
						|
                        fill: true
 | 
						|
                    }
 | 
						|
                ]
 | 
						|
            },
 | 
						|
            options: {
 | 
						|
                responsive: true,
 | 
						|
                maintainAspectRatio: false,
 | 
						|
                scales: {
 | 
						|
                    y: {
 | 
						|
                        beginAtZero: true,
 | 
						|
                        title: {
 | 
						|
                            display: true,
 | 
						|
                            text: '数量'
 | 
						|
                        }
 | 
						|
                    },
 | 
						|
                    x: {
 | 
						|
                        title: {
 | 
						|
                            display: true,
 | 
						|
                            text: '日期'
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
                },
 | 
						|
                plugins: {
 | 
						|
                    title: {
 | 
						|
                        display: true,
 | 
						|
                        text: '借阅与归还趋势'
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
        });
 | 
						|
    }
 | 
						|
 | 
						|
    function updateCategoryChart(data) {
 | 
						|
        // 销毁旧图表
 | 
						|
        if (categoryChart) {
 | 
						|
            categoryChart.destroy();
 | 
						|
        }
 | 
						|
 | 
						|
        if (!data || data.length === 0) {
 | 
						|
            return;
 | 
						|
        }
 | 
						|
 | 
						|
        // 准备图表数据
 | 
						|
        const labels = data.map(item => item.category);
 | 
						|
        const counts = data.map(item => item.count);
 | 
						|
 | 
						|
        // 创建图表
 | 
						|
        const ctx = document.getElementById('category-chart').getContext('2d');
 | 
						|
        categoryChart = new Chart(ctx, {
 | 
						|
            type: 'pie',
 | 
						|
            data: {
 | 
						|
                labels: labels,
 | 
						|
                datasets: [{
 | 
						|
                    data: counts,
 | 
						|
                    backgroundColor: [
 | 
						|
                        'rgba(255, 99, 132, 0.7)',
 | 
						|
                        'rgba(54, 162, 235, 0.7)',
 | 
						|
                        'rgba(255, 206, 86, 0.7)',
 | 
						|
                        'rgba(75, 192, 192, 0.7)',
 | 
						|
                        'rgba(153, 102, 255, 0.7)',
 | 
						|
                        'rgba(255, 159, 64, 0.7)',
 | 
						|
                        'rgba(199, 199, 199, 0.7)',
 | 
						|
                        'rgba(83, 102, 255, 0.7)',
 | 
						|
                        'rgba(40, 159, 64, 0.7)',
 | 
						|
                        'rgba(210, 199, 199, 0.7)'
 | 
						|
                    ],
 | 
						|
                    borderWidth: 1
 | 
						|
                }]
 | 
						|
            },
 | 
						|
            options: {
 | 
						|
                responsive: true,
 | 
						|
                maintainAspectRatio: false,
 | 
						|
                plugins: {
 | 
						|
                    title: {
 | 
						|
                        display: true,
 | 
						|
                        text: '分类借阅分布'
 | 
						|
                    },
 | 
						|
                    legend: {
 | 
						|
                        position: 'right'
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
        });
 | 
						|
    }
 | 
						|
 | 
						|
    function updateBorrowSummary(data) {
 | 
						|
        if (!data || data.length === 0) {
 | 
						|
            return;
 | 
						|
        }
 | 
						|
 | 
						|
        // 计算总数和平均数
 | 
						|
        let totalBorrows = 0;
 | 
						|
        let totalReturns = 0;
 | 
						|
        let totalOverdue = data[data.length - 1].overdue || 0;
 | 
						|
 | 
						|
        data.forEach(item => {
 | 
						|
            totalBorrows += item.borrow;
 | 
						|
            totalReturns += item.return;
 | 
						|
        });
 | 
						|
 | 
						|
        const summary = document.getElementById('borrow-summary');
 | 
						|
        summary.innerHTML = `
 | 
						|
            <div class="stats-item">
 | 
						|
                <div class="stats-value">${totalBorrows}</div>
 | 
						|
                <div class="stats-title">总借阅</div>
 | 
						|
            </div>
 | 
						|
            <div class="stats-item">
 | 
						|
                <div class="stats-value">${totalReturns}</div>
 | 
						|
                <div class="stats-title">总归还</div>
 | 
						|
            </div>
 | 
						|
            <div class="stats-item">
 | 
						|
                <div class="stats-value">${totalOverdue}</div>
 | 
						|
                <div class="stats-title">当前逾期</div>
 | 
						|
            </div>
 | 
						|
            <div class="stats-item">
 | 
						|
                <div class="stats-value">${Math.round((totalBorrows - totalReturns) - totalOverdue)}</div>
 | 
						|
                <div class="stats-title">正常借出</div>
 | 
						|
            </div>
 | 
						|
        `;
 | 
						|
    }
 | 
						|
});
 |