// 引入 wx-charts(根据实际路径调整) const wxCharts = require('../../utils/wxcharts.js'); const api = require('../../../api/index.js'); Page({ /** * 页面的初始数据 */ data: { currentType: 'day', // 默认按日筛选 selectedDate: '', // 选中的日期 showDate: '', // 展示的日期文本 showPicker: false, // 是否显示日期选择器 today: '', // 今日日期 statData: { // 统计数据 chargeTotal: 0, dischargeTotal: 0, netTotal: 0 }, dataList: [], // 明细数据列表 listHeader: '时段', // 列表头部文本 chart: null, // 图表实例,用于更新图表 operationRole:wx.getStorageSync('user').operationRole }, /** * 生命周期函数--监听页面加载 */ onLoad(options) { // 获取今日日期 const now = new Date(); const today = `${now.getFullYear()}-${this.formatNum(now.getMonth() + 1)}-${this.formatNum(now.getDate())}`; this.setData({ today, selectedDate: today, showDate: this.formatShowDate(today, 'day') }); // 加载初始数据 this.loadData(); }, /** * 修复:适配屏幕旋转/尺寸变化,重新渲染图表即可 */ onResize() { // 直接重新渲染,wxCharts无updateCanvasSize方法 if (this.data.dataList.length > 0) { this.renderChart(); } }, /** * 切换筛选类型(日/月/年) */ changeType(e) { const type = e.currentTarget.dataset.type; if (type === this.data.currentType) return; this.setData({ currentType: type, showDate: this.formatShowDate(this.data.selectedDate, type), listHeader: type === 'day' ? '时段' : (type === 'month' ? '日期' : '月份') }); this.loadData(); }, /** * 打开日期选择器 */ openDatePicker() { this.setData({ showPicker: true }); setTimeout(() => { this.setData({ showPicker: false }); }, 100); }, /** * 日期选择器值改变 */ onDateChange(e) { const selectedDate = e.detail.value; this.setData({ selectedDate, showDate: this.formatShowDate(selectedDate, this.data.currentType) }); this.loadData(); }, /** * 格式化数字(补零) */ formatNum(num) { return num < 10 ? `0${num}` : num; }, /** * 格式化展示的日期文本 */ formatShowDate(date, type) { const [year, month, day] = date.split('-'); switch (type) { case 'day': return `${year}-${month}-${day}`; case 'month': return `${year}-${month}`; case 'year': return `${year}`; default: return date; } }, /** * 加载充放电数据 */ loadData() { let data = { date:this.data.showDate } api.request(`/sysworkorder/workorderstatistics`, 'post', data, { isPublic: false }) .then((data) => { if (data.code == 200) { console.log(data); const { currentType, selectedDate } = this.data; const [year, month, day] = selectedDate.split('-'); // 模拟接口请求数据(实际开发中替换为真实接口调用) // let statData = { chargeTotal: 0, dischargeTotal: 0, netTotal: 0 }; let dataList = []; // 模拟不同维度的测试数据 if (currentType === 'day') { // 日维度:按小时统计 // 基础校验:避免数据源不存在或非数组导致报错 if (this.data.operationRole==5) { if (data.data.chargeList && Array.isArray(data.data.chargeList)) { for (let index = 0; index < data.data.chargeList.length; index++) { // 获取当前行数据 const item = data.data.chargeList[index]; // 关键修复:先初始化数组元素,再赋值(解决空数组直接赋值报错) dataList[index] = { ...item }; // 保留原始数据字段 console.log(dataList); // 保留你的核心逻辑:仅截取小时位相减 // 增加防错处理:避免时间字段为空/格式错误导致NaN const startHour = data.data.chargeList[index].startworkordertime?.slice(11, 16) || 0; const endHour = data.data.chargeList[index].endworkordertime?.slice(11, 16) || 0; dataList[index].time = `${endHour +'-'+ startHour}`; } } }else{ if (data?.data?.dischargeList && Array.isArray(data.data.dischargeList)) { for (let index = 0; index < data.data.dischargeList.length; index++) { // 获取当前行数据 const item = data.data.dischargeList[index]; // 关键修复:先初始化数组元素,再赋值(解决空数组直接赋值报错) dataList[index] = { ...item }; // 保留原始数据字段 console.log(dataList); // 保留你的核心逻辑:仅截取小时位相减 // 增加防错处理:避免时间字段为空/格式错误导致NaN const startHour = data.data.dischargeList[index].startworkordertime?.slice(11, 16) || 0; const endHour = data.data.dischargeList[index].endworkordertime?.slice(11, 16) || 0; dataList[index].time = `${endHour +'-'+ startHour}`; } } } } else if (currentType === 'month') { // 月维度:按日期统计 if (this.data.operationRole==5) { if (data?.data?.chargeList && Array.isArray(data.data.chargeList)) { for (let index = 0; index < data.data.chargeList.length; index++) { // 获取当前行数据 const item = data.data.chargeList[index]; // 关键修复:先初始化数组元素,再赋值(解决空数组直接赋值报错) dataList[index] = { ...item }; // 保留原始数据字段 console.log(dataList); // 保留你的核心逻辑:仅截取小时位相减 // 增加防错处理:避免时间字段为空/格式错误导致NaN const startHour = data.data.chargeList[index].startworkordertime?.slice(8, 10) || 0; dataList[index].time = startHour; } } }else{ if (data?.data?.dischargeList && Array.isArray(data.data.dischargeList)) { for (let index = 0; index < data.data.dischargeList.length; index++) { // 获取当前行数据 const item = data.data.dischargeList[index]; // 关键修复:先初始化数组元素,再赋值(解决空数组直接赋值报错) dataList[index] = { ...item }; // 保留原始数据字段 console.log(dataList); // 保留你的核心逻辑:仅截取小时位相减 // 增加防错处理:避免时间字段为空/格式错误导致NaN const startHour = data.data.dischargeList[index].startworkordertime?.slice(8, 10) || 0; dataList[index].time = startHour; } } } } else if (currentType === 'year') { // 年维度:按月份统计 if (this.data.operationRole==5) { if (data?.data?.chargeList && Array.isArray(data.data.chargeList)) { for (let index = 0; index < data.data.chargeList.length; index++) { // 获取当前行数据 const item = data.data.chargeList[index]; // 关键修复:先初始化数组元素,再赋值(解决空数组直接赋值报错) dataList[index] = { ...item }; // 保留原始数据字段 console.log(dataList); // 保留你的核心逻辑:仅截取小时位相减 // 增加防错处理:避免时间字段为空/格式错误导致NaN const startHour = data.data.chargeList[index].startworkordertime?.slice(5, 7) || 0; dataList[index].time = startHour; } } }else{ if (data?.data?.dischargeList && Array.isArray(data.data.dischargeList)) { for (let index = 0; index < data.data.dischargeList.length; index++) { // 获取当前行数据 const item = data.data.dischargeList[index]; // 关键修复:先初始化数组元素,再赋值(解决空数组直接赋值报错) dataList[index] = { ...item }; // 保留原始数据字段 console.log(dataList); // 保留你的核心逻辑:仅截取小时位相减 // 增加防错处理:避免时间字段为空/格式错误导致NaN const startHour = data.data.dischargeList[index].startworkordertime?.slice(5, 7) || 0; dataList[index].time = startHour; } } } } // 计算总计数据 // dataList.forEach(item => { // statData.chargeTotal += item.charge; // statData.dischargeTotal += item.discharge; // }); // statData.netTotal = (statData.chargeTotal - statData.dischargeTotal).toFixed(1); // statData.chargeTotal = statData.chargeTotal.toFixed(1); // statData.dischargeTotal = statData.dischargeTotal.toFixed(1); this.setData({ statData:data.data, dataList }); // 渲染折线图 this.renderChart(); this.setData({ statData: data.data }) } }) .catch((err) => { console.error('获取工单信息失败:', err); this.showInfo('获取工单信息失败'); }); }, /** * ✅ 修复完成:渲染充放电折线图 (所有错误已修正) */ renderChart() { const { dataList } = this.data; if (dataList.length === 0) return; // 提取X轴标签和Y轴数据 const categories = dataList.map(item => item.time); let chargeData = '' if(this.data.operationRole==5){ chargeData = dataList.map(item => parseFloat(item.chargeActual)); }else{ chargeData = dataList.map(item => parseFloat(item.dischargeActual)); } // const dischargeData = dataList.map(item => parseFloat(item.dischargeActual)); // ✅ 修复:获取屏幕宽度 - 正确的PX适配,不乘以pixelRatio const systemInfo = wx.getSystemInfoSync(); const windowWidth = systemInfo.windowWidth; // 图表宽度:屏幕宽度 - 左右各16px边距,完美适配所有机型 const chartWidth = windowWidth - 32; // 图表高度:固定280px,适配性最佳 const chartHeight = 200; // ✅ 修复:wxCharts 标准正确配置项(删除所有无效配置,修正错误配置) const chartConfig = { canvasId: 'chargeDischargeChart', // 必须和wxml的canvas-id一致 ✔️ type: 'line', // 折线图类型 ✔️ categories: categories, // X轴分类 ✔️ // ['1','2','3','4','5','6'] // ========== 新增:图表顶部标题配置【核心代码】 ========== series: [ { name: '充电量(kWh)', data: chargeData, color: '#07c160' // 绿色充电 } // { // name: '放电量(kWh)', // data: dischargeData, // color: '#ff4757' // 红色放电 // } ], // ✅ 正确的Y轴配置项 yAxis: { min: 0, // Y轴最小值为0 ✔️ format: (val) => val.toFixed(1), // Y轴数值保留1位小数 ✔️ titleFontSize: 12, // Y轴标题字号 labelFontSize: 10, // Y轴刻度字号 ✔️ fontColor: '#666', // Y轴文字颜色 gridColor: '#eee' // Y轴网格线颜色 }, // ✅ 正确的X轴配置项 xAxis: { disableGrid: false, // 显示X轴网格线 ✔️ labelFontSize: 10, // X轴刻度字号 ✔️ fontColor: '#666', gridColor: '#eee' }, legend: false, // 是否显示图例 (wxCharts中是布尔值,不是对象) ✔️ width: chartWidth, // ✅ 核心修复:正确的宽度PX值 height: 240, // ✅ 微调高度:从280改为300,给顶部标题留出空间,不挤压图表内容 dataLabel: false, // 是否在折线上显示数值 ✔️ dataPointShape: true, // 是否显示数据点 ✔️ fontColor: '#666', // ✅ 修复:wxCharts 正确的折线样式配置 extra: { line: { type: 'curve', // curve=曲线,straight=直线 ✔️ width: 1 // 折线粗细 }, legendTextColor: '#666' // 图例文字颜色 } }; // ✅ 修复:wxCharts无updateData,更新图表的正确方式 = 重新实例化 // ✅ 修复:用setData赋值图表实例,不是直接修改this.data const chart = new wxCharts(chartConfig); this.setData({ chart }); } });