10 changed files with 712 additions and 35 deletions
@ -1,11 +1,417 @@ |
|||
<script setup> |
|||
<template> |
|||
<div class="registration-list-page"> |
|||
<!-- 搜索栏 --> |
|||
<van-search |
|||
v-model="searchText" |
|||
show-action |
|||
placeholder="请输入关键字查询" |
|||
clearable |
|||
clear-trigger="always" |
|||
@clear="onClear" |
|||
@search="onSearch" |
|||
> |
|||
<template #action> |
|||
<div @click="onSearch">搜索</div> |
|||
</template> |
|||
</van-search> |
|||
|
|||
</script> |
|||
<!-- 日期快捷筛选按钮 --> |
|||
<div class="search-button-list"> |
|||
<van-button plain hairline :class="dateType === null ? 'search-btn active' : 'search-btn'" |
|||
@click="searchDateType(null)" round type="primary" size="mini">全部</van-button> |
|||
<van-button plain hairline :class="dateType === 1 ? 'search-btn active' : 'search-btn'" |
|||
@click="searchDateType(1)" round type="primary" size="mini">本月</van-button> |
|||
<van-button plain hairline :class="dateType === 2 ? 'search-btn active' : 'search-btn'" |
|||
@click="searchDateType(2)" round type="primary" size="mini">本季</van-button> |
|||
<van-button plain hairline :class="dateType === 3 ? 'search-btn active' : 'search-btn'" |
|||
@click="searchDateType(3)" round type="primary" size="mini">本年</van-button> |
|||
<van-button plain hairline :class="dateType === 9 ? 'search-btn active' : 'search-btn'" |
|||
@click="openDatePicker" round type="primary" size="mini">筛选</van-button> |
|||
</div> |
|||
|
|||
<template> |
|||
<!-- 指定月份显示 --> |
|||
<div class="search-date-display" v-show="dateShow"> |
|||
<span class="date-label" @click="openDatePicker">{{ dateSearchDisplay }}</span> |
|||
</div> |
|||
|
|||
<!-- 月份选择器弹出层 --> |
|||
<van-popup v-model:show="showDatePicker" position="bottom"> |
|||
<van-date-picker |
|||
title="选择月度" |
|||
v-model="currentDate" |
|||
:min-date="minDate" |
|||
:max-date="maxDate" |
|||
:columns-type="['year', 'month']" |
|||
@confirm="onDateConfirm" |
|||
@cancel="showDatePicker = false" |
|||
/> |
|||
</van-popup> |
|||
|
|||
<!-- 可滚动列表区域 --> |
|||
<div class="list-container"> |
|||
<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 && list.length === 0" description="暂无数据" /> |
|||
|
|||
<!-- 列表项 --> |
|||
<div class="card-item" v-for="item in list" :key="item.id"> |
|||
<div class="card-header"> |
|||
<span class="card-time">执法时间:{{ formatDate(item.enforcementTime) }}</span> |
|||
<span class="joint-mark" v-if="item.hasUnion === 1">联</span> |
|||
</div> |
|||
<div class="card-divider"></div> |
|||
<div class="card-body" @click="toDetailView(item.id)"> |
|||
<div class="card-title">{{ item.lawEnforcementItemText || '-' }}</div> |
|||
<div class="card-row"> |
|||
<span class="card-label">执法单位:</span> |
|||
<span>{{ item.bureauDeptName || '-' }}</span> |
|||
</div> |
|||
<div class="card-row"> |
|||
<span class="card-label">执法人员:</span> |
|||
<span class="enforcer-block"> |
|||
<span>{{ item.lawEnforcerDisplay || item.lawEnforcer || '-' }}</span> |
|||
<span v-for="(name, idx) in (item.lawEnforcer2List || [])" :key="idx">{{ name }}</span> |
|||
</span> |
|||
</div> |
|||
<div class="card-row"> |
|||
<span class="card-label">执法类别:</span> |
|||
<span>{{ item.lawEnforceCategoryText || '-' }}</span> |
|||
</div> |
|||
</div> |
|||
<!-- 评价按钮 --> |
|||
<div class="card-actions" v-if="item.outTimeDayNum != null && item.outTimeDayNum <= 5 && item.isEvaluate === 0"> |
|||
<a @click.stop="toEvaluate(item.id, item.lawEnforcementItemText)"> |
|||
<van-icon name="flower-o" /> 评价 |
|||
</a> |
|||
</div> |
|||
</div> |
|||
</van-list> |
|||
</van-pull-refresh> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
|
|||
<style scoped lang="less"> |
|||
<script setup name="enforcementRegistrationList"> |
|||
import { getEnterpriseEnforcementRegistrationList } from '@/api/enterprise'; |
|||
import { showToast } from 'vant'; |
|||
import 'vant/es/toast/style'; |
|||
|
|||
const { useCommon } = $globalStore; |
|||
const router = useRouter(); |
|||
|
|||
// ========== 列表状态 ========== |
|||
const list = ref([]); |
|||
const loading = ref(false); |
|||
const finished = ref(false); |
|||
const refreshing = ref(false); |
|||
const searchText = ref(''); |
|||
|
|||
// ========== 分页参数 ========== |
|||
const pageNum = ref(1); |
|||
const pageSize = ref(10); |
|||
|
|||
// ========== 日期筛选 ========== |
|||
const dateType = ref(null); |
|||
const dateSearch = ref(null); |
|||
const dateSearchDisplay = ref(''); |
|||
const dateShow = ref(false); |
|||
const showDatePicker = ref(false); |
|||
const currentDate = ref(['2026', '01']); |
|||
const minDate = new Date(2020, 0, 1); |
|||
const maxDate = new Date(2030, 11, 31); |
|||
|
|||
// ========== 格式化日期 ========== |
|||
const formatDate = (dateStr) => { |
|||
if (!dateStr) return '-'; |
|||
const d = new Date(dateStr); |
|||
const y = d.getFullYear(); |
|||
const m = String(d.getMonth() + 1).padStart(2, '0'); |
|||
const day = String(d.getDate()).padStart(2, '0'); |
|||
return `${y}-${m}-${day}`; |
|||
}; |
|||
|
|||
// ========== 加载数据 ========== |
|||
const fetchList = () => { |
|||
const params = { |
|||
pageNum: pageNum.value, |
|||
pageSize: pageSize.value, |
|||
enterpriseNumber: useCommon.enterpriseNumber, |
|||
}; |
|||
// 关键字搜索 |
|||
if (searchText.value) { |
|||
params.searchValue = searchText.value; |
|||
} |
|||
// 日期类型 |
|||
if (dateType.value != null && dateType.value !== 9) { |
|||
params.dateType = dateType.value; |
|||
} |
|||
// 指定月份 |
|||
if (dateSearch.value) { |
|||
params.dateSearch = dateSearch.value; |
|||
} |
|||
|
|||
getEnterpriseEnforcementRegistrationList(params, (res) => { |
|||
if (res.code === 200) { |
|||
const rows = res.rows || []; |
|||
const total = res.total || 0; |
|||
|
|||
if (refreshing.value) { |
|||
list.value = rows; |
|||
refreshing.value = false; |
|||
} else { |
|||
list.value = [...list.value, ...rows]; |
|||
} |
|||
|
|||
if (list.value.length >= total) { |
|||
finished.value = true; |
|||
} |
|||
loading.value = false; |
|||
} else { |
|||
loading.value = false; |
|||
finished.value = true; |
|||
showToast(res.msg || '加载失败'); |
|||
} |
|||
}, () => { |
|||
loading.value = false; |
|||
finished.value = true; |
|||
refreshing.value = false; |
|||
showToast('网络请求失败'); |
|||
}); |
|||
}; |
|||
|
|||
// ========== 触底加载更多 ========== |
|||
const onLoad = () => { |
|||
if (refreshing.value) return; |
|||
fetchList(); |
|||
pageNum.value++; |
|||
}; |
|||
|
|||
// ========== 下拉刷新 ========== |
|||
const onRefresh = () => { |
|||
pageNum.value = 1; |
|||
finished.value = false; |
|||
loading.value = true; |
|||
fetchList(); |
|||
pageNum.value++; |
|||
}; |
|||
|
|||
// ========== 搜索 ========== |
|||
const onSearch = () => { |
|||
pageNum.value = 1; |
|||
list.value = []; |
|||
finished.value = false; |
|||
loading.value = true; |
|||
fetchList(); |
|||
pageNum.value++; |
|||
}; |
|||
|
|||
// ========== 清空搜索 ========== |
|||
const onClear = () => { |
|||
searchText.value = ''; |
|||
onSearch(); |
|||
}; |
|||
|
|||
// ========== 日期类型切换 ========== |
|||
const searchDateType = (val) => { |
|||
dateType.value = val; |
|||
dateSearch.value = null; |
|||
dateShow.value = false; |
|||
onSearch(); |
|||
}; |
|||
|
|||
// ========== 打开月份选择器 ========== |
|||
const openDatePicker = () => { |
|||
dateType.value = 9; |
|||
showDatePicker.value = true; |
|||
}; |
|||
|
|||
// ========== 月份选择确认 ========== |
|||
const onDateConfirm = (value) => { |
|||
const year = value.selectedValues[0]; |
|||
const month = value.selectedValues[1]; |
|||
dateSearchDisplay.value = year + '/' + month; |
|||
dateSearch.value = year + '-' + month; |
|||
dateType.value = 9; |
|||
dateShow.value = true; |
|||
showDatePicker.value = false; |
|||
onSearch(); |
|||
}; |
|||
|
|||
// ========== 跳转详情 ========== |
|||
const toDetailView = (id) => { |
|||
router.push({ |
|||
path: '/registrationDetail', |
|||
query: { id } |
|||
}); |
|||
}; |
|||
|
|||
// ========== 跳转评价 ========== |
|||
const toEvaluate = (id, checkItem) => { |
|||
router.push({ |
|||
path: '/evaluate', |
|||
query: { |
|||
isSelect: false, |
|||
id, |
|||
lawEnforcementItemText: checkItem, |
|||
} |
|||
}); |
|||
}; |
|||
</script> |
|||
|
|||
<style lang="less" scoped> |
|||
.registration-list-page { |
|||
display: flex; |
|||
flex-direction: column; |
|||
height: 100%; |
|||
background-color: #ebf3fb; |
|||
|
|||
.list-container { |
|||
flex: 1; |
|||
overflow-y: auto; |
|||
padding: 0 0.27rem; |
|||
} |
|||
} |
|||
|
|||
/* ===== 搜索按钮行 ===== */ |
|||
.search-button-list { |
|||
display: flex; |
|||
flex-direction: row; |
|||
padding: 0.2rem 0.27rem 0; |
|||
gap: 0.15rem; |
|||
|
|||
.search-btn { |
|||
flex: 1; |
|||
height: 0.7rem; |
|||
background: #ebebeb; |
|||
border-color: #ebebeb; |
|||
color: #999; |
|||
font-size: 0.3rem; |
|||
} |
|||
|
|||
.search-btn.active { |
|||
background-color: #d9e6fd; |
|||
border-color: #75a5fb; |
|||
color: #1367fe; |
|||
} |
|||
} |
|||
|
|||
/* ===== 日期显示 ===== */ |
|||
.search-date-display { |
|||
padding: 0.15rem 0.27rem 0; |
|||
.date-label { |
|||
color: #c1bfbf; |
|||
font-size: 0.4rem; |
|||
} |
|||
} |
|||
|
|||
/* ===== 卡片样式 ===== */ |
|||
.card-item { |
|||
background: #fff; |
|||
border-radius: 0.2rem; |
|||
margin-top: 0.27rem; |
|||
padding: 0.2rem 0.3rem; |
|||
position: relative; |
|||
} |
|||
|
|||
.card-header { |
|||
display: flex; |
|||
justify-content: space-between; |
|||
align-items: center; |
|||
.card-time { |
|||
color: #c1bfbf; |
|||
font-size: 0.32rem; |
|||
} |
|||
} |
|||
|
|||
.joint-mark { |
|||
display: inline-block; |
|||
width: 0.5rem; |
|||
height: 0.5rem; |
|||
background: #2d94fa; |
|||
border-radius: 50%; |
|||
color: #fff; |
|||
font-size: 0.3rem; |
|||
line-height: 0.5rem; |
|||
text-align: center; |
|||
} |
|||
|
|||
.card-divider { |
|||
height: 1px; |
|||
background: #f4f5f6; |
|||
margin: 0.15rem 0; |
|||
} |
|||
|
|||
.card-body { |
|||
.card-title { |
|||
font-size: 0.4rem; |
|||
font-weight: bold; |
|||
color: #000; |
|||
margin-bottom: 0.15rem; |
|||
white-space: nowrap; |
|||
overflow: hidden; |
|||
text-overflow: ellipsis; |
|||
} |
|||
|
|||
.card-row { |
|||
display: flex; |
|||
font-size: 0.35rem; |
|||
color: #666; |
|||
line-height: 1.6; |
|||
|
|||
.card-label { |
|||
color: #323233; |
|||
white-space: nowrap; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.enforcer-block { |
|||
display: flex; |
|||
flex-direction: column; |
|||
} |
|||
|
|||
.card-actions { |
|||
display: flex; |
|||
justify-content: flex-end; |
|||
border-top: 1px solid #f4f5f6; |
|||
margin-top: 0.2rem; |
|||
padding-top: 0.15rem; |
|||
|
|||
a { |
|||
font-size: 0.35rem; |
|||
color: #1367fe; |
|||
white-space: nowrap; |
|||
} |
|||
|
|||
a i { |
|||
margin-right: 0.1rem; |
|||
font-size: 0.4rem; |
|||
} |
|||
} |
|||
|
|||
/* ===== Vant 搜索框样式覆盖 ===== */ |
|||
:deep(.van-search__content) { |
|||
height: 0.9rem; |
|||
border: 1px solid #ececec; |
|||
border-radius: 0.15rem 0 0 0.15rem; |
|||
} |
|||
|
|||
:deep(.van-search__action) { |
|||
margin: 0 3% 0 0; |
|||
width: 10%; |
|||
height: 0.9rem; |
|||
background: #1367fe; |
|||
border: 0.01rem solid #1367fe; |
|||
border-radius: 0 0.15rem 0.15rem 0; |
|||
color: #fff; |
|||
text-align: center; |
|||
line-height: 0.9rem; |
|||
} |
|||
</style> |
|||
|
|||
Loading…
Reference in new issue