feat: 代码合并

main
wu.jian2 2 years ago
commit 1b59a2a042

@ -26,6 +26,9 @@ public class ScreenFlyMapChart extends Chart{
@Data
public static class Customize {
@ApiModelProperty(notes = "地图id")
private String mapId;
@ApiModelProperty(notes = "是否显示文字")
private Boolean mapName;

@ -3,6 +3,8 @@ package com.gccloud.dataroom.core.module.manage.extend;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* @author hongyang
* @version 1.0
@ -25,4 +27,25 @@ public class DataRoomExtendClient {
}
}
/**
*
* @param code code
*/
public void afterAdd(String code) {
if (extendService != null) {
extendService.afterAdd(code);
}
}
/**
*
* @param code code
*/
public void afterDelete(String code) {
if (extendService != null) {
extendService.afterDelete(code);
}
}
}

@ -1,5 +1,7 @@
package com.gccloud.dataroom.core.module.manage.extend;
import java.util.List;
/**
*
* @author hongyang
@ -11,8 +13,22 @@ public interface IDataRoomExtendService {
/**
*
*
* 使afterDelete
* @param code
*/
void deleteByCode(String code);
@Deprecated
default void deleteByCode(String code) {}
/**
* ,
* @param code code
*/
default void afterAdd(String code) {}
/**
* ,
* @param code code
*/
default void afterDelete(String code) {}
}

@ -14,11 +14,11 @@ import com.gccloud.dataroom.core.module.manage.extend.DataRoomExtendClient;
import com.gccloud.dataroom.core.module.manage.service.IDataRoomPageService;
import com.gccloud.dataroom.core.module.template.entity.PageTemplateEntity;
import com.gccloud.dataroom.core.module.template.service.IPageTemplateService;
import com.gccloud.dataroom.core.permission.DataRoomPermissionClient;
import com.gccloud.dataroom.core.utils.CodeGenerateUtils;
import com.gccloud.common.exception.GlobalException;
import com.gccloud.common.utils.AssertUtils;
import com.gccloud.common.utils.BeanConvertUtils;
import com.gccloud.common.utils.QueryWrapperUtils;
import com.gccloud.common.vo.PageVO;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
@ -34,6 +34,7 @@ import java.io.IOException;
import java.util.Base64;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* @author hongyang
@ -54,6 +55,9 @@ public class DataRoomPageServiceImpl extends ServiceImpl<DataRoomPageDao, PageEn
@Resource
private DataRoomExtendClient dataRoomExtendClient;
@Resource
private DataRoomPermissionClient permissionClient;
@Override
public String add(DataRoomPageDTO bigScreenPageDTO) {
if (StringUtils.isBlank(bigScreenPageDTO.getCode())) {
@ -80,6 +84,7 @@ public class DataRoomPageServiceImpl extends ServiceImpl<DataRoomPageDao, PageEn
AssertUtils.isTrue(!checkNameRepeat(bigScreenEntity), "名称重复");
AssertUtils.isTrue(!checkCodeRepeat(bigScreenEntity), "编码重复");
this.save(bigScreenEntity);
dataRoomExtendClient.afterAdd(bigScreenEntity.getCode());
return bigScreenEntity.getCode();
}
@ -171,16 +176,39 @@ public class DataRoomPageServiceImpl extends ServiceImpl<DataRoomPageDao, PageEn
if (StringUtils.isBlank(searchDTO.getType())) {
throw new GlobalException("类型不能为空");
}
LambdaQueryWrapper<PageEntity> queryWrapper = QueryWrapperUtils.wrapperLike(new LambdaQueryWrapper<>(), searchDTO.getSearchKey(), PageEntity::getName);
LambdaQueryWrapper<PageEntity> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.like(StringUtils.isNotBlank(searchDTO.getSearchKey()), PageEntity::getName, searchDTO.getSearchKey());
if (StringUtils.isNotBlank(searchDTO.getParentCode())) {
queryWrapper.eq(PageEntity::getParentCode, searchDTO.getParentCode());
}
queryWrapper.eq(PageEntity::getType, searchDTO.getType());
queryWrapper.select(PageEntity::getId, PageEntity::getAppCode, PageEntity::getCode, PageEntity::getName, PageEntity::getParentCode, PageEntity::getOrderNum, PageEntity::getCoverPicture, PageEntity::getUpdateDate);
queryWrapper.select(PageEntity::getCode);
List<PageEntity> idEntityList = this.list(queryWrapper);
if (idEntityList == null || idEntityList.isEmpty()) {
PageVO<PageEntity> pageVO = new PageVO<>();
pageVO.setList(Lists.newArrayList());
return pageVO;
}
List<String> codeList = idEntityList.stream().map(PageEntity::getCode).collect(Collectors.toList());
List<String> filterByPermission = permissionClient.filterByPermission(codeList);
if (filterByPermission == null || filterByPermission.isEmpty()) {
PageVO<PageEntity> pageVO = new PageVO<>();
pageVO.setList(Lists.newArrayList());
return pageVO;
}
LambdaQueryWrapper<PageEntity> reQueryWrapper = new LambdaQueryWrapper<>();
if (idEntityList.size() == filterByPermission.size()) {
// 说明没有过滤掉任何一个, 按照原来的条件查询
reQueryWrapper = queryWrapper;
} else {
// 说明过滤掉了一些, 按照过滤后的编码查询
reQueryWrapper.in(PageEntity::getCode, filterByPermission);
}
reQueryWrapper.select(PageEntity::getId, PageEntity::getAppCode, PageEntity::getCode, PageEntity::getName, PageEntity::getParentCode, PageEntity::getOrderNum, PageEntity::getCoverPicture, PageEntity::getUpdateDate);
// 优先序号升序,其次创建时间降序
queryWrapper.orderByAsc(PageEntity::getOrderNum);
queryWrapper.orderByDesc(PageEntity::getCreateDate);
PageVO<PageEntity> page = page(searchDTO, queryWrapper);
reQueryWrapper.orderByAsc(PageEntity::getOrderNum);
reQueryWrapper.orderByDesc(PageEntity::getCreateDate);
PageVO<PageEntity> page = this.page(searchDTO, reQueryWrapper);
List<PageEntity> list = page.getList();
if (list == null || list.isEmpty()) {
return page;
@ -242,6 +270,7 @@ public class DataRoomPageServiceImpl extends ServiceImpl<DataRoomPageDao, PageEn
chart.setCode(CodeGenerateUtils.generate(chart.getType() == null ? "chart" : chart.getType()));
}
this.save(screenEntity);
dataRoomExtendClient.afterAdd(screenEntity.getCode());
return screenEntity.getCode();
}
@ -253,5 +282,7 @@ public class DataRoomPageServiceImpl extends ServiceImpl<DataRoomPageDao, PageEn
PAGE_ENTITY_CACHE.invalidate(code);
// 调用拓展接口
dataRoomExtendClient.deleteByCode(code);
// 移除权限拓展
dataRoomExtendClient.afterDelete(code);
}
}

@ -3,6 +3,7 @@ package com.gccloud.dataroom.core.module.map.controller;
import com.gccloud.common.utils.BeanConvertUtils;
import com.gccloud.common.vo.R;
import com.gccloud.dataroom.core.module.map.dto.DataRoomMapRepeatDTO;
import com.gccloud.dataroom.core.module.map.vo.DataRoomMapDataVO;
import com.gccloud.dataroom.core.module.map.vo.DataRoomMapVO;
import com.gccloud.dataroom.core.module.map.vo.MapChildVO;
import com.gccloud.dataroom.core.module.map.dto.DataRoomMapDTO;
@ -72,10 +73,10 @@ public class DataRoomMapController {
return R.success();
}
@GetMapping("/getMapChildFromGeoJson/{code}")
@ApiOperation(value = "根据父编码解析父级json中的子级", position = 60, notes = "根据父编码解析父级json中的子级", produces = MediaType.APPLICATION_JSON_VALUE)
public R<List<MapChildVO>> getMapChildFromGeoJson(@PathVariable String code) {
List<MapChildVO> list = dataRoomMapService.getChildFromGeo(code);
@GetMapping("/getMapChildFromGeoJson/{id}")
@ApiOperation(value = "根据地图id解析json中的子级", position = 60, notes = "根据地图id解析json中的子级", produces = MediaType.APPLICATION_JSON_VALUE)
public R<List<MapChildVO>> getMapChildFromGeoJson(@PathVariable String id) {
List<MapChildVO> list = dataRoomMapService.getChildFromGeo(id);
return R.success(list);
}
@ -89,11 +90,23 @@ public class DataRoomMapController {
}
@GetMapping("/data/{id}")
@GetMapping("/data/{parentId}/{code}")
@ApiOperation(value = "数据", position = 80, notes = "地图数据数据", produces = MediaType.APPLICATION_JSON_VALUE)
public R<String> data(@PathVariable String id) {
DataRoomMapEntity info = dataRoomMapService.info(id);
return R.success(info.getGeoJson());
public R<DataRoomMapDataVO> data(@PathVariable String parentId, @PathVariable String code) {
DataRoomMapEntity info = dataRoomMapService.getByParentIdAndCode(parentId, code);
DataRoomMapDataVO vo = new DataRoomMapDataVO();
// 如果没有找到该地图或地图没有上传geojson数据
if (info == null) {
vo.setAvailable(0);
return R.success(vo);
}
vo.setAvailable(0);
if (info.getUploadedGeoJson().equals(1)) {
vo.setAvailable(1);
}
vo.setGeoJson(info.getGeoJson());
vo.setId(info.getId());
return R.success(vo);
}
@ -113,5 +126,19 @@ public class DataRoomMapController {
}
@GetMapping("/tree/{level}")
@ApiOperation(value = "树", position = 110, notes = "地图数据树", produces = MediaType.APPLICATION_JSON_VALUE)
public R<List<DataRoomMapVO>> tree(@PathVariable String level) {
int levelInt = 0;
try {
levelInt = Integer.parseInt(level);
} catch (NumberFormatException e) {
return R.error("地图层级参数错误");
}
List<DataRoomMapVO> list = dataRoomMapService.getAvailableTree(levelInt);
return R.success(list);
}
}

@ -23,4 +23,12 @@ public interface DataRoomMapDao extends BaseMapper<DataRoomMapEntity> {
*/
List<DataRoomMapVO> getList(@Param("searchDTO") MapSearchDTO searchDTO);
/**
*
* ...
* @param level
* @return
*/
List<DataRoomMapEntity> getMapByLevel(@Param("level") Integer level);
}

@ -15,7 +15,7 @@ public class DataRoomMapDTO {
private String id;
@ApiModelProperty(notes = "父级编码")
private String parentCode;
private String parentId;
@ApiModelProperty(notes = "地图编码")
private String mapCode;

@ -14,8 +14,8 @@ public class DataRoomMapRepeatDTO {
@ApiModelProperty(notes = "主键")
private String id;
@ApiModelProperty(notes = "父级编码")
private String parentCode;
@ApiModelProperty(notes = "父级地图id")
private String parentId;
@ApiModelProperty(notes = "地图编码")
private String mapCode;

@ -12,8 +12,8 @@ import lombok.Data;
@Data
public class MapSearchDTO extends SearchDTO {
@ApiModelProperty(notes = "父级编码")
private String parentCode;
@ApiModelProperty(notes = "父级地图id")
private String parentId;
@ApiModelProperty(notes = "层级")
private Integer level;

@ -21,8 +21,8 @@ import lombok.experimental.Accessors;
@ToString(callSuper = true)
public class DataRoomMapEntity extends SuperEntity {
@ApiModelProperty(notes = "父级编码")
private String parentCode;
@ApiModelProperty(notes = "父级地图id")
private String parentId;
@ApiModelProperty(notes = "地图编码")
private String mapCode;

@ -18,9 +18,9 @@ import java.util.List;
public interface IDataRoomMapService extends ISuperService<DataRoomMapEntity> {
/**
*
* id
*/
String SUPER_PARENT_CODE = "0";
String SUPER_PARENT_ID = "0";
/**
@ -31,6 +31,13 @@ public interface IDataRoomMapService extends ISuperService<DataRoomMapEntity> {
List<DataRoomMapVO> getList(MapSearchDTO searchDTO);
/**
*
* @param level
* @return
*/
List<DataRoomMapVO> getAvailableTree(Integer level);
/**
*
* @param mapDTO
@ -66,6 +73,14 @@ public interface IDataRoomMapService extends ISuperService<DataRoomMapEntity> {
*/
DataRoomMapEntity info(String id);
/**
* id
* @param parentId
* @param code
* @return
*/
DataRoomMapEntity getByParentIdAndCode(String parentId, String code);
/**
*

@ -20,7 +20,9 @@ import org.json.JSONArray;
import org.json.JSONObject;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
@ -36,14 +38,98 @@ public class DataRoomMapServiceImpl extends ServiceImpl<DataRoomMapDao, DataRoom
@Override
public List<DataRoomMapVO> getList(MapSearchDTO searchDTO) {
List<DataRoomMapVO> list = this.baseMapper.getList(searchDTO);
return list;
return this.baseMapper.getList(searchDTO);
}
@Override
public List<DataRoomMapVO> getAvailableTree(Integer level) {
// 根据层级,如果某个地图的某个子级(或子级的子级...)也符合该层级,那么把该地图也返回
LambdaQueryWrapper<DataRoomMapEntity> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.select(DataRoomMapEntity::getId, DataRoomMapEntity::getLevel, DataRoomMapEntity::getParentId,
DataRoomMapEntity::getMapCode, DataRoomMapEntity::getName, DataRoomMapEntity::getEnableDown, DataRoomMapEntity::getUploadedGeoJson);
queryWrapper.le(DataRoomMapEntity::getLevel, level);
List<DataRoomMapEntity> list = list(queryWrapper);
// 转成树形结构
return this.convertToTree(list, level);
}
/**
*
* @param list
* @return
*/
private List<DataRoomMapVO> convertToTree(List<DataRoomMapEntity> list, Integer targetLevel) {
List<DataRoomMapVO> voList = BeanConvertUtils.convert(list, DataRoomMapVO.class);
// 根节点
List<DataRoomMapVO> rootList = Lists.newArrayList();
// 组装id为key地图为value的map
Map<String, DataRoomMapVO> map = new HashMap<>();
voList.forEach(vo -> map.put(vo.getId(), vo));
// 目标层级的地图
List<DataRoomMapVO> targetLevelList = voList.stream().filter(vo -> vo.getLevel().equals(targetLevel)).collect(Collectors.toList());
// 目标层级的地图,以及其父级地图...
List<DataRoomMapVO> match = Lists.newArrayList(targetLevelList);
for (DataRoomMapVO mapVO : targetLevelList) {
mapVO.setDisabled(!mapVO.getUploadedGeoJson().equals(YES));
if (mapVO.getLevel().equals(0)) {
// 已经是最顶级了,没有父级了
continue;
}
DataRoomMapVO parent = map.get(mapVO.getParentId());
if(parent == null) {
continue;
}
// 将目标层级的地图,以及其父级地图...加入到match中
this.getParentMap(parent, map, match);
}
for (DataRoomMapVO vo : match) {
if (vo.getParentId().equals(SUPER_PARENT_ID)) {
rootList.add(vo);
continue;
}
DataRoomMapVO parent = map.get(vo.getParentId());
if (parent == null) {
continue;
}
if (parent.getChildren() == null) {
parent.setChildren(Lists.newArrayList());
}
parent.getChildren().add(vo);
}
return rootList;
}
/**
* ...
* @param parentMap
* @param mapIdMap
* @param match
*/
private void getParentMap(DataRoomMapVO parentMap, Map<String, DataRoomMapVO> mapIdMap, List<DataRoomMapVO> match) {
if (parentMap == null) {
return;
}
if (match.contains(parentMap)) {
// 已经包含了,不需要再加入了
return;
}
match.add(parentMap);
if (parentMap.getLevel().equals(0)) {
// 已经是最顶级了,没有父级了
return;
}
DataRoomMapVO parent = mapIdMap.get(parentMap.getParentId());
this.getParentMap(parent, mapIdMap, match);
}
@Override
public String add(DataRoomMapDTO mapDTO) {
if (StringUtils.isBlank(mapDTO.getParentCode())) {
mapDTO.setParentCode(SUPER_PARENT_CODE);
if (StringUtils.isBlank(mapDTO.getParentId())) {
mapDTO.setParentId(SUPER_PARENT_ID);
}
if (StringUtils.isBlank(mapDTO.getMapCode())) {
throw new GlobalException("地图编码不能为空");
@ -91,10 +177,10 @@ public class DataRoomMapServiceImpl extends ServiceImpl<DataRoomMapDao, DataRoom
/**
* geoJson
* @param old
* @param mapEntity
* @param geoJson
*/
private void parseNextLevelAndSave(DataRoomMapEntity old, String geoJson) {
private void parseNextLevelAndSave(DataRoomMapEntity mapEntity, String geoJson) {
JSONObject jsonObject = new JSONObject(geoJson);
JSONArray features = jsonObject.getJSONArray("features");
if (features == null || features.length() == 0) {
@ -108,8 +194,8 @@ public class DataRoomMapServiceImpl extends ServiceImpl<DataRoomMapDao, DataRoom
continue;
}
DataRoomMapEntity childMapEntity = new DataRoomMapEntity();
childMapEntity.setParentCode(old.getMapCode());
childMapEntity.setLevel(old.getLevel() + 1);
childMapEntity.setParentId(mapEntity.getId());
childMapEntity.setLevel(mapEntity.getLevel() + 1);
childMapEntity.setMapCode(properties.getString("name"));
childMapEntity.setName(properties.getString("name"));
childMapEntity.setEnableDown(NO);
@ -131,7 +217,7 @@ public class DataRoomMapServiceImpl extends ServiceImpl<DataRoomMapDao, DataRoom
return;
}
LambdaQueryWrapper<DataRoomMapEntity> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(DataRoomMapEntity::getParentCode, mapEntity.getMapCode());
queryWrapper.eq(DataRoomMapEntity::getParentId, mapEntity.getId());
List<DataRoomMapEntity> list = this.list(queryWrapper);
if (list != null && list.size() > 0) {
throw new GlobalException("该地图下存在子地图,不能删除");
@ -154,7 +240,7 @@ public class DataRoomMapServiceImpl extends ServiceImpl<DataRoomMapDao, DataRoom
return;
}
LambdaQueryWrapper<DataRoomMapEntity> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(DataRoomMapEntity::getParentCode, mapEntity.getMapCode());
queryWrapper.eq(DataRoomMapEntity::getParentId, mapEntity.getId());
List<DataRoomMapEntity> list = this.list(queryWrapper);
if (list != null && list.size() > 0) {
for (DataRoomMapEntity entity : list) {
@ -173,6 +259,27 @@ public class DataRoomMapServiceImpl extends ServiceImpl<DataRoomMapDao, DataRoom
return mapEntity;
}
@Override
public DataRoomMapEntity getByParentIdAndCode(String parentId, String code) {
if (StringUtils.isBlank(parentId)) {
parentId = SUPER_PARENT_ID;
}
if (StringUtils.isBlank(code)) {
throw new GlobalException("地图编码不能为空");
}
LambdaQueryWrapper<DataRoomMapEntity> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(DataRoomMapEntity::getParentId, parentId);
queryWrapper.eq(DataRoomMapEntity::getMapCode, code);
List<DataRoomMapEntity> list = this.list(queryWrapper);
if (list == null || list.size() == 0) {
return null;
}
if (list.size() > 1) {
throw new GlobalException("地图编码重复");
}
return list.get(0);
}
@Override
public DataRoomMapEntity infoByMapCode(String mapCode) {
LambdaQueryWrapper<DataRoomMapEntity> queryWrapper = new LambdaQueryWrapper<>();
@ -190,12 +297,12 @@ public class DataRoomMapServiceImpl extends ServiceImpl<DataRoomMapDao, DataRoom
/**
* geoJsongeoJson
* @param code
* @param id
* @return
*/
@Override
public List<MapChildVO> getChildFromGeo(String code) {
DataRoomMapEntity mapEntity = this.infoByMapCode(code);
public List<MapChildVO> getChildFromGeo(String id) {
DataRoomMapEntity mapEntity = this.getById(id);
if (mapEntity.getUploadedGeoJson().equals(NO)) {
return Lists.newArrayList();
}
@ -211,7 +318,7 @@ public class DataRoomMapServiceImpl extends ServiceImpl<DataRoomMapDao, DataRoom
// 查询当前地图下的所有子地图
LambdaQueryWrapper<DataRoomMapEntity> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.select(DataRoomMapEntity::getMapCode);
queryWrapper.eq(DataRoomMapEntity::getParentCode, code);
queryWrapper.eq(DataRoomMapEntity::getParentId, id);
List<DataRoomMapEntity> list = this.list(queryWrapper);
List<String> mapCodeList = list.stream().map(DataRoomMapEntity::getMapCode).collect(Collectors.toList());
// 解析geoJson获取下一级的基础数据
@ -254,13 +361,12 @@ public class DataRoomMapServiceImpl extends ServiceImpl<DataRoomMapDao, DataRoom
if (StringUtils.isBlank(mapDTO.getMapCode())) {
throw new GlobalException("地图编码不能为空");
}
if (StringUtils.isBlank(mapDTO.getParentCode())) {
if (StringUtils.isBlank(mapDTO.getParentId())) {
throw new GlobalException("上级地图编码不能为空");
}
// TODO 这里存在问题,因为编码只在某个地图下的某个层级下是唯一的,所以如果碰巧有两个地图下的某个层级下的编码相同,就会出现问题
LambdaQueryWrapper<DataRoomMapEntity> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(DataRoomMapEntity::getMapCode, mapDTO.getMapCode());
queryWrapper.eq(DataRoomMapEntity::getParentCode, mapDTO.getParentCode());
queryWrapper.eq(DataRoomMapEntity::getParentId, mapDTO.getParentId());
if (StringUtils.isNotBlank(mapDTO.getId())) {
queryWrapper.ne(DataRoomMapEntity::getId, mapDTO.getId());
}

@ -0,0 +1,26 @@
package com.gccloud.dataroom.core.module.map.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @author hongyang
* @version 1.0
* @date 2023/9/4 17:16
*/
@Data
public class DataRoomMapDataVO {
@ApiModelProperty(notes = "主键")
private String id;
@ApiModelProperty(notes = "是否支持下钻 0-否 1-是")
private Integer enableDown;
@ApiModelProperty(notes = "geo地图数据json")
private String geoJson;
@ApiModelProperty(notes = "是否可用")
private Integer available;
}

@ -3,6 +3,8 @@ package com.gccloud.dataroom.core.module.map.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
* @author hongyang
* @version 1.0
@ -15,7 +17,7 @@ public class DataRoomMapVO {
private String id;
@ApiModelProperty(notes = "父级编码")
private String parentCode;
private String parentId;
@ApiModelProperty(notes = "地图编码")
private String mapCode;
@ -37,4 +39,11 @@ public class DataRoomMapVO {
@ApiModelProperty(notes = "是否有子节点")
private Boolean hasChildren;
@ApiModelProperty(notes = "子级")
private List<DataRoomMapVO> children;
@ApiModelProperty(notes = "是否禁用")
private Boolean disabled;
}

@ -4,6 +4,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
/**
* @author hongyang
@ -14,7 +15,7 @@ import javax.servlet.http.HttpServletRequest;
public class DataRoomPermissionClient {
@Autowired(required = false)
private IDataRoomPermissionService tokenService;
private IDataRoomPermissionService permissionService;
/**
@ -25,13 +26,26 @@ public class DataRoomPermissionClient {
*/
public boolean verifyDataPermission(HttpServletRequest request, String pageCode) {
boolean verify = true;
if (tokenService != null) {
verify = tokenService.verifyDataPermission(request, pageCode);
if (permissionService != null) {
verify = permissionService.verifyDataPermission(request, pageCode);
}
return verify;
}
/**
*
* @param allCode code
* @return code
*/
public List<String> filterByPermission(List<String> allCode) {
if (permissionService != null) {
return permissionService.filterByPermission(allCode);
}
return allCode;
}
}

@ -2,6 +2,7 @@ package com.gccloud.dataroom.core.permission;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
/**
* @author hongyang
@ -18,5 +19,13 @@ public interface IDataRoomPermissionService {
*/
boolean verifyDataPermission(HttpServletRequest request, String pageCode);
/**
*
* @param allCode code
* @return code
*/
default List<String> filterByPermission(List<String> allCode) {
return allCode;
}
}

@ -6,7 +6,7 @@
<!-- 查询地图数据 -->
<select id="getList" resultType="com.gccloud.dataroom.core.module.map.vo.DataRoomMapVO">
SELECT id,
parent_code,
parent_id,
map_code,
name,
level,
@ -18,18 +18,18 @@
create_by,
update_by,
del_flag,
map_code as curentMapcode,
id as curentMapId,
CASE WHEN EXISTS(SELECT 1
FROM big_screen_map
WHERE parent_code = curentMapcode
WHERE parent_id = curentMapId
AND del_flag = 0)
THEN 1
ELSE 0 END AS has_children
FROM big_screen_map
WHERE del_flag = 0
<if test="searchDTO != null">
<if test="searchDTO.parentCode != null and searchDTO.parentCode != ''">
AND parent_code = #{searchDTO.parentCode}
<if test="searchDTO.parentId != null and searchDTO.parentId != ''">
AND parent_id = #{searchDTO.parentId}
</if>
<if test="searchDTO.searchKey != null and searchDTO.searchKey != ''">
AND (
@ -51,5 +51,16 @@
</select>
<select id="getMapByLevel" resultType="com.gccloud.dataroom.core.module.map.entity.DataRoomMapEntity">
select id, level, parent_id, map_code
from big_screen_map
where (level &lt; #{level}
and id in (select distinct parent_id from big_screen_map where del_flag != 0)
)
OR level = #{level}
and del_flag = 0
</select>
</mapper>

@ -167,7 +167,7 @@ CREATE TABLE IF NOT EXISTS ds_dataset_label (
CREATE TABLE IF NOT EXISTS big_screen_map (
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键',
parent_code VARCHAR(255) DEFAULT NULL COMMENT '父级地图编码',
parent_id VARCHAR(255) DEFAULT NULL COMMENT '父级地图id',
map_code VARCHAR(255) DEFAULT NULL COMMENT '地图编码',
name VARCHAR(255) DEFAULT NULL COMMENT '地图名称',
geo_json CLOB DEFAULT NULL COMMENT '地图geoJson',

@ -191,7 +191,7 @@ DROP TABLE IF EXISTS `big_screen_map`;
CREATE TABLE `big_screen_map`
(
`id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '主键',
`parent_code` varchar(255) DEFAULT NULL COMMENT '父级地图编码',
`parent_id` varchar(255) DEFAULT NULL COMMENT '父级地图id',
`map_code` varchar(255) DEFAULT NULL COMMENT '地图编码',
`name` varchar(255) DEFAULT NULL COMMENT '地图名称',
`geo_json` longtext DEFAULT NULL COMMENT '地图geoJson',

@ -111,7 +111,7 @@ DROP TABLE IF EXISTS `big_screen_map`;
CREATE TABLE `big_screen_map`
(
`id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '主键',
`parent_code` varchar(255) DEFAULT NULL COMMENT '父级地图编码',
`parent_id` varchar(255) DEFAULT NULL COMMENT '父级地图id',
`map_code` varchar(255) DEFAULT NULL COMMENT '地图编码',
`name` varchar(255) DEFAULT NULL COMMENT '地图名称',
`geo_json` longtext DEFAULT NULL COMMENT '地图geoJson',

@ -58,7 +58,7 @@ const customConfig = {
// 分割线颜色
mapLineColor: 'rgba(53, 86, 165, 1)',
fontGraphicColor: '#fff',
fontSize:'30',
fontSize: '30',
// 是否开启下钻
down: false,
// 地图级别

@ -13,32 +13,42 @@
:append-to-body="false"
class="bs-dialog-wrap bs-el-dialog"
>
<el-table
ref="table"
v-loading="loading"
class="bs-table bs-el-table"
height="300"
:data="dataList"
>
<el-table-column
v-for="(col,index) in columnData"
:key="index"
show-overflow-tooltip
:prop="col.alias"
:label="getLabel(col)"
align="center"
/>
</el-table>
<div class="table-box">
<el-table
ref="table"
v-loading="loading"
class="bs-table bs-el-table"
height="300"
:data="dataList"
>
<el-table-column
v-for="(col,index) in columnData"
:key="index"
show-overflow-tooltip
:prop="col.alias"
:label="getLabel(col)"
align="center"
/>
</el-table>
</div>
<div
slot="footer"
class="dialog-footer"
>
<el-button
class="bs-el-button-default cancel"
@click="cancel"
>
取消
</el-button>
<DownloadExcel
:data="dataList"
:fields="fields"
:name="chartTitle+'数据导出'"
class="output-excel"
:before-finish="exportHandler"
:before-generate="generate"
>
<el-button
type="primary"
@ -96,7 +106,7 @@ export default {
getDataList (config) {
this.loading = true
// G2option
if (config.type === 'customComponent' && (!config.dataSource.businessKey)) {
if (['customComponent', 'remoteComponent'].includes(config.type) && (!config.dataSource.businessKey)) {
this.getDataByOption(config)
this.fieldsFormat()
this.loading = false
@ -116,7 +126,9 @@ export default {
if (Array.isArray(res.data)) {
this.dataList = res.data || []
} else {
// datajshttp,option
// dataoption
// 1jshttp,
// 2null
this.getDataByOption(config)
}
this.columnData = res.columnData || {}
@ -128,22 +140,41 @@ export default {
},
// option
getDataByOption (config) {
const list = config.option.data || []
for (const key of Object.keys(list[0])) {
this.columnData[key] = {
aggregate: '',
alias: key,
originalColumn: key,
remark: key,
tableName: '',
type: 'varchar'
let list = []
if (config.chartType === 'Treemap') {
list = config.option.data.children
} else if (config.type === 'tables') {
list = config.option.tableData
} else {
list = config.option.data
}
let keyList = []
if (list && list.length) {
// list[0]
if (typeof list[0] === 'object' && list[0] !== null) {
keyList = Object.keys(list[0])
} else {
keyList = list
}
for (const key of keyList) {
const _key = key + ''
this.columnData[_key] = {
aggregate: '',
alias: _key,
originalColumn: _key,
remark: _key,
tableName: '',
type: 'varchar'
}
}
} else {
this.columnData = {}
}
this.dataList = list
this.dataList = list || []
},
//
getLabel (col) {
return col.remark || col.originalColumn
return col.remark || col.alias
},
//
resetData () {
@ -154,13 +185,32 @@ export default {
},
// fields
fieldsFormat () {
for (const item in this.columnData) {
this.fields[this.columnData[item].remark || this.columnData[item].originalColumn] = this.columnData[item].originalColumn
if (this.columnData && Object.keys(this.columnData).length) {
for (const item in this.columnData) {
this.fields[this.columnData[item].remark || this.columnData[item].alias] = this.columnData[item].alias
}
} else {
this.fields = {}
}
},
//
cancel () {
this.formVisible = false
},
generate (val) {
if (!Object.keys(this.fields).length) {
this.$message.warning('数据为空')
}
this.formVisible = false
this.exportLoading = true
},
//
exportHandler () {
this.$message.success('导出数据')
this.exportLoading = false
if (Object.keys(this.fields).length) {
this.$message.success('数据导出成功')
}
this.formVisible = false
}
}
}
@ -170,8 +220,20 @@ export default {
.bs-data-view-dialog{
/deep/.el-dialog__body{
background-color: var(--bs-background-2) !important;
max-height: unset!important;
min-height: unset!important;
height: 500px!important;
overflow-y: auto!important;
}
.table-box{
max-height: 500px; /* 设置最大高度,根据需要调整 */
overflow-y: auto; /* 当内容溢出时显示垂直滚动条 */
}
.dialog-footer{
display: flex;
justify-content: flex-end;
.cancel{
margin-right: 10px;
overflow-y: hidden;
}
}
.el-table th.el-table__cell.is-leaf, .el-table /deep/td.el-table__cell{
border-bottom:none;
@ -185,25 +247,27 @@ export default {
.bs-el-table /deep/td.el-table__cell{
color: #bcc9d4;
}
/* 自定义滚动条样式 */
/deep/.el-table__body-wrapper::-webkit-scrollbar {
width: 6px; /* 滚动条宽度 */
.el-table--scrollable-y /deep/.el-table__body-wrapper{
overflow-y: hidden;
}
/* 修改滚动条的样式 */
/deep/.el-dialog__body::-webkit-scrollbar {
width: 8px; /* 滚动条宽度 */
}
/deep/.el-table__body-wrapper::-webkit-scrollbar-thumb {
/deep/.el-dialog__body::-webkit-scrollbar-thumb {
background-color: #888; /* 滚动条拖动块颜色 */
height: 30px;
border-radius: 5px;
}
/deep/.el-table__body-wrapper::-webkit-scrollbar-track {
/deep/.el-dialog__body::-webkit-scrollbar-track {
background-color: transparent; /* 滚动条轨道颜色 */
}
/* 鼠标悬停在滚动条上时的样式 */
/deep/.el-table__body-wrapper::-webkit-scrollbar-thumb:hover {
/deep/.el-dialog__body::-webkit-scrollbar-thumb:hover {
background-color: #555;
cursor: pointer;
}
}
</style>

@ -39,7 +39,6 @@ export default {
let setting = []
// eslint-disable-next-line prefer-const, no-unused-vars
let title = ''
// eslint-disable-next-line prefer-const, no-unused-vars
let data = []
let g2Plots=g2Plot
@ -203,7 +202,7 @@ export default {
height: calc(100% - 40px);
width: 100%;
overflow: auto;
padding: 20px;
padding: 5px 20px;
background-color: var(--bs-background-1);
}
}

@ -120,6 +120,15 @@ const setting = [
value: '',
tabName: 'data'
},
{
label: '柱形颜色',
type: 'colorPicker',
field: 'color',
optionField: 'color',
value: '#007aff',
tabName: 'custom',
groupName: 'graph'
},
{
label: 'x轴类型',
type: 'input',
@ -129,6 +138,33 @@ const setting = [
tabName: 'custom',
groupName: 'xAxis'
},
{
label: '是否显示标签',
type: 'switch',
field: 'xAxis_axisLabel_show',
optionField: 'xAxis.axisLabel.show',
value: true,
tabName: 'custom',
groupName: 'xAxis'
},
{
label: '标签旋转角度',
type: 'inputNumber',
field: 'xAxis_axisLabel_rotate',
optionField: 'xAxis.axisLabel.rotate',
value: 0,
tabName: 'custom',
groupName: 'xAxis'
},
{
label: '标签颜色',
type: 'colorPicker',
field: 'xAxis_axisLabel_color',
optionField: 'xAxis.axisLabel.color',
value: '#fff',
tabName: 'custom',
groupName: 'xAxis'
},
{
label: 'y轴类型',
type: 'input',
@ -158,14 +194,19 @@ const option = {
// 数据将要放入到哪个字段中
dataKey: 'data',
data,
color: '',
//柱状图颜色
color: '#007aff',
appendPadding: [16, 16, 16, 16], // 设置图标的边距
xField: 'Date',
yField: 'scales',
smooth: true,
xAxis: {
type:'category',
data: []
data: [],
axisLabel:{
show:true,
color:'#fff',
rotate:0
}
},
yAxis: {
type: 'value'
@ -173,7 +214,10 @@ const option = {
series:[
{
data: [],
type:'line'
type: 'bar',
backgroundStyle: {
color: '#fff'
}
}
]
}

@ -26,27 +26,19 @@
<div class="left-vue-code component-code">
<div class="code-tab-header">
<div class="code-tab-left">
<div class="code-tab">
组件模板
</div>
<div
class="code-tab-btn"
@click="change('echarts')"
>
<div class="code-tab">组件模板</div>
<div class="code-tab-btn" @click="change('echart')">
echarts组件
</div>
<div
class="code-tab-btn"
@click="change('g2')"
>
<div class="code-tab-btn" @click="change('g2plot')">
G2Plot组件
</div>
<div
class="code-tab-btn"
@click="change('base')"
>
<div class="code-tab-btn" @click="change('native')">
原生组件
</div>
<div class="code-tab-btn" @click="change('3DEchart')">
3D组件
</div>
</div>
<div class="upload-btn">
<CusBtn @click="upload('vueContent')">
@ -228,33 +220,63 @@ export default {
methods: {
getBizComponentInfo () {
const code = this.$route.query.code
const type = this.$route.query.type
if (code) {
getBizComponentInfo(code).then(data => {
this.form = {
...data,
name: data.name,
coverPicture: data.coverPicture,
settingContent: data.settingContent || defaultSettingContent,
vueContent: data.vueContent || defaultVueContent
if(type&&type==='g2plot'){
this.form = {
...data,
name: data.name,
coverPicture: data.coverPicture,
settingContent: data.settingContent || defaultG2SettingContent,
vueContent: data.vueContent || defaultG2VueContent
}
}else if(type&&type==='echart'){
this.form = {
...data,
name: data.name,
coverPicture: data.coverPicture,
settingContent: data.settingContent || defaultEchartsSettingContent,
vueContent: data.vueContent || defaultEchartsVueContent
}
}else{
this.form = {
...data,
name: data.name,
coverPicture: data.coverPicture,
settingContent: data.settingContent || defaultSettingContent,
vueContent: data.vueContent || defaultVueContent
}
}
// this.$refs.vueContent.editor.setValue(this.form.vueContent)
// this.$refs.settingContent.editor.setValue(this.form.settingContent)
})
}
},
changeTemp (val) {
if (val == 'g2') {
this.form.settingContent = defaultG2SettingContent
this.form.vueContent = defaultG2VueContent
} else if (val == 'base') {
this.form.settingContent = defaultSettingContent
this.form.vueContent = defaultVueContent
} else if (val == 'echarts') {
this.form.settingContent = defaultEchartsSettingContent
this.form.vueContent = defaultEchartsVueContent
changeTemp(val){
if(val=='g2plot'){
this.form.settingContent=defaultG2SettingContent
this.form.vueContent=defaultG2VueContent
}else if(val=='native'){
this.form.settingContent=defaultSettingContent
this.form.vueContent=defaultVueContent
}else if(val=='echart'){
this.form.settingContent= defaultEchartsSettingContent
this.form.vueContent=defaultEchartsVueContent
}
},
change (val) {
change(val) {
if(val==='3DEchart') return this.$confirm('开发中。。。。', '提示', {
distinguishCancelAndClose: true,
confirmButtonText: '确定',
cancelButtonText: '取消',
cancelButtonClass: 'cancel-btn',
type: 'warning',
customClass: 'bs-el-message-box'
}).then(() => {
}).catch((action) => {
})
this.$confirm('确定替换为选中模板吗?未保存的代码将被覆盖!', '提示', {
distinguishCancelAndClose: true,
confirmButtonText: '确定',
@ -454,8 +476,8 @@ export default {
display: flex;
justify-content: space-between;
width: 100%;
height: 400px;
padding: 16px;
height: 354px;
padding: 5px 16px;
.left-vue-code {
width: 60%;
@ -484,8 +506,9 @@ export default {
align-items: center;
justify-content: space-between;
.code-tab-btn{
width: 90px;
// width: 90px;
cursor: pointer;
text-align: center;
}
.code-tab {
font-size: 14px;
@ -511,7 +534,7 @@ export default {
}
.code-tab-content {
height: calc(100% - 40px);
height: calc(100% - 88px);
background: var(--bs-background-1);
}
}

@ -28,6 +28,25 @@
maxlength="30"
class="bs-el-input"
/>
</el-form-item>
<el-form-item
label="组件类型"
v-if="type === 'bizComponent'"
>
<el-select
v-model="bizType"
class="bs-el-select"
popper-class="bs-el-select"
placeholder="请选择组件类型"
clearable
>
<el-option
v-for="resolutionRatioItem in BizList"
:key="resolutionRatioItem.value"
:label="resolutionRatioItem.label"
:value="resolutionRatioItem.value"
/>
</el-select>
</el-form-item>
<el-form-item
v-if="type === 'component'"
@ -126,8 +145,21 @@ export default {
},
data () {
return {
bizType:'native',
resolutionRatioValue: '',
resolutionRatio: {},
BizList:[
{
label:'echarts组件',
value:'echarts'
}, {
label:'g2Plot组件',
value:'g2plot'
}, {
label:'基础组件',
value:'native'
},
],
resolutionRatioOptions: [
{
value: '1024*768',
@ -220,6 +252,7 @@ export default {
closeAddDialog () {
this.formVisible = false
this.$refs.dataForm.resetFields()
this.bizType='native'
},
//
init (nodeData, parentCode) {
@ -422,7 +455,13 @@ export default {
//
toDesign (form) {
const path = this.type === 'component' ? (window.BS_CONFIG?.routers?.designUrl || '/big-screen/design') : 'big-screen-biz-component-design'
const { href: bigScreenHref } = this.$router.resolve({
const { href: bigScreenHref } =this.type=='bizComponent'? this.$router.resolve({
path,
query: {
code: form.code,
type:this.bizType
}
}):this.$router.resolve({
path,
query: {
code: form.code

@ -135,7 +135,11 @@ const setting = [
groupName: 'padding'
}
]
const data = []
const data = [
{
percent: 0.75
}
]
// 数据处理脚本
const dataHandler = '// 取返回数据列表的第一项指标值\noption.percent = data[0][setting.filter(settingItem=>settingItem.field === \'percent\')[0].value]'

@ -1,6 +1,6 @@
// 配置版本号
const version = '2023071001'
const version = '2023090801'
// 分类
const category = 'Liquid'
// 标题
@ -148,7 +148,11 @@ const setting = [
groupName: 'padding'
}
]
const data = []
const data = [
{
percent: 0.25
}
]
// 数据处理脚本
const dataHandler = '// 取返回数据列表的第一项指标值\noption.percent = data[0][setting.filter(settingItem=>settingItem.field === \'percent\')[0].value]'

@ -123,7 +123,11 @@ const setting = [
groupName: 'padding'
}
]
const data = []
const data = [
{
percent: 0.75
}
]
// 数据处理脚本
const dataHandler = '// 取返回数据列表的第一项指标值\noption.percent = data[0][setting.filter(settingItem=>settingItem.field === \'percent\')[0].value]'

@ -148,7 +148,11 @@ const setting = [
// 配置处理脚本
const optionHandler = 'option.color = [option.color1, option.color2]'
const data = []
const data = [
{
percent: 0.6
}
]
// 数据处理脚本
const dataHandler =
"option.percent = data[0][setting.filter(settingItem=>settingItem.field === 'percent')[0].value]"

@ -148,7 +148,11 @@ const setting = [
groupName: 'padding'
}
]
const data = [
{
percent: 0.25
}
]
// 数据处理脚本
const dataHandler = '// 取返回数据列表的第一项指标值\noption.percent = data[0][setting.filter(settingItem=>settingItem.field === \'percent\')[0].value]'
@ -157,6 +161,7 @@ const option = {
renderer: 'canvas',
color: '#598BF2',
percent: 0.25,
data,
appendPadding: [16, 16, 16, 16], // 设置图标的边距
shape: 'diamond',
outline: {

@ -18,7 +18,7 @@
>
<el-form-item
label="上级地图"
prop="parentCode"
prop="parentId"
>
<el-input
v-model="parentName"
@ -41,7 +41,7 @@
prop="mapCode"
>
<el-input
v-if="mapForm.parentCode === '0'"
v-if="mapForm.parentId === '0'"
v-model="mapForm.mapCode"
class="bs-el-input"
placeholder="请输入地图编码"
@ -71,7 +71,7 @@
>
<el-select
v-model="mapForm.level"
:disabled="mapForm.parentCode !== '0'"
:disabled="mapForm.parentId !== '0'"
class="bs-el-select"
placeholder="请选择地图级别"
popper-class="bs-el-select"
@ -171,12 +171,12 @@ export default {
},
data () {
const validateCode = (rule, value, callback) => {
if (this.mapForm.parentCode !== '0') {
if (this.mapForm.parentId !== '0') {
//
callback()
}
repeatCheck({
parentCode: this.mapForm.parentCode,
parentId: this.mapForm.parentId,
mapCode: value
}).then(res => {
if (res) {
@ -194,7 +194,6 @@ export default {
parentName: '顶级',
mapForm: {
parentId: '0',
parentCode: '0',
mapCode: '',
name: '',
level: 0,
@ -229,7 +228,6 @@ export default {
init (parentMap) {
this.mapForm = {
parentId: '0',
parentCode: '0',
mapCode: `map-${new Date().getTime()}`,
name: '',
level: 0,
@ -241,7 +239,6 @@ export default {
this.parentName = '顶级'
if (parentMap) {
this.mapForm.parentId = parentMap.id
this.mapForm.parentCode = parentMap.mapCode
this.parentName = parentMap.name
this.mapForm.level = parentMap.level + 1
this.mapForm.mapCode = ''
@ -283,13 +280,13 @@ export default {
},
getMapCodeList () {
this.mapCodeList = []
if (this.mapForm.parentCode === '0') {
if (this.mapForm.parentId === '0') {
this.mapCodeList = [{
name: `map-${new Date().getTime()}`,
exist: false
}]
} else {
getMapChildFromGeoJson(this.mapForm.parentCode).then(res => {
getMapChildFromGeoJson(this.mapForm.parentId).then(res => {
this.mapCodeList = res
})
}

@ -18,7 +18,7 @@
>
<el-form-item
label="上级地图"
prop="parentCode"
prop="parentId"
>
<el-input
v-model="parentName"
@ -162,7 +162,6 @@ export default {
parentName: '顶级',
mapForm: {
parentId: '0',
parentCode: '0',
mapCode: '',
name: '',
level: 0,

@ -232,7 +232,7 @@ export default {
level: null,
enableDown: null,
uploadedGeoJson: null,
parentCode: '0'
parentId: '0'
},
levelList: [
{
@ -296,7 +296,7 @@ export default {
load(data, treeNode, resolve) {
this.lazyResolveIds.push(data.id)
mapList({
parentCode: data.mapCode
parentId: data.id
}).then(res => {
resolve(res)
}).catch(err => {
@ -422,5 +422,6 @@ export default {
.jv-container.dark {
color: aliceblue;
background: #161A26;
height: 150px;
}
</style>

@ -2,8 +2,8 @@
<div
class="configuration-wrap"
:class="{
'active': activeCodes.includes(config.code),
'hover': hoverCode === config.code
'active': activeCodes.includes(config.code) && (!isPreview),
'hover': hoverCode === config.code && (!isPreview)
}"
@mouseenter.stop="changeHover(config.code)"
@mouseleave="changeHover('')"

Loading…
Cancel
Save