| | |
| | | </view> |
| | | |
| | | <view class="order-detail-page__summary-right"> |
| | | <text class="order-detail-page__price">¥{{ orderDetail.platformRewardAmount ? (orderDetail.driverFee + orderDetail.platformRewardAmount) / 100 : (orderDetail.driverFee / 100).toFixed(2) }}</text> |
| | | <text class="order-detail-page__price">¥{{ orderDetail.platformRewardAmount ? ((orderDetail.driverFee + orderDetail.platformRewardAmount) / 100).toFixed(2) : (orderDetail.driverFee / 100).toFixed(2) }}</text> |
| | | <text v-if="orderDetail.platformRewardAmount" class="order-detail-page__extra">含加急¥{{ (orderDetail.platformRewardAmount / 100).toFixed(2) }}</text> |
| | | </view> |
| | | </view> |
| | |
| | | </view> |
| | | <view class="order-detail-page__done-summary-right"> |
| | | <view class="order-detail-page__done-price-row"> |
| | | <text class="order-detail-page__price">¥{{ (orderDetail.driverFee / 100).toFixed(1) }}</text> |
| | | <text class="order-detail-page__price">¥{{ (orderDetail.driverFee / 100).toFixed(2) }}</text> |
| | | </view> |
| | | <text v-if="orderDetail.isUrgent === 1" class="order-detail-page__extra">含加急¥{{ orderDetail.urgentAmount / 100 }}</text> |
| | | <text v-if="orderDetail.isUrgent === 1" class="order-detail-page__extra">含加急¥{{ (orderDetail.urgentAmount / 100).toFixed(2) }}</text> |
| | | </view> |
| | | </view> |
| | | |
| | |
| | | <image class="order-detail-page__qrcode-image" :src="'https://api.qrserver.com/v1/create-qr-code/?size=200x200&data=' + orderDetail.driverVerifyCode" mode="aspectFit"></image> |
| | | </view> |
| | | <text class="order-detail-page__qrcode-value">{{ orderDetail.driverVerifyCode }}</text> |
| | | <text class="order-detail-page__qrcode-label">取货码</text> |
| | | <text class="order-detail-page__qrcode-label">{{ orderDetail.status === 3 ? '取货码' : '存件码' }}</text> |
| | | </view> |
| | | </view> |
| | | |
| | |
| | | </template> |
| | | |
| | | <script> |
| | | import image from 'uview-ui/libs/config/props/image'; |
| | | import { mapState } from 'vuex' |
| | | |
| | | export default { |
| | | data() { |
| | |
| | | showGrabModal: false, |
| | | currentLocation: null, |
| | | routePoints: [], |
| | | locationTimer: null, |
| | | distance: 0, |
| | | duration: 0, |
| | | isWithinOperationRadius: true, |
| | | statusTextMap: { |
| | | 2: '待接单', |
| | | 3: '待取货', |
| | |
| | | } |
| | | }, |
| | | computed: { |
| | | ...mapState(['userInfo']), |
| | | formattedRemainTime() { |
| | | const minutes = this.orderDetail.remainMinutes |
| | | if (!minutes) return null |
| | |
| | | return this.orderDetail.status === 3 || this.orderDetail.status === 4 |
| | | }, |
| | | mapData() { |
| | | const startPoint = this.currentLocation || { latitude: 31.829512, longitude: 117.239211 } |
| | | const startPoint = this.currentLocation || { latitude: this.orderDetail.navigateLat, longitude: this.orderDetail.navigateLng } |
| | | const hasEndPoint = this.orderDetail.navigateLat && this.orderDetail.navigateLng |
| | | const endPoint = hasEndPoint |
| | | ? { latitude: this.orderDetail.navigateLng, longitude: this.orderDetail.navigateLat } |
| | | : { latitude: 31.841268, longitude: 117.278695 } |
| | | const endPoint = { latitude: this.orderDetail.navigateLng, longitude: this.orderDetail.navigateLat } |
| | | |
| | | let center |
| | | let scale = 12 |
| | |
| | | } else if (this.currentLocation) { |
| | | center = this.currentLocation |
| | | } else { |
| | | center = { latitude: 31.83539, longitude: 117.258953 } |
| | | center = { latitude: this.orderDetail.navigateLat, longitude: this.orderDetail.navigateLng } |
| | | } |
| | | |
| | | const markers = [ |
| | |
| | | |
| | | const routePoints = this.routePoints.length > 0 ? this.routePoints : [ |
| | | startPoint, |
| | | { latitude: 31.831624, longitude: 117.247836 }, |
| | | { latitude: 31.834918, longitude: 117.255467 }, |
| | | { latitude: 31.838214, longitude: 117.265358 }, |
| | | { latitude: 31.840126, longitude: 117.272481 }, |
| | | endPoint |
| | | ] |
| | | |
| | |
| | | this.getOrderDetail() |
| | | } |
| | | }, |
| | | |
| | | onUnload() { |
| | | if (this.locationTimer) { |
| | | clearInterval(this.locationTimer) |
| | | this.locationTimer = null |
| | | } |
| | | }, |
| | | |
| | | methods: { |
| | | handleBack() { |
| | | uni.navigateBack({ delta: 1 }); |
| | | }, |
| | | initOperationRadius() { |
| | | console.log('initOperationRadius') |
| | | return new Promise((resolve) => { |
| | | uni.getLocation({ |
| | | type: 'gcj02', |
| | | success: (res) => { |
| | | this.$u.api.checkDriverOperationRadius({ |
| | | lat: res.latitude, |
| | | lng: res.longitude, |
| | | orderId: this.orderId |
| | | }).then(res => { |
| | | if (res.code === 200) { |
| | | this.isWithinOperationRadius = res.data |
| | | console.log(res.data) |
| | | if (!this.isWithinOperationRadius) { |
| | | uni.showToast({ |
| | | title: '您当前位置与收货地址距离超出范围,请在地址附近重新拍照', |
| | | icon: 'none' |
| | | }) |
| | | resolve(false) |
| | | } else { |
| | | resolve(true) |
| | | } |
| | | } else { |
| | | resolve(false) |
| | | } |
| | | }).catch(() => { |
| | | resolve(false) |
| | | }) |
| | | }, |
| | | fail: () => { |
| | | this.isWithinOperationRadius = false |
| | | uni.showToast({ |
| | | title: '您当前位置权限没有开启,请先开启后再来操作', |
| | | icon: 'none' |
| | | }) |
| | | resolve(false) |
| | | } |
| | | }) |
| | | }) |
| | | }, |
| | | |
| | | getOrderDetail() { |
| | | this.$u.api.orderDetail({ orderId: this.orderId }).then(res => { |
| | | if (res.code === 200) { |
| | |
| | | }, |
| | | |
| | | getCurrentLocation() { |
| | | this.fetchLocation() |
| | | this.locationTimer = setInterval(() => { |
| | | this.fetchLocation() |
| | | }, 60000) |
| | | }, |
| | | |
| | | fetchLocation() { |
| | | uni.getLocation({ |
| | | type: 'gcj02', |
| | | success: (res) => { |
| | |
| | | } |
| | | const from = `${this.currentLocation.latitude},${this.currentLocation.longitude}` |
| | | const to = `${this.orderDetail.navigateLng},${this.orderDetail.navigateLat}` |
| | | console.log('driverType', this.userInfo.driverType) |
| | | this.$u.api.directionInfo({ |
| | | from, |
| | | to, |
| | | mode: 'driving' |
| | | mode: this.userInfo.driverType |
| | | }).then(res => { |
| | | console.log('directionInfo success:', res) |
| | | if (res && res.paths && res.paths.length > 0) { |
| | | const path = res.paths[0] |
| | | console.log('paths success:', res.data.route.paths[0]) |
| | | if (res.code === 200) { |
| | | const path = res.data.route.paths[0] |
| | | this.distance = path.distance |
| | | this.duration = path.duration |
| | | const points = [] |
| | |
| | | }) |
| | | this.routePoints = points |
| | | this.$forceUpdate() |
| | | } else { |
| | | console.log('No route data returned:', res) |
| | | } |
| | | }).catch(err => { |
| | | console.log('路径规划失败', err) |
| | | }) |
| | | }, |
| | | |
| | |
| | | } |
| | | |
| | | if (action === 'pickup' || action === 'deliver') { |
| | | this.uploadedPhotos = [] |
| | | this.photoRemark = '' |
| | | this.photoPopupMode = action |
| | | this.showPhotoPopup = true |
| | | this.initOperationRadius().then((isValid) => { |
| | | console.log(isValid) |
| | | if (!isValid) return |
| | | this.uploadedPhotos = [] |
| | | this.photoRemark = '' |
| | | this.photoPopupMode = action |
| | | this.showPhotoPopup = true |
| | | }) |
| | | return |
| | | } |
| | | |
| | |
| | | if (res.code === 200) { |
| | | uni.showToast({ title: '接单成功', icon: 'success' }) |
| | | this.getOrderDetail() |
| | | uni.$emit('jiedanSuccess') |
| | | setTimeout(() => { |
| | | uni.navigateBack() |
| | | }, 1500) |
| | |
| | | return |
| | | } |
| | | uni.showLoading({ title: '上传中...' }) |
| | | uni.getLocation({ |
| | | type: 'gcj02', |
| | | success: (locationRes) => { |
| | | this.doUploadPhotos(locationRes.latitude, locationRes.longitude) |
| | | }, |
| | | fail: () => { |
| | | this.doUploadPhotos(null, null) |
| | | } |
| | | }) |
| | | }, |
| | | |
| | | doUploadPhotos(latitude, longitude) { |
| | | const uploadTasks = this.uploadedPhotos.map(path => { |
| | | return new Promise((resolve, reject) => { |
| | | const formData = { folder: 'orders' } |
| | | if (latitude && longitude) { |
| | | formData.latitude = latitude |
| | | formData.longitude = longitude |
| | | } |
| | | console.log('formData:', formData) |
| | | uni.uploadFile({ |
| | | url: this.$baseUrl + 'web/public/upload', |
| | | filePath: path, |
| | | name: 'file', |
| | | formData: { |
| | | folder: 'order' |
| | | }, |
| | | formData: formData, |
| | | success: (uploadRes) => { |
| | | const data = JSON.parse(uploadRes.data) |
| | | if (data.code === 200) { |
| | |
| | | orderId: this.orderId, |
| | | remark: this.photoRemark |
| | | } |
| | | if (latitude && longitude) { |
| | | params.latitude = latitude |
| | | params.longitude = longitude |
| | | } |
| | | return this.$u.api[api](params) |
| | | }).then(res => { |
| | | uni.hideLoading() |