Files
Neo-ZQYY/apps/miniprogram - 副本/miniprogram/pages/task-list/task-list.ts

124 lines
3.6 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { mockTasks, mockPerformance } from '../../utils/mock-data'
import type { Task } from '../../utils/mock-data'
import { getTaskTypeColor } from '../../utils/task'
/** 任务类型 → 详情页路由映射 */
const DETAIL_ROUTE_MAP: Record<string, string> = {
callback: '/pages/task-detail-callback/task-detail-callback',
priority_recall: '/pages/task-detail-priority/task-detail-priority',
relationship: '/pages/task-detail-relationship/task-detail-relationship',
}
/** 为任务附加颜色信息 */
function enrichTask(task: Task) {
return {
...task,
typeColor: getTaskTypeColor(task.taskType),
}
}
Page({
data: {
/** 页面状态loading / empty / normal */
pageState: 'loading' as 'loading' | 'empty' | 'normal',
/** 任务列表(附带颜色) */
tasks: [] as ReturnType<typeof enrichTask>[],
/** 任务总数 */
taskCount: 0,
/** Banner 指标 */
bannerMetrics: [] as Array<{ label: string; value: string }>,
/** Banner 标题 */
bannerTitle: '',
/** 是否还有更多数据(模拟分页) */
hasMore: true,
},
onLoad() {
this.loadData()
},
onShow() {
// TabBar 页面每次显示时可刷新
},
/** 下拉刷新 */
onPullDownRefresh() {
this.loadData(() => {
wx.stopPullDownRefresh()
})
},
/** 触底加载更多 */
onReachBottom() {
if (!this.data.hasMore) return
// Mock无更多数据
this.setData({ hasMore: false })
wx.showToast({ title: '没有更多了', icon: 'none' })
},
/** 加载数据 */
loadData(cb?: () => void) {
this.setData({ pageState: 'loading' })
// 模拟网络延迟
setTimeout(() => {
const pending = mockTasks.filter((t) => t.status === 'pending')
const enriched = pending.map(enrichTask)
const perf = mockPerformance
const bannerTitle = `${perf.currentTier}`
const bannerMetrics = [
{ label: '本月收入', value: `¥${perf.monthlyIncome.toLocaleString()}` },
{ label: '今日服务', value: `${perf.todayServiceCount}` },
{ label: '距下一档', value: `¥${perf.nextTierGap.toLocaleString()}` },
]
this.setData({
pageState: enriched.length > 0 ? 'normal' : 'empty',
tasks: enriched,
taskCount: enriched.length,
bannerTitle,
bannerMetrics,
hasMore: true,
})
cb?.()
}, 600)
},
/** 点击任务卡片 → 跳转详情 */
onTaskTap(e: WechatMiniprogram.TouchEvent) {
const { id, tasktype } = e.currentTarget.dataset
const route = DETAIL_ROUTE_MAP[tasktype] || '/pages/task-detail/task-detail'
wx.navigateTo({
url: `${route}?id=${id}`,
fail: () => wx.showToast({ title: '页面跳转失败', icon: 'none' }),
})
},
/** 长按任务卡片 → 操作菜单 */
onTaskLongPress(e: WechatMiniprogram.TouchEvent) {
const { id, name } = e.currentTarget.dataset
wx.showActionSheet({
itemList: ['查看详情', '标记完成', '添加备注'],
success: (res) => {
switch (res.tapIndex) {
case 0: {
// 查看详情 — 复用点击逻辑
const { tasktype } = e.currentTarget.dataset
const route = DETAIL_ROUTE_MAP[tasktype] || '/pages/task-detail/task-detail'
wx.navigateTo({ url: `${route}?id=${id}` })
break
}
case 1:
wx.showToast({ title: `已标记「${name}」完成`, icon: 'success' })
break
case 2:
wx.showToast({ title: `为「${name}」添加备注`, icon: 'none' })
break
}
},
})
},
})