You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

455 lines
17 KiB

<template>
<uv-popup ref="popup" :round="10">
<view class="companion-popup" v-if="type == 0">
<view class="popup-header">
<text class="popup-title">是否指定之前服务过的伴宠师</text>
<view class="popup-close" @click="close">
<uni-icons type="close" size="20" color="#999"></uni-icons>
</view>
</view>
<view class="popup-content">
<view class="option-item" @click="selectOption('yes')">
<text class="option-text">是</text>
<view class="option-circle" :class="{'selected': selectedOption === 'yes'}">
<view class="option-inner" v-if="selectedOption === 'yes'"></view>
</view>
</view>
<view class="option-item" @click="selectOption('no')">
<text class="option-text">否</text>
<view class="option-circle" :class="{'selected': selectedOption === 'no'}">
<view class="option-inner" v-if="selectedOption === 'no'"></view>
</view>
</view>
</view>
</view>
<view class="companion-popup" v-else>
<view class="popup-header">
<text class="popup-title">请选择您喜欢的下单方式</text>
<view class="popup-close" @click="close">
<uni-icons type="close" size="20" color="#999"></uni-icons>
</view>
</view>
<view class="popup-content">
<view class="option-item" @click="selectOption('系统下单')">
<text class="option-text">系统下单</text>
<view class="option-circle" :class="{'selected': selectedOption === 'yes'}">
<view class="option-inner" v-if="selectedOption === 'yes'"></view>
</view>
</view>
<view class="option-item" @click="selectOption('指定伴宠师')">
<text class="option-text">指定伴宠师</text>
<view class="option-circle" :class="{'selected': selectedOption === 'no'}">
<view class="option-inner" v-if="selectedOption === 'no'"></view>
</view>
</view>
</view>
</view>
</uv-popup>
</template>
<script>
import { getOrderDetail, getTeacherDetail } from '@/api/order/order.js'
import { getAddressDetails } from '@/api/system/address.js'
import { getOpenIdKey } from '@/utils/auth'
import { mapState } from 'vuex'
import positionMixin from '@/mixins/position'
export default {
mixins: [positionMixin],
data() {
return {
selectedOption: '',
type : 0,
teacherId: null, // 技师ID(用于再来一单时传递)
orderId: null, // 订单ID(用于再来一单时传递)
originalOrderData: null, // 原始订单数据
buyInfo: {
teacher: null // 技师信息
}
}
},
computed: {
...mapState(['teacherLevelList']),
},
methods: {
// 打开弹窗
async open(teacherId = null, orderId = null) {
this.selectedOption = '';
this.type = 0;
this.teacherId = teacherId;
this.orderId = orderId;
// 如果有订单ID,加载订单数据
if (this.orderId) {
await this.loadOrderData();
}
this.$refs.popup.open('bottom');
},
// 加载订单数据
async loadOrderData() {
if (!this.orderId) return;
const params = {
openId: getOpenIdKey(),
orderId: this.orderId
};
try {
const res = await getOrderDetail(params);
if (res) {
this.originalOrderData = res;
console.log('获取订单详情成功:', res);
} else {
console.error('获取订单详情失败');
}
} catch (error) {
console.error('获取订单数据失败', error);
}
},
// 关闭弹窗
close() {
this.$refs.popup.close();
},
// async submit() {
// // 如果有订单数据,处理订单数据
// if (this.originalOrderData) {
// await this.processOrderData();
// }
// uni.navigateTo({
// url: `/pages/newOrder/serviceNew`
// });
// },
// 处理订单数据,设置定位和位置信息
async processOrderData() {
if (!this.originalOrderData) return;
uni.showLoading({
title: '加载中...',
mask: true
})
const order = this.originalOrderData;
// 设置再来一单费用
this.$globalData.newOrderData.originalOrderData = order;
this.$globalData.newOrderData.moreOrderPrice = 10;
// 验证地址是否存在并设置地址信息(包含定位)
if (order.addressId) {
try {
const addressRes = await getAddressDetails(order.addressId);
if (addressRes && addressRes.id) {
// 地址存在,设置地址信息(包含定位信息)
this.$globalData.newOrderData.currentAddress = {
id: order.addressId,
name: order.receiverName,
phone: order.receiverPhone,
province: order.receiverProvince,
city: order.receiverCity,
district: order.receiverDistrict,
detailAddress: order.receiverDetailAddress,
latitude: parseFloat(order.latitude) || 0,
longitude: parseFloat(order.longitude) || 0,
}
console.log('设置地址信息成功,包含定位:', {
latitude: order.latitude,
longitude: order.longitude
});
} else {
// 地址不存在,但仍然尝试从订单数据中获取定位信息
console.log('地址不存在,addressId:', order.addressId);
this.$globalData.newOrderData.currentAddress = {};
}
} catch (error) {
// 验证失败时也不设置地址信息,但仍然尝试设置定位
this.$globalData.newOrderData.currentAddress = {};
}
} else {
// 没有地址ID,但仍然尝试从订单数据中获取定位信息
this.$globalData.newOrderData.currentAddress = {};
}
// 处理技师信息
// if (order.teacherId) {
// try {
// const teacherRes = await getTeacherDetail({
// userId: order.teacherId
// });
// if (teacherRes) {
// let companionInfo = teacherRes;
// // 计算距离(需要当前位置信息)
// if (teacherRes.appletAddresseList && this.$globalData.newOrderData.latitude && this.$globalData.newOrderData.longitude) {
// companionInfo.distanceText = this.calculateDistanceAddress(teacherRes.appletAddresseList);
// }
// this.buyInfo.teacher = companionInfo;
// // 将技师信息也设置到全局数据中
// this.$globalData.newOrderData.selectedTeacher = companionInfo;
// console.log('设置技师信息成功:', companionInfo);
// }
// } catch (error) {
// console.error('获取技师详情失败:', error);
// }
// }
// 处理伴宠师等级
if (order.companionLevel) {
this.$globalData.newOrderData.companionLevel =
this.teacherLevelList.find(item => item.paramValueNum == order.companionLevel);
}
// 处理提前熟悉相关数据
if (order.needPreFamiliarize) {
this.$globalData.newOrderData.needPreFamiliarize = ['是否提前熟悉'];
}
// 组装宠物数据
if (order.petVOList && order.petVOList.length > 0) {
this.$globalData.newOrderData.currentPets = order.petVOList.map(pet => {
// 获取该宠物的服务日期
const petServices = order.orderServiceList.filter(service => service.petId === pet.id);
const selectedDate = petServices.map(service => ({
date: service.serviceDate,
info: "预定"
}));
return {
...pet,
checked: ['checked'], // 默认选中
selectedDate,
};
});
}
uni.hideLoading();
},
// 选择选项
async selectOption(option) {
this.selectedOption = option;
if(this.type == 1){
if (option === '系统下单') {
// 如果有订单数据,处理订单数据
if (this.originalOrderData) {
await this.processOrderData();
}
this.close();
setTimeout(() => {
uni.navigateTo({
url: '/pages/newOrder/serviceNew'
});
}, 300);
} else if (option === '指定伴宠师') {
// 如果有订单数据,处理订单数据
if (this.originalOrderData) {
await this.processOrderData();
}
let locationInfo = this.$globalData.newOrderData.currentAddress;
if(!locationInfo ||
!locationInfo.latitude ||
!locationInfo.longitude
){
this.selectLocation();
return
}
let address = locationInfo.province + locationInfo.city + locationInfo.district + locationInfo.detailAddress;
// 构建位置信息对象
const allInfo = {
isCheckLocation: true,
locationName: address,
locationLongitude: locationInfo.longitude,
locationLatitude: locationInfo.latitude,
locationAddress: address,
selectedDate: [],
isCheckTime: false,
selectedDateShowText: '',
};
this.$store.commit('setPosition', {
address: address,
longitude: locationInfo.longitude,
latitude: locationInfo.latitude,
date : [],
})
this.close();
setTimeout(() => {
uni.navigateTo({
url: '/pages_order/companionPetList/companionPetList?info=' + encodeURIComponent(JSON.stringify(allInfo))
});
}, 300);
}
return
}
// 如果选择"是",跳转到伴宠师选择页面
if (option === 'yes') {
this.close();
setTimeout(async () => {
// 如果有订单数据,先处理订单数据并设置定位信息
if (this.originalOrderData) {
await this.processOrderData();
}
let url = '/pages_order/order/companionSelect';
let params = [];
// 如果有技师ID,添加到URL参数中
if (this.teacherId) {
params.push(`teacherId=${this.teacherId}`);
}
// 如果有订单ID,添加到URL参数中
if (this.orderId) {
params.push(`orderId=${this.orderId}`);
}
if (params.length > 0) {
url += `?${params.join('&')}`;
}
uni.navigateTo({
url: url
});
}, 300);
} else if (option === 'no') {
this.type = 1;
this.selectedOption = '';
}
},
// 选择定位
selectLocation() {
wx.chooseLocation({
type: 'gcj02',
success: (res) => {
console.log('选择的位置:', res);
// 构建位置信息对象
const allInfo = {
isCheckLocation: true,
locationName: res.address,
locationLongitude: res.longitude,
locationLatitude: res.latitude,
locationAddress: res.address,
selectedDate: [],
isCheckTime: false,
selectedDateShowText: '',
};
this.$store.commit('setPosition', {
address: res.address,
longitude: res.longitude,
latitude: res.latitude,
date : [],
})
// 跳转到伴宠师列表页面,传递位置信息
uni.navigateTo({
url: `/pages_order/companionPetList/companionPetList?info=` + encodeURIComponent(JSON.stringify(allInfo))
})
},
fail: (err) => {
console.error('选择位置失败:', err);
uni.showToast({
title: '选择位置失败,请重试',
icon: 'none',
duration: 2000
})
}
});
},
}
}
</script>
<style lang="scss" scoped>
.companion-popup {
position: relative;
background-color: #FFFFFF;
border-radius: 20rpx;
.popup-header {
display: flex;
align-items: center;
justify-content: center;
padding: 30rpx 20rpx;
position: relative;
.popup-title {
font-size: 32rpx;
font-weight: bold;
color: #333;
text-align: center;
}
.popup-close {
position: absolute;
right: 20rpx;
top: 30rpx;
}
}
.popup-content {
padding: 20rpx 30rpx 50rpx;
.option-item {
display: flex;
align-items: center;
justify-content: space-between;
height: 100rpx;
border-radius: 10rpx;
background-color: #F8F8F8;
margin-bottom: 20rpx;
padding: 0 30rpx;
// &:first-child {
// background-color: #FFF9E6;
// .option-text {
// color: #FFAA48;
// }
// }
&:last-child {
margin-bottom: 0;
}
.option-text {
font-size: 28rpx;
color: #333;
}
.option-circle {
width: 36rpx;
height: 36rpx;
border-radius: 50%;
border: 2rpx solid #DDDDDD;
display: flex;
align-items: center;
justify-content: center;
&.selected {
border-color: #FFAA48;
}
.option-inner {
width: 24rpx;
height: 24rpx;
border-radius: 50%;
background-color: #FFAA48;
}
}
}
}
}
</style>