Files
SmartParks_visitore/pages/sys/work/work.vue
2025-08-26 16:07:25 +08:00

267 lines
7.3 KiB
Vue

<template>
<view class="container">
<!-- 筛选及搜索区域 -->
<view class="search-bar">
<input v-model="searchParams.visitorName" class="search-input" placeholder="访客姓名"/>
<input v-model="searchParams.visitedPerson" class="search-input" placeholder="被访人"/>
<input v-model="searchParams.visitedUnit" class="search-input" placeholder="被访单位"/>
<!-- <picker mode="selector" :range="statusOptions" @change="onStatusChange">
<view class="picker-view">
{{ searchParams.bookStatus || '预约状态' }}
</view>
</picker> -->
<input v-model="searchParams.phoneSuffix" class="search-input" placeholder="手机号后四位"/>
<button class="search-btn" @click="handleSearch">搜索</button>
<button class="reset-btn" @click="handleReset">重置</button>
</view>
<!-- 表格区域 -->
<view class="table-wrap">
<view class="table-header">
<view class="table-cell">序号</view>
<view class="table-cell">访客姓名</view>
<view class="table-cell">访客电话</view>
<view class="table-cell">所属公司</view>
<view class="table-cell">被访人</view>
<view class="table-cell">联系电话</view>
<view class="table-cell">被访单位</view>
<view class="table-cell">拜访事由</view>
<view class="table-cell">拜访时间</view>
<!-- <view class="table-cell">是否预约车位</view>
<view class="table-cell">预约状态</view> -->
<view class="table-cell">提交时间</view>
<!-- <view class="table-cell">操作</view> -->
</view>
<view v-for="(item, index) in filteredList" :key="index" class="table-row">
<view class="table-cell">{{ index + 1 }}</view>
<view class="table-cell">{{ item.visitorName }}</view>
<view class="table-cell">{{ item.visitorPhone }}</view>
<view class="table-cell">{{ item.visitorUnit }}</view>
<view class="table-cell">{{ item.interviewedPerson }}</view>
<view class="table-cell">{{ item.interviewedPhone }}</view>
<view class="table-cell">{{ item.interviewedUnit || '无' }}</view>
<view class="table-cell">{{ item.visitingReason }}</view>
<view class="table-cell">{{ item.visitingBeginTime }}</view>
<!-- <view class="table-cell">{{ item.bookingParkingSpace === 1 ? '是' : '否' }}</view>
<view class="table-cell" :class="{'status-confirm': item.serveStatus === 1, 'status-wait': item.serveStatus === 0}">
{{ item.serveStatus === 1 ? '已确认' : '待确认' }}
</view> -->
<view class="table-cell">{{ item.createTime }}</view>
<!-- <view class="table-cell operation-cell">
<button class="operation-btn" @click="handleDetail(item)">详情</button>
<button class="operation-btn" @click="handleAudit(item)">确认</button>
</view> -->
</view>
</view>
<VisitorDetailModal
:visible="showDetailModal"
:visitorInfo="currentVisitor"
:showActionButtons="currentVisitor.serveStatus === 0"
@close="closeDetailModal"
@audit="handleAudit"
/>
</view>
</template>
<script>
import VisitorDetailModal from '@/components/VisitorDetailModal.vue';
export default {
components: {
VisitorDetailModal
},
data() {
return {
showDetailModal: false,
currentVisitor: {},
loading: false,
tableData: [],
searchParams: {
visitorName: '',
visitedPerson: '',
visitedUnit: '',
bookStatus: '',
phoneSuffix: ''
},
statusOptions: ['已确认', '待确认']
}
},
computed: {
filteredList() {
return this.tableData.filter(item => {
if (this.searchParams.visitorName && !item.visitorName.includes(this.searchParams.visitorName)) return false;
if (this.searchParams.visitedPerson && !item.interviewedPerson.includes(this.searchParams.visitedPerson)) return false;
if (this.searchParams.visitedUnit && !item.interviewedUnit.includes(this.searchParams.visitedUnit)) return false;
if (this.searchParams.bookStatus) {
const statusMap = {'已确认': 1, '待确认': 0};
return item.serveStatus === statusMap[this.searchParams.bookStatus];
}
if (this.searchParams.phoneSuffix) {
const phone = item.visitorPhone || '';
return phone.slice(-4) === this.searchParams.phoneSuffix;
}
return true;
});
}
},
onLoad() {
// #ifdef APP-PLUS
plus.screen.lockOrientation('default');
// #endif
this.onload();
},
methods: {
handleDetail(item) {
console.log('点击详情,传递的数据:', item);
this.currentVisitor = item;
this.showDetailModal = true;
},
closeDetailModal() {
this.showDetailModal = false;
},
handleAudit(item) {
console.log("eee", item)
this.loading = true;
item.serveStatus = 1
this.$u.api.spfk(item).then(res => {
console.log(res)
})
},
onReady() {
// #ifdef APP-PLUS
plus.screen.lockOrientation('landscape-primary');
// #endif
},
onload() {
this.$u.api.fklist().then(res => {
this.tableData = res.rows;
}).catch(err => {
console.error('获取数据失败:', err);
uni.showToast({title: '获取数据失败', icon: 'none'});
});
},
onStatusChange(e) {
const index = e.detail.value;
this.searchParams.bookStatus = this.statusOptions[index];
},
handleSearch() {
this.onload();
console.log('当前筛选参数:', this.searchParams);
},
handleReset() {
this.searchParams = {
visitorName: '',
visitedPerson: '',
visitedUnit: '',
bookStatus: '',
phoneSuffix: ''
};
this.onload();
},
// handleAudit(item) {
// console.log('审核操作,当前数据:', item);
// handleAudit(item)
// }
}
};
</script>
<style scoped>
.container {
padding: 10px;
}
.search-bar {
display: flex;
flex-wrap: wrap;
gap: 10px;
margin-bottom: 10px;
}
.search-input {
flex: 1;
min-width: 120px;
padding: 8px;
border: 1px solid #ddd;
border-radius: 4px;
}
.picker-view {
padding: 8px;
border: 1px solid #ddd;
border-radius: 4px;
min-width: 120px;
text-align: center;
}
.search-btn,
.reset-btn {
padding: 8px 15px;
border-radius: 4px;
color: #fff;
height: 40px;
text-align: center;
line-height: 24px;
}
.search-btn {
background-color: #007aff;
border: none;
}
.reset-btn {
background-color: #f0f0f0;
color: #333;
border: none;
}
.table-wrap {
overflow-x: auto;
}
.table-header,
.table-row {
display: flex;
flex-direction: row;
border: 1px solid #eee;
}
.table-header {
background-color: #f8f8f8;
font-weight: bold;
}
.table-cell {
flex: 1;
text-align: center;
padding: 8px 0;
border-right: 1px solid #eee;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.table-cell:last-child {
border-right: none;
}
.operation-cell {
display: flex;
justify-content: space-around;
flex: 2;
}
.operation-btn {
margin: 0 5px;
padding: 5px 10px;
font-size: 12px;
}
.status-confirm {
color: #52c41a;
}
.status-wait {
color: #fa8c16;
}
</style>