Browse Source

fix: 不同人员信息也要合并

master
parent
commit
af47f783e5
  1. 174
      src/components/data/complaintformdialog.vue

174
src/components/data/complaintformdialog.vue

@ -262,9 +262,55 @@
</el-alert>
</div>
<!-- 人工查重复用现有姓名身份证电话精确 OR 查询 -->
<div class="manual-search-panel">
<div class="manual-search-header">
<div>
<div class="manual-search-title">没有找到要合并的记录</div>
<div class="manual-search-description">
可输入已登记来件人的完整姓名完整身份证号或完整联系电话继续查找
</div>
</div>
<el-tag type="info" effect="plain">精确匹配</el-tag>
</div>
<div class="manual-search-bar">
<el-input
v-model="manualSearchKeyword"
placeholder="例如:张三、完整身份证号或完整联系电话"
clearable
:disabled="duplicateLoading"
@keyup.enter="handleManualSearch"
@clear="handleClearManualSearch"
>
<template #prepend>查找历史来件</template>
</el-input>
<el-button type="primary" :loading="duplicateLoading" @click="handleManualSearch">
查找可合并记录
</el-button>
<el-button v-if="isManualSearch" :disabled="duplicateLoading" @click="handleClearManualSearch">
恢复自动匹配结果
</el-button>
</div>
</div>
<div class="duplicate-result-header">
<span>{{ isManualSearch ? '人工查找结果' : '系统自动匹配结果' }}</span>
<span v-if="isManualSearch" class="search-keyword">查询条件{{ activeManualSearchKeyword }}</span>
</div>
<!-- 重复记录列表 -->
<div class="duplicate-list" v-loading="duplicateLoading">
<el-empty v-if="duplicateList.length === 0 && !duplicateLoading" description="未发现重复记录,您可以继续添加" />
<el-result
v-if="duplicateLoadFailed && duplicateList.length === 0 && !duplicateLoading"
icon="error"
title="查询失败"
sub-title="请重试查重"
/>
<el-empty
v-else-if="duplicateList.length === 0 && !duplicateLoading"
:description="isManualSearch ? '未搜索到匹配记录' : '未发现重复记录,您可以继续添加'"
/>
<el-result v-else-if="duplicateList.length > 0 && !selectedCardId" icon="warning" title="发现疑似重复记录">
<template #sub-title>
<p style="color: #909399;">请从下方列表选择一条记录进行合并或选择"不合并,继续添加"</p>
@ -854,6 +900,13 @@ const handleNextStep = async () => {
feedback.msgWarning("请完善必填信息")
return
}
manualSearchKeyword.value = ''
activeManualSearchKeyword.value = ''
isManualSearch.value = false
selectedCardId.value = null
selectedCard.value = null
duplicateList.value = []
duplicateLoadFailed.value = false
currentStep.value = 1
await fetchDuplicateList()
}
@ -904,23 +957,71 @@ const handleConfirmMerge = async () => {
}
//
const fetchDuplicateList = async () => {
const fetchDuplicateList = async (query) => {
duplicateLoading.value = true
duplicateLoadFailed.value = false
try {
const body = {
const body = query || {
responderIdCode: formData.value.responderIdCode,
responderName: formData.value.responderName,
responderPhone: formData.value.responderPhone,
}
const res = await maileRepeatt(body)
duplicateList.value = res?.complaintCollectionRepeatDTOS || []
return true
} catch (e) {
console.error("查重失败", e)
duplicateLoadFailed.value = true
feedback.notifyError("查询失败,请重试")
return false
} finally {
duplicateLoading.value = false
}
}
// 使
const handleManualSearch = async () => {
if (duplicateLoading.value) return
const keyword = manualSearchKeyword.value.trim()
if (!keyword) {
feedback.msgWarning("请输入完整姓名、身份证号或联系电话")
return
}
manualSearchKeyword.value = keyword
selectedCardId.value = null
selectedCard.value = null
const success = await fetchDuplicateList({
responderIdCode: keyword,
responderName: keyword,
responderPhone: keyword,
})
if (success) {
activeManualSearchKeyword.value = keyword
isManualSearch.value = true
}
}
//
const handleClearManualSearch = async () => {
if (duplicateLoading.value || (!manualSearchKeyword.value && !isManualSearch.value)) return
const previousKeyword = activeManualSearchKeyword.value
manualSearchKeyword.value = ''
selectedCardId.value = null
selectedCard.value = null
const success = await fetchDuplicateList()
if (success) {
activeManualSearchKeyword.value = ''
isManualSearch.value = false
} else if (isManualSearch.value) {
manualSearchKeyword.value = previousKeyword
}
}
//
const handleSelectCard = (item) => {
const id = item.complaintId || item.negativeId
@ -983,6 +1084,10 @@ watch(
duplicateDrawerVisible.value = false
duplicateLoading.value = false
duplicateLoadFailed.value = false
manualSearchKeyword.value = ''
activeManualSearchKeyword.value = ''
isManualSearch.value = false
autoDuplicateLoading.value = false
duplicateHintVisible.value = false
duplicateCount.value = 0
@ -1180,6 +1285,10 @@ async function onSubmit() {
const duplicateDrawerVisible = ref(false)
const duplicateList = ref([])
const duplicateLoading = ref(false)
const duplicateLoadFailed = ref(false)
const manualSearchKeyword = ref('')
const activeManualSearchKeyword = ref('')
const isManualSearch = ref(false)
const onCheckDuplicate = async () => {
duplicateDrawerVisible.value = true
@ -1366,6 +1475,65 @@ h2 {
}
}
.manual-search-panel {
margin: 0 20px 18px;
padding: 16px;
border: 1px solid #d9ecff;
border-radius: 8px;
background: #f5faff;
}
.manual-search-header {
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
margin-bottom: 12px;
}
.manual-search-title {
color: #303133;
font-size: 15px;
font-weight: 600;
}
.manual-search-description {
margin-top: 4px;
color: #606266;
font-size: 13px;
}
.manual-search-bar {
display: flex;
flex-wrap: wrap;
gap: 10px;
align-items: center;
.el-input {
flex: 1;
min-width: 320px;
max-width: 520px;
}
}
.duplicate-result-header {
display: flex;
align-items: center;
justify-content: space-between;
margin: 0 20px 12px;
padding-bottom: 8px;
border-bottom: 1px solid #ebeef5;
color: #303133;
font-size: 15px;
font-weight: 600;
.search-keyword {
color: #409eff;
font-size: 13px;
font-weight: 400;
}
}
.duplicate-list {
min-height: 200px;
}

Loading…
Cancel
Save