216 lines
5.5 KiB
Vue
216 lines
5.5 KiB
Vue
<template>
|
|
<view class="detail-container">
|
|
<view class="detail-header">
|
|
<view class="back-btn" @click="goBack">
|
|
<text class="iconfont icon-arrow-left"></text>
|
|
</view>
|
|
<view class="title">访客详情</view>
|
|
</view>
|
|
|
|
<view class="detail-card">
|
|
<view class="card-item">
|
|
<view class="item-label">访客姓名</view>
|
|
<view class="item-value">{{ visitorInfo.visitorName || '-' }}</view>
|
|
</view>
|
|
<view class="card-item">
|
|
<view class="item-label">访客电话</view>
|
|
<view class="item-value">{{ visitorInfo.visitorPhone || '-' }}</view>
|
|
</view>
|
|
<view class="card-item">
|
|
<view class="item-label">所属公司</view>
|
|
<view class="item-value">{{ visitorInfo.company || '-' }}</view>
|
|
</view>
|
|
<view class="card-item">
|
|
<view class="item-label">被访人</view>
|
|
<view class="item-value">{{ visitorInfo.visitedPerson || '-' }}</view>
|
|
</view>
|
|
<view class="card-item">
|
|
<view class="item-label">联系电话</view>
|
|
<view class="item-value">{{ visitorInfo.contactPhone || '-' }}</view>
|
|
</view>
|
|
<view class="card-item">
|
|
<view class="item-label">被访单位</view>
|
|
<view class="item-value">{{ visitorInfo.visitedUnit || '-' }}</view>
|
|
</view>
|
|
<view class="card-item">
|
|
<view class="item-label">拜访事由</view>
|
|
<view class="item-value">{{ visitorInfo.reason || '-' }}</view>
|
|
</view>
|
|
<view class="card-item">
|
|
<view class="item-label">拜访时间</view>
|
|
<view class="item-value">{{ visitorInfo.visitTime || '-' }}</view>
|
|
</view>
|
|
<view class="card-item">
|
|
<view class="item-label">是否预约车位</view>
|
|
<view class="item-value">{{ visitorInfo.isBookParking || '-' }}</view>
|
|
</view>
|
|
<view class="card-item">
|
|
<view class="item-label">预约状态</view>
|
|
<view class="item-value status-value"
|
|
:class="{'status-confirm': visitorInfo.bookStatus === '已确认',
|
|
'status-wait': visitorInfo.bookStatus === '待确认'}">
|
|
{{ visitorInfo.bookStatus || '-' }}
|
|
</view>
|
|
</view>
|
|
<view class="card-item">
|
|
<view class="item-label">提交时间</view>
|
|
<view class="item-value">{{ visitorInfo.submitTime || '-' }}</view>
|
|
</view>
|
|
</view>
|
|
|
|
<!-- 操作按钮区域 -->
|
|
<view class="btn-group" v-if="visitorInfo.bookStatus === '待确认'">
|
|
<button class="audit-btn reject-btn" @click="handleAudit('reject')">驳回</button>
|
|
<button class="audit-btn confirm-btn" @click="handleAudit('confirm')">确认</button>
|
|
</view>
|
|
</view>
|
|
</template>
|
|
|
|
<script>
|
|
export default {
|
|
data() {
|
|
return {
|
|
visitorInfo: {} // 访客详情数据
|
|
}
|
|
},
|
|
onLoad(options) {
|
|
console.log(options)
|
|
try {
|
|
// 接收从列表页传来的访客数据
|
|
if (options.item) {
|
|
this.visitorInfo = JSON.parse(decodeURIComponent(options.item));
|
|
}
|
|
} catch (e) {
|
|
console.error('解析详情数据失败:', e);
|
|
uni.showToast({
|
|
title: '加载详情失败',
|
|
icon: 'none'
|
|
});
|
|
// 失败则返回上一页
|
|
setTimeout(() => {
|
|
uni.navigateBack();
|
|
}, 1500);
|
|
}
|
|
},
|
|
methods: {
|
|
// 返回上一页
|
|
goBack() {
|
|
uni.navigateBack();
|
|
},
|
|
// 处理审核操作
|
|
handleAudit(type) {
|
|
// 实际项目中应调用后端接口进行审核状态更新
|
|
const statusMap = {
|
|
'confirm': '已确认',
|
|
'reject': '已驳回'
|
|
};
|
|
|
|
uni.showLoading({
|
|
title: type === 'confirm' ? '确认中...' : '驳回中...',
|
|
mask: true
|
|
});
|
|
|
|
// 模拟接口调用
|
|
setTimeout(() => {
|
|
uni.hideLoading();
|
|
|
|
// 更新本地数据状态
|
|
if (statusMap[type]) {
|
|
this.visitorInfo.bookStatus = statusMap[type];
|
|
}
|
|
|
|
uni.showToast({
|
|
title: type === 'confirm' ? '确认成功' : '驳回成功',
|
|
icon: 'success'
|
|
});
|
|
|
|
// 返回上一页并刷新列表(实际项目中可通过事件总线或全局状态管理通知列表页更新)
|
|
setTimeout(() => {
|
|
uni.navigateBack();
|
|
}, 1500);
|
|
}, 800);
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style scoped>
|
|
.detail-container {
|
|
height: 100vh;
|
|
background-color: #f5f5f5;
|
|
}
|
|
.detail-header {
|
|
display: flex;
|
|
align-items: center;
|
|
height: 44px;
|
|
background-color: #fff;
|
|
padding: 0 15px;
|
|
border-bottom: 1px solid #eee;
|
|
}
|
|
.back-btn {
|
|
width: 40px;
|
|
height: 40px;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
}
|
|
.title {
|
|
flex: 1;
|
|
text-align: center;
|
|
font-size: 18px;
|
|
font-weight: bold;
|
|
}
|
|
.detail-card {
|
|
background-color: #fff;
|
|
margin: 15px;
|
|
border-radius: 8px;
|
|
padding: 15px 0;
|
|
}
|
|
.card-item {
|
|
display: flex;
|
|
padding: 10px 15px;
|
|
border-bottom: 1px solid #eee;
|
|
}
|
|
.card-item:last-child {
|
|
border-bottom: none;
|
|
}
|
|
.item-label {
|
|
width: 100px;
|
|
color: #666;
|
|
}
|
|
.item-value {
|
|
flex: 1;
|
|
color: #333;
|
|
}
|
|
.status-value {
|
|
padding: 2px 8px;
|
|
border-radius: 4px;
|
|
display: inline-block;
|
|
}
|
|
.status-confirm {
|
|
background-color: #e6f7ff;
|
|
color: #1890ff;
|
|
}
|
|
.status-wait {
|
|
background-color: #fff7e6;
|
|
color: #fa8c16;
|
|
}
|
|
.btn-group {
|
|
display: flex;
|
|
padding: 15px;
|
|
}
|
|
.audit-btn {
|
|
flex: 1;
|
|
margin: 0 10px;
|
|
padding: 10px 0;
|
|
border-radius: 20px;
|
|
color: #fff;
|
|
font-size: 16px;
|
|
}
|
|
.reject-btn {
|
|
background-color: #ff4d4f;
|
|
}
|
|
.confirm-btn {
|
|
background-color: #52c41a;
|
|
}
|
|
</style> |