ai-c/pages/customer-management/customer-management.js
2026-02-02 18:21:32 +08:00

234 lines
5.6 KiB
JavaScript

// 客户管理页面 - 陪聊师端
// 对接后端API
const api = require('../../utils/api')
const app = getApp()
Page({
data: {
statusBarHeight: 44,
navHeight: 92,
loading: false,
// 统计数据
balanceInt: '0',
balanceDec: '00',
pendingAmount: '0.00',
totalSettled: '0.00',
newCustomers: 0,
promotionOrders: 0,
// 搜索
searchQuery: '',
// 客户列表
customerList: [],
page: 1,
hasMore: true
},
onLoad() {
const systemInfo = wx.getSystemInfoSync()
const statusBarHeight = systemInfo.statusBarHeight || 44
const navHeight = statusBarHeight + 48
this.setData({
statusBarHeight,
navHeight
})
this.loadData()
},
/**
* 下拉刷新
*/
onPullDownRefresh() {
this.loadData().then(() => {
wx.stopPullDownRefresh()
})
},
/**
* 上拉加载更多
*/
onReachBottom() {
if (this.data.hasMore && !this.data.loading) {
this.loadMoreCustomers()
}
},
/**
* 加载数据
*/
async loadData() {
await Promise.all([
this.loadStats(),
this.loadCustomers()
])
},
/**
* 加载统计数据
*/
async loadStats() {
try {
const res = await api.companion.getOrderStats()
if (res.success && res.data) {
const balance = res.data.balance || 0
const balanceStr = balance.toFixed(2)
const [balanceInt, balanceDec] = balanceStr.split('.')
this.setData({
balanceInt: parseInt(balanceInt).toLocaleString(),
balanceDec: balanceDec || '00',
pendingAmount: (res.data.pending_amount || 0).toFixed(2),
totalSettled: (res.data.total_settled || 0).toLocaleString('zh-CN', { minimumFractionDigits: 2 }),
newCustomers: res.data.new_customers || 0,
promotionOrders: res.data.promotion_orders || 0
})
}
} catch (err) {
console.log('获取统计数据失败', err)
}
},
/**
* 加载客户列表
*/
async loadCustomers() {
this.setData({ loading: true, page: 1 })
try {
const params = { page: 1, pageSize: 20 }
if (this.data.searchQuery.trim()) {
params.keyword = this.data.searchQuery.trim()
}
const res = await api.companion.getCustomers(params)
if (res.success && res.data) {
const customers = (res.data.list || res.data || []).map(c => this.transformCustomer(c))
this.setData({
customerList: customers,
hasMore: customers.length >= 20,
loading: false
})
} else {
this.setData({ customerList: [], loading: false })
}
} catch (err) {
console.error('加载客户列表失败', err)
this.setData({ loading: false })
}
},
/**
* 加载更多客户
*/
async loadMoreCustomers() {
const nextPage = this.data.page + 1
this.setData({ loading: true })
try {
const params = { page: nextPage, pageSize: 20 }
if (this.data.searchQuery.trim()) {
params.keyword = this.data.searchQuery.trim()
}
const res = await api.companion.getCustomers(params)
if (res.success && res.data) {
const newCustomers = (res.data.list || res.data || []).map(c => this.transformCustomer(c))
this.setData({
customerList: [...this.data.customerList, ...newCustomers],
page: nextPage,
hasMore: newCustomers.length >= 20,
loading: false
})
} else {
this.setData({ hasMore: false, loading: false })
}
} catch (err) {
console.error('加载更多客户失败', err)
this.setData({ loading: false })
}
},
/**
* 转换客户数据格式
*/
transformCustomer(customer) {
return {
id: customer.id || customer.user_id,
displayId: `ID${String(customer.id || customer.user_id).slice(-4)}`,
nickname: customer.nickname || customer.name,
avatar: customer.avatar,
time: this.formatTime(customer.last_contact_at || customer.created_at),
status: customer.status || 'success',
orderCount: customer.order_count || 0,
totalAmount: customer.total_amount || 0
}
},
/**
* 格式化时间
*/
formatTime(dateStr) {
if (!dateStr) return ''
const date = new Date(dateStr)
const hour = String(date.getHours()).padStart(2, '0')
const minute = String(date.getMinutes()).padStart(2, '0')
return `${hour}:${minute}`
},
onBack() {
wx.navigateBack()
},
onSearchInput(e) {
this.setData({ searchQuery: e.detail.value })
},
/**
* 搜索客户
*/
onSearch() {
this.loadCustomers()
},
/**
* 点击客户
*/
onCustomerTap(e) {
const customer = e.currentTarget.dataset.customer || {}
const id = e.currentTarget.dataset.id || customer.id
wx.showActionSheet({
itemList: ['查看详情', '发起聊天', '查看订单'],
success: (res) => {
if (res.tapIndex === 0) {
// 查看详情
wx.showModal({
title: '客户详情',
content: `客户ID: ${customer.displayId || id}\n订单数: ${customer.orderCount || 0}\n消费金额: ¥${customer.totalAmount || 0}`,
showCancel: false
})
} else if (res.tapIndex === 1) {
// 发起聊天
wx.navigateTo({
url: `/pages/companion-chat/companion-chat?customerId=${id}`
})
} else if (res.tapIndex === 2) {
// 查看订单
wx.navigateTo({
url: `/pages/orders/orders?customerId=${id}`
})
}
}
})
}
})