Files
a_long/miniprogram/pages/dingdanxiangqing/dingdanxiangqing.js
2026-06-27 01:26:11 +08:00

412 lines
10 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 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'
})
}
},
})