// pages/index/index.js const api = require('../../utils/request') Page({ data: { // 地区选项 (对象格式) regions: [ { label: '昆明', value: '昆明' }, { label: '玉溪', value: '玉溪' }, { label: '楚雄', value: '楚雄' }, { label: '大理', value: '大理' }, { label: '曲靖', value: '曲靖' }, { label: '红河', value: '红河' }, { label: '文山', value: '文山' }, { label: '重庆', value: '重庆' }, { label: '成都', value: '成都' }, { label: '广州', value: '广州' }, { label: '南宁', value: '南宁' } ], // 材质选项 (对象格式) materials: [ { label: '全部', value: '' }, { label: 'HPB300', value: 'HPB300' }, { label: 'HRB400', value: 'HRB400' }, { label: 'HRB400E', value: 'HRB400E' }, { label: 'HRB500', value: 'HRB500' }, { label: 'HRB500E', value: 'HRB500E' }, { label: 'HRB600', value: 'HRB600' }, { label: 'CRB550', value: 'CRB550' }, { label: 'Q235', value: 'Q235' }, { label: 'Q345', value: 'Q345' }, { label: 'Q355', value: 'Q355' } ], // 品名选项 (对象格式) partsnames: [ { label: '全部', value: '' }, { label: '高线', value: '高线' }, { label: '螺纹钢', value: '螺纹钢' }, { label: '盘螺', value: '盘螺' }, { label: '工字钢', value: '工字钢' }, { label: '槽钢', value: '槽钢' }, { label: '角钢', value: '角钢' }, { label: 'H型钢', value: 'H型钢' }, { label: '钢板', value: '钢板' }, { label: '卷板', value: '卷板' }, { label: '中厚板', value: '中厚板' } ], // 选中的值 selectedRegion: '', selectedMaterial: '', selectedPartsname: '', // 显示的文本 regionText: '请选择地区', materialText: '请选择材质 (可选)', partsnameText: '全部', // 选中的日期 selectedDate: '', // 今天日期 today: '', // 加载状态 loading: false, // 是否已搜索 searched: false, // 查询结果 priceList: [], total: 0, // 统计信息 stats: null, // Picker 显示状态 regionPickerVisible: false, materialPickerVisible: false, partsnamePickerVisible: false, datePickerVisible: false, // Picker value (数组形式) regionPickerValue: [], materialPickerValue: [], partsnamePickerValue: [] }, /** * 生命周期函数--监听页面加载 */ onLoad(options) { // 设置今天日期 const today = this.formatDate(new Date()) this.setData({ today }) // 测试 API 连接 this.testApiConnection() }, /** * 测试 API 连接 */ async testApiConnection() { try { const res = await api.checkHealth() console.log('API 连接成功:', res) } catch (error) { console.error('API 连接失败:', error) api.showError('API 服务连接失败,请确保后端服务已启动') } }, /** * 显示地区选择器 */ showRegionPicker() { this.setData({ regionPickerVisible: true }) }, /** * 显示材质选择器 */ showMaterialPicker() { this.setData({ materialPickerVisible: true }) }, /** * 显示品名选择器 */ showPartsnamePicker() { this.setData({ partsnamePickerVisible: true }) }, /** * 显示日期选择器 */ showDatePicker() { this.setData({ datePickerVisible: true }) }, /** * Picker 选择改变 */ onPickerChange(e) { const { key } = e.currentTarget.dataset const { value } = e.detail console.log('Picker change:', { key, value }) // 根据 key 设置对应的文本和值 if (key === 'region') { const region = this.data.regions.find(item => item.value === value[0]) this.setData({ regionPickerVisible: false, regionPickerValue: value, selectedRegion: value[0] || '', regionText: region ? region.label : '请选择地区' }) } else if (key === 'material') { const material = this.data.materials.find(item => item.value === value[0]) this.setData({ materialPickerVisible: false, materialPickerValue: value, selectedMaterial: value[0] || '', materialText: material ? material.label : '请选择材质 (可选)' }) } else if (key === 'partsname') { const partsname = this.data.partsnames.find(item => item.value === value[0]) this.setData({ partsnamePickerVisible: false, partsnamePickerValue: value, selectedPartsname: value[0] || '', partsnameText: partsname ? partsname.label : '全部' }) } }, /** * Picker 取消选择 */ onPickerCancel(e) { const { key } = e.currentTarget.dataset console.log('Picker cancel:', key) if (key === 'region') { this.setData({ regionPickerVisible: false }) } else if (key === 'material') { this.setData({ materialPickerVisible: false }) } else if (key === 'partsname') { this.setData({ partsnamePickerVisible: false }) } else if (key === 'date') { this.setData({ datePickerVisible: false }) } }, /** * 日期选择确认 */ onDateConfirm(e) { const { value } = e.detail this.setData({ selectedDate: value, datePickerVisible: false }) }, /** * 日期选择取消 */ onDatePickerCancel() { this.setData({ datePickerVisible: false }) }, /** * 查询价格 */ async onSearch() { const { selectedRegion, selectedMaterial, selectedPartsname, selectedDate } = this.data // 验证必填项 if (!selectedRegion) { api.showError('请选择地区') return } // 开始加载 this.setData({ loading: true, searched: false }) try { // 构建搜索参数 const searchParams = { region: selectedRegion, pageSize: 100 } // 添加可选参数 if (selectedMaterial) searchParams.material = selectedMaterial if (selectedPartsname) searchParams.partsname = selectedPartsname if (selectedDate) searchParams.startDate = selectedDate // 如果选择了日期,设置结束日期 if (selectedDate) { searchParams.endDate = selectedDate } console.log('查询参数:', searchParams) // 调用搜索接口 const searchResult = await api.searchPrices(searchParams) console.log('查询结果:', searchResult) // 获取统计数据 const statsParams = { region: selectedRegion, material: selectedMaterial } if (selectedDate) { statsParams.startDate = selectedDate statsParams.endDate = selectedDate } else { statsParams.days = 30 } const statsResult = await api.getPriceStats(statsParams) console.log('==================== 统计结果 ====================') console.log('完整响应:', statsResult) console.log('success:', statsResult.success) console.log('data:', statsResult.data) console.log('data 类型:', typeof statsResult.data) console.log('data 字段:', Object.keys(statsResult.data || {})) console.log('JSON 数据:', JSON.stringify(statsResult.data, null, 2)) console.log('====================================================') // 更新数据 const priceList = searchResult.data || [] const total = searchResult.total || searchResult.pagination?.total || priceList.length || 0 // 格式化日期字段 const formattedList = priceList.map(item => { let dateStr = '' if (item.price_date) { const date = new Date(item.price_date) dateStr = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}` } return { ...item, price_date_str: dateStr } }) this.setData({ priceList: formattedList, total, stats: statsResult.data || null, searched: true, loading: false }) // 显示结果提示 if (searchResult.data && searchResult.data.length > 0) { api.showSuccess(`查询成功,共找到 ${searchResult.data.length} 条数据`) } } catch (error) { console.error('查询失败:', error) this.setData({ loading: false, searched: true, priceList: [], total: 0, stats: null }) // API 错误已在 request.js 中处理 } }, /** * 重置表单 */ onReset() { this.setData({ selectedRegion: '', selectedMaterial: '', selectedPartsname: '', regionText: '请选择地区', materialText: '请选择材质 (可选)', partsnameText: '全部', regionPickerValue: [], materialPickerValue: [], partsnamePickerValue: [], selectedDate: '', searched: false, priceList: [], total: 0, stats: null }) }, /** * 查看价格详情 */ onPriceDetail(e) { const item = e.currentTarget.dataset.item // 格式化日期 const formatDate = (dateStr) => { if (!dateStr) return '-' const date = new Date(dateStr) return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}` } // 构建详情信息 let detail = `地区:${item.price_region || '-'}\n` detail += `品名:${item.partsname_name || '-'}\n` detail += `材质:${item.goods_material || '-'}\n` if (item.goods_spec) { detail += `规格:${item.goods_spec}\n` } const price = item.hang_price || item.make_price || '-' detail += `价格:¥${price}\n` detail += `日期:${formatDate(item.price_date)}\n` if (item.price_source) { detail += `来源:${item.price_source}\n` } if (item.productarea_name) { detail += `产地:${item.productarea_name}\n` } detail += `单位:元/吨` wx.showModal({ title: '价格详情', content: detail, showCancel: false, confirmText: '关闭' }) }, /** * 格式化日期为 YYYY-MM-DD */ formatDate(date) { const year = date.getFullYear() const month = String(date.getMonth() + 1).padStart(2, '0') const day = String(date.getDate()).padStart(2, '0') return `${year}-${month}-${day}` }, /** * TabBar 切换 */ onTabChange(e) { const value = e.detail.value console.log('TabBar 切换:', value, '类型:', typeof value) // value 可能是字符串或数字,统一处理 const tabIndex = parseInt(value) if (tabIndex === 0) { // 当前页,不做处理 console.log('已在当前页,不跳转') return } else if (tabIndex === 1) { // 跳转到价格趋势页 console.log('跳转到价格趋势页') wx.navigateTo({ url: '/pages/trend/trend' }) } } })