From d74b495736f0c04522ec54274b70fed0ded2878d Mon Sep 17 00:00:00 2001
From: zhongrj <646384940@qq.com>
Date: Tue, 27 Jun 2023 11:30:06 +0800
Subject: [PATCH] 任务新增导出

---
 public/map/core/manager/querymanager.js |  330 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 330 insertions(+), 0 deletions(-)

diff --git a/public/map/core/manager/querymanager.js b/public/map/core/manager/querymanager.js
new file mode 100644
index 0000000..e118e1c
--- /dev/null
+++ b/public/map/core/manager/querymanager.js
@@ -0,0 +1,330 @@
+/**
+ * 查询搜索
+ * @author Liuyl
+ * @date 2015/10/30
+ */
+define([
+"dojo/_base/declare", "dojo/_base/array", "dojo/_base/lang",
+"dojo/json", "dojo/request", "dojo/request/script",
+"esri/tasks/query", "esri/tasks/QueryTask", "esri/tasks/StatisticDefinition",
+"base/AppEvent", "base/ConfigData"
+], function(
+	declare, arrayUtil, lang,
+	JSON, request, script,
+	Query, QueryTask, StatisticDefinition,
+	AppEvent, ConfigData
+) {
+	return declare("QueryManager", null, {
+		QueryArguments: declare(null, {
+			constructor: function(props) {
+
+				this.type = null;
+				this.extent = null;
+				this.poiType = null;
+				this.keyword = null;
+				this.returnGeometry = true;
+				this.outSpatialReference = null;
+				$.extend(true, this, props);
+			}
+		}),
+		defaultOptions: {
+			poi_service: "http://www.servicelnditu.com/OneMapServer/rest/services/poi2015/MapServer/0",
+			poi_service_fgdb: "http://www.servicelnditu.com/OneMapServer/rest/services/poi2015/MapServer/0",
+			poi_keyword_field: "NAME",
+			poi_pinyin_field: "NAMEPY",
+			poi_type1_field: "TYPE1",
+			poi_type2_field: "TYPE2",
+			poi_pac_field: "PACSHI",
+			poi_fields: {
+				"OBJECTID": "",
+				"NAME": "名称",
+				"NAMEPY": "拼音",
+				"ADDNAME": "地址",
+				"TELEPHONE": "电话"
+			},
+			result_widget_name: "QueryResultWidget",
+			smartquery_service: "../ProxyServlet?http://www.lnditu.gov.cn/SmartQueryService/rest/query/smartquery"
+
+		},
+		constructor: function(options) {
+			this.options = {};
+			$.extend(true, this.options, this.defaultOptions, options);
+			AppEvent.addAppEventListener(AppEvent.CONFIG_LOADED, lang.hitch(this, this.onConfigLoaded));
+			AppEvent.addAppEventListener(AppEvent.BASE_MAP_LAYER_LOADED, lang.hitch(this, this.onMapLoaded));
+			AppEvent.addAppEventListener(AppEvent.RUN_QUERY, lang.hitch(this, function(evt) {
+				this.query(evt);
+			}));
+			AppEvent.addAppEventListener(AppEvent.RUN_SMART_QUERY, lang.hitch(this, function(evt) {
+				this.smartQueryFromPoi(evt);
+			}));
+			this.newestQueryId = null;
+		},
+		onConfigLoaded: function() {},
+		onMapLoaded: function(map) {
+			this._map = map;
+		},
+		smartQuery: function(evt) {
+			//var queryString = this._parseQueryString(evt);
+			try {
+				request.get(this.options.smartquery_service + this._parseQueryString(evt.args), {
+					handleAs: "json"
+				}).then(function(data) {
+						AppEvent.dispatchAppEvent(AppEvent.QUERY_SUCCESS, {
+							hockId: evt.hockId,
+							result: data
+						});
+					},
+					function(error) {
+						AppEvent.dispatchAppEvent(AppEvent.QUERY_ERROR, {
+							hockId: evt.hockId,
+							error: error
+						});
+					});
+			} catch (err) {
+				AppEvent.dispatchAppEvent(AppEvent.QUERY_ERROR, {
+					hockId: evt.hockId,
+					error: err
+				});
+			}
+
+		},
+		_parseQueryString: function(argsObject) {
+			var queryString = "?";
+			arrayUtil.forEach(Object.keys(argsObject), function(item, index) {
+				if (queryString != "?") {
+					queryString += "&";
+				}
+				queryString += item + "=" + JSON.stringify(argsObject[item]);
+			});
+			return queryString;
+		},
+		smartQueryFromPoi: function(evt) {
+			try {
+				var url = this.options.poi_service;
+				var query = new Query();
+				query.where = this._parsePoiWhereString(evt.args.keyword);
+				query.outFields = Object.keys(this.options.poi_fields);
+				query.returnGeometry = false;
+				query.start = 0;
+				query.num = 10;
+				var queryTask = new QueryTask(url);
+				queryTask.execute(query, lang.hitch(this, function(result) {
+					var data = {
+						count: 0,
+						items: []
+					};
+					if (result.features) {
+						for (var key in result.features) {
+							if (!result.features[key].attributes.ADDNAME || !result.features[key].attributes.NAME)
+								continue;
+							data.items[data.count] = {
+								adress: result.features[key].attributes.ADDNAME,
+								name: result.features[key].attributes.NAME,
+								id: ""
+							};
+							data.count++;
+							if (data.count >= 10)
+								break;
+						}
+					}
+
+					AppEvent.dispatchAppEvent(AppEvent.QUERY_SUCCESS, {
+						hockId: evt.hockId,
+						result: {
+							data: data
+						}
+					});
+				}), lang.hitch(this, function(err) {
+					AppEvent.dispatchAppEvent(AppEvent.QUERY_ERROR, {
+						hockId: evt.hockId,
+						error: err
+					});
+				}));
+			} catch (err) {
+				AppEvent.dispatchAppEvent(AppEvent.QUERY_ERROR, {
+					hockId: evt.hockId,
+					error: err
+				});
+			}
+
+		},
+		_parsePoiWhereString: function(keyword) {
+			var whereSql = "";
+			if (keyword) {
+				if ((/[\u4e00-\u9fa5]+/).test(keyword)) {
+					whereSql = this.options.poi_keyword_field + " like '%" + keyword + "%'";
+				} else {
+					whereSql = "lower(" + this.options.poi_pinyin_field + ") like '%" + keyword.toLowerCase() + "%'";
+				}
+			}
+			return whereSql;
+		},
+		query: function(evt) {
+			try {
+				var queryArgs = new this.QueryArguments();
+				$.extend(true, queryArgs, evt);
+
+				this._do_query(queryArgs);
+			} catch (err) {
+				this._errorCallback(err, {
+					hockId: evt.hockId
+				});
+			}
+		},
+		_do_query: function(queryArgs) {
+			switch (queryArgs.type) {
+				case "statistics":
+					this.queryPoiForDistrictStatistics(queryArgs,
+						lang.hitch(this, this._resultCallback),
+						lang.hitch(this, this._errorCallback)
+					);
+					break;
+				case "search":
+					queryArgs.id = uuid();
+					this.newestQueryId = queryArgs.id;
+
+					this.queryPoiForExtent(queryArgs,
+						lang.hitch(this, this._resultCallback),
+						lang.hitch(this, this._errorCallback)
+					);
+					break;
+				case "poiId":
+					queryArgs.id = uuid();
+					this.newestQueryId = queryArgs.id;
+
+					this.queryPoiForExtent(queryArgs,
+						lang.hitch(this, this._resultCallback),
+						lang.hitch(this, this._errorCallback)
+					);
+					break;
+				default:
+					break;
+			}
+		},
+
+		_resultCallback: function(result, qArgs) {
+			if (qArgs.id && this.newestQueryId != qArgs.id) {
+				return;
+			}
+			AppEvent.dispatchAppEvent(AppEvent.QUERY_SUCCESS, {
+				hockId: qArgs.hockId,
+				result: result,
+				type: result.type
+			});
+		},
+		_errorCallback: function(err, qArgs) {
+			if (this.newestQueryId == qArgs.id) {
+				AppEvent.dispatchAppEvent(AppEvent.QUERY_ERROR, {
+					hockId: qArgs.hockId,
+					error: err
+				});
+			}
+		},
+		queryPoiForDistrictStatistics: function(qArgs, resultCallback, errorCallback) {
+			var query = new Query();
+			var queryTask = new QueryTask(this.options.poi_service);
+			query.extent = null;
+			query.where = this._parseWhereSql(qArgs);
+			var statisticDefinition = new StatisticDefinition();
+			statisticDefinition.statisticType = "count";
+			statisticDefinition.onStatisticField = "OBJECTID";
+			statisticDefinition.outStatisticFieldName = "COUNT";
+
+			query.outStatistics = [statisticDefinition];
+			query.groupByFieldsForStatistics = ["PACSHI"];
+			if (qArgs.extent) {
+				query.outSpatialReference = qArgs.extent.spatialReference
+			} else {
+				query.outSpatialReference = this._map.spatialReference;
+			}
+			query.outFields = ["PACSHI", "COUNT"];
+
+			queryTask.execute(query, lang.hitch(this, function(result) {
+				result.type = qArgs.type;
+				result.poiType = qArgs.poiType;
+				result.keyword = qArgs.keyword;
+				resultCallback(result, qArgs);
+			}), lang.hitch(this, function(err) {
+				errorCallback(err, qArgs);
+			}));
+		},
+		queryPoiForExtent: function(qArgs, resultCallback, errorCallback) {
+			var url = this.options.poi_service;
+			var query = new Query();
+
+			if (qArgs.poiId) {
+				query.objectIds = [qArgs.poiId];
+			} else {
+				query.where = this._parseWhereSql(qArgs);
+			}
+			if (qArgs.extent) {
+				query.outSpatialReference = qArgs.extent.spatialReference;
+				if (qArgs.extent && !qArgs.extent.hasOwnProperty("xmin")) {
+					query.geometry = qArgs.extent;
+					url = this.options.poi_service_fgdb;
+				}
+
+			} else {
+				query.outSpatialReference = this._map.spatialReference;
+			}
+			query.outFields = Object.keys(this.options.poi_fields);
+			query.returnGeometry = qArgs.returnGeometry;
+			var queryTask = new QueryTask(url);
+			queryTask.execute(query, lang.hitch(this, function(result) {
+				result.type = qArgs.type;
+				result.extent = qArgs.extent;
+				resultCallback(result, qArgs);
+			}), lang.hitch(this, function(err) {
+				errorCallback(err, qArgs);
+			}));
+		},
+		_parseWhereSql: function(qArgs) {
+			var _whereSql = _linkWhereSql("and",
+				_parsePoiCodeWhereSql.call(this, qArgs.poiType),
+				_parseExtentWhereSql.call(this, qArgs.extent));
+			_whereSql = _linkWhereSql("and",
+				_whereSql,
+				//_parseKeywordWhereSql.call(this, qArgs.keyword)
+				this._parsePoiWhereString(qArgs.keyword)
+			);
+
+			return _whereSql;
+
+
+
+			function _linkWhereSql(type, sql1, sql2) {
+				if (!sql1)
+					return sql2;
+				if (!sql2)
+					return sql1;
+				return "( " + sql1 + " ) " + type + " ( " + sql2 + " )";
+			}
+
+			function _parseExtentWhereSql(extent) {
+				if (extent && extent.hasOwnProperty("xmin"))
+					return "LON>" + extent.xmin + " and LON<" + extent.xmax + " and LAT>" + extent.ymin + " and LAT<" + extent.ymax;
+				else
+					return "";
+			}
+
+			function _parsePoiCodeWhereSql(type) {
+				if (type) {
+					if (type.length == 2) {
+						return this.options.poi_type1_field + " = '" + type + "'";
+					} else if (type.length == 4) {
+						return this.options.poi_type2_field + " = '" + type + "'";
+					}
+
+				}
+				return "";
+			}
+
+			function _parseKeywordWhereSql(keyword) {
+				if (keyword) {
+					return this.options.poi_keyword_field + " like '%" + keyword + "%'";
+				}
+				return "";
+			}
+		}
+	});
+});
\ No newline at end of file

--
Gitblit v1.9.3