// pages/hospital/ranking.js const app = getApp() Page({ data: { activeTab: 'overall', searchKeyword: '', selectedDepartment: '', rankingYear: '', rankingNote: '', departmentList: [], allHospitals: [], filteredHospitals: [], currentDepartmentRanking: { top10: [], nominated: [] }, hospitalRankingData: null, departmentRankingsData: null }, onLoad(options) { this.loadData() }, onShow() { if (!this.data.hospitalRankingData || !this.data.departmentRankingsData) { this.loadData() } }, async loadData() { try { const appData = app.globalData let hospitalRanking = appData.hospitalRanking let departmentRankings = appData.departmentRankings if (!hospitalRanking) { hospitalRanking = await appData.hospitalRankingReady } if (!departmentRankings) { departmentRankings = await appData.departmentRankingsReady } this.setData({ hospitalRankingData: hospitalRanking, departmentRankingsData: departmentRankings }) this.processHospitalRanking(hospitalRanking) this.processDepartmentRankings(departmentRankings) } catch (err) { console.error('加载排行榜数据失败', err) wx.showToast({ title: '数据加载失败', icon: 'none' }) } }, processHospitalRanking(data) { if (!data || !data.rankings) return const gradeClassMap = { 'A+++++': 'grade-a5', 'A++++': 'grade-a4', 'A+++': 'grade-a3', 'A++': 'grade-a2', 'A+': 'grade-a1' } const hospitals = data.rankings.map(item => { const allDeps = (item.depart || []) .sort((a, b) => a.rank - b.rank) return { ...item, gradeClass: gradeClassMap[item.grade] || 'grade-a1', topDepartments: allDeps, expanded: false } }) this.setData({ rankingYear: data.year || '', rankingNote: data.note || '', allHospitals: hospitals, filteredHospitals: hospitals }) }, processDepartmentRankings(data) { if (!data || !data.departments) return const departments = Object.keys(data.departments) const firstDept = departments[0] || '' this.setData({ departmentList: departments, selectedDepartment: firstDept }) if (firstDept) { this.updateCurrentDepartmentRanking(firstDept) } }, updateCurrentDepartmentRanking(deptName) { const data = this.data.departmentRankingsData if (!data || !data.departments || !data.departments[deptName]) { this.setData({ currentDepartmentRanking: { top10: [], nominated: [] } }) return } const deptData = data.departments[deptName] this.setData({ currentDepartmentRanking: { top10: deptData.top10 || [], nominated: deptData.nominated || [] } }) }, switchTab(e) { const tab = e.currentTarget.dataset.tab if (tab === this.data.activeTab) return this.setData({ activeTab: tab }) }, selectDepartment(e) { const dept = e.currentTarget.dataset.dept this.setData({ selectedDepartment: dept }) this.updateCurrentDepartmentRanking(dept) }, onSearchInput(e) { const keyword = e.detail.value this.setData({ searchKeyword: keyword }) this.filterHospitals(keyword) }, onSearch(e) { const keyword = e.detail.value this.filterHospitals(keyword) }, clearSearch() { this.setData({ searchKeyword: '' }) this.filterHospitals('') }, filterHospitals(keyword) { let result = this.data.allHospitals if (keyword && keyword.trim()) { const lowerKeyword = keyword.trim().toLowerCase() result = result.filter(item => { const nameMatch = item.name && item.name.toLowerCase().includes(lowerKeyword) const deptMatch = item.depart && item.depart.some(d => d.name && d.name.toLowerCase().includes(lowerKeyword)) return nameMatch || deptMatch }) } this.setData({ filteredHospitals: result }) }, toggleHospital(e) { const name = e.currentTarget.dataset.name const hospitals = this.data.filteredHospitals.map(item => { if (item.name === name) { return { ...item, expanded: !item.expanded } } return item }) this.setData({ filteredHospitals: hospitals }) }, onPullDownRefresh() { this.loadData().finally(() => { wx.stopPullDownRefresh() }) }, onShareAppMessage() { return { title: '复旦中国医院排行榜', path: '/pages/hospital/ranking' } } })