412 lines
10 KiB
JavaScript
412 lines
10 KiB
JavaScript
// pages/dingdanxiangqing/dingdanxiangqing.js
|
||
const app = getApp()
|
||
import request from '../../utils/request.js'
|
||
|
||
Page({
|
||
data: {
|
||
// 从跳转参数获取的基础数据
|
||
jibenShuju: {
|
||
dingdanId: '',
|
||
tupian: '',
|
||
jieshao: '',
|
||
chuangjianshijian: '',
|
||
jine: '',
|
||
nicheng: '',
|
||
beizhu: '',
|
||
zhuangtai: 0
|
||
},
|
||
|
||
// 从后端获取的详细数据
|
||
xiangxiShuju: {
|
||
zhiding: '', // 指定打手
|
||
dashou: '', // 服务打手
|
||
dashoujiaofu: [], // 打手交付图片列表
|
||
dashouliuyan: '' // 打手留言
|
||
},
|
||
|
||
// 结算相关数据
|
||
jiesuanShuju: {
|
||
pingfen: 0, // 评分 0-5
|
||
liuyan: '' // 留言
|
||
},
|
||
|
||
// 页面状态
|
||
isLoading: true, // 页面加载中
|
||
isJiesuanLoading: false, // 结单请求中
|
||
|
||
// 状态颜色映射
|
||
zhuangtaiYanseMap: {
|
||
1: '#E8F5E9', // 已下单 - 浅绿色
|
||
2: '#E3F2FD', // 进行中 - 浅蓝色
|
||
3: '#F3E5F5', // 已完成 - 浅紫色
|
||
4: '#FFF3E0', // 退款中 - 浅橙色
|
||
5: '#FFEBEE', // 已退款 - 浅红色
|
||
6: '#EFEBE9', // 退款失败 - 浅棕色
|
||
7: '#E0F7FA', // 指定中 - 浅青色
|
||
8: '#FFF8E1' // 结算中 - 浅黄色
|
||
},
|
||
|
||
// 状态文字映射
|
||
zhuangtaiWenziMap: {
|
||
1: '已下单',
|
||
2: '进行中',
|
||
3: '已完成',
|
||
4: '退款中',
|
||
5: '已退款',
|
||
6: '退款失败',
|
||
7: '指定中',
|
||
8: '结算中'
|
||
},
|
||
|
||
// 星星评分数据
|
||
xingxingData: [
|
||
{ id: 1, active: false },
|
||
{ id: 2, active: false },
|
||
{ id: 3, active: false },
|
||
{ id: 4, active: false },
|
||
{ id: 5, active: false }
|
||
]
|
||
},
|
||
|
||
onLoad(options) {
|
||
// 设置页面标题
|
||
wx.setNavigationBarTitle({
|
||
title: '订单详情'
|
||
})
|
||
|
||
// 解析跳转参数
|
||
this.jiexiTiaozhuanCanshu(options)
|
||
},
|
||
onShow() {
|
||
// 原有代码...
|
||
|
||
// 🆕 注册通知组件
|
||
this.registerNotificationComponent();
|
||
},
|
||
|
||
// 🆕 新增:注册通知组件
|
||
registerNotificationComponent() {
|
||
const app = getApp();
|
||
const notificationComp = this.selectComponent('#global-notification');
|
||
|
||
if (notificationComp && notificationComp.showNotification) {
|
||
console.log('🏪 商城页面注册通知组件');
|
||
app.globalData.globalNotification = {
|
||
show: (data) => notificationComp.showNotification(data),
|
||
hide: () => notificationComp.hideNotification()
|
||
};
|
||
}
|
||
},
|
||
|
||
/**
|
||
* 解析跳转参数
|
||
*/
|
||
jiexiTiaozhuanCanshu(options) {
|
||
try {
|
||
const dingdanDataStr = options.dingdanData || ''
|
||
if (!dingdanDataStr) {
|
||
wx.showToast({
|
||
title: '订单数据错误',
|
||
icon: 'none'
|
||
})
|
||
setTimeout(() => {
|
||
wx.navigateBack()
|
||
}, 1500)
|
||
return
|
||
}
|
||
|
||
// 解析订单数据
|
||
const dingdanData = JSON.parse(decodeURIComponent(dingdanDataStr))
|
||
|
||
|
||
|
||
// 处理图片URL(拼接完整路径)
|
||
let tupianUrl = dingdanData.tupian || ''
|
||
if (tupianUrl && !tupianUrl.startsWith('http')) {
|
||
const ossImageUrl = app.globalData.ossImageUrl || ''
|
||
tupianUrl = ossImageUrl + tupianUrl
|
||
}
|
||
|
||
// 格式化价格
|
||
let jine = dingdanData.jine || 0
|
||
jine = parseFloat(jine)
|
||
if (isNaN(jine)) {
|
||
jine = 0
|
||
}
|
||
const formattedJine = jine.toFixed(2)
|
||
|
||
// 设置基础数据(状态先用跳转的,等后端返回后更新)
|
||
this.setData({
|
||
'jibenShuju.dingdanId': dingdanData.dingdanId || '',
|
||
'jibenShuju.tupian': tupianUrl,
|
||
'jibenShuju.jieshao': dingdanData.jieshao || '',
|
||
'jibenShuju.chuangjianshijian': dingdanData.chuangjianshijian || '',
|
||
'jibenShuju.jine': formattedJine,
|
||
'jibenShuju.nicheng': dingdanData.nicheng || '',
|
||
'jibenShuju.beizhu': dingdanData.beizhu || '',
|
||
// 这里先使用跳转的状态,等后端返回后会被覆盖
|
||
'jibenShuju.zhuangtai': dingdanData.zhuangtai || 0,
|
||
isLoading: false
|
||
})
|
||
|
||
|
||
|
||
// 加载详细数据
|
||
this.jiazaiXiangxiShuju(dingdanData.dingdanId)
|
||
|
||
} catch (error) {
|
||
console.error('解析订单数据失败:', error)
|
||
wx.showToast({
|
||
title: '数据解析失败',
|
||
icon: 'none'
|
||
})
|
||
setTimeout(() => {
|
||
wx.navigateBack()
|
||
}, 1500)
|
||
}
|
||
},
|
||
|
||
/**
|
||
* 加载详细数据
|
||
*/
|
||
async jiazaiXiangxiShuju(dingdanId) {
|
||
if (!dingdanId) return
|
||
|
||
|
||
|
||
try {
|
||
const res = await request({
|
||
url: '/dingdan/dingdanxiangqing',
|
||
method: 'POST',
|
||
data: { dingdanId: dingdanId },
|
||
header: { 'content-type': 'application/json' }
|
||
})
|
||
|
||
|
||
|
||
// 关键修正:使用正确的数据访问路径
|
||
if (res && res.data.code === 0 && res.data.data) {
|
||
const data = res.data.data
|
||
|
||
|
||
|
||
// 处理打手交付图片(拼接完整URL)
|
||
let dashoujiaofuList = data.dashoujiaofu || []
|
||
dashoujiaofuList = dashoujiaofuList.map(imgUrl => {
|
||
if (imgUrl && !imgUrl.startsWith('http')) {
|
||
const ossImageUrl = app.globalData.ossImageUrl || ''
|
||
return ossImageUrl + imgUrl
|
||
}
|
||
return imgUrl
|
||
})
|
||
|
||
// 核心修正:使用后端返回的订单状态,覆盖跳转时的状态
|
||
this.setData({
|
||
'xiangxiShuju.zhiding': data.zhiding || '',
|
||
'xiangxiShuju.dashou': data.dashou || '',
|
||
'xiangxiShuju.dashoujiaofu': dashoujiaofuList,
|
||
'xiangxiShuju.dashouliuyan': data.dashouliuyan || '',
|
||
// 关键:使用后端返回的状态覆盖跳转的状态
|
||
'jibenShuju.zhuangtai': data.zhuangtai || 0
|
||
})
|
||
|
||
|
||
|
||
} else {
|
||
console.warn('获取详细数据失败:', res?.msg || '未知错误')
|
||
wx.showToast({
|
||
title: res?.msg || '获取订单详情失败',
|
||
icon: 'none',
|
||
duration: 2000
|
||
})
|
||
}
|
||
|
||
} catch (error) {
|
||
console.error('加载详细数据失败:', error)
|
||
wx.showToast({
|
||
title: '加载数据失败,请重试',
|
||
icon: 'none',
|
||
duration: 2000
|
||
})
|
||
}
|
||
},
|
||
|
||
/**
|
||
* 复制文本到剪贴板
|
||
*/
|
||
async fuzhiWenben(e) {
|
||
const text = e.currentTarget.dataset.text
|
||
if (!text) return
|
||
|
||
|
||
|
||
try {
|
||
await wx.setClipboardData({
|
||
data: text
|
||
})
|
||
|
||
wx.showToast({
|
||
title: '复制成功',
|
||
icon: 'success',
|
||
duration: 1500
|
||
})
|
||
|
||
} catch (error) {
|
||
console.error('复制失败:', error)
|
||
wx.showToast({
|
||
title: '复制失败',
|
||
icon: 'none'
|
||
})
|
||
}
|
||
},
|
||
|
||
/**
|
||
* 预览图片
|
||
*/
|
||
yulanTupian(e) {
|
||
const currentUrl = e.currentTarget.dataset.url
|
||
const urls = e.currentTarget.dataset.urls || []
|
||
|
||
if (!currentUrl) return
|
||
|
||
wx.previewImage({
|
||
current: currentUrl,
|
||
urls: urls.length > 0 ? urls : [currentUrl]
|
||
})
|
||
},
|
||
|
||
/**
|
||
* 点击星星评分
|
||
*/
|
||
dianjiXingxing(e) {
|
||
const pingfen = e.currentTarget.dataset.index
|
||
|
||
// 更新星星状态
|
||
const xingxingData = this.data.xingxingData.map((item, index) => ({
|
||
...item,
|
||
active: index < pingfen
|
||
}))
|
||
|
||
this.setData({
|
||
xingxingData: xingxingData,
|
||
'jiesuanShuju.pingfen': pingfen
|
||
})
|
||
|
||
|
||
},
|
||
|
||
/**
|
||
* 输入留言
|
||
*/
|
||
shuruLiuyan(e) {
|
||
const liuyan = e.detail.value.slice(0, 50) // 限制50字
|
||
this.setData({
|
||
'jiesuanShuju.liuyan': liuyan
|
||
})
|
||
},
|
||
|
||
/**
|
||
* 提交结单
|
||
*/
|
||
async tijiaoJiedan() {
|
||
const { jibenShuju, jiesuanShuju } = this.data
|
||
|
||
console.log('提交结单,数据:', {
|
||
dingdanId: jibenShuju.dingdanId,
|
||
pingfen: jiesuanShuju.pingfen,
|
||
liuyan: jiesuanShuju.liuyan
|
||
})
|
||
|
||
// 验证订单状态
|
||
if (jibenShuju.zhuangtai !== 8) {
|
||
wx.showToast({
|
||
title: '订单不在结算状态',
|
||
icon: 'none'
|
||
})
|
||
return
|
||
}
|
||
|
||
// 验证评分范围
|
||
if (jiesuanShuju.pingfen < 0 || jiesuanShuju.pingfen > 5) {
|
||
wx.showToast({
|
||
title: '请选择0-5分评分',
|
||
icon: 'none'
|
||
})
|
||
return
|
||
}
|
||
|
||
// 验证订单ID
|
||
if (!jibenShuju.dingdanId) {
|
||
wx.showToast({
|
||
title: '订单信息错误',
|
||
icon: 'none'
|
||
})
|
||
return
|
||
}
|
||
|
||
// 显示加载中
|
||
this.setData({ isJiesuanLoading: true })
|
||
wx.showLoading({
|
||
title: '提交中...',
|
||
mask: true
|
||
})
|
||
|
||
try {
|
||
const res = await request({
|
||
url: '/dingdan/jiedan',
|
||
method: 'POST',
|
||
data: {
|
||
dingdanId: jibenShuju.dingdanId,
|
||
pingfen: jiesuanShuju.pingfen,
|
||
liuyan: jiesuanShuju.liuyan
|
||
},
|
||
header: { 'content-type': 'application/json' }
|
||
})
|
||
|
||
|
||
|
||
wx.hideLoading()
|
||
this.setData({ isJiesuanLoading: false })
|
||
|
||
// 使用正确的数据访问路径
|
||
if (res && res.data.code === 0) {
|
||
// 结单成功,更新订单状态
|
||
this.setData({
|
||
'jibenShuju.zhuangtai': 3, // 变为已完成状态
|
||
'jiesuanShuju.pingfen': 0,
|
||
'jiesuanShuju.liuyan': ''
|
||
})
|
||
|
||
// 重置星星
|
||
const resetXingxingData = this.data.xingxingData.map(item => ({
|
||
...item,
|
||
active: false
|
||
}))
|
||
this.setData({ xingxingData: resetXingxingData })
|
||
|
||
wx.showToast({
|
||
title: '结单成功',
|
||
icon: 'success',
|
||
duration: 2000
|
||
})
|
||
|
||
} else {
|
||
wx.showToast({
|
||
title: res?.msg || '结单失败',
|
||
icon: 'none'
|
||
})
|
||
}
|
||
|
||
} catch (error) {
|
||
console.error('结单失败:', error)
|
||
wx.hideLoading()
|
||
this.setData({ isJiesuanLoading: false })
|
||
wx.showToast({
|
||
title: '网络错误,请重试',
|
||
icon: 'none'
|
||
})
|
||
}
|
||
},
|
||
|
||
|
||
}) |