<template> <view class="page" v-if="loading"> <u-navbar title="订单详情" :border-bottom="false" :background="bgc" title-color='#2E4975' title-size='36' height='36'></u-navbar> <map class="map" id="map" ref="map" :scale="zoomSize" :latitude="latitude" :longitude="longitude" :show-location='true' :markers="markers" :polygons="polygons" :polyline="polyline"> </map> <view class="info_card"> <view class="info_tit"> 基本信息 </view> <view class="lines"></view> <view class="cont"> <view class="info_li"> 订单编号:<span>{{orderInfo.orderNo}}</span> </view> <view class="info_li"> 租赁用户:<span style="color:#4C97E7 ;">{{orderInfo.phonenumber}}</span> </view> <view class="info_li"> <view class="half_infoli"> 租赁时长:<span>{{orderInfo.duration/60}}分钟</span> </view> <view class="half_infoli"> 行驶距离:<span>{{orderInfo.distance/1000}}Km</span> </view> </view> <view class="info_li"> 订单状态:<span>{{status()}}</span> </view> </view> </view> <view class="info_card" style="margin-top: 20rpx;"> <view class="info_tit"> 设备信息 </view> <view class="lines"></view> <view class="cont"> <view class="info_li"> <view class="half_infoli"> 车牌号:<span>{{orderInfo.device.vehicleNum}}</span> </view> <view class="half_infoli"> SN:<span>{{orderInfo.device.sn}}</span> </view> </view> <view class="info_li"> <!-- <view class="half_infoli"> 车辆编号:<span>{{orderInfo.device.areaName}}</span> </view> --> <view class="half_infoli"> 运营区域:<span>{{orderInfo.area}}</span> </view> </view> </view> </view> <view class="info_card" style="margin-top: 20rpx;"> <view class="info_tit"> 行程记录 </view> <view class="lines"></view> <view class="cont"> <view v-for="(item,index) in orderInfo.tripLogs" :key="index"> <view class="info_lis" v-if="item.type==1"> 开锁时间:<view class="text">{{item.createTime}}</view> </view> <view class="info_lis" v-if="item.type==1"> 开锁地点:<view class="text"> {{item.address}}</view> </view> <view class="info_lis" v-if="item.type==2"> 临时锁车时间:<view class="text">{{item.createTime}}</view> </view> <view class="info_lis" v-if="item.type==2"> 临时锁车地点:<view class="text">{{item.address}}</view> </view> <view class="info_lis" v-if="item.type==3"> 解除时间:<view class="text">{{item.createTime}}</view> </view> <view class="info_lis" v-if="item.type==4"> 关锁时间:<view class="text">{{item.createTime}}</view> </view> <view class="info_lis" v-if="item.type==4"> 关锁地点:<view class="text">{{item.address}}</view> </view> </view> <!-- <view class="info_li"> 锁车时间:<span>120.56189,27.12379</span> </view> <view class="info_li"> 锁车地点:<span>120.56189,27.12379</span> </view> --> <!-- <view class="info_li"> 解除时间:<span>120.56189,27.12379</span> </view> --> </view> </view> <view class="info_card" style="margin-top: 20rpx;"> <view class="info_tit"> 费用明细 <view class="money" > 结算总费用:¥{{orderInfo.settlementFee}} </view> </view> <view class="lines"></view> <view class="cont"> <view class="info_li"> <view class="half_infoli"> 预约费用:<span>{{orderInfo.appointmentFee}}</span> </view> <view class="half_infoli"> 调度费用:<span>{{orderInfo.dispatchFee}}</span> </view> </view> <view class="info_li"> <view class="half_infoli"> 管理费用:<span>{{orderInfo.manageFee}}</span> </view> <view class="half_infoli"> 骑行费用:<span>{{orderInfo.ridingFee}}</span> </view> </view> <view class="info_li"> 实收:<span>{{orderInfo.totalFee}}</span> </view> <view class="info_li"> 支付方式:<span>微信支付</span> </view> <view class="info_li" v-if="orderInfo.rule"> 计费模板:<span>{{orderInfo.rule.name}}</span> </view> <view class="info_li" v-if="orderInfo.payTime"> 支付时间:<span>{{orderInfo.payTime}}</span> </view> </view> <view class="lines"></view> <view class="cont" v-if="orderInfo.etRefund"> <view class="info_li"> <view class="half_infoli"> 预约费退款:<span>{{orderInfo.etRefund.appointmentFee}}</span> </view> <view class="half_infoli"> 调度费退款:<span>{{orderInfo.etRefund.dispatchFee}}</span> </view> </view> <view class="info_li"> <view class="half_infoli"> 骑行费退款:<span>{{orderInfo.etRefund.ridingFee}}</span> </view> <view class="half_infoli"> 管理费退款:<span>{{orderInfo.etRefund.manageFee}}</span> </view> </view> <view class="info_li"> 退款原因:<span>{{orderInfo.etRefund.reason}}</span> </view> <view class="info_li"> 退款时间:<span>{{orderInfo.etRefund.createTime}}</span> </view> </view> </view> <view class="bot"> <view class="btn"> 退款 </view> </view> </view> </template> <script> export default { data() { return { bgc: { backgroundColor: "#F7FAFE", }, latitude: 0, longitude: 0, isMap: false, zoomSize: 15, markers: [], polyline: [{ points: [], width:8, arrowLine:true, color:'#00AF99' // strokeWidth: 2, // strokeColor: '#00AF99', // fillColor: '#00AF99' }, ], polygons: [], cardId: '001区域', orderId:'', orderInfo:{}, loading:false, } }, onLoad(e) { this.orderId=e.id this.getOrderDetail() this.getArea() this.getParking() }, components:{ }, methods: { convertBoundaryToPolyline(boundary) { if (!boundary) return null; const points = JSON.parse(boundary).map(coord => ({ latitude: coord[1], longitude: coord[0] })); const polyline = { points: points, fillColor: "#55888840", //填充颜色 strokeColor: "#22FF00", //描边颜色 strokeWidth: 2, //描边宽度 zIndex: 1, //层级 }; return polyline; }, convertBoundaryToPolyliness(boundary) { if (!boundary) return null; const points = JSON.parse(boundary).map(coord => ({ latitude: coord[1], longitude: coord[0] })); const polyline = { points: points, width:8, arrowLine:true, color:'#00AF99' }; return polyline; }, convertBoundaryToPolylines(boundaries) { return boundaries.map(boundary => { if (!boundary) return null; let coords; try { coords = JSON.parse(boundary); } catch (error) { console.error("Error parsing boundary JSON:", error); return null; } if (!Array.isArray(coords)) { console.error("Parsed boundary is not an array:", coords); return null; } const points = coords.map(coord => ({ latitude: coord[1], longitude: coord[0] })); return { points: points, fillColor: "#55888840", //填充颜色 strokeColor: "#558888", //描边颜色 strokeWidth: 2, //描边宽度 zIndex: 1, //层级 }; }).filter(polyline => polyline !== null); // 过滤掉无效的折线数据 }, getParking() { // 发送请求获取数据 this.$u.get('/app/parking/list').then((res) => { if (res.code === 200) { // 处理接口返回的数据 const validBoundaries = res.rows.map(row => row.boundaryStr).filter(boundary => typeof boundary === 'string' && boundary.trim() !== ''); const polylines = this.convertBoundaryToPolylines(validBoundaries); // 将处理后的数据添加到 this.polyline 中 this.polygons = this.polygons.concat(polylines); // console.log(this.polyline); res.rows.forEach(item => { this.markers.push({ id: parseFloat(item.parkingId), latitude: parseFloat(item.latitude), longitude: parseFloat(item.longitude), // title: item.deviceName, width: 20, height: 40, iconPath: 'https://lxnapi.ccttiot.com/bike/img/static/u9yz0bKCWKyev0JYpTne', callout: { content: item.parkingName, // 修改为你想要显示的文字内容 color: '#ffffff', // 修改为文字颜色 fontSize: 14, // 修改为文字大小 borderRadius: 10, // 修改为气泡圆角大小 bgColor: '#000000', // 修改为气泡背景颜色 padding: 6, // 修改为气泡内边距 display: 'ALWAYS', // 修改为气泡的显示策略 } }) }) } }).catch(error => { console.error("Error fetching parking data:", error); }); }, getArea() { // 发送请求获取数据 this.$u.get('/app/area/list').then((res) => { if (res.code === 200) { // 处理接口返回的数据,将边界数据转换为地图组件需要的折线结构 const polylines = res.rows .filter(area => area.boundaryStr) // 过滤掉boundary为空的数据 .map(area => this.convertBoundaryToPolyline(area.boundaryStr)); // 更新折线数据 this.polygons = polylines; // console.log(this.polyline); } }).catch(error => { console.error("Error fetching area data:", error); }); }, status(){ if(this.orderInfo!=''){ if(this.orderInfo.status==0){ return '预约中' }else if(this.orderInfo.status==1){ return '取消预约' }else if(this.orderInfo.status==2){ return '开始骑行' }else if(this.orderInfo.status==3){ return '骑行结束' }else if(this.orderInfo.status==4){ return '订单完成' } } }, getOrderDetail(){ this.$u.get('/appVerify/order/'+this.orderId).then((res) => { if (res.code === 200) { // 处理接口返回的数据,将边界数据转换为地图组件需要的折线结构 this.orderInfo=res.data this.loading=true this.latitude= parseFloat(this.orderInfo.latitude) this.longitude= parseFloat(this.orderInfo.longitude ) this.polyline[0].points = JSON.parse(res.data.tripRouteStr).map(coord => ({ latitude: coord[1], longitude: coord[0] })); } // console.log(points,''); // this.polyline[0].points=points }).catch(error => { console.error("Error fetching area data:", error); }); } } } </script> <style lang="scss"> page { overflow-x: hidden; background-color: #F3F3F3; } .page { padding-bottom: 200rpx; width: 750rpx; .map { width: 750rpx; height: 752rpx; } .info_card { background: #FFFFFF; .info_tit { display: flex; flex-wrap: nowrap; padding: 22rpx 28rpx; font-weight: 600; font-size: 32rpx; color: #3D3D3D; .money{ margin-left: auto; font-weight: 500; font-size: 32rpx; color: #4C97E7; } } .lines { width: 750rpx; height: 2rpx; border: 2rpx solid #ccc; } .cont { padding: 26rpx 28rpx; .info_li { display: flex; flex-wrap: nowrap; font-weight: 400; font-size: 28rpx; color: #808080; .text{ width: 70%; white-space: nowrap; /* 禁止换行 */ overflow: hidden; /* 超出部分隐藏 */ text-overflow: ellipsis; } span { color: #3D3D3D; } line-height: 48rpx; .half_infoli { width: 50%; font-weight: 400; font-size: 28rpx; color: #808080; span { color: #3D3D3D; } } } .info_lis { display: inline-block; // flex-wrap: nowrap; font-weight: 400; font-size: 28rpx; color: #808080; .text{ display: inline; // width: 70%; // white-space: nowrap; // /* 禁止换行 */ // overflow: hidden; // /* 超出部分隐藏 */ // text-overflow: ellipsis; } span { color: #3D3D3D; } line-height: 48rpx; .half_infoli { width: 50%; font-weight: 400; font-size: 28rpx; color: #808080; span { color: #3D3D3D; } } } } } .bot { position: fixed; bottom: 0; width: 750rpx; height: 184rpx; background: #FFFFFF; box-shadow: 0rpx 10rpx 64rpx 0rpx rgba(0, 0, 0, 0.08), 0rpx 10rpx 64rpx 0rpx rgba(0, 0, 0, 0.08); border-radius: 0rpx 0rpx 0rpx 0rpx; .btn { margin: 46rpx auto; display: flex; align-items: center; justify-content: center; width: 680rpx; height: 90rpx; background: #4C97E7; border-radius: 54rpx 54rpx 54rpx 54rpx; font-weight: 500; font-size: 40rpx; color: #FFFFFF; } } } </style>