You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

225 lines
6.1 KiB

const app = getApp<IAppOption>()
// 公告列表项
interface IAnnouncementItem {
id: number
title: string
content: string
displayPosition: number
priority: number
redDot: boolean
jumpType: number
jumpTarget: string
buttonText: string
startAt: string
endAt: string
createdAt: string
isRead: boolean
}
// 通知列表项
interface INoticeItem {
id: number
taskId: number
title: string
subtitle: string
subType: string
subTypeName: string
coverImage: string
jumpType: number
jumpTarget: string
buttonText: string
isRead: boolean
scheduleAt: string
}
interface IPagination {
page: number
pageSize: number
pages: number
count: number
}
2 weeks ago
Page({
data: {
active: 0,
imageUrl: app.globalData.imageUrl,
Timestamp: app.globalData.Timestamp,
// 公告
announcementList: [] as IAnnouncementItem[],
announcementPagination: { page: 1, pageSize: 20, pages: 0, count: 0 } as IPagination,
announcementLoading: false,
// 重要通知
importantList: [] as INoticeItem[],
importantPagination: { page: 1, pageSize: 20, pages: 0, count: 0 } as IPagination,
importantLoading: false,
// 活动通知
activityList: [] as INoticeItem[],
activityPagination: { page: 1, pageSize: 20, pages: 0, count: 0 } as IPagination,
activityLoading: false,
2 weeks ago
},
onLoad() {
app.waitLogin({ type: 1 }).then(() => {
this.fetchAnnouncementList()
})
},
onShow() {
// 刷新 tabbar 红点
const tabBar = this.getTabBar()
if (tabBar && typeof tabBar.fetchUnreadCount === 'function') {
tabBar.fetchUnreadCount()
}
},
// 切换 tab
onChange(e: WechatMiniprogram.CustomEvent) {
const active = e.detail.index ?? 0
this.setData({ active })
if (active === 0 && this.data.announcementList.length === 0) {
this.fetchAnnouncementList()
} else if (active === 1 && this.data.importantList.length === 0) {
this.fetchNoticeList('important')
} else if (active === 2 && this.data.activityList.length === 0) {
this.fetchNoticeList('activity')
}
},
// 获取公告列表(专用接口)
async fetchAnnouncementList(isRefresh = false) {
if (this.data.announcementLoading) return
const { announcementPagination } = this.data
const page = isRefresh ? 1 : announcementPagination.page
this.setData({ announcementLoading: true })
try {
const res = await wx.ajax({
url: '/notification/announcement-list',
method: 'GET',
data: { page, pageSize: announcementPagination.pageSize },
})
if (res) {
const newList = isRefresh ? res.list : [...this.data.announcementList, ...res.list]
this.setData({
announcementList: newList,
announcementPagination: {
page: res.pagination?.page || page,
pageSize: res.pagination?.pageSize || announcementPagination.pageSize,
pages: res.pagination?.totalPages || 0,
count: res.pagination?.total || 0,
},
})
}
} catch (err) {
console.error('获取公告列表失败:', err)
} finally {
this.setData({ announcementLoading: false })
}
},
// 获取通知列表(重要通知/活动通知)
async fetchNoticeList(type: 'important' | 'activity', isRefresh = false) {
const loadingKey = `${type}Loading` as const
const listKey = `${type}List` as const
const paginationKey = `${type}Pagination` as const
if (this.data[loadingKey]) return
const pagination = this.data[paginationKey]
const page = isRefresh ? 1 : pagination.page
this.setData({ [loadingKey]: true } as any)
try {
const res = await wx.ajax({
url: '/notification/list',
method: 'GET',
data: { type, page, pageSize: pagination.pageSize },
})
if (res) {
const newList = isRefresh ? res.list : [...this.data[listKey], ...res.list]
this.setData({
[listKey]: newList,
[paginationKey]: {
page: res.pagination?.page || page,
pageSize: res.pagination?.pageSize || pagination.pageSize,
pages: res.pagination?.totalPages || 0,
count: res.pagination?.total || 0,
},
} as any)
}
} catch (err) {
console.error('获取通知列表失败:', err)
} finally {
this.setData({ [loadingKey]: false } as any)
}
},
// 查看公告详情
handleAnnouncementDetail(e: WechatMiniprogram.TouchEvent) {
const { id } = e.currentTarget.dataset
2 weeks ago
wx.navigateTo({
url: `/pages/noticeDetail/index?id=${id}&type=announcement`,
2 weeks ago
})
},
// 查看通知详情
handleNoticeDetail(e: WechatMiniprogram.TouchEvent) {
const { taskId } = e.currentTarget.dataset
wx.navigateTo({
url: `/pages/noticeDetail/index?taskId=${taskId}&type=notice`,
})
},
// 下拉刷新
onPullDownRefresh() {
const { active } = this.data
if (active === 0) {
this.fetchAnnouncementList(true)
} else if (active === 1) {
this.fetchNoticeList('important', true)
} else if (active === 2) {
this.fetchNoticeList('activity', true)
}
wx.stopPullDownRefresh()
},
// 上拉加载更多
onReachBottom() {
const { active, announcementPagination, importantPagination, activityPagination } = this.data
if (active === 0) {
if (announcementPagination.page < announcementPagination.pages) {
this.setData({
announcementPagination: { ...announcementPagination, page: announcementPagination.page + 1 },
})
this.fetchAnnouncementList()
}
} else if (active === 1) {
if (importantPagination.page < importantPagination.pages) {
this.setData({
importantPagination: { ...importantPagination, page: importantPagination.page + 1 },
})
this.fetchNoticeList('important')
}
} else if (active === 2) {
if (activityPagination.page < activityPagination.pages) {
this.setData({
activityPagination: { ...activityPagination, page: activityPagination.page + 1 },
})
this.fetchNoticeList('activity')
}
}
},
2 weeks ago
})
export {}