关键字查询组件

7/17/2023

# 1. jt-query-poi 简介

  • 通过关键字搜索对应项目与工程,点击定位查询详细项目信息
  • 实时返回模糊查询结果,点击搜索按钮查询详细信息

# 2.Warning

注意

  • 使用ref标记组件时,同时需要定义标记名称!具体可参考CIM平台关键字查询组件写法!

# 3. jt-query-poi API

属性名 说明 类型 是否必须
isDataOnload 控制组件显示隐藏 boolean
resultCompleteData 详细数据列表 arr
queryDataSource 实时响应数据列表 arr

# 4. jt-query-poi methods API

方法名 说明 类型 是否必须
realtimeQuery 实时查询方法,返回输入值 methods
activateQuery 点击查询方法,返回输入值 methods
activateQueryInfo 定位详细项目地块位置,返回值option对象,查询表名与id methods

# 5. 代码示例

<template>
	<transition enter-active-class="animate__animated animate__bounceInLeft" leave-active-class="animate__animated animate__bounceOutLeft">
		<jt-query-poi v-if="isDataOnload" ref="querypoiRef"  @realtimeQuery="realtimeQuery" @activateQuery="activateQuery" @activateQueryInfo="activateQueryInfo" :resultCompleteData="resultCompleteData" :queryDataSource="queryDataSource">
		</jt-query-poi>
	</transition>
</template>

<script setup>
	/**
	 * element-plus组件
	 */
	import {
		ElMessage,
		ElLoading
	} from 'element-plus';

	import {
		onMounted,
		onBeforeUnmount,
		ref,
		inject
	} from "vue";

	import {
		useWidget
	} from "@/common/store/widget"
	const {
		disable,
		currentWidget
	} = useWidget();

	import {
		formattingTime
	} from '@/assets/js/localtime.js';
	import $http from '@/utils/http.js';

	// 按需引入
	import {
		mapWorkQueryResult
	} from '../../../../../map3d-ui/index.js';

	/**
	 * 获取地图对象
	 */
	const getMapInstance = inject("getMapInstance");
	let jtMap3d = getMapInstance();
	let viewer = jtMap3d._viewer;

	//定义子组件实例,名称要和上面的ref相同
	const querypoiRef = ref(null)

	//定义属性
	let isDataOnload = ref(false);
	let queryDataSource = ref([]); //查询数据源
	let resultCompleteData = ref([]) //详细数据源

	onMounted(() => {
		isDataOnload.value = true;
	});

	/**
	 * 执行查询
	 */
	const activateQuery = (keyword) => {
		getAxios({
			tableName: "view_mapquery",
			sqlWhere: " name like '%" + keyword + "%' ",
			orderByField: ''
		}).then(data => {
			resultCompleteData.value = data;//props双向绑定,监听参数变化
			// querypoiRef.value.processingQueryResults(data);//调用组件方法
		})
	}
	/**
	 * 定位某个查询结果
	 */
	const activateQueryInfo = (options) => {

		$http.get('/getGeoJson', {
			tableName: options.tablename,
			sqlWhere: " id = " + options.id,
			orderByField: ''
		}).then(res => {

			if (res.data.features.length >= 1) {
				let features = res.data.features[0]

				//清除定位高亮显示
				mapWorkQueryResult.removeHighlight(viewer);

				var field = res.table;
				var properties = features.properties;
				let geometry = features.geometry;

				let datalist = getTextoption(properties, field)

				let html = "";
				html +=
					"<div style='text-align: left;backfround-color:rgba(61, 198, 205, 0.6);width:300rem;font-family: TTTGB-Medium, sans-serif !important;'>";
				Object.keys(datalist).forEach((res, index) => {
					if (Object.values(datalist)[index]) {
						html +=
							"<div :class=" + `${index}%2==0?'one':'odd'` + ">" +
							"<span style='width:100rem'>" + Object.keys(datalist)[
								index] + ":</span>" +
							"<span>" + Object.values(datalist)[index] + "</span>" +
							"</div>";
					}
				})
				html += "</div>";

				let popupObj = new jtMap3dSDK.PopupWindow.HtmlWindow(viewer, geometry.coordinates[0][0][0],
					"详细信息", html, 20);
				popupObj.activateCloseButton().then(res => {
					//清除定位高亮显示
					mapWorkQueryResult.removeHighlight(viewer);
				});

				//定位高亮
				mapWorkQueryResult.locHighlight(viewer, geometry);

			} else {
				ElMessage("项目信息暂未入库!");
			}
		});
	}

	/**
	 * 联想输入实时查询
	 * 如果想要等数据返回后再执行后面的代码,那么就要使用 async/await
	 */
	async function realtimeQuery(keyword) {

		// 这时queryData会等到异步请求的结果回来后才进行赋值,同时不会执行之后的代码
		const queryData = await getAxios({
			tableName: 'view_mapquery',
			sqlWhere: " name like '" + keyword + "%' ",
			orderByField: ''
		});
		// console.log('查询到的数据', queryData)
		
		queryDataSource.value = queryData;//props双向绑定,监听参数变化
		// querypoiRef.value.processingSearchResults(queryData);//调用组件方法
	}

	/**
	 * 调用查询接口
	 */
	const getAxios = (options) => {
		return new Promise((resolve, reject) => {
			$http.get('/getTableList', options).then(res => {
				resolve(res.data)
			});
		}).catch(err => {
			console.log('log-error', err)
		})
	}

	//匹配对应字段,dataList数据列表,tableList参数配置表
	const getTextoption = (dataList, tableList) => {
		let resultObject = {}
		Object.keys(dataList).forEach((res, index) => {
			tableList.forEach((itemField, idx) => {
				if (itemField.isDisplay === 1) {
					if (Object.keys(dataList)[index] == itemField.fieldName) {
						let fieldDesc = itemField.fieldDescription || itemField.fieldName;
						let fieldVals = Object.values(dataList)[index];
						//日期格式
						if (itemField.fieldType === 1) {
							let time = new Date(fieldVals).getTime();
							fieldVals = formattingTime(time);
						}
						resultObject[fieldDesc] = fieldVals
					}
				}
			})
		})
		return resultObject
	}
</script>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181