271 lines
5.9 KiB
JavaScript
271 lines
5.9 KiB
JavaScript
// pages/trend/trend.js
|
|
const api = require('../../utils/request')
|
|
const echarts = require('../../components/ec-canvas/echarts')
|
|
|
|
let chart = null
|
|
|
|
Page({
|
|
data: {
|
|
// 地区选项
|
|
regions: [
|
|
'全部', '昆明', '玉溪', '楚雄', '大理', '曲靖', '红河', '文山',
|
|
'重庆', '成都', '广州', '南宁'
|
|
],
|
|
// 材质选项
|
|
materials: [
|
|
'全部', 'HPB300', 'HRB400', 'HRB400E', 'HRB500', 'HRB500E',
|
|
'HRB600', 'CRB550', 'Q235', 'Q345', 'Q355'
|
|
],
|
|
// 时间范围选项
|
|
dayRanges: [
|
|
{ label: '最近 7 天', value: 7 },
|
|
{ label: '最近 15 天', value: 15 },
|
|
{ label: '最近 30 天', value: 30 },
|
|
{ label: '最近 60 天', value: 60 },
|
|
{ label: '最近 90 天', value: 90 }
|
|
],
|
|
// 选中的索引
|
|
selectedRegionIndex: 0,
|
|
selectedMaterialIndex: 0,
|
|
selectedDayIndex: 2,
|
|
// 加载和搜索状态
|
|
loading: false,
|
|
searched: false,
|
|
hasData: false,
|
|
// 图表实例
|
|
ec: {
|
|
onInit: null
|
|
},
|
|
// 趋势数据
|
|
trendData: null,
|
|
// 统计数据
|
|
startPrice: '-',
|
|
endPrice: '-',
|
|
priceChange: '-'
|
|
},
|
|
|
|
/**
|
|
* 生命周期函数--监听页面加载
|
|
*/
|
|
onLoad(options) {
|
|
// 初始化图表
|
|
this.setData({
|
|
ec: {
|
|
onInit: this.initChart.bind(this)
|
|
}
|
|
})
|
|
},
|
|
|
|
/**
|
|
* 初始化图表
|
|
*/
|
|
initChart(canvas, width, height, res) {
|
|
console.log('initChart 被调用', {
|
|
hasTrendData: !!this.data.trendData,
|
|
dates: this.data.trendData?.dates,
|
|
prices: this.data.trendData?.prices
|
|
})
|
|
|
|
if (!this.data.trendData || !this.data.trendData.dates || this.data.trendData.dates.length === 0) {
|
|
console.log('没有趋势数据,跳过图表初始化')
|
|
return null
|
|
}
|
|
|
|
// 创建图表实例
|
|
const chartInstance = echarts.init(canvas)
|
|
|
|
const option = {
|
|
xAxis: {
|
|
type: 'category',
|
|
data: this.data.trendData.dates
|
|
},
|
|
yAxis: {
|
|
type: 'value'
|
|
},
|
|
series: [{
|
|
data: this.data.trendData.prices,
|
|
type: 'line',
|
|
smooth: true,
|
|
areaStyle: {}
|
|
}]
|
|
}
|
|
|
|
chartInstance.setOption(option)
|
|
console.log('图表初始化完成')
|
|
|
|
return chartInstance
|
|
},
|
|
|
|
/**
|
|
* 地区选择改变
|
|
*/
|
|
onRegionChange(e) {
|
|
const index = parseInt(e.detail.value)
|
|
this.setData({
|
|
selectedRegionIndex: index
|
|
})
|
|
},
|
|
|
|
/**
|
|
* 材质选择改变
|
|
*/
|
|
onMaterialChange(e) {
|
|
const index = parseInt(e.detail.value)
|
|
this.setData({
|
|
selectedMaterialIndex: index
|
|
})
|
|
},
|
|
|
|
/**
|
|
* 时间范围选择改变
|
|
*/
|
|
onDayRangeChange(e) {
|
|
const index = parseInt(e.detail.value)
|
|
this.setData({
|
|
selectedDayIndex: index
|
|
})
|
|
},
|
|
|
|
/**
|
|
* 查询趋势
|
|
*/
|
|
async onQuery() {
|
|
const {
|
|
selectedRegionIndex,
|
|
selectedMaterialIndex,
|
|
selectedDayIndex,
|
|
regions,
|
|
materials,
|
|
dayRanges
|
|
} = this.data
|
|
|
|
const region = selectedRegionIndex === 0 ? '' : regions[selectedRegionIndex]
|
|
const material = selectedMaterialIndex === 0 ? '' : materials[selectedMaterialIndex]
|
|
const days = dayRanges[selectedDayIndex].value
|
|
|
|
// 开始加载
|
|
this.setData({
|
|
loading: true,
|
|
searched: false,
|
|
hasData: false
|
|
})
|
|
|
|
try {
|
|
// 获取趋势数据
|
|
const trendResult = await api.getPriceTrend({
|
|
region,
|
|
material,
|
|
days
|
|
})
|
|
|
|
console.log('趋势数据:', trendResult)
|
|
|
|
const trendData = trendResult.data || []
|
|
|
|
if (trendData.length === 0) {
|
|
this.setData({
|
|
loading: false,
|
|
searched: true,
|
|
hasData: false
|
|
})
|
|
api.showError('暂无趋势数据')
|
|
return
|
|
}
|
|
|
|
// 处理数据
|
|
const dates = []
|
|
const prices = []
|
|
|
|
trendData.forEach(item => {
|
|
const date = new Date(item.date)
|
|
const dateStr = `${date.getMonth() + 1}/${date.getDate()}`
|
|
dates.push(dateStr)
|
|
prices.push(item.avgPrice || item.avg_price || 0)
|
|
})
|
|
|
|
// 计算统计数据
|
|
const startPrice = prices[0] || 0
|
|
const endPrice = prices[prices.length - 1] || 0
|
|
const priceChange = endPrice - startPrice
|
|
|
|
console.log('准备更新数据和图表', { dates, prices, startPrice, endPrice })
|
|
|
|
this.setData({
|
|
trendData: {
|
|
dates,
|
|
prices
|
|
},
|
|
startPrice,
|
|
endPrice,
|
|
priceChange,
|
|
loading: false,
|
|
searched: true,
|
|
hasData: true
|
|
}, () => {
|
|
// setData 回调中重新初始化图表
|
|
console.log('setData 完成,准备重新初始化图表')
|
|
if (chart) {
|
|
chart.clear()
|
|
// 重新调用 initChart
|
|
const canvas = chart.canvas
|
|
if (canvas) {
|
|
chart = this.initChart(canvas, canvas.width, canvas.height)
|
|
}
|
|
}
|
|
})
|
|
|
|
} catch (error) {
|
|
console.error('查询趋势失败:', error)
|
|
this.setData({
|
|
loading: false,
|
|
searched: true,
|
|
hasData: false
|
|
})
|
|
}
|
|
},
|
|
|
|
/**
|
|
* 重置
|
|
*/
|
|
onReset() {
|
|
this.setData({
|
|
selectedRegionIndex: 0,
|
|
selectedMaterialIndex: 0,
|
|
selectedDayIndex: 2,
|
|
searched: false,
|
|
hasData: false,
|
|
trendData: null,
|
|
startPrice: '-',
|
|
endPrice: '-',
|
|
priceChange: '-'
|
|
})
|
|
|
|
if (chart) {
|
|
chart.clear()
|
|
}
|
|
},
|
|
|
|
/**
|
|
* TabBar 切换
|
|
*/
|
|
onTabChange(e) {
|
|
const value = e.detail.value
|
|
console.log('TabBar 切换:', value, '类型:', typeof value)
|
|
|
|
// value 可能是字符串或数字,统一处理
|
|
const tabIndex = parseInt(value)
|
|
|
|
if (tabIndex === 1) {
|
|
// 当前页,不做处理
|
|
console.log('已在当前页,不跳转')
|
|
return
|
|
} else if (tabIndex === 0) {
|
|
// 跳转到价格查询页
|
|
console.log('跳转到价格查询页')
|
|
wx.navigateTo({
|
|
url: '/pages/index/index'
|
|
})
|
|
}
|
|
}
|
|
})
|