diff --git a/es/components/map/locate/index.js b/es/components/map/locate/index.js index aad59f40..2db9faa1 100644 --- a/es/components/map/locate/index.js +++ b/es/components/map/locate/index.js @@ -13,10 +13,10 @@ export default function Locate(props) { const searchRef = useRef(); // 这里不能用useFeatures,因为无法引用lib里面的provider,引用src注入是不行的 const featureGeo = useFeatures().geo; - useEffect(() => { + const searchFn = () => { if (searchValue?.length > 1) { setSearchLoading(true); - featureGeo.searchPoi(searchValue).then((result) => { + featureGeo.searchPoi(searchValue, props.areaId, undefined, 0, 10).then((result) => { setSearchLoading(false); setPois(result.map((ele, idx) => ({ ...ele, @@ -33,9 +33,14 @@ export default function Locate(props) { else { setPois(undefined); } + }; + let handle; + useEffect(() => { + handle = setTimeout(searchFn, 1000); }, [searchValue]); const center = currentPoi?.coordinate || props.coordinate; const Locate = ( { + clearTimeout(handle); setSearchValue(e.target.value); }} prefix={} onFocus={() => { setMode('searchPoi'); @@ -76,6 +81,7 @@ export default function Locate(props) { return ( diff --git a/es/components/map/locate/web.module.less b/es/components/map/locate/web.module.less index e43fa072..7a5e0904 100644 --- a/es/components/map/locate/web.module.less +++ b/es/components/map/locate/web.module.less @@ -1,6 +1,8 @@ .location-list { width: 100%; height: 100%; + overflow-y: scroll; + max-height: 600px; display: flex; flex-direction: column; diff --git a/es/components/map/openlayer/index.js b/es/components/map/openlayer/index.js index ed741a68..f76b7a4b 100644 --- a/es/components/map/openlayer/index.js +++ b/es/components/map/openlayer/index.js @@ -1,4 +1,5 @@ import { assert } from 'oak-domain/lib/utils/assert'; +import { wgs84togcj02 } from 'oak-domain/lib/utils/geo'; import React, { useEffect, useState } from 'react'; import OlMap from 'ol/Map'; import Feature from 'ol/Feature'; @@ -27,6 +28,7 @@ export default function Map(props) { layers: [ new TileLayer({ source: new XYZ({ + // 用的高德的瓦片,gcj02坐标 url: 'http://wprd0{1-4}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&style=7&x={x}&y={y}&z={z}', wrapX: false, }), @@ -36,7 +38,7 @@ export default function Map(props) { }), ], view: new View({ - center: fromLonLat(props.center || DEFAULT_CENTER), + center: fromLonLat(wgs84togcj02(props.center || DEFAULT_CENTER)), zoom: props.zoom || DEFAULT_ZOOM, minZoom: props.unzoomable ? props.zoom : undefined, maxZoom: props.unzoomable ? props.zoom : undefined, @@ -59,7 +61,7 @@ export default function Map(props) { } if (!props.center) { locate().then(({ latitude, longitude }) => { - map2.getView().setCenter(fromLonLat([longitude, latitude])); + map2.getView().setCenter(fromLonLat(wgs84togcj02([longitude, latitude]))); }); } setMap(map2); @@ -71,13 +73,13 @@ export default function Map(props) { const oc2 = toLonLat(originCenter); if (oc2[0] !== props.center[0] || oc2[1] !== props.center[1]) { map.getView().animate({ - center: fromLonLat(props.center), + center: fromLonLat(wgs84togcj02(props.center)), duration: 500, }); } } else { - map.getView().setCenter(fromLonLat(props.center)); + map.getView().setCenter(fromLonLat(wgs84togcj02(props.center))); } } }, [props.center]); @@ -92,11 +94,11 @@ export default function Map(props) { let feature = markerLayer.getSource().getFeatureById('markers'); if (feature) { // feature.setGeometry(new MultiPoint(props.markers.map(ele => fromLonLat(ele)))); - feature.setGeometry(new Point(fromLonLat(props.markers[0]))); + feature.setGeometry(new Point(fromLonLat(wgs84togcj02(props.markers[0])))); } else { // feature = new Feature(new MultiPoint(props.markers.map(ele => fromLonLat(ele)))); - feature = new Feature(new Point(fromLonLat(props.markers[0]))); + feature = new Feature(new Point(fromLonLat(wgs84togcj02(props.markers[0])))); feature.setStyle(new Style({ image: new Circle({ // 点的颜色 diff --git a/es/features/geo.d.ts b/es/features/geo.d.ts index ba1290b8..f6f3f16c 100644 --- a/es/features/geo.d.ts +++ b/es/features/geo.d.ts @@ -5,7 +5,7 @@ import { Cache } from './cache'; export declare class Geo extends Feature { private cache; constructor(cache: Cache); - searchPoi(name: string, areaId?: string, typeCode?: string): Promise<{ + searchPoi(name: string, areaId?: string, typeCode?: string, indexFrom?: number, count?: number): Promise<{ poiName: string; areaId: string; latitude: number; diff --git a/es/features/geo.js b/es/features/geo.js index 036ae00f..388ef58e 100644 --- a/es/features/geo.js +++ b/es/features/geo.js @@ -5,12 +5,14 @@ export class Geo extends Feature { super(); this.cache = cache; } - async searchPoi(name, areaId, typeCode) { + async searchPoi(name, areaId, typeCode, indexFrom, count) { const { result } = await this.cache.exec('geoService', { api: 'geo', params: { name, - areaId + areaId, + indexFrom, + count, } }); return result; diff --git a/es/features/runningTree.d.ts b/es/features/runningTree.d.ts index 600b4748..a46ae4cc 100644 --- a/es/features/runningTree.d.ts +++ b/es/features/runningTree.d.ts @@ -156,7 +156,7 @@ declare class ListNode, ids: string[], action?: ED[T]['Action']): void; - composeOperations(): Array<{ + composeOperations(includeModiBranch?: boolean): Array<{ entity: keyof ED; operation: ED[keyof ED]['Operation']; }> | undefined; @@ -214,7 +214,12 @@ declare class SingleNode | undefined; @@ -249,7 +254,7 @@ declare class VirtualNode extends Node; - composeOperations(): Array<{ + composeOperations(includeModiBranch?: boolean): Array<{ entity: keyof ED; operation: ED[keyof ED]['Operation']; }> | undefined; diff --git a/es/features/runningTree.js b/es/features/runningTree.js index b961c58f..1ea8e217 100644 --- a/es/features/runningTree.js +++ b/es/features/runningTree.js @@ -827,14 +827,14 @@ class ListNode extends EntityNode { ids.forEach((id) => this.updateItemInner(lsn, data, id, action)); this.setDirty(); } - composeOperations() { + composeOperations(includeModiBranch) { if (!this.dirty) { return; } const intrinsticFilter = this.getIntrinsticFilters(); const ulmLsn = this.ulManager.maxLsn; for (const id in this.children) { - const childOperations = this.children[id].composeOperations(true); + const childOperations = this.children[id].composeOperations(includeModiBranch); if (childOperations) { childOperations.forEach((childOperation) => this.ulManager.push(ulmLsn + 100, childOperation.operation)); } @@ -1315,13 +1315,22 @@ class SingleNode extends EntityNode { }); super.setDirty(); } - composeOperations(fromParent) { + /** + * + * @param includeModiBranch 如果显式置了boolean,代表只要考虑前项路径或者后项路径 + * @returns + */ + composeOperations(includeModiBranch) { if (this.dirty) { const lsnMax = this.ulManager.maxLsn; for (const ele in this.children) { + if (ele.includes(MODI_NEXT_PATH_SUFFIX) && false === includeModiBranch || + (!ele.includes(MODI_NEXT_PATH_SUFFIX) && true === includeModiBranch)) { + continue; + } const ele2 = ele.includes(':') ? ele.slice(0, ele.indexOf(':')) : ele; const child = this.children[ele]; - const childOperations = child.composeOperations(true); + const childOperations = child.composeOperations(includeModiBranch); if (childOperations) { if (child instanceof SingleNode) { assert(childOperations.length === 1); @@ -1680,14 +1689,18 @@ class VirtualNode extends Node { throw err; } } - composeOperations() { + composeOperations(includeModiBranch) { /** * 当一个virtualNode有多个子结点,而这些子结点的前缀一致时,标识这些子结点其实是指向同一个对象,此时需要合并 */ const operationss = []; const operationDict = {}; for (const ele in this.children) { - const operation = this.children[ele].composeOperations(true); + if (ele.includes(MODI_NEXT_PATH_SUFFIX) && false === includeModiBranch || + (!ele.includes(MODI_NEXT_PATH_SUFFIX) && true === includeModiBranch)) { + continue; + } + const operation = this.children[ele].composeOperations(includeModiBranch); if (operation) { const idx = ele.indexOf(':') !== -1 ? ele.slice(0, ele.indexOf(':')) : ele; if (operationDict[idx]) { @@ -1928,7 +1941,7 @@ export class RunningTree extends Feature { redoBranchOperations(path, allowInTxn) { const { root } = analyzePath(path); const rootNode = this.root[root]; - const opers = rootNode.composeOperations(); + const opers = rootNode.composeOperations(path.includes(MODI_NEXT_PATH_SUFFIX)); if (opers) { this.cache.redoOperation(opers); } diff --git a/lib/features/geo.d.ts b/lib/features/geo.d.ts index ba1290b8..f6f3f16c 100644 --- a/lib/features/geo.d.ts +++ b/lib/features/geo.d.ts @@ -5,7 +5,7 @@ import { Cache } from './cache'; export declare class Geo extends Feature { private cache; constructor(cache: Cache); - searchPoi(name: string, areaId?: string, typeCode?: string): Promise<{ + searchPoi(name: string, areaId?: string, typeCode?: string, indexFrom?: number, count?: number): Promise<{ poiName: string; areaId: string; latitude: number; diff --git a/lib/features/geo.js b/lib/features/geo.js index f83630f0..b90114e0 100644 --- a/lib/features/geo.js +++ b/lib/features/geo.js @@ -8,12 +8,14 @@ class Geo extends Feature_1.Feature { super(); this.cache = cache; } - async searchPoi(name, areaId, typeCode) { + async searchPoi(name, areaId, typeCode, indexFrom, count) { const { result } = await this.cache.exec('geoService', { api: 'geo', params: { name, - areaId + areaId, + indexFrom, + count, } }); return result; diff --git a/lib/features/runningTree.d.ts b/lib/features/runningTree.d.ts index 600b4748..a46ae4cc 100644 --- a/lib/features/runningTree.d.ts +++ b/lib/features/runningTree.d.ts @@ -156,7 +156,7 @@ declare class ListNode, ids: string[], action?: ED[T]['Action']): void; - composeOperations(): Array<{ + composeOperations(includeModiBranch?: boolean): Array<{ entity: keyof ED; operation: ED[keyof ED]['Operation']; }> | undefined; @@ -214,7 +214,12 @@ declare class SingleNode | undefined; @@ -249,7 +254,7 @@ declare class VirtualNode extends Node; - composeOperations(): Array<{ + composeOperations(includeModiBranch?: boolean): Array<{ entity: keyof ED; operation: ED[keyof ED]['Operation']; }> | undefined; diff --git a/lib/features/runningTree.js b/lib/features/runningTree.js index 1ef20c7d..4a886cb9 100644 --- a/lib/features/runningTree.js +++ b/lib/features/runningTree.js @@ -830,14 +830,14 @@ class ListNode extends EntityNode { ids.forEach((id) => this.updateItemInner(lsn, data, id, action)); this.setDirty(); } - composeOperations() { + composeOperations(includeModiBranch) { if (!this.dirty) { return; } const intrinsticFilter = this.getIntrinsticFilters(); const ulmLsn = this.ulManager.maxLsn; for (const id in this.children) { - const childOperations = this.children[id].composeOperations(true); + const childOperations = this.children[id].composeOperations(includeModiBranch); if (childOperations) { childOperations.forEach((childOperation) => this.ulManager.push(ulmLsn + 100, childOperation.operation)); } @@ -1318,13 +1318,22 @@ class SingleNode extends EntityNode { }); super.setDirty(); } - composeOperations(fromParent) { + /** + * + * @param includeModiBranch 如果显式置了boolean,代表只要考虑前项路径或者后项路径 + * @returns + */ + composeOperations(includeModiBranch) { if (this.dirty) { const lsnMax = this.ulManager.maxLsn; for (const ele in this.children) { + if (ele.includes(exports.MODI_NEXT_PATH_SUFFIX) && false === includeModiBranch || + (!ele.includes(exports.MODI_NEXT_PATH_SUFFIX) && true === includeModiBranch)) { + continue; + } const ele2 = ele.includes(':') ? ele.slice(0, ele.indexOf(':')) : ele; const child = this.children[ele]; - const childOperations = child.composeOperations(true); + const childOperations = child.composeOperations(includeModiBranch); if (childOperations) { if (child instanceof SingleNode) { (0, assert_1.assert)(childOperations.length === 1); @@ -1683,14 +1692,18 @@ class VirtualNode extends Node { throw err; } } - composeOperations() { + composeOperations(includeModiBranch) { /** * 当一个virtualNode有多个子结点,而这些子结点的前缀一致时,标识这些子结点其实是指向同一个对象,此时需要合并 */ const operationss = []; const operationDict = {}; for (const ele in this.children) { - const operation = this.children[ele].composeOperations(true); + if (ele.includes(exports.MODI_NEXT_PATH_SUFFIX) && false === includeModiBranch || + (!ele.includes(exports.MODI_NEXT_PATH_SUFFIX) && true === includeModiBranch)) { + continue; + } + const operation = this.children[ele].composeOperations(includeModiBranch); if (operation) { const idx = ele.indexOf(':') !== -1 ? ele.slice(0, ele.indexOf(':')) : ele; if (operationDict[idx]) { @@ -1931,7 +1944,7 @@ class RunningTree extends Feature_1.Feature { redoBranchOperations(path, allowInTxn) { const { root } = analyzePath(path); const rootNode = this.root[root]; - const opers = rootNode.composeOperations(); + const opers = rootNode.composeOperations(path.includes(exports.MODI_NEXT_PATH_SUFFIX)); if (opers) { this.cache.redoOperation(opers); } diff --git a/src/features/geo.ts b/src/features/geo.ts index e7fedc7d..abb26bc5 100644 --- a/src/features/geo.ts +++ b/src/features/geo.ts @@ -15,12 +15,14 @@ export class Geo< this.cache = cache; } - async searchPoi(name: string, areaId?: string, typeCode?: string) { + async searchPoi(name: string, areaId?: string, typeCode?: string, indexFrom?: number, count?: number) { const { result } = await this.cache.exec('geoService', { api: 'geo', params: { name, - areaId + areaId, + indexFrom, + count, } }); diff --git a/src/features/runningTree.ts b/src/features/runningTree.ts index 01e5ba99..55f7c53e 100644 --- a/src/features/runningTree.ts +++ b/src/features/runningTree.ts @@ -409,7 +409,7 @@ class ListNode< private filters: (NamedFilterItem & { applied?: boolean })[]; private sorters: (NamedSorterItem & { applied?: boolean })[]; private getTotal?: number; - private pagination: Pagination = { ...DEFAULT_PAGINATION}; + private pagination: Pagination = { ...DEFAULT_PAGINATION }; private sr: Record = {}; private syncHandler: (records: OpRecord[]) => void; @@ -1036,7 +1036,7 @@ class ListNode< this.setDirty(); } - composeOperations(): + composeOperations(includeModiBranch?: boolean): | Array<{ entity: keyof ED; operation: ED[keyof ED]['Operation'] }> | undefined { if (!this.dirty) { @@ -1047,7 +1047,7 @@ class ListNode< const ulmLsn = this.ulManager.maxLsn; for (const id in this.children) { - const childOperations = this.children[id].composeOperations(true); + const childOperations = this.children[id].composeOperations(includeModiBranch); if (childOperations) { childOperations.forEach( (childOperation) => this.ulManager.push(ulmLsn + 100, childOperation.operation as any) @@ -1614,16 +1614,25 @@ class SingleNode | undefined { if (this.dirty) { const lsnMax = this.ulManager.maxLsn; for (const ele in this.children) { + if (ele.includes(MODI_NEXT_PATH_SUFFIX) && false === includeModiBranch || + (!ele.includes(MODI_NEXT_PATH_SUFFIX) && true === includeModiBranch)) { + continue; + } const ele2 = ele.includes(':') ? ele.slice(0, ele.indexOf(':')) : ele; const child = this.children[ele]; - const childOperations = child!.composeOperations(true); + const childOperations = child!.composeOperations(includeModiBranch); if (childOperations) { if (child instanceof SingleNode) { assert(childOperations.length === 1); @@ -2015,14 +2024,18 @@ class VirtualNode extends Node { throw err; } } - composeOperations(): Array<{ entity: keyof ED, operation: ED[keyof ED]['Operation'] }> | undefined { + composeOperations(includeModiBranch?: boolean): Array<{ entity: keyof ED, operation: ED[keyof ED]['Operation'] }> | undefined { /** * 当一个virtualNode有多个子结点,而这些子结点的前缀一致时,标识这些子结点其实是指向同一个对象,此时需要合并 */ const operationss = []; const operationDict: Record = {}; for (const ele in this.children) { - const operation = this.children[ele].composeOperations(true); + if (ele.includes(MODI_NEXT_PATH_SUFFIX) && false === includeModiBranch || + (!ele.includes(MODI_NEXT_PATH_SUFFIX) && true === includeModiBranch)) { + continue; + } + const operation = this.children[ele].composeOperations(includeModiBranch); if (operation) { const idx = ele.indexOf(':') !== -1 ? ele.slice(0, ele.indexOf(':')) : ele; if (operationDict[idx]) { @@ -2338,7 +2351,7 @@ export class RunningTree extends Feature const { root } = analyzePath(path); const rootNode = this.root[root]; - const opers = rootNode.composeOperations(); + const opers = rootNode.composeOperations(path.includes(MODI_NEXT_PATH_SUFFIX)); if (opers) { this.cache.redoOperation(opers); }