7 changed files with 383 additions and 6 deletions
@ -0,0 +1,162 @@ |
|||||
|
<template> |
||||
|
<div class="reserve-list-page app_content"> |
||||
|
<div class="content-area"> |
||||
|
<van-pull-refresh v-model="refreshing" @refresh="onRefresh"> |
||||
|
<van-list v-model:loading="loading" :finished="finished" finished-text="" |
||||
|
@load="onLoad" :offset="50"> |
||||
|
<van-empty v-if="finished && reserveList.length === 0" description="暂无预约" /> |
||||
|
<div v-for="(item, index) in reserveList" :key="index" class="reserve-item"> |
||||
|
<div class="reserve-time">{{ item.time }}</div> |
||||
|
<div class="reserve-card"> |
||||
|
<!-- <div class="card-header"> |
||||
|
<span class="reserve-type">待确认预约:</span> |
||||
|
</div> --> |
||||
|
<div class="reserve-type">待执行任务:</div> |
||||
|
<div class="card-body"> |
||||
|
<div class="reserve-row"> |
||||
|
<span class="reserve-label">{{ item.reserveUnit ? '预约单位' : '执法单位' }}</span> |
||||
|
<span class="reserve-value">{{ item.reserveUnit || item.enforcementUnit || '-' }}</span> |
||||
|
</div> |
||||
|
<div class="reserve-row"> |
||||
|
<span class="reserve-label">企业名称</span> |
||||
|
<span class="reserve-value">{{ item.enterpriseName || '-' }}</span> |
||||
|
</div> |
||||
|
<div class="reserve-row"> |
||||
|
<span class="reserve-label">检查时间</span> |
||||
|
<span class="reserve-value">{{ item.checkTime || '-' }}</span> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</van-list> |
||||
|
</van-pull-refresh> |
||||
|
</div> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script setup name="enforcementReserveList"> |
||||
|
import { ref, onMounted } from 'vue'; |
||||
|
import { useRouter } from 'vue-router'; |
||||
|
|
||||
|
const router = useRouter(); |
||||
|
|
||||
|
const reserveList = ref([]); |
||||
|
const loading = ref(false); |
||||
|
const finished = ref(false); |
||||
|
const refreshing = ref(false); |
||||
|
|
||||
|
const fetchReserveList = () => { |
||||
|
loading.value = true; |
||||
|
setTimeout(() => { |
||||
|
const mockData = [ |
||||
|
{ |
||||
|
time: '2026-02-19 16:20', |
||||
|
enterpriseName: '深圳市新粤云有限公司', |
||||
|
reserveUnit: '深圳市生态环境局', |
||||
|
checkTime: '2026-02-20 上午' |
||||
|
}, |
||||
|
{ |
||||
|
time: '2026-03-20 15:23', |
||||
|
enterpriseName: '深圳市新粤云有限公司', |
||||
|
enforcementUnit: '深圳市生态环境局', |
||||
|
checkTime: '2026-04-21 上午' |
||||
|
}, |
||||
|
{ |
||||
|
time: '2026-04-18 10:23', |
||||
|
enterpriseName: '深圳市新粤云有限公司', |
||||
|
enforcementUnit: '深圳市生态环境局', |
||||
|
checkTime: '2026-04-20 上午' |
||||
|
} |
||||
|
]; |
||||
|
reserveList.value = mockData; |
||||
|
loading.value = false; |
||||
|
finished.value = true; |
||||
|
refreshing.value = false; |
||||
|
}, 500); |
||||
|
}; |
||||
|
|
||||
|
const onLoad = () => { |
||||
|
if (loading.value || finished.value) return; |
||||
|
fetchReserveList(); |
||||
|
}; |
||||
|
|
||||
|
const onRefresh = () => { |
||||
|
finished.value = false; |
||||
|
fetchReserveList(); |
||||
|
}; |
||||
|
|
||||
|
onMounted(() => { |
||||
|
fetchReserveList(); |
||||
|
}); |
||||
|
</script> |
||||
|
|
||||
|
<style lang="less" scoped> |
||||
|
.reserve-list-page { |
||||
|
display: flex; |
||||
|
flex-direction: column; |
||||
|
height: 100%; |
||||
|
background: #f5f5f5; |
||||
|
} |
||||
|
|
||||
|
.content-area { |
||||
|
flex: 1; |
||||
|
overflow-y: auto; |
||||
|
padding: 12px; |
||||
|
} |
||||
|
|
||||
|
.reserve-item { |
||||
|
margin-bottom: 16px; |
||||
|
} |
||||
|
|
||||
|
.reserve-time { |
||||
|
font-size: 12px; |
||||
|
color: #999; |
||||
|
margin-bottom: 8px; |
||||
|
padding-left: 8px; |
||||
|
} |
||||
|
|
||||
|
.reserve-card { |
||||
|
background: #fff; |
||||
|
border-radius: 12px; |
||||
|
padding: 12px 16px; |
||||
|
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04); |
||||
|
} |
||||
|
|
||||
|
.card-header { |
||||
|
margin-bottom: 8px; |
||||
|
} |
||||
|
|
||||
|
.reserve-type { |
||||
|
font-size: 14px; |
||||
|
font-weight: 600; |
||||
|
color: #333; |
||||
|
padding: 8px 0; |
||||
|
} |
||||
|
|
||||
|
.card-body { |
||||
|
padding-left: 4px; |
||||
|
} |
||||
|
|
||||
|
.reserve-row { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
margin-bottom: 10px; |
||||
|
|
||||
|
&:last-child { |
||||
|
margin-bottom: 0; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.reserve-label { |
||||
|
font-size: 13px; |
||||
|
color: #666; |
||||
|
min-width: 60px; |
||||
|
flex-shrink: 0; |
||||
|
} |
||||
|
|
||||
|
.reserve-value { |
||||
|
font-size: 13px; |
||||
|
color: #333; |
||||
|
flex: 1; |
||||
|
} |
||||
|
</style> |
||||
@ -0,0 +1,170 @@ |
|||||
|
<template> |
||||
|
<div class="task-list-page app_content"> |
||||
|
<!-- <van-nav-bar title="执法任务" left-arrow @click-left="goBack" /> --> |
||||
|
<div class="content-area"> |
||||
|
<van-pull-refresh v-model="refreshing" @refresh="onRefresh"> |
||||
|
<van-list v-model:loading="loading" :finished="finished" finished-text="" |
||||
|
@load="onLoad" :offset="50"> |
||||
|
<van-empty v-if="finished && taskList.length === 0" description="暂无任务" /> |
||||
|
<div v-for="(item, index) in taskList" :key="index" class="task-item"> |
||||
|
<div class="task-time">{{ item.time }}</div> |
||||
|
<div class="task-card"> |
||||
|
<!-- <div class="card-header"> |
||||
|
<span class="task-type">待执行任务:</span> |
||||
|
</div> --> |
||||
|
<div class="task-type">待执行任务:</div> |
||||
|
<div class="card-body"> |
||||
|
<div class="task-row"> |
||||
|
<span class="task-label">企业名称</span> |
||||
|
<span class="task-value">{{ item.enterpriseName || '-' }}</span> |
||||
|
</div> |
||||
|
<div class="task-row"> |
||||
|
<span class="task-label">检查时间</span> |
||||
|
<span class="task-value">{{ item.checkTime || '-' }}</span> |
||||
|
</div> |
||||
|
<div class="task-row"> |
||||
|
<span class="task-label">执法事项</span> |
||||
|
<span class="task-value">{{ item.enforcementItem || '-' }}</span> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</van-list> |
||||
|
</van-pull-refresh> |
||||
|
</div> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script setup name="enforcementTaskList"> |
||||
|
import { ref, onMounted } from 'vue'; |
||||
|
import { useRouter } from 'vue-router'; |
||||
|
|
||||
|
const router = useRouter(); |
||||
|
|
||||
|
const taskList = ref([]); |
||||
|
const loading = ref(false); |
||||
|
const finished = ref(false); |
||||
|
const refreshing = ref(false); |
||||
|
const pageNum = ref(1); |
||||
|
const pageSize = ref(10); |
||||
|
|
||||
|
const goBack = () => { |
||||
|
router.back(); |
||||
|
}; |
||||
|
|
||||
|
const fetchTaskList = () => { |
||||
|
loading.value = true; |
||||
|
setTimeout(() => { |
||||
|
const mockData = [ |
||||
|
{ |
||||
|
time: '2026-02-19 16:20', |
||||
|
enterpriseName: '深圳市新粤云有限公司', |
||||
|
checkTime: '2026-02-20 上午', |
||||
|
enforcementItem: '日常检查' |
||||
|
}, |
||||
|
{ |
||||
|
time: '2026-03-20 14:20', |
||||
|
enterpriseName: '深圳市新粤云有限公司', |
||||
|
checkTime: '2026-03-04 上午', |
||||
|
enforcementItem: '日常检查' |
||||
|
}, |
||||
|
{ |
||||
|
time: '2026-4-19 15:20', |
||||
|
enterpriseName: '深圳市新粤云有限公司', |
||||
|
checkTime: '2026-04-20 上午', |
||||
|
enforcementItem: '日常检查' |
||||
|
} |
||||
|
]; |
||||
|
taskList.value = mockData; |
||||
|
loading.value = false; |
||||
|
finished.value = true; |
||||
|
refreshing.value = false; |
||||
|
}, 500); |
||||
|
}; |
||||
|
|
||||
|
const onLoad = () => { |
||||
|
if (loading.value || finished.value) return; |
||||
|
fetchTaskList(); |
||||
|
}; |
||||
|
|
||||
|
const onRefresh = () => { |
||||
|
pageNum.value = 1; |
||||
|
finished.value = false; |
||||
|
fetchTaskList(); |
||||
|
}; |
||||
|
|
||||
|
onMounted(() => { |
||||
|
fetchTaskList(); |
||||
|
}); |
||||
|
</script> |
||||
|
|
||||
|
<style lang="less" scoped> |
||||
|
.task-list-page { |
||||
|
display: flex; |
||||
|
flex-direction: column; |
||||
|
height: 100%; |
||||
|
background: #f5f5f5; |
||||
|
} |
||||
|
|
||||
|
.content-area { |
||||
|
flex: 1; |
||||
|
overflow-y: auto; |
||||
|
padding: 12px; |
||||
|
} |
||||
|
|
||||
|
.task-item { |
||||
|
margin-bottom: 16px; |
||||
|
} |
||||
|
|
||||
|
.task-time { |
||||
|
font-size: 12px; |
||||
|
color: #999; |
||||
|
margin-bottom: 8px; |
||||
|
padding-left: 8px; |
||||
|
} |
||||
|
|
||||
|
.task-card { |
||||
|
background: #fff; |
||||
|
border-radius: 12px; |
||||
|
padding: 12px 16px; |
||||
|
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04); |
||||
|
} |
||||
|
|
||||
|
.card-header { |
||||
|
margin-bottom: 8px; |
||||
|
} |
||||
|
|
||||
|
.task-type { |
||||
|
font-size: 14px; |
||||
|
font-weight: 600; |
||||
|
color: #333; |
||||
|
padding: 8px 0; |
||||
|
} |
||||
|
|
||||
|
.card-body { |
||||
|
padding-left: 4px; |
||||
|
} |
||||
|
|
||||
|
.task-row { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
margin-bottom: 10px; |
||||
|
|
||||
|
&:last-child { |
||||
|
margin-bottom: 0; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
.task-label { |
||||
|
font-size: 13px; |
||||
|
color: #666; |
||||
|
min-width: 60px; |
||||
|
flex-shrink: 0; |
||||
|
} |
||||
|
|
||||
|
.task-value { |
||||
|
font-size: 13px; |
||||
|
color: #333; |
||||
|
flex: 1; |
||||
|
} |
||||
|
</style> |
||||
Loading…
Reference in new issue