detection-business/pages/index/appointmentDetail/appointmentDetail.vue
2025-07-11 10:17:36 +08:00

583 lines
14 KiB
Vue
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.

<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) || (sourceType === 'meetcar')"
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" v-if="detail.goodsTitle">{{ detail.goodsTitle }}
<text v-if="detail.carNature">{{ '-' + detail.carNature }}
</text>
</text>
<text class="value" v-else>
暂无检测类型
</text>
</view>
<view class="info-item">
<text class="label">车牌号码:</text>
<text class="value">{{ detail.carNo || detail.carNum || "暂无车牌号" }}</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" v-if="sourceType === 'appointment'">
<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.customerSource || '自来客户' }}</text>
</view>
<view class="info-item" v-if="sourceType === 'appointment'">
<text class="label">支付方式:</text>
<text class="value">{{ detail.is_pay_online === '1' ? '线上支付' : '线下支付' }}</text>
</view>
<view class="info-item" style="justify-content: space-between;" v-if="sourceType === 'appointment'">
<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 && sourceType == 'appointment'">分配接车人
</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: '请选择接车人',
sourceType: undefined,
showMeetMan: false,
showPop: false,
meetManList: [],
defaultIndex: [0],
}
},
onLoad(options) {
this.id = options.id;
this.sourceType = options.sourceType;
this.fetchDetail();
},
components: {
headersVue,
qianziyuSelect
},
methods: {
async fetchDetail() {
uni.showLoading({
title: '加载中...'
});
try {
if (this.sourceType == 'appointment') {
const res = await request({
url: `/inspection/appointment/${this.id}`,
method: 'GET'
})
this.detail = res.data;
} else {
const res = await this.queryMeetCar()
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) {
if (this.sourceType == 'appointment') {
uni.navigateTo({
url: `/pages/index/Neworder?appointmentId=${data.id}&meetCarId=${data.meetOrderId}`
})
} else {
uni.navigateTo({
url: `/pages/index/Neworder?meetCarId=${this.id}`
})
}
},
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更新的操作
});
},
queryMeetCar() {
return request({
url: '/inspection-meet-car-order/get',
method: 'get',
params: {
id: this.id
}
})
},
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 = {
...this.detail,
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>