Browse Source

统一搜索功能

dev-V1.0.6
wangmingyong@163.com 3 months ago
parent
commit
39417e3c23
  1. 4
      zdxt-web-client/zdxt-efcode-enforcement-app/src/api/enforcement/plan.js
  2. 151
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/notice/cp_notice_edit.vue
  3. 156
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/plan/cp_plan_edit.vue

4
zdxt-web-client/zdxt-efcode-enforcement-app/src/api/enforcement/plan.js

@ -53,8 +53,8 @@ export const getManualMatchDays = (success, error) => _get(settingBaseUrl + "/ma
const enterpriseSearchBaseUrl = "/enforcementcode/enterpriseSearch";
// 按企业名称联合检索(>=3字符)
export const searchUnionByEnterpriseName = (enterpriseName, success, error) =>
_get(enterpriseSearchBaseUrl + "/searchUnionByEnterpriseName", { enterpriseName }, success, error);
export const searchUnionByEnterpriseName = (searchValue, success, error) =>
_post("/app-enf/enterpriseInfo/queryListAndQrInfo", { searchValue }, success, error);
// 根据企业信用代码查询联系人和联系电话
export const getEnterpriseContactInfo = (enterpriseNumber, success, error) =>

151
zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/notice/cp_notice_edit.vue

@ -260,28 +260,38 @@
<span class="enterprise-picker-title">选择企业</span>
<van-icon name="cross" @click="showEnterprisePicker = false" />
</div>
<van-search
v-model="enterpriseSearchKeyword"
placeholder="输入≥ 2 个字符检索企业,不要输入深圳,深圳市"
shape="round"
@update:model-value="onEnterpriseSearchInput"
/>
<div class="search-bar">
<van-search
v-model="enterpriseSearchKeyword"
placeholder="请输入企业名称/统一信用代码搜索"
@search="handleEnterpriseSearch"
@clear="clearEnterpriseSearch"
/>
<van-button class="search-btn" type="primary" @click="handleEnterpriseSearch">搜索</van-button>
</div>
<div class="enterprise-picker-body">
<div v-if="enterpriseSearching" class="enterprise-loading">
<van-loading size="18" />&nbsp;检索中...
</div>
<template v-else>
<van-list
v-model:loading="enterpriseLoading"
:finished="enterpriseFinished"
:finished-text="enterpriseFinishedText"
:offset="50"
@load="onEnterpriseLoad"
>
<div
v-for="(item, idx) in enterpriseOptions"
:key="idx"
:key="item.enterpriseNumber || idx"
class="enterprise-item"
@click="onSelectEnterprise(item)"
>
<div class="enterprise-item-name">{{ item.enterpriseName }}</div>
<div class="enterprise-item-number">{{ item.enterpriseNumber }}</div>
</div>
<van-empty v-if="enterpriseSearchKeyword.length >= 2 && !enterpriseOptions.length" description="未检索到匹配企业" image-size="80" />
</template>
<van-empty
v-if="!enterpriseLoading && !enterpriseOptions.length"
:description="enterpriseEmptyText"
image-size="80"
/>
</van-list>
</div>
</div>
</van-popup>
@ -292,7 +302,8 @@
import { useRouter, useRoute } from 'vue-router';
import { showToast, showSuccessToast, showConfirmDialog } from 'vant';
import { addNotice, editNotice, getNoticeDetail } from '@/api/enforcement/notice';
import { getPlanList, searchUnionByEnterpriseName, searchBureauUnitUsers, getEnterpriseContactInfo } from '@/api/enforcement/plan';
import { getPlanList, searchBureauUnitUsers, getEnterpriseContactInfo } from '@/api/enforcement/plan';
import { queryEnterpriseListAndQrInfo } from '@/api/enforcement/index';
import { maskPhone } from '@/util/util';
const router = useRouter();
const route = useRoute();
@ -404,10 +415,16 @@ const planImportDisplay = computed(() => {
const enterpriseOptions = ref([]);
const showEnterprisePicker = ref(false);
const enterpriseSearchKeyword = ref('');
const enterpriseSearching = ref(false);
let enterpriseSearchTimer = null;
const enterpriseLoading = ref(false);
const enterpriseFinished = ref(false);
const enterprisePageNum = ref(1);
const enterprisePageSize = 10;
const enterpriseSearched = ref(false);
let enterpriseSearchSeq = 0;
const enterpriseEmptyText = computed(() => enterpriseSearched.value ? '未检索到匹配企业' : '请输入至少2个字搜索');
const enterpriseFinishedText = computed(() => enterpriseOptions.value.length > 0 ? '没有更多了' : '');
// 执法人员检索
const showPersonPicker = ref(false);
const personSearchKeyword = ref('');
@ -503,34 +520,88 @@ const onTimeConfirm = ({ selectedValues }) => {
const onOpenEnterprisePicker = () => {
enterpriseSearchKeyword.value = '';
enterpriseOptions.value = [];
enterprisePageNum.value = 1;
enterpriseFinished.value = true;
enterpriseLoading.value = false;
enterpriseSearched.value = false;
showEnterprisePicker.value = true;
};
// 企业检索
const onEnterpriseSearchInput = (val) => {
if (enterpriseSearchTimer) clearTimeout(enterpriseSearchTimer);
const keyword = (val || '').trim();
// 企业检索(搜索按钮/回车)
const handleEnterpriseSearch = () => {
const keyword = (enterpriseSearchKeyword.value || '').trim();
if (keyword.length < 2) {
showToast('请输入至少2个字搜索');
enterpriseOptions.value = [];
enterpriseFinished.value = true;
enterpriseSearched.value = false;
return;
}
enterpriseSearchTimer = setTimeout(() => {
const seq = ++enterpriseSearchSeq;
enterpriseSearching.value = true;
searchUnionByEnterpriseName(keyword, (res) => {
enterprisePageNum.value = 1;
enterpriseFinished.value = false;
enterpriseOptions.value = [];
enterpriseLoading.value = true;
enterpriseSearched.value = true;
fetchEnterpriseList(keyword);
};
// 清除企业搜索
const clearEnterpriseSearch = () => {
enterpriseSearchKeyword.value = '';
enterpriseOptions.value = [];
enterprisePageNum.value = 1;
enterpriseFinished.value = true;
enterpriseLoading.value = false;
enterpriseSearched.value = false;
};
// van-list 触底加载
const onEnterpriseLoad = () => {
fetchEnterpriseList(enterpriseSearchKeyword.value.trim());
};
// 实际发起企业检索(分页追加)
const fetchEnterpriseList = (keyword) => {
if ((keyword || '').trim().length < 2) {
enterpriseFinished.value = true;
enterpriseLoading.value = false;
return;
}
const seq = ++enterpriseSearchSeq;
enterpriseLoading.value = true;
queryEnterpriseListAndQrInfo(
{
pageNum: enterprisePageNum.value,
pageSize: enterprisePageSize,
searchValue: keyword,
},
(res) => {
if (seq !== enterpriseSearchSeq) return;
enterpriseSearching.value = false;
if (res && res.code === 200 && Array.isArray(res.data)) {
enterpriseOptions.value = res.data;
enterpriseLoading.value = false;
if (res && res.code === 200 && Array.isArray(res.rows)) {
const data = res.rows;
if (enterprisePageNum.value === 1) {
enterpriseOptions.value = data;
} else {
enterpriseOptions.value = [...enterpriseOptions.value, ...data];
}
const total = res.total || 0;
if (total <= enterprisePageSize * enterprisePageNum.value) {
enterpriseFinished.value = true;
} else {
enterprisePageNum.value++;
}
} else {
enterpriseOptions.value = [];
if (enterprisePageNum.value === 1) enterpriseOptions.value = [];
enterpriseFinished.value = true;
}
}, () => {
},
() => {
if (seq !== enterpriseSearchSeq) return;
enterpriseSearching.value = false;
enterpriseOptions.value = [];
});
}, 350);
enterpriseLoading.value = false;
enterpriseFinished.value = true;
}
);
};
const onSelectEnterprise = (item) => {
@ -863,6 +934,20 @@ const doSubmit = (isDraft) => {
.enterprise-picker-title { font-size: 16px; font-weight: 600; color: #333; }
:deep(.van-icon) { font-size: 18px; color: #999; cursor: pointer; }
}
.search-bar {
display: flex;
align-items: center;
margin: 0.3rem;
:deep(.van-search) {
padding-right: 0px;
flex: 1;
height: 34px;
}
.search-btn {
flex: none;
height: 34px;
}
}
.enterprise-picker-body {
flex: 1;
overflow-y: auto;

156
zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/plan/cp_plan_edit.vue

@ -222,28 +222,38 @@
<span class="enterprise-picker-title">选择企业</span>
<van-icon name="cross" @click="showEnterprisePicker = false" />
</div>
<van-search
v-model="enterpriseSearchKeyword"
placeholder="输入≥ 2 个字符检索企业,不要输入深圳,深圳市"
shape="round"
@update:model-value="onEnterpriseSearchInput"
/>
<div class="search-bar">
<van-search
v-model="enterpriseSearchKeyword"
placeholder="请输入企业名称/统一信用代码搜索"
@search="handleEnterpriseSearch"
@clear="clearEnterpriseSearch"
/>
<van-button class="search-btn" type="primary" @click="handleEnterpriseSearch">搜索</van-button>
</div>
<div class="enterprise-picker-body">
<div v-if="enterpriseSearching" class="enterprise-loading">
<van-loading size="18" />&nbsp;检索中...
</div>
<template v-else>
<van-list
v-model:loading="enterpriseLoading"
:finished="enterpriseFinished"
:finished-text="enterpriseFinishedText"
:offset="50"
@load="onEnterpriseLoad"
>
<div
v-for="(item, idx) in enterpriseOptions"
:key="idx"
:key="item.enterpriseNumber || idx"
class="enterprise-item"
@click="onSelectEnterprise(item)"
>
<div class="enterprise-item-name">{{ item.enterpriseName }}</div>
<div class="enterprise-item-number">{{ item.enterpriseNumber }}</div>
</div>
<van-empty v-if="enterpriseSearchKeyword.length >= 2 && !enterpriseOptions.length" description="未检索到匹配企业" image-size="80" />
</template>
<van-empty
v-if="!enterpriseLoading && !enterpriseOptions.length"
:description="enterpriseEmptyText"
image-size="80"
/>
</van-list>
</div>
</div>
</van-popup>
@ -253,7 +263,8 @@
<script setup name="cpPlanEdit">
import { useRouter, useRoute } from 'vue-router';
import { showToast, showSuccessToast, showConfirmDialog } from 'vant';
import { addPlan, editPlan, getPlanDetail, getSubmitDeadline, getManualMatchDays, getMaxInnerUnitAcPersonNum, searchUnionByEnterpriseName, searchBureauUnitUsers } from '@/api/enforcement/plan';
import { addPlan, editPlan, getPlanDetail, getSubmitDeadline, getManualMatchDays, getMaxInnerUnitAcPersonNum, searchBureauUnitUsers } from '@/api/enforcement/plan';
import { queryEnterpriseListAndQrInfo } from '@/api/enforcement/index';
import { maskPhone } from '@/util/util';
const router = useRouter();
const route = useRoute();
@ -345,10 +356,16 @@ const maxPersonNum = ref(3);
const enterpriseOptions = ref([]);
const showEnterprisePicker = ref(false);
const enterpriseSearchKeyword = ref('');
const enterpriseSearching = ref(false);
let enterpriseSearchTimer = null;
const enterpriseLoading = ref(false);
const enterpriseFinished = ref(false);
const enterprisePageNum = ref(1);
const enterprisePageSize = 10;
const enterpriseSearched = ref(false);
let enterpriseSearchSeq = 0;
const enterpriseEmptyText = computed(() => enterpriseSearched.value ? '未检索到匹配企业' : '请输入至少2个字搜索');
const enterpriseFinishedText = computed(() => enterpriseOptions.value.length > 0 ? '没有更多了' : '');
// 执法人员检索弹层状态
const showPersonPicker = ref(false);
const personSearchKeyword = ref('');
@ -553,36 +570,88 @@ const onDateConfirm = ({ selectedValues }) => {
const onOpenEnterprisePicker = () => {
enterpriseSearchKeyword.value = '';
enterpriseOptions.value = [];
enterprisePageNum.value = 1;
enterpriseFinished.value = true;
enterpriseLoading.value = false;
enterpriseSearched.value = false;
showEnterprisePicker.value = true;
};
// 企业名称输入(防抖检索)
const onEnterpriseSearchInput = (val) => {
if (enterpriseSearchTimer) {
clearTimeout(enterpriseSearchTimer);
}
const keyword = (val || '').trim();
// 企业检索(搜索按钮/回车)
const handleEnterpriseSearch = () => {
const keyword = (enterpriseSearchKeyword.value || '').trim();
if (keyword.length < 2) {
showToast('请输入至少2个字搜索');
enterpriseOptions.value = [];
enterpriseFinished.value = true;
enterpriseSearched.value = false;
return;
}
enterprisePageNum.value = 1;
enterpriseFinished.value = false;
enterpriseOptions.value = [];
enterpriseLoading.value = true;
enterpriseSearched.value = true;
fetchEnterpriseList(keyword);
};
// 清除企业搜索
const clearEnterpriseSearch = () => {
enterpriseSearchKeyword.value = '';
enterpriseOptions.value = [];
enterprisePageNum.value = 1;
enterpriseFinished.value = true;
enterpriseLoading.value = false;
enterpriseSearched.value = false;
};
// van-list 触底加载
const onEnterpriseLoad = () => {
fetchEnterpriseList(enterpriseSearchKeyword.value.trim());
};
// 实际发起企业检索(分页追加)
const fetchEnterpriseList = (keyword) => {
if ((keyword || '').trim().length < 2) {
enterpriseFinished.value = true;
enterpriseLoading.value = false;
return;
}
enterpriseSearchTimer = setTimeout(() => {
const seq = ++enterpriseSearchSeq;
enterpriseSearching.value = true;
searchUnionByEnterpriseName(keyword, (res) => {
const seq = ++enterpriseSearchSeq;
enterpriseLoading.value = true;
queryEnterpriseListAndQrInfo(
{
pageNum: enterprisePageNum.value,
pageSize: enterprisePageSize,
searchValue: keyword,
},
(res) => {
if (seq !== enterpriseSearchSeq) return;
enterpriseSearching.value = false;
if (res && res.code === 200 && Array.isArray(res.data)) {
enterpriseOptions.value = res.data;
enterpriseLoading.value = false;
if (res && res.code === 200 && Array.isArray(res.rows)) {
const data = res.rows;
if (enterprisePageNum.value === 1) {
enterpriseOptions.value = data;
} else {
enterpriseOptions.value = [...enterpriseOptions.value, ...data];
}
const total = res.total || 0;
if (total <= enterprisePageSize * enterprisePageNum.value) {
enterpriseFinished.value = true;
} else {
enterprisePageNum.value++;
}
} else {
enterpriseOptions.value = [];
if (enterprisePageNum.value === 1) enterpriseOptions.value = [];
enterpriseFinished.value = true;
}
}, () => {
},
() => {
if (seq !== enterpriseSearchSeq) return;
enterpriseSearching.value = false;
enterpriseOptions.value = [];
});
}, 350);
enterpriseLoading.value = false;
enterpriseFinished.value = true;
}
);
};
// 选择某个企业
@ -993,6 +1062,23 @@ const doSubmit = () => {
}
}
.search-bar {
display: flex;
align-items: center;
margin: 0.3rem;
:deep(.van-search) {
padding-right: 0px;
flex: 1;
height: 34px;
}
.search-btn {
flex: none;
height: 34px;
}
}
.enterprise-picker-body {
flex: 1;
overflow-y: auto;

Loading…
Cancel
Save