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

319 lines
7.6 KiB
JavaScript

// 服务人员详情页
const api = require('../../utils/api')
const app = getApp()
Page({
data: {
statusBarHeight: 44,
navBarHeight: 44,
totalNavHeight: 88,
provider: null,
reviews: [],
showBookingModal: false,
showAllReviewsModal: false,
// 预约表单数据
selectedType: '',
serviceTypes: [],
bookingTime: '',
bookingAddress: '',
remark: '',
loading: true
},
onLoad(options) {
// 计算导航栏高度
const systemInfo = wx.getSystemInfoSync()
const statusBarHeight = systemInfo.statusBarHeight || 44
const menuButton = wx.getMenuButtonBoundingClientRect()
const navBarHeight = menuButton.height + (menuButton.top - statusBarHeight) * 2
const totalNavHeight = statusBarHeight + navBarHeight
this.setData({
statusBarHeight,
navBarHeight,
totalNavHeight
})
// 加载服务人员数据
if (options.id) {
this.loadProviderDetail(options.id)
} else {
// 使用模拟数据
this.loadMockData()
}
},
/**
* 加载服务人员详情
*/
async loadProviderDetail(id) {
this.setData({ loading: true })
try {
const res = await new Promise((resolve, reject) => {
wx.request({
url: `${config.API_BASE_URL}/service/providers/${id}`,
method: 'GET',
success: (res) => resolve(res),
fail: (err) => reject(err)
})
})
if (res.statusCode === 200 && res.data.success) {
const provider = res.data.data
const baseUrl = 'https://ai-c.maimanji.com'
// 处理头像URL
if (provider.avatar && provider.avatar.startsWith('/')) {
provider.avatar = baseUrl + provider.avatar
}
// 处理服务类型
let serviceTypes = provider.serviceTypes || []
if (serviceTypes.length === 0) {
// 默认服务类型
serviceTypes = [
{ id: 'basic', name: '基础服务', price: provider.price, unit: provider.unit || '小时' }
]
}
// 模拟评价数据(暂时保留,因为后端未返回)
const reviews = [
{
id: 1,
userName: '138****6172',
avatar: '',
rating: 5,
content: '非常专业,服务态度很好。工作认真负责,每次都能把家里打扫得干干净净。非常满意!',
tags: ['专业', '认真', '细心'],
date: '2024-01-15'
}
]
this.setData({
provider,
reviews,
serviceTypes,
selectedType: serviceTypes[0].id,
loading: false
})
} else {
wx.showToast({ title: '加载失败', icon: 'none' })
setTimeout(() => wx.navigateBack(), 2000)
}
} catch (err) {
console.error('加载服务人员详情失败', err)
wx.showToast({ title: '网络错误', icon: 'none' })
setTimeout(() => wx.navigateBack(), 2000)
}
},
/**
* 返回
*/
onBack() {
wx.navigateBack()
},
/**
* 分享
*/
onShare() {
wx.showShareMenu({
withShareTicket: true,
menus: ['shareAppMessage', 'shareTimeline']
})
},
/**
* 咨询
*/
onConsult() {
// 检查登录
if (app.checkNeedLogin && app.checkNeedLogin()) return
wx.showToast({ title: '咨询功能开发中', icon: 'none' })
},
/**
* 立即预约
*/
onBook() {
// 检查登录
if (app.checkNeedLogin && app.checkNeedLogin()) return
this.setData({ showBookingModal: true })
},
/**
* 关闭预约弹窗
*/
closeBookingModal() {
this.setData({ showBookingModal: false })
},
/**
* 选择服务类型
*/
selectServiceType(e) {
const id = e.currentTarget.dataset.id
this.setData({ selectedType: id })
},
/**
* 选择预约时间
*/
onPickTime() {
const now = new Date()
const currentDate = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')}`
const currentTime = `${String(now.getHours()).padStart(2, '0')}:${String(now.getMinutes()).padStart(2, '0')}`
wx.showModal({
title: '选择时间',
content: '请使用日期时间选择器',
showCancel: false,
success: () => {
// 简化版:直接设置当前时间
this.setData({
bookingTime: `${currentDate} ${currentTime}`
})
}
})
},
/**
* 选择服务地址
*/
onPickAddress() {
wx.chooseLocation({
success: (res) => {
this.setData({
bookingAddress: res.address + res.name
})
},
fail: (err) => {
if (err.errMsg.includes('auth deny')) {
wx.showModal({
title: '需要位置权限',
content: '请在设置中开启位置权限',
confirmText: '去设置',
success: (res) => {
if (res.confirm) {
wx.openSetting()
}
}
})
}
}
})
},
/**
* 备注输入
*/
onRemarkInput(e) {
this.setData({ remark: e.detail.value })
},
/**
* 计算价格
*/
calculatePrice() {
const { serviceTypes, selectedType } = this.data
const type = serviceTypes.find(t => t.id === selectedType)
return type ? type.price : 0
},
/**
* 确认预约
*/
async confirmBooking() {
const { selectedType, bookingTime, bookingAddress, remark, provider } = this.data
// 验证表单
if (!bookingTime) {
wx.showToast({ title: '请选择预约时间', icon: 'none' })
return
}
if (!bookingAddress) {
wx.showToast({ title: '请选择服务地址', icon: 'none' })
return
}
wx.showLoading({ title: '提交中...' })
try {
// TODO: 调用实际API
// const res = await api.service.createBooking({
// providerId: provider.id,
// serviceType: selectedType,
// bookingTime,
// address: bookingAddress,
// remark
// })
// 模拟API调用
await new Promise(resolve => setTimeout(resolve, 1000))
wx.hideLoading()
wx.showToast({ title: '预约成功', icon: 'success' })
this.setData({ showBookingModal: false })
// 跳转到订单详情
setTimeout(() => {
wx.navigateTo({
url: '/pages/order-detail/order-detail?id=mock123'
})
}, 1500)
} catch (err) {
wx.hideLoading()
console.error('预约失败', err)
wx.showToast({ title: '预约失败', icon: 'none' })
}
},
/**
* 查看全部评价
*/
onViewAllReviews() {
this.setData({ showAllReviewsModal: true })
},
/**
* 关闭全部评价弹窗
*/
closeAllReviewsModal() {
this.setData({ showAllReviewsModal: false })
},
/**
* 分享给好友
*/
onShareAppMessage() {
const { provider } = this.data
const referralCode = wx.getStorageSync('referralCode') || ''
const referralCodeParam = referralCode ? `&referralCode=${referralCode}` : ''
return {
title: `推荐服务人员:${provider.name}`,
path: `/pages/service-provider-detail/service-provider-detail?id=${provider.id}${referralCodeParam}`,
imageUrl: provider.avatar
}
},
/**
* 分享到朋友圈
*/
onShareTimeline() {
const { provider } = this.data
const referralCode = wx.getStorageSync('referralCode') || ''
const query = `id=${provider.id}${referralCode ? `&referralCode=${referralCode}` : ''}`
return {
title: `推荐服务人员:${provider.name}`,
query: query,
imageUrl: provider.avatar
}
}
})