var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; import { useEffect, useRef, useState } from 'react'; import * as echarts from 'echarts'; import { useInterval, useSize } from 'ahooks'; import { ceil, isBoolean, isEmpty, maxBy, merge, uniqBy, size, gte, last, omit, map, } from 'lodash'; import { Empty } from 'antd'; // @ts-ignore import classes from './style.module.css'; import { LOADING_COLOR, MAP_COLORS } from './type'; import getFeatures from './getFeatures'; export function ChartsMap({ service, color = MAP_COLORS, conditions, options = {}, goDown = true, lastLevel = 'district', onDownCallBack, breadcrumbClassName, roam = false, isCarousel = false, style = {}, searchKey = '', loadingType = { color: LOADING_COLOR }, isKeepGrid = false, toolbarloop = 'top5' }) { const ele = useRef(null); const echartsRef = useRef(null); const echartsInstance = useRef(null); const [empty, setEmpty] = useState(undefined); const [breadcrumb, setBreadcrumb] = useState([]); const [interval, setInterval] = useState(undefined); const [time, setTime] = useState(undefined); const count = useRef(0); useInterval(() => { function getDataLength() { var _a; const l = size((_a = echartsInstance.current.getOption().series[0]) === null || _a === void 0 ? void 0 : _a.data); if (toolbarloop === 'top5') { return gte(l, 5) ? 5 : l; } else { return l; } } echartsInstance.current.dispatchAction({ type: 'hideTip', }); echartsInstance.current.dispatchAction({ type: 'downplay', seriesIndex: 0, }); echartsInstance.current.dispatchAction({ type: 'highlight', seriesIndex: 0, dataIndex: count.current % getDataLength(), }); echartsInstance.current.dispatchAction({ type: 'showTip', seriesIndex: 0, dataIndex: count.current % getDataLength(), position: () => { }, }); if (gte(count.current, toolbarloop === 'top5' ? 4 : getDataLength() - 1)) { count.current = 0; } else { count.current++; } }, interval); function clear(c) { if (c) { count.current = 0; } setInterval(undefined); echartsInstance.current.dispatchAction({ type: 'hideTip', }); echartsInstance.current.dispatchAction({ type: 'downplay', seriesIndex: 0, }); } function handleBreadcrumb(grid, key) { var _a; setBreadcrumb(breadcrumb.slice(0, key + 1)); (_a = echartsInstance.current) === null || _a === void 0 ? void 0 : _a.resetOption(grid); onDownCallBack && onDownCallBack(grid); } const responsive = useSize(ele.current); useInterval(() => { var _a; (_a = echartsInstance.current) === null || _a === void 0 ? void 0 : _a.resetOption(last(breadcrumb)); }, time); useEffect(() => { var _a; (_a = echartsInstance.current) === null || _a === void 0 ? void 0 : _a.resize(); }, [JSON.stringify(responsive)]); useEffect(() => { const params = Object.assign(conditions, isKeepGrid ? omit(last(breadcrumb), 'name') : null); if (!echartsRef.current) { echartsRef.current = echarts.init(ele.current); } echartsRef.current.showLoading(Object.assign({ text: '' }, loadingType)); (function init() { var _a, _b, _c; return __awaiter(this, void 0, void 0, function* () { const geoJson = yield getFeatures(params.adcode); if (isEmpty(geoJson)) { (_a = echartsInstance.current) === null || _a === void 0 ? void 0 : _a.clear(); echartsRef.current.hideLoading(); setEmpty(true); return; } const properties = (_b = geoJson === null || geoJson === void 0 ? void 0 : geoJson.currentFeature) === null || _b === void 0 ? void 0 : _b.properties; const { adcode, name } = properties; echarts.registerMap(name, geoJson); if (!echartsInstance.current) { echartsInstance.current = initMap(echartsRef.current, { color, service, goDown: goDown, lastLevel: lastLevel, mapName: name, mapCode: adcode, callback: onDownCallBack, setBreadcrumb, roam, searchKey, loadingType, }, options); } if (!isEmpty(params) && echartsInstance.current) { try { const _params = { name, adcode: adcode, [searchKey]: params[searchKey], // 地图code }; if (isKeepGrid) { setBreadcrumb(uniqBy([...breadcrumb, _params], (item) => String(item.adcode))); } else { setBreadcrumb([_params]); } function callback() { setInterval(5000); setTime(300000); } (_c = echartsInstance.current) === null || _c === void 0 ? void 0 : _c.resetOption(_params, conditions, isCarousel && callback); if (isCarousel) { clear(true); echartsInstance.current.on('mouseover', () => { clear(); }); echartsInstance.current.on('mouseout', () => { setInterval(5000); }); } } catch (e) { } } }); })(); }, map(Object.values(conditions), String)); return (_jsxs("div", Object.assign({ style: Object.assign({ width: '100%', height: '100%', position: 'relative' }, style) }, { children: [isBoolean(empty) && empty ? (_jsx(Empty, { image: Empty.PRESENTED_IMAGE_SIMPLE, description: "\u8BE5\u5730\u533A\u6682\u65E0\u5730\u56FE\u8F6E\u5ED3" })) : (_jsx("div", { ref: ele, style: { width: '100%', height: '100%' } })), _jsx("div", Object.assign({ style: { position: 'absolute', top: 10, left: 30, zIndex: 10 } }, { children: _jsx("ul", Object.assign({ className: [classes.map_breadcrumb, breadcrumbClassName].join(' ') }, { children: breadcrumb.map((item, key) => (_jsxs("li", Object.assign({ onClick: () => handleBreadcrumb(item, key) }, { children: [key > 0 && key < (breadcrumb === null || breadcrumb === void 0 ? void 0 : breadcrumb.length) && '-', item === null || item === void 0 ? void 0 : item.name] }), item.adcode))) })) }))] }))); } export function initMap(chart, customOptions, options) { let cacheConditions = {}; const option = merge({ backgroundColor: '#F5F5F5', geo: { show: true, map: customOptions.mapName, layoutSize: '100%', zoom: 1.2, roam: customOptions.roam, scaleLimit: { min: 1.2, max: 10, }, label: { show: false, }, itemStyle: { borderColor: '#c5dff9', borderWidth: 1, }, emphasis: { label: { show: false, }, itemStyle: { //区域 areaColor: '#FFDF34', }, }, select: { label: { show: false, }, itemStyle: { areaColor: '#BDBDBD', }, }, }, visualMap: { min: 0, bottom: 70, type: 'continuous', max: 100, text: ['高', '低'], top: 'bottom', itemWidth: 8, itemHeight: 320, calculable: true, realtime: false, show: true, inRange: { color: customOptions.color, }, }, series: [ { type: 'map', map: customOptions.mapName, geoIndex: 0, seriesIndex: 0, }, { type: 'effectScatter', coordinateSystem: 'geo', showEffectOn: 'render', seriesIndex: 1, roam: customOptions.roam, }, ], }, options); chart.setOption(option); // 添加事件 chart.on('click', function (params) { var _a, _b; return __awaiter(this, void 0, void 0, function* () { const grid = params.data; if (!(grid === null || grid === void 0 ? void 0 : grid.adcode)) { return; } const { adcode, name } = grid; const geoJson = yield getFeatures(adcode); if (isEmpty(geoJson)) { return; } const level = (_b = (_a = geoJson === null || geoJson === void 0 ? void 0 : geoJson.currentFeature) === null || _a === void 0 ? void 0 : _a.properties) === null || _b === void 0 ? void 0 : _b.level; if (level === customOptions.lastLevel) { return; } echarts.registerMap(name, geoJson); customOptions.setBreadcrumb((d) => { return uniqBy([ ...d, { adcode: adcode, name, [customOptions.searchKey]: grid[customOptions.searchKey], }, ], 'adcode'); }); customOptions.callback && customOptions.callback(grid, option, chart); chart.resetOption({ adcode: adcode, name, [customOptions.searchKey]: grid[customOptions.searchKey], }); }); }); chart.resetOption = function (grid, conditions = cacheConditions, carousel) { return __awaiter(this, void 0, void 0, function* () { try { const { name, adcode } = grid; cacheConditions = Object.assign({}, conditions); option.geo.map = name; chart.clear(); chart.showLoading(Object.assign({ text: '' }, customOptions.loadingType)); const data = yield customOptions.service(Object.assign(Object.assign({}, cacheConditions), { adcode, [customOptions.searchKey]: grid[customOptions.searchKey] })); chart.hideLoading(); const maxValue = maxBy(data, 'value'); option.visualMap.max = ceil(maxValue === null || maxValue === void 0 ? void 0 : maxValue.value) || 100; option.series[0].data = data; chart.setOption(option); carousel && carousel(); } catch (e) { console.log(e, 'error'); } }); }; window.onresize = function () { chart === null || chart === void 0 ? void 0 : chart.resize(); }; return chart; }