Sfoglia il codice sorgente

feat:飞线图开发

liu.tao3 1 anno fa
parent
commit
a8c4e3a469

+ 282 - 0
data-room-ui/packages/BasicComponents/FlyMap/index.vue

@@ -0,0 +1,282 @@
+<template>
+  <div
+    style="width: 100%; height: 100%"
+    class="bs-design-wrap bs-bar"
+  >
+    <div
+      :id="`chart${config.code}`"
+      style="width: 100%; height: 100%"
+    />
+  </div>
+</template>
+<script>
+import 'insert-css'
+import * as echarts from 'echarts'
+import {nameMap} from './json/mapData.js'
+import commonMixins from 'data-room-ui/js/mixins/commonMixins.js'
+import paramsMixins from 'data-room-ui/js/mixins/paramsMixins'
+import linkageMixins from 'data-room-ui/js/mixins/linkageMixins'
+export default {
+  name: 'MapCharts',
+  mixins: [paramsMixins, commonMixins, linkageMixins],
+  props: {
+    id: {
+      type: String,
+      default: ''
+    },
+    config: {
+      type: Object,
+      default: () => ({})
+    }
+  },
+  data () {
+    return {
+      charts: null,
+      hasData: false
+    }
+  },
+  computed: {
+    Data () {
+      return JSON.parse(JSON.stringify(this.config))
+    }
+  },
+  watch: {
+    Data: {
+      handler (newVal, oldVal) {
+        if (newVal.w !== oldVal.w || newVal.h !== oldVal.h) {
+          this.$nextTick(() => {
+            this.charts.resize()
+          })
+        }
+      },
+      deep: true
+    }
+  },
+  mounted () {
+    this.chartInit()
+  },
+  beforeDestroy () {
+    this.charts?.clear()
+  },
+  methods: {
+    chartInit () {
+      const config = this.config
+      // key和code相等,说明是一进来刷新,调用list接口
+      if (this.config.code === this.config.key || this.isPreview) {
+        // 改变数据
+        this.changeDataByCode(config).then((res) => {
+          // 改变样式
+          // config = this.changeStyle(res)
+          this.newChart(config)
+        }).catch(() => {})
+      } else {
+        // 否则说明是更新,这里的更新只指更新数据(改变样式时是直接调取changeStyle方法),因为更新数据会改变key,调用chart接口
+        this.changeData(config).then((res) => {
+          // 初始化图表
+          this.newChart(res)
+        })
+      }
+    },
+    dataFormatting (config, data) {
+      config.option = {
+        ...config.option,
+        data: data?.data
+      }
+      return config
+    },
+    async newChart (config) {
+      this.charts = echarts.init(
+        document.getElementById(`chart${this.config.code}`)
+      )
+
+      const lines_coord = []
+      let fromCoord=[]
+      let coord=[]
+      const mapUrl =config.customize.level==='world'?`${window.BS_CONFIG?.httpConfigs?.baseURL}/static/worldMap/world.json`:`${window.BS_CONFIG?.httpConfigs?.baseURL}/static/chinaMap/${config.customize.level}/${config.customize.dataMap}`
+      this.$dataRoomAxios.get(decodeURI(mapUrl), {}, true).then(res=>{
+        this.config.option.data.forEach(val => {
+          lines_coord.push({value:val.value,msg:{...val}, coords:[[val.lat1,val.lng1],[val.lat2,val.lng2]]})
+          if(val.type==='move_in'){
+            coord.push({name:val.from,value:[val.lat1,val.lng1,val.value],msg:{...val}})
+            fromCoord.push({name:val.to,value:[val.lat2,val.lng2,val.value],msg:{...val}})
+          }
+          if(val.type==='move_out'){
+            coord.push({name:val.to,value:[val.lat2,val.lng2,val.value],msg:{...val}})
+            fromCoord.push({name:val.from,value:[val.lat1,val.lng1,val.value],msg:{...val}})
+          }
+        })
+        echarts.registerMap(config.customize.scope, res)
+        const option = {
+          // nameMap: nameMap,
+          graphic: [
+          ],
+          geo: {
+            map: config.customize.scope,
+            zlevel: 10,
+            show:true,
+            layoutCenter: ['50%', '50%'],
+            roam: true,
+            layoutSize: "100%",
+            zoom: 1,
+            label: {
+              // 通常状态下的样式
+              normal: {
+                show: config.customize.mapName,
+                textStyle: {
+                  color: '#fff'
+                }
+              },
+              // 鼠标放上去的样式
+              emphasis: {
+                textStyle: {
+                  color: '#fff'
+                }
+              }
+            },
+            // 地图区域的样式设置
+            itemStyle: {
+              normal: {
+                borderColor: config.customize.mapLineColor,
+                borderWidth: 1,
+                areaColor: config.customize.areaColor,
+                shadowColor: 'fffff',
+                shadowOffsetX: -2,
+                shadowOffsetY: 2,
+                shadowBlur: 10
+              },
+              // 鼠标放上去高亮的样式
+              emphasis: {
+                areaColor: '#389BB7',
+                borderWidth: 0
+              }
+            }
+          },
+          tooltip: {
+            backgroundColor: config.customize.tooltipBackgroundColor,
+            borderColor: config.customize.borderColor,
+            show: true,
+             textStyle: {
+              color: config.customize.fontColor,
+            },
+          },
+          series: [
+            {
+                type:'effectScatter',
+                coordinateSystem: 'geo',
+                zlevel: 15,
+                symbolSize:8,
+                rippleEffect: {
+                    period: 4, brushType: 'stroke', scale: 4
+                },
+                 tooltip: {
+                    trigger: 'item',
+                    formatter(params) {
+                    const a= eval(config.customize.scatterFormatter)
+                      return a
+                    },
+                },
+                itemStyle:{
+                    color:config.customize.scatterColor,
+                    opacity:1
+                },
+                data:coord
+            },
+            {
+                type:'effectScatter',
+                coordinateSystem: 'geo',
+                zlevel: 15,
+                symbolSize:12,
+                tooltip: {
+                  trigger: 'item',
+                  formatter(params) {
+                   const a= eval(config.customize.scatterFormatter)
+                    return a
+                  },
+                },
+                rippleEffect: {
+                    period: 6, brushType: 'stroke', scale: 8
+                },
+
+                itemStyle:{
+                    color:config.customize.scatterCenterColor,
+                    opacity:1
+                },
+                data:fromCoord
+            },
+            {
+                type:'lines',
+                coordinateSystem:'geo',
+                zlevel: 15,
+                tooltip: {
+                  trigger: 'item',
+                  formatter(params) {
+                   const a= eval(config.customize.lineFormatter)
+                    return a
+                  },
+                },
+                effect: {
+                    show: true, period: 5, trailLength: 0, symbol: config.customize.symbol,  color:config.customize.symbolColor,symbolSize: config.customize.symbolSize,
+                },
+                lineStyle: {
+                  normal: {color: function(value){
+                      return '#ffffff'
+                  },width: 2, opacity: 0.6, curveness: 0.2 }
+                },
+                data:lines_coord
+            }
+
+          ]
+        }
+        if (config.customize.visual) {
+          option.visualMap = {
+            show: false,
+            min: config.customize.range[0],
+            max: config.customize.range[1],
+            seriesIndex: [0,2],
+            inRange: {
+              color: config.customize.rangeColor
+            }
+          }
+        }
+        if(config.customize.down){
+            config?.customize?.graphic?.forEach((item,index)=>{
+            option.graphic.push({
+              type: "text",
+              left: `${(index+1) * 200}px`,
+              top: "2%",
+              style: {
+                  text: item,
+                  font: `bolder ${config.customize.fontSize}px "Microsoft YaHei", sans-serif`,
+                  fill: config.customize.fontGraphicColor,
+              },
+              onclick:()=>{
+                console.log(item,item=='中华人民共和国'?'country': 'province')
+                const arr=config.customize.graphic.slice(0,index+1)
+                console.log(arr,config.customize.graphic)
+                this.$store.commit('bigScreen/changeActiveItemConfig', { ...config, customize: { ...config.customize,dataMap:`${item}.json`,graphic:[...arr],level:item=='中华人民共和国'?'country': 'province'}})
+              }
+            },)
+          })
+          }
+        this.charts.setOption(option)
+         this.charts.on('click',  (params)=> {
+          if(params.name=='') return
+          if(config.customize.down===false||config.customize.level==='province') return
+          this.$store.commit('bigScreen/changeActiveItemConfig', { ...config, customize: { ...config.customize,dataMap:`${params.name}.json`,graphic:[...config.customize.graphic,params.name], level:config.customize.level==='country'?'province':'country'} })
+          });
+      })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+@import '../../assets/style/echartStyle';
+.light-theme {
+  background-color: #ffffff;
+  color: #000000;
+}
+.auto-theme {
+  background-color: rgba(0, 0, 0, 0);
+}
+</style>

+ 219 - 0
data-room-ui/packages/BasicComponents/FlyMap/json/mapData.js

@@ -0,0 +1,219 @@
+export const nameMap = {
+  Afghanistan: '阿富汗',
+  Singapore: '新加坡',
+  Angola: '安哥拉',
+  Albania: '阿尔巴尼亚',
+  'United Arab Emirates': '阿联酋',
+  Argentina: '阿根廷',
+  Armenia: '亚美尼亚',
+  'French Southern and Antarctic Lands':
+      '法属南半球和南极领地',
+  Australia: '澳大利亚',
+  Austria: '奥地利',
+  Azerbaijan: '阿塞拜疆',
+  Burundi: '布隆迪',
+  Belgium: '比利时',
+  Benin: '贝宁',
+  'Burkina Faso': '布基纳法索',
+  Bangladesh: '孟加拉国',
+  Bulgaria: '保加利亚',
+  'The Bahamas': '巴哈马',
+  'Bosnia and Herzegovina': '波斯尼亚和黑塞哥维那',
+  Belarus: '白俄罗斯',
+  Belize: '伯利兹',
+  Bermuda: '百慕大',
+  Bolivia: '玻利维亚',
+  Brazil: '巴西',
+  Brunei: '文莱',
+  Bhutan: '不丹',
+  Botswana: '博茨瓦纳',
+  'Central African Republic': '中非共和国',
+  Canada: '加拿大',
+  Switzerland: '瑞士',
+  Chile: '智利',
+  China: '中国',
+  'Ivory Coast': '象牙海岸',
+  Cameroon: '喀麦隆',
+  'Democratic Republic of the Congo': '刚果民主共和国',
+  'Republic of the Congo': '刚果共和国',
+  Colombia: '哥伦比亚',
+  'Costa Rica': '哥斯达黎加',
+  Cuba: '古巴',
+  'Northern Cyprus': '北塞浦路斯',
+  Cyprus: '塞浦路斯',
+  'Czech Republic': '捷克共和国',
+  Germany: '德国',
+  Djibouti: '吉布提',
+  Denmark: '丹麦',
+  'Dominican Republic': '多明尼加共和国',
+  Algeria: '阿尔及利亚',
+  Ecuador: '厄瓜多尔',
+  Egypt: '埃及',
+  Eritrea: '厄立特里亚',
+  Spain: '西班牙',
+  Estonia: '爱沙尼亚',
+  Ethiopia: '埃塞俄比亚',
+  Finland: '芬兰',
+  Fiji: '斐',
+  'Falkland Islands': '福克兰群岛',
+  France: '法国',
+  Gabon: '加蓬',
+  'United Kingdom': '英国',
+  Georgia: '格鲁吉亚',
+  Ghana: '加纳',
+  Guinea: '几内亚',
+  Gambia: '冈比亚',
+  'Guinea Bissau': '几内亚比绍',
+  Greece: '希腊',
+  Greenland: '格陵兰',
+  Guatemala: '危地马拉',
+  'French Guiana': '法属圭亚那',
+  Guyana: '圭亚那',
+  Honduras: '洪都拉斯',
+  Croatia: '克罗地亚',
+  Haiti: '海地',
+  Hungary: '匈牙利',
+  Indonesia: '印度尼西亚',
+  India: '印度',
+  Ireland: '爱尔兰',
+  Iran: '伊朗',
+  Iraq: '伊拉克',
+  Iceland: '冰岛',
+  Israel: '以色列',
+  Italy: '意大利',
+  Jamaica: '牙买加',
+  Jordan: '约旦',
+  Japan: '日本',
+  Kazakhstan: '哈萨克斯坦',
+  Kenya: '肯尼亚',
+  Kyrgyzstan: '吉尔吉斯斯坦',
+  Cambodia: '柬埔寨',
+  Kosovo: '科索沃',
+  Kuwait: '科威特',
+  Laos: '老挝',
+  Lebanon: '黎巴嫩',
+  Liberia: '利比里亚',
+  Libya: '利比亚',
+  'Sri Lanka': '斯里兰卡',
+  Lesotho: '莱索托',
+  Lithuania: '立陶宛',
+  Luxembourg: '卢森堡',
+  Latvia: '拉脱维亚',
+  Morocco: '摩洛哥',
+  Moldova: '摩尔多瓦',
+  Madagascar: '马达加斯加',
+  Mexico: '墨西哥',
+  Macedonia: '马其顿',
+  Mali: '马里',
+  Myanmar: '缅甸',
+  Montenegro: '黑山',
+  Mongolia: '蒙古',
+  Mozambique: '莫桑比克',
+  Mauritania: '毛里塔尼亚',
+  Malawi: '马拉维',
+  Malaysia: '马来西亚',
+  Namibia: '纳米比亚',
+  'New Caledonia': '新喀里多尼亚',
+  Niger: '尼日尔',
+  Nigeria: '尼日利亚',
+  Nicaragua: '尼加拉瓜',
+  Netherlands: '荷兰',
+  Norway: '挪威',
+  Nepal: '尼泊尔',
+  'New Zealand': '新西兰',
+  Oman: '阿曼',
+  Pakistan: '巴基斯坦',
+  Panama: '巴拿马',
+  Peru: '秘鲁',
+  Philippines: '菲律宾',
+  'Papua New Guinea': '巴布亚新几内亚',
+  Poland: '波兰',
+  'Puerto Rico': '波多黎各',
+  'North Korea': '北朝鲜',
+  Portugal: '葡萄牙',
+  Paraguay: '巴拉圭',
+  Qatar: '卡塔尔',
+  Romania: '罗马尼亚',
+  Russia: '俄罗斯',
+  Rwanda: '卢旺达',
+  'Western Sahara': '西撒哈拉',
+  'Saudi Arabia': '沙特阿拉伯',
+  Sudan: '苏丹',
+  'South Sudan': '南苏丹',
+  Senegal: '塞内加尔',
+  'Solomon Islands': '所罗门群岛',
+  'Sierra Leone': '塞拉利昂',
+  'El Salvador': '萨尔瓦多',
+  Somaliland: '索马里兰',
+  Somalia: '索马里',
+  'Republic of Serbia': '塞尔维亚',
+  Suriname: '苏里南',
+  Slovakia: '斯洛伐克',
+  Slovenia: '斯洛文尼亚',
+  Sweden: '瑞典',
+  Swaziland: '斯威士兰',
+  Syria: '叙利亚',
+  Chad: '乍得',
+  Togo: '多哥',
+  Thailand: '泰国',
+  Tajikistan: '塔吉克斯坦',
+  Turkmenistan: '土库曼斯坦',
+  'East Timor': '东帝汶',
+  'Trinidad and Tobago': '特里尼达和多巴哥',
+  Tunisia: '突尼斯',
+  Turkey: '土耳其',
+  'United Republic of Tanzania': '坦桑尼亚',
+  Uganda: '乌干达',
+  Ukraine: '乌克兰',
+  Uruguay: '乌拉圭',
+  'United States': '美国',
+  Uzbekistan: '乌兹别克斯坦',
+  Venezuela: '委内瑞拉',
+  Vietnam: '越南',
+  Vanuatu: '瓦努阿图',
+  'West Bank': '西岸',
+  Yemen: '也门',
+  'South Africa': '南非',
+  Zambia: '赞比亚',
+  Korea: '韩国',
+  Tanzania: '坦桑尼亚',
+  Zimbabwe: '津巴布韦',
+  Congo: '刚果',
+  'Central African Rep.': '中非',
+  Serbia: '塞尔维亚',
+  'Bosnia and Herz.': '波黑',
+  'Czech Rep.': '捷克',
+  'W. Sahara': '西撒哈拉',
+  'Lao PDR': '老挝',
+  'Dem.Rep.Korea': '朝鲜',
+  'Falkland Is.': '福克兰群岛',
+  'Timor-Leste': '东帝汶',
+  'Solomon Is.': '所罗门群岛',
+  Palestine: '巴勒斯坦',
+  'N. Cyprus': '北塞浦路斯',
+  Aland: '奥兰群岛',
+  'Fr. S. Antarctic Lands': '法属南半球和南极陆地',
+  Mauritius: '毛里求斯',
+  Comoros: '科摩罗',
+  'Eq. Guinea': '赤道几内亚',
+  'Guinea-Bissau': '几内亚比绍',
+  'Dominican Rep.': '多米尼加',
+  'Saint Lucia': '圣卢西亚',
+  Dominica: '多米尼克',
+  'Antigua and Barb.': '安提瓜和巴布达',
+  'U.S. Virgin Is.': '美国原始岛屿',
+  Montserrat: '蒙塞拉特',
+  Grenada: '格林纳达',
+  Barbados: '巴巴多斯',
+  Samoa: '萨摩亚',
+  Bahamas: '巴哈马',
+  'Cayman Is.': '开曼群岛',
+  'Faeroe Is.': '法罗群岛',
+  'IsIe of Man': '马恩岛',
+  Malta: '马耳他共和国',
+  Jersey: '泽西',
+  'Cape Verde': '佛得角共和国',
+  'Turks and Caicos Is.': '特克斯和凯科斯群岛',
+  'St. Vin. and Gren.': '圣文森特和格林纳丁斯'
+}
+

+ 382 - 0
data-room-ui/packages/BasicComponents/FlyMap/setting.vue

@@ -0,0 +1,382 @@
+<template>
+  <div class="bs-setting-wrap">
+    <el-form
+      ref="form"
+      :model="config"
+      label-width="90px"
+      label-position="left"
+      class="setting-body bs-el-form"
+    >
+      <SettingTitle>标题</SettingTitle>
+      <div class="lc-field-body">
+        <el-form-item
+          label="标题"
+          label-width="100px"
+        >
+          <el-input
+            v-model="config.title"
+            placeholder="请输入标题"
+            clearable
+          />
+        </el-form-item>
+      </div>
+      <SettingTitle>位置</SettingTitle>
+      <div class="lc-field-body">
+        <PosWhSetting :config="config" />
+      </div>
+      <SettingTitle>基础</SettingTitle>
+      <div class="lc-field-body">
+        <el-form-item
+          label="是否显示地名"
+          label-width="100px"
+        >
+          <el-switch
+            v-model="config.customize.mapName"
+            class="bs-el-switch"
+            active-color="#007aff"
+          />
+        </el-form-item>
+        <el-form-item
+          label="地图级别"
+          label-width="100px"
+        >
+          <el-select
+            v-model="config.customize.level"
+            popper-class="bs-el-select"
+            class="bs-el-select"
+            @change="changeLevel()"
+          >
+           <el-option
+              label="世界"
+              value="world"
+            />
+            <el-option
+              label="国家"
+              value="country"
+            />
+            <el-option
+              label="省份"
+              value="province"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item
+          v-if="config.customize.level == 'province'"
+          label="地图显示区域"
+          label-width="100px"
+        >
+          <el-select
+            v-model="config.customize.dataMap"
+            popper-class="bs-el-select"
+            class="bs-el-select"
+          >
+            <el-option
+              v-for="map in mapList"
+              :key="map.name"
+              :label="map.name"
+              :value="map.url"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item
+          v-if="config.customize.level !== 'world'"
+          label="是否开启下钻"
+          label-width="100px"
+        >
+          <el-switch
+            v-model="config.customize.down"
+            class="bs-el-switch"
+            active-color="#007aff"
+          />
+        </el-form-item>
+        <el-form-item
+          label="地图分割线颜色"
+          label-width="100px"
+        >
+          <ColorPicker
+            v-model="config.customize.mapLineColor"
+            :predefine-colors="predefineThemeColors"
+          />
+        </el-form-item>
+        <el-form-item
+          label="地图分割块颜色"
+          label-width="100px"
+        >
+          <ColorPicker
+            v-model="config.customize.areaColor"
+            :predefine-colors="predefineThemeColors"
+          />
+        </el-form-item>
+        <el-form-item
+          label="悬浮框背景色"
+          label-width="100px"
+        >
+          <ColorPicker
+            v-model="config.customize.tooltipBackgroundColor"
+            :predefine-colors="predefineThemeColors"
+          />
+        </el-form-item>
+        <el-form-item
+          label="悬浮框边框色"
+          label-width="100px"
+        >
+          <ColorPicker
+            v-model="config.customize.borderColor"
+            :predefine-colors="predefineThemeColors"
+          />
+        </el-form-item>
+        <el-form-item
+          label="悬浮框字体颜色"
+          label-width="100px"
+        >
+          <ColorPicker
+            v-model="config.customize.fontColor"
+            :predefine-colors="predefineThemeColors"
+          />
+        </el-form-item>
+        <el-form-item
+          label="线悬浮框内容"
+          label-width="100px"
+        >
+          <el-input :rows="8" v-model="config.customize.lineFormatter" type="textarea"></el-input>
+        </el-form-item>
+        <el-form-item
+          label="点悬浮框内容"
+          label-width="100px"
+        >
+          <el-input :rows="4" v-model="config.customize.scatterFormatter" type="textarea"></el-input>
+        </el-form-item>
+        <el-form-item
+          label="轨迹样式"
+          label-width="100px"
+        >
+           <el-select
+            v-model="config.customize.symbol"
+            popper-class="bs-el-select"
+            class="bs-el-select"
+          >
+            <el-option
+              v-for="symbol in symbolList"
+              :key="symbol.name"
+              :label="symbol.name"
+              :value="symbol.value"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item
+          label="轨迹颜色"
+          label-width="100px"
+        >
+            <ColorPicker
+            v-model="config.customize.symbolColor"
+            :predefine-colors="predefineThemeColors"
+          />
+        </el-form-item>
+        <el-form-item
+          label="轨迹大小"
+          label-width="100px"
+        >
+          <el-input-number
+            v-model="config.customize.symbolSize"
+            placeholder="请输入轨迹大小"
+            controls-position="right"
+            :step="1"
+          />
+        </el-form-item>
+        <el-form-item
+          label="普通点颜色"
+          label-width="100px"
+        >
+            <ColorPicker
+            v-model="config.customize.scatterColor"
+            :predefine-colors="predefineThemeColors"
+          />
+        </el-form-item>
+        <el-form-item
+          label="中心点颜色"
+          label-width="100px"
+        >
+            <ColorPicker
+            v-model="config.customize.scatterCenterColor"
+            :predefine-colors="predefineThemeColors"
+          />
+        </el-form-item>
+        <el-form-item
+          label="是否开启筛选"
+          label-width="100px"
+        >
+          <el-switch
+            v-model="config.customize.visual"
+            class="bs-el-switch"
+            active-color="#007aff"
+          />
+        </el-form-item>
+        <el-form-item
+          v-if="config.customize.visual"
+          label="数值范围"
+          label-width="100px"
+        >
+          <el-input-number
+            v-model="config.customize.range[0]"
+            placeholder="请输入最小值"
+            controls-position="right"
+            :step="1"
+          />
+          -
+          <el-input-number
+            v-model="config.customize.range[1]"
+            controls-position="right"
+            placeholder="请输入最大值"
+            :step="1"
+          />
+        </el-form-item>
+        <el-form-item
+          v-if="config.customize.visual"
+          label="配色方案"
+          label-width="100px"
+        >
+          <color-select
+            v-model="config.customize.rangeColor"
+            @update="updateColorScheme"
+          />
+          <div
+            style="
+                display: flex;
+                align-items: center;
+                height: 42px;
+                flex-wrap: wrap;
+              "
+          >
+            <el-color-picker
+              v-for="(colorItem, index) in colors"
+              :key="index"
+              v-model="config.customize.rangeColor[index]"
+              show-alpha
+              popper-class="bs-el-color-picker"
+              class="start-color bs-el-color-picker"
+            />
+            <span
+              class="el-icon-circle-plus-outline"
+              style="color: #007aff; font-size: 20px"
+              @click="addColor"
+            />
+            <span
+              v-if="colors.length"
+              class="el-icon-remove-outline"
+              style="color: #ea0b30; font-size: 20px"
+              @click="delColor"
+            />
+          </div>
+        </el-form-item>
+      </div>
+    </el-form>
+  </div>
+</template>
+<script>
+import SettingTitle from 'data-room-ui/SettingTitle/index.vue'
+import { chartSettingMixins } from 'data-room-ui/js/mixins/chartSettingMixins'
+import ColorSelect from 'data-room-ui/ColorMultipleSelect/index.vue'
+import ColorPicker from 'data-room-ui/ColorPicker/index.vue'
+import PosWhSetting from 'data-room-ui/BigScreenDesign/RightSetting/PosWhSetting.vue'
+export default {
+  name: 'BarSetting',
+  components: {
+    ColorSelect,
+    ColorPicker,
+    PosWhSetting,
+    SettingTitle
+  },
+  mixins: [chartSettingMixins],
+  props: {},
+  data () {
+    return {
+      mapList: [],
+      predefineThemeColors: [
+        '#007aff',
+        '#1aa97b',
+        '#ff4d53',
+        '#1890FF',
+        '#DF0E1B',
+        '#0086CC',
+        '#2B74CF',
+        '#00BC9D',
+        '#ED7D32'
+      ],
+      symbolList:[
+        {
+          name:'箭头',
+          value:'arrow'
+        }
+      ]
+    }
+  },
+  computed: {
+    config: {
+      get () {
+        return this.$store.state.bigScreen.activeItemConfig
+      },
+      set (val) {
+        this.$store.state.bigScreen.activeItemConfig = val
+      }
+    }
+  },
+  watch: {
+    'config.customize.level': {
+      handler (val) {
+        this.getMapList()
+      }
+    }
+  },
+  mounted () {
+    this.getMapList()
+  },
+  methods: {
+    getMapList () {
+      this.$dataRoomAxios.get(`${window.BS_CONFIG?.httpConfigs?.baseURL}/bigScreen/design/map/list/${this.config.customize.level}`).then((res) => {
+        this.mapList = res
+      })
+    },
+    changeLevel () {
+      if (this.config.customize.level === 'country') {
+        this.config.customize.dataMap = '中华人民共和国.json'
+      } else if (this.config.customize.level === 'province') {
+        this.getMapList()
+        this.config.customize.dataMap = '安徽省.json'
+      }else{
+        this.config.customize.down=false
+      }
+    },
+    delColor () {
+      this.colors = []
+      this.config.customize.rangeColor = []
+    },
+    addColor () {
+      this.colors.push('')
+    },
+    updateColorScheme (colors) {
+      this.colors = [...colors]
+      this.config.customize.rangeColor = [...colors]
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+@import '../../assets/style/settingWrap.scss';
+@import '../../assets/style/bsTheme.scss';
+// 筛选条件的按钮样式
+.add-filter-box {
+  position: relative;
+  .add-filter {
+    margin-left: 90px;
+    margin-bottom: 10px;
+  }
+  .add-filter-btn {
+    position: absolute;
+    top: 0;
+  }
+}
+.lc-field-body {
+  padding: 12px 16px;
+}
+</style>

+ 123 - 0
data-room-ui/packages/BasicComponents/FlyMap/settingConfig.js

@@ -0,0 +1,123 @@
+import { commonConfig, displayOption } from 'data-room-ui/js/config'
+// import Icon from 'data-room-ui/assets/images/bigScreenIcon/export'
+import cloneDeep from 'lodash/cloneDeep'
+import * as iconData from 'data-room-ui/assets/symbols/bigScreenIcon/iconfont.json'
+const iconNames = iconData.glyphs.map(item => item.name).sort((a, b) => a.localeCompare(b))
+export const settingConfig = {
+  padding: [30, 30, 50, 80],
+  legend: false,
+  isGroup: true,
+  data: [],
+  color: '',
+  theme: 'dark',
+  displayOption: {
+    ...displayOption,
+    params: {
+      enable: true
+    },
+    headerField: {
+      enable: false
+    },
+    mapField: {
+      enable: false
+    },
+    metricField: {
+      // 指标
+      label: '维度',
+      enable: false,
+      multiple: false // 是否多选
+    },
+    dimensionField: {
+      // 表格列
+      label: '展示字段', // 维度/查询字段
+      enable: false,
+      multiple: false // 是否多选
+    }
+  }
+}
+const customConfig = {
+  type: 'flyMap',
+  root: {
+    version: '2023071001',
+    contribution: false
+  },
+  customize: {
+    // 是否显示文字
+    mapName: false,
+    // 悬浮框背景色
+    tooltipBackgroundColor: '#0C121C',
+    // 悬浮框边框色
+    borderColor: 'rgba(0, 0, 0, 0.16)',
+    // 悬浮框字体颜色
+    fontColor:'#DADADA',
+    // 打点图背景颜色
+    scatterBackgroundColor: 'rgba(255,0,0,.7)',
+    // 打点图文字颜色
+    scatterColor: 'rgba(165, 108, 91, 1)',
+    // 打点图中心点文字颜色
+    scatterCenterColor:'rgba(205, 196, 110, 1)',
+    // 分割线颜色
+    mapLineColor: 'rgba(53, 86, 165, 1)',
+    // 水印字体颜色
+    fontGraphicColor: '#fff',
+    fontSize:'30',
+    // 是否开启下钻
+    down: false,
+    // 轨迹图像
+    symbol: 'arrow',
+    // 轨迹颜色
+    symbolColor: '#01AAED',
+    // 轨迹大小
+    symbolSize:8,
+    // 地图级别
+    level: 'country',
+    // 范围
+    scope: '中国',
+    // 地图区域颜色
+    areaColor: 'rgba(31, 50, 121, 1)',
+    // 是否开启筛选
+    visual: true,
+    graphic:['中华人民共和国'],
+    // 筛选范围
+    range: [0, 100],
+    scatterFormatter:'`<p style="text-align:center;font-size: 14px">${params.name}</p>`',
+    // 格式化脚本
+    lineFormatter:'`<p style="font-size: 16px">销售额</p><div>${params.data.msg.from}-->${params.data.msg.to} ${params.data.msg.value} </div>`',
+    // 从上到下的颜色
+    rangeColor: ['rgba(165, 108, 91, 1)', 'rgba(205, 196, 110, 1)'],
+    // 地图数据
+    dataMap: '中华人民共和国.json',
+    // 展示字段
+    value: '',
+    // 横坐标
+    xaxis: '',
+    // 纵坐标
+    yaxis: '',
+    // 名称
+    name: ''
+
+  }
+}
+
+export const dataConfig = {
+  ...commonConfig(customConfig)
+}
+
+export const FlyMapData = {
+  name: '飞线图',
+  title: '飞线图',
+  icon: iconNames[5],
+  className:
+    'com.gccloud.dataroom.core.module.chart.components.ScreenFlyMapChart',
+  w: 800,
+  h: 700,
+  x: 0,
+  y: 0,
+  type: 'flyMap',
+  option: {
+    ...cloneDeep(settingConfig)
+  },
+  setting: undefined, // 右侧面板自定义配置
+  dataHandler: {}, // 数据自定义处理js脚本
+  ...cloneDeep(dataConfig)
+}

+ 1 - 1
data-room-ui/packages/BigScreenDesign/RightSetting/DataSetting.vue

@@ -67,7 +67,7 @@
           class="data-setting-data-box"
         >
           <div class="lc-field-head">
-            <div class="lc-field-title">
+            <div v-if="config.type!=='flyMap'" class="lc-field-title">
               数据配置
             </div>
           </div>

+ 1 - 1
data-room-ui/packages/BigScreenDesign/index.vue

@@ -406,7 +406,7 @@ export default {
     },
     // 自定义属性更新
     updateSetting (config) {
-      if (config.type === 'map' || config.type === 'video') {
+      if (config.type === 'map' || config.type === 'video' ||config.type === 'flyMap') {
         config.key = new Date().getTime()
       }
       this.changeChartConfig(cloneDeep(config))

+ 0 - 2
data-room-ui/packages/DataSetManagement/src/OriginalEditForm.vue

@@ -162,7 +162,6 @@
                         :key="table.name"
                         :label="table.name"
                         :value="table.name"
-                        :disabled="table.status == 1"
                       />
                     </el-option-group>
                     <el-option-group label="视图">
@@ -171,7 +170,6 @@
                         :key="table.name"
                         :label="table.name"
                         :value="table.name"
-                        :disabled="table.status == 1"
                       />
                     </el-option-group>
                   </el-select>

+ 2 - 1
data-room-ui/packages/G2Plots/plotList.js

@@ -5,6 +5,7 @@
  */
 import { dataConfig, settingConfig } from '../PlotRender/settingConfig'
 import { mapData } from 'data-room-ui/BasicComponents/Map/settingConfig'
+import { FlyMapData } from 'data-room-ui/BasicComponents/FlyMap/settingConfig'
 // import _ from 'lodash'
 import cloneDeep from 'lodash/cloneDeep'
 import sortList from './plotListSort'
@@ -85,5 +86,5 @@ export function getCustomPlots () {
   return list
 }
 
-const plots = [...plotList, ...customPlots, mapData]
+const plots = [...plotList, ...customPlots, mapData,FlyMapData]
 export default plots

+ 1 - 1
data-room-ui/packages/js/mixins/commonMixins.js

@@ -26,7 +26,7 @@ export default {
     }
   },
   mounted () {
-    if (!['tables'].includes(this.config.type)) {
+    if (!['tables', 'flyMap', 'map'].includes(this.config.type)) {
       this.chartInit()
     }
     this.watchCacheData()

+ 1 - 1
data-room-ui/packages/js/store/mutations.js

@@ -66,7 +66,7 @@ export default {
     state.pageLoading = booleanValue
   },
   // 改变当前组件配置
-  changeChartConfig (state, itemConfig) {
+  changeChartConfig(state, itemConfig) {
     const index = state.pageInfo.chartList.findIndex(
       item => item.code === itemConfig.code
     )