瀏覽代碼

!163 update 1.4.0
Merge pull request !163 from Foming/dev

Foming 1 年之前
父節點
當前提交
8b9ea4efaf
共有 38 個文件被更改,包括 26729 次插入188 次删除
  1. 9 0
      doc/docker/Dockerfile
  2. 7 0
      doc/docker/README.md
  3. 34 0
      doc/docker/docker-compose.yml
  4. 1 0
      doc/docs/.vuepress/config.js
  5. 42 0
      doc/docs/guide/releases/1.4.0.md
  6. 9 12
      report-core/src/main/java/com/anjiplus/template/gaea/business/modules/dashboard/service/impl/ReportDashboardServiceImpl.java
  7. 4 3
      report-core/src/main/java/com/anjiplus/template/gaea/business/modules/datasettransform/service/impl/DataSetTransformServiceImpl.java
  8. 7 16
      report-ui/index.html
  9. 26 3
      report-ui/src/assets/iconfont2/demo_index.html
  10. 7 3
      report-ui/src/assets/iconfont2/iconfont.css
  11. 0 0
      report-ui/src/assets/iconfont2/iconfont.js
  12. 7 0
      report-ui/src/assets/iconfont2/iconfont.json
  13. 二進制
      report-ui/src/assets/iconfont2/iconfont.ttf
  14. 二進制
      report-ui/src/assets/iconfont2/iconfont.woff
  15. 二進制
      report-ui/src/assets/iconfont2/iconfont.woff2
  16. 946 0
      report-ui/src/utils/word.js
  17. 197 0
      report-ui/src/views/bigscreenDesigner/designer/components/customNameComponents.vue
  18. 8 0
      report-ui/src/views/bigscreenDesigner/designer/components/dynamicForm.vue
  19. 458 0
      report-ui/src/views/bigscreenDesigner/designer/tools/configure/mapCharts/widget-china-map.js
  20. 455 0
      report-ui/src/views/bigscreenDesigner/designer/tools/configure/mapCharts/widget-global-map.js
  21. 780 0
      report-ui/src/views/bigscreenDesigner/designer/tools/configure/scatterCharts/widget-scatter.js
  22. 41 36
      report-ui/src/views/bigscreenDesigner/designer/tools/main.js
  23. 371 0
      report-ui/src/views/bigscreenDesigner/designer/widget/map/widgetChinaMap.vue
  24. 343 0
      report-ui/src/views/bigscreenDesigner/designer/widget/map/widgetGlobalMap.vue
  25. 573 0
      report-ui/src/views/bigscreenDesigner/designer/widget/scatter/widgetScatter.vue
  26. 11 10
      report-ui/src/views/bigscreenDesigner/designer/widget/temp.vue
  27. 21 19
      report-ui/src/views/bigscreenDesigner/designer/widget/widget.vue
  28. 128 80
      report-ui/src/views/excelreport/designer/index.vue
  29. 1 1
      report-ui/src/views/layout/components/Sidebar/index.vue
  30. 0 5
      report-ui/static/luckysheet/assets/iconfont/iconfont.css
  31. 0 0
      report-ui/static/luckysheet/css/luckysheet.css
  32. 21 0
      report-ui/static/luckysheet/echarts.min.js
  33. 0 0
      report-ui/static/luckysheet/expendPlugins/chart/chartmix.umd.min.js
  34. 22212 0
      report-ui/static/luckysheet/luckyexcel.umd.js
  35. 0 0
      report-ui/static/luckysheet/luckysheet.umd.js
  36. 0 0
      report-ui/static/luckysheet/plugins/js/plugin.js
  37. 5 0
      report-ui/static/luckysheet/vue@2.6.11.js
  38. 5 0
      report-ui/static/luckysheet/vuex@3.4.0.js

+ 9 - 0
doc/docker/Dockerfile

@@ -0,0 +1,9 @@
+FROM eclipse-temurin:8-jre
+
+RUN mkdir -p /opt/aj-report/logs
+
+WORKDIR /opt/aj-report
+
+COPY ../../build/aj-report-1.3.0.RELEASE /opt/aj-report
+
+CMD /opt/aj-report/bin/start.sh && tail -f /opt/aj-report/logs/aj-report.log

+ 7 - 0
doc/docker/README.md

@@ -0,0 +1,7 @@
+- 1.部署主机需预安装docker及docker compose。
+- 2.参照技术文档快速入门>源码部署章节,解压缩产生build/aj-report-xxxx目录。
+- 3.修改数据库连接,MySQL JDBC url指向部署主机,root密码默认为123456。
+- 4.使用docker-compose up -d命令启动程序即可。
+- 5.MySQL数据存储在目录build/aj-report-mysql。
+- 6.AJ-Report执行日志存储在目录build/aj-report-logs。
+- 7.注意Dockerfile和docker-compose.yml中文件的路径、名称、参数,和你自己系统保持一致。

+ 34 - 0
doc/docker/docker-compose.yml

@@ -0,0 +1,34 @@
+version: "3.8"
+
+services:
+  aj-report:
+    container_name: aj-report
+    build:
+      context: ../..
+    restart: always
+    ports:
+      - 9095:9095
+    environment:
+      TZ: "Asia/Shanghai"
+    volumes:
+      - ./build/aj-report-logs:/opt/aj-report/logs
+    depends_on:
+      - aj-report-mysql
+
+  aj-report-mysql:
+    container_name: aj-report-mysql
+    image: mysql:5.7
+    restart: always
+    ports:
+      - 3306:3306
+    environment:
+      MYSQL_ROOT_PASSWORD: 123456
+      TZ: "Asia/Shanghai"
+    command:
+      --character-set-server=utf8mb4
+      --collation-server=utf8mb4_general_ci
+      --explicit_defaults_for_timestamp=true
+      --lower_case_table_names=1
+      --max_allowed_packet=128M
+    volumes:
+      - ./build/aj-report-mysql:/var/lib/mysql

+ 1 - 0
doc/docs/.vuepress/config.js

@@ -37,6 +37,7 @@ module.exports = {
                         {title: 'V1.1.0', path: '/guide/releases/1.1.0'},
                         {title: 'V1.2.0', path: '/guide/releases/1.2.0'},
                         {title: 'V1.3.0', path: '/guide/releases/1.3.0'},
+                        {title: 'V1.4.0', path: '/guide/releases/1.4.0'},
                     ]
                 },
                 {

+ 42 - 0
doc/docs/guide/releases/1.4.0.md

@@ -0,0 +1,42 @@
+## 注意事项
+
+- 之前版本更新至本版本时,可能会遇到图表不显示静态、动态数据,需对该图表重新配置;如果已对旧版本进行二次开发,请谨慎更新。<br>
+  跨版本更新可查对应版本的[releases](https://gitee.com/anji-plus/report/releases)。<br>
+
+## 新增
+
+- 1、大屏图表-地图系列新增支持配置项选择省市区
+- 2、大屏图表-下拉框提示内容可自定义
+- 3、大屏图表-地图-新增中国色阶图、世界色阶图 --贡献人:雨羽@yuyulian
+- 4、大屏图表-新增散点图 --贡献人:雨羽@yuyulian
+- 5、Excel-新增导入xlsx、导出pdf(内容格式存在问题) --贡献人:雨羽@yuyulian
+- 6、Excel-支持添加图片 --贡献人:雨羽@yuyulian
+- 7、Docker部署说明  --贡献人:tzengshinfu@tzengshinfu
+
+## 优化
+
+- 1、大屏图表-饼图系列优化
+- 2、大屏图表-雷达图系列优化
+- 3、大屏图表-折线图系列优化
+- 4、大屏图表-柱状图系列优化
+- 5、大屏图表-柱线图系列优化
+- 6、大屏图表-百分比图系列优化
+- 7、大屏图表-地图系列优化
+- 8、大屏图表-词云图、热力图、刻度尺系列优化
+- 9、系统-注销登陆问题优化
+
+## 修复
+
+
+## 其他
+
+- 1、文档更新
+- 2、iconfont更新
+
+## 示例数据
+
+- 从1.0版本调整了底层sql,具体位置是:report-core/src/main/resource/db.migration,
+  删除了过往所有的sql,现在此目录下sql仅包含aj_report基础信息库的相关sql,sql文件的命名也会和版本号保持一致,
+  提供的示例数据(aj_report_init数据库的sql),aj_report_init_example.sql 文件放置在 doc/example目录下。
+
+- 如果需要将之前版本的示例数据删除,delete_aj_report_init_example.sql 文件放置在 doc/example目录下。

+ 9 - 12
report-core/src/main/java/com/anjiplus/template/gaea/business/modules/dashboard/service/impl/ReportDashboardServiceImpl.java

@@ -5,27 +5,26 @@ import com.alibaba.fastjson.JSONObject;
 import com.anji.plus.gaea.curd.mapper.GaeaBaseMapper;
 import com.anji.plus.gaea.exception.BusinessExceptionBuilder;
 import com.anji.plus.gaea.utils.GaeaAssert;
-import com.anji.plus.gaea.utils.GaeaBeanUtils;
 import com.anjiplus.template.gaea.business.code.ResponseCode;
 import com.anjiplus.template.gaea.business.modules.dashboard.controller.dto.ChartDto;
 import com.anjiplus.template.gaea.business.modules.dashboard.controller.dto.ReportDashboardDto;
 import com.anjiplus.template.gaea.business.modules.dashboard.controller.dto.ReportDashboardObjectDto;
 import com.anjiplus.template.gaea.business.modules.dashboard.dao.ReportDashboardMapper;
+import com.anjiplus.template.gaea.business.modules.dashboard.dao.entity.ReportDashboard;
 import com.anjiplus.template.gaea.business.modules.dashboard.service.ChartStrategy;
 import com.anjiplus.template.gaea.business.modules.dashboard.service.ReportDashboardService;
-import com.anjiplus.template.gaea.business.modules.file.entity.GaeaFile;
-import com.anjiplus.template.gaea.business.modules.file.service.GaeaFileService;
-import com.anjiplus.template.gaea.business.modules.file.util.FileUtils;
-import com.anjiplus.template.gaea.business.modules.report.service.ReportService;
-import com.anjiplus.template.gaea.business.util.DateUtil;
 import com.anjiplus.template.gaea.business.modules.dashboardwidget.controller.dto.ReportDashboardWidgetDto;
 import com.anjiplus.template.gaea.business.modules.dashboardwidget.controller.dto.ReportDashboardWidgetValueDto;
-import com.anjiplus.template.gaea.business.modules.dashboard.dao.entity.ReportDashboard;
 import com.anjiplus.template.gaea.business.modules.dashboardwidget.dao.entity.ReportDashboardWidget;
 import com.anjiplus.template.gaea.business.modules.dashboardwidget.service.ReportDashboardWidgetService;
 import com.anjiplus.template.gaea.business.modules.dataset.controller.dto.DataSetDto;
 import com.anjiplus.template.gaea.business.modules.dataset.controller.dto.OriginalDataDto;
 import com.anjiplus.template.gaea.business.modules.dataset.service.DataSetService;
+import com.anjiplus.template.gaea.business.modules.file.entity.GaeaFile;
+import com.anjiplus.template.gaea.business.modules.file.service.GaeaFileService;
+import com.anjiplus.template.gaea.business.modules.file.util.FileUtils;
+import com.anjiplus.template.gaea.business.modules.report.service.ReportService;
+import com.anjiplus.template.gaea.business.util.DateUtil;
 import com.anjiplus.template.gaea.business.util.FileUtil;
 import com.anjiplus.template.gaea.business.util.RequestUtil;
 import com.anjiplus.template.gaea.business.util.UuidUtil;
@@ -50,7 +49,6 @@ import org.springframework.web.multipart.MultipartFile;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.File;
-import java.net.URLEncoder;
 import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.concurrent.CompletableFuture;
@@ -100,12 +98,12 @@ public class ReportDashboardServiceImpl implements ReportDashboardService, Initi
     @Override
     public ReportDashboardObjectDto getDetail(String reportCode) {
         ReportDashboardObjectDto result = new ReportDashboardObjectDto();
-        ReportDashboardDto reportDashboardDto = new ReportDashboardDto();
         ReportDashboard reportDashboard = this.selectOne("report_code", reportCode);
         if (null == reportDashboard) {
-            return new ReportDashboardObjectDto();
+            return result;
         }
-        GaeaBeanUtils.copyAndFormatter(reportDashboard, reportDashboardDto);
+        ReportDashboardDto reportDashboardDto = new ReportDashboardDto();
+        BeanUtils.copyProperties(reportDashboard, reportDashboardDto);
 
         List<ReportDashboardWidget> list = reportDashboardWidgetService.list(
                 new QueryWrapper<ReportDashboardWidget>().lambda()
@@ -147,7 +145,6 @@ public class ReportDashboardServiceImpl implements ReportDashboardService, Initi
         //查询ReportDashboard
         ReportDashboard reportDashboard = this.selectOne("report_code", reportCode);
         ReportDashboard dashboard = new ReportDashboard();
-        GaeaBeanUtils.copyAndFormatter(dto.getDashboard(), dashboard);
         BeanUtils.copyProperties(dto.getDashboard(), dashboard);
         dashboard.setReportCode(reportCode);
         if (null == reportDashboard) {

+ 4 - 3
report-core/src/main/java/com/anjiplus/template/gaea/business/modules/datasettransform/service/impl/DataSetTransformServiceImpl.java

@@ -18,6 +18,8 @@ import org.springframework.stereotype.Service;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 
 /**
 * @desc DataSetTransform 数据集数据转换服务实现
@@ -47,9 +49,8 @@ public class DataSetTransformServiceImpl implements DataSetTransformService, Ini
     public void afterPropertiesSet() {
         Map<String, TransformStrategy> beanMap = applicationContext.getBeansOfType(TransformStrategy.class);
         //遍历该接口的所有实现,将其放入map中
-        for (TransformStrategy serviceImpl : beanMap.values()) {
-            queryServiceImplMap.put(serviceImpl.type(), serviceImpl);
-        }
+        queryServiceImplMap.putAll(beanMap.values().stream()
+                .collect(Collectors.toMap(TransformStrategy::type, Function.identity())));
     }
 
     @Override

+ 7 - 16
report-ui/index.html

@@ -5,22 +5,13 @@
   <meta charset="utf-8">
   <meta name="viewport" content="width=device-width,initial-scale=1.0">
   <title>AJ-Report</title>
-  <link rel='stylesheet' href='./static/luckysheet/plugins/css/pluginsCss.css' />
-  <link rel='stylesheet' href='./static/luckysheet/plugins/plugins.css' />
-  <link rel='stylesheet' href='./static/luckysheet/css/luckysheet.css' />
-  <!-- <link rel='stylesheet' href='./static/luckysheet/assets/iconfont/iconfont.css' /> -->
-  <script src="./static/luckysheet/plugins/js/plugin.js"></script>
-  <script src="./static/luckysheet/luckysheet.umd.js"></script>
-
-<!--  <link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/luckysheet/dist/plugins/css/pluginsCss.css' />-->
-<!--  <link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/luckysheet/dist/plugins/plugins.css' />-->
-<!--  <link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/luckysheet/dist/css/luckysheet.css' />-->
-<!--  <link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/luckysheet/dist/assets/iconfont/iconfont.css' />-->
-<!--  <script src="https://cdn.jsdelivr.net/npm/luckysheet/dist/plugins/js/plugin.js"></script>-->
-<!--  <script src="https://cdn.jsdelivr.net/npm/luckysheet/dist/luckysheet.umd.js"></script>-->
-
-
-
+  <link rel='stylesheet' href='/static/luckysheet/plugins/css/pluginsCss.css' />
+  <link rel='stylesheet' href='/static/luckysheet/plugins/plugins.css' />
+  <link rel='stylesheet' href='/static/luckysheet/css/luckysheet.css' />
+  <link rel='stylesheet' href='/static/luckysheet/assets/iconfont/iconfont.css' />
+  <script src="/static/luckysheet/plugins/js/plugin.js"></script>
+  <script src="/static/luckysheet/luckysheet.umd.js"></script>
+  <script src="/static/luckysheet/luckyexcel.umd.js"></script>
 </head>
 
 <body>

+ 26 - 3
report-ui/src/assets/iconfont2/demo_index.html

@@ -54,6 +54,12 @@
       <div class="content unicode" style="display: block;">
           <ul class="icon_lists dib-box">
           
+            <li class="dib">
+              <span class="icon iconfont">&#xe849;</span>
+                <div class="name">24gf-chartScatter</div>
+                <div class="code-name">&amp;#xe849;</div>
+              </li>
+          
             <li class="dib">
               <span class="icon iconfont">&#xe627;</span>
                 <div class="name">地图</div>
@@ -78,9 +84,9 @@
 <pre><code class="language-css"
 >@font-face {
   font-family: 'iconfont';
-  src: url('iconfont.woff2?t=1702540060096') format('woff2'),
-       url('iconfont.woff?t=1702540060096') format('woff'),
-       url('iconfont.ttf?t=1702540060096') format('truetype');
+  src: url('iconfont.woff2?t=1711350700049') format('woff2'),
+       url('iconfont.woff?t=1711350700049') format('woff'),
+       url('iconfont.ttf?t=1711350700049') format('truetype');
 }
 </code></pre>
           <h3 id="-iconfont-">第二步:定义使用 iconfont 的样式</h3>
@@ -106,6 +112,15 @@
       <div class="content font-class">
         <ul class="icon_lists dib-box">
           
+          <li class="dib">
+            <span class="icon iconfont icon-24gf-chartScatter"></span>
+            <div class="name">
+              24gf-chartScatter
+            </div>
+            <div class="code-name">.icon-24gf-chartScatter
+            </div>
+          </li>
+          
           <li class="dib">
             <span class="icon iconfont icon-ditu1"></span>
             <div class="name">
@@ -142,6 +157,14 @@
       <div class="content symbol">
           <ul class="icon_lists dib-box">
           
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-24gf-chartScatter"></use>
+                </svg>
+                <div class="name">24gf-chartScatter</div>
+                <div class="code-name">#icon-24gf-chartScatter</div>
+            </li>
+          
             <li class="dib">
                 <svg class="icon svg-icon" aria-hidden="true">
                   <use xlink:href="#icon-ditu1"></use>

+ 7 - 3
report-ui/src/assets/iconfont2/iconfont.css

@@ -1,8 +1,8 @@
 @font-face {
   font-family: "iconfont"; /* Project id 4369261 */
-  src: url('iconfont.woff2?t=1702540060096') format('woff2'),
-       url('iconfont.woff?t=1702540060096') format('woff'),
-       url('iconfont.ttf?t=1702540060096') format('truetype');
+  src: url('iconfont.woff2?t=1711350700049') format('woff2'),
+       url('iconfont.woff?t=1711350700049') format('woff'),
+       url('iconfont.ttf?t=1711350700049') format('truetype');
 }
 
 .iconfont {
@@ -13,6 +13,10 @@
   -moz-osx-font-smoothing: grayscale;
 }
 
+.icon-24gf-chartScatter:before {
+  content: "\e849";
+}
+
 .icon-ditu1:before {
   content: "\e627";
 }

文件差異過大導致無法顯示
+ 0 - 0
report-ui/src/assets/iconfont2/iconfont.js


+ 7 - 0
report-ui/src/assets/iconfont2/iconfont.json

@@ -5,6 +5,13 @@
   "css_prefix_text": "icon-",
   "description": "",
   "glyphs": [
+    {
+      "icon_id": "7542469",
+      "name": "24gf-chartScatter",
+      "font_class": "24gf-chartScatter",
+      "unicode": "e849",
+      "unicode_decimal": 59465
+    },
     {
       "icon_id": "7463933",
       "name": "地图",

二進制
report-ui/src/assets/iconfont2/iconfont.ttf


二進制
report-ui/src/assets/iconfont2/iconfont.woff


二進制
report-ui/src/assets/iconfont2/iconfont.woff2


+ 946 - 0
report-ui/src/utils/word.js

@@ -0,0 +1,946 @@
+export const nameMap =  {
+  "Afghanistan": "阿富汗",
+  "Angola": "安哥拉",
+  "Albania": "阿尔巴尼亚",
+  "Algeria": "阿尔及利亚",
+  "Argentina": "阿根廷",
+  "Armenia": "亚美尼亚",
+  "Australia": "澳大利亚",
+  "Austria": "奥地利",
+  "Azerbaijan": "阿塞拜疆",
+  "Bahamas": "巴哈马",
+  "Bangladesh": "孟加拉国",
+  "Belgium": "比利时",
+  "Benin": "贝宁",
+  "Burkina Faso": "布基纳法索",
+  "Burundi": "布隆迪",
+  "Bulgaria": "保加利亚",
+  "Bosnia and Herz.": "波斯尼亚和黑塞哥维那",
+  "Belarus": "白俄罗斯",
+  "Belize": "伯利兹",
+  "Bermuda": "百慕大群岛",
+  "Bolivia": "玻利维亚",
+  "Brazil": "巴西",
+  "Brunei": "文莱",
+  "Bhutan": "不丹",
+  "Botswana": "博茨瓦纳",
+  "Cambodia": "柬埔寨",
+  "Cameroon": "喀麦隆",
+  "Canada": "加拿大",
+  "Central African Rep.": "中非共和国",
+  "Chad": "乍得",
+  "Chile": "智利",
+  "China":"中国",
+  "Colombia": "哥伦比亚",
+  "Congo": "刚果",
+  "Costa Rica": "哥斯达黎加",
+  "Côte d'Ivoire": "科特迪瓦",
+  "Croatia": "克罗地亚",
+  "Cuba": "古巴",
+  "Cyprus": "塞浦路斯",
+  "Czech Rep.": "捷克共和国",
+  "Dem. Rep. Korea": "韩国",
+  "Dem. Rep. Congo": "民主刚果",
+  "Denmark": "丹麦",
+  "Djibouti": "吉布提",
+  "Dominican Rep.": "多米尼加共和国",
+  "Ecuador": "厄瓜多尔",
+  "Egypt": "埃及",
+  "El Salvador": "萨尔瓦多",
+  "Eq. Guinea": "赤道几内亚",
+  "Eritrea": "厄立特里亚",
+  "Estonia": "爱沙尼亚",
+  "Ethiopia": "埃塞俄比亚",
+  "Falkland Is.": "福克兰群岛",
+  "Fiji": "斐济",
+  "Finland": "芬兰",
+  "France": "法国",
+  "French Guiana": "法属圭亚那",
+  "Fr. S. Antarctic Lands": "法属南部领地",
+  "Gabon": "加蓬",
+  "Gambia": "冈比亚",
+  "Germany": "德国",
+  "Georgia": "佐治亚州",
+  "Ghana": "加纳",
+  "Greece": "希腊",
+  "Greenland": "格陵兰",
+  "Guatemala": "危地马拉",
+  "Guinea": "几内亚",
+  "Guinea-Bissau": "几内亚比绍",
+  "Guyana": "圭亚那",
+  "Haiti": "海地",
+  "Heard I. and McDonald Is.": "赫德岛和麦克唐纳群岛",
+  "Honduras": "洪都拉斯",
+  "Hungary": "匈牙利",
+  "Iceland": "冰岛",
+  "India": "印度",
+  "Indonesia": "印度尼西亚",
+  "Iran": "伊朗",
+  "Iraq": "伊拉克",
+  "Ireland": "爱尔兰",
+  "Israel": "以色列",
+  "Italy": "意大利",
+  "Ivory Coast": "象牙海岸",
+  "Jamaica": "牙买加",
+  "Japan": "日本",
+  "Jordan": "乔丹",
+  "Kashmir": "克什米尔",
+  "Kazakhstan": "哈萨克斯坦",
+  "Kenya": "肯尼亚",
+  "Kosovo": "科索沃",
+  "Kuwait": "科威特",
+  "Kyrgyzstan": "吉尔吉斯斯坦",
+  "Laos": "老挝",
+  "Lao PDR": "老挝人民民主共和国",
+  "Latvia": "拉脱维亚",
+  "Lebanon": "黎巴嫩",
+  "Lesotho": "莱索托",
+  "Liberia": "利比里亚",
+  "Libya": "利比亚",
+  "Lithuania": "立陶宛",
+  "Luxembourg": "卢森堡",
+  "Madagascar": "马达加斯加",
+  "Macedonia": "马其顿",
+  "Malawi": "马拉维",
+  "Malaysia": "马来西亚",
+  "Mali": "马里",
+  "Mauritania": "毛里塔尼亚",
+  "Mexico": "墨西哥",
+  "Moldova": "摩尔多瓦",
+  "Mongolia": "蒙古",
+  "Montenegro": "黑山",
+  "Morocco": "摩洛哥",
+  "Mozambique": "莫桑比克",
+  "Myanmar": "缅甸",
+  "Namibia": "纳米比亚",
+  "Netherlands": "荷兰",
+  "New Caledonia": "新喀里多尼亚",
+  "New Zealand": "新西兰",
+  "Nepal": "尼泊尔",
+  "Nicaragua": "尼加拉瓜",
+  "Niger": "尼日尔",
+  "Nigeria": "尼日利亚",
+  "Korea": "朝鲜",
+  "Northern Cyprus": "北塞浦路斯",
+  "Norway": "挪威",
+  "Oman": "阿曼",
+  "Pakistan": "巴基斯坦",
+  "Panama": "巴拿马",
+  "Papua New Guinea": "巴布亚新几内亚",
+  "Paraguay": "巴拉圭",
+  "Peru": "秘鲁",
+  "Republic of the Congo": "刚果共和国",
+  "Philippines": "菲律宾",
+  "Poland": "波兰",
+  "Portugal": "葡萄牙",
+  "Puerto Rico": "波多黎各",
+  "Qatar": "卡塔尔",
+  "Republic of Seychelles": "塞舌尔共和国",
+  "Romania": "罗马尼亚",
+  "Russia": "俄罗斯",
+  "Rwanda": "卢旺达",
+  "Samoa": "萨摩亚",
+  "Saudi Arabia": "沙特阿拉伯",
+  "Senegal": "塞内加尔",
+  "Serbia": "塞尔维亚",
+  "Sierra Leone": "塞拉利昂",
+  "Slovakia": "斯洛伐克",
+  "Slovenia": "斯洛文尼亚",
+  "Solomon Is.": "所罗门群岛",
+  "Somaliland": "索马里兰",
+  "Somalia": "索马里",
+  "South Africa": "南非",
+  "S. Geo. and S. Sandw. Is.": "南乔治亚和南桑德威奇群岛",
+  "S. Sudan": "南苏丹",
+  "Spain": "西班牙",
+  "Sri Lanka": "斯里兰卡",
+  "Sudan": "苏丹",
+  "Suriname": "苏里南",
+  "Swaziland": "斯威士兰",
+  "Sweden": "瑞典",
+  "Switzerland": "瑞士",
+  "Syria": "叙利亚",
+  "Tajikistan": "塔吉克斯坦",
+  "Tanzania": "坦桑尼亚",
+  "Thailand": "泰国",
+  "The Kingdom of Tonga": "汤加王国",
+  "Timor-Leste": "东帝汶",
+  "Togo": "多哥",
+  "Trinidad and Tobago": "特立尼达和多巴哥",
+  "Tunisia": "突尼斯",
+  "Turkey": "土耳其",
+  "Turkmenistan": "土库曼斯坦",
+  "Uganda": "乌干达",
+  "Ukraine": "乌克兰",
+  "United Arab Emirates": "阿拉伯联合酋长国",
+  "United Kingdom": "大不列颠联合王国",
+  "United Republic of Tanzania": "坦桑尼亚联合共和国",
+  "United States": "美国",
+  "United States of America": "美利坚合众国",
+  "Uruguay": "乌拉圭",
+  "Uzbekistan": "乌兹别克斯坦",
+  "Vanuatu": "瓦努阿图",
+  "Venezuela": "委内瑞拉",
+  "Vietnam": "越南",
+  "West Bank": "西岸",
+  "W. Sahara": "西撒哈拉",
+  "Yemen": "也门",
+  "Zambia": "赞比亚",
+  "Zimbabwe": "津巴布韦"
+}
+
+
+export const dataArr=[
+  {
+    "name": "阿富汗",
+    "value": 28397.812
+  },
+  {
+    "name": "安哥拉",
+    "value": 19549.124
+  },
+  {
+    "name": "阿尔巴尼亚",
+    "value": 3150.143
+  },
+  {
+    "name": "阿尔及利亚",
+    "value": 8441.537
+  },
+  {
+    "name": "阿根廷",
+    "value": 40374.224
+  },
+  {
+    "name": "亚美尼亚",
+    "value": 2963.496
+  },
+  {
+    "name": "澳大利亚",
+    "value": 268.065
+  },
+  {
+    "name": "奥地利",
+    "value": 22404.488
+  },
+  {
+    "name": "阿塞拜疆",
+    "value": 8401.924
+  },
+  {
+    "name": "布隆迪",
+    "value": 9094.718
+  },
+  {
+    "name": "比利时",
+    "value": 9232.753
+  },
+  {
+    "name": "贝宁",
+    "value": 10941.288
+  },
+  {
+    "name": "布基纳法索",
+    "value": 9509.798
+  },
+  {
+    "name": "孟加拉国",
+    "value": 15540.284
+  },
+  {
+    "name": "保加利亚",
+    "value": 151125.475
+  },
+  {
+    "name": "波斯尼亚和黑塞哥维那",
+    "value": 7389.175
+  },
+  {
+    "name": "白俄罗斯",
+    "value": 66402.316
+  },
+  {
+    "name": "伯利兹",
+    "value": 3845.929
+  },
+  {
+    "name": "百慕大群岛",
+    "value": 9491.07
+  },
+  {
+    "name": "玻利维亚",
+    "value": 308.595
+  },
+  {
+    "name": "巴西",
+    "value": 64.951
+  },
+  {
+    "name": "文莱",
+    "value": 716.939
+  },
+  {
+    "name": "不丹",
+    "value": 195210.154
+  },
+  {
+    "name": "博茨瓦纳",
+    "value": 27.223
+  },
+  {
+    "name": "柬埔寨",
+    "value": 716.939
+  },
+  {
+    "name": "喀麦隆",
+    "value": 1969.341
+  },
+  {
+    "name": "加拿大",
+    "value": 4349.921
+  },
+  {
+    "name": "中非共和国",
+    "value": 34126.24
+  },
+  {
+    "name": "乍得",
+    "value": 7830.534
+  },
+  {
+    "name": "智利",
+    "value": 17150.76
+  },
+  {
+    "name": "中国",
+    "value": 66666
+  },
+  {
+    "name": "哥伦比亚",
+    "value": 60508.978
+  },
+  {
+    "name": "刚果",
+    "value": 17150.343
+  },
+  {
+    "name": "科特迪瓦",
+    "value": 17150.343
+  },
+  {
+    "name": "哥斯达黎加",
+    "value": 20624.343
+  },
+  {
+    "name": "克罗地亚",
+    "value": 62191.161
+  },
+  {
+    "name": "古巴",
+    "value": 3573.024
+  },
+  {
+    "name": "塞浦路斯",
+    "value": 46444.798
+  },
+  {
+    "name": "捷克共和国",
+    "value": 4669.685
+  },
+  {
+    "name": "民主刚果",
+    "value": 11281.768
+  },
+  {
+    "name": "丹麦",
+    "value": 1.468
+  },
+  {
+    "name": "吉布提",
+    "value": 1103.685
+  },
+  {
+    "name": "多米尼加共和国",
+    "value": 10553.701
+  },
+  {
+    "name": "东帝汶",
+    "value": 83017.404
+  },
+  {
+    "name": "厄瓜多尔",
+    "value": 834.036
+  },
+  {
+    "name": "埃及",
+    "value": 5550.959
+  },
+  {
+    "name": "萨尔瓦多",
+    "value": 10016.797
+  },
+  {
+    "name": "赤道几内亚",
+    "value": 37062.82
+  },
+  {
+    "name": "厄立特里亚",
+    "value": 15001.072
+  },
+  {
+    "name": "爱沙尼亚",
+    "value": 78075.705
+  },
+  {
+    "name": "埃塞俄比亚",
+    "value": 5741.159
+  },
+  {
+    "name": "福克兰群岛",
+    "value": 46182.038
+  },
+  {
+    "name": "斐济",
+    "value": 1298.533
+  },
+  {
+    "name": "芬兰",
+    "value": 87095.281
+  },
+  {
+    "name": "法国",
+    "value": 5367.693
+  },
+  {
+    "name": "法属圭亚那",
+    "value": 860.559
+  },
+  {
+    "name": "法属南部领地",
+    "value": 49.581
+  },
+  {
+    "name": "加蓬",
+    "value": 63230.866
+  },
+  {
+    "name": "冈比亚",
+    "value": 1556.222
+  },
+  {
+    "name": "德国",
+    "value": 62066.35
+  },
+  {
+    "name": "佐治亚州",
+    "value": 4388.674
+  },
+  {
+    "name": "加纳",
+    "value": 24262.901
+  },
+  {
+    "name": "希腊",
+    "value": 10876.033
+  },
+  {
+    "name": "格陵兰",
+    "value": 1680.64
+  },
+  {
+    "name": "危地马拉",
+    "value": 10876.033
+  },
+  {
+    "name": "几内亚",
+    "value": 696.167
+  },
+  {
+    "name": "几内亚比绍",
+    "value": 11109.999
+  },
+  {
+    "name": "圭亚那",
+    "value": 56.546
+  },
+  {
+    "name": "海地",
+    "value": 14341.576
+  },
+  {
+    "name": "赫德岛和麦克唐纳群岛",
+    "value": 4338.027
+  },
+  {
+    "name": "洪都拉斯",
+    "value": 231.169
+  },
+  {
+    "name": "匈牙利",
+    "value": 786.126
+  },
+  {
+    "name": "冰岛",
+    "value": 7621.204
+  },
+  {
+    "name": "印度",
+    "value": 4338.027
+  },
+  {
+    "name": "印度尼西亚",
+    "value": 9896.4
+  },
+  {
+    "name": "伊朗",
+    "value": 10014.633
+  },
+  {
+    "name": "伊拉克",
+    "value": 240676.485
+  },
+  {
+    "name": "爱尔兰",
+    "value": 15624.648
+  },
+  {
+    "name": "以色列",
+    "value": 4467.561
+  },
+  {
+    "name": "意大利",
+    "value": 240676.485
+  },
+  {
+    "name": "象牙海岸",
+    "value": 30962.38
+  },
+  {
+    "name": "牙买加",
+    "value": 318.042
+  },
+  {
+    "name": "日本",
+    "value": 7420.368
+  },
+  {
+    "name": "乔丹",
+    "value": 60508.978
+  },
+  {
+    "name": "克什米尔",
+    "value": 15921.485
+  },
+  {
+    "name": "哈萨克斯坦",
+    "value": 2741.485
+  },
+  {
+    "name": "肯尼亚",
+    "value": 6454.554
+  },
+  {
+    "name": "科索沃",
+    "value": 127352.833
+  },
+  {
+    "name": "科威特",
+    "value": 15921.127
+  },
+  {
+    "name": "吉尔吉斯斯坦",
+    "value": 40909.194
+  },
+  {
+    "name": "老挝",
+    "value": 5334.223
+  },
+  {
+    "name": "老挝人民民主共和国",
+    "value": 127352.833
+  },
+  {
+    "name": "拉脱维亚",
+    "value": 14364.931
+  },
+  {
+    "name": "黎巴嫩",
+    "value": 51452.352
+  },
+  {
+    "name": "莱索托",
+    "value": 97.743
+  },
+  {
+    "name": "利比里亚",
+    "value": 2991.58
+  },
+  {
+    "name": "利比亚",
+    "value": 6395.713
+  },
+  {
+    "name": "立陶宛",
+    "value": 4341.092
+  },
+  {
+    "name": "卢森堡",
+    "value": 3957.99
+  },
+  {
+    "name": "马达加斯加",
+    "value": 6040.612
+  },
+  {
+    "name": "马其顿",
+    "value": 20758.779
+  },
+  {
+    "name": "马拉维",
+    "value": 2008.921
+  },
+  {
+    "name": "马来西亚",
+    "value": 3068.457
+  },
+  {
+    "name": "马里",
+    "value": 507.885
+  },
+  {
+    "name": "毛里塔尼亚",
+    "value": 2090.519
+  },
+  {
+    "name": "墨西哥",
+    "value": 31642.36
+  },
+  {
+    "name": "摩尔多瓦",
+    "value": 103.619
+  },
+  {
+    "name": "蒙古",
+    "value": 21079.532
+  },
+  {
+    "name": "黑山",
+    "value": 117886.404
+  },
+  {
+    "name": "摩洛哥",
+    "value": 507.885
+  },
+  {
+    "name": "莫桑比克",
+    "value": 13985.961
+  },
+  {
+    "name": "缅甸",
+    "value": 51931.231
+  },
+  {
+    "name": "纳米比亚",
+    "value": 620.078
+  },
+  {
+    "name": "荷兰",
+    "value": 2712.738
+  },
+  {
+    "name": "新喀里多尼亚",
+    "value": 23967.265
+  },
+  {
+    "name": "新西兰",
+    "value": 3609.42
+  },
+  {
+    "name": "尼泊尔",
+    "value": 15013.694
+  },
+  {
+    "name": "尼加拉瓜",
+    "value": 28275.835
+  },
+  {
+    "name": "尼日尔",
+    "value": 2178.967
+  },
+  {
+    "name": "尼日利亚",
+    "value": 246.379
+  },
+  {
+    "name": "朝鲜",
+    "value": 15893.746
+  },
+  {
+    "name": "北塞浦路斯",
+    "value": 159707.78
+  },
+  {
+    "name": "挪威",
+    "value": 5822.209
+  },
+  {
+    "name": "阿曼",
+    "value": 16615.243
+  },
+  {
+    "name": "巴基斯坦",
+    "value": 4891.251
+  },
+  {
+    "name": "巴拿马",
+    "value": 26846.016
+  },
+  {
+    "name": "巴布亚新几内亚",
+    "value": 4368.136
+  },
+  {
+    "name": "巴拉圭",
+    "value": 2802.768
+  },
+  {
+    "name": "秘鲁",
+    "value": 173149.306
+  },
+  {
+    "name": "刚果共和国",
+    "value": 3678.128
+  },
+  {
+    "name": "菲律宾",
+    "value": 29262.83
+  },
+  {
+    "name": "波兰",
+    "value": 93444.322
+  },
+  {
+    "name": "葡萄牙",
+    "value": 6858.945
+  },
+  {
+    "name": "波多黎各",
+    "value": 38198.754
+  },
+  {
+    "name": "卡塔尔",
+    "value": 3709.671
+  },
+  {
+    "name": "塞舌尔共和国",
+    "value": 1000.556
+  },
+  {
+    "name": "罗马尼亚",
+    "value": 10589.792
+  },
+  {
+    "name": "俄罗斯",
+    "value": 6459.721
+  },
+  {
+    "name": "卢旺达",
+    "value": 1749.713
+  },
+  {
+    "name": "萨摩亚",
+    "value": 11749.713
+  },
+  {
+    "name": "沙特阿拉伯",
+    "value": 21861.476
+  },
+  {
+    "name": "塞内加尔",
+    "value": 21861.476
+  },
+  {
+    "name": "塞尔维亚",
+    "value": 18862.257
+  },
+  {
+    "name": "塞拉利昂",
+    "value": 10836.732
+  },
+  {
+    "name": "斯洛伐克",
+    "value": 514.648
+  },
+  {
+    "name": "斯洛文尼亚",
+    "value": 27258.387
+  },
+  {
+    "name": "所罗门群岛",
+    "value": 35652.002
+  },
+  {
+    "name": "索马里兰",
+    "value": 9940.929
+  },
+  {
+    "name": "索马里",
+    "value": 12950.564
+  },
+  {
+    "name": "南非",
+    "value": 526.447
+  },
+  {
+    "name": "南乔治亚和南桑德威奇群岛",
+    "value": 6218.195
+  },
+  {
+    "name": "韩国",
+    "value": 5751.976
+  },
+  {
+    "name": "南苏丹",
+    "value": 6218.195
+  },
+  {
+    "name": "西班牙",
+    "value": 9636.173
+  },
+  {
+    "name": "斯里兰卡",
+    "value": 9636.173
+  },
+  {
+    "name": "苏丹",
+    "value": 3573.024
+  },
+  {
+    "name": "苏里南",
+    "value": 524.96
+  },
+  {
+    "name": "斯威士兰",
+    "value": 5433.437
+  },
+  {
+    "name": "瑞典",
+    "value": 2054.232
+  },
+  {
+    "name": "瑞士",
+    "value": 9382.297
+  },
+  {
+    "name": "叙利亚",
+    "value": 1193.148
+  },
+  {
+    "name": "塔吉克斯坦",
+    "value": 7830.534
+  },
+  {
+    "name": "坦桑尼亚",
+    "value": 9876.785
+  },
+  {
+    "name": "泰国",
+    "value": 11720.781
+  },
+  {
+    "name": "汤加王国",
+    "value": 10710.701
+  },
+  {
+    "name": "巴哈马",
+    "value": 6306.014
+  },
+  {
+    "name": "多哥",
+    "value": 66402.316
+  },
+  {
+    "name": "特立尼达和多巴哥",
+    "value": 7627.326
+  },
+  {
+    "name": "突尼斯",
+    "value": 5041.995
+  },
+  {
+    "name": "土耳其",
+    "value": 10016.797
+  },
+  {
+    "name": "土库曼斯坦",
+    "value": 1328.095
+  },
+  {
+    "name": "乌干达",
+    "value": 10631.83
+  },
+  {
+    "name": "乌克兰",
+    "value": 72137.546
+  },
+  {
+    "name": "阿拉伯联合酋长国",
+    "value": 44973.33
+  },
+  {
+    "name": "大不列颠联合王国",
+    "value": 33987.213
+  },
+  {
+    "name": "坦桑尼亚联合共和国",
+    "value": 46050.22
+  },
+  {
+    "name": "美国",
+    "value": 3371.982
+  },
+  {
+    "name": "美利坚合众国",
+    "value": 312247.116
+  },
+  {
+    "name": "乌拉圭",
+    "value": 27769.27
+  },
+  {
+    "name": "乌兹别克斯坦",
+    "value": 236.299
+  },
+  {
+    "name": "瓦努阿图",
+    "value": 89047.397
+  },
+  {
+    "name": "委内瑞拉",
+    "value": 236.299
+  },
+  {
+    "name": "越南",
+    "value": 13.565
+  },
+  {
+    "name": "西岸",
+    "value": 22763.008
+  },
+  {
+    "name": "西撒哈拉",
+    "value": 51452.352
+  },
+  {
+    "name": "也门",
+    "value": 13216.985
+  },
+  {
+    "name": "赞比亚",
+    "value": 13076.978
+  },
+  {
+    "name": "津巴布韦",
+    "value": 11056.426
+  }
+]

+ 197 - 0
report-ui/src/views/bigscreenDesigner/designer/components/customNameComponents.vue

@@ -0,0 +1,197 @@
+<template>
+  <div>
+    <el-button
+      type="primary"
+      size="mini"
+      icon="el-icon-plus"
+      plain
+      @click="handleAddClick"
+      >新增</el-button
+    >
+    <el-table :data="formData" style="width: 100%">
+      <el-table-column prop="country" label="国家" align="center"></el-table-column>
+      <el-table-column prop="name" label="别名" align="center"></el-table-column>
+      <el-table-column label="操作" align="center" min-width="100">
+        <template slot-scope="scope">
+          <span
+            class="editor"
+            @click="handleEditorClick(scope.$index, scope.row)"
+          >
+            编辑
+          </span>
+          <el-divider direction="vertical"></el-divider>
+          <span
+            class="editor"
+            @click="handleDeleteClick(scope.$index, scope.row)"
+          >
+          删除
+          </span>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <el-dialog
+      title="新增"
+      :visible.sync="dialogVisible"
+      width="30%"
+      :before-close="handleClose"
+    >
+      <el-form>
+        <el-form-item label="国家">
+          <el-select
+            v-model="country"
+            style="width: 200px"
+            placeholder="请选择国家"
+            size="mini"
+          >
+            <el-option v-for="(item,index) in Object.values(nameMap)" :key="index" :value="item">{{ item }}</el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="别名">
+          <el-input
+            v-model="name"
+            style="width: 200px"
+            placeholder="请输入别名"
+            size="mini"
+          >
+          </el-input>
+        </el-form-item>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button size="mini" @click="dialogVisible = false">取 消</el-button>
+        <el-button size="mini" type="primary" @click="handleSaveClick"
+          >确 定</el-button
+        >
+      </span>
+    </el-dialog>
+  </div>
+</template>
+<script>
+import { nameMap } from "@/utils/word";
+
+export default {
+  name: "customNameComponents",
+  model: {
+    prop: "formData",
+    event: "input"
+  },
+  props: {
+    formData: Array
+  },
+  data() {
+    return {
+      nameMap,
+      predefineColors: [
+        "#ff4500",
+        "#ff8c00",
+        "#ffd700",
+        "#90ee90",
+        "#00ced1",
+        "#1e90ff",
+        "#c71585"
+      ],
+      country: "",
+      name:'',
+      dialogVisible: false,
+      flag: true, // true 新增, false 编辑
+      indexEditor: -1 // 编辑第几个数据
+    };
+  },
+  mounted() {},
+  methods: {
+    // 弹出框关闭
+    handleClose() {
+      this.dialogVisible = false;
+      this.country = "";
+      this.name=''
+    },
+    // 新增
+    handleAddClick() {
+      this.country = "";
+      this.name=''
+      this.flag = true;
+      this.dialogVisible = true;
+    },
+    // 确定
+    handleSaveClick() {
+      if (this.flag) {
+        // 新增
+        const obj = {
+          country: this.country,
+          name:this.name
+        };
+        this.formData.push(obj);
+        this.dialogVisible = false;
+      } else {
+        // 编辑
+        this.formData[this.indexEditor].country = this.country;
+        this.formData[this.indexEditor].name = this.name;
+        this.dialogVisible = false;
+      }
+      this.$emit("input", this.formData);
+      this.$emit("change", this.formData);
+    },
+    // 编辑
+    handleEditorClick(index, row) {
+      this.flag = false;
+      this.country = row.country;
+      this.name = row.name;
+      this.dialogVisible = true;
+      this.indexEditor = index;
+    },
+    // 删除
+    handleDeleteClick(index) {
+      this.formData.splice(index, 1);
+      this.$emit("input", this.formData);
+      this.$emit("change", this.formData);
+    }
+  }
+};
+</script>
+<style lang="scss" scoped>
+.color-box {
+  .title {
+    display: flex;
+    flex-direction: row;
+  }
+}
+/deep/.el-table,
+/deep/.el-table__expanded-cell,
+/deep/.el-table th,
+/deep/.el-table tr {
+  background-color: transparent !important;
+  color: #859094 !important;
+}
+/deep/.el-table td,
+/deep/.el-table th.is-leaf {
+  border-bottom: none;
+  line-height: 26px;
+}
+/deep/.el-table tbody tr:hover > td {
+  background-color: #263445 !important;
+}
+/deep/.el-table::before {
+  height: 0;
+}
+/deep/.el-color-picker--mini,
+/deep/.el-color-picker--mini .el-color-picker__trigger {
+  width: 23px;
+  height: 23px;
+}
+/deep/.el-dialog {
+  background: #1b1e25;
+  .el-dialog__title {
+    color: #fff;
+  }
+}
+.color-box {
+  display: inline-block;
+  width: 20px;
+  height: 20px;
+  border-radius: 5px;
+}
+.editor {
+  color: #409eff;
+  cursor: pointer;
+}
+</style>

+ 8 - 0
report-ui/src/views/bigscreenDesigner/designer/components/dynamicForm.vue

@@ -299,6 +299,12 @@
                   v-model="formData[itemChildList.name]"
                   @change="changed($event, itemChildList.name)"
                 />
+                <customNameComponents
+                  v-if="itemChildList.type == 'customName'"
+                  :key="'b-' + idx"
+                  v-model="formData[itemChildList.name]"
+                  @change="changed($event, itemChildList.name)"
+                />
                 <componentLinkage
                   v-if="itemChildList.type == 'componentLinkage'"
                   :key="'cl-' + idx"
@@ -329,6 +335,7 @@ import "codemirror/mode/sql/sql.js";
 import "codemirror/mode/shell/shell.js";
 import dynamicComponents from "./dynamicComponents.vue";
 import customColorComponents from "./customColorComponents";
+import customNameComponents from "./customNameComponents";
 import dynamicAddTable from "./dynamicAddTable.vue";
 import customUpload from "./customUpload.vue";
 import dynamicAddRadar from "./dynamicAddRadar";
@@ -341,6 +348,7 @@ export default {
     vueJsonEditor,
     dynamicComponents,
     customColorComponents,
+    customNameComponents,
     dynamicAddTable,
     customUpload,
     dynamicAddRadar,

+ 458 - 0
report-ui/src/views/bigscreenDesigner/designer/tools/configure/mapCharts/widget-china-map.js

@@ -0,0 +1,458 @@
+export const widgetChinaMap = {
+  code: 'widgetChinaMap',
+  type: 'mapChart',
+  tabName: '地图',
+  label: '中国色阶图',
+  icon: 'icon-ditu1',
+  options: {
+    // 配置
+    setup: [
+      {
+        type: 'el-input-text',
+        label: '图层名称',
+        name: 'layerName',
+        required: false,
+        placeholder: '',
+        value: '中国色阶图',
+      },
+      {
+        type: 'vue-color',
+        label: '背景颜色',
+        name: 'background',
+        required: false,
+        placeholder: '',
+        value: ''
+      },
+      [
+        {
+          name: '标题设置',
+          list: [
+            {
+              type: 'el-switch',
+              label: '标题显示',
+              name: 'isNoTitle',
+              required: false,
+              placeholder: '',
+              value: true,
+            },
+            {
+              type: 'el-input-text',
+              label: '标题名',
+              name: 'titleText',
+              required: false,
+              placeholder: '',
+              value: '',
+            },
+            {
+              type: 'vue-color',
+              label: '字体颜色',
+              name: 'textColor',
+              required: false,
+              placeholder: '',
+              value: '#FFD700'
+            },
+            {
+              type: 'el-input-number',
+              label: '字体字号',
+              name: 'textFontSize',
+              required: false,
+              placeholder: '',
+              value: 20
+            },
+            {
+              type: 'el-select',
+              label: '字体粗细',
+              name: 'textFontWeight',
+              required: false,
+              placeholder: '',
+              selectOptions: [
+                {code: 'normal', name: '正常'},
+                {code: 'bold', name: '粗体'},
+                {code: 'bolder', name: '特粗体'},
+                {code: 'lighter', name: '细体'}
+              ],
+              value: 'normal'
+            },
+            {
+              type: 'el-select',
+              label: '字体风格',
+              name: 'textFontStyle',
+              required: false,
+              placeholder: '',
+              selectOptions: [
+                {code: 'normal', name: '正常'},
+                {code: 'italic', name: 'italic斜体'},
+                {code: 'oblique', name: 'oblique斜体'},
+              ],
+              value: 'normal'
+            },
+            {
+              type: 'el-select',
+              label: '字体位置',
+              name: 'textAlign',
+              required: false,
+              placeholder: '',
+              selectOptions: [
+                {code: 'center', name: '居中'},
+                {code: 'left', name: '左对齐'},
+                {code: 'right', name: '右对齐'},
+              ],
+              value: 'center'
+            },
+            {
+              type: 'el-input-text',
+              label: '副标题名',
+              name: 'subText',
+              required: false,
+              placeholder: '',
+              value: ''
+            },
+            {
+              type: 'vue-color',
+              label: '字体颜色',
+              name: 'subTextColor',
+              required: false,
+              placeholder: '',
+              value: 'rgba(30, 144, 255, 1)'
+            },
+            {
+              type: 'el-input-number',
+              label: '字体字号',
+              name: 'subTextFontSize',
+              required: false,
+              placeholder: '',
+              value: 20
+            },
+            {
+              type: 'el-select',
+              label: '字体粗细',
+              name: 'subTextFontWeight',
+              required: false,
+              placeholder: '',
+              selectOptions: [
+                {code: 'normal', name: '正常'},
+                {code: 'bold', name: '粗体'},
+                {code: 'bolder', name: '特粗体'},
+                {code: 'lighter', name: '细体'}
+              ],
+              value: 'normal'
+            },
+            {
+              type: 'el-select',
+              label: '字体风格',
+              name: 'subTextFontStyle',
+              required: false,
+              placeholder: '',
+              selectOptions: [
+                {code: 'normal', name: '正常'},
+                {code: 'italic', name: 'italic斜体'},
+                {code: 'oblique', name: 'oblique斜体'},
+              ],
+              value: 'normal'
+            },
+          ],
+        },
+        {
+          name: '地图设置',
+          list: [
+            {
+              type: 'el-switch',
+              label: '省市区显示',
+              name: 'isShowMap',
+              required: false,
+              placeholder: '',
+              value: false,
+            },
+            {
+              type: 'el-input-number',
+              label: '文字大小',
+              name: 'fontSizeMap',
+              required: false,
+              placeholder: '',
+              value: 20,
+            },
+            {
+              type: 'vue-color',
+              label: '文字颜色',
+              name: 'colorMap',
+              required: false,
+              placeholder: '',
+              value: '#53D9FF'
+            }
+          ]
+        },
+        {
+          name: '地图块颜色',
+          list: [
+            {
+              type: 'vue-color',
+              label: '0%处颜色',
+              name: 'font0PreColor',
+              required: false,
+              placeholder: '',
+              value: '#073684'
+            },
+            {
+              type: 'vue-color',
+              label: '100%颜色',
+              name: 'font100PreColor',
+              required: false,
+              placeholder: '',
+              value: '#061E3D'
+            },
+            {
+              type: 'vue-color',
+              label: '高亮渐变色',
+              name: 'fontHighlightColor',
+              required: false,
+              placeholder: '',
+              value: '#2B91B7'
+            },
+            {
+              type: 'vue-color',
+              label: '边界颜色',
+              name: 'borderColor',
+              required: false,
+              placeholder: '',
+              value: '#061E3D'
+            },
+          ],
+        },
+        {
+          name: '数值设置',
+          list: [
+            {
+              type: 'el-switch',
+              label: '文字显示',
+              name: 'isShowFontText',
+              required: false,
+              placeholder: '',
+              value: true,
+            },
+            {
+              type: 'el-input-number',
+              label: '文字大小',
+              name: 'fontTextSize',
+              required: false,
+              placeholder: '',
+              value: 15,
+            },
+            {
+              type: 'el-select',
+              label: '文字粗细',
+              name: 'fontTextWeight',
+              required: false,
+              placeholder: '',
+              selectOptions: [
+                {code: 'normal', name: '正常'},
+                {code: 'bold', name: '粗体'},
+                {code: 'bolder', name: '特粗体'},
+                {code: 'lighter', name: '细体'}
+              ],
+              value: 'normal'
+            },
+            {
+              type: 'el-select',
+              label: '字体风格',
+              name: 'fontTextStyle',
+              required: false,
+              placeholder: '',
+              selectOptions: [
+                { code: 'normal', name: '正常' },
+                { code: 'italic', name: 'italic斜体' },
+                { code: 'oblique', name: 'oblique斜体' },
+              ],
+              value: 'normal'
+            },
+            {
+              type: 'el-switch',
+              label: '数值显示',
+              name: 'isShowFontData',
+              required: false,
+              placeholder: '',
+              value: true,
+            },
+            {
+              type: 'el-input-number',
+              label: '数值大小',
+              name: 'fontDataSize',
+              required: false,
+              placeholder: '',
+              value: 15,
+            },
+            {
+              type: 'el-select',
+              label: '数值粗细',
+              name: 'fontDataWeight',
+              required: false,
+              placeholder: '',
+              selectOptions: [
+                {code: 'normal', name: '正常'},
+                {code: 'bold', name: '粗体'},
+                {code: 'bolder', name: '特粗体'},
+                {code: 'lighter', name: '细体'}
+              ],
+              value: 'normal'
+            },
+            {
+              type: 'el-select',
+              label: '字体风格',
+              name: 'fontDataStyle',
+              required: false,
+              placeholder: '',
+              selectOptions: [
+                { code: 'normal', name: '正常' },
+                { code: 'italic', name: 'italic斜体' },
+                { code: 'oblique', name: 'oblique斜体' },
+              ],
+              value: 'normal'
+            },
+          ],
+        },
+        {
+          name: '提示语设置',
+          list: [
+            {
+              type: 'el-input-number',
+              label: '字体字号',
+              name: 'tipsFontSize',
+              required: false,
+              placeholder: '',
+              value: 16
+            },
+            {
+              type: 'vue-color',
+              label: '字体颜色',
+              name: 'tipsColor',
+              required: false,
+              placeholder: '',
+              value: '#00FEFF'
+            },
+          ],
+        },
+        {
+          name: '数值区域色',
+          list: [
+            {
+              type: 'vue-color',
+              label: '0%处颜色',
+              name: 'num0PreColor',
+              required: false,
+              placeholder: '',
+              value: '#073684'
+            },
+            {
+              type: 'vue-color',
+              label: '100%颜色',
+              name: 'num100PreColor',
+              required: false,
+              placeholder: '',
+              value: '#061E3D'
+            },
+          ],
+        },
+      ],
+    ],
+    data: [
+      {
+        type: 'el-radio-group',
+        label: '数据类型',
+        name: 'dataType',
+        require: false,
+        placeholder: '',
+        selectValue: true,
+        selectOptions: [
+          {
+            code: 'staticData',
+            name: '静态数据',
+          },
+          {
+            code: 'dynamicData',
+            name: '动态数据',
+          },
+        ],
+        value: 'staticData',
+      },
+      {
+        type: 'el-input-number',
+        label: '刷新时间(毫秒)',
+        name: 'refreshTime',
+        relactiveDom: 'dataType',
+        relactiveDomValue: 'dynamicData',
+        value: 600000
+      },
+      {
+        type: 'el-button',
+        label: '静态数据',
+        name: 'staticData',
+        required: false,
+        placeholder: '',
+        relactiveDom: 'dataType',
+        relactiveDomValue: 'staticData',
+        value: [
+          {name: "北京", latitude: 116.4073, longitude: 39.9041, value: 70,},
+          {name: "天津", latitude: 117.2015, longitude: 39.0853, value: 20,},
+          {name: "上海", latitude: 121.4648, longitude: 31.2891, value: 150,},
+          {name: "重庆", latitude: 107.7539, longitude: 30.1904, value: 75,},
+          {name: "河南", latitude: 113.753, longitude: 34.767, value: 83,},
+          {name: "云南", latitude: 102.7093, longitude: 25.0464, value: 50,},
+          {name: "安徽", latitude: 117.3301, longitude: 31.7345, value: 36,},
+          {name: "山东", latitude: 117.0207, longitude: 36.6702, value: 39,},
+          {name: "江西", latitude: 115.8165, longitude: 28.6372, value: 23,},
+          {name: "青海", latitude: 101.7804, longitude: 36.6225, value: 27,},
+          {name: "四川", latitude: 104.0764, longitude: 30.6516, value: 46,},
+          {name: "海南", latitude: 110.3487, longitude: 20.0186, value: 16,},
+          {name: "西藏", latitude: 91.1174, longitude: 29.6486, value: 31,},
+          {name: "宁夏", latitude: 106.2588, longitude: 38.4722, value: 47,},
+          {name: "新疆", latitude: 87.6285, longitude: 43.7933, value: 42,},
+        ],
+      },
+      {
+        type: 'dycustComponents',
+        label: '',
+        name: 'dynamicData',
+        required: false,
+        placeholder: '',
+        relactiveDom: 'dataType',
+        chartType: 'widget-mapv2chart',
+        dictKey: 'MAP_V2_PROPERTIES',
+        relactiveDomValue: 'dynamicData',
+        value: '',
+      },
+    ],
+    position: [
+      {
+        type: 'el-input-number',
+        label: '左边距',
+        name: 'left',
+        required: false,
+        placeholder: '',
+        value: 0,
+      },
+      {
+        type: 'el-input-number',
+        label: '上边距',
+        name: 'top',
+        required: false,
+        placeholder: '',
+        value: 0,
+      },
+      {
+        type: 'el-input-number',
+        label: '宽度',
+        name: 'width',
+        required: false,
+        placeholder: '该容器在1920px大屏中的宽度',
+        value: 600,
+      },
+      {
+        type: 'el-input-number',
+        label: '高度',
+        name: 'height',
+        required: false,
+        placeholder: '该容器在1080px大屏中的高度',
+        value: 400,
+      },
+    ]
+  }
+}

+ 455 - 0
report-ui/src/views/bigscreenDesigner/designer/tools/configure/mapCharts/widget-global-map.js

@@ -0,0 +1,455 @@
+import { dataArr } from "@/utils/word";
+export const widgetGlobalMap = {
+  code: 'widgetGlobalMap',
+  type: 'mapChart',
+  tabName: '地图',
+  label: '世界色阶图',
+  icon: 'icon-ditu1',
+  options: {
+    // 配置
+    setup: [
+      {
+        type: 'el-input-text',
+        label: '图层名称',
+        name: 'layerName',
+        required: false,
+        placeholder: '',
+        value: '世界色阶图',
+      },
+      {
+        type: 'vue-color',
+        label: '背景颜色',
+        name: 'background',
+        required: false,
+        placeholder: '',
+        value: ''
+      },
+      [
+        {
+          name: '标题设置',
+          list: [
+            {
+              type: 'el-switch',
+              label: '标题显示',
+              name: 'isNoTitle',
+              required: false,
+              placeholder: '',
+              value: true,
+            },
+            {
+              type: 'el-input-text',
+              label: '标题名',
+              name: 'titleText',
+              required: false,
+              placeholder: '',
+              value: '',
+            },
+            {
+              type: 'vue-color',
+              label: '字体颜色',
+              name: 'textColor',
+              required: false,
+              placeholder: '',
+              value: '#FFD700'
+            },
+            {
+              type: 'el-input-number',
+              label: '字体字号',
+              name: 'textFontSize',
+              required: false,
+              placeholder: '',
+              value: 20
+            },
+            {
+              type: 'el-select',
+              label: '字体粗细',
+              name: 'textFontWeight',
+              required: false,
+              placeholder: '',
+              selectOptions: [
+                {code: 'normal', name: '正常'},
+                {code: 'bold', name: '粗体'},
+                {code: 'bolder', name: '特粗体'},
+                {code: 'lighter', name: '细体'}
+              ],
+              value: 'normal'
+            },
+            {
+              type: 'el-select',
+              label: '字体风格',
+              name: 'textFontStyle',
+              required: false,
+              placeholder: '',
+              selectOptions: [
+                {code: 'normal', name: '正常'},
+                {code: 'italic', name: 'italic斜体'},
+                {code: 'oblique', name: 'oblique斜体'},
+              ],
+              value: 'normal'
+            },
+            {
+              type: 'el-select',
+              label: '字体位置',
+              name: 'textAlign',
+              required: false,
+              placeholder: '',
+              selectOptions: [
+                {code: 'center', name: '居中'},
+                {code: 'left', name: '左对齐'},
+                {code: 'right', name: '右对齐'},
+              ],
+              value: 'center'
+            },
+            {
+              type: 'el-input-text',
+              label: '副标题名',
+              name: 'subText',
+              required: false,
+              placeholder: '',
+              value: ''
+            },
+            {
+              type: 'vue-color',
+              label: '字体颜色',
+              name: 'subTextColor',
+              required: false,
+              placeholder: '',
+              value: 'rgba(30, 144, 255, 1)'
+            },
+            {
+              type: 'el-input-number',
+              label: '字体字号',
+              name: 'subTextFontSize',
+              required: false,
+              placeholder: '',
+              value: 20
+            },
+            {
+              type: 'el-select',
+              label: '字体粗细',
+              name: 'subTextFontWeight',
+              required: false,
+              placeholder: '',
+              selectOptions: [
+                {code: 'normal', name: '正常'},
+                {code: 'bold', name: '粗体'},
+                {code: 'bolder', name: '特粗体'},
+                {code: 'lighter', name: '细体'}
+              ],
+              value: 'normal'
+            },
+            {
+              type: 'el-select',
+              label: '字体风格',
+              name: 'subTextFontStyle',
+              required: false,
+              placeholder: '',
+              selectOptions: [
+                {code: 'normal', name: '正常'},
+                {code: 'italic', name: 'italic斜体'},
+                {code: 'oblique', name: 'oblique斜体'},
+              ],
+              value: 'normal'
+            },
+          ],
+        },
+        {
+          name: '地图设置',
+          list: [
+            {
+              type: 'el-switch',
+              label: '国家区域名显示',
+              name: 'isShowMap',
+              required: false,
+              placeholder: '',
+              value: false,
+            },
+            {
+              type: 'el-input-number',
+              label: '文字大小',
+              name: 'fontSizeMap',
+              required: false,
+              placeholder: '',
+              value: 20,
+            },
+            {
+              type: 'vue-color',
+              label: '文字颜色',
+              name: 'colorMap',
+              required: false,
+              placeholder: '',
+              value: '#53D9FF'
+            }
+          ]
+        },
+        {
+          name: '地图块颜色',
+          list: [
+            {
+              type: 'vue-color',
+              label: '0%处颜色',
+              name: 'font0PreColor',
+              required: false,
+              placeholder: '',
+              value: '#073684'
+            },
+            {
+              type: 'vue-color',
+              label: '100%颜色',
+              name: 'font100PreColor',
+              required: false,
+              placeholder: '',
+              value: '#061E3D'
+            },
+            {
+              type: 'vue-color',
+              label: '高亮渐变色',
+              name: 'fontHighlightColor',
+              required: false,
+              placeholder: '',
+              value: '#2B91B7'
+            },
+            {
+              type: 'vue-color',
+              label: '边界颜色',
+              name: 'borderColor',
+              required: false,
+              placeholder: '',
+              value: '#061E3D'
+            },
+          ],
+        },
+        {
+          name: '数值设置',
+          list: [
+            {
+              type: 'el-switch',
+              label: '文字显示',
+              name: 'isShowFontText',
+              required: false,
+              placeholder: '',
+              value: true,
+            },
+            {
+              type: 'el-input-number',
+              label: '文字大小',
+              name: 'fontTextSize',
+              required: false,
+              placeholder: '',
+              value: 15,
+            },
+            {
+              type: 'el-select',
+              label: '文字粗细',
+              name: 'fontTextWeight',
+              required: false,
+              placeholder: '',
+              selectOptions: [
+                {code: 'normal', name: '正常'},
+                {code: 'bold', name: '粗体'},
+                {code: 'bolder', name: '特粗体'},
+                {code: 'lighter', name: '细体'}
+              ],
+              value: 'normal'
+            },
+            {
+              type: 'el-select',
+              label: '字体风格',
+              name: 'fontTextStyle',
+              required: false,
+              placeholder: '',
+              selectOptions: [
+                { code: 'normal', name: '正常' },
+                { code: 'italic', name: 'italic斜体' },
+                { code: 'oblique', name: 'oblique斜体' },
+              ],
+              value: 'normal'
+            },
+            {
+              type: 'el-switch',
+              label: '数值显示',
+              name: 'isShowFontData',
+              required: false,
+              placeholder: '',
+              value: true,
+            },
+            {
+              type: 'el-input-number',
+              label: '数值大小',
+              name: 'fontDataSize',
+              required: false,
+              placeholder: '',
+              value: 15,
+            },
+            {
+              type: 'el-select',
+              label: '数值粗细',
+              name: 'fontDataWeight',
+              required: false,
+              placeholder: '',
+              selectOptions: [
+                {code: 'normal', name: '正常'},
+                {code: 'bold', name: '粗体'},
+                {code: 'bolder', name: '特粗体'},
+                {code: 'lighter', name: '细体'}
+              ],
+              value: 'normal'
+            },
+            {
+              type: 'el-select',
+              label: '字体风格',
+              name: 'fontDataStyle',
+              required: false,
+              placeholder: '',
+              selectOptions: [
+                { code: 'normal', name: '正常' },
+                { code: 'italic', name: 'italic斜体' },
+                { code: 'oblique', name: 'oblique斜体' },
+              ],
+              value: 'normal'
+            },
+          ],
+        },
+        {
+          name: '提示语设置',
+          list: [
+            {
+              type: 'el-input-number',
+              label: '字体字号',
+              name: 'tipsFontSize',
+              required: false,
+              placeholder: '',
+              value: 16
+            },
+            {
+              type: 'vue-color',
+              label: '字体颜色',
+              name: 'tipsColor',
+              required: false,
+              placeholder: '',
+              value: '#00FEFF'
+            },
+          ],
+        },
+        {
+          name: '数值区域色',
+          list: [
+            {
+              type: 'vue-color',
+              label: '0%处颜色',
+              name: 'num0PreColor',
+              required: false,
+              placeholder: '',
+              value: '#fff'
+            },
+            {
+              type: 'vue-color',
+              label: '100%颜色',
+              name: 'num100PreColor',
+              required: false,
+              placeholder: '',
+              value: 'rgb(30, 144, 255)'
+            },
+          ],
+        },
+        {
+          name: '自定义国家名',
+          list: [
+            {
+              type: 'customName',
+              label: '',
+              name: 'customName',
+              required: false,
+              value: [],
+            },
+          ],
+        },
+      ],
+    ],
+    data: [
+      {
+        type: 'el-radio-group',
+        label: '数据类型',
+        name: 'dataType',
+        require: false,
+        placeholder: '',
+        selectValue: true,
+        selectOptions: [
+          {
+            code: 'staticData',
+            name: '静态数据',
+          },
+          {
+            code: 'dynamicData',
+            name: '动态数据',
+          },
+        ],
+        value: 'staticData',
+      },
+      {
+        type: 'el-input-number',
+        label: '刷新时间(毫秒)',
+        name: 'refreshTime',
+        relactiveDom: 'dataType',
+        relactiveDomValue: 'dynamicData',
+        value: 600000
+      },
+      {
+        type: 'el-button',
+        label: '静态数据',
+        name: 'staticData',
+        required: false,
+        placeholder: '',
+        relactiveDom: 'dataType',
+        relactiveDomValue: 'staticData',
+        value:dataArr
+      },
+      {
+        type: 'dycustComponents',
+        label: '',
+        name: 'dynamicData',
+        required: false,
+        placeholder: '',
+        relactiveDom: 'dataType',
+        chartType: 'widget-mapv2chart',
+        dictKey: 'MAP_V2_PROPERTIES',
+        relactiveDomValue: 'dynamicData',
+        value: '',
+      },
+    ],
+    position: [
+      {
+        type: 'el-input-number',
+        label: '左边距',
+        name: 'left',
+        required: false,
+        placeholder: '',
+        value: 0,
+      },
+      {
+        type: 'el-input-number',
+        label: '上边距',
+        name: 'top',
+        required: false,
+        placeholder: '',
+        value: 0,
+      },
+      {
+        type: 'el-input-number',
+        label: '宽度',
+        name: 'width',
+        required: false,
+        placeholder: '该容器在1920px大屏中的宽度',
+        value: 600,
+      },
+      {
+        type: 'el-input-number',
+        label: '高度',
+        name: 'height',
+        required: false,
+        placeholder: '该容器在1080px大屏中的高度',
+        value: 400,
+      },
+    ]
+  }
+}

+ 780 - 0
report-ui/src/views/bigscreenDesigner/designer/tools/configure/scatterCharts/widget-scatter.js

@@ -0,0 +1,780 @@
+/*
+ * @Descripttion: 散点图json
+ * @version:
+ * @Author: qianlishi
+ * @Date: 2021-08-29 07:21:45
+ * @LastEditors: qianlishi qianlishi@anji-plus.com
+ * @LastEditTime: 2023-01-10 14:09:03
+ */
+export const widgetScatter = {
+  code: 'widget-scatter',
+  type: 'scatter',
+  tabName: '散点图',
+  label: '散点图',
+  icon: 'icon-24gf-chartScatter',
+  options: {
+    // 配置
+    setup: [
+      {
+        type: 'el-input-text',
+        label: '图层名称',
+        name: 'layerName',
+        required: false,
+        placeholder: '',
+        value: '散点图',
+      },
+      {
+        type: 'el-switch',
+        label: '竖展示',
+        name: 'verticalShow',
+        required: false,
+        placeholder: '',
+        value: false,
+      },
+      {
+        type: 'vue-color',
+        label: '背景颜色',
+        name: 'background',
+        required: false,
+        placeholder: '',
+        value: ''
+      },
+      [
+        {
+          name: '标题设置',
+          list: [
+            {
+              type: 'el-switch',
+              label: '标题显示',
+              name: 'isNoTitle',
+              required: false,
+              placeholder: '',
+              value: true,
+            },
+            {
+              type: 'el-input-text',
+              label: '标题名',
+              name: 'titleText',
+              required: false,
+              placeholder: '',
+              value: '',
+            },
+            {
+              type: 'vue-color',
+              label: '字体颜色',
+              name: 'textColor',
+              required: false,
+              placeholder: '',
+              value: '#FFD700'
+            },
+            {
+              type: 'el-input-number',
+              label: '字体字号',
+              name: 'textFontSize',
+              required: false,
+              placeholder: '',
+              value: 20
+            },
+            {
+              type: 'el-select',
+              label: '字体粗细',
+              name: 'textFontWeight',
+              required: false,
+              placeholder: '',
+              selectOptions: [
+                { code: 'normal', name: '正常' },
+                { code: 'bold', name: '粗体' },
+                { code: 'bolder', name: '特粗体' },
+                { code: 'lighter', name: '细体' }
+              ],
+              value: 'normal'
+            },
+            {
+              type: 'el-select',
+              label: '字体风格',
+              name: 'textFontStyle',
+              required: false,
+              placeholder: '',
+              selectOptions: [
+                { code: 'normal', name: '正常' },
+                { code: 'italic', name: 'italic斜体' },
+                { code: 'oblique', name: 'oblique斜体' },
+              ],
+              value: 'normal'
+            },
+            {
+              type: 'el-select',
+              label: '字体位置',
+              name: 'textAlign',
+              required: false,
+              placeholder: '',
+              selectOptions: [
+                { code: 'center', name: '居中' },
+                { code: 'left', name: '左对齐' },
+                { code: 'right', name: '右对齐' },
+              ],
+              value: 'center'
+            },
+            {
+              type: 'el-input-text',
+              label: '副标题名',
+              name: 'subText',
+              required: false,
+              placeholder: '',
+              value: ''
+            },
+            {
+              type: 'vue-color',
+              label: '字体颜色',
+              name: 'subTextColor',
+              required: false,
+              placeholder: '',
+              value: 'rgba(30, 144, 255, 1)'
+            },
+            {
+              type: 'el-input-number',
+              label: '字体字号',
+              name: 'subTextFontSize',
+              required: false,
+              placeholder: '',
+              value: 20
+            },
+            {
+              type: 'el-select',
+              label: '字体粗细',
+              name: 'subTextFontWeight',
+              required: false,
+              placeholder: '',
+              selectOptions: [
+                { code: 'normal', name: '正常' },
+                { code: 'bold', name: '粗体' },
+                { code: 'bolder', name: '特粗体' },
+                { code: 'lighter', name: '细体' }
+              ],
+              value: 'normal'
+            },
+            {
+              type: 'el-select',
+              label: '字体风格',
+              name: 'subTextFontStyle',
+              required: false,
+              placeholder: '',
+              selectOptions: [
+                { code: 'normal', name: '正常' },
+                { code: 'italic', name: 'italic斜体' },
+                { code: 'oblique', name: 'oblique斜体' },
+              ],
+              value: 'normal'
+            },
+          ],
+        },
+        {
+          name: '图例操作',
+          list: [
+            {
+              type: 'el-switch',
+              label: '图例显示',
+              name: 'isShowLegend',
+              required: false,
+              placeholder: '',
+              value: true,
+            },
+            {
+              type: 'el-input-text',
+              label: '名称( | 分隔)',
+              name: 'legendName',
+              required: false,
+              placeholder: '多值以' | '隔开',
+              value: ''
+            },
+            {
+              type: 'vue-color',
+              label: '字体颜色',
+              name: 'legendColor',
+              required: false,
+              placeholder: '',
+              value: '#fff',
+            },
+            {
+              type: 'el-input-number',
+              label: '字体字号',
+              name: 'legendFontSize',
+              required: false,
+              placeholder: '',
+              value: 12,
+            },
+            {
+              type: 'el-input-number',
+              label: '图例宽度',
+              name: 'legendWidth',
+              required: false,
+              placeholder: '',
+              value: 12,
+            },
+            {
+              type: 'el-select',
+              label: '横向位置',
+              name: 'lateralPosition',
+              required: false,
+              placeholder: '',
+              selectOptions: [
+                { code: 'center', name: '居中' },
+                { code: 'left', name: '左对齐' },
+                { code: 'right', name: '右对齐' },
+              ],
+              value: 'center'
+            },
+            {
+              type: 'el-select',
+              label: '纵向位置',
+              name: 'longitudinalPosition',
+              required: false,
+              placeholder: '',
+              selectOptions: [
+                { code: 'top', name: '顶部' },
+                { code: 'bottom', name: '底部' },
+              ],
+              value: 'top'
+            },
+            {
+              type: 'el-select',
+              label: '布局前置',
+              name: 'layoutFront',
+              required: false,
+              placeholder: '',
+              selectOptions: [
+                { code: 'vertical', name: '竖排' },
+                { code: 'horizontal', name: '横排' },
+              ],
+              value: 'horizontal'
+            },
+          ],
+        },
+        {
+          name: 'X轴设置',
+          list: [
+            {
+              type: 'el-switch',
+              label: '显示',
+              name: 'hideX',
+              required: false,
+              placeholder: '',
+              value: true,
+            },
+            {
+              type: 'el-input-text',
+              label: '坐标名',
+              name: 'nameX',
+              required: false,
+              placeholder: '',
+              value: ''
+            },
+            {
+              type: 'vue-color',
+              label: '坐标名颜色',
+              name: 'nameColorX',
+              required: false,
+              placeholder: '',
+              value: '#fff'
+            },
+            {
+              type: 'el-input-number',
+              label: '坐标名字号',
+              name: 'nameFontSizeX',
+              required: false,
+              placeholder: '',
+              value: 14
+            },
+            {
+              type: 'vue-color',
+              label: '数值颜色',
+              name: 'colorX',
+              required: false,
+              placeholder: '',
+              value: '#fff',
+            },
+            {
+              type: 'el-input-number',
+              label: '数值字号',
+              name: 'fontSizeX',
+              required: false,
+              placeholder: '',
+              value: 14,
+            },
+            {
+              type: 'el-switch',
+              label: '数值自动换行',
+              name: 'textRowsBreakAuto',
+              required: false,
+              placeholder: '',
+              value: false,
+            },
+            {
+              type: 'el-input-text',
+              label: '数值行数',
+              name: 'textRowsNum',
+              required: false,
+              placeholder: '',
+              value: '',
+            },
+            {
+              type: 'el-input-number',
+              label: '数值间隔',
+              name: 'textInterval',
+              required: false,
+              placeholder: '',
+              value: ''
+            },
+            {
+              type: 'el-slider',
+              label: '数值角度',
+              name: 'textAngleX',
+              required: false,
+              placeholder: '',
+              value: 0
+            },
+            {
+              type: 'el-switch',
+              label: '坐标轴反转',
+              name: 'reversalX',
+              required: false,
+              placeholder: '',
+              value: false
+            },
+            {
+              type: 'vue-color',
+              label: '坐标轴颜色',
+              name: 'lineColorX',
+              required: false,
+              placeholder: '',
+              value: '#fff',
+            },
+            {
+              type: 'el-input-number',
+              label: '坐标轴宽度',
+              name: 'lineWidthX',
+              required: false,
+              placeholder: '',
+              value: 1,
+            },
+            {
+              type: 'el-switch',
+              label: '分割线显示',
+              name: 'isShowSplitLineX',
+              require: false,
+              placeholder: '',
+              value: false,
+            },
+            {
+              type: 'vue-color',
+              label: '分割线颜色',
+              name: 'splitLineColorX',
+              required: false,
+              placeholder: '',
+              value: '#fff',
+            },
+            {
+              type: 'el-input-number',
+              label: '分割线宽度',
+              name: 'splitLineWidthX',
+              required: false,
+              placeholder: '',
+              value: 1,
+            },
+          ],
+        },
+        {
+          name: 'Y轴设置',
+          list: [
+            {
+              type: 'el-switch',
+              label: '显示',
+              name: 'isShowY',
+              require: false,
+              placeholder: '',
+              value: true,
+            },
+            {
+              type: 'el-input-text',
+              label: '最大值',
+              name: 'maxY',
+              required: false,
+              placeholder: '',
+              value: '',
+            },
+            {
+              type: 'el-input-text',
+              label: '坐标名',
+              name: 'textNameY',
+              require: false,
+              placeholder: '',
+              value: ''
+            },
+            {
+              type: 'vue-color',
+              label: '坐标名颜色',
+              name: 'nameColorY',
+              required: false,
+              placeholder: '',
+              value: '#fff',
+            },
+            {
+              type: 'el-input-number',
+              label: '坐标名字号',
+              name: 'nameFontSizeY',
+              required: false,
+              placeholder: '',
+              value: 14,
+            },
+            {
+              type: 'vue-color',
+              label: '数值颜色',
+              name: 'colorY',
+              required: false,
+              placeholder: '',
+              value: '#fff',
+            },
+            {
+              type: 'el-input-number',
+              label: '数值字号',
+              name: 'fontSizeY',
+              required: false,
+              placeholder: '',
+              value: 14,
+            },
+            {
+              type: 'el-switch',
+              label: '缩放',
+              name: 'scale',
+              require: false,
+              placeholder: '',
+              value: false,
+            },
+            {
+              type: 'el-input-number',
+              label: '均分',
+              name: 'splitNumberY',
+              required: false,
+              placeholder: '',
+              value: ''
+            },
+            {
+              type: 'el-slider',
+              label: '数值角度',
+              name: 'textAngleY',
+              required: false,
+              placeholder: '',
+              value: 0
+            },
+            {
+              type: 'el-switch',
+              label: '坐标轴反转',
+              name: 'reversalY',
+              required: false,
+              placeholder: '',
+              value: false
+            },
+            {
+              type: 'vue-color',
+              label: '坐标轴颜色',
+              name: 'lineColorY',
+              required: false,
+              placeholder: '',
+              value: '#fff',
+            },
+            {
+              type: 'el-input-number',
+              label: '坐标轴宽度',
+              name: 'lineWidthY',
+              required: false,
+              placeholder: '',
+              value: 1,
+            },
+            {
+              type: 'el-switch',
+              label: '分割线显示',
+              name: 'isShowSplitLineY',
+              require: false,
+              placeholder: '',
+              value: false,
+            },
+            {
+              type: 'vue-color',
+              label: '分割线颜色',
+              name: 'splitLineColorY',
+              required: false,
+              placeholder: '',
+              value: '#fff',
+            },
+            {
+              type: 'el-input-number',
+              label: '分割线宽度',
+              name: 'splitLineWidthY',
+              required: false,
+              placeholder: '',
+              value: 1,
+            },
+          ],
+        },
+        {
+          name: '数值设定',
+          list: [
+            {
+              type: 'el-switch',
+              label: '显示',
+              name: 'isShow',
+              required: false,
+              placeholder: '',
+              value: true
+            },
+            {
+              type: 'el-switch',
+              label: '百分比符号显示',
+              name: 'percentSign',
+              required: false,
+              placeholder: '',
+              value: false
+            },
+            {
+              type: 'el-input-number',
+              label: '距离',
+              name: 'distance',
+              required: false,
+              placeholder: '',
+              value: 5
+            },
+            {
+              type: 'el-input-number',
+              label: '字体字号',
+              name: 'fontSize',
+              required: false,
+              placeholder: '',
+              value: 14
+            },
+            {
+              type: 'vue-color',
+              label: '字体颜色',
+              name: 'dataColor',
+              required: false,
+              placeholder: '',
+              value: ''
+            },
+            {
+              type: 'el-select',
+              label: '字体粗细',
+              name: 'fontWeight',
+              required: false,
+              placeholder: '',
+              selectOptions: [
+                { code: 'normal', name: '正常' },
+                { code: 'bold', name: '粗体' },
+                { code: 'bolder', name: '特粗体' },
+                { code: 'lighter', name: '细体' }
+              ],
+              value: 'normal'
+            },
+          ],
+        },
+        {
+          name: '提示语设置',
+          list: [
+            {
+              type: 'el-input-number',
+              label: '字体字号',
+              name: 'tipsFontSize',
+              required: false,
+              placeholder: '',
+              value: 16
+            },
+            {
+              type: 'vue-color',
+              label: '字体颜色',
+              name: 'tipsColor',
+              required: false,
+              placeholder: '',
+              value: '#00FEFF'
+            },
+          ],
+        },
+        {
+          name: '坐标轴边距设置',
+          list: [
+            {
+              type: 'el-slider',
+              label: '左边距(像素)',
+              name: 'marginLeft',
+              required: false,
+              placeholder: '',
+              value: 10,
+            }, {
+              type: 'el-slider',
+              label: '顶边距(像素)',
+              name: 'marginTop',
+              required: false,
+              placeholder: '',
+              value: 50,
+            }, {
+              type: 'el-slider',
+              label: '右边距(像素)',
+              name: 'marginRight',
+              required: false,
+              placeholder: '',
+              value: 40,
+            }, {
+              type: 'el-slider',
+              label: '底边距(像素)',
+              name: 'marginBottom',
+              required: false,
+              placeholder: '',
+              value: 10,
+            },
+          ],
+        },
+        {
+          name: '自定义配色',
+          list: [
+            {
+              type: 'el-select',
+              label: '配色样式',
+              name: 'colorStyle',
+              required: false,
+              placeholder: '',
+              selectOptions: [
+                { code: 'same', name: '同色' },
+                { code: 'unsame', name: '异色' },
+              ],
+              value: 'same'
+            },
+            {
+              type: 'customColor',
+              label: '',
+              name: 'customColor',
+              required: false,
+              value: [{ color: '#ff7f50' }, { color: '#87cefa' }, { color: '#da70d6' }, { color: '#32cd32' }, { color: '#6495ed' }],
+            },
+          ],
+        },
+        {
+          name: '组件联动',
+          list: [
+            {
+              type: 'componentLinkage',
+              label: '',
+              name: 'componentLinkage',
+              required: false,
+              value: []
+            }
+          ]
+        }
+      ],
+    ],
+    // 数据
+    data: [
+      {
+        type: 'el-radio-group',
+        label: '数据类型',
+        name: 'dataType',
+        require: false,
+        placeholder: '',
+        selectValue: true,
+        selectOptions: [
+          {
+            code: 'staticData',
+            name: '静态数据',
+          },
+          {
+            code: 'dynamicData',
+            name: '动态数据',
+          },
+        ],
+        value: 'staticData',
+      },
+      {
+        type: 'el-input-number',
+        label: '刷新时间(毫秒)',
+        name: 'refreshTime',
+        relactiveDom: 'dataType',
+        relactiveDomValue: 'dynamicData',
+        value: 600000
+      },
+      {
+        type: 'el-button',
+        label: '静态数据',
+        name: 'staticData',
+        required: false,
+        placeholder: '',
+        relactiveDom: 'dataType',
+        relactiveDomValue: 'staticData',
+        value: [
+          { "axis": "苹果", "data": 1000 },
+          { "axis": "三星", "data": 2229 },
+          { "axis": "小米", "data": 3879 },
+          { "axis": "oppo", "data": 2379 },
+          { "axis": "vivo", "data": 4079 },
+        ],
+      },
+      {
+        type: 'dycustComponents',
+        label: '',
+        name: 'dynamicData',
+        required: false,
+        placeholder: '',
+        relactiveDom: 'dataType',
+        relactiveDomValue: 'dynamicData',
+        chartType: 'widget-barchart',
+        dictKey: 'SCATTER_PROPERTIES',
+        value: '',
+      },
+    ],
+    // 坐标
+    position: [
+      {
+        type: 'el-input-number',
+        label: '左边距',
+        name: 'left',
+        required: false,
+        placeholder: '',
+        value: 0,
+      },
+      {
+        type: 'el-input-number',
+        label: '上边距',
+        name: 'top',
+        required: false,
+        placeholder: '',
+        value: 0,
+      },
+      {
+        type: 'el-input-number',
+        label: '宽度',
+        name: 'width',
+        required: false,
+        placeholder: '该容器在1920px大屏中的宽度',
+        value: 400,
+      },
+      {
+        type: 'el-input-number',
+        label: '高度',
+        name: 'height',
+        required: false,
+        placeholder: '该容器在1080px大屏中的高度',
+        value: 200,
+      },
+    ],
+    // 事件
+    methods: [
+      // {
+      //   type: 'methods',
+      //   label: '前置钩子',
+      //   name: 'beforeMethods',
+      //   value: 'function beforeMethods(data){\n\t//自定义脚本内容1\n\treturn data;\n}',
+      // },
+      // {
+      //   type: 'methods',
+      //   label: '后置钩子',
+      //   name: 'afterMethods',
+      //   value: 'function afterMethods(data){\n\t//自定义脚本内容2\n\treturn data;\n}',
+      // },
+    ]
+  }
+}

+ 41 - 36
report-ui/src/views/bigscreenDesigner/designer/tools/main.js

@@ -7,49 +7,51 @@
  * @LastEditTime: 2023-04-19 09:22:37
  */
 
-import { widgetText } from "./configure/texts/widget-text"
-import { widgetMarquee } from "./configure/texts/widget-marquee"
-import { widgetHref } from "./configure/texts/widget-href"
-import { widgetTime } from "./configure/texts/widget-time"
-import { widgetImage } from "./configure/texts/widget-image"
-import { widgetSliders } from "./configure/texts/widget-slider"
-import { widgetVideo } from "./configure/texts/widget-video"
-import { widgetTable } from "./configure/texts/widget-table"
-import { widgetIframe } from "./configure/texts/widget-iframe"
-import { widgetUniversal } from "./configure/widget-universal"
-import { widgetBarchart } from "./configure/barCharts/widget-barchart"
-import { widgetGradientBarchart } from "./configure/barCharts/widget-gradient-barchart"
-import { widgetLinechart } from "./configure/lineCharts/widget-linechart"
-import { widgetBarlinechart } from "./configure/barlineCharts/widget-barlinechart"
-import { widgetPiechart } from "./configure/pieCharts/widget-piechart"
-import { widgetFunnel } from "./configure/funnelCharts/widget-funnel"
-import { widgetGauge } from "./configure/percentCharts/widget-gauge"
-import { widgetLineMap } from "./configure/mapCharts/widget-line-map"
-import { widgetPieNightingale } from "./configure/pieCharts/widget-pie-nightingale"
-import { widgetPiePercentage } from "./configure/percentCharts/widget-pie-percentage"
-import { widgetAirbubbleMap } from "./configure/mapCharts/widget-airbubble-map"
-import { widgetBarStack } from "./configure/barCharts/widget-bar-stack"
-import { widgetLineStack } from "./configure/lineCharts/widget-line-stack"
-import { widgetBarCompare } from "./configure/barCharts/widget-bar-compare"
-import { widgetLineCompare } from "./configure/lineCharts/widget-line-compare"
-import { widgetDecoratePie } from "./configure/styleWidget/widget-decorate-pie";
-import { widgetMoreBarLine } from "./configure/barlineCharts/widget-more-bar-line";
-import { widgetWordCloud } from "./configure/wordcloudCharts/widget-word-cloud";
-import { widgetHeatmap } from "./configure/heatmap/widget-heatmap";
-import { widgetRadar } from "./configure/radarCharts/widget-radar";
-import { widgetBarLineStack } from "./configure/barlineCharts/widget-bar-line-stack";
-import { widgetSelect } from "./configure/form/widget-select";
+import {widgetText} from "./configure/texts/widget-text"
+import {widgetMarquee} from "./configure/texts/widget-marquee"
+import {widgetHref} from "./configure/texts/widget-href"
+import {widgetTime} from "./configure/texts/widget-time"
+import {widgetImage} from "./configure/texts/widget-image"
+import {widgetSliders} from "./configure/texts/widget-slider"
+import {widgetVideo} from "./configure/texts/widget-video"
+import {widgetTable} from "./configure/texts/widget-table"
+import {widgetIframe} from "./configure/texts/widget-iframe"
+import {widgetUniversal} from "./configure/widget-universal"
+import {widgetBarchart} from "./configure/barCharts/widget-barchart"
+import {widgetGradientBarchart} from "./configure/barCharts/widget-gradient-barchart"
+import {widgetLinechart} from "./configure/lineCharts/widget-linechart"
+import {widgetBarlinechart} from "./configure/barlineCharts/widget-barlinechart"
+import {widgetPiechart} from "./configure/pieCharts/widget-piechart"
+import {widgetFunnel} from "./configure/funnelCharts/widget-funnel"
+import {widgetGauge} from "./configure/percentCharts/widget-gauge"
+import {widgetLineMap} from "./configure/mapCharts/widget-line-map"
+import {widgetPieNightingale} from "./configure/pieCharts/widget-pie-nightingale"
+import {widgetPiePercentage} from "./configure/percentCharts/widget-pie-percentage"
+import {widgetAirbubbleMap} from "./configure/mapCharts/widget-airbubble-map"
+import {widgetBarStack} from "./configure/barCharts/widget-bar-stack"
+import {widgetLineStack} from "./configure/lineCharts/widget-line-stack"
+import {widgetBarCompare} from "./configure/barCharts/widget-bar-compare"
+import {widgetLineCompare} from "./configure/lineCharts/widget-line-compare"
+import {widgetDecoratePie} from "./configure/styleWidget/widget-decorate-pie";
+import {widgetMoreBarLine} from "./configure/barlineCharts/widget-more-bar-line";
+import {widgetWordCloud} from "./configure/wordcloudCharts/widget-word-cloud";
+import {widgetHeatmap} from "./configure/heatmap/widget-heatmap";
+import {widgetRadar} from "./configure/radarCharts/widget-radar";
+import {widgetBarLineStack} from "./configure/barlineCharts/widget-bar-line-stack";
+import {widgetSelect} from "./configure/form/widget-select";
 // import { widgetInput } from "./configure/form/widget-input";
-import { widgetFormTime } from "./configure/form/widget-form-time";
-import { widgetScaleVertical } from "./configure/scaleCharts/widget-scale-vertical";
-import { widgetScaleHorizontal } from "./configure/scaleCharts/widget-scale-horizontal"
+import {widgetFormTime} from "./configure/form/widget-form-time";
+import {widgetScaleVertical} from "./configure/scaleCharts/widget-scale-vertical";
+import {widgetScaleHorizontal} from "./configure/scaleCharts/widget-scale-horizontal"
+import {widgetScatter} from "./configure/scatterCharts/widget-scatter";
 import {widgetBarDoubleYaxis} from "./configure/barCharts/widget-bar-double-yaxis-chart";
 import {widgetBorder} from "./configure/styleWidget/widget-border";
 import {widgetDecorateFlowLine} from "./configure/styleWidget/widget-decorate-flow-line";
 import {widgetDecoration} from "./configure/styleWidget/widget-decoration";
 import {widgetBarMap} from "./configure/mapCharts/widget-bar-map";
+import {widgetChinaMap} from "./configure/mapCharts/widget-china-map";
+import {widgetGlobalMap} from "./configure/mapCharts/widget-global-map";
 import {widgetBarStackMoreShow} from "./configure/barCharts/widget-bar-stack-more-show";
-
 export const widgetTool = [
   // type=html类型的组件
   widgetText,
@@ -88,10 +90,13 @@ export const widgetTool = [
   widgetBarLineStack,
   widgetScaleVertical,
   widgetScaleHorizontal,
+  widgetScatter,
   widgetSelect,
   // widgetInput,
   widgetFormTime,
   widgetBarDoubleYaxis,
   widgetBarMap,
+  widgetChinaMap,
+  widgetGlobalMap,
   widgetBarStackMoreShow
 ]

+ 371 - 0
report-ui/src/views/bigscreenDesigner/designer/widget/map/widgetChinaMap.vue

@@ -0,0 +1,371 @@
+<template>
+  <div :style="styleObj">
+    <v-chart ref="myVChart" :options="options" autoresize />
+  </div>
+</template>
+<script>
+import { targetWidgetLinkageLogic } from "@/views/bigscreenDesigner/designer/linkageLogic";
+
+import "../../../../../../node_modules/echarts/map/js/china.js";
+import echarts from "echarts";
+
+export default {
+  name: "widgetChinaMap",
+  props: {
+    value: Object,
+    ispreview: Boolean,
+  },
+  data() {
+    return {
+      options: {
+        xAxis: {
+          axisLine: false,
+        },
+        yAxis: {
+          axisLine: false,
+        },
+        title: {
+          show: true,
+        },
+        visualMap: {
+          min: 0,
+          max: 1000000,
+          text: ["高", "低"],
+          color: ["#073684", "#061E3D"],
+        },
+        tooltip: {
+          trigger: "item",
+          formatter: function (params) {
+            console.log(params);
+            let value=params.value
+            if(isNaN(value)){
+              value=0
+            }
+            return params.name + " : " + value;
+          },
+        },
+        geo: [
+          {
+            map: "china",
+            show: true,
+            roam: false,
+            layoutSize: "80%",
+            label: {
+              emphasis: {
+                show: false,
+                color: "white",
+              },
+            },
+            itemStyle: {
+              normal: {
+                borderColor: new echarts.graphic.LinearGradient(
+                  0,
+                  0,
+                  0,
+                  1,
+                  [
+                    {
+                      offset: 0,
+                      color: "#00F6FF",
+                    },
+                    {
+                      offset: 1,
+                      color: "#53D9FF",
+                    },
+                  ],
+                  false
+                ),
+                borderWidth: 3,
+                shadowColor: "rgba(10,76,139,1)",
+                shadowOffsetY: 0,
+                shadowBlur: 60,
+              },
+            },
+          }
+        ],
+        series: [
+          {
+            aspectScale: 0.75,
+            type: 'map',
+            map: 'china',
+            //roam: true,
+            effect: {
+              show: false,
+              period: 6,
+              trailLength: 0.7,
+              color: "#fff",
+              symbolSize: 3,
+            },
+            label: {
+              normal: {
+                //调整数值
+                position: "right",
+                // 地图省市区显隐
+                show: false,
+                color: "#53D9FF",
+                fontSize: 20,
+              },
+              emphasis: {
+                show: true,
+              },
+            },
+            itemStyle: {
+              normal: {
+                //地图块颜色
+                areaColor: {
+                  x: 0,
+                  y: 0,
+                  x2: 0,
+                  y2: 1,
+                  colorStops: [
+                    {
+                      offset: 0,
+                      color: "#073684", // 0% 处的颜色
+                    },
+                    {
+                      offset: 1,
+                      color: "#061E3D", // 100% 处的颜色
+                    },
+                  ],
+                },
+                borderColor: "#215495",
+                borderWidth: 1,
+              },
+              //鼠标放置颜色加深
+              emphasis: {
+                areaColor: {
+                  x: 0,
+                  y: 0,
+                  x2: 0,
+                  y2: 1,
+                  colorStops: [
+                    {
+                      offset: 0,
+                      color: "#073684", // 0% 处的颜色
+                    },
+                    {
+                      offset: 1,
+                      color: "#2B91B7", // 100% 处的颜色
+                    },
+                  ],
+                },
+              },
+            },
+            data: []
+          }
+        ]
+      },
+      optionsStyle: {}, // 样式
+      optionsData: {}, // 数据
+      optionsCollapse: {}, // 图标属性
+      optionsSetup: {},
+      flagInter: null,
+    };
+  },
+  computed: {
+    styleObj() {
+      return {
+        position: this.ispreview ? "absolute" : "static",
+        width: this.optionsStyle.width + "px",
+        height: this.optionsStyle.height + "px",
+        left: this.optionsStyle.left + "px",
+        top: this.optionsStyle.top + "px",
+        background: this.optionsSetup.background,
+      };
+    },
+    allComponentLinkage() {
+      return this.$store.state.designer.allComponentLinkage;
+    },
+  },
+  watch: {
+    value: {
+      handler(val) {
+        this.optionsStyle = val.position;
+        this.optionsData = val.data;
+        this.optionsCollapse = val.setup;
+        this.optionsSetup = val.setup;
+        this.editorOptions();
+      },
+      deep: true,
+    },
+  },
+  mounted() {
+    this.optionsStyle = this.value.position;
+    this.optionsData = this.value.data;
+    this.optionsCollapse = this.value.setup;
+    this.optionsSetup = this.value.setup;
+    this.editorOptions();
+    targetWidgetLinkageLogic(this); // 联动-目标组件逻辑
+  },
+  methods: {
+    // 修改图标options属性
+    editorOptions() {
+      this.setOptionsTitle();
+      this.setOptionsTooltip();
+      this.setOptionsMap();
+      this.setOptionsData();
+    },
+    // 标题设置
+    setOptionsTitle() {
+      const optionsSetup = this.optionsSetup;
+      const title = {};
+      title.text = optionsSetup.titleText;
+      title.show = optionsSetup.isNoTitle;
+      title.left = optionsSetup.textAlign;
+      title.textStyle = {
+        color: optionsSetup.textColor,
+        fontSize: optionsSetup.textFontSize,
+        fontWeight: optionsSetup.textFontWeight,
+        fontStyle: optionsSetup.textFontStyle,
+      };
+      title.subtext = optionsSetup.subText;
+      title.subtextStyle = {
+        color: optionsSetup.subTextColor,
+        fontWeight: optionsSetup.subTextFontWeight,
+        fontSize: optionsSetup.subTextFontSize,
+        fontStyle: optionsSetup.subTextFontStyle,
+      };
+      this.options.title = title;
+    },
+    // tooltip 设置
+    setOptionsTooltip() {
+      const optionsSetup = this.optionsSetup;
+      const tooltip = {
+        trigger: "item",
+        show: true,
+        enterable: true,
+        textStyle: {
+          color: optionsSetup.tipsColor,
+          fontSize: optionsSetup.tipsFontSize,
+        },
+      };
+      this.options.tooltip = {...this.options.tooltip,...tooltip};
+    },
+    // 地图设置
+    setOptionsMap() {
+      const optionsSetup = this.optionsSetup;
+      const label = {
+        normal: {
+          //调整数值
+          position: "right",
+          // 地图省市区显隐
+          show: optionsSetup.isShowMap,
+          color: optionsSetup.colorMap,
+          fontSize: optionsSetup.fontSizeMap,
+        },
+        emphasis: {
+          show: false,
+        },
+      };
+      const itemStyle = {
+        normal: {
+          //地图块颜色
+          areaColor: {
+            x: 0,
+            y: 0,
+            x2: 0,
+            y2: 1,
+            colorStops: [
+              {
+                offset: 0,
+                color: optionsSetup.font0PreColor, // 0% 处的颜色
+              },
+              {
+                offset: 1,
+                color: optionsSetup.font100PreColor, // 100% 处的颜色
+              },
+            ],
+          },
+          borderColor: optionsSetup.borderColor,
+          borderWidth: 1,
+        },
+        //鼠标放置颜色加深
+        emphasis: {
+          areaColor: {
+            x: 0,
+            y: 0,
+            x2: 0,
+            y2: 1,
+            colorStops: [
+              {
+                offset: 0,
+                color: "#073684", // 0% 处的颜色
+              },
+              {
+                offset: 1,
+                color: optionsSetup.fontHighlightColor, // 100% 处的颜色
+              },
+            ],
+          },
+        },
+      };
+      this.options.visualMap.color=[optionsSetup.num100PreColor,optionsSetup.num0PreColor]
+      this.options.series[0]["label"] = label;
+      this.options.series[0]["itemStyle"] = itemStyle;
+    },
+    //数据解析
+    setOptionsData(e, paramsConfig) {
+      const optionsData = this.optionsData; // 数据类型 静态 or 动态
+      // 联动接收者逻辑开始
+      optionsData.dynamicData = optionsData.dynamicData || {}; // 兼容 dynamicData undefined
+      const myDynamicData = optionsData.dynamicData;
+      clearInterval(this.flagInter); // 不管咋,先干掉上一次的定时任务,避免多跑
+      if (
+        e &&
+        optionsData.dataType !== "staticData" &&
+        Object.keys(myDynamicData.contextData).length
+      ) {
+        const keyArr = Object.keys(myDynamicData.contextData);
+        paramsConfig.forEach((conf) => {
+          if (keyArr.includes(conf.targetKey)) {
+            myDynamicData.contextData[conf.targetKey] = e[conf.originKey];
+          }
+        });
+      }
+      // 联动接收者逻辑结束
+      optionsData.dataType == "staticData"
+        ? this.staticDataFn(optionsData.staticData)
+        : this.dynamicDataFn(optionsData.dynamicData, optionsData.refreshTime);
+    },
+    staticDataFn(val) {
+      this.options.series[0].data = val;
+      const seriesData =this.options.series[0].data.map(({value})=> value);
+      this.options.visualMap.max=Math.max(...seriesData)
+    },
+    dynamicDataFn(val, refreshTime) {
+      if (!val) return;
+      if (this.ispreview) {
+        this.getEchartData(val);
+        this.flagInter = setInterval(() => {
+          this.getEchartData(val);
+        }, refreshTime);
+      } else {
+        this.getEchartData(val);
+      }
+    },
+    getEchartData(val) {
+      const data = this.queryEchartsData(val);
+      data.then((res) => {
+        this.renderingFn(res);
+      });
+    },
+    renderingFn(val) {
+      this.options.series[0].data = val;
+      const seriesData =this.options.series[0].data.map(({value})=> value);
+      this.options.visualMap.max=Math.max(...seriesData)
+    },
+  },
+};
+</script>
+<style lang="scss" scoped>
+.echartMap {
+  width: 100%;
+  height: 100%;
+}
+
+.echarts {
+  width: 100%;
+  height: 100%;
+  overflow: hidden;
+}
+</style>

+ 343 - 0
report-ui/src/views/bigscreenDesigner/designer/widget/map/widgetGlobalMap.vue

@@ -0,0 +1,343 @@
+<template>
+  <div :style="styleObj">
+    <v-chart ref="myVChart" :options="options" autoresize />
+  </div>
+</template>
+<script>
+import { targetWidgetLinkageLogic } from "@/views/bigscreenDesigner/designer/linkageLogic";
+import "../../../../../../node_modules/echarts/map/js/world.js";
+import { nameMap } from "@/utils/word";
+
+
+export default {
+  name: "widgetGlobalMap",
+  props: {
+    value: Object,
+    ispreview: Boolean,
+  },
+  data() {
+    return {
+      options: {
+        xAxis: {
+          axisLine: false,
+        },
+        yAxis: {
+          axisLine: false,
+        },
+        title: {
+          show: true,
+        },
+        tooltip: {
+          trigger: "item",
+          formatter: function (params) {
+            console.log(params);
+            let value=params.value
+            if(isNaN(value)){
+              value=0
+            }
+            return params.name + " : " + value;
+          },
+        },
+        visualMap: {
+          min: 0,
+          max: 99999,
+          text: ["高", "低"],
+          color: ["#073684", "#061E3D"],
+        },
+        series: [
+          {
+            type: "map",
+            mapType: "world",
+            nameMap: nameMap,
+            effect: {
+              show: false,
+              period: 6,
+              trailLength: 0.7,
+              color: "#fff",
+              symbolSize: 3,
+            },
+            label: {
+              normal: {
+                position: "right",
+                show: false,
+                color: "#53D9FF",
+                fontSize: 20,
+              },
+              emphasis: {
+                show: true,
+              },
+            },
+            itemStyle: {
+              normal: {
+                //地图块颜色
+                areaColor: {
+                  x: 0,
+                  y: 0,
+                  x2: 0,
+                  y2: 1,
+                  colorStops: [
+                    {
+                      offset: 0,
+                      color: "#073684", // 0% 处的颜色
+                    },
+                    {
+                      offset: 1,
+                      color: "#061E3D", // 100% 处的颜色
+                    },
+                  ],
+                },
+                borderColor: "#215495",
+                borderWidth: 1,
+              },
+              // 鼠标放置颜色加深
+              emphasis: {
+                areaColor: {
+                  x: 0,
+                  y: 0,
+                  x2: 0,
+                  y2: 1,
+                  colorStops: [
+                    {
+                      offset: 0,
+                      color: "#073684", // 0% 处的颜色
+                    },
+                    {
+                      offset: 1,
+                      color: "#2B91B7", // 100% 处的颜色
+                    },
+                  ],
+                },
+              },
+            },
+            data: [],
+          },
+        ],
+      },
+      optionsStyle: {}, // 样式
+      optionsData: {}, // 数据
+      optionsCollapse: {}, // 图标属性
+      optionsSetup: {},
+      flagInter: null,
+    };
+  },
+  computed: {
+    styleObj() {
+      return {
+        position: this.ispreview ? "absolute" : "static",
+        width: this.optionsStyle.width + "px",
+        height: this.optionsStyle.height + "px",
+        left: this.optionsStyle.left + "px",
+        top: this.optionsStyle.top + "px",
+        background: this.optionsSetup.background,
+      };
+    },
+    allComponentLinkage() {
+      return this.$store.state.designer.allComponentLinkage;
+    },
+  },
+  watch: {
+    value: {
+      handler(val) {
+        this.optionsStyle = val.position;
+        this.optionsData = val.data;
+        this.optionsCollapse = val.setup;
+        this.optionsSetup = val.setup;
+        this.editorOptions();
+      },
+      deep: true,
+    },
+  },
+  mounted() {
+    this.optionsStyle = this.value.position;
+    this.optionsData = this.value.data;
+    this.optionsCollapse = this.value.setup;
+    console.log(this.value.setup);
+    this.optionsSetup = this.value.setup;
+    this.editorOptions();
+    targetWidgetLinkageLogic(this); // 联动-目标组件逻辑
+  },
+  methods: {
+    // 修改图标options属性
+    editorOptions() {
+      this.setOptionsTitle();
+      this.setOptionsTooltip();
+      this.setOptionsMap();
+      this.setOptionsData();
+    },
+    // 标题设置
+    setOptionsTitle() {
+      const optionsSetup = this.optionsSetup;
+      const title = {};
+      title.text = optionsSetup.titleText;
+      title.show = optionsSetup.isNoTitle;
+      title.left = optionsSetup.textAlign;
+      title.textStyle = {
+        color: optionsSetup.textColor,
+        fontSize: optionsSetup.textFontSize,
+        fontWeight: optionsSetup.textFontWeight,
+        fontStyle: optionsSetup.textFontStyle,
+      };
+      title.subtext = optionsSetup.subText;
+      title.subtextStyle = {
+        color: optionsSetup.subTextColor,
+        fontWeight: optionsSetup.subTextFontWeight,
+        fontSize: optionsSetup.subTextFontSize,
+        fontStyle: optionsSetup.subTextFontStyle,
+      };
+      this.options.title = title;
+    },
+    // tooltip 设置
+    setOptionsTooltip() {
+      const optionsSetup = this.optionsSetup;
+      const tooltip = {
+        trigger: "item",
+        show: true,
+        enterable: true,
+        textStyle: {
+          color: optionsSetup.tipsColor,
+          fontSize: optionsSetup.tipsFontSize,
+        },
+      };
+      this.options.tooltip = {...this.options.tooltip,...tooltip};
+    },
+    // 地图设置
+    setOptionsMap() {
+      const optionsSetup = this.optionsSetup;
+      const label = {
+        normal: {
+          //调整数值
+          position: "right",
+          // 地图省市区显隐
+          show: optionsSetup.isShowMap,
+          color: optionsSetup.colorMap,
+          fontSize: optionsSetup.fontSizeMap,
+        },
+        emphasis: {
+          show: false,
+        },
+      };
+      const itemStyle = {
+        normal: {
+          //地图块颜色
+          areaColor: {
+            x: 0,
+            y: 0,
+            x2: 0,
+            y2: 1,
+            colorStops: [
+              {
+                offset: 0,
+                color: optionsSetup.font0PreColor, // 0% 处的颜色
+              },
+              {
+                offset: 1,
+                color: optionsSetup.font100PreColor, // 100% 处的颜色
+              },
+            ],
+          },
+          borderColor: optionsSetup.borderColor,
+          borderWidth: 1,
+        },
+        //鼠标放置颜色加深
+        emphasis: {
+          areaColor: {
+            x: 0,
+            y: 0,
+            x2: 0,
+            y2: 1,
+            colorStops: [
+              {
+                offset: 0,
+                color: "#073684", // 0% 处的颜色
+              },
+              {
+                offset: 1,
+                color: optionsSetup.fontHighlightColor, // 100% 处的颜色
+              },
+            ],
+          },
+        },
+      };
+      let _nameMap=JSON.parse(JSON.stringify(nameMap))
+      if(optionsSetup.customName&&optionsSetup.customName.length>0){
+        for(var key in nameMap){
+          for(let val of optionsSetup.customName){
+            if(val['country']==nameMap[key]){
+              _nameMap[key]=val.name
+            }
+          }
+        }
+        this.options.series[0].nameMap=_nameMap
+      }else{
+        this.options.series[0].nameMap=nameMap
+      }
+      this.options.visualMap.color=[optionsSetup.num100PreColor,optionsSetup.num0PreColor]
+      this.options.series[0]["label"] = label;
+      this.options.series[0]["itemStyle"] = itemStyle;
+    },
+    //数据解析
+    setOptionsData(e, paramsConfig) {
+      const optionsData = this.optionsData; // 数据类型 静态 or 动态
+      // 联动接收者逻辑开始
+      optionsData.dynamicData = optionsData.dynamicData || {}; // 兼容 dynamicData undefined
+      const myDynamicData = optionsData.dynamicData;
+      clearInterval(this.flagInter); // 不管咋,先干掉上一次的定时任务,避免多跑
+      if (
+        e &&
+        optionsData.dataType !== "staticData" &&
+        Object.keys(myDynamicData.contextData).length
+      ) {
+        const keyArr = Object.keys(myDynamicData.contextData);
+        paramsConfig.forEach((conf) => {
+          if (keyArr.includes(conf.targetKey)) {
+            myDynamicData.contextData[conf.targetKey] = e[conf.originKey];
+          }
+        });
+      }
+      // 联动接收者逻辑结束
+      optionsData.dataType == "staticData"
+        ? this.staticDataFn(optionsData.staticData)
+        : this.dynamicDataFn(optionsData.dynamicData, optionsData.refreshTime);
+    },
+    staticDataFn(val) {
+      this.options.series[0].data = val;
+      const seriesData =this.options.series[0].data.map(({value})=> value);
+        this.options.visualMap.max=Math.max(...seriesData)
+    },
+    dynamicDataFn(val, refreshTime) {
+      if (!val) return;
+      if (this.ispreview) {
+        this.getEchartData(val);
+        this.flagInter = setInterval(() => {
+          this.getEchartData(val);
+        }, refreshTime);
+      } else {
+        this.getEchartData(val);
+      }
+    },
+    getEchartData(val) {
+      const data = this.queryEchartsData(val);
+      data.then((res) => {
+        this.renderingFn(res);
+      });
+    },
+    renderingFn(val) {
+      this.options.series[0].data = val;
+      const seriesData =this.options.series[0].data.map(({value})=> value);
+        this.options.visualMap.max=Math.max(...seriesData)
+    },
+  },
+};
+</script>
+<style lang="scss" scoped>
+.echartMap {
+  width: 100%;
+  height: 100%;
+}
+
+.echarts {
+  width: 100%;
+  height: 100%;
+  overflow: hidden;
+}
+</style>

+ 573 - 0
report-ui/src/views/bigscreenDesigner/designer/widget/scatter/widgetScatter.vue

@@ -0,0 +1,573 @@
+<template>
+  <div :style="styleObj">
+    <v-chart ref="myVChart" :options="options" autoresize v-if="show"/>
+  </div>
+</template>
+
+<script>
+import {
+  originWidgetLinkageLogic,
+  targetWidgetLinkageLogic,
+} from "@/views/bigscreenDesigner/designer/linkageLogic";
+
+export default {
+  name: "widgetScatter",
+  components: {},
+  props: {
+    value: Object,
+    ispreview: Boolean,
+    widgetIndex: {
+      type: Number,
+      default: 0,
+    }, // 当前组件,在工作区变量widgetInWorkbench中的索引
+  },
+  data() {
+    return {
+      options: {
+        grid: {},
+        legend: {
+          textStyle: {
+            color: "#fff",
+          },
+        },
+        xAxis: {
+          type: "category",
+          data: [],
+          axisLabel: {
+            show: true,
+            textStyle: {
+              color: "#fff",
+            },
+          },
+        },
+        yAxis: {
+          type: "value",
+          data: [],
+          axisLabel: {
+            show: true,
+            textStyle: {
+              color: "#fff",
+            },
+          },
+        },
+        series: [
+          {
+            data: [],
+            symbolSize: 10,
+            type: "scatter",
+          },
+        ],
+      },
+      optionsStyle: {}, // 样式
+      optionsData: {}, // 数据
+      optionsSetup: {},
+      flagInter: null,
+      show:true
+    };
+  },
+  computed: {
+    styleObj() {
+      return {
+        position: this.ispreview ? "absolute" : "static",
+        width: this.optionsStyle.width + "px",
+        height: this.optionsStyle.height + "px",
+        left: this.optionsStyle.left + "px",
+        top: this.optionsStyle.top + "px",
+        background: this.optionsSetup.background,
+      };
+    },
+    allComponentLinkage() {
+      return this.$store.state.designer.allComponentLinkage;
+    },
+  },
+  watch: {
+    value: {
+      handler(val) {
+        this.optionsStyle = val.position;
+        this.optionsData = val.data;
+        this.optionsCollapse = val.setup;
+        this.optionsSetup = val.setup;
+        this.editorOptions();
+      },
+      deep: true,
+    },
+    optionsData(){
+      // this.show=false;
+      // this.$nextTick(()=>{
+      //   this.show=true
+      // })
+    }
+  },
+  mounted() {
+    this.optionsStyle = this.value.position;
+    this.optionsData = this.value.data;
+    this.optionsCollapse = this.value.setup;
+    this.optionsSetup = this.value.setup;
+    this.editorOptions();
+    targetWidgetLinkageLogic(this); // 联动-目标组件逻辑
+    originWidgetLinkageLogic(this); // 联动-源组件逻辑
+  },
+  methods: {
+    // 修改图标options属性
+    editorOptions() {
+      this.setOptionsTitle();
+      this.setOptionsX();
+      this.setOptionsY();
+      this.setOptionsLegend();
+      this.setOptionsTooltip();
+      this.setOptionsMargin();
+      this.setOptionsData();
+    },
+    // 标题修改
+    setOptionsTitle() {
+      const optionsSetup = this.optionsSetup;
+      const title = {};
+      title.text = optionsSetup.titleText;
+      title.show = optionsSetup.isNoTitle;
+      title.left = optionsSetup.textAlign;
+      title.textStyle = {
+        color: optionsSetup.textColor,
+        fontSize: optionsSetup.textFontSize,
+        fontWeight: optionsSetup.textFontWeight,
+        fontStyle: optionsSetup.textFontStyle,
+      };
+      title.subtext = optionsSetup.subText;
+      title.subtextStyle = {
+        color: optionsSetup.subTextColor,
+        fontWeight: optionsSetup.subTextFontWeight,
+        fontSize: optionsSetup.subTextFontSize,
+        fontStyle: optionsSetup.subTextFontStyle,
+      };
+      this.options.title = title;
+    },
+    // X轴设置
+    setOptionsX() {
+      const optionsSetup = this.optionsSetup;
+      const xAxis = {
+        type: "category",
+        // 坐标轴是否显示
+        show: optionsSetup.hideX,
+        // 坐标轴名称
+        name: optionsSetup.nameX,
+        nameTextStyle: {
+          color: optionsSetup.nameColorX,
+          fontSize: optionsSetup.nameFontSizeX,
+        },
+        // 轴反转
+        inverse: optionsSetup.reversalX,
+        axisLabel: {
+          show: true,
+          interval: optionsSetup.textInterval,
+          // 文字角度
+          rotate: optionsSetup.textAngleX,
+          textStyle: {
+            // 坐标文字颜色
+            color: optionsSetup.colorX,
+            fontSize: optionsSetup.fontSizeX,
+          },
+        },
+        axisLine: {
+          show: true,
+          lineStyle: {
+            color: optionsSetup.lineColorX,
+            width: optionsSetup.lineWidthX,
+          },
+        },
+        splitLine: {
+          show: optionsSetup.isShowSplitLineX,
+          lineStyle: {
+            color: optionsSetup.splitLineColorX,
+            width: optionsSetup.splitLineWidthX,
+          },
+        },
+      };
+      this.options.xAxis = xAxis;
+    },
+    // Y轴设置
+    setOptionsY() {
+      const optionsSetup = this.optionsSetup;
+      const yAxis = {
+        max: optionsSetup.maxY !== "" ? optionsSetup.maxY : null,
+        type: "value",
+        scale: optionsSetup.scale,
+        // 均分
+        splitNumber: optionsSetup.splitNumberY,
+        // 坐标轴是否显示
+        show: optionsSetup.isShowY,
+        // 坐标轴名称
+        name: optionsSetup.textNameY,
+        nameTextStyle: {
+          color: optionsSetup.nameColorY,
+          fontSize: optionsSetup.nameFontSizeY,
+        },
+        // 轴反转
+        inverse: optionsSetup.reversalY,
+        axisLabel: {
+          show: true,
+          // 文字角度
+          rotate: optionsSetup.textAngleY,
+          textStyle: {
+            // 坐标文字颜色
+            color: optionsSetup.colorY,
+            fontSize: optionsSetup.fontSizeY,
+          },
+        },
+        axisLine: {
+          show: true,
+          lineStyle: {
+            color: optionsSetup.lineColorY,
+            width: optionsSetup.lineWidthY,
+          },
+        },
+        splitLine: {
+          show: optionsSetup.isShowSplitLineY,
+          lineStyle: {
+            color: optionsSetup.splitLineColorY,
+            width: optionsSetup.splitLineWidthY,
+          },
+        },
+      };
+      this.options.yAxis = yAxis;
+    },
+    // tooltip 设置
+    setOptionsTooltip() {
+      const optionsSetup = this.optionsSetup;
+      const tooltip = {
+        trigger: "item",
+        show: true,
+        textStyle: {
+          color: optionsSetup.tipsColor,
+          fontSize: optionsSetup.tipsFontSize,
+        },
+      };
+      this.options.tooltip = tooltip;
+    },
+    // 边距设置
+    setOptionsMargin() {
+      const optionsSetup = this.optionsSetup;
+      const grid = {
+        left: optionsSetup.marginLeft,
+        right: optionsSetup.marginRight,
+        bottom: optionsSetup.marginBottom,
+        top: optionsSetup.marginTop,
+        containLabel: true,
+      };
+      this.options.grid = grid;
+    },
+    // 图例
+    setOptionsLegend() {
+      const optionsSetup = this.optionsSetup;
+      const legend = this.options.legend;
+      legend.show = optionsSetup.isShowLegend;
+      legend.left = optionsSetup.lateralPosition;
+      legend.top = optionsSetup.longitudinalPosition;
+      legend.bottom = optionsSetup.longitudinalPosition;
+      legend.orient = optionsSetup.layoutFront;
+      legend.textStyle = {
+        color: optionsSetup.legendColor,
+        fontSize: optionsSetup.legendFontSize,
+      };
+      legend.itemWidth = optionsSetup.legendWidth;
+    },
+    // 图例名称设置
+    setOptionsLegendName(name) {
+      const optionsSetup = this.optionsSetup;
+      const series = this.options.series;
+      const legendName = optionsSetup.legendName;
+      if(series.length==0){
+        return;
+      }
+      // 图例没有手动写则显示原值,写了则显示新值
+      if (null == legendName || legendName == "") {
+        for (let i = 0; i < name.length; i++) {
+          series[i].name = name[i];
+        }
+        this.options.legend["data"] = name;
+      } else {
+        const arr = legendName.split("|");
+        for (let i = 0; i < arr.length; i++) {
+          series[i].name = arr[i];
+        }
+        this.options.legend["data"] = arr;
+      }
+    },
+    //获取堆叠样式
+    getStackStyle() {
+      const optionsSetup = this.optionsSetup;
+      let style = "";
+      if (optionsSetup.stackStyle == "upDown") {
+        style = "total";
+      }
+      return style;
+    },
+    // 获得位置
+    getOptionsPosition() {
+      const optionsSetup = this.optionsSetup;
+      let position = "";
+      if (optionsSetup.verticalShow) {
+        position = "right";
+      } else {
+        position = "top";
+      }
+      return position;
+    },
+    // 数据解析
+    setOptionsData(e, paramsConfig) {
+      const optionsData = this.optionsData; // 数据类型 静态 or 动态
+      // 联动接收者逻辑开始
+      optionsData.dynamicData = optionsData.dynamicData || {}; // 兼容 dynamicData undefined
+      const myDynamicData = optionsData.dynamicData;
+      clearInterval(this.flagInter); // 不管咋,先干掉上一次的定时任务,避免多跑
+      if (
+        e &&
+        optionsData.dataType !== "staticData" &&
+        Object.keys(myDynamicData.contextData).length
+      ) {
+        const keyArr = Object.keys(myDynamicData.contextData);
+        paramsConfig.forEach((conf) => {
+          if (keyArr.includes(conf.targetKey)) {
+            myDynamicData.contextData[conf.targetKey] = e[conf.originKey];
+          }
+        });
+      }
+        // this.options.series =  optionsData.series
+      // 联动接收者逻辑结束
+      optionsData.dataType == "staticData"
+        ? this.staticDataFn(optionsData.staticData)
+        : this.dynamicDataFn(optionsData.refreshTime);
+    },
+    // 静态数据
+    staticDataFn(val) {
+      const optionsSetup = this.optionsSetup;
+      //颜色
+      const customColor = optionsSetup.customColor;
+      const arrColor = [];
+      for (let i = 0; i < customColor.length; i++) {
+        arrColor.push(customColor[i].color);
+      }
+      const series = this.options.series;
+      let axis = [];
+      let data = [];
+      for (const i in val) {
+        axis[i] = val[i].axis;
+        data[i] = val[i].data;
+      }
+      const legendName = [];
+      legendName.push("scatter");
+      for (const i in series) {
+        if (series[i].type == "scatter") {
+          series[i].type = "scatter";
+          series[i].label = {
+            show: optionsSetup.isShow,
+            position: this.getOptionsPosition(),
+            distance: optionsSetup.distance,
+            fontSize: optionsSetup.fontSize,
+            color: optionsSetup.dataColor,
+            fontWeight: optionsSetup.fontWeight,
+            formatter: !!optionsSetup.percentSign ? '{c}%' : '{c}'
+          };
+          // 获取颜色样式
+          if (optionsSetup.colorStyle == 'same') {
+            series[i].itemStyle = {
+              normal: {
+                color: arrColor[i],
+              },
+            };
+          } else {
+            series[i].itemStyle = {
+              normal: {
+                color: (params) => {
+                  return arrColor[params.dataIndex];
+                },
+              },
+            };
+          }
+          //柱体背景属性
+          series[i].showBackground = optionsSetup.isShowBackground;
+          series[i].backgroundStyle = {
+            color: optionsSetup.backgroundStyleColor,
+            borderColor: optionsSetup.backgroundStyleBorderColor,
+            borderWidth: optionsSetup.backgroundStyleBorderWidth,
+            borderType: optionsSetup.backgroundStyleBorderType,
+            shadowBlur: optionsSetup.backgroundStyleShadowBlur,
+            shadowColor: optionsSetup.backgroundStyleShadowColor,
+            opacity: optionsSetup.backgroundStyleOpacity / 100,
+          };
+          series[i].data = data;
+        }
+      }
+      // 根据图表的宽度 x轴的字体大小、长度来估算X轴的label能展示多少个字
+      const rowsNum = optionsSetup.textRowsNum !== "" ? optionsSetup.textRowsNum : parseInt((this.optionsStyle.width / axis.length) / optionsSetup.fontSizeX)
+      const axisLabel = {
+        show: true,
+        interval: optionsSetup.textInterval,
+        // 文字角度
+        rotate: optionsSetup.textAngleX,
+        textStyle: {
+          // 坐标文字颜色
+          color: optionsSetup.colorX,
+          fontSize: optionsSetup.fontSizeX,
+        },
+        // 自动换行
+        formatter: function (value, index) {
+          const strs = value.split('');
+          let str = ''
+          for (let i = 0, s; s = strs[i++];) {
+            str += s;
+            if (!(i % rowsNum)) str += '\n';
+          }
+          return str
+        }
+      };
+      // x轴
+      if (optionsSetup.verticalShow) {
+        this.options.xAxis.data = [];
+        this.options.yAxis.data = axis;
+        this.options.xAxis.type = "value";
+        this.options.yAxis.type = "category";
+      } else {
+        this.options.xAxis.data = axis;
+        this.options.yAxis.data = [];
+        this.options.xAxis.type = "category";
+        this.options.yAxis.type = "value";
+        if (optionsSetup.textRowsBreakAuto) {
+          this.options.xAxis.axisLabel = axisLabel;
+        }
+      }
+      this.options.legend["data"] = legendName;
+      this.setOptionsLegendName(legendName);
+    },
+    // 动态数据
+    dynamicDataFn(refreshTime) {
+      const optionsSetup = this.optionsSetup;
+      const optionsData = this.optionsData;
+      const val = optionsData.dynamicData;
+      if (!val) return;
+      if (this.ispreview) {
+        this.getEchartData(val, optionsSetup);
+        this.flagInter = setInterval(() => {
+          this.getEchartData(val, optionsSetup);
+        }, refreshTime);
+      } else {
+        this.getEchartData(val, optionsSetup);
+      }
+    },
+    getEchartData(val, optionsSetup) {
+      const data = this.queryEchartsData(val);
+      data.then((res) => {
+        this.renderingFn(optionsSetup, res);
+      });
+    },
+    renderingFn(optionsSetup, val) {
+      //颜色
+      const customColor = optionsSetup.customColor;
+      const arrColor = [];
+      for (let i = 0; i < customColor.length; i++) {
+        arrColor.push(customColor[i].color);
+      }
+      const series = [];
+      const legendName = [];
+      for (const i in val.series) {
+        legendName.push(val.series[i].name);
+        const obj = {};
+        console.log(val.series[i]);
+        if (val.series[i].type == "point") {
+          obj.type = "scatter";
+          obj.stack = this.getStackStyle();
+          obj.label = {
+            show: optionsSetup.isShow,
+            position: this.getOptionsPosition(),
+            distance: optionsSetup.distance,
+            fontSize: optionsSetup.fontSize,
+            color: optionsSetup.dataColor,
+            fontWeight: optionsSetup.fontWeight,
+            formatter: !!optionsSetup.percentSign ? '{c}%' : '{c}'
+          };
+          // 获取颜色样式
+          if (optionsSetup.colorStyle == 'same') {
+            obj.itemStyle = {
+              normal: {
+                color: arrColor[i],
+              },
+            };
+          } else {
+            obj.itemStyle = {
+              normal: {
+                color: (params) => {
+                  return arrColor[params.dataIndex];
+                },
+              },
+            };
+          }
+          //柱体背景属性
+          obj.showBackground = optionsSetup.isShowBackground;
+          obj.backgroundStyle = {
+            color: optionsSetup.backgroundStyleColor,
+            borderColor: optionsSetup.backgroundStyleBorderColor,
+            borderWidth: optionsSetup.backgroundStyleBorderWidth,
+            borderType: optionsSetup.backgroundStyleBorderType,
+            shadowBlur: optionsSetup.backgroundStyleShadowBlur,
+            shadowColor: optionsSetup.backgroundStyleShadowColor,
+            opacity: optionsSetup.backgroundStyleOpacity / 100,
+          }
+          obj.data = val.series[i].data;
+          series.push(obj);
+        }
+      }
+      // 根据图表的宽度 x轴的字体大小、长度来估算X轴的label能展示多少个字
+      const xAxisDataLength = val.length !== 0 ? val.xAxis.length : 1;
+      const rowsNum = optionsSetup.textRowsNum !== "" ? optionsSetup.textRowsNum : parseInt((this.optionsStyle.width / xAxisDataLength) / optionsSetup.fontSizeX);
+      const axisLabel = {
+        show: true,
+        interval: optionsSetup.textInterval,
+        // 文字角度
+        rotate: optionsSetup.textAngleX,
+        textStyle: {
+          // 坐标文字颜色
+          color: optionsSetup.colorX,
+          fontSize: optionsSetup.fontSizeX,
+        },
+        // 自动换行
+        formatter: function (value, index) {
+          const strs = value.split('');
+          let str = ''
+          for (let i = 0, s; s = strs[i++];) {
+            str += s;
+            if (!(i % rowsNum)) str += '\n';
+          }
+          return str
+        }
+      };
+      // x轴
+      if (optionsSetup.verticalShow) {
+        this.options.xAxis.data = [];
+        this.options.yAxis.data = val.xAxis;
+        this.options.xAxis.type = "value";
+        this.options.yAxis.type = "category";
+      } else {
+        this.options.xAxis.data = val.xAxis;
+        this.options.yAxis.data = [];
+        this.options.xAxis.type = "category";
+        this.options.yAxis.type = "value";
+        if (optionsSetup.textRowsBreakAuto) {
+          this.options.xAxis.axisLabel = axisLabel;
+        }
+      }
+      this.options.series = series;
+      this.options.legend["data"] = legendName;
+      let data2=JSON.parse(JSON.stringify(this.options))
+      this.options={}
+      this.options=data2
+      this.setOptionsLegendName(legendName);
+    },
+  },
+};
+</script>
+
+<style scoped lang="scss">
+.echarts {
+  width: 100%;
+  height: 100%;
+  overflow: hidden;
+}
+</style>

+ 11 - 10
report-ui/src/views/bigscreenDesigner/designer/widget/temp.vue

@@ -1,10 +1,3 @@
-<!--
- * @Descripttion: 大屏报表设计器-组件注册
- * @Author: Devli
- * @Date: 2021-3-19 10:23:27
- * @LastEditors: qianlishi
- * @LastEditTime: 2023-2-7 17:38:44
--->
 <template>
   <div>
     <component
@@ -52,11 +45,14 @@ import widgetInput from "./form/widgetInput.vue";
 import widgetFormTime from "./form/widgetFormTime.vue";
 import widgetScaleVertical from "./scale/widgetScaleVertical.vue";
 import widgetScaleHorizontal from "./scale/widgetScaleHorizontal.vue";
+import widgetScatter from "./scatter/widgetScatter.vue";
 import widgetBarDoubleYaxisChart from "./bar/widgetBarDoubleYaxisChart.vue";
 import widgetDecorateFlowLine from "./styleWidget/widgetDecorateFlowLine.vue";
 import widgetBorder from "./styleWidget/widgetBorder.vue";
 import widgetDecoration from "./styleWidget/widgetDecoration.vue";
 import widgetBarMap from "./map/widgetBarMap.vue";
+import widgetChinaMap from "./map/widgetChinaMap.vue";
+import widgetGlobalMap from "./map/widgetGlobalMap.vue";
 import widgetBarStackMoreShowChart from "./bar/widgetBarStackMoreShowChart.vue";
 
 export default {
@@ -102,7 +98,10 @@ export default {
     widgetFormTime,
     widgetBarDoubleYaxisChart,
     widgetBarMap,
-    widgetBarStackMoreShowChart
+    widgetChinaMap,
+    widgetGlobalMap,
+    widgetScatter,
+    widgetBarStackMoreShowChart,
   },
   model: {
     prop: "value",
@@ -112,7 +111,8 @@ export default {
     type: String,
     value: {
       type: [Object],
-      default: () => {},
+      default: () => {
+      },
     },
     index: {
       type: Number,
@@ -122,7 +122,8 @@ export default {
   data() {
     return {};
   },
-  mounted() {},
+  mounted() {
+  },
   methods: {},
 };
 </script>

+ 21 - 19
report-ui/src/views/bigscreenDesigner/designer/widget/widget.vue

@@ -1,10 +1,3 @@
-<!--
- * @Descripttion: 大屏报表设计器-动态组件
- * @Author: Devli
- * @Date: 2021-3-26 16:38:27
- * @LastEditors: qianlishi
- * @LastEditTime: 2023-3-9 17:38:44
--->
 <template>
   <avue-draggable
     :step="step"
@@ -19,7 +12,7 @@
     @blur="handleBlur"
   >
     <!-- :z-index="-1" -->
-    <component :is="type" :widget-index="index" :value="value" />
+    <component :is="type" :widget-index="index" :value="value"/>
   </avue-draggable>
 </template>
 
@@ -33,6 +26,7 @@ import widgetSlider from "./texts/widgetSlider.vue";
 import widgetVideo from "./texts/widgetVideo.vue";
 import WidgetIframe from "./texts/widgetIframe.vue";
 import widgetBarchart from "./bar/widgetBarchart.vue";
+import widgetScatter from "./scatter/widgetScatter.vue";
 import widgetGradientColorBarchart from "./bar/widgetGradientColorBarchart.vue";
 import widgetLinechart from "./line/widgetLinechart.vue";
 import widgetBarlinechart from "./barline/widgetBarlinechart";
@@ -64,6 +58,8 @@ import widgetBorder from "./styleWidget/widgetBorder.vue";
 import widgetDecorateFlowLine from "./styleWidget/widgetDecorateFlowLine.vue";
 import widgetDecoration from "./styleWidget/widgetDecoration.vue";
 import widgetBarMap from "./map/widgetBarMap.vue";
+import widgetChinaMap from "./map/widgetChinaMap.vue";
+import widgetGlobalMap from "./map/widgetGlobalMap.vue";
 import widgetBarStackMoreShowChart from "./bar/widgetBarStackMoreShowChart.vue";
 
 export default {
@@ -109,6 +105,9 @@ export default {
     widgetFormTime,
     widgetBarDoubleYaxisChart,
     widgetBarMap,
+    widgetChinaMap,
+    widgetGlobalMap,
+    widgetScatter,
     widgetBarStackMoreShowChart
   },
   model: {
@@ -125,7 +124,8 @@ export default {
     bigscreen: Object,
     value: {
       type: [Object],
-      default: () => {},
+      default: () => {
+      },
     },
     step: Number,
   },
@@ -160,25 +160,27 @@ export default {
       return this.value.position.disabled || false;
     },
   },
-  mounted() {},
+  mounted() {
+  },
   methods: {
-    handleFocus({ index, left, top, width, height }) {},
-    handleBlur({ index, left, top, width, height }) {
-      this.$emit("onActivated", { index, left, top, width, height });
+    handleFocus({index, left, top, width, height}) {
+    },
+    handleBlur({index, left, top, width, height}) {
+      this.$emit("onActivated", {index, left, top, width, height});
       this.$refs.draggable.setActive(true);
       // 处理widget超出workbench的问题
       //this.handleBoundary({ index, left, top, width, height })
     },
-    handleBoundary({ index, left, top, width, height }) {
+    handleBoundary({index, left, top, width, height}) {
       // 计算workbench的X轴边界值
       // 组件距离左侧宽度 + 组件宽度 > 大屏总宽度时,右侧边界值 = (大屏宽度 - 组件宽度);左侧边界值 = 0
-      const { bigscreenWidth, bigscreenHeight } = this.bigscreen;
+      const {bigscreenWidth, bigscreenHeight} = this.bigscreen;
       const xBoundaryValue =
         left + width > bigscreenWidth
           ? bigscreenWidth - width
           : left < 0
-          ? 0
-          : left;
+            ? 0
+            : left;
       // 初始化X轴边界值
       this.leftMargin = left;
       // 计算Y轴边界值
@@ -186,8 +188,8 @@ export default {
         top + height > bigscreenHeight
           ? bigscreenHeight - height
           : top < 0
-          ? 0
-          : top;
+            ? 0
+            : top;
       // 初始化Y轴边界值
       this.topMargin = top;
       // 若位置超出边界值则重新设置位置

+ 128 - 80
report-ui/src/views/excelreport/designer/index.vue

@@ -1,8 +1,8 @@
 <!--
- * @Author: yanzili
- * @Date: 2021-6-24 11:04:24
- * @Last Modified by:   qianlishi
- * @Last Modified time: 2021-12-13 11:04:24
+ * @Author: lide1202@hotmail.com
+ * @Date: 2021-3-13 11:04:24
+ * @Last Modified by:   lide1202@hotmail.com
+ * @Last Modified time: 2021-3-13 11:04:24
  !-->
 <template>
   <div class="layout">
@@ -59,30 +59,37 @@
     </div>
     <div class="layout-middle">
       <div class="push_btn">
-        <el-tooltip
-          class="item"
-          effect="dark"
-          content="预览"
-          placement="bottom-start"
-        >
+        <el-tooltip class="item" effect="dark" content="预览" placement="bottom-start">
           <el-button type="text" @click="preview()">
             <i class="iconfont iconfuzhi"></i>
           </el-button>
         </el-tooltip>
+        <el-tooltip class="item" effect="dark" content="保存" placement="bottom-start">
+          <el-button type="text" @click="save()">
+            <i class="iconfont iconsave"></i>
+          </el-button>
+        </el-tooltip>
         <el-tooltip
           class="item"
           effect="dark"
-          content="保存"
+          content="导入xlsx"
           placement="bottom-start"
         >
-          <el-button type="text" @click="save()">
-            <i class="iconfont iconsave"></i>
-          </el-button>
+          <input style="font-size: 16px" type="file" @change="uploadExcel" />
         </el-tooltip>
       </div>
       <div
         id="luckysheet"
-        style="margin:0px;padding:0px;position:absolute;width:100%;height:95vh;left: 0px;top: 30px;bottom:0px;"
+        style="
+          margin: 0px;
+          padding: 0px;
+          position: absolute;
+          width: 100%;
+          height: 95vh;
+          left: 0px;
+          top: 45px;
+          bottom: 0px;
+        "
       />
       <div id="qrCode" ref="qrCodeDiv" />
       <img id="barCode" />
@@ -100,13 +107,16 @@
             </el-form-item>
             <el-form-item label="自动扩展" v-if="rightForm.autoIsShow">
               <el-col :span="12">
-                <el-switch
-                v-model="rightForm.auto"
-                @change="autoChangeFunc($event)" />
+                <el-switch v-model="rightForm.auto" @change="autoChangeFunc($event)" />
               </el-col>
               <el-col :span="12">
-                <el-tooltip class="item" effect="dark" content="只针对静态数据的单元格,具体参考文档" placement="top">
-                <i class="el-icon-question"> </i>
+                <el-tooltip
+                  class="item"
+                  effect="dark"
+                  content="只针对静态数据的单元格,具体参考文档"
+                  placement="top"
+                >
+                  <i class="el-icon-question"> </i>
                 </el-tooltip>
               </el-col>
             </el-form-item>
@@ -120,17 +130,13 @@
         ref="multipleTable"
         :data="dataSetData"
         tooltip-effect="dark"
-        style="width: 100%;height: 60vh;overflow-y: scroll;"
+        style="width: 100%; height: 60vh; overflow-y: scroll"
         @selection-change="handleSelectionChange"
       >
         <el-table-column type="selection" width="55" />
         <el-table-column label="数据集名称" width="120" prop="setName" />
         <el-table-column prop="setDesc" label="数据集描述" width="180" />
-        <el-table-column
-          prop="setCode"
-          label="数据集编码"
-          show-overflow-tooltip
-        />
+        <el-table-column prop="setCode" label="数据集编码" show-overflow-tooltip />
       </el-table>
 
       <div slot="footer" class="dialog-footer">
@@ -152,10 +158,11 @@ export default {
   name: "Excels",
   components: {
     draggable,
-    ColorPicker
+    ColorPicker,
   },
   data() {
     return {
+      luckysheet,
       activeName: "first",
       activeNames: ["1"],
       reportId: null,
@@ -170,7 +177,7 @@ export default {
         jsonStr: "",
         setCodes: "",
         setParam: "",
-        reportCode: ""
+        reportCode: "",
       },
       multipleSelection: [],
       rightForm: {
@@ -179,7 +186,7 @@ export default {
         r: "",
         c: "",
         auto: false,
-        autoIsShow: false
+        autoIsShow: false,
       },
       qrCodeForm: {
         type: "QRCode",
@@ -191,7 +198,7 @@ export default {
         // correctLevel: QRCode.CorrectLevel.L, // 容错率,L/M/H
         ri: 0,
         ci: 0,
-        currentSrc: ""
+        currentSrc: "",
       },
       barCodeForm: {
         type: "BarCode",
@@ -204,19 +211,19 @@ export default {
         height: 40,
         ri: 0,
         ci: 0,
-        currentSrc: ""
+        currentSrc: "",
       },
       formPrintSetting: {
         size: "",
         pixel1: "",
-        pixel2: ""
+        pixel2: "",
       },
       pixelList: [
         { paper: "A4", width: 210, height: 297 },
         { paper: "A3", width: 297, height: 420 },
         { paper: "Letter", width: 216, height: 279 },
         { paper: "Legal", width: 216, height: 355 },
-        { paper: "Executive", width: 184, height: 266 }
+        { paper: "Executive", width: 184, height: 266 },
       ],
       dataSet: [],
       outerVisible: false,
@@ -245,8 +252,8 @@ export default {
       qrCodeList: [],
       moveDataelse: {
         x: null,
-        y: null
-      }
+        y: null,
+      },
     };
   },
   mounted() {},
@@ -257,6 +264,44 @@ export default {
     this.design();
   },
   methods: {
+    uploadExcel(evt) {
+      const files = evt.target.files;
+      if (files == null || files.length == 0) {
+        this.$message.error("没有文件被上传");
+        return;
+      }
+
+      let name = files[0].name;
+      let suffixArr = name.split("."),
+        suffix = suffixArr[suffixArr.length - 1];
+      if (suffix != "xlsx") {
+        this.$message.error("现在只支持上传xlsx文件");
+        return;
+      }
+      let that=this;
+      LuckyExcel.transformExcelToLucky(
+        files[0],
+        function (exportJson, luckysheetfile) {
+          if (exportJson.sheets == null || exportJson.sheets.length == 0) {
+            that.$message.error("Failed to read the content of the excel file, currently does not support xls files!");
+            return;
+          }
+          that.luckysheet.destroy();
+          // that.luckysheet.refresh({
+          //   container: "luckysheet", 
+          //   showinfobar: false,
+          //   data: exportJson.sheets,
+          //   title: exportJson.info.name,
+          //   userInfo: exportJson.info.name.creator,
+          // });
+          that.createSheet(exportJson)
+        },
+        function (error) {
+          // 如果抛出任何错误,则处理错误
+          that.$message.error(error);
+        }
+      );
+    },
     handleClose() {
       this.printVisible = false;
     },
@@ -275,8 +320,8 @@ export default {
       if (data != null) {
         if (data.setCodes != null && data.setCodes !== "") {
           let dataSetList = data.setCodes.split("|");
-          dataSetList.forEach(code => {
-            this.dataSetData.forEach(setData => {
+          dataSetList.forEach((code) => {
+            this.dataSetData.forEach((setData) => {
               if (code === setData.setCode) {
                 this.detail(setData.id);
               }
@@ -286,7 +331,7 @@ export default {
       }
     },
     //初始化表格
-    createSheet() {
+    createSheet(exportJson) {
       //将vue对象传入
       const that = this;
       const options = {
@@ -295,39 +340,34 @@ export default {
         lang: "zh", // 设定表格语言
         plugins: ["chart"],
         hook: {
-          cellDragStop: function(cell, postion, sheetFile, ctx, event) {
+          cellDragStop: function (cell, postion, sheetFile, ctx, event) {
             // console.info("cellDragStop-cell",cell);
             // console.info("cellDragStop-postion", postion);
             // console.info("cellDragStop-sheetFile", sheetFile);
             // console.info("cellDragStop-ctx",ctx);
             // console.info("cellDragStop-event", event);
             // console.log("cellDragStop-draggableFieldLabel", that);
-            luckysheet.setCellValue(
-              postion.r,
-              postion.c,
-              that.draggableFieldLabel
-            );
+            that.luckysheet.setCellValue(postion.r, postion.c, that.draggableFieldLabel);
           },
-          cellMousedown: function(cell, postion, sheetFile, ctx) {
-
+          cellMousedown: function (cell, postion, sheetFile, ctx) {
             //单元格点击事件
             that.rightForm.coordinate = postion.r + "," + postion.c;
             that.rightForm.r = postion.r;
             that.rightForm.c = postion.c;
             that.rightForm.value = cell == null ? "" : cell.v;
-            that.rightForm.autoIsShow = true
+            that.rightForm.autoIsShow = true;
             //判断单元格是否是静态数据并且是合并单元格
-            if(cell != null && ( cell.v == undefined || cell.v.indexOf('#{') === -1)){
-                that.rightForm.autoIsShow = true
-                if(cell.auto != null && cell.auto == '1'){
-                  that.rightForm.auto = true
-                }else{
-                  that.rightForm.auto = false
-                }
-            }else{
-              that.rightForm.auto = false
+            if (cell != null && (cell.v == undefined || cell.v.indexOf("#{") === -1)) {
+              that.rightForm.autoIsShow = true;
+              if (cell.auto != null && cell.auto == "1") {
+                that.rightForm.auto = true;
+              } else {
+                that.rightForm.auto = false;
+              }
+            } else {
+              that.rightForm.auto = false;
             }
-          }
+          },
         },
         data: [
           {
@@ -349,7 +389,7 @@ export default {
               rowhidden: {}, //隐藏行
               colhidden: {}, //隐藏列
               borderInfo: {}, //边框
-              authority: {} //工作表保护
+              authority: {}, //工作表保护
             },
             scrollLeft: 0, //左右滚动条位置
             scrollTop: 315, //上下滚动条位置
@@ -367,14 +407,25 @@ export default {
             zoomRatio: 1, // 缩放比例
             image: [], //图片
             showGridLines: 1, //是否显示网格线
-            dataVerification: {} //数据验证配置
-          }
-        ]
+            dataVerification: {}, //数据验证配置
+          },
+        ],
       };
+      this.sheetData = this.sheetData.map((val) => {
+        if (!val.name) {
+          val.name = "Sheet1";
+        }
+        return val;
+      });
       options.data = this.sheetData;
-
-      $(function() {
-        luckysheet.create(options);
+      $(function () {
+        if(exportJson){
+          options.data= exportJson.sheets;
+          options.title= exportJson.info.name;
+          options.userInfo= exportJson.info.name.creator;
+        }
+        console.log(options);
+        that.luckysheet.create(options);
       });
     },
     onStart(setCode, evt) {
@@ -405,14 +456,11 @@ export default {
       this.reportExcelDto.jsonStr = JSON.stringify(luckysheet.getAllSheets());
       let setCodeList = [];
       let setParams = {};
-      this.dataSet.forEach(code => {
+      this.dataSet.forEach((code) => {
         setCodeList.push(code.setCode);
-        if (
-          code.dataSetParamDtoList != null &&
-          code.dataSetParamDtoList.length > 0
-        ) {
+        if (code.dataSetParamDtoList != null && code.dataSetParamDtoList.length > 0) {
           let dataSetParam = {};
-          code.dataSetParamDtoList.forEach(value => {
+          code.dataSetParamDtoList.forEach((value) => {
             dataSetParam[value.paramName] = value.sampleItem;
           });
           setParams[code.setCode] = dataSetParam;
@@ -443,7 +491,7 @@ export default {
     async preview() {
       let routeUrl = this.$router.resolve({
         path: "/excelreport/viewer",
-        query: { reportCode: this.reportCode }
+        query: { reportCode: this.reportCode },
       });
       window.open(routeUrl.href, "_blank");
     },
@@ -458,7 +506,7 @@ export default {
       if (this.multipleSelection.length > 1) {
         this.$message({
           message: "一次最多勾选一个数据集",
-          type: "warning"
+          type: "warning",
         });
         this.outerVisible = true;
       } else {
@@ -469,7 +517,7 @@ export default {
       const { code, data } = await detail(id);
       if (code != 200) return;
       let flag = true;
-      this.dataSet.forEach(value => {
+      this.dataSet.forEach((value) => {
         if (value.setCode === data.setCode) {
           flag = false;
         }
@@ -485,14 +533,14 @@ export default {
         }
       }
     },
-    autoChangeFunc(auto){
-      if(auto){
-        luckysheet.setCellValue(this.rightForm.r, this.rightForm.c, { auto: "1"})
-      }else{
-        luckysheet.setCellValue(this.rightForm.r, this.rightForm.c, { auto: "0"})
+    autoChangeFunc(auto) {
+      if (auto) {
+        luckysheet.setCellValue(this.rightForm.r, this.rightForm.c, { auto: "1" });
+      } else {
+        luckysheet.setCellValue(this.rightForm.r, this.rightForm.c, { auto: "0" });
       }
-    }
-  }
+    },
+  },
 };
 </script>
 

+ 1 - 1
report-ui/src/views/layout/components/Sidebar/index.vue

@@ -3,7 +3,7 @@
     <div class="admin-title" @click="goBigScreen">
       <div class="con">
         <img src="../../../../../static/logo-dp.png" width="50" />
-        <span class="version">V1.3.0</span>
+        <span class="version">V1.4.0</span>
       </div>
     </div>
     <el-menu

文件差異過大導致無法顯示
+ 0 - 5
report-ui/static/luckysheet/assets/iconfont/iconfont.css


文件差異過大導致無法顯示
+ 0 - 0
report-ui/static/luckysheet/css/luckysheet.css


文件差異過大導致無法顯示
+ 21 - 0
report-ui/static/luckysheet/echarts.min.js


文件差異過大導致無法顯示
+ 0 - 0
report-ui/static/luckysheet/expendPlugins/chart/chartmix.umd.min.js


文件差異過大導致無法顯示
+ 22212 - 0
report-ui/static/luckysheet/luckyexcel.umd.js


文件差異過大導致無法顯示
+ 0 - 0
report-ui/static/luckysheet/luckysheet.umd.js


文件差異過大導致無法顯示
+ 0 - 0
report-ui/static/luckysheet/plugins/js/plugin.js


文件差異過大導致無法顯示
+ 5 - 0
report-ui/static/luckysheet/vue@2.6.11.js


文件差異過大導致無法顯示
+ 5 - 0
report-ui/static/luckysheet/vuex@3.4.0.js


部分文件因文件數量過多而無法顯示