tmp
This commit is contained in:
192
pages/hospital/ranking.js
Normal file
192
pages/hospital/ranking.js
Normal 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'
|
||||
}
|
||||
}
|
||||
})
|
||||
Reference in New Issue
Block a user