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

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' })
}
})