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

308 lines
7.6 KiB
JavaScript

// pages/companion-orders/companion-orders.js
const api = require('../../utils/api')
Page({
data: {
currentTab: 'all',
orders: [],
stats: {
totalOrders: 0,
completedOrders: 0,
totalIncome: '0.00'
},
page: 1,
pageSize: 20,
hasMore: true,
loading: false,
// 评价回复弹窗
showReplyModal: false,
currentReview: null,
replyContent: '',
submittingReply: false
},
onLoad() {
this.loadStats()
this.loadOrders()
},
onPullDownRefresh() {
this.setData({ page: 1, hasMore: true })
Promise.all([this.loadStats(), this.loadOrders()]).finally(() => {
wx.stopPullDownRefresh()
})
},
onReachBottom() {
if (this.data.hasMore && !this.data.loading) {
this.loadMoreOrders()
}
},
// 加载统计数据
async loadStats() {
try {
const res = await api.companion.getOrderStats()
if (res.success) {
this.setData({
stats: {
totalOrders: res.data.total_orders || 0,
completedOrders: res.data.completed_orders || 0,
totalIncome: (res.data.total_income || 0).toFixed(2)
}
})
}
} catch (err) {
console.error('加载统计数据失败:', err)
}
},
// 加载订单列表
async loadOrders() {
this.setData({ loading: true })
try {
const params = {
page: 1,
pageSize: this.data.pageSize
}
if (this.data.currentTab !== 'all') {
params.status = this.data.currentTab
}
const res = await api.companion.getOrders(params)
if (res.success) {
const orders = (res.data?.list || []).map(order => this.formatOrder(order))
this.setData({
orders,
page: 1,
hasMore: orders.length >= this.data.pageSize
})
}
} catch (err) {
console.error('加载订单失败:', err)
} finally {
this.setData({ loading: false })
}
},
// 加载更多订单
async loadMoreOrders() {
this.setData({ loading: true })
try {
const params = {
page: this.data.page + 1,
pageSize: this.data.pageSize
}
if (this.data.currentTab !== 'all') {
params.status = this.data.currentTab
}
const res = await api.companion.getOrders(params)
if (res.success) {
const newOrders = (res.data?.list || []).map(order => this.formatOrder(order))
this.setData({
orders: [...this.data.orders, ...newOrders],
page: this.data.page + 1,
hasMore: newOrders.length >= this.data.pageSize
})
}
} catch (err) {
console.error('加载更多订单失败:', err)
} finally {
this.setData({ loading: false })
}
},
// 格式化订单数据
formatOrder(order) {
return {
...order,
statusText: this.getStatusText(order.status),
serviceTypeText: this.getServiceTypeText(order.service_type),
createTimeText: this.formatTime(order.created_at)
}
},
// 获取状态文本
getStatusText(status) {
const statusMap = {
'pending': '待服务',
'in_progress': '进行中',
'completed': '已完成',
'cancelled': '已取消'
}
return statusMap[status] || status
},
// 获取服务类型文本
getServiceTypeText(type) {
const typeMap = {
'chat': '文字聊天',
'voice': '语音聊天',
'video': '视频聊天'
}
return typeMap[type] || '聊天服务'
},
// 格式化时间
formatTime(timeStr) {
if (!timeStr) return ''
const date = new Date(timeStr)
const month = date.getMonth() + 1
const day = date.getDate()
const hour = date.getHours().toString().padStart(2, '0')
const minute = date.getMinutes().toString().padStart(2, '0')
return `${month}/${day} ${hour}:${minute}`
},
// 切换标签
switchTab(e) {
const tab = e.currentTarget.dataset.tab
if (tab === this.data.currentTab) return
this.setData({
currentTab: tab,
orders: [],
page: 1,
hasMore: true
})
this.loadOrders()
},
// 开始服务
async startService(e) {
const orderId = e.currentTarget.dataset.id
wx.showModal({
title: '开始服务',
content: '确定要开始服务吗?',
success: async (res) => {
if (res.confirm) {
wx.showLoading({ title: '处理中...' })
try {
const result = await api.order.startService(orderId)
if (result.success) {
wx.showToast({ title: '服务已开始', icon: 'success' })
this.loadOrders()
this.loadStats()
} else {
wx.showToast({ title: result.message || '操作失败', icon: 'none' })
}
} catch (err) {
wx.showToast({ title: '操作失败', icon: 'none' })
} finally {
wx.hideLoading()
}
}
}
})
},
// 结束服务
async endService(e) {
const orderId = e.currentTarget.dataset.id
wx.showModal({
title: '结束服务',
content: '确定要结束服务吗?',
success: async (res) => {
if (res.confirm) {
wx.showLoading({ title: '处理中...' })
try {
const result = await api.order.endService(orderId)
if (result.success) {
wx.showToast({ title: '服务已结束', icon: 'success' })
this.loadOrders()
this.loadStats()
} else {
wx.showToast({ title: result.message || '操作失败', icon: 'none' })
}
} catch (err) {
wx.showToast({ title: '操作失败', icon: 'none' })
} finally {
wx.hideLoading()
}
}
}
})
},
// 跳转到聊天
goToChat(e) {
const order = e.currentTarget.dataset.order
wx.navigateTo({
url: `/pages/companion-chat/companion-chat?orderId=${order.id}&userId=${order.user_id}`
})
},
// 跳转到订单详情
goToDetail(e) {
const orderId = e.currentTarget.dataset.id
wx.navigateTo({
url: `/pages/order-detail/order-detail?id=${orderId}`
})
},
// 查看评价
viewReview(e) {
const order = e.currentTarget.dataset.order
if (order.review) {
this.setData({
currentReview: order.review,
showReplyModal: true,
replyContent: ''
})
}
},
// 关闭回复弹窗
closeReplyModal() {
this.setData({
showReplyModal: false,
currentReview: null,
replyContent: ''
})
},
// 输入回复内容
onReplyInput(e) {
this.setData({ replyContent: e.detail.value })
},
// 提交回复
async submitReply() {
const { currentReview, replyContent } = this.data
if (!replyContent.trim()) {
wx.showToast({ title: '请输入回复内容', icon: 'none' })
return
}
if (this.data.submittingReply) return
this.setData({ submittingReply: true })
wx.showLoading({ title: '提交中...' })
try {
const res = await api.companion.replyReview(currentReview.id, replyContent.trim())
wx.hideLoading()
this.setData({ submittingReply: false })
if (res.success) {
wx.showToast({ title: '回复成功', icon: 'success' })
this.closeReplyModal()
// 刷新订单列表
this.loadOrders()
} else {
wx.showToast({ title: res.message || res.error || '回复失败', icon: 'none' })
}
} catch (err) {
wx.hideLoading()
this.setData({ submittingReply: false })
console.error('回复评价失败', err)
wx.showToast({ title: '回复失败', icon: 'none' })
}
}
})