define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'echarts', 'echarts-theme', 'template', 'addtabs', 'moment', 'citypicker'], function ($, undefined, Backend, Table, Form, echarts, undefined, Template, Datatable, Moment) { var Controller = { index: function () { Controller.api.bindevent() Controller.api.datepicker() Controller.api.getChartData() $('#filter-btn').on('click', function () { Controller.api.getChartData(); }); // 页面加载完成后更新数据 document.addEventListener('DOMContentLoaded', function() { // 模拟数据实时更新(可选) setInterval(() => { Controller.api.getChartData() }, 60000); // 每分钟更新一次时间 }); // 添加卡片点击效果 document.querySelectorAll('.stat-card').forEach(card => { card.addEventListener('click', function() { this.style.transform = 'scale(0.95)'; setTimeout(() => { this.style.transform = ''; }, 150); }); }); }, api: { getChartData: function () { // 获取日期范围值 var daterange = $('#daterange').val(); /* var source = $('#source').val(); var city_id = $('#area_id').val(); var item_id = $('#item_id').val(); */ // 构建查询参数 var params = { 'daterange': daterange, /* 'source': source, 'area_id': city_id, 'item_id': item_id,*/ }; Fast.api.ajax({ url: "dashboard/getData", type: "POST", dataType: "json", data: params, },function (response) { document.getElementById('updateTime').textContent = new Date().toLocaleString('zh-CN'); Controller.api.updateDashboard(response.top); Controller.api.money_line(response.lines); return false; },function () { console.error("图表数据加载失败"); }); }, bindevent: function () { Form.api.bindevent($("form[role=form]")); }, datepicker: function () { var ranges = {}; ranges[__('Today')] = [Moment().startOf('day'), Moment().endOf('day')]; ranges[__('Yesterday')] = [Moment().subtract(1, 'days').startOf('day'), Moment().subtract(1, 'days').endOf('day')]; ranges[__('Last 7 Days')] = [Moment().subtract(6, 'days').startOf('day'), Moment().endOf('day')]; ranges[__('Last 30 Days')] = [Moment().subtract(29, 'days').startOf('day'), Moment().endOf('day')]; ranges[__('This Month')] = [Moment().startOf('month'), Moment().endOf('month')]; ranges[__('Last Month')] = [Moment().subtract(1, 'month').startOf('month'), Moment().subtract(1, 'month').endOf('month')]; ranges[__('今年')] = [Moment().startOf('year'), Moment().endOf('year')]; var options = { timePicker: false, autoUpdateInput: false, timePickerSeconds: true, timePicker24Hour: true, autoApply: true, locale: { format: 'YYYY-MM-DD', customRangeLabel: __("Custom Range"), applyLabel: __("Apply"), cancelLabel: __("Clear"), }, ranges: ranges, }; var callback = function (start, end) { $(this.element).val(start.format(options.locale.format) + " - " + end.format(options.locale.format)); }; require(['bootstrap-daterangepicker'], function () { $(".datetimerange").each(function () { $(this).on('apply.daterangepicker', function (ev, picker) { callback.call(picker, picker.startDate, picker.endDate); var label = picker.chosenLabel; $(picker.element).data('label', label).trigger("change"); }); $(this).on('cancel.daterangepicker', function (ev, picker) { $(this).val(''); }); $(this).daterangepicker($.extend({}, options), callback); }); }); }, // 格式化金额 formatCurrency: function (amount) { return new Intl.NumberFormat('zh-CN', { style: 'currency', currency: 'CNY', minimumFractionDigits: 0, maximumFractionDigits: 0 }).format(parseFloat(amount)); }, // 计算百分比 calculatePercentage: function (part, total) { return ((parseFloat(part) / parseFloat(total)) * 100).toFixed(2) + '%'; }, money_line: function (data){ var myChart = echarts.init(document.getElementById('money_line')); var option = { title: { text: '总业绩', subtext: '数据', left: 'left' }, tooltip: { trigger: 'axis', axisPointer: { type: 'cross', crossStyle: { color: '#999' } } }, color: [ "#18d1b1", "#3fb1e3", "#626c91", "#a0a7e6", "#c4ebad", "#96dee8" ], legend: { data: ['订单量', '营销额', '新车单量','新车营销额','租车单量','租车营销额','二手车单量','二手车营销额',], // left: 'left', }, xAxis: [ { type: 'category', data: data.xAxis, axisPointer: { type: 'shadow' } } ], yAxis: [ { type: 'value', name: '金额', position: 'left' }, { type: 'value', name: '单量', position: 'right' } ], series: [ { name: '订单量', type: 'line', data: data.series.count, emphasis: { focus: 'series' }, yAxisIndex: 1, barGap: '10%' // 调整柱状图1与柱状图2之间的间距 }, { name: '营销额', type: 'bar', data: data.series.total, emphasis: { focus: 'series' }, barGap: '10%' // 调整柱状图1与柱状图2之间的间距 }, { name: '新车单量', type: 'line', data: data.series.new_count, emphasis: { focus: 'series' }, yAxisIndex: 1, barGap: '10%' // 调整柱状图1与柱状图2之间的间距 }, { name: '新车营销额', type: 'bar', data: data.series.new_total, emphasis: { focus: 'series' }, barGap: '10%' // 调整柱状图1与柱状图2之间的间距 }, { name: '租车单量', type: 'line', data: data.series.rent_count, emphasis: { focus: 'series' }, yAxisIndex: 1, barGap: '10%' // 调整柱状图1与柱状图2之间的间距 }, { name: '租车营销额', type: 'line', data: data.series.rent_total, emphasis: { focus: 'series' }, barGap: '10%' // 调整柱状图1与柱状图2之间的间距 }, { name: '二手车单量', type: 'line', data: data.series.old_count, emphasis: { focus: 'series' }, yAxisIndex: 1, barGap: '10%' // 调整柱状图1与柱状图2之间的间距 }, { name: '二手车营销额', type: 'bar', data: data.series.old_total, emphasis: { focus: 'series' }, barGap: '10%' // 调整柱状图1与柱状图2之间的间距 }, ] }; myChart.setOption(option); // 监听窗口大小变化,自动重新绘制图表 window.addEventListener('resize', function() { myChart.resize(); }); }, // 更新界面数据 updateDashboard: function (data) { // 基础数据更新 document.getElementById('newCarCount').textContent = data.new_car + ' 辆'; document.getElementById('rentCarCount').textContent = data.rent_car + ' 辆'; document.getElementById('oldCarCount').textContent = data.old_car + ' 辆'; document.getElementById('newSalesCount').textContent = data.new_count + ' 辆'; document.getElementById('rentOrderCount').textContent = data.rent_count + ' 单'; document.getElementById('oldSalesCount').textContent = data.old_count + ' 辆'; document.getElementById('newSalesAmount').textContent = Controller.api.formatCurrency(data.new_sum); document.getElementById('rentIncome').textContent = Controller.api.formatCurrency(data.rent_sum); document.getElementById('oldSalesAmount').textContent = Controller.api.formatCurrency(data.old_sum); document.getElementById('totalRevenue').textContent = Controller.api.formatCurrency(data.total_price); // 占比计算 document.getElementById('newCarPercent').textContent = Controller.api.calculatePercentage(data.new_sum, data.total_price); document.getElementById('rentCarPercent').textContent = Controller.api.calculatePercentage(data.rent_sum, data.total_price); // 汇总数据 const totalCars = data.new_car + data.rent_car + data.old_car; const totalOrders = data.new_count + data.rent_count + data.old_count; const avgOrderValue = totalOrders > 0 ? parseFloat(data.total_price) / totalOrders : 0; const inventoryUtilization = (totalOrders / totalCars * 100).toFixed(1); document.getElementById('totalCars').textContent = totalCars; document.getElementById('totalOrders').textContent = totalOrders; document.getElementById('avgOrderValue').textContent = Controller.api.formatCurrency(avgOrderValue); document.getElementById('inventoryUtilization').textContent = inventoryUtilization + '%'; // 更新时间 document.getElementById('updateTime').textContent = new Date().toLocaleString('zh-CN'); }, } }; return Controller; });