zhongrj
2023-06-27 d74b495736f0c04522ec54274b70fed0ded2878d
public/map/core/manager/querymanager.js
New file
@@ -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 "";
         }
      }
   });
});