Forráskód Böngészése

Merge branch 'master' of github.com:gcpaas/DataRoom

zhu.yawen 1 éve
szülő
commit
1383ca45be
29 módosított fájl, 295 hozzáadás és 186 törlés
  1. 0 28
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/components/CustomComponentChart.java
  2. 15 7
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/map/controller/DataRoomMapController.java
  3. 2 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/map/dto/DataRoomMapRepeatDTO.java
  4. 11 2
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/map/service/IDataRoomMapService.java
  5. 32 8
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/map/service/impl/DataRoomMapServiceImpl.java
  6. 3 0
      DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/map/vo/MapChildVO.java
  7. 36 13
      data-room-ui/packages/BasicComponents/DateTimePicker/index.vue
  8. 2 12
      data-room-ui/packages/BasicComponents/DateTimePicker/setting.vue
  9. 2 3
      data-room-ui/packages/BasicComponents/DateTimePicker/settingConfig.js
  10. 27 2
      data-room-ui/packages/BasicComponents/Input/index.vue
  11. 6 5
      data-room-ui/packages/BasicComponents/Input/settingConfig.js
  12. 18 18
      data-room-ui/packages/BasicComponents/TimePicker/index.vue
  13. 1 12
      data-room-ui/packages/BasicComponents/TimePicker/setting.vue
  14. 7 6
      data-room-ui/packages/BigScreenDesign/DataViewDialog/index.vue
  15. 2 15
      data-room-ui/packages/BigScreenDesign/RightSetting/ComponentRelation/RelationSetting.vue
  16. 1 1
      data-room-ui/packages/BigScreenDesign/RightSetting/DataSetting.vue
  17. 18 18
      data-room-ui/packages/BigScreenDesign/index.vue
  18. 1 1
      data-room-ui/packages/BizComponent/index.vue
  19. 23 2
      data-room-ui/packages/MapDataManagement/src/AddForm.vue
  20. 30 3
      data-room-ui/packages/MapDataManagement/src/EditForm.vue
  21. 22 10
      data-room-ui/packages/MapDataManagement/src/index.vue
  22. 2 2
      data-room-ui/packages/PlotRender/index.vue
  23. 1 0
      data-room-ui/packages/assets/images/bigScreenIcon/svg/24horizontal.svg
  24. 1 0
      data-room-ui/packages/assets/images/bigScreenIcon/svg/25vertical.svg
  25. 1 1
      data-room-ui/packages/js/config/basicComponentsConfig.js
  26. 3 1
      data-room-ui/packages/js/mixins/commonMixins.js
  27. 4 0
      data-room-ui/packages/js/mixins/multipleSelectMixin.js
  28. 14 14
      data-room-ui/packages/js/utils/getComponentConfig.js
  29. 10 2
      data-room-ui/packages/js/utils/mapDataService.js

+ 0 - 28
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/chart/components/CustomComponentChart.java

@@ -44,42 +44,14 @@ public class CustomComponentChart extends Chart {
     @ApiModelProperty(notes = "组件的唯一名称")
     private String name;
 
-
     @Data
     public static class Setting {
 
-        @ApiModelProperty(notes = "配置项名称")
-        private String label;
-
-        @ApiModelProperty(notes = "配置项组件类型")
-        private String type;
-
         @ApiModelProperty(notes = "配置项字段")
         private String field;
 
-        @ApiModelProperty(notes = "配置项对应options中的字段")
-        private String optionField;
-
-        @ApiModelProperty(notes = "是否多选")
-        private Boolean multiple;
-
         @ApiModelProperty(notes = "值")
         private Object value;
-
-        @ApiModelProperty(notes = "所属tab页")
-        private String tabName;
-
-        @ApiModelProperty(notes = "多选时选项")
-        private Object options;
-
-        @ApiModelProperty(notes = "步长")
-        private Integer step;
-
-        @ApiModelProperty(notes = "所属样式分组")
-        private String groupName;
-
     }
 
-
-
 }

+ 15 - 7
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/map/controller/DataRoomMapController.java

@@ -66,9 +66,9 @@ public class DataRoomMapController {
     @ApiPermission(permissions = {Permission.Map.DELETE})
     @PostMapping("/delete/{id}")
     @ApiOperation(value = "删除", position = 40, notes = "删除地图数据", produces = MediaType.APPLICATION_JSON_VALUE)
-    public R<Void> delete(@PathVariable String id) {
-        dataRoomMapService.delete(id);
-        return R.success();
+    public R<Boolean> delete(@PathVariable String id) {
+        boolean delete = dataRoomMapService.delete(id);
+        return R.success(delete);
     }
 
     @ApiPermission(permissions = {Permission.Map.DELETE})
@@ -126,16 +126,24 @@ public class DataRoomMapController {
 
 
     @ApiPermission(permissions = {Permission.Map.VIEW})
-    @PostMapping("/repeat")
-    @ApiOperation(value = "重复", position = 100, notes = "地图数据重复校验", produces = MediaType.APPLICATION_JSON_VALUE)
+    @PostMapping("/repeat/code")
+    @ApiOperation(value = "编码重复校验", position = 100, notes = "地图数据重复校验", produces = MediaType.APPLICATION_JSON_VALUE)
     public R<Boolean> repeat(@RequestBody DataRoomMapRepeatDTO mapDTO) {
-        Boolean repeat = dataRoomMapService.repeatCheck(mapDTO);
+        Boolean repeat = dataRoomMapService.codeRepeatCheck(mapDTO);
+        return R.success(repeat);
+    }
+
+    @ApiPermission(permissions = {Permission.Map.VIEW})
+    @PostMapping("/repeat/name")
+    @ApiOperation(value = "名称重复校验", position = 110, notes = "地图数据重复校验", produces = MediaType.APPLICATION_JSON_VALUE)
+    public R<Boolean> repeatName(@RequestBody DataRoomMapRepeatDTO mapDTO) {
+        Boolean repeat = dataRoomMapService.nameRepeatCheck(mapDTO);
         return R.success(repeat);
     }
 
     @ApiPermission(permissions = {Permission.Map.VIEW})
     @GetMapping("/tree/{level}")
-    @ApiOperation(value = "树", position = 110, notes = "地图数据树", produces = MediaType.APPLICATION_JSON_VALUE)
+    @ApiOperation(value = "树", position = 120, notes = "地图数据树", produces = MediaType.APPLICATION_JSON_VALUE)
     public R<List<DataRoomMapVO>> tree(@PathVariable String level) {
         int levelInt = 0;
         try {

+ 2 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/map/dto/DataRoomMapRepeatDTO.java

@@ -20,4 +20,6 @@ public class DataRoomMapRepeatDTO {
     @ApiModelProperty(notes = "地图编码")
     private String mapCode;
 
+    @ApiModelProperty(notes = "地图名称")
+    private String mapName;
 }

+ 11 - 2
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/map/service/IDataRoomMapService.java

@@ -56,8 +56,9 @@ public interface IDataRoomMapService extends ISuperService<DataRoomMapEntity> {
     /**
      * 删除地图
      * @param id
+     * @return
      */
-    void delete(String id);
+    boolean delete(String id);
 
     /**
      * 级联删除地图,删除地图及其子地图...
@@ -110,6 +111,14 @@ public interface IDataRoomMapService extends ISuperService<DataRoomMapEntity> {
      * @param mapDTO
      * @return
      */
-    boolean repeatCheck(DataRoomMapRepeatDTO mapDTO);
+    boolean codeRepeatCheck(DataRoomMapRepeatDTO mapDTO);
+
 
+    /**
+     * 名称重复校验
+     * 只在相同的父级下校验
+     * @param mapDTO
+     * @return
+     */
+    boolean nameRepeatCheck(DataRoomMapRepeatDTO mapDTO);
 }

+ 32 - 8
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/map/service/impl/DataRoomMapServiceImpl.java

@@ -251,21 +251,22 @@ public class DataRoomMapServiceImpl extends ServiceImpl<DataRoomMapDao, DataRoom
 
 
     @Override
-    public void delete(String id) {
+    public boolean delete(String id) {
         if (StringUtils.isBlank(id)) {
-            return;
+            return true;
         }
         DataRoomMapEntity mapEntity = this.getById(id);
         if (mapEntity == null) {
-            return;
+            return true;
         }
         LambdaQueryWrapper<DataRoomMapEntity> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.eq(DataRoomMapEntity::getParentId, mapEntity.getId());
         List<DataRoomMapEntity> list = this.list(queryWrapper);
         if (list != null && list.size() > 0) {
-            throw new GlobalException("该地图下存在子地图,不能删除");
+            return false;
         }
         this.removeById(id);
+        return true;
     }
 
 
@@ -360,10 +361,10 @@ public class DataRoomMapServiceImpl extends ServiceImpl<DataRoomMapDao, DataRoom
         }
         // 查询当前地图下的所有子地图
         LambdaQueryWrapper<DataRoomMapEntity> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.select(DataRoomMapEntity::getMapCode);
+        queryWrapper.select(DataRoomMapEntity::getMapCode, DataRoomMapEntity::getId);
         queryWrapper.eq(DataRoomMapEntity::getParentId, id);
         List<DataRoomMapEntity> list = this.list(queryWrapper);
-        List<String> mapCodeList = list.stream().map(DataRoomMapEntity::getMapCode).collect(Collectors.toList());
+        Map<String, String> codeIdMap = list.stream().collect(Collectors.toMap(DataRoomMapEntity::getMapCode, DataRoomMapEntity::getId));
         // 解析geoJson,获取下一级的基础数据
         List<MapChildVO> childList = Lists.newArrayList();
         for (int i = 0; i < features.length(); i++) {
@@ -375,7 +376,10 @@ public class DataRoomMapServiceImpl extends ServiceImpl<DataRoomMapDao, DataRoom
             String name = properties.getString("name");
             MapChildVO childVO = new MapChildVO();
             childVO.setName(name);
-            childVO.setExist(mapCodeList.contains(name));
+            childVO.setExist(codeIdMap.containsKey(name));
+            if (childVO.getExist()) {
+                childVO.setExistId(codeIdMap.get(name));
+            }
             childList.add(childVO);
         }
         return childList;
@@ -403,7 +407,7 @@ public class DataRoomMapServiceImpl extends ServiceImpl<DataRoomMapDao, DataRoom
     }
 
     @Override
-    public boolean repeatCheck(DataRoomMapRepeatDTO mapDTO) {
+    public boolean codeRepeatCheck(DataRoomMapRepeatDTO mapDTO) {
         if (StringUtils.isBlank(mapDTO.getMapCode())) {
             throw new GlobalException("地图编码不能为空");
         }
@@ -419,4 +423,24 @@ public class DataRoomMapServiceImpl extends ServiceImpl<DataRoomMapDao, DataRoom
         List<DataRoomMapEntity> list = this.list(queryWrapper);
         return list != null && list.size() > 0;
     }
+
+
+    @Override
+    public boolean nameRepeatCheck(DataRoomMapRepeatDTO mapDTO) {
+        if (StringUtils.isBlank(mapDTO.getMapName())) {
+            throw new GlobalException("地图名称不能为空");
+        }
+        if (StringUtils.isBlank(mapDTO.getParentId())) {
+            throw new GlobalException("上级地图编码不能为空");
+        }
+        LambdaQueryWrapper<DataRoomMapEntity> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(DataRoomMapEntity::getName, mapDTO.getMapName());
+        queryWrapper.eq(DataRoomMapEntity::getParentId, mapDTO.getParentId());
+        if (StringUtils.isNotBlank(mapDTO.getId())) {
+            queryWrapper.ne(DataRoomMapEntity::getId, mapDTO.getId());
+        }
+        List<DataRoomMapEntity> list = this.list(queryWrapper);
+        return list != null && list.size() > 0;
+
+    }
 }

+ 3 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/map/vo/MapChildVO.java

@@ -17,4 +17,7 @@ public class MapChildVO {
     @ApiModelProperty(notes = "是否已存在")
     private Boolean exist;
 
+    @ApiModelProperty(notes = "已存在的地图id")
+    private String existId;
+
 }

+ 36 - 13
data-room-ui/packages/BasicComponents/DateTimePicker/index.vue

@@ -1,13 +1,14 @@
 <template>
   <el-date-picker
     :key="config.customize.type"
-    v-model="config.customize.value"
+    v-model="value"
     :picker-options="config.customize.pickerOptions"
     :type="config.customize.type"
     clearable
     :class="['basic-component-date-picker', `date-picker-${config.code}`]"
     :popper-class="'basic-component-date-picker date-picker-popper-' + config.code"
     :value-format="config.customize.valueFormat"
+    :default-value="value"
     size="large"
     @focus="focusEvent"
     @change="changeValue"
@@ -16,6 +17,7 @@
 </template>
 
 <script>
+import moment from 'moment'
 import cloneDeep from 'lodash/cloneDeep'
 import commonMixins from 'data-room-ui/js/mixins/commonMixins'
 import linkageMixins from 'data-room-ui/js/mixins/linkageMixins'
@@ -35,6 +37,7 @@ export default {
   },
   data () {
     return {
+      value: '',
       innerConfig: {}
     }
   },
@@ -47,16 +50,30 @@ export default {
     }
   },
   watch: {
-    config: {
-      handler: function (val) {
-        if (val && val.customize && val.customize.formatType === 'custom') {
-          // 解决时间格式化类型为自定义时,时间格式化类型和时间格式化值数据类型不匹配的问题
-          this.$nextTick(() => {
-            this.config.customize.value = toString(this.config.customize.value)
-          })
+    'config.customize.formatType': {
+      handler (val) {
+        if (val === 'timestamp') {
+          this.value = 0
+          this.valueFormat = 'timestamp'
+        } else if (val === 'custom') {
+          this.value = ''
+          this.valueFormat = 'YYYY-MM-DD HH:mm:ss'
+        }
+      },
+      immediate: true
+    },
+    'config.customize.type': {
+      handler (val) {
+        if (['year', 'month', 'date', 'week', 'datetime'].includes(val)) {
+          this.value = moment(new Date()).format('YYYY-MM-DD HH:mm:ss')
+        } else {
+          this.value = [
+            moment(new Date()).subtract(7, 'days').format('YYYY-MM-DD HH:mm:ss'),
+            moment(new Date()).format('YYYY-MM-DD HH:mm:ss')
+          ]
         }
       },
-      deep: true
+      immediate: true
     }
   },
   created () { },
@@ -65,9 +82,11 @@ export default {
       document.querySelector(`.date-picker-${this.config.code}`).style.pointerEvents = 'none'
     }
     this.changeStyle(this.config)
-    // 将config.customize.value设置值为当前时间 :
-    if (this.config.customize.value === '') {
-      this.config.customize.value = new Date()
+    if (this.value === '') {
+      this.value = [
+        moment(new Date()).subtract(7, 'days').format('YYYY-MM-DD HH:mm:ss'),
+        moment(new Date()).format('YYYY-MM-DD HH:mm:ss')
+      ]
     }
   },
   beforeDestroy () {
@@ -128,6 +147,10 @@ export default {
     },
     // 组件联动
     changeValue (val) {
+      // 判断如果val是数组,需要将它转成字符串
+      if (Array.isArray(val)) {
+        val = val.join(',')
+      }
       this.linkage({ [this.config.code]: val })
     },
     focusEvent () {
@@ -171,7 +194,7 @@ export default {
       })
     },
     mouseenter () {
-      if (this.config.customize.value) {
+      if (this.value) {
         setTimeout(() => {
           // 清空图标
           const timePickerCloseIcon = document.querySelector(`.date-picker-${this.innerConfig.code} .el-icon-circle-close`)

+ 2 - 12
data-room-ui/packages/BasicComponents/DateTimePicker/setting.vue

@@ -114,7 +114,6 @@
                 class="bs-el-select"
                 popper-class="bs-el-select"
                 clearable
-                @change="selectFormatType"
               >
                 <el-option
                   v-for="(type) in formatTypeOptions"
@@ -163,6 +162,7 @@
   </div>
 </template>
 <script>
+import moment from 'moment'
 import SettingTitle from 'data-room-ui/SettingTitle/index.vue'
 import ColorPicker from 'data-room-ui/ColorPicker/index.vue'
 import PosWhSetting from 'data-room-ui/BigScreenDesign/RightSetting/PosWhSetting.vue'
@@ -210,7 +210,6 @@ export default {
         { label: '年', value: 'year' },
         { label: '月', value: 'month' },
         { label: '日', value: 'date' },
-        { label: '周', value: 'week' },
         { label: '日期时间', value: 'datetime' },
         { label: '日期时间范围', value: 'datetimerange' },
         { label: '日期范围', value: 'daterange' }
@@ -219,16 +218,7 @@ export default {
   },
   watch: {},
   mounted () {},
-  methods: {
-    selectFormatType (type) {
-      if (type === 'timestamp') {
-        this.config.customize.value = 0
-        this.config.customize.valueFormat = 'timestamp'
-      } else if (type === 'custom') {
-        this.config.customize.valueFormat = 'yyyy-MM-dd HH:mm:ss'
-      }
-    }
-  }
+  methods: { }
 }
 </script>
 

+ 2 - 3
data-room-ui/packages/BasicComponents/DateTimePicker/settingConfig.js

@@ -22,15 +22,14 @@ const customConfig = {
   },
   // 自定义属性
   customize: {
-    value: '',
     // 选择框背景颜色
     bgColor: '#35393F',
     // 选择框文字颜色
     fontColor: '#FFFFFF',
     // 选择框文字大小
     fontSize: 20,
-    // 显示类型 year/month/date/week/ datetime/datetimerange/daterange
-    type: 'datetime',
+    // 显示类型 year/month/date/ datetime/datetimerange/daterange
+    type: 'datetimerange',
     // 时间格式化类型:时间戳(timestamp),自定义(custom)
     formatType: 'custom',
     // 绑定值的格式

+ 27 - 2
data-room-ui/packages/BasicComponents/Input/index.vue

@@ -9,12 +9,14 @@
     </span>
     <el-input
       :id="`el-input-${config.code}`"
-      v-model="config.customize.value"
+      v-model="value"
       type="text"
       resize="both"
       class="input"
       :placeholder="config.customize.placeholderStyle.placeholder"
       :style="{ backgroundColor: config.customize.backgroundStyle.backgroundColor }"
+      @input="handleInput"
+      @keyup.enter.native="keyupEnter"
     >
       <i
         v-if="config.customize.icon.position === 'left' && config.customize.icon.name"
@@ -48,7 +50,10 @@ export default {
     }
   },
   data () {
-    return { }
+    return {
+      value: '',
+      timer: null
+    }
   },
   watch: {
     'config.customize': {
@@ -60,6 +65,11 @@ export default {
   },
   mounted () {
     this.chartInit()
+    this.changeStyle(this.config)
+  },
+  beforeDestroy () {
+    // 销毁时清除定时器
+    clearTimeout(this.timer)
   },
   methods: {
     changeStyle (config, isUpdateTheme) {
@@ -86,6 +96,21 @@ export default {
           this.changeActiveItemConfig(config)
         }
       }
+    },
+    handleInput (val) {
+      // 提供一个防抖的方法
+      this.debounce(() => {
+        this.linkage({ [this.config.code]: val })
+      })
+    },
+    keyupEnter () {
+      this.linkage({ [this.config.code]: this.value })
+    },
+    debounce (fn, delay = 500) {
+      clearTimeout(this.timer)
+      this.timer = setTimeout(() => {
+        fn()
+      }, delay)
     }
   }
 }

+ 6 - 5
data-room-ui/packages/BasicComponents/Input/settingConfig.js

@@ -1,12 +1,13 @@
 
-import { commonConfig } from 'data-room-ui/js/config'
+import { commonConfig, displayOption } from 'data-room-ui/js/config'
 
 export const settingConfig = {
+  title: '输入框',
   displayOption: {
-    dataAllocation: {
-      // 是否存在数据配置
-      enable: false
-    }
+    ...displayOption,
+    dataAllocation: { enable: true },
+    dataSourceType: { enable: false },
+    params: { enable: false }
   }
 }
 const customConfig = {

+ 18 - 18
data-room-ui/packages/BasicComponents/TimePicker/index.vue

@@ -1,12 +1,13 @@
 <template>
   <el-time-picker
-    v-model="config.customize.value"
+    v-model="value"
     :picker-options="config.customize.pickerOptions"
     placeholder="选择时间"
     clearable
     :class="['basic-component-time-picker', `time-picker-${config.code}`]"
     :popper-class="'basic-component-time-picker time-picker-popper-' + config.code"
     :value-format="config.customize.valueFormat"
+    :default-value="value"
     @focus="focusEvent"
     @change="changeValue"
     @mouseenter.native="mouseenter"
@@ -48,31 +49,30 @@ export default {
     }
   },
   watch: {
-    config: {
-      handler: function (val) {
-        if (val && val.customize && val.customize.formatType === 'custom') {
-          this.$nextTick(() => {
-            this.config.customize.value = toString(this.config.customize.value)
-          })
+
+    'config.customize.formatType': {
+      handler (val) {
+        if (val === 'timestamp') {
+          this.value = 0
+          this.config.customize.valueFormat = 'timestamp'
+        } else if (val === 'custom') {
+          this.config.customize.valueFormat = 'HH:mm:ss'
+          this.value = ''
         }
       },
-      deep: true
+      immediate: true
     }
+
   },
   created () { },
   mounted () {
     if (!this.isPreview) {
-      // document.querySelector(`.time-picker-${this.config.code}`).style.pointerEvents = 'none'
+      document.querySelector(`.time-picker-${this.config.code}`).style.pointerEvents = 'none'
+    }
+    if (this.value === '') {
+      this.value = moment(new Date()).format(this.config.customize.valueFormat)
     }
     this.changeStyle(this.config)
-    // 将config.customize.value设置值为当前时间 :HH:mm:ss
-    // if (this.config.customize.value === '') {
-    //   this.config.customize.valueFormat = 'HH:mm:ss'
-    //   this.$nextTick(() => {
-    //     this.config.customize.value = moment(new Date()).format('HH:mm:ss')
-    //     console.log(this.config.customize.value)
-    //   })
-    // }
   },
   beforeDestroy () { },
   methods: {
@@ -170,7 +170,7 @@ export default {
       })
     },
     mouseenter () {
-      if (this.config.customize.value) {
+      if (this.value) {
         setTimeout(() => {
           // 清空图标
           const timePickerCloseIcon = document.querySelector(`.time-picker-${this.innerConfig.code} .el-icon-circle-close`)

+ 1 - 12
data-room-ui/packages/BasicComponents/TimePicker/setting.vue

@@ -89,8 +89,6 @@
                 v-model="config.customize.formatType"
                 class="bs-el-select"
                 popper-class="bs-el-select"
-                clearable
-                @change="selectFormatType"
               >
                 <el-option
                   v-for="(type) in formatTypeOptions"
@@ -177,16 +175,7 @@ export default {
   },
   watch: {},
   mounted () {},
-  methods: {
-    selectFormatType (type) {
-      if (type === 'timestamp') {
-        this.config.customize.value = 0
-        this.config.customize.valueFormat = 'timestamp'
-      } else if (type === 'custom') {
-        this.config.customize.valueFormat = 'HH:mm:ss'
-      }
-    }
-  }
+  methods: { }
 }
 </script>
 

+ 7 - 6
data-room-ui/packages/BigScreenDesign/DataViewDialog/index.vue

@@ -17,8 +17,9 @@
       <div class="table-box">
         <el-table
           ref="table"
+          max-height="500"
           v-loading="loading"
-          class="bs-table bs-el-table"
+          class="bs-table bs-el-table fixed-header-table"
           :data="dataList"
         >
           <el-table-column
@@ -220,8 +221,8 @@ export default {
 .bs-data-view-dialog{
   /deep/.el-dialog__body{
     background-color: var(--bs-background-2) !important;
-    overflow: auto!important;
-    max-height: calc(90vh - 500px) !important;
+    overflow: hidden;
+    max-height: 540px!important;
   }
   .table-box{
     height: 100%;
@@ -275,13 +276,13 @@ export default {
 }
 /* 自定义滚动条样式 */
 /deep/.el-table__body-wrapper::-webkit-scrollbar {
-  width: 3px; /* 滚动条宽度 */
-  height: 8px;
+  width: 6px; /* 滚动条宽度 */
+  height: 6px;
 }
 
 /deep/.el-table__body-wrapper::-webkit-scrollbar-thumb {
   background-color: #888; /* 滚动条拖动块颜色 */
-  height: 3px;
+  height: 100px;
   border-radius: 5px;
 }
 

+ 2 - 15
data-room-ui/packages/BigScreenDesign/RightSetting/ComponentRelation/RelationSetting.vue

@@ -45,23 +45,10 @@
           </template>
         </el-table-column>
         <el-table-column
-          label="操作符"
+          label="映射规则"
           align="center"
         >
-          <template #default="scope">
-            <el-select
-              v-model="configMapConfig.maps[scope.$index].queryRule"
-              popper-class="bs-el-select"
-              class="bs-el-select"
-            >
-              <el-option
-                v-for="operator in operatorList"
-                :key="operator.value"
-                :label="operator.label"
-                :value="operator.value"
-              />
-            </el-select>
-          </template>
+          <span>赋值给</span>
         </el-table-column>
         <el-table-column
           label="目标组件接收参数"

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

@@ -674,7 +674,7 @@ export default {
         value: field.name || field.fieldName
       })) || []
 
-      if (this.config.type === 'timePicker') {
+      if (['input', 'timePicker', 'dateTimePicker'].includes(this.config.type)) {
         modifiedList.push({ label: '当前组件值', value: this.config.code })
       }
       return modifiedList

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

@@ -205,7 +205,7 @@ export default {
     }
   },
   watch: {
-    chartList(val){
+    chartList (val) {
       // console.log(val,this.activeCode)
       // if(val.findIndex(item=>item.code==this.activeCode)==-1){
       //   this.updateRightVisiable(false)
@@ -263,7 +263,7 @@ export default {
   mounted () {
     EventBus.$on('closeRightPanel', () => {
       this.updateRightVisiable(false)
-      })
+    })
   },
   beforeDestroy () {
     this.clearTimeline()
@@ -309,27 +309,27 @@ export default {
       getScreenInfo(component.code).then(res => {
         res.chartList.forEach((item) => {
           if (!item.border) {
-            item.border={type:'',titleHeight:60,fontSize:16,isTitle:true,padding:[0,0,0,0]}
+            item.border = { type: '', titleHeight: 60, fontSize: 16, isTitle: true, padding: [0, 0, 0, 0] }
           }
-          if(!item.border.padding){
-            item.border.padding=[0,0,0,0]
+          if (!item.border.padding) {
+            item.border.padding = [0, 0, 0, 0]
           }
-          if (item.type == 'customComponent'){
-            plotSettings[Symbol.iterator]=function*(){
-              let keys=Object.keys(plotSettings)
-              for(let k of keys){
-                yield [k,plotSettings[k]]
+          if (item.type == 'customComponent') {
+            plotSettings[Symbol.iterator] = function * () {
+              const keys = Object.keys(plotSettings)
+              for (const k of keys) {
+                yield [k, plotSettings[k]]
               }
             }
-            for(let [key,value] of plotSettings){
-             if (item.name == value.name) {
-                const settings=JSON.parse(JSON.stringify(value.setting))
-                item.setting=settings.map((x)=>{
-                  const index=item.setting.findIndex(y=>y.field==x.field)
+            for (const [key, value] of plotSettings) {
+              if (item.name == value.name) {
+                const settings = JSON.parse(JSON.stringify(value.setting))
+                item.setting = settings.map((x) => {
+                  const index = item.setting.findIndex(y => y.field == x.field)
                   x.field = item.setting[index].field
-                  x.value=item.setting[index].value
+                  x.value = item.setting[index].value
                   return x
-               })
+                })
               }
             }
           }
@@ -441,7 +441,7 @@ export default {
     },
     // 自定义属性更新
     updateSetting (config) {
-      if (config.type === 'map' || config.type==='screenScrollBoard'|| config.type === 'remoteComponent' || config.type === 'video' || config.type === 'flyMap') {
+      if (config.type === 'map' || config.type === 'screenScrollBoard' || config.type === 'remoteComponent' || config.type === 'video' || config.type === 'flyMap') {
         config.key = new Date().getTime()
       }
       this.changeChartConfig(cloneDeep(config))

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

@@ -140,7 +140,7 @@
   </div>
 </template>
 <script>
-import { toJpeg, toPng } from 'html-to-image'
+import { toJpeg } from 'html-to-image'
 import CusBtn from 'data-room-ui/BigScreenDesign/BtnLoading'
 // import MonacoEditor from 'data-room-ui/MonacoEditor'
 import BizComponentPreview from './Preview'

+ 23 - 2
data-room-ui/packages/MapDataManagement/src/AddForm.vue

@@ -97,6 +97,11 @@
               :label="level.label"
               :value="level.value"
             />
+            <el-option
+              v-if="![0,1,2,3,4].includes(mapForm.level)"
+              :value="mapForm.level"
+              :label="outRangeLabel"
+            />
           </el-select>
         </el-form-item>
         <el-form-item
@@ -160,7 +165,7 @@
 
 <script>
 import vueJsonViewer from 'vue-json-viewer'
-import { getMapChildFromGeoJson, mapAdd, repeatCheck } from 'data-room-ui/js/utils/mapDataService'
+import { getMapChildFromGeoJson, mapAdd, repeatCheck, nameRepeatCheck } from 'data-room-ui/js/utils/mapDataService'
 
 export default {
   name: 'AddForm',
@@ -171,6 +176,9 @@ export default {
     autoParseNextLevelShow () {
       // geoJson 不为空
       return !this.isEmpty(this.mapForm.geoJson)
+    },
+    outRangeLabel() {
+      return `级别${this.mapForm.level}`;
     }
   },
   data () {
@@ -191,6 +199,18 @@ export default {
         }
       })
     }
+    const validateName = (rule, value, callback) => {
+      nameRepeatCheck({
+        parentId: this.mapForm.parentId,
+        mapName: value
+      }).then(res => {
+        if (res) {
+          callback(new Error('地图名称已存在'))
+        } else {
+          callback()
+        }
+      })
+    }
     return {
       mapFormVisible: false,
       geoJsonVisible: false,
@@ -212,7 +232,8 @@ export default {
           { validator: validateCode, trigger: 'blur' }
         ],
         name: [
-          { required: true, message: '请输入地图名称', trigger: 'blur' }
+          { required: true, message: '请输入地图名称', trigger: 'blur' },
+          { validator: validateName, trigger: 'blur' }
         ],
         level: [
           { required: true, message: '请选择地图级别', trigger: 'change' }

+ 30 - 3
data-room-ui/packages/MapDataManagement/src/EditForm.vue

@@ -93,6 +93,11 @@
               :label="level.label"
               :value="level.value"
             />
+            <el-option
+              v-if="![0,1,2,3,4].includes(mapForm.level)"
+              :value="mapForm.level"
+              :label="outRangeLabel"
+            />
           </el-select>
         </el-form-item>
         <el-form-item
@@ -158,7 +163,7 @@
 <script>
 import _ from 'lodash'
 import vueJsonViewer from 'vue-json-viewer'
-import { mapUpdate, getMapChildFromGeoJson } from 'data-room-ui/js/utils/mapDataService'
+import { mapUpdate, getMapChildFromGeoJson, nameRepeatCheck } from 'data-room-ui/js/utils/mapDataService'
 
 export default {
   name: 'EditForm',
@@ -169,6 +174,9 @@ export default {
     autoParseNextLevelShow () {
       // geoJson 不为空,且未上传过(说明是刚上传的)
       return !this.isWhitespace(this.mapForm.geoJson) && this.mapForm.uploadedGeoJson === 0
+    },
+    outRangeLabel() {
+      return `级别${this.mapForm.level}`;
     }
   },
   data () {
@@ -181,7 +189,7 @@ export default {
       getMapChildFromGeoJson(this.mapForm.parentId).then(children => {
         let repeat = false
         children.forEach(child => {
-          if (child.exist && child.name === value) {
+          if (child.exist && child.name === value && child.existId !== this.mapForm.id) {
             repeat = true
           }
         })
@@ -192,6 +200,24 @@ export default {
         }
       })
     }
+    const validateName = (rule, value, callback) => {
+      if (this.mapForm.parentId !== '0') {
+        // 不需要校验
+        callback()
+        return
+      }
+      nameRepeatCheck({
+        id: this.mapForm.id,
+        parentId: this.mapForm.parentId,
+        mapName: value
+      }).then(res => {
+        if (res) {
+          callback(new Error('地图名称已存在'))
+        } else {
+          callback()
+        }
+      })
+    }
     return {
       mapFormVisible: false,
       geoJsonVisible: false,
@@ -213,7 +239,8 @@ export default {
           { validator: validateCode, trigger: 'blur' }
         ],
         name: [
-          { required: true, message: '请输入地图名称', trigger: 'blur' }
+          { required: true, message: '请输入地图名称', trigger: 'blur' },
+          { validator: validateName, trigger: 'blur' }
         ],
         level: [
           { required: true, message: '请选择地图级别', trigger: 'change' }

+ 22 - 10
data-room-ui/packages/MapDataManagement/src/index.vue

@@ -11,6 +11,7 @@
             class="bs-el-input"
             clearable
             maxlength="200"
+            @clear="getDataList"
             placeholder="请输入地图名称或标识"
           />
         </el-form-item>
@@ -67,19 +68,19 @@
           <el-empty slot="empty"/>
           <el-table-column
             align="left"
-            label="名称"
+            label="地图名称"
             prop="name"
             show-overflow-tooltip
           />
           <el-table-column
             align="center"
-            label="标识"
+            label="地图标识"
             prop="mapCode"
             show-overflow-tooltip
           />
           <el-table-column
             align="center"
-            label="级别"
+            label="地图级别"
             prop="level"
             show-overflow-tooltip
           >
@@ -89,6 +90,7 @@
               <span v-else-if="scope.row.level === 2">省份</span>
               <span v-else-if="scope.row.level === 3">城市</span>
               <span v-else-if="scope.row.level === 4">区县</span>
+              <span v-else>{{ getMoreLevel(scope.row.level) }}</span>
             </template>
           </el-table-column>
           <el-table-column
@@ -282,6 +284,9 @@ export default {
         this.$refs.table.store.states.treeData[this.lazyResolveIds[i]].expanded = false
       }
     },
+    getMoreLevel(level) {
+      return '级别' + level
+    },
     addMap() {
       this.$refs.addForm.mapFormVisible = true
       this.$refs.addForm.init()
@@ -303,14 +308,21 @@ export default {
         type: 'warning',
         customClass: 'bs-el-message-box'
       }).then(async () => {
-        mapDelete(map.id).then(() => {
-          this.$message({
-            type: 'success',
-            message: '删除成功'
-          })
-          this.getDataList()
+        mapDelete(map.id).then((deleteSuccess) => {
+          if (deleteSuccess) {
+            this.$message({
+              type: 'success',
+              message: '删除成功'
+            })
+            this.getDataList()
+          } else {
+            this.deleteMapCascade(map)
+          }
         }).catch(() => {
-          this.deleteMapCascade(map)
+         this.$message({
+            type: 'error',
+            message: '删除失败'
+          })
         })
       }).catch(() => {
       })

+ 2 - 2
data-room-ui/packages/PlotRender/index.vue

@@ -167,7 +167,7 @@ export default {
     dataFormatting (config, data) {
       // 数据返回成功则赋值
       if (data.success) {
-        data = data.data
+        data = data.data || []
         config = this.transformSettingToOption(config, 'data')
         // 获取到后端返回的数据,有则赋值
         const option = config.option
@@ -182,7 +182,7 @@ export default {
         }
         // 如果维度为数字类型则转化为字符串,否则在不增加其他配置的情况下会导致图标最后一项不显示(g2plot官网已说明)
         const xAxis = config.setting.find(item => item.field === 'xField')?.value
-        config.option.data = data.map(item => {
+        config.option.data = data?.map(item => {
           if (xAxis && typeof item[xAxis] === 'number') {
             item[xAxis] = (item[xAxis]).toString()
           }

+ 1 - 0
data-room-ui/packages/assets/images/bigScreenIcon/svg/24horizontal.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1695709445438" class="icon" viewBox="0 0 1026 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="17109" xmlns:xlink="http://www.w3.org/1999/xlink" width="200.390625" height="200"><path d="M179.2 487.936h660.992v45.056H179.2z" fill="#969696" p-id="17110"></path><path d="M834.56 404.992h191.488v214.016h-191.488zM0 404.992h191.488v214.016H0z" fill="#348FE0" p-id="17111"></path></svg>

+ 1 - 0
data-room-ui/packages/assets/images/bigScreenIcon/svg/25vertical.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1695709475135" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="18101" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M487.984032 185.48503h44.966068v659.672655h-44.966068z" fill="#969696" p-id="18102"></path><path d="M405.205589 0h213.588822v191.105788H405.205589zM405.205589 832.894212h213.588822v191.105788H405.205589z" fill="#348FE0" p-id="18103"></path></svg>

+ 1 - 1
data-room-ui/packages/js/config/basicComponentsConfig.js

@@ -26,7 +26,7 @@ const typeList = [
   'screenScrollBoard',
   'video',
   'input',
-  'button',
+  // 'button',
   'marquee',
   'chartTab',
   'themeSwitcher',

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

@@ -185,7 +185,9 @@ export default {
         }).catch(err => {
           console.info(err)
         }).finally(() => {
-          config.loading = false
+          if (config) {
+            config.loading = false
+          }
           resolve(config)
         })
       })

+ 4 - 0
data-room-ui/packages/js/mixins/multipleSelectMixin.js

@@ -112,6 +112,10 @@ export default {
       ) {
         // 关闭默认事件
         event.preventDefault()
+        // 如果没有选中任何组件的话则不弹出删除提示框
+        if (!this.activeCodes.length) {
+          return
+        }
         this.$confirm('确定删除该组件吗?', '提示', {
           confirmButtonText: '确定',
           cancelButtonText: '取消',

+ 14 - 14
data-room-ui/packages/js/utils/getComponentConfig.js

@@ -32,7 +32,7 @@ export default function getComponentConfig (type) {
       return {
         name: '水平线',
         title: '水平线',
-        icon: Icon.getNameList()[10],
+        icon: Icon.getNameList()[24],
         component: null,
         className:
           'com.gccloud.dataroom.core.module.chart.components.ScreenBorderChart',
@@ -46,7 +46,7 @@ export default function getComponentConfig (type) {
       return {
         name: '垂直线',
         title: '垂直线',
-        icon: Icon.getNameList()[11],
+        icon: Icon.getNameList()[25],
         component: null,
         className:
           'com.gccloud.dataroom.core.module.chart.components.ScreenBorderChart',
@@ -188,18 +188,18 @@ export default function getComponentConfig (type) {
         y: 0,
         type
       }
-    case 'button':
-      return {
-        name: '按钮',
-        title: '按钮',
-        icon: Icon.getNameList()[14],
-        className: 'com.gccloud.dataroom.core.module.chart.components.ScreenButtonChart',
-        w: 80,
-        h: 40,
-        x: 0,
-        y: 0,
-        type
-      }
+    // case 'button':
+    //   return {
+    //     name: '按钮',
+    //     title: '按钮',
+    //     icon: Icon.getNameList()[14],
+    //     className: 'com.gccloud.dataroom.core.module.chart.components.ScreenButtonChart',
+    //     w: 80,
+    //     h: 40,
+    //     x: 0,
+    //     y: 0,
+    //     type
+    //   }
     case 'marquee':
       return {
         name: '跑马灯',

+ 10 - 2
data-room-ui/packages/js/utils/mapDataService.js

@@ -57,7 +57,14 @@ const uploadGeoJson = (params = {}, flag = false) => Vue.prototype.$dataRoomAxio
  * @param params
  * @param flag
  */
-const repeatCheck = (params = {}, flag = false) => Vue.prototype.$dataRoomAxios.post('/bigScreen/map/repeat', params, flag)
+const repeatCheck = (params = {}, flag = false) => Vue.prototype.$dataRoomAxios.post('/bigScreen/map/repeat/code', params, flag)
+
+/**
+ * 名称重复校验
+ * @param params
+ * @param flag
+ */
+const nameRepeatCheck = (params = {}, flag = false) => Vue.prototype.$dataRoomAxios.post('/bigScreen/map/repeat/name', params, flag)
 
 export {
   mapList,
@@ -67,5 +74,6 @@ export {
   mapCascadeDelete,
   getMapChildFromGeoJson,
   uploadGeoJson,
-  repeatCheck
+  repeatCheck,
+  nameRepeatCheck
 }