124 lines
3.6 KiB
TypeScript
124 lines
3.6 KiB
TypeScript
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
|
||
}
|
||
},
|
||
})
|
||
},
|
||
})
|