Commit eee1727f887b436d0e607d143630abb3df0339e9

Authored by 张 峰林
Committed by xp.Huang
1 parent da7263e4

fix: 地区配置添加确定预览

@@ -98,7 +98,7 @@ export const setScale = (adcode: string | number) => { @@ -98,7 +98,7 @@ export const setScale = (adcode: string | number) => {
98 case '340000': 98 case '340000':
99 return { distance: 170, zoom: 0.8, alpha: 45 } 99 return { distance: 170, zoom: 0.8, alpha: 45 }
100 case '350000': 100 case '350000':
101 - return { distance: 150, zoom: 0.8, alpha: 45 } 101 + return { distance: 150, zoom: 0.8, alpha: 45 }
102 case '360000': 102 case '360000':
103 return { distance: 190, zoom: 0.8, alpha: 45 } 103 return { distance: 190, zoom: 0.8, alpha: 45 }
104 case '370000': 104 case '370000':
@@ -111,6 +111,8 @@ export const setScale = (adcode: string | number) => { @@ -111,6 +111,8 @@ export const setScale = (adcode: string | number) => {
111 return { distance: 165, zoom: 0.8, alpha: 45 } 111 return { distance: 165, zoom: 0.8, alpha: 45 }
112 case '500000': 112 case '500000':
113 return { distance: 145, zoom: 0.8, alpha: 45 } 113 return { distance: 145, zoom: 0.8, alpha: 45 }
  114 + case '510000':
  115 + return { distance: 115, zoom: 0.8, alpha: 45 }
114 case '520000': 116 case '520000':
115 return { distance: 135, zoom: 0.8, alpha: 45 } 117 return { distance: 135, zoom: 0.8, alpha: 45 }
116 case '530000': 118 case '530000':
@@ -166,6 +168,7 @@ export const option = { @@ -166,6 +168,7 @@ export const option = {
166 iconDistanceTop: 20, 168 iconDistanceTop: 20,
167 drillingIn: false, 169 drillingIn: false,
168 dataset: dataMaps, 170 dataset: dataMaps,
  171 + isShowExecute:false,
169 saveClickRegion: { 172 saveClickRegion: {
170 level: '' 173 level: ''
171 }, 174 },
@@ -188,7 +191,10 @@ export const option = { @@ -188,7 +191,10 @@ export const option = {
188 geo3D: { 191 geo3D: {
189 show: false, // 隐藏该层,为true时会导致出现两个地图 192 show: false, // 隐藏该层,为true时会导致出现两个地图
190 map: '', 193 map: '',
191 - roam: true 194 + roam: true,
  195 + viewControl:{
  196 + distance:100
  197 + }
192 }, 198 },
193 series: [ 199 series: [
194 { 200 {
@@ -19,28 +19,16 @@ @@ -19,28 +19,16 @@
19 </SettingItemBox> 19 </SettingItemBox>
20 <SettingItemBox name="图标距离"> 20 <SettingItemBox name="图标距离">
21 <SettingItem name="距右"> 21 <SettingItem name="距右">
22 - <n-input-number  
23 - v-model:value="optionData.iconDistanceRight"  
24 - :min="1"  
25 - size="small"  
26 - placeholder="请输入"  
27 - ></n-input-number> 22 + <n-input-number v-model:value="optionData.iconDistanceRight" :min="1" size="small"
  23 + placeholder="请输入"></n-input-number>
28 </SettingItem> 24 </SettingItem>
29 <SettingItem name="距上"> 25 <SettingItem name="距上">
30 - <n-input-number  
31 - v-model:value="optionData.iconDistanceTop"  
32 - :min="1"  
33 - size="small"  
34 - placeholder="请输入"  
35 - ></n-input-number> 26 + <n-input-number v-model:value="optionData.iconDistanceTop" :min="1" size="small"
  27 + placeholder="请输入"></n-input-number>
36 </SettingItem> 28 </SettingItem>
37 </SettingItemBox> 29 </SettingItemBox>
38 - <SelectCity  
39 - ref="SelectCityRef"  
40 - :optionData="optionData"  
41 - :drillingIn="optionData.drillingIn"  
42 - @submit="onHandleSelectValues"  
43 - /> 30 + <SelectCity ref="SelectCityRef" :optionData="optionData" :drillingIn="optionData.drillingIn"
  31 + @submit="onHandleSelectValues" />
44 <div style="height: 30px"></div> 32 <div style="height: 30px"></div>
45 <n-tag type="primary">若配置无响应,请在预览页面查看效果</n-tag> 33 <n-tag type="primary">若配置无响应,请在预览页面查看效果</n-tag>
46 <SettingItemBox name="地图配置"> 34 <SettingItemBox name="地图配置">
@@ -48,35 +36,20 @@ @@ -48,35 +36,20 @@
48 <n-color-picker size="small" :modes="['hex']" v-model:value="seriesList[0].itemStyle.color"></n-color-picker> 36 <n-color-picker size="small" :modes="['hex']" v-model:value="seriesList[0].itemStyle.color"></n-color-picker>
49 </SettingItem> 37 </SettingItem>
50 <SettingItem name="边框颜色"> 38 <SettingItem name="边框颜色">
51 - <n-color-picker  
52 - size="small"  
53 - :modes="['hex']"  
54 - v-model:value="seriesList[0].itemStyle.borderColor"  
55 - ></n-color-picker> 39 + <n-color-picker size="small" :modes="['hex']"
  40 + v-model:value="seriesList[0].itemStyle.borderColor"></n-color-picker>
56 </SettingItem> 41 </SettingItem>
57 <SettingItem name="边框大小"> 42 <SettingItem name="边框大小">
58 - <n-input-number  
59 - v-model:value="seriesList[0].itemStyle.borderWidth"  
60 - :min="0"  
61 - size="small"  
62 - placeholder="请输入"  
63 - ></n-input-number> 43 + <n-input-number v-model:value="seriesList[0].itemStyle.borderWidth" :min="0" size="small"
  44 + placeholder="请输入"></n-input-number>
64 </SettingItem> 45 </SettingItem>
65 <SettingItem name="透明度"> 46 <SettingItem name="透明度">
66 - <n-input-number  
67 - v-model:value="seriesList[0].itemStyle.opacity"  
68 - :min="0"  
69 - size="small"  
70 - placeholder="请输入"  
71 - ></n-input-number> 47 + <n-input-number v-model:value="seriesList[0].itemStyle.opacity" :min="0" size="small"
  48 + placeholder="请输入"></n-input-number>
72 </SettingItem> 49 </SettingItem>
73 <SettingItem name="厚度"> 50 <SettingItem name="厚度">
74 - <n-input-number  
75 - v-model:value="seriesList[0].regionHeight"  
76 - :min="0"  
77 - size="small"  
78 - placeholder="请输入"  
79 - ></n-input-number> 51 + <n-input-number v-model:value="seriesList[0].regionHeight" :min="0" size="small"
  52 + placeholder="请输入"></n-input-number>
80 </SettingItem> 53 </SettingItem>
81 </SettingItemBox> 54 </SettingItemBox>
82 <SettingItemBox name="标题配置"> 55 <SettingItemBox name="标题配置">
@@ -84,19 +57,12 @@ @@ -84,19 +57,12 @@
84 <n-switch v-model:value="seriesList[0].label.show" size="small"></n-switch> 57 <n-switch v-model:value="seriesList[0].label.show" size="small"></n-switch>
85 </SettingItem> 58 </SettingItem>
86 <SettingItem name="颜色"> 59 <SettingItem name="颜色">
87 - <n-color-picker  
88 - size="small"  
89 - :modes="['hex']"  
90 - v-model:value="seriesList[0].label.textStyle.color"  
91 - ></n-color-picker> 60 + <n-color-picker size="small" :modes="['hex']"
  61 + v-model:value="seriesList[0].label.textStyle.color"></n-color-picker>
92 </SettingItem> 62 </SettingItem>
93 <SettingItem name="大小"> 63 <SettingItem name="大小">
94 - <n-input-number  
95 - v-model:value="seriesList[0].label.textStyle.fontSize"  
96 - :min="0"  
97 - size="small"  
98 - placeholder="请输入"  
99 - ></n-input-number> 64 + <n-input-number v-model:value="seriesList[0].label.textStyle.fontSize" :min="0" size="small"
  65 + placeholder="请输入"></n-input-number>
100 </SettingItem> 66 </SettingItem>
101 </SettingItemBox> 67 </SettingItemBox>
102 <SettingItemBox name="高亮配置"> 68 <SettingItemBox name="高亮配置">
@@ -104,69 +70,40 @@ @@ -104,69 +70,40 @@
104 <n-switch v-model:value="seriesList[0].emphasis.label.show" size="small"></n-switch> 70 <n-switch v-model:value="seriesList[0].emphasis.label.show" size="small"></n-switch>
105 </SettingItem> 71 </SettingItem>
106 <SettingItem name="颜色"> 72 <SettingItem name="颜色">
107 - <n-color-picker  
108 - size="small"  
109 - :modes="['hex']"  
110 - v-model:value="seriesList[0].emphasis.label.textStyle.color"  
111 - ></n-color-picker> 73 + <n-color-picker size="small" :modes="['hex']"
  74 + v-model:value="seriesList[0].emphasis.label.textStyle.color"></n-color-picker>
112 </SettingItem> 75 </SettingItem>
113 <SettingItem name="大小"> 76 <SettingItem name="大小">
114 - <n-input-number  
115 - v-model:value="seriesList[0].emphasis.label.textStyle.fontSize"  
116 - :min="0"  
117 - size="small"  
118 - placeholder="请输入"  
119 - ></n-input-number> 77 + <n-input-number v-model:value="seriesList[0].emphasis.label.textStyle.fontSize" :min="0" size="small"
  78 + placeholder="请输入"></n-input-number>
120 </SettingItem> 79 </SettingItem>
121 <SettingItem name="区块颜色"> 80 <SettingItem name="区块颜色">
122 - <n-color-picker  
123 - size="small"  
124 - :modes="['hex']"  
125 - v-model:value="seriesList[0].emphasis.itemStyle.color"  
126 - ></n-color-picker> 81 + <n-color-picker size="small" :modes="['hex']"
  82 + v-model:value="seriesList[0].emphasis.itemStyle.color"></n-color-picker>
127 </SettingItem> 83 </SettingItem>
128 </SettingItemBox> 84 </SettingItemBox>
129 <SettingItemBox name="柱状配置"> 85 <SettingItemBox name="柱状配置">
130 <SettingItem name="最小高度"> 86 <SettingItem name="最小高度">
131 - <n-input-number  
132 - v-model:value="seriesList[1].minHeight"  
133 - :min="0"  
134 - :step="1"  
135 - size="small"  
136 - placeholder="请输入"  
137 - ></n-input-number> 87 + <n-input-number v-model:value="seriesList[1].minHeight" :min="0" :step="1" size="small"
  88 + placeholder="请输入"></n-input-number>
138 </SettingItem> 89 </SettingItem>
139 <SettingItem name="大小"> 90 <SettingItem name="大小">
140 - <n-input-number  
141 - v-model:value="seriesList[1].barSize"  
142 - :min="0"  
143 - :step="1"  
144 - size="small"  
145 - placeholder="请输入"  
146 - ></n-input-number> 91 + <n-input-number v-model:value="seriesList[1].barSize" :min="0" :step="1" size="small"
  92 + placeholder="请输入"></n-input-number>
147 </SettingItem> 93 </SettingItem>
148 <SettingItem name="倒角尺寸"> 94 <SettingItem name="倒角尺寸">
149 - <n-input-number  
150 - v-model:value="seriesList[1].bevelSize"  
151 - :min="0"  
152 - :max="1"  
153 - :step="0.1"  
154 - size="small"  
155 - placeholder="请输入"  
156 - ></n-input-number> 95 + <n-input-number v-model:value="seriesList[1].bevelSize" :min="0" :max="1" :step="0.1" size="small"
  96 + placeholder="请输入"></n-input-number>
157 </SettingItem> 97 </SettingItem>
158 </SettingItemBox> 98 </SettingItemBox>
159 </CollapseItem> 99 </CollapseItem>
160 <CollapseItem name="地区配置" :expanded="true"> 100 <CollapseItem name="地区配置" :expanded="true">
161 <SettingItemBox name="地区配置" :alone="true"> 101 <SettingItemBox name="地区配置" :alone="true">
162 <template v-for="(item, map3DIndex) in optionData.dataset.map3D" :key="map3DIndex"> 102 <template v-for="(item, map3DIndex) in optionData.dataset.map3D" :key="map3DIndex">
163 - <setting-item name="省份名称" v-if="mapRegionCache.adcode=='china'"> 103 + <setting-item name="省份名称" v-if="mapRegionCache.adcode == 'china'">
164 <n-select 104 <n-select
165 - @change="(v:number,o:Recordable,w:Recordable,s1:number)=> onHandleSelectProvince(v,o,item, map3DIndex)"  
166 - placeholder="请选择省份"  
167 - v-model:value="item.name"  
168 - :options="item.provinceOptions"  
169 - /> 105 + @change="(v: number, o: Recordable, w: Recordable, s1: number) => onHandleSelectProvince(v, o, item, map3DIndex)"
  106 + placeholder="请选择省份" v-model:value="item.name" :options="item.provinceOptions" />
170 </setting-item> 107 </setting-item>
171 <setting-item name="城市名称"> 108 <setting-item name="城市名称">
172 <n-select placeholder="请选择城市" v-model:value="item.city_name" :options="item.cityOptions" /> 109 <n-select placeholder="请选择城市" v-model:value="item.city_name" :options="item.cityOptions" />
@@ -187,6 +124,8 @@ @@ -187,6 +124,8 @@
187 </template> 124 </template>
188 <div class="h-space"></div> 125 <div class="h-space"></div>
189 <n-button size="small" @click="handleAddRegion"> + </n-button> 126 <n-button size="small" @click="handleAddRegion"> + </n-button>
  127 + <div class="h-space"></div>
  128 + <n-button type="primary" @click="handleAreaSubmit">确定</n-button>
190 </SettingItemBox> 129 </SettingItemBox>
191 </CollapseItem> 130 </CollapseItem>
192 <CollapseItem name="柱状配置" :expanded="true"> 131 <CollapseItem name="柱状配置" :expanded="true">
@@ -212,13 +151,12 @@ @@ -212,13 +151,12 @@
212 </setting-item> 151 </setting-item>
213 </template> 152 </template>
214 <div class="h-space"></div> 153 <div class="h-space"></div>
215 - <n-button  
216 - style="float: right"  
217 - size="small"  
218 - @click="optionData.dataset.bar3D.push(cloneDeep(STATIC_SCATTER_CONFIG))"  
219 - > 154 + <n-button style="float: right" size="small"
  155 + @click="optionData.dataset.bar3D.push(cloneDeep(STATIC_SCATTER_CONFIG))">
220 + 156 +
221 </n-button> 157 </n-button>
  158 + <div class="h-space"></div>
  159 + <n-button type="primary" @click="handleAreaSubmit">确定</n-button>
222 </SettingItemBox> 160 </SettingItemBox>
223 </CollapseItem> 161 </CollapseItem>
224 </template> 162 </template>
@@ -253,7 +191,7 @@ const datasetMap3DList = computed(() => { @@ -253,7 +191,7 @@ const datasetMap3DList = computed(() => {
253 const STATIC_SCATTER_CONFIG = { 191 const STATIC_SCATTER_CONFIG = {
254 name: null, 192 name: null,
255 adcode: 510000, 193 adcode: 510000,
256 - city_name:null, 194 + city_name: null,
257 value: [0, 0, 0], 195 value: [0, 0, 0],
258 height: 2, 196 height: 2,
259 itemStyle: { 197 itemStyle: {
@@ -277,7 +215,7 @@ onMounted(async () => { @@ -277,7 +215,7 @@ onMounted(async () => {
277 datasetMap3DList.value.forEach(async (item: Recordable) => { 215 datasetMap3DList.value.forEach(async (item: Recordable) => {
278 item.provinceOptions = await getAreaLists() 216 item.provinceOptions = await getAreaLists()
279 item.cityOptions = await getAreaLists(areaEnum.CITY, !item.adcode ? mapRegionCache.value.adcode : item.adcode) 217 item.cityOptions = await getAreaLists(areaEnum.CITY, !item.adcode ? mapRegionCache.value.adcode : item.adcode)
280 - item.adcode = !item.adcode ? mapRegionCache.value.adcode : item.adcode 218 + item.adcode = !item.adcode ? mapRegionCache.value.adcode : item.adcode
281 }) 219 })
282 }) 220 })
283 221
@@ -288,13 +226,28 @@ const onHandleSelectProvince = async (value: number, option: Recordable, item: R @@ -288,13 +226,28 @@ const onHandleSelectProvince = async (value: number, option: Recordable, item: R
288 datasetMap3DList.value[findIndex].cityOptions = await getAreaLists(areaEnum.CITY, option.adcode) 226 datasetMap3DList.value[findIndex].cityOptions = await getAreaLists(areaEnum.CITY, option.adcode)
289 } 227 }
290 228
291 -const handleAddRegion = () => { 229 +const handleAddRegion =async () => {
292 props.optionData.dataset.map3D.push(cloneDeep(STATIC_SCATTER_CONFIG)) 230 props.optionData.dataset.map3D.push(cloneDeep(STATIC_SCATTER_CONFIG))
  231 + if (mapRegionCache.value.adcode !== 'china') {
  232 + const { adcode, areaName } = unref(mapRegionCache) || {}
  233 + const cityOptions = await getAreaLists(areaEnum.CITY, adcode)
  234 + // 循环 push 城市数据
  235 + datasetMap3DList.value.forEach((item: any) => {
  236 +
  237 + item.name = areaName
  238 + item.cityOptions = cityOptions && cityOptions.length ? cityOptions : [{ adcode, label: areaName, value: areaName }]
  239 + })
  240 + return
  241 + }
293 datasetMap3DList.value.forEach(async (item: Recordable) => { 242 datasetMap3DList.value.forEach(async (item: Recordable) => {
294 item.provinceOptions = await getAreaLists() 243 item.provinceOptions = await getAreaLists()
295 }) 244 })
296 } 245 }
297 246
  247 +const handleAreaSubmit = () => {
  248 + props.optionData.isShowExecute = !props.optionData?.isShowExecute
  249 +}
  250 +
298 const mapRegionCache = computed(() => { 251 const mapRegionCache = computed(() => {
299 return props.optionData.mapRegion 252 return props.optionData.mapRegion
300 }) 253 })
@@ -306,24 +259,31 @@ const onHandleSelectValues = async (values: regionInfo) => { @@ -306,24 +259,31 @@ const onHandleSelectValues = async (values: regionInfo) => {
306 mapRegionCache.value.adcode = countyValue 259 mapRegionCache.value.adcode = countyValue
307 ? countyValue 260 ? countyValue
308 : cityValue 261 : cityValue
309 - ? cityValue  
310 - : provinceValue === 'china'  
311 - ? 'china'  
312 - : provinceValue 262 + ? cityValue
  263 + : provinceValue === 'china'
  264 + ? 'china'
  265 + : provinceValue
313 props.optionData.mapRegion = mapRegionCache.value 266 props.optionData.mapRegion = mapRegionCache.value
314 - if(mapRegionCache.value.adcode!=='china'){  
315 - const {adcode,areaName} = unref(mapRegionCache) || {}  
316 - const cityOptions = await getAreaLists(areaEnum.CITY, adcode)  
317 - console.log(cityOptions,'cityOptions')  
318 - datasetMap3DList.value.forEach((item:any)=>{  
319 - item.name=areaName  
320 - item.city_name=areaName?areaName:null  
321 - item.adcode=adcode,  
322 - item.cityOptions = cityOptions && cityOptions.length?cityOptions:[{adcode,label:areaName,value:areaName}]  
323 - }) 267 + if (mapRegionCache.value.adcode !== 'china') {
  268 + //清空区块配置和柱状配置
  269 + props.optionData.dataset.map3D = [cloneDeep(STATIC_SCATTER_CONFIG)]
  270 + props.optionData.dataset.bar3D = [cloneDeep(STATIC_SCATTER_CONFIG)]
  271 + setDatasetArea()
324 } 272 }
325 } 273 }
326 274
  275 +const setDatasetArea = async () => {
  276 + const { adcode, areaName } = unref(mapRegionCache) || {}
  277 + const cityOptions = await getAreaLists(areaEnum.CITY, adcode)
  278 + // 循环 push 城市数据
  279 + datasetMap3DList.value.forEach((item: any) => {
  280 + item.name = areaName
  281 + item.city_name = null
  282 + item.adcode = null,
  283 + item.cityOptions = cityOptions && cityOptions.length ? cityOptions : [{ adcode, label: areaName, value: areaName }]
  284 + })
  285 +}
  286 +
327 const handleChangeDrillingIn = () => { 287 const handleChangeDrillingIn = () => {
328 SelectCityRef.value?.resetValue() 288 SelectCityRef.value?.resetValue()
329 props.optionData.mapRegion.adcode = 'china' 289 props.optionData.mapRegion.adcode = 'china'
@@ -309,7 +309,7 @@ const handleDataPoint = (newData: string | number, areaName: string) => { @@ -309,7 +309,7 @@ const handleDataPoint = (newData: string | number, areaName: string) => {
309 item.data = cloneDeepData.filter((item: Recordable) => item.name !== null) || [] 309 item.data = cloneDeepData.filter((item: Recordable) => item.name !== null) || []
310 } 310 }
311 if (item.type === ThreeMapEnum.BAR3D) { 311 if (item.type === ThreeMapEnum.BAR3D) {
312 - item.data = dataset.value[ThreeMapEnum.BAR3D].filter((dataItem: dataPointI) => dataItem.adcode === newData) 312 + item.data = dataset.value[ThreeMapEnum.BAR3D]
313 } 313 }
314 }) 314 })
315 } 315 }
@@ -322,24 +322,23 @@ watch( @@ -322,24 +322,23 @@ watch(
322 async (newData: number | string) => { 322 async (newData: number | string) => {
323 try { 323 try {
324 await getGeojson(newData) 324 await getGeojson(newData)
325 - const { distance, zoom, alpha } = setScale(String(newData)) 325 + const { distance} = setScale(String(newData))
326 const option = props.chartConfig.option 326 const option = props.chartConfig.option
327 // 修复缩放 327 // 修复缩放
328 - const { series } = option || {} 328 + const { series,geo3D } = option || {}
  329 +
329 series?.forEach((item: Recordable) => { 330 series?.forEach((item: Recordable) => {
330 if (item.type === 'map3D') { 331 if (item.type === 'map3D') {
331 item.viewControl = { 332 item.viewControl = {
332 ...item?.viewControl, 333 ...item?.viewControl,
333 distance, 334 distance,
334 - zoom,  
335 - alpha  
336 } 335 }
337 } 336 }
338 }) 337 })
339 handleRegisterMapNameAndData(newData, dataset.value, mapRegion.value.areaName) 338 handleRegisterMapNameAndData(newData, dataset.value, mapRegion.value.areaName)
340 handleDataPoint(newData, mapRegion.value.areaName) 339 handleDataPoint(newData, mapRegion.value.areaName)
341 changeOption.value = true 340 changeOption.value = true
342 - handleSetOption(chartInstance.value!, { ...option, series }) 341 + handleSetOption(chartInstance.value!, { ...option, series ,geo3D:{...geo3D,viewControl:{distance:distance}}})
343 } catch (error) { 342 } catch (error) {
344 console.error('展示区域发生变化出错,出错原因->', error) 343 console.error('展示区域发生变化出错,出错原因->', error)
345 } 344 }
@@ -366,4 +365,14 @@ const stopWatch = watch( @@ -366,4 +365,14 @@ const stopWatch = watch(
366 deep: true 365 deep: true
367 } 366 }
368 ) 367 )
  368 +watch(()=>props.chartConfig.option.isShowExecute,async()=>{
  369 + const {adcode,areaName} = props.chartConfig.option.mapRegion || {}
  370 + handleRegisterMapNameAndData(adcode,dataset.value,mapRegion.value.areaName)
  371 + handleDataPoint(adcode,areaName)
  372 +
  373 + const { distance } = setScale(String(adcode))
  374 + const option = props.chartConfig.option
  375 + const { series,geo3D } = option || {}
  376 + handleSetOption(chartInstance.value!, { ...option, series ,geo3D:{...geo3D,viewControl:{distance:distance}}})
  377 +})
369 </script> 378 </script>