This commit is contained in:
lik
2026-05-31 19:43:16 +08:00
parent 13a61896db
commit 87c852b6a9
11 changed files with 824 additions and 44 deletions

192
pages/hospital/ranking.js Normal file
View File

@@ -0,0 +1,192 @@
// 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'
}
}
})