Files
xingque/pages/order-detail/order-detail.js

312 lines
11 KiB
JavaScript
Raw 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.
const app = getApp()
import request from '../../utils/request.js'
import connectionManager from '../../utils/xiaoxilj.js'
Page({
data: {
isLoading: true,
jibenShuju: {
dingdanId: '',
tupian: '',
jieshao: '',
chuangjianshijian: '',
jine: '0.00',
nicheng: '',
beizhu: '',
zhuangtai: 0,
updateTime: ''
},
xiangxiShuju: {
dashou: '',
dashouNicheng: '',
dashouTouxiang: '',
dashoujiaofu: [],
dashouliuyan: '',
jiedanTime: '',
tijiaoTime: '',
laobanPingjia: '',
shangxianSudu: null,
fuwuTaidu: null,
fancheCishu: null
},
zhuangtaiWenziMap: {
1: '已下单', 2: '进行中', 3: '已完成', 4: '退款中',
5: '已退款', 6: '退款失败', 7: '指定中', 8: '结算中'
},
jiesuan: {
fancheCishu: '',
speedValue: 0,
attitudeValue: 0,
liuyan: ''
},
// 🔥 实时解释文字(必须在 data 中声明,才能用于 wxml 绑定)
speedExplain: '',
attitudeExplain: '',
speedOptions: [
{ value: 5, label: '极速', explain: '接单后秒上线2分钟以内' },
{ value: 4, label: '快', explain: '接单后5分钟以内上线' },
{ value: 3, label: '一般', explain: '接单后10分钟以内上线' },
{ value: 2, label: '慢', explain: '接单后15分钟以内上线' },
{ value: 1, label: '极慢', explain: '接单后15分钟以后上线' }
],
attitudeOptions: [
{ value: 5, label: '极好', explain: '主动聊天哄开心,情绪价值拉满,处处护着老板' },
{ value: 4, label: '好', explain: '主动互动,保护老板,说话语气温和' },
{ value: 3, label: '一般', explain: '正常保护与聊天,以任务为主,情绪价值一般' },
{ value: 2, label: '较差', explain: '交互少,很少说话,纯应付订单,偶尔埋怨' },
{ value: 1, label: '极差', explain: '全程无交流或骂老板,体验极差,很愤怒' }
],
showSpeedModal: false,
showAttitudeModal: false,
showConfirm: false,
countdown: 3,
countdownTimer: null,
showMyEvaluation: false
},
onLoad(options) {
wx.setNavigationBarTitle({ title: '订单详情' })
this.parseParams(options)
},
parseParams(options) {
try {
const dingdanDataStr = options.dingdanData || ''
if (!dingdanDataStr) {
wx.showToast({ title: '参数错误', icon: 'none' })
setTimeout(() => wx.navigateBack(), 1500)
return
}
const data = JSON.parse(decodeURIComponent(dingdanDataStr))
const ossImageUrl = app.globalData.ossImageUrl || ''
let tupianUrl = data.tupian || ''
if (tupianUrl && !tupianUrl.startsWith('http')) {
tupianUrl = ossImageUrl + tupianUrl
}
if (!tupianUrl) {
tupianUrl = ossImageUrl + (app.globalData.morentouxiang || '/images/default-avatar.png')
}
const jine = parseFloat(data.jine || 0).toFixed(2)
this.setData({
'jibenShuju.dingdanId': data.dingdanId || '',
'jibenShuju.tupian': tupianUrl,
'jibenShuju.jieshao': data.jieshao || '',
'jibenShuju.chuangjianshijian': data.chuangjianshijian || '',
'jibenShuju.jine': jine,
'jibenShuju.nicheng': data.nicheng || '',
'jibenShuju.beizhu': data.beizhu || '',
'jibenShuju.zhuangtai': data.zhuangtai || 0,
isLoading: false
})
this.loadDetail(data.dingdanId)
} catch (e) {
console.error('参数解析失败', e)
wx.showToast({ title: '数据解析错误', icon: 'none' })
}
},
async loadDetail(dingdanId) {
try {
const res = await request({
url: '/dingdan/dingdanxiangqing2',
method: 'POST',
data: { dingdanId }
})
if (res && res.data.code === 0 && res.data.data) {
const d = res.data.data
const oss = app.globalData.ossImageUrl || ''
let dashouTouxiang = d.dashou_touxiang || ''
if (dashouTouxiang && !dashouTouxiang.startsWith('http')) {
dashouTouxiang = oss + dashouTouxiang
}
if (!dashouTouxiang) {
dashouTouxiang = oss + (app.globalData.morentouxiang || '/images/default-avatar.png')
}
const jiaofuList = (d.dashoujiaofu || []).map(url => {
if (url && !url.startsWith('http')) return oss + url
return url
})
const shangxian = d.shangxian_sudu
const taidu = d.fuwu_taidu
const fanche = d.fanche_cishu
const showEval = (shangxian !== null && shangxian !== undefined) ||
(taidu !== null && taidu !== undefined) ||
(fanche !== null && fanche !== undefined)
this.setData({
'jibenShuju.zhuangtai': d.zhuangtai || 0,
'jibenShuju.updateTime': d.update_time || '',
'xiangxiShuju.dashou': d.dashou || '',
'xiangxiShuju.dashouNicheng': d.dashou_nicheng || '',
'xiangxiShuju.dashouTouxiang': dashouTouxiang,
'xiangxiShuju.dashoujiaofu': jiaofuList,
'xiangxiShuju.dashouliuyan': d.dashouliuyan || '',
'xiangxiShuju.jiedanTime': d.jiedan_time || '',
'xiangxiShuju.tijiaoTime': d.tijiao_time || '',
'xiangxiShuju.laobanPingjia': d.laoban_pingjia || '',
'xiangxiShuju.shangxianSudu': shangxian,
'xiangxiShuju.fuwuTaidu': taidu,
'xiangxiShuju.fancheCishu': fanche,
showMyEvaluation: showEval && [3,4,5,6].includes(d.zhuangtai)
})
this.computeEvaluationText()
} else {
wx.showToast({ title: '获取详情失败', icon: 'none' })
}
} catch (e) {
console.error('加载详情失败', e)
wx.showToast({ title: '网络错误', icon: 'none' })
}
},
// 计算历史评价的文字
computeEvaluationText() {
const { speedOptions, attitudeOptions, xiangxiShuju } = this.data
let speedText = '未评价'
let attitudeText = '未评价'
if (xiangxiShuju.shangxianSudu != null) {
const sItem = speedOptions.find(v => v.value == xiangxiShuju.shangxianSudu)
speedText = sItem ? sItem.label + ' (' + sItem.explain + ')' : ''
}
if (xiangxiShuju.fuwuTaidu != null) {
const aItem = attitudeOptions.find(v => v.value == xiangxiShuju.fuwuTaidu)
attitudeText = aItem ? aItem.label + ' (' + aItem.explain + ')' : ''
}
this.setData({ speedText, attitudeText })
},
onGoodsImgError() {
const fallback = app.globalData.ossImageUrl + (app.globalData.morentouxiang || '/images/default-avatar.png')
this.setData({ 'jibenShuju.tupian': fallback })
},
copyText(e) {
const text = e.currentTarget.dataset.text
if (text) {
wx.setClipboardData({ data: text, success: () => wx.showToast({ title: '已复制', icon: 'none' }) })
}
},
previewImages(e) {
const current = e.currentTarget.dataset.url
const urls = e.currentTarget.dataset.urls || [current]
wx.previewImage({ current, urls })
},
// 联系打手(防止角色被篡改)
contactDashou() {
const uid = wx.getStorageSync('uid')
if (!uid) {
wx.showToast({ title: '用户信息缺失', icon: 'none' })
return
}
const dingdanId = this.data.jibenShuju.dingdanId
// 备份全局角色
const savedRole = app.globalData.currentRole
const savedXshenfen = app.globalData.xshenfen
connectionManager.connectToGroupChat({
identityType: 'normal',
userId: 'Boss' + uid,
orderId: dingdanId,
partnerUid: this.data.xiangxiShuju.dashou || '',
fadanPingtai: this.data.jibenShuju.fadanpingtai || 0,
groupName: this.data.jibenShuju.nicheng + '的订单群',
isCross: 0
}).catch(err => {
console.error('跳转群聊失败', err)
wx.showToast({ title: '跳转聊天失败,请检查网络', icon: 'none' })
})
// 立即恢复角色
app.globalData.currentRole = savedRole
app.globalData.xshenfen = savedXshenfen
wx.setStorageSync('currentRole', savedRole)
},
// 结算相关
onFancheshuInput(e) { this.setData({ 'jiesuan.fancheCishu': e.detail.value }) },
selectSpeed(e) {
const value = parseInt(e.currentTarget.dataset.value)
const explain = this.data.speedOptions.find(v => v.value === value)?.explain || ''
this.setData({
'jiesuan.speedValue': value,
speedExplain: explain // 更新解释文字
})
},
selectAttitude(e) {
const value = parseInt(e.currentTarget.dataset.value)
const explain = this.data.attitudeOptions.find(v => v.value === value)?.explain || ''
this.setData({
'jiesuan.attitudeValue': value,
attitudeExplain: explain
})
},
onLiuyanInput(e) { this.setData({ 'jiesuan.liuyan': e.detail.value.slice(0, 50) }) },
showSpeedStandard() { this.setData({ showSpeedModal: true }) },
hideSpeedModal() { this.setData({ showSpeedModal: false }) },
showAttitudeStandard() { this.setData({ showAttitudeModal: true }) },
hideAttitudeModal() { this.setData({ showAttitudeModal: false }) },
noop() {},
showSettleConfirm() {
const { fancheCishu } = this.data.jiesuan
if (!fancheCishu || isNaN(parseInt(fancheCishu))) {
wx.showToast({ title: '请填写翻车次数', icon: 'none' })
return
}
if (!this.data.jiesuan.speedValue || !this.data.jiesuan.attitudeValue) {
wx.showToast({ title: '请选择上线速度和服务态度', icon: 'none' })
return
}
this.setData({ showConfirm: true, countdown: 3 })
this.countdownTimer = setInterval(() => {
const next = this.data.countdown - 1
if (next <= 0) {
clearInterval(this.countdownTimer)
this.setData({ countdown: 0 })
} else {
this.setData({ countdown: next })
}
}, 1000)
},
cancelConfirm() {
clearInterval(this.countdownTimer)
this.setData({ showConfirm: false, countdown: 3 })
},
async confirmSettle() {
if (this.data.countdown !== 0) return
clearInterval(this.countdownTimer)
this.setData({ showConfirm: false, countdown: 3 })
wx.showLoading({ title: '结算中' })
const { jiesuan, jibenShuju } = this.data
try {
const res = await request({
url: '/dingdan/jiedan2',
method: 'POST',
data: {
dingdanId: jibenShuju.dingdanId,
fanche_cishu: parseInt(jiesuan.fancheCishu),
shangxian_sudu: jiesuan.speedValue,
fuwu_taidu: jiesuan.attitudeValue,
liuyan: jiesuan.liuyan
}
})
wx.hideLoading()
if (res && res.data.code === 0) {
wx.showToast({ title: '结算成功' })
setTimeout(() => wx.navigateBack(), 1000)
} else {
wx.showToast({ title: res?.data?.msg || '结算失败', icon: 'none' })
}
} catch (e) {
wx.hideLoading()
wx.showToast({ title: '网络错误', icon: 'none' })
}
}
})