<!-- 统一审批:业务摘要 -->
|
<template>
|
<el-descriptions :column="2" border>
|
<el-descriptions-item label="业务单号">{{ row.bizId || row.id || "—" }}</el-descriptions-item>
|
<el-descriptions-item label="审批状态">
|
<el-tag :type="approvalStatusTagType(row.approvalStatus)" size="small" effect="plain">
|
{{ approvalStatusLabel(row.approvalStatus) }}
|
</el-tag>
|
</el-descriptions-item>
|
<el-descriptions-item label="审批类型">
|
<span class="approve-type-cell" :style="approvalTypeStyle(row.approvalType)">
|
{{ approvalTypeLabel(row.approvalType) }}
|
</span>
|
</el-descriptions-item>
|
<el-descriptions-item label="审批方式">
|
<span class="approval-method-text">{{ approvalModeLabel(row.approvalMode) }}</span>
|
</el-descriptions-item>
|
<el-descriptions-item label="申请人编号">{{ row.applicantNo || "—" }}</el-descriptions-item>
|
<el-descriptions-item label="申请人名称">{{ row.applicantName || "—" }}</el-descriptions-item>
|
<el-descriptions-item label="申请摘要" :span="2">{{ row.summary || "—" }}</el-descriptions-item>
|
<el-descriptions-item v-if="row.rejectReason" label="驳回原因" :span="2">
|
<span class="reject-text">{{ row.rejectReason }}</span>
|
</el-descriptions-item>
|
<el-descriptions-item label="创建时间" :span="2">{{ row.createTime || "—" }}</el-descriptions-item>
|
</el-descriptions>
|
|
<template v-if="extraFields.length">
|
<el-divider content-position="left">填报内容</el-divider>
|
<el-descriptions :column="2" border size="small">
|
<el-descriptions-item v-for="item in extraFields" :key="item.key" :label="item.label">
|
{{ item.display }}
|
</el-descriptions-item>
|
</el-descriptions>
|
</template>
|
</template>
|
|
<script setup>
|
import { computed } from "vue";
|
import {
|
approvalTypeLabel,
|
approvalTypeStyle,
|
approvalModeLabel,
|
approvalStatusLabel,
|
approvalStatusTagType,
|
SUBMIT_TEMPLATES,
|
} from "../approveListConstants.js";
|
|
const props = defineProps({
|
row: { type: Object, default: () => ({}) },
|
});
|
|
const extraFields = computed(() => {
|
const payload = props.row?.formPayload || {};
|
const tpl = Object.values(SUBMIT_TEMPLATES).find((t) => t.approvalType === props.row?.approvalType);
|
if (!tpl?.fields?.length) {
|
return Object.keys(payload)
|
.filter((k) => k !== "summary" && payload[k] != null && payload[k] !== "")
|
.map((k) => ({ key: k, label: k, display: formatValue(payload[k]) }));
|
}
|
return tpl.fields
|
.map((f) => {
|
const val = payload[f.key];
|
if (val == null || val === "" || (Array.isArray(val) && !val.length)) return null;
|
let display = formatValue(val);
|
if (f.type === "select" && f.options) {
|
display = f.options.find((o) => o.value === val)?.label || display;
|
}
|
return { key: f.key, label: f.label, display };
|
})
|
.filter(Boolean);
|
});
|
|
function formatValue(val) {
|
if (Array.isArray(val)) return val.join(" 至 ");
|
return String(val);
|
}
|
</script>
|
|
<style scoped>
|
.approve-type-cell {
|
display: inline-block;
|
padding: 2px 10px;
|
border-radius: 4px;
|
font-size: 13px;
|
line-height: 1.5;
|
}
|
.approval-method-text {
|
color: var(--el-color-danger);
|
font-weight: 500;
|
}
|
.reject-text {
|
color: var(--el-color-danger);
|
}
|
</style>
|