<template>
|
|
<view class="content">
|
|
<navbar title="拒单申请管理" leftClick @leftClick="$utils.navigateBack" />
|
|
<view class="header">
|
|
<view class="title">拒单申请管理</view>
|
|
<view class="subtitle">处理司机和企业的拒单申请</view>
|
|
</view>
|
|
|
|
<!-- 筛选栏 -->
|
|
<view class="filter-bar">
|
|
<view class="filter-item" :class="{active: currentStatus === 'all'}" @click="setStatus('all')">
|
|
全部
|
|
</view>
|
|
<view class="filter-item" :class="{active: currentStatus === 'pending'}" @click="setStatus('pending')">
|
|
待处理
|
|
</view>
|
|
<view class="filter-item" :class="{active: currentStatus === 'approved'}" @click="setStatus('approved')">
|
|
已通过
|
|
</view>
|
|
<view class="filter-item" :class="{active: currentStatus === 'rejected'}" @click="setStatus('rejected')">
|
|
已拒绝
|
|
</view>
|
|
</view>
|
|
|
|
<!-- 申请列表 -->
|
|
<view class="apply-list">
|
|
<view v-if="filteredList.length === 0" class="empty-state">
|
|
<view class="empty-icon">📋</view>
|
|
<view class="empty-text">暂无拒单申请</view>
|
|
</view>
|
|
|
|
<view v-for="(item, index) in filteredList" :key="index" class="apply-item">
|
|
<view class="item-header">
|
|
<view class="applicant-info">
|
|
<view class="name">{{ item.applicantName }}</view>
|
|
<view class="role">{{ item.applicantRole }}</view>
|
|
</view>
|
|
<view class="apply-time">{{ item.applyTime }}</view>
|
|
</view>
|
|
|
|
<view class="order-info">
|
|
<view class="order-title">{{ item.orderTitle }}</view>
|
|
<view class="order-details">
|
|
<text>订单编号:{{ item.orderNo }}</text>
|
|
<text>工作地点:{{ item.workLocation }}</text>
|
|
</view>
|
|
</view>
|
|
|
|
<view class="reject-reason">
|
|
<view class="reason-label">拒单原因:</view>
|
|
<view class="reason-content">{{ item.rejectReason }}</view>
|
|
</view>
|
|
|
|
<view class="item-footer">
|
|
<view class="status-badge" :class="item.status">
|
|
{{ getStatusText(item.status) }}
|
|
</view>
|
|
|
|
<view v-if="item.status === 'pending'" class="action-buttons">
|
|
<view class="btn approve" @click="approveApply(item)">通过</view>
|
|
<view class="btn reject" @click="rejectApply(item)">拒绝</view>
|
|
</view>
|
|
|
|
<view v-else class="result-info">
|
|
<text v-if="item.status === 'approved'">处理人:{{ item.handler }}</text>
|
|
<text v-if="item.status === 'rejected'">拒绝原因:{{ item.handleReason }}</text>
|
|
<text>处理时间:{{ item.handleTime }}</text>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
</template>
|
|
|
|
<script>
|
|
import navbar from '@/components/base/navbar.vue'
|
|
|
|
export default {
|
|
name: 'RejectApply',
|
|
components: {
|
|
navbar
|
|
},
|
|
data() {
|
|
return {
|
|
currentStatus: 'all',
|
|
applyList: [
|
|
{
|
|
id: 1,
|
|
applicantName: '张师傅',
|
|
applicantRole: '泵车司机',
|
|
applyTime: '2024-01-15 14:30',
|
|
orderTitle: '雨花区建设项目混凝土运输',
|
|
orderNo: 'ORD202401150001',
|
|
workLocation: '长沙市雨花区某某路123号',
|
|
rejectReason: '车辆故障,无法按时到达现场',
|
|
status: 'pending'
|
|
},
|
|
{
|
|
id: 2,
|
|
applicantName: '李总',
|
|
applicantRole: '企业负责人',
|
|
applyTime: '2024-01-14 16:20',
|
|
orderTitle: '岳麓区商业中心项目',
|
|
orderNo: 'ORD202401140002',
|
|
workLocation: '长沙市岳麓区某某大道456号',
|
|
rejectReason: '天气原因,现场无法施工',
|
|
status: 'approved',
|
|
handler: '区域管理员王某',
|
|
handleTime: '2024-01-14 17:00'
|
|
},
|
|
{
|
|
id: 3,
|
|
applicantName: '王师傅',
|
|
applicantRole: '搅拌车司机',
|
|
applyTime: '2024-01-13 10:15',
|
|
orderTitle: '开福区住宅项目',
|
|
orderNo: 'ORD202401130003',
|
|
workLocation: '长沙市开福区某某街789号',
|
|
rejectReason: '个人原因,无法完成订单',
|
|
status: 'rejected',
|
|
handler: '区域管理员王某',
|
|
handleReason: '理由不充分',
|
|
handleTime: '2024-01-13 11:30'
|
|
}
|
|
]
|
|
}
|
|
},
|
|
computed: {
|
|
filteredList() {
|
|
if (this.currentStatus === 'all') {
|
|
return this.applyList;
|
|
}
|
|
return this.applyList.filter(item => item.status === this.currentStatus);
|
|
}
|
|
},
|
|
onLoad() {
|
|
uni.setNavigationBarTitle({
|
|
title: '拒单申请管理'
|
|
});
|
|
},
|
|
methods: {
|
|
setStatus(status) {
|
|
this.currentStatus = status;
|
|
},
|
|
getStatusText(status) {
|
|
switch(status) {
|
|
case 'pending': return '待处理';
|
|
case 'approved': return '已通过';
|
|
case 'rejected': return '已拒绝';
|
|
default: return '未知状态';
|
|
}
|
|
},
|
|
approveApply(item) {
|
|
uni.showModal({
|
|
title: '确认通过',
|
|
content: `确定通过${item.applicantName}的拒单申请吗?`,
|
|
success: (res) => {
|
|
if (res.confirm) {
|
|
item.status = 'approved';
|
|
item.handler = '区域管理员';
|
|
item.handleTime = new Date().toLocaleString();
|
|
uni.showToast({
|
|
title: '已通过申请',
|
|
icon: 'success'
|
|
});
|
|
}
|
|
}
|
|
});
|
|
},
|
|
rejectApply(item) {
|
|
uni.showModal({
|
|
title: '拒绝申请',
|
|
content: '请输入拒绝原因',
|
|
editable: true,
|
|
placeholderText: '请输入拒绝原因',
|
|
success: (res) => {
|
|
if (res.confirm) {
|
|
item.status = 'rejected';
|
|
item.handler = '区域管理员';
|
|
item.handleReason = res.content || '无具体原因';
|
|
item.handleTime = new Date().toLocaleString();
|
|
uni.showToast({
|
|
title: '已拒绝申请',
|
|
icon: 'success'
|
|
});
|
|
}
|
|
}
|
|
});
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style scoped lang="scss">
|
|
.content {
|
|
padding: 20rpx;
|
|
min-height: 100vh;
|
|
background-color: #f5f5f5;
|
|
}
|
|
|
|
.header {
|
|
background-color: #fff;
|
|
padding: 30rpx;
|
|
border-radius: 10rpx;
|
|
margin-bottom: 20rpx;
|
|
text-align: center;
|
|
|
|
.title {
|
|
font-size: 36rpx;
|
|
font-weight: bold;
|
|
color: #333;
|
|
margin-bottom: 10rpx;
|
|
}
|
|
|
|
.subtitle {
|
|
font-size: 28rpx;
|
|
color: #666;
|
|
}
|
|
}
|
|
|
|
.filter-bar {
|
|
display: flex;
|
|
background-color: #fff;
|
|
border-radius: 10rpx;
|
|
padding: 20rpx;
|
|
margin-bottom: 20rpx;
|
|
gap: 20rpx;
|
|
|
|
.filter-item {
|
|
flex: 1;
|
|
text-align: center;
|
|
padding: 15rpx 0;
|
|
border-radius: 25rpx;
|
|
font-size: 28rpx;
|
|
color: #666;
|
|
background-color: #f8f8f8;
|
|
transition: all 0.3s;
|
|
|
|
&.active {
|
|
color: #007AFF;
|
|
background-color: #e6f3ff;
|
|
border: 1rpx solid #007AFF;
|
|
}
|
|
}
|
|
}
|
|
|
|
.apply-list {
|
|
.empty-state {
|
|
text-align: center;
|
|
padding: 100rpx 0;
|
|
background-color: #fff;
|
|
border-radius: 10rpx;
|
|
|
|
.empty-icon {
|
|
font-size: 120rpx;
|
|
margin-bottom: 20rpx;
|
|
}
|
|
|
|
.empty-text {
|
|
font-size: 28rpx;
|
|
color: #999;
|
|
}
|
|
}
|
|
|
|
.apply-item {
|
|
background-color: #fff;
|
|
border-radius: 10rpx;
|
|
padding: 30rpx;
|
|
margin-bottom: 20rpx;
|
|
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1);
|
|
|
|
.item-header {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
margin-bottom: 20rpx;
|
|
|
|
.applicant-info {
|
|
.name {
|
|
font-size: 32rpx;
|
|
font-weight: bold;
|
|
color: #333;
|
|
}
|
|
|
|
.role {
|
|
font-size: 24rpx;
|
|
color: #666;
|
|
margin-top: 5rpx;
|
|
}
|
|
}
|
|
|
|
.apply-time {
|
|
font-size: 24rpx;
|
|
color: #999;
|
|
}
|
|
}
|
|
|
|
.order-info {
|
|
margin-bottom: 20rpx;
|
|
padding: 20rpx;
|
|
background-color: #f8f8f8;
|
|
border-radius: 8rpx;
|
|
|
|
.order-title {
|
|
font-size: 30rpx;
|
|
font-weight: bold;
|
|
color: #333;
|
|
margin-bottom: 10rpx;
|
|
}
|
|
|
|
.order-details {
|
|
font-size: 26rpx;
|
|
color: #666;
|
|
line-height: 1.5;
|
|
|
|
text {
|
|
display: block;
|
|
}
|
|
}
|
|
}
|
|
|
|
.reject-reason {
|
|
margin-bottom: 20rpx;
|
|
|
|
.reason-label {
|
|
font-size: 28rpx;
|
|
color: #333;
|
|
margin-bottom: 10rpx;
|
|
}
|
|
|
|
.reason-content {
|
|
font-size: 26rpx;
|
|
color: #666;
|
|
line-height: 1.5;
|
|
padding: 15rpx;
|
|
background-color: #fff3cd;
|
|
border-radius: 8rpx;
|
|
border-left: 4rpx solid #ffc107;
|
|
}
|
|
}
|
|
|
|
.item-footer {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
|
|
.status-badge {
|
|
padding: 8rpx 16rpx;
|
|
border-radius: 20rpx;
|
|
font-size: 24rpx;
|
|
color: #fff;
|
|
|
|
&.pending {
|
|
background-color: #ff9500;
|
|
}
|
|
|
|
&.approved {
|
|
background-color: #34c759;
|
|
}
|
|
|
|
&.rejected {
|
|
background-color: #ff3b30;
|
|
}
|
|
}
|
|
|
|
.action-buttons {
|
|
display: flex;
|
|
gap: 15rpx;
|
|
|
|
.btn {
|
|
padding: 12rpx 24rpx;
|
|
border-radius: 20rpx;
|
|
font-size: 26rpx;
|
|
color: #fff;
|
|
|
|
&.approve {
|
|
background-color: #34c759;
|
|
}
|
|
|
|
&.reject {
|
|
background-color: #ff3b30;
|
|
}
|
|
}
|
|
}
|
|
|
|
.result-info {
|
|
font-size: 24rpx;
|
|
color: #666;
|
|
line-height: 1.4;
|
|
|
|
text {
|
|
display: block;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
</style>
|