6 changed files with 2658 additions and 56 deletions
@ -0,0 +1,394 @@ |
|||||||
|
<template> |
||||||
|
<el-dialog title="详情" v-model="visible" width="60vw" :lock-scroll="false" destroy-on-close> |
||||||
|
<div style="min-height: 50vh" v-loading="loading"> |
||||||
|
<div class="row" style="margin: 0 60px"> |
||||||
|
<!-- ================== 基本信息(登记来件) ================== --> |
||||||
|
<div class="col col-12"> |
||||||
|
<label>来源</label> |
||||||
|
<span>{{ sourcePathText }}</span> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="col col-12"> |
||||||
|
<label>业务类别</label> |
||||||
|
<span>{{ dictLabel(dict?.businessType, base.businessTypeCode) }}</span> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="col col-12"> |
||||||
|
<label>编号</label> |
||||||
|
<span>{{ base.originId || "/" }}</span> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="col col-12"> |
||||||
|
<label>受理时间</label> |
||||||
|
<span>{{ base.discoveryTime ? dayjs(base.discoveryTime).format('YYYY-MM-DD HH:mm:ss') : '/' }}</span> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="col col-12"> |
||||||
|
<label>来件人姓名</label> |
||||||
|
<span>{{ base.responderName || "/" }}</span> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="col col-12"> |
||||||
|
<label>身份证号码</label> |
||||||
|
<span>{{ base.responderIdCode || "/" }}</span> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="col col-12"> |
||||||
|
<label>联系电话</label> |
||||||
|
<span>{{ base.responderPhone || "/" }}</span> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="col col-12"> |
||||||
|
<label>被投诉二级机构</label> |
||||||
|
<span>{{ base.secondDepartName || "/" }}</span> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="col col-12"> |
||||||
|
<label>涉嫌问题</label> |
||||||
|
<span>{{ suspectProblemText }}</span> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="col col-12"> |
||||||
|
<label>是否重复件</label> |
||||||
|
<span>{{ dictLabel(dict?.yesNo, base.repeatt) }}</span> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="col col-24"> |
||||||
|
<label>标签</label> |
||||||
|
<span>{{ tagText }}</span> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="col col-12"> |
||||||
|
<label>办理方式</label> |
||||||
|
<span>{{ dictLabel(dict?.BlameType, base.handleMethod) }}</span> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="col col-24"> |
||||||
|
<label>来件内容</label> |
||||||
|
<span class="content">{{ base.thingDesc || "/" }}</span> |
||||||
|
</div> |
||||||
|
|
||||||
|
<!-- ================== 核查情况(新增:放在基本信息后、涉及信息前) ================== --> |
||||||
|
<div class="col col-24 section-title"> |
||||||
|
<h5>核查情况</h5> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="col col-12"> |
||||||
|
<label>涉及案件/警情编号</label> |
||||||
|
<span>{{ base.caseNumber || "/" }}</span> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="col col-12"> |
||||||
|
<label>涉及单位</label> |
||||||
|
<span>{{ base.involveDepartName || "/" }}</span> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="col col-12"> |
||||||
|
<label>核查结论</label> |
||||||
|
<span>{{ base.checkStatusName || '/'}}</span> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="col col-12"> |
||||||
|
<label>涉及对象</label> |
||||||
|
<span>{{ dictLabel(dict?.accountabilityTarget, base.accountabilityTarget) }}</span> |
||||||
|
<!-- <span>{{ dictLabel(dict?.handleMethodType, base.accountabilityTarget ) }}</span>--> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="col col-12"> |
||||||
|
<label>问题核查情况 |
||||||
|
</label> |
||||||
|
<span>{{ base.checkStatusDesc }}</span> |
||||||
|
</div> |
||||||
|
<!-- ================== 涉及信息(人员/单位)(你上次要的那块,保持不变) ================== --> |
||||||
|
<div class="col col-24 section-title"> |
||||||
|
<h5>涉及单位</h5> |
||||||
|
</div> |
||||||
|
|
||||||
|
<template v-if="deptBlames.length"> |
||||||
|
<div class="col col-24 sub-title"> |
||||||
|
<strong>涉及班子成员</strong> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div |
||||||
|
class="col col-24 blame-card" |
||||||
|
v-for="(item, idx) in deptBlames" |
||||||
|
:key="item.id || item.blameEmpNo || idx" |
||||||
|
> |
||||||
|
<div class="row inner"> |
||||||
|
<div class="col col-12"> |
||||||
|
<label>姓名</label> |
||||||
|
<span>{{ item.blameName || "/" }}</span> |
||||||
|
</div> |
||||||
|
<div class="col col-12"> |
||||||
|
<label>警号</label> |
||||||
|
<span>{{ item.blameEmpNo || "/" }}</span> |
||||||
|
</div> |
||||||
|
<div class="col col-12"> |
||||||
|
<label>身份证号码</label> |
||||||
|
<span>{{ item.blameIdCode || "/" }}</span> |
||||||
|
</div> |
||||||
|
<div class="col col-12"> |
||||||
|
<label>人员属性</label> |
||||||
|
<span>{{ item.ivPersonTypeName || item.ivPersonType || "/" }}</span> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
<div class="col col-24" v-else> |
||||||
|
<label></label> |
||||||
|
<span>/</span> |
||||||
|
</div> |
||||||
|
|
||||||
|
<div class="col col-24 section-title"> |
||||||
|
<h5>涉及人员</h5> |
||||||
|
</div> |
||||||
|
|
||||||
|
<template v-if="personalBlames.length"> |
||||||
|
<div |
||||||
|
class="col col-24 blame-card" |
||||||
|
v-for="(item, idx) in personalBlames" |
||||||
|
:key="item.id || item.blameEmpNo || idx" |
||||||
|
> |
||||||
|
<div class="row inner"> |
||||||
|
<div class="col col-12"> |
||||||
|
<label>姓名</label> |
||||||
|
<span>{{ item.blameName || "/" }}</span> |
||||||
|
</div> |
||||||
|
<div class="col col-12"> |
||||||
|
<label>警号</label> |
||||||
|
<span>{{ item.blameEmpNo || "/" }}</span> |
||||||
|
</div> |
||||||
|
<div class="col col-12"> |
||||||
|
<label>身份证号码</label> |
||||||
|
<span>{{ item.blameIdCode || "/" }}</span> |
||||||
|
</div> |
||||||
|
<div class="col col-12"> |
||||||
|
<label>人员属性</label> |
||||||
|
<span>{{ item.ivPersonTypeName || item.ivPersonType || "/" }}</span> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
<div class="col col-24" v-else> |
||||||
|
<label></label> |
||||||
|
<span>/</span> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
|
||||||
|
<el-empty v-if="!loading && loaded && !detail?.id" description="未查询到详情数据" /> |
||||||
|
<el-empty v-if="!loading && !loaded && !id" description="未传入ID" /> |
||||||
|
</div> |
||||||
|
|
||||||
|
<template #footer> |
||||||
|
<div class="dialog-footer"> |
||||||
|
<el-button size="large" @click="visible = false">关闭</el-button> |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
</el-dialog> |
||||||
|
</template> |
||||||
|
|
||||||
|
<script setup> |
||||||
|
import { computed, ref, watch } from "vue"; |
||||||
|
import { ElMessage } from "element-plus"; |
||||||
|
import {watchDetail} from "@/api/data/complaintCollection.ts"; |
||||||
|
import dayjs from "dayjs"; |
||||||
|
|
||||||
|
const props = defineProps({ |
||||||
|
modelValue: { type: Boolean, default: false }, |
||||||
|
id: { type: [String, Number], default: "" }, |
||||||
|
dict: { type: Object, default: () => ({}) }, |
||||||
|
}); |
||||||
|
|
||||||
|
const emit = defineEmits(["update:modelValue"]); |
||||||
|
|
||||||
|
const visible = computed({ |
||||||
|
get: () => props.modelValue, |
||||||
|
set: (v) => emit("update:modelValue", v), |
||||||
|
}); |
||||||
|
|
||||||
|
const loading = ref(false); |
||||||
|
const loaded = ref(false); |
||||||
|
const detail = ref({}); |
||||||
|
|
||||||
|
/** ✅ 假设接口统一返回:detail = { ...baseFields, negative: { ...核查/涉及信息 } } */ |
||||||
|
const base = computed(() => detail.value || {}); |
||||||
|
const neg = computed(() => detail.value?.negative || detail.value?.neg || {}); |
||||||
|
|
||||||
|
function dictLabel(list, value) { |
||||||
|
if (!Array.isArray(list)) return "/"; |
||||||
|
if (value === undefined || value === null || value === "") return "/"; |
||||||
|
const hit = list.find((x) => String(x.dictValue) === String(value)); |
||||||
|
return hit?.dictLabel ?? "/"; |
||||||
|
} |
||||||
|
|
||||||
|
/** 来源展示:优先后端给的“全路径”,否则用 sourcePath 数组拼 */ |
||||||
|
const sourcePathText = computed(() => { |
||||||
|
if (base.value?.sourceTablePath) return base.value.sourceTablePath; |
||||||
|
if (Array.isArray(base.value?.sourcePath) && base.value.sourcePath.length) { |
||||||
|
return base.value.sourcePath.join(" / "); |
||||||
|
} |
||||||
|
return "/"; |
||||||
|
}); |
||||||
|
|
||||||
|
/** 涉嫌问题:involveProblemStr 优先,其次 involveProblemIdList -> 字典label */ |
||||||
|
const suspectProblemText = computed(() => { |
||||||
|
if (base.value?.involveProblemStr) return base.value.involveProblemStr; |
||||||
|
const ids = base.value?.involveProblemIdList; |
||||||
|
if (!Array.isArray(ids) || !ids.length) return "/"; |
||||||
|
const labels = ids |
||||||
|
.map((v) => dictLabel(props.dict?.suspectProblem, v)) |
||||||
|
.filter((x) => x && x !== "/"); |
||||||
|
return labels.length ? labels.join(",") : "/"; |
||||||
|
}); |
||||||
|
|
||||||
|
/** 标签:优先 tag(单值);其次 tags(数组/逗号串) */ |
||||||
|
const tagText = computed(() => { |
||||||
|
const v = base.value?.tag ?? base.value?.tags; |
||||||
|
if (!v) return "/"; |
||||||
|
if (!Array.isArray(v) && String(v).indexOf(",") === -1 && base.value?.tag !== undefined) { |
||||||
|
return dictLabel(props.dict?.tagList, v); |
||||||
|
} |
||||||
|
const arr = Array.isArray(v) ? v : String(v).split(","); |
||||||
|
const labels = arr |
||||||
|
.map((x) => dictLabel(props.dict?.tagList, x)) |
||||||
|
.filter((x) => x && x !== "/"); |
||||||
|
return labels.length ? labels.join(",") : "/"; |
||||||
|
}); |
||||||
|
|
||||||
|
/** 核查办理里的逻辑:problemIsTrue = checkStatusCode 为 1/2/3 :contentReference[oaicite:2]{index=2} */ |
||||||
|
const problemIsTrue = computed(() => ["1", "2", "3"].includes(String(neg.value?.checkStatusCode ?? ""))); |
||||||
|
|
||||||
|
/** 核查办理里的逻辑:整改限制显示条件(isRectify=NOT 且 checkStatusCode 1/2/3) :contentReference[oaicite:3]{index=3} |
||||||
|
* 你枚举里 IsRectify.NOT 是多少不确定,这里按你的模板写法:isRectifyCode === '0' 或 '2' 这类也可能是未整改 |
||||||
|
* 为了稳:用 “非真” 来判断,项目里你再对齐。 |
||||||
|
*/ |
||||||
|
const showRectifyRestrictionDays = computed(() => { |
||||||
|
const code = String(neg.value?.isRectifyCode ?? ""); |
||||||
|
const isNotRectify = code === "0" || code === "2" || code.toLowerCase() === "not"; |
||||||
|
return problemIsTrue.value && isNotRectify; |
||||||
|
}); |
||||||
|
|
||||||
|
/** 未整改原因:你模板里是 (form.isRectifyCode === '0' || form.isRectifyCode === '2') :contentReference[oaicite:4]{index=4} */ |
||||||
|
const showUnrectifyReason = computed(() => { |
||||||
|
const code = String(neg.value?.isRectifyCode ?? ""); |
||||||
|
return code === "0" || code === "2"; |
||||||
|
}); |
||||||
|
|
||||||
|
/** 问题整改情况:你模板里是 problemIsTrue && isRectifyCode === InspectCase.TRUE :contentReference[oaicite:5]{index=5} |
||||||
|
* 这里同样做宽松兼容:'1' / 'true' / 'TRUE' |
||||||
|
*/ |
||||||
|
const showRectifyDesc = computed(() => { |
||||||
|
if (!problemIsTrue.value) return false; |
||||||
|
const code = String(neg.value?.isRectifyCode ?? ""); |
||||||
|
return code === "1" || code.toLowerCase() === "true" || code.toUpperCase() === "TRUE"; |
||||||
|
}); |
||||||
|
|
||||||
|
/** 涉及对象分类(人员/单位) */ |
||||||
|
const BlameType = { PERSONAL: "PERSONAL", DEPARTMENT: "DEPARTMENT" }; |
||||||
|
const deptBlames = computed(() => (Array.isArray(base.value?.deptBlames) ? base.value.deptBlames : [])); |
||||||
|
const personalBlames = computed(() => (Array.isArray(base.value?.personalBlames) ? base.value.personalBlames : [])); |
||||||
|
/** |
||||||
|
* ✅ 替换为你的真实接口(接口一次性返回 base + negative) |
||||||
|
* 示例: |
||||||
|
* import { getDetail } from "@/api/xxx"; |
||||||
|
* return await getDetail({ id }) |
||||||
|
*/ |
||||||
|
|
||||||
|
async function fetchDetail() { |
||||||
|
if (!props.id) return; |
||||||
|
|
||||||
|
loading.value = true; |
||||||
|
loaded.value = false; |
||||||
|
try { |
||||||
|
const body={ |
||||||
|
id:props.id |
||||||
|
} |
||||||
|
const res = await watchDetail(body); |
||||||
|
detail.value = res?.data ?? res ?? {}; |
||||||
|
loaded.value = true; |
||||||
|
} catch (e) { |
||||||
|
detail.value = {}; |
||||||
|
loaded.value = true; |
||||||
|
ElMessage.error(e?.message || "详情获取失败"); |
||||||
|
} finally { |
||||||
|
loading.value = false; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** 打开弹窗或 id 变化时自动请求 */ |
||||||
|
watch( |
||||||
|
() => [visible.value, props.id], |
||||||
|
([v]) => { |
||||||
|
if (v) fetchDetail(); |
||||||
|
} |
||||||
|
); |
||||||
|
</script> |
||||||
|
|
||||||
|
<style scoped> |
||||||
|
/* 参考你给的 row/col 展示结构:普通详情,不是表单禁用态 */ |
||||||
|
.row { |
||||||
|
display: flex; |
||||||
|
flex-wrap: wrap; |
||||||
|
margin: 0; |
||||||
|
row-gap: 14px; |
||||||
|
} |
||||||
|
|
||||||
|
.col { |
||||||
|
display: flex; |
||||||
|
align-items: flex-start; |
||||||
|
gap: 10px; |
||||||
|
} |
||||||
|
|
||||||
|
.col-12 { |
||||||
|
width: 50%; |
||||||
|
} |
||||||
|
|
||||||
|
.col-24 { |
||||||
|
width: 100%; |
||||||
|
} |
||||||
|
|
||||||
|
label { |
||||||
|
width: 120px; |
||||||
|
color: #606266; |
||||||
|
flex: 0 0 auto; |
||||||
|
} |
||||||
|
|
||||||
|
span { |
||||||
|
flex: 1 1 auto; |
||||||
|
color: #303133; |
||||||
|
} |
||||||
|
|
||||||
|
.content { |
||||||
|
white-space: pre-wrap; |
||||||
|
line-height: 1.6; |
||||||
|
} |
||||||
|
|
||||||
|
.section-title h5 { |
||||||
|
margin: 12px 0 0; |
||||||
|
font-size: 14px; |
||||||
|
font-weight: 600; |
||||||
|
color: #303133; |
||||||
|
} |
||||||
|
|
||||||
|
.sub-title { |
||||||
|
margin-top: 6px; |
||||||
|
color: #606266; |
||||||
|
} |
||||||
|
|
||||||
|
.blame-card { |
||||||
|
background: #f9faff; |
||||||
|
border-radius: 6px; |
||||||
|
padding: 10px 12px; |
||||||
|
} |
||||||
|
|
||||||
|
.inner { |
||||||
|
margin: 0; |
||||||
|
row-gap: 10px; |
||||||
|
} |
||||||
|
|
||||||
|
.dialog-footer { |
||||||
|
padding: 16px 24px 24px; |
||||||
|
display: flex; |
||||||
|
justify-content: flex-end; |
||||||
|
} |
||||||
|
</style> |
||||||
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue