detection-business/pages/index/appointmentDetail/appointmentDetail.vue

548 lines
14 KiB
Vue
Raw Normal View History

2025-05-13 13:16:32 +08:00
<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)}}
2025-05-16 11:03:16 +08:00
{{detail.appointmentPeriod === '0' ? '上午' : '下午'}}{{detail.time}}</text>
2025-05-13 13:16:32 +08:00
</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>