548 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			548 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| <template>
 | ||
| 	<view class="content">
 | ||
| 		<headersVue :titles="titles" style=" position: static !important;">
 | ||
| 			<u-icon name="arrow-left" color="#fff" size="18"></u-icon>
 | ||
| 		</headersVue>
 | ||
| 		<view class="appointment-detail">
 | ||
| 			<!-- 顶部标题栏 -->
 | ||
| 			<view class="header">
 | ||
| 				<text class="title">预约详情</text>
 | ||
| 				<text class="status" :class="{'converted': detail.isUse === '1'}">
 | ||
| 					{{detail.isUse === '1' ? '已转订单' : '未转订单'}}
 | ||
| 				</text>
 | ||
| 			</view>
 | ||
| 
 | ||
| 			<!-- 基本信息卡片 -->
 | ||
| 			<view class="card">
 | ||
| 				<view class="card-header">
 | ||
| 					<text class="card-title">基本信息</text>
 | ||
| 					<button v-if="detail.isUse !== '1' && detail.meetOrderId && detail.isMeet == 1" class="convert-btn"
 | ||
| 						@click="convertToOrder" size="mini">
 | ||
| 						转订单
 | ||
| 					</button>
 | ||
| 					<button v-else @click="clickDisabledButton" class="convert-btn-disable" size="mini">
 | ||
| 						转订单
 | ||
| 					</button>
 | ||
| 				</view>
 | ||
| 
 | ||
| 				<view class="info-list">
 | ||
| 					<view class="info-item">
 | ||
| 						<text class="label">预约类型:</text>
 | ||
| 						<text class="value">{{detail.goodsTitle}}<text
 | ||
| 								v-if="detail.carNature">{{ '-' + detail.carNature}}</text></text>
 | ||
| 					</view>
 | ||
| 					<view class="info-item">
 | ||
| 						<text class="label">车牌号码:</text>
 | ||
| 						<text class="value">{{detail.carNo || "暂无车牌号"}}</text>
 | ||
| 					</view>
 | ||
| 					<view class="info-item">
 | ||
| 						<text class="label">车辆型号:</text>
 | ||
| 						<text class="value">{{detail.carModel || "暂无型号"}}</text>
 | ||
| 					</view>
 | ||
| 					<view class="info-item">
 | ||
| 						<text class="label">注册日期:</text>
 | ||
| 						<text class="value">{{formatDate(detail.carRegisterDate) || "暂无注册日期"}}</text>
 | ||
| 					</view>
 | ||
| 					<view class="info-item">
 | ||
| 						<text class="label">识别代码:</text>
 | ||
| 						<text class="value">{{detail.carIdNo || '无'}}</text>
 | ||
| 					</view>
 | ||
| 				</view>
 | ||
| 			</view>
 | ||
| 
 | ||
| 			<!-- 预约信息卡片 -->
 | ||
| 			<view class="card">
 | ||
| 				<view class="card-header">
 | ||
| 					<text class="card-title">预约信息</text>
 | ||
| 				</view>
 | ||
| 
 | ||
| 				<view class="info-list">
 | ||
| 					<view class="info-item">
 | ||
| 						<text class="label">预约人:</text>
 | ||
| 						<text class="value">{{detail.owner || detail.buyName}}</text>
 | ||
| 					</view>
 | ||
| 					<view class="info-item">
 | ||
| 						<text class="label">联系电话:</text>
 | ||
| 						<text class="value">{{detail.otherPhone || detail.buyPhoneNum || '暂无'}}</text>
 | ||
| 						<button class="call-btn" @click="callUser" size="mini">拨打</button>
 | ||
| 					</view>
 | ||
| 					<view class="info-item">
 | ||
| 						<text class="label">预约时间:</text>
 | ||
| 						<text class="value">{{formatDate(detail.appointmentDay)}}
 | ||
| 							{{detail.appointmentPeriod === '0' ? '上午' : '下午'}}{{detail.time}}</text>
 | ||
| 					</view>
 | ||
| 					<view class="info-item">
 | ||
| 						<text class="label">客户来源:</text>
 | ||
| 						<text class="value">{{detail.partner_id ? '合作商客户' : '自来客户'}}</text>
 | ||
| 					</view>
 | ||
| 					<view class="info-item">
 | ||
| 						<text class="label">支付方式:</text>
 | ||
| 						<text class="value">{{detail.is_pay_online === '1' ? '线上支付' : '线下支付'}}</text>
 | ||
| 					</view>
 | ||
| 					<view class="info-item" style="justify-content: space-between;">
 | ||
| 						<view>
 | ||
| 							<text class="label">上门取车:</text>
 | ||
| 							<text class="value">{{detail.isPickCar === '1' ? '是' : '否'}}</text>
 | ||
| 						</view>
 | ||
| 						<view>
 | ||
| 							<text class="label" v-if="!detail.meetOrderId">暂未指派接车员</text>
 | ||
| 							<text class="value" v-else>接车人:{{detail.meetName}}<text v-if="detail.isMeet == 0"
 | ||
| 									style="color: red;">(暂未接车)</text><text v-else
 | ||
| 									style="color: #1890FF;">(已接车)</text></text>
 | ||
| 						</view>
 | ||
| 					</view>
 | ||
| 					<view class="info-item" v-if="detail.address">
 | ||
| 						<text class="label">取车地址:</text>
 | ||
| 						<text class="value">{{detail.adressDetail}}</text>
 | ||
| 					</view>
 | ||
| 				</view>
 | ||
| 			</view>
 | ||
| 
 | ||
| 			<!-- 证件信息卡片 -->
 | ||
| 			<view class="card">
 | ||
| 				<view class="card-header">
 | ||
| 					<text class="card-title">证件信息</text>
 | ||
| 				</view>
 | ||
| 
 | ||
| 				<view class="info-list">
 | ||
| 					<view class="info-item">
 | ||
| 						<text class="label">行驶证:</text>
 | ||
| 						<button class="view-btn" @click="viewDriverLicense" size="mini">
 | ||
| 							{{detail.driverLicenesImg ? '查看' : '未上传'}}
 | ||
| 						</button>
 | ||
| 					</view>
 | ||
| 				</view>
 | ||
| 			</view>
 | ||
| 
 | ||
| 			<!-- 备注信息卡片 -->
 | ||
| 			<view class="card" v-if="detail.remark">
 | ||
| 				<view class="card-header">
 | ||
| 					<text class="card-title">备注信息</text>
 | ||
| 				</view>
 | ||
| 
 | ||
| 				<view class="info-list">
 | ||
| 					<view class="info-item">
 | ||
| 						<text class="value">{{detail.remark}}</text>
 | ||
| 					</view>
 | ||
| 				</view>
 | ||
| 			</view>
 | ||
| 
 | ||
| 			<!-- 底部操作栏 -->
 | ||
| 			<view class="footer">
 | ||
| 				<button class="btn" @click="callUser">拨打电话</button>
 | ||
| 				<button class="btn primary" @click="clickMeetMan()" v-if="detail.meetOrderId == null">分配接车人</button>
 | ||
| 			</view>
 | ||
| 		</view>
 | ||
| 		<u-modal :show="showPop" showCancelButton mode="center" @cancel="closePop" @confirm="confirmPop">
 | ||
| 			<view style="width: 100%;">
 | ||
| 				<view style="margin-bottom: 50rpx;text-align: center;">分配接车人</view>
 | ||
| 				<view class="poup">
 | ||
| 					<view>车牌号:</view>
 | ||
| 					<view class="poup-item " style="padding-right: 38rpx;">
 | ||
| 						{{detail.carNo || "暂无车牌号"}}
 | ||
| 					</view>
 | ||
| 				</view>
 | ||
| 				<view class="poup">
 | ||
| 					<view>取车日期:</view>
 | ||
| 					<view class="poup-item " style="padding-right: 38rpx;">
 | ||
| 						{{detail.pickCarAppointmentDay || "暂无取车日期"}}
 | ||
| 					</view>
 | ||
| 				</view>
 | ||
| 				<view class="poup">
 | ||
| 					<view>取车时间:</view>
 | ||
| 					<view class="poup-item " style="padding-right: 38rpx;">
 | ||
| 						{{detail.pickCarAppointmentTime || "暂无取车时间"}}
 | ||
| 					</view>
 | ||
| 				</view>
 | ||
| 				<view class="poup">
 | ||
| 					<view style="width: 340rpx;">取车地点:</view>
 | ||
| 					<view class="poup-item " style="padding-right: 38rpx;">
 | ||
| 						{{detail.adressDetail || "暂无取车地点"}}
 | ||
| 					</view>
 | ||
| 				</view>
 | ||
| 				<view class="poup">
 | ||
| 					<view>接车人:</view>
 | ||
| 					<view class="poup-item" @click="showMeetMan = true">
 | ||
| 						{{meetName}}
 | ||
| 						<u-icon class="dl-float-right" name="arrow-right" size="18"></u-icon>
 | ||
| 					</view>
 | ||
| 				</view>
 | ||
| 			</view>
 | ||
| 		</u-modal>
 | ||
| 		<u-picker :show="showMeetMan" :columns="[meetManList]" :defaultIndex="defaultIndex" @confirm="confirmMeetMan"
 | ||
| 			@cancel="showMeetMan = false" keyName="nickname"></u-picker>
 | ||
| 	</view>
 | ||
| </template>
 | ||
| 
 | ||
| <script>
 | ||
| 	import request from '../../../utils/request';
 | ||
| 	import headersVue from '@/components/header/headers.vue';
 | ||
| 	import qianziyuSelect from '@/components/qianziyu-select/qianziyu-select.vue';
 | ||
| 	import {
 | ||
| 		formatDate
 | ||
| 	} from '../../../utils/utils';
 | ||
| 
 | ||
| 	export default {
 | ||
| 		data() {
 | ||
| 			return {
 | ||
| 				id: null,
 | ||
| 				detail: {},
 | ||
| 				titles: "预约详情",
 | ||
| 				baseImageUrl: this.$baseImageUrl,
 | ||
| 				meetManId: undefined,
 | ||
| 				meetName: '请选择接车人',
 | ||
| 				showMeetMan: false,
 | ||
| 				showPop: false,
 | ||
| 				meetManList: [],
 | ||
| 				defaultIndex: [0],
 | ||
| 			}
 | ||
| 		},
 | ||
| 		onLoad(options) {
 | ||
| 			this.id = options.id;
 | ||
| 			this.fetchDetail();
 | ||
| 		},
 | ||
| 		components: {
 | ||
| 			headersVue,
 | ||
| 			qianziyuSelect
 | ||
| 		},
 | ||
| 		methods: {
 | ||
| 			async fetchDetail() {
 | ||
| 				uni.showLoading({
 | ||
| 					title: '加载中...'
 | ||
| 				});
 | ||
| 
 | ||
| 				try {
 | ||
| 					const res = await request({
 | ||
| 						url: `/inspection/appointment/${this.id}`,
 | ||
| 						method: 'GET'
 | ||
| 					})
 | ||
| 					this.detail = res.data;
 | ||
| 					await this.getStaff();
 | ||
| 				} catch (error) {
 | ||
| 					console.error('获取预约详情失败:', error);
 | ||
| 					uni.showToast({
 | ||
| 						title: '获取详情失败',
 | ||
| 						icon: 'none'
 | ||
| 					});
 | ||
| 				} finally {
 | ||
| 					uni.hideLoading();
 | ||
| 				}
 | ||
| 			},
 | ||
| 			clickDisabledButton() {
 | ||
| 				console.log('执行了');
 | ||
| 				if (!this.detail.meetOrderId) {
 | ||
| 					uni.showToast({
 | ||
| 						title: '请先指派接车人',
 | ||
| 						icon: 'none'
 | ||
| 					})
 | ||
| 					return
 | ||
| 				}
 | ||
| 				if (this.detail.isMeet != 1) {
 | ||
| 					uni.showToast({
 | ||
| 						title: '请通知接车人去完成接车',
 | ||
| 						icon: 'none'
 | ||
| 					})
 | ||
| 					return
 | ||
| 				}
 | ||
| 			},
 | ||
| 			closePop() {
 | ||
| 				this.showPop = false
 | ||
| 			},
 | ||
| 			confirmPop() {
 | ||
| 				// 分配借车人
 | ||
| 				this.getgoodes()
 | ||
| 			},
 | ||
| 			clickMeetMan() {
 | ||
| 				console.log('执行');
 | ||
| 				// this.showMeetMan = true;
 | ||
| 				this.showPop = true;
 | ||
| 			},
 | ||
| 			formatDate(dateStr) {
 | ||
| 				return formatDate(dateStr);
 | ||
| 			},
 | ||
| 			goAddOrder(data) {
 | ||
| 				uni.navigateTo({
 | ||
| 					url: `/pages/index/Neworder?appointmentId=${data.id}&meetCarId=${data.meetOrderId}`
 | ||
| 				})
 | ||
| 			},
 | ||
| 			confirmMeetMan(e) {
 | ||
| 				this.meetName = e.value[0].nickname
 | ||
| 				this.meetManId = e.value[0].id
 | ||
| 				this.showMeetMan = false
 | ||
| 			},
 | ||
| 			async getStaff() {
 | ||
| 				let data = {
 | ||
| 					pageNo: 1, //第几页
 | ||
| 					pageSize: 10000000, //一页多少张
 | ||
| 				}
 | ||
| 				let res = await request({
 | ||
| 					url: '/system/role/selectListByRoleId',
 | ||
| 					method: 'get',
 | ||
| 					params: data
 | ||
| 				})
 | ||
| 				// 如果需要确保DOM已更新再操作:
 | ||
| 				this.$nextTick(() => {
 | ||
| 					this.meetManList = res.data.records;
 | ||
| 					// 这里可以放需要DOM更新的操作
 | ||
| 				});
 | ||
| 			},
 | ||
| 			convertToOrder() {
 | ||
| 				uni.showModal({
 | ||
| 					title: '提示',
 | ||
| 					content: '确定将此预约转为订单吗?',
 | ||
| 					success: async (res) => {
 | ||
| 						if (res.confirm) {
 | ||
| 							try {
 | ||
| 								this.goAddOrder(this.detail)
 | ||
| 							} catch (error) {
 | ||
| 								console.error('转订单失败:', error);
 | ||
| 								uni.showToast({
 | ||
| 									title: '转换失败',
 | ||
| 									icon: 'none'
 | ||
| 								});
 | ||
| 							}
 | ||
| 						}
 | ||
| 					}
 | ||
| 				});
 | ||
| 			},
 | ||
| 			viewDriverLicense() {
 | ||
| 				if (!this.detail.driverLicenesImg) {
 | ||
| 					uni.showToast({
 | ||
| 						title: '未上传行驶证',
 | ||
| 						icon: 'none'
 | ||
| 					});
 | ||
| 					return;
 | ||
| 				}
 | ||
| 
 | ||
| 				uni.previewImage({
 | ||
| 					urls: [this.baseImageUrl + '/' + this.detail.driverLicenesImg]
 | ||
| 				});
 | ||
| 			},
 | ||
| 			async getgoodes() {
 | ||
| 				if (this.carNum == '' || this.carRegisterDate == '') {
 | ||
| 					uni.showToast({
 | ||
| 						title: '车牌号 车辆注册日期 必填!',
 | ||
| 						icon: 'none'
 | ||
| 					})
 | ||
| 					return
 | ||
| 				}
 | ||
| 				let data = {
 | ||
| 					partnerId: uni.getStorageSync('partnerId'),
 | ||
| 					buyName: this.detail.owner || this.detail.buyName,
 | ||
| 					buyPhone: this.detail.otherPhone || this.detail.buyPhone,
 | ||
| 					userAddress: this.detail.address,
 | ||
| 					unitName: this.detail.unitName,
 | ||
| 					carNum: this.detail.carNo,
 | ||
| 					carModel: this.detail.carModel,
 | ||
| 					carStatus: this.detail.carStatus,
 | ||
| 					carIdNo: this.detail.carIdNo,
 | ||
| 					customerSource: this.detail.customerSource,
 | ||
| 					skuId: this.detail.skuId,
 | ||
| 					carNature: this.detail.carNature,
 | ||
| 					inspectionWorkNodes: this.detail.inspectionWorkNodes,
 | ||
| 					leadManId: this.detail.leadManId,
 | ||
| 					startTime: this.detail.recordTime,
 | ||
| 					otherPhone: this.otherPhone,
 | ||
| 					carRegisterDate: this.detail.carRegisterDate,
 | ||
| 					meetManId: this.meetManId,
 | ||
| 					appointmentId: this.detail.id,
 | ||
| 					meetType: 1
 | ||
| 				}
 | ||
| 
 | ||
| 				try {
 | ||
| 					let res = await request({
 | ||
| 						url: '/inspection-meet-car-order/add',
 | ||
| 						method: 'post',
 | ||
| 						data: data
 | ||
| 					})
 | ||
| 					uni.showToast({
 | ||
| 						title: "分配成功"
 | ||
| 					})
 | ||
| 					await this.fetchDetail()
 | ||
| 					this.showPop = false
 | ||
| 				} catch {
 | ||
| 					uni.showToast({
 | ||
| 						title: '分配失败',
 | ||
| 						icon: 'none'
 | ||
| 					})
 | ||
| 				}
 | ||
| 			},
 | ||
| 			callUser() {
 | ||
| 				const phone = this.detail.otherPhone || this.detail.buyPhoneNum;
 | ||
| 				if (!phone) {
 | ||
| 					uni.showToast({
 | ||
| 						title: '无联系电话',
 | ||
| 						icon: 'none'
 | ||
| 					});
 | ||
| 					return;
 | ||
| 				}
 | ||
| 
 | ||
| 				uni.makePhoneCall({
 | ||
| 					phoneNumber: phone
 | ||
| 				});
 | ||
| 			}
 | ||
| 		}
 | ||
| 	}
 | ||
| </script>
 | ||
| 
 | ||
| <style lang="scss">
 | ||
| 	.appointment-detail {
 | ||
| 		padding: 20rpx;
 | ||
| 		padding-bottom: 120rpx;
 | ||
| 		background-color: #f5f5f5;
 | ||
| 		box-sizing: border-box;
 | ||
| 
 | ||
| 		.header {
 | ||
| 			display: flex;
 | ||
| 			align-items: center;
 | ||
| 			justify-content: space-between;
 | ||
| 			margin-bottom: 20rpx;
 | ||
| 
 | ||
| 			.title {
 | ||
| 				font-size: 36rpx;
 | ||
| 				font-weight: bold;
 | ||
| 				color: #333;
 | ||
| 			}
 | ||
| 
 | ||
| 			.status {
 | ||
| 				padding: 6rpx 20rpx;
 | ||
| 				border-radius: 20rpx;
 | ||
| 				font-size: 24rpx;
 | ||
| 				background-color: #f0f0f0;
 | ||
| 				color: #666;
 | ||
| 
 | ||
| 				&.converted {
 | ||
| 					background-color: #e6f7ff;
 | ||
| 					color: #1890ff;
 | ||
| 				}
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		.card {
 | ||
| 			background-color: #fff;
 | ||
| 			border-radius: 12rpx;
 | ||
| 			margin-bottom: 20rpx;
 | ||
| 			overflow: hidden;
 | ||
| 
 | ||
| 			.card-header {
 | ||
| 				display: flex;
 | ||
| 				justify-content: space-between;
 | ||
| 				align-items: center;
 | ||
| 				padding: 20rpx;
 | ||
| 				border-bottom: 1rpx solid #f0f0f0;
 | ||
| 
 | ||
| 				.card-title {
 | ||
| 					font-size: 30rpx;
 | ||
| 					font-weight: bold;
 | ||
| 					color: #333;
 | ||
| 				}
 | ||
| 
 | ||
| 				.convert-btn {
 | ||
| 					margin: 0;
 | ||
| 					height: 50rpx;
 | ||
| 					line-height: 50rpx;
 | ||
| 					font-size: 24rpx;
 | ||
| 					background-color: #1890ff;
 | ||
| 					color: white;
 | ||
| 				}
 | ||
| 
 | ||
| 				.convert-btn-disable {
 | ||
| 					margin: 0;
 | ||
| 					height: 50rpx;
 | ||
| 					line-height: 50rpx;
 | ||
| 					font-size: 24rpx;
 | ||
| 				}
 | ||
| 			}
 | ||
| 
 | ||
| 			.info-list {
 | ||
| 				padding: 0 20rpx;
 | ||
| 
 | ||
| 				.info-item {
 | ||
| 					display: flex;
 | ||
| 					align-items: center;
 | ||
| 					padding: 20rpx 0;
 | ||
| 					border-bottom: 1rpx solid #f0f0f0;
 | ||
| 
 | ||
| 					&:last-child {
 | ||
| 						border-bottom: none;
 | ||
| 					}
 | ||
| 
 | ||
| 					.label {
 | ||
| 						width: 160rpx;
 | ||
| 						font-size: 28rpx;
 | ||
| 						color: #999;
 | ||
| 					}
 | ||
| 
 | ||
| 					.value {
 | ||
| 						flex: 1;
 | ||
| 						font-size: 28rpx;
 | ||
| 						color: #333;
 | ||
| 					}
 | ||
| 
 | ||
| 					.call-btn,
 | ||
| 					.view-btn {
 | ||
| 						margin-left: 20rpx;
 | ||
| 						height: 50rpx;
 | ||
| 						line-height: 50rpx;
 | ||
| 						font-size: 24rpx;
 | ||
| 
 | ||
| 						&.call-btn {
 | ||
| 							background-color: #1890ff;
 | ||
| 							color: white;
 | ||
| 						}
 | ||
| 
 | ||
| 						&.view-btn {
 | ||
| 							background-color: #fff;
 | ||
| 							color: #1890ff;
 | ||
| 							border: 1rpx solid #1890ff;
 | ||
| 						}
 | ||
| 					}
 | ||
| 				}
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		.footer {
 | ||
| 			position: fixed;
 | ||
| 			bottom: 0;
 | ||
| 			left: 0;
 | ||
| 			right: 0;
 | ||
| 			display: flex;
 | ||
| 			padding: 20rpx;
 | ||
| 			background-color: #fff;
 | ||
| 			box-shadow: 0 -2rpx 10rpx rgba(0, 0, 0, 0.1);
 | ||
| 
 | ||
| 			.btn {
 | ||
| 				flex: 1;
 | ||
| 				height: 80rpx;
 | ||
| 				line-height: 80rpx;
 | ||
| 				font-size: 30rpx;
 | ||
| 				margin: 0 10rpx;
 | ||
| 				background-color: #fff;
 | ||
| 				color: #333;
 | ||
| 				border: 1rpx solid #ddd;
 | ||
| 
 | ||
| 				&.primary {
 | ||
| 					background-color: #1890ff;
 | ||
| 					color: white;
 | ||
| 					border: none;
 | ||
| 				}
 | ||
| 			}
 | ||
| 		}
 | ||
| 	}
 | ||
| 
 | ||
| 	.poup {
 | ||
| 		display: flex;
 | ||
| 		justify-content: space-between;
 | ||
| 		width: 100%;
 | ||
| 		color: #666;
 | ||
| 
 | ||
| 		.poup-item {
 | ||
| 			display: flex;
 | ||
| 			justify-content: space-between;
 | ||
| 			margin-top: 15rpx;
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 		}
 | ||
| 	}
 | ||
| </style> | 
