diff --git a/src/components/data/complaintformdialog.vue b/src/components/data/complaintformdialog.vue index 75625fd..d127a02 100644 --- a/src/components/data/complaintformdialog.vue +++ b/src/components/data/complaintformdialog.vue @@ -262,9 +262,55 @@ + +
请从下方列表选择一条记录进行合并,或选择"不合并,继续添加"
@@ -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; }