180 lines
6.4 KiB
TypeScript
180 lines
6.4 KiB
TypeScript
// TODO: 联调时替换为真实 API 调用
|
||
|
||
/** 业绩明细项(本月/上月) */
|
||
interface IncomeItem {
|
||
icon: string
|
||
label: string
|
||
desc: string
|
||
value: string
|
||
}
|
||
|
||
/** 服务记录(按日期分组后的展示结构) */
|
||
interface ServiceRecord {
|
||
customerName: string
|
||
avatarChar: string
|
||
avatarGradient: string
|
||
timeRange: string
|
||
hours: string
|
||
courseType: string
|
||
courseTypeClass: string
|
||
location: string
|
||
income: string
|
||
}
|
||
|
||
interface DateGroup {
|
||
date: string
|
||
records: ServiceRecord[]
|
||
}
|
||
|
||
Page({
|
||
data: {
|
||
pageState: 'loading' as 'loading' | 'empty' | 'normal',
|
||
|
||
/** Banner 数据 */
|
||
coachName: '小燕',
|
||
coachRole: '助教',
|
||
storeName: '广州朗朗桌球',
|
||
monthlyIncome: '¥6,206',
|
||
lastMonthIncome: '¥16,880',
|
||
|
||
/** 收入档位 */
|
||
currentTier: {
|
||
basicRate: 80,
|
||
incentiveRate: 95,
|
||
},
|
||
nextTier: {
|
||
basicRate: 90,
|
||
incentiveRate: 114,
|
||
},
|
||
upgradeHoursNeeded: 15,
|
||
upgradeBonus: 800,
|
||
|
||
/** 本月业绩明细 */
|
||
incomeItems: [] as IncomeItem[],
|
||
monthlyTotal: '¥6,950.5',
|
||
|
||
/** 服务记录 */
|
||
thisMonthRecords: [] as DateGroup[],
|
||
thisMonthRecordsExpanded: false,
|
||
/** 默认显示前 N 条日期组 */
|
||
visibleRecordGroups: 2,
|
||
|
||
/** 新客列表 */
|
||
newCustomers: [] as Array<{ name: string; avatarChar: string; gradient: string; lastService: string; count: number }>,
|
||
newCustomerExpanded: false,
|
||
|
||
/** 常客列表 */
|
||
regularCustomers: [] as Array<{ name: string; avatarChar: string; gradient: string; hours: number; income: string; count: number }>,
|
||
regularCustomerExpanded: false,
|
||
},
|
||
|
||
onLoad() {
|
||
this.loadData()
|
||
},
|
||
|
||
loadData() {
|
||
this.setData({ pageState: 'loading' })
|
||
|
||
setTimeout(() => {
|
||
// TODO: 替换为真实 API
|
||
const incomeItems: IncomeItem[] = [
|
||
{ icon: '🎱', label: '基础课', desc: '80元/h × 75h', value: '¥6,000' },
|
||
{ icon: '⭐', label: '激励课', desc: '95.05元/h × 10h', value: '¥950.5' },
|
||
{ icon: '💰', label: '充值激励', desc: '客户充值返佣', value: '¥500' },
|
||
{ icon: '🏆', label: 'TOP3 销冠奖', desc: '全店业绩前三名奖励', value: '继续努力' },
|
||
]
|
||
|
||
const gradients = [
|
||
'from-blue', 'from-pink', 'from-teal', 'from-green',
|
||
'from-orange', 'from-purple', 'from-violet', 'from-amber',
|
||
]
|
||
|
||
// 模拟服务记录按日期分组
|
||
const thisMonthRecords: DateGroup[] = [
|
||
{
|
||
date: '2月7日',
|
||
records: [
|
||
{ customerName: '王先生', avatarChar: '王', avatarGradient: gradients[0], timeRange: '20:00-22:00', hours: '2.0h', courseType: '基础课', courseTypeClass: 'tag-basic', location: '3号台', income: '¥160' },
|
||
{ customerName: '李女士', avatarChar: '李', avatarGradient: gradients[1], timeRange: '16:00-18:00', hours: '2.0h', courseType: '包厢课', courseTypeClass: 'tag-vip', location: 'VIP1号房', income: '¥190' },
|
||
],
|
||
},
|
||
{
|
||
date: '2月6日',
|
||
records: [
|
||
{ customerName: '张先生', avatarChar: '张', avatarGradient: gradients[2], timeRange: '19:00-21:00', hours: '2.0h', courseType: '基础课', courseTypeClass: 'tag-basic', location: '5号台', income: '¥160' },
|
||
],
|
||
},
|
||
{
|
||
date: '2月5日',
|
||
records: [
|
||
{ customerName: '陈女士', avatarChar: '陈', avatarGradient: gradients[2], timeRange: '20:00-22:00', hours: '2.0h', courseType: '基础课', courseTypeClass: 'tag-basic', location: '2号台', income: '¥160' },
|
||
{ customerName: '赵先生', avatarChar: '赵', avatarGradient: gradients[5], timeRange: '14:00-16:00', hours: '2.0h', courseType: '基础课', courseTypeClass: 'tag-basic', location: '7号台', income: '¥160' },
|
||
],
|
||
},
|
||
{
|
||
date: '2月4日',
|
||
records: [
|
||
{ customerName: '孙先生', avatarChar: '孙', avatarGradient: gradients[6], timeRange: '19:00-21:00', hours: '2.0h', courseType: '包厢课', courseTypeClass: 'tag-vip', location: 'VIP2号房', income: '¥190' },
|
||
{ customerName: '吴女士', avatarChar: '吴', avatarGradient: gradients[2], timeRange: '15:00-17:00', hours: '2.0h', courseType: '基础课', courseTypeClass: 'tag-basic', location: '1号台', income: '¥160' },
|
||
],
|
||
},
|
||
]
|
||
|
||
const newCustomers = [
|
||
{ name: '王先生', avatarChar: '王', gradient: gradients[0], lastService: '2月7日', count: 2 },
|
||
{ name: '李女士', avatarChar: '李', gradient: gradients[1], lastService: '2月7日', count: 1 },
|
||
{ name: '刘先生', avatarChar: '刘', gradient: gradients[4], lastService: '2月6日', count: 1 },
|
||
]
|
||
|
||
const regularCustomers = [
|
||
{ name: '张先生', avatarChar: '张', gradient: gradients[2], hours: 12, income: '¥960', count: 6 },
|
||
{ name: '陈女士', avatarChar: '陈', gradient: gradients[2], hours: 10, income: '¥800', count: 5 },
|
||
{ name: '赵先生', avatarChar: '赵', gradient: gradients[5], hours: 8, income: '¥640', count: 4 },
|
||
{ name: '孙先生', avatarChar: '孙', gradient: gradients[6], hours: 6, income: '¥570', count: 3 },
|
||
]
|
||
|
||
this.setData({
|
||
pageState: 'normal',
|
||
incomeItems,
|
||
thisMonthRecords,
|
||
newCustomers,
|
||
regularCustomers,
|
||
})
|
||
}, 500)
|
||
},
|
||
|
||
/** 展开/收起本月服务记录 */
|
||
toggleThisMonthRecords() {
|
||
this.setData({ thisMonthRecordsExpanded: !this.data.thisMonthRecordsExpanded })
|
||
},
|
||
|
||
/** 查看全部 → 跳转业绩明细 */
|
||
goToRecords() {
|
||
wx.navigateTo({ url: '/pages/performance-records/performance-records' })
|
||
},
|
||
|
||
/** 展开/收起新客列表 */
|
||
toggleNewCustomer() {
|
||
this.setData({ newCustomerExpanded: !this.data.newCustomerExpanded })
|
||
},
|
||
|
||
/** 展开/收起常客列表 */
|
||
toggleRegularCustomer() {
|
||
this.setData({ regularCustomerExpanded: !this.data.regularCustomerExpanded })
|
||
},
|
||
|
||
/** 点击客户卡片 → 跳转任务详情 */
|
||
onCustomerTap(e: WechatMiniprogram.TouchEvent) {
|
||
const { name } = e.currentTarget.dataset
|
||
wx.navigateTo({
|
||
url: `/pages/task-detail/task-detail?customerName=${name}`,
|
||
fail: () => wx.showToast({ title: '页面跳转失败', icon: 'none' }),
|
||
})
|
||
},
|
||
|
||
/** 点击收入概览卡片 → 跳转业绩记录 */
|
||
onIncomeCardTap() {
|
||
wx.navigateTo({ url: '/pages/performance-records/performance-records' })
|
||
},
|
||
})
|