// index.js const storage = require('../../utils/storage') const dateUtils = require('../../utils/date') const { TYPE_NAMES } = require('../../utils/constants') Page({ data: { persons: [], originalPersons: [], searchKeyword: '', currentFilter: 'all', totalCount: 0, upcomingCount: 0, todayText: '' }, onLoad() { this.loadPersons() }, onShow() { this.loadPersons() }, /** * 加载人员列表 */ loadPersons() { const persons = storage.getPersons() const anniversaries = storage.getAnniversaries() const personsWithAnniversaries = persons.map(person => { const personAnniversaries = anniversaries.filter(a => a.personId === person.id) let nextAnniversary = null if (personAnniversaries.length > 0) { const upcoming = personAnniversaries .map(a => { const { date, daysUntil } = dateUtils.getNextOccurrence(a.solarMonth, a.solarDay) return { ...a, date, daysUntil } }) .sort((a, b) => a.daysUntil - b.daysUntil) if (upcoming.length > 0) { const next = upcoming[0] nextAnniversary = { type: next.type, typeName: this.getTypeName(next.type, next.customTypeName), dateText: dateUtils.formatDate(next.date, 'MM月DD日'), daysUntil: next.daysUntil, daysUntilText: this.formatDaysUntil(next.daysUntil) } } } return { ...person, anniversaryCount: personAnniversaries.length, nextAnniversary } }) const sorted = personsWithAnniversaries.sort((a, b) => { if (!a.nextAnniversary && !b.nextAnniversary) return 0 if (!a.nextAnniversary) return 1 if (!b.nextAnniversary) return -1 return a.nextAnniversary.daysUntil - b.nextAnniversary.daysUntil }) const today = new Date() const weekdays = ['日', '一', '二', '三', '四', '五', '六'] const todayText = `${today.getMonth() + 1}月${today.getDate()}日 周${weekdays[today.getDay()]}` const upcomingCount = sorted.filter(p => p.nextAnniversary && p.nextAnniversary.daysUntil <= 7).length this.setData({ originalPersons: sorted, totalCount: sorted.length, upcomingCount, todayText }) if (this.data.currentFilter === 'all' && !this.data.searchKeyword) { this.setData({ persons: sorted }) } else { this.filterPersons() } }, /** * 格式化剩余天数 */ formatDaysUntil(days) { if (days === 0) return '今天' if (days === 1) return '明天' if (days < 7) return `${days}天后` if (days < 30) return `还有${Math.floor(days / 7)}周` return `还有${Math.floor(days / 30)}个月` }, /** * 获取类型名称 */ getTypeName(type, customName) { if (type === 'other' && customName) return customName return TYPE_NAMES[type] || '纪念日' }, /** * 搜索输入 */ onSearchInput(e) { const keyword = e.detail.value this.setData({ searchKeyword: keyword }) this.filterPersons() }, /** * 筛选切换 */ onFilterTap(e) { const filter = e.currentTarget.dataset.filter this.setData({ currentFilter: filter }, () => { this.filterPersons() }) }, /** * 筛选人员 */ filterPersons() { const { originalPersons, searchKeyword, currentFilter } = this.data const anniversaries = storage.getAnniversaries() let filtered = [...originalPersons] // 关键词搜索 if (searchKeyword) { filtered = filtered.filter(p => p.name.includes(searchKeyword) || (p.nickname && p.nickname.includes(searchKeyword)) ) } // 类型筛选 if (currentFilter !== 'all') { filtered = filtered.filter(person => { const personAnniversaries = anniversaries.filter(a => a.personId === person.id) if (currentFilter === 'birthday') { // 生日筛选:只显示有生日类型的人(公历生日或农历生日) return personAnniversaries.some(a => a.type === 'birthday' || a.type === 'lunar_birthday' ) } else if (currentFilter === 'anniversary') { // 纪念日筛选:只显示有纪念日类型的人(结婚、订婚、其他) return personAnniversaries.some(a => a.type === 'wedding' || a.type === 'engagement' || a.type === 'other' ) } else if (currentFilter === 'upcoming') { // 即将到来:只显示7天内有纪念日的人 return person.nextAnniversary && person.nextAnniversary.daysUntil <= 7 } return true }) } // 排序:与 loadPersons() 保持一致,按最近的纪念日排序 const sorted = filtered.sort((a, b) => { if (!a.nextAnniversary && !b.nextAnniversary) return 0 if (!a.nextAnniversary) return 1 if (!b.nextAnniversary) return -1 return a.nextAnniversary.daysUntil - b.nextAnniversary.daysUntil }) this.setData({ persons: sorted }) }, /** * 点击人员 */ onPersonTap(e) { const id = e.currentTarget.dataset.id wx.navigateTo({ url: `/pages/person-detail/person-detail?id=${id}` }) }, /** * 点击添加按钮 */ onAddTap() { wx.showActionSheet({ itemList: ['添加人员', '添加纪念日'], success: (res) => { if (res.tapIndex === 0) { wx.navigateTo({ url: '/pages/add-person/add-person' }) } else if (res.tapIndex === 1) { wx.navigateTo({ url: '/pages/add-anniversary/add-anniversary' }) } } }) } })