You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

430 lines
16 KiB

<template>
<div class="detail-page">
<van-nav-bar :title="pageTitle" left-arrow @click-left="onClickLeft" />
<div class="detail-content">
<!-- 执法信息 -->
<div class="info-card" v-if="hasLawDetail">
<div class="card-title">执法信息</div>
<div class="info-row">
<span class="info-label">执法单位</span>
<span class="info-value">{{ lawDetail.bureauDeptName }}</span>
</div>
<div class="info-row">
<span class="info-label">执法人员</span>
<div class="info-value-block">
<div>{{ lawDetail.lawEnforcer }},{{ lawDetail.lawEnforcerId }}</div>
<div>{{ lawDetail.lawEnforcerTwo }},{{ lawDetail.lawEnforcerIdTwo }}</div>
</div>
</div>
<div class="info-row">
<span class="info-label">执法类别</span>
<span class="info-value">{{ lawDetail.lawEnforceCategoryText }}</span>
</div>
<div class="info-row">
<span class="info-label">任务来源</span>
<span class="info-value">{{ taskSourceText }}</span>
</div>
<div class="info-row">
<span class="info-label">执法事项</span>
<span class="info-value">{{ lawDetail.lawEnforcementItemText }}</span>
</div>
<div class="info-row">
<span class="info-label">执法时间</span>
<span class="info-value">{{ lawDetail.enforcementTime }}</span>
</div>
<div class="info-row">
<span class="info-label">受委托执法</span>
<span class="info-value">{{ lawDetail.hasAuto === '1' ? '是' : '否' }}</span>
</div>
<div class="info-row">
<span class="info-label">委托行政机关</span>
<span class="info-value">{{ lawDetail.entrustDeptName }}</span>
</div>
<div class="info-row">
<span class="info-label">附件</span>
<div class="info-value attachment-list">
<img v-for="(f, idx) in attachmentList" :key="idx" :src="f.url" class="attachment-img"
@click="previewImage(idx)" />
<span v-if="!attachmentList.length">-</span>
</div>
</div>
</div>
<!-- 行政检查案件信息 -->
<div v-if="category === '1'" class="info-card">
<div class="card-title">案件信息</div>
<div class="info-row">
<span class="info-label">案件名称</span>
<span class="info-value">{{ caseDetail.caseName }}</span>
</div>
<div class="info-row">
<span class="info-label">行政当事人类型</span>
<span class="info-value">{{ partyTypeText }}</span>
</div>
<div class="info-row">
<span class="info-label">行政检查决定书名称</span>
<span class="info-value">{{ caseDetail.decisionDocumentName }}</span>
</div>
<div class="info-row">
<span class="info-label">行政检查决定书文号</span>
<span class="info-value">{{ caseDetail.decisionDocumentNumber }}</span>
</div>
<div class="info-row">
<span class="info-label">行政检查类型</span>
<span class="info-value">{{ caseDetail.administrativeCheckTypeName }}</span>
</div>
<div class="info-row">
<span class="info-label">检查结果日期</span>
<span class="info-value">{{ caseDetail.decisionDate }}</span>
</div>
<div class="info-row">
<span class="info-label">行政检查内容</span>
<span class="info-value">{{ caseDetail.content }}</span>
</div>
<div class="info-row">
<span class="info-label">行政检查结果</span>
<span class="info-value">{{ administrativeCheckResultText }}</span>
</div>
<div class="info-row">
<span class="info-label">行政检查决定</span>
<span class="info-value">{{ caseDetail.administrativeCheckDecision }}</span>
</div>
<div class="info-row">
<span class="info-label">执法主体名称</span>
<span class="info-value">{{ caseDetail.lawEnforcementSubjectName }}</span>
</div>
<div class="info-row">
<span class="info-label">备注</span>
<span class="info-value">{{ caseDetail.remark }}</span>
</div>
</div>
<!-- 行政处罚/行政强制案件信息 -->
<div v-else class="info-card">
<div class="card-title">案件信息</div>
<div class="info-row">
<span class="info-label">案件名称</span>
<span class="info-value">{{ caseDetail.caseName }}</span>
</div>
<div class="info-row">
<span class="info-label">行政当事人类型</span>
<span class="info-value">{{ partyTypeText }}</span>
</div>
<div class="info-row" v-if="category === '4'">
<span class="info-label">行政强制类型</span>
<span class="info-value">{{ enforcementTypeText }}</span>
</div>
<div class="info-row">
<span class="info-label">决定文书名称</span>
<span class="info-value">{{ caseDetail.decisionDocumentName }}</span>
</div>
<div class="info-row">
<span class="info-label">决定文书号</span>
<span class="info-value">{{ caseDetail.decisionDocumentNumber }}</span>
</div>
<div class="info-row">
<span class="info-label">{{ category === '2' ? '违法事实' : '行政强制措施理由' }}</span>
<span class="info-value">{{ category === '2' ? caseDetail.fact : caseDetail.enforcementReason }}</span>
</div>
<div class="info-row">
<span class="info-label">{{ category === '2' ? '处罚依据' : '行政强制措施依据' }}</span>
<span class="info-value">{{ category === '2' ? caseDetail.penaltyBasis : caseDetail.basis }}</span>
</div>
<div class="info-row" v-if="category === '4'">
<span class="info-label">强制所示内容</span>
<span class="info-value">{{ caseDetail.content }}</span>
</div>
<div class="info-row" v-if="category === '2'">
<span class="info-label">处罚类型</span>
<span class="info-value">{{ penaltyCategoryText }}</span>
</div>
<div class="info-row" v-if="category === '2'">
<span class="info-label">处罚内容</span>
<span class="info-value">{{ caseDetail.content }}</span>
</div>
<div class="info-row" v-if="category === '2'">
<span class="info-label">罚款金额(万元)</span>
<span class="info-value">{{ caseDetail.penaltyAmount }}</span>
</div>
<div class="info-row" v-if="category === '2'">
<span class="info-label">没收违法所得、没收非法财物的金额(万元)</span>
<span class="info-value">{{ caseDetail.collectionAmount }}</span>
</div>
<div class="info-row">
<span class="info-label">{{ category === '2' ? '处罚决定日期' : '强制措施决定日期' }}</span>
<span class="info-value">{{ caseDetail.decisionDate }}</span>
</div>
<div class="info-row">
<span class="info-label">执法主体名称</span>
<span class="info-value">{{ caseDetail.lawEnforcementSubjectName }}</span>
</div>
<div class="info-row">
<span class="info-label">备注</span>
<span class="info-value">{{ caseDetail.remark }}</span>
</div>
</div>
</div>
</div>
</template>
<script setup name="registrationDetail">
import { getLawDetail, getLawCaseDetail } from '@/api/enterprise';
import { loadDict, getDictText } from '@/util/dictUtil';
import { fileUrl } from '@/config/env';
import { showToast, showImagePreview } from 'vant';
import 'vant/es/toast/style';
import 'vant/es/image-preview/style';
const router = useRouter();
const route = useRoute();
const id = route.query.id;
const lawEnforcementType = String(route.query.lawEnforcementType || '1');
const category = String(route.query.category || '1');
// 预加载任务来源字典(用于翻译 detail.taskSource)
const taskSourceLoaded = ref(false);
loadDict('check_category', () => { taskSourceLoaded.value = true; });
// 任务来源翻译(响应式)
const taskSourceText = computed(() => {
void taskSourceLoaded.value;
return getDictText('check_category', lawDetail.value?.checkCategory);
});
// 预加载行政当事人类型字典(用于翻译 detail.partyType)
const partyTypeLoaded = ref(false);
loadDict('party_type', () => { partyTypeLoaded.value = true; });
// 行政当事人类型翻译(响应式)
const partyTypeText = computed(() => {
void partyTypeLoaded.value;
return getDictText('party_type', caseDetail.value?.partyType);
});
// 预加载处罚类型字典(用于翻译 caseDetail.penaltyCategory,支持多值逗号拼接)
const penaltyCategoryLoaded = ref(false);
loadDict('penalty_type', () => { penaltyCategoryLoaded.value = true; });
// 处罚类型翻译(响应式)
const penaltyCategoryText = computed(() => {
void penaltyCategoryLoaded.value;
return getMultiDictText('penalty_type', caseDetail.value?.penaltyCategory);
});
// 预加载行政强制类型字典(用于翻译 caseDetail.enforcementType)
const enforcementTypeLoaded = ref(false);
loadDict('admin_force_sub', () => { enforcementTypeLoaded.value = true; });
// 行政强制类型翻译(响应式,字典加载完成后自动更新)
const enforcementTypeText = computed(() => {
void enforcementTypeLoaded.value;
return getDictText('admin_force_sub', caseDetail.value?.enforcementType);
});
// 预加载行政检查结果字典(用于翻译 caseDetail.administrativeCheckResult)
const checkResultLoaded = ref(false);
loadDict('law_enf_check_result', () => { checkResultLoaded.value = true; });
// 行政检查结果翻译(响应式,字典加载完成后自动更新)
const administrativeCheckResultText = computed(() => {
void checkResultLoaded.value;
return getDictText('law_enf_check_result', caseDetail.value?.administrativeCheckResult);
});
// 多值字典翽译:按 中文/英文逗号、顿号、分号拆分,逐个查字典,再用逗号拼接
const getMultiDictText = (dictType, val) => {
if (val === undefined || val === null || val === '') return '-';
const arr = String(val).split(/[,,、;;]/).map(s => s.trim()).filter(Boolean);
if (!arr.length) return '-';
return arr.map(v => getDictText(dictType, v)).join(',');
};
// 附件列表:用后端文件服务地址 fileUrl 拼 uploadPath,得到完整绝对 URL
const attachmentList = computed(() => {
const list = Array.isArray(lawDetail.value?.fileList) ? lawDetail.value.fileList : [];
const base = (fileUrl || '').replace(/\/+$/, '');
return list
.filter(f => f && f.uploadPath)
.map(f => {
const path = f.uploadPath;
if (/^https?:\/\//i.test(path)) return { url: path };
const p = path.startsWith('/') ? path : '/' + path;
return { url: base + p };
});
});
// 图片预览
const previewImage = (startPosition) => {
showImagePreview({ images: attachmentList.value.map(f => f.url), startPosition });
};
const pageTitle = computed(() => {
const map = { '1': '行政检查详情', '2': '行政处罚详情', '4': '行政强制详情' };
return map[category] || '执法详情';
});
const hasLawDetail = computed(() => {
const detail = lawDetail.value;
return detail && Object.keys(detail).length > 0 && (
detail.bureauDeptName ||
detail.lawEnforcer ||
detail.lawEnforceCategoryText ||
detail.lawEnforcementItemText ||
detail.enforcementTime
);
});
// 执法类别文字映射
const getCategoryText = (val) => {
const map = { '1': '行政检查', '2': '行政处罚', '4': '行政强制' };
return map[String(val)] || '-';
};
// 详情数据拆分为两个 ref,避免两个接口同名字段互相覆盖
const lawDetail = ref({}); // 执法信息
const caseDetail = ref({}); // 案件信息
// 获取执法信息详情
const fetchLawDetail = () => {
getLawDetail({ id, lawEnforcementType }, (res) => {
if (res.code === 200) {
const data =res.data;
lawDetail.value = { ...data };
if (!lawDetail.value.lawEnforceCategoryText) {
lawDetail.value.lawEnforceCategoryText = getCategoryText(data.lawEnforcementType || category);
}
} else {
// showToast(res.msg || '执法信息加载失败');
}
}, () => {
// showToast('执法信息网络异常');
});
};
// 获取执法案件信息详情
const fetchLawCaseDetail = () => {
getLawCaseDetail({ id, lawEnforcementType }, (res) => {
if (res.code === 200) {
const data = res.data || {};
caseDetail.value = { ...data };
} else {
// showToast(res.msg || '案件信息加载失败');
}
}, () => {
// showToast('案件信息网络异常');
});
};
onMounted(() => {
if (!id) {
showToast('缺少详情id');
return;
}
fetchLawDetail();
fetchLawCaseDetail();
});
const onClickLeft = () => {
router.back();
};
</script>
<style lang="less" scoped>
.detail-page {
display: flex;
flex-direction: column;
height: 100%;
background-color: #fbfdff;
}
:deep(.van-nav-bar) {
background-color: #fff;
}
:deep(.van-nav-bar__title) {
font-size: 0.45rem;
font-weight: 600;
color: #333;
}
:deep(.van-nav-bar .van-icon) {
color: #333;
}
.detail-content {
flex: 1;
overflow-y: auto;
padding: 0.27rem;
}
.info-card {
background: #fff;
border-radius: 0.2rem;
margin-bottom: 0.27rem;
padding: 0.3rem;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
}
.card-title {
font-size: 0.4rem;
font-weight: 600;
color: #333;
margin-bottom: 0.25rem;
padding-bottom: 0.2rem;
border-bottom: 1px solid #f0f0f0;
}
.info-row {
display: flex;
align-items: flex-start;
padding: 0.2rem 0;
font-size: 0.32rem;
line-height: 1.5;
border-bottom: 1px solid #f8f8f8;
&:last-child {
border-bottom: none;
}
}
.info-label {
color: #666;
width: 3rem;
flex-shrink: 0;
}
.info-value {
color: #333;
flex: 1;
word-break: break-all;
}
.info-value-block {
color: #333;
flex: 1;
div {
line-height: 1.6;
}
}
.attachment-list {
display: flex;
flex-wrap: wrap;
gap: 0.15rem;
.attachment-img {
width: 1.6rem;
height: 1.6rem;
border-radius: 0.1rem;
object-fit: cover;
}
}
</style>