321 lines
8.6 KiB
JavaScript
321 lines
8.6 KiB
JavaScript
// pages/workbench/workbench.js
|
|
const api = require('../../utils/api')
|
|
const app = getApp()
|
|
|
|
Page({
|
|
data: {
|
|
userInfo: {},
|
|
currentStatus: 'offline',
|
|
statusText: '离线',
|
|
showStatusModal: false,
|
|
// 等级信息
|
|
levelCode: 'junior',
|
|
levelName: '初级',
|
|
textPrice: 0.5,
|
|
voicePrice: 1,
|
|
stats: {
|
|
todayOrders: 0,
|
|
todayIncome: '0.00',
|
|
totalOrders: 0,
|
|
totalIncome: '0.00'
|
|
},
|
|
hallOrders: [],
|
|
activeOrders: [],
|
|
loading: false
|
|
},
|
|
|
|
onLoad() {
|
|
this.setData({
|
|
userInfo: app.globalData.userInfo || {}
|
|
})
|
|
},
|
|
|
|
onShow() {
|
|
this.loadCompanionStatus()
|
|
this.loadWorkbenchData()
|
|
this.loadHallOrders()
|
|
this.loadActiveOrders()
|
|
},
|
|
|
|
// 加载陪聊师状态(包含等级信息)
|
|
async loadCompanionStatus() {
|
|
try {
|
|
const res = await api.companion.getStatus()
|
|
if (res.success && res.data) {
|
|
const data = res.data
|
|
this.setData({
|
|
currentStatus: data.onlineStatus || 'offline',
|
|
statusText: this.getStatusText(data.onlineStatus || 'offline'),
|
|
// 等级信息
|
|
levelCode: data.levelCode || 'junior',
|
|
levelName: data.levelName || '初级',
|
|
textPrice: data.textPrice || 0.5,
|
|
voicePrice: data.voicePrice || 1
|
|
})
|
|
}
|
|
} catch (err) {
|
|
console.error('加载陪聊师状态失败:', err)
|
|
}
|
|
},
|
|
|
|
// 加载工作台数据
|
|
async loadWorkbenchData() {
|
|
try {
|
|
const res = await api.companion.getWorkbench()
|
|
if (res.success) {
|
|
const data = res.data || {}
|
|
this.setData({
|
|
stats: {
|
|
todayOrders: data.todayOrders || data.todayStats?.orderCount || 0,
|
|
todayIncome: (data.todayIncome || data.todayStats?.totalAmount || 0).toFixed(2),
|
|
totalOrders: data.totalOrders || data.monthStats?.orderCount || 0,
|
|
totalIncome: (data.totalIncome || data.monthStats?.totalAmount || 0).toFixed(2)
|
|
}
|
|
})
|
|
}
|
|
} catch (err) {
|
|
console.error('加载工作台数据失败:', err)
|
|
}
|
|
},
|
|
|
|
// 加载接单大厅订单
|
|
async loadHallOrders() {
|
|
try {
|
|
const res = await api.order.getHall()
|
|
if (res.success) {
|
|
const orders = (res.data || []).map(order => ({
|
|
...order,
|
|
createTimeText: this.formatTime(order.created_at),
|
|
serviceTypeText: this.getServiceTypeText(order.service_type)
|
|
}))
|
|
this.setData({ hallOrders: orders })
|
|
}
|
|
} catch (err) {
|
|
console.error('加载接单大厅失败:', err)
|
|
}
|
|
},
|
|
|
|
// 加载进行中的订单
|
|
async loadActiveOrders() {
|
|
try {
|
|
const res = await api.companion.getOrders({ status: 'in_progress' })
|
|
if (res.success) {
|
|
const orders = (res.data?.list || []).map(order => ({
|
|
...order,
|
|
remainingTime: this.calculateRemainingTime(order)
|
|
}))
|
|
this.setData({ activeOrders: orders })
|
|
}
|
|
} catch (err) {
|
|
console.error('加载进行中订单失败:', err)
|
|
}
|
|
},
|
|
|
|
// 获取状态文本
|
|
getStatusText(status) {
|
|
const statusMap = {
|
|
'online': '在线接单',
|
|
'busy': '忙碌中',
|
|
'offline': '离线'
|
|
}
|
|
return statusMap[status] || '离线'
|
|
},
|
|
|
|
// 获取服务类型文本
|
|
getServiceTypeText(type) {
|
|
const typeMap = {
|
|
'chat': '文字聊天',
|
|
'voice': '语音聊天',
|
|
'video': '视频聊天'
|
|
}
|
|
return typeMap[type] || '聊天服务'
|
|
},
|
|
|
|
// 格式化时间
|
|
formatTime(timeStr) {
|
|
if (!timeStr) return ''
|
|
const date = new Date(timeStr)
|
|
const now = new Date()
|
|
const diff = now - date
|
|
|
|
if (diff < 60000) return '刚刚'
|
|
if (diff < 3600000) return Math.floor(diff / 60000) + '分钟前'
|
|
if (diff < 86400000) return Math.floor(diff / 3600000) + '小时前'
|
|
return `${date.getMonth() + 1}/${date.getDate()}`
|
|
},
|
|
|
|
// 计算剩余时间
|
|
calculateRemainingTime(order) {
|
|
if (!order.start_time || !order.duration) return '未知'
|
|
const startTime = new Date(order.start_time).getTime()
|
|
const endTime = startTime + order.duration * 60 * 1000
|
|
const remaining = endTime - Date.now()
|
|
|
|
if (remaining <= 0) return '已超时'
|
|
const minutes = Math.floor(remaining / 60000)
|
|
return `${minutes}分钟`
|
|
},
|
|
|
|
// 显示状态选择器
|
|
showStatusPicker() {
|
|
this.setData({ showStatusModal: true })
|
|
},
|
|
|
|
// 隐藏状态选择器
|
|
hideStatusPicker() {
|
|
this.setData({ showStatusModal: false })
|
|
},
|
|
|
|
// 切换状态
|
|
async changeStatus(e) {
|
|
const status = e.currentTarget.dataset.status
|
|
if (status === this.data.currentStatus) {
|
|
this.hideStatusPicker()
|
|
return
|
|
}
|
|
|
|
wx.showLoading({ title: '切换中...' })
|
|
try {
|
|
const res = await api.companion.updateStatus(status)
|
|
if (res.success) {
|
|
this.setData({
|
|
currentStatus: status,
|
|
statusText: this.getStatusText(status)
|
|
})
|
|
wx.showToast({ title: '状态已更新', icon: 'success' })
|
|
} else {
|
|
wx.showToast({ title: res.message || '切换失败', icon: 'none' })
|
|
}
|
|
} catch (err) {
|
|
wx.showToast({ title: '切换失败', icon: 'none' })
|
|
} finally {
|
|
wx.hideLoading()
|
|
this.hideStatusPicker()
|
|
}
|
|
},
|
|
|
|
// 刷新接单大厅
|
|
refreshHall() {
|
|
wx.showLoading({ title: '刷新中...' })
|
|
this.loadHallOrders().finally(() => {
|
|
wx.hideLoading()
|
|
wx.showToast({ title: '已刷新', icon: 'success' })
|
|
})
|
|
},
|
|
|
|
// 接受订单
|
|
async acceptOrder(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.accept(orderId)
|
|
if (result.success) {
|
|
wx.showToast({ title: '接单成功', icon: 'success' })
|
|
this.loadHallOrders()
|
|
this.loadActiveOrders()
|
|
this.loadWorkbenchData()
|
|
} else {
|
|
wx.showToast({ title: result.message || '接单失败', icon: 'none' })
|
|
}
|
|
} catch (err) {
|
|
wx.showToast({ title: '接单失败', icon: 'none' })
|
|
} finally {
|
|
wx.hideLoading()
|
|
}
|
|
}
|
|
}
|
|
})
|
|
},
|
|
|
|
// 拒绝订单
|
|
async rejectOrder(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.reject(orderId, '陪聊师暂时无法接单')
|
|
if (result.success) {
|
|
wx.showToast({ title: '已拒绝', icon: 'success' })
|
|
this.loadHallOrders()
|
|
} 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.loadActiveOrders()
|
|
this.loadWorkbenchData()
|
|
} 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}`
|
|
})
|
|
},
|
|
|
|
// 跳转到订单列表
|
|
goToOrders() {
|
|
wx.navigateTo({ url: '/pages/companion-orders/companion-orders' })
|
|
},
|
|
|
|
// 跳转到客户管理
|
|
goToCustomers() {
|
|
wx.navigateTo({ url: '/pages/customer-management/customer-management' })
|
|
},
|
|
|
|
// 跳转到提现
|
|
goToWithdraw() {
|
|
wx.navigateTo({ url: '/pages/withdraw/withdraw' })
|
|
},
|
|
|
|
// 跳转到佣金明细
|
|
goToCommission() {
|
|
wx.navigateTo({ url: '/pages/commission/commission' })
|
|
}
|
|
})
|