diff --git a/.gitignore b/.gitignore
index d7a4223552..dd0d793cda 100644
--- a/.gitignore
+++ b/.gitignore
@@ -52,6 +52,7 @@ pnpm-debug.log*
*.classpath
*.project
.settings/
+.lh
package-lock.json
diff --git a/backend/pom.xml b/backend/pom.xml
index 5415073b33..d30a28ec21 100644
--- a/backend/pom.xml
+++ b/backend/pom.xml
@@ -5,7 +5,7 @@
dataease-server
io.dataease
- 1.2.0
+ 1.3.0
4.0.0
@@ -214,7 +214,7 @@
org.jsoup
jsoup
- 1.10.3
+ 1.14.2
@@ -226,7 +226,7 @@
org.apache.commons
commons-compress
- 1.20
+ 1.21
@@ -252,11 +252,11 @@
20171018
-
+
net.oneandone.reflections8
@@ -316,7 +316,7 @@
io.dataease
dataease-plugin-interface
- 1.2
+ 1.3
@@ -338,10 +338,21 @@
+
+
+
+
+
+
+
+
+ ru.yandex.clickhouse
+ clickhouse-jdbc
+ 0.3.1
+
diff --git a/backend/src/main/java/io/dataease/auth/api/AuthApi.java b/backend/src/main/java/io/dataease/auth/api/AuthApi.java
index 5cdbd7151c..f5e72afbb0 100644
--- a/backend/src/main/java/io/dataease/auth/api/AuthApi.java
+++ b/backend/src/main/java/io/dataease/auth/api/AuthApi.java
@@ -5,7 +5,6 @@ import io.dataease.auth.api.dto.CurrentUserDto;
import io.dataease.auth.api.dto.LoginDto;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
-import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -41,4 +40,13 @@ public interface AuthApi {
@PostMapping("/validateName")
Boolean validateName(Map nameDto);
+ @ApiOperation("是否开启ldap")
+ @PostMapping("/isOpenLdap")
+ boolean isOpenLdap();
+
+
+ @ApiOperation("是否开启oidc")
+ @PostMapping("/isOpenOidc")
+ boolean isOpenOidc();
+
}
diff --git a/backend/src/main/java/io/dataease/auth/api/dto/LoginDto.java b/backend/src/main/java/io/dataease/auth/api/dto/LoginDto.java
index c1f0adc052..62af1ce003 100644
--- a/backend/src/main/java/io/dataease/auth/api/dto/LoginDto.java
+++ b/backend/src/main/java/io/dataease/auth/api/dto/LoginDto.java
@@ -13,4 +13,12 @@ public class LoginDto implements Serializable {
@ApiModelProperty(value = "密码", required = true)
private String password;
+
+ /**
+ * 0: 默认登录
+ * 1:ldap登录
+ * 2:单点登录
+ */
+ @ApiModelProperty(value = "登录方式", required = true, allowableValues = "0, 1, 2")
+ private int loginType;
}
diff --git a/backend/src/main/java/io/dataease/auth/entity/TokenInfo.java b/backend/src/main/java/io/dataease/auth/entity/TokenInfo.java
index ade63a71ce..e018cca48a 100644
--- a/backend/src/main/java/io/dataease/auth/entity/TokenInfo.java
+++ b/backend/src/main/java/io/dataease/auth/entity/TokenInfo.java
@@ -13,6 +13,8 @@ public class TokenInfo implements Serializable {
private Long userId;
+ /* private String idToken; */
+
public String format(){
return username + "," +userId;
}
diff --git a/backend/src/main/java/io/dataease/auth/filter/F2CLogoutFilter.java b/backend/src/main/java/io/dataease/auth/filter/F2CLogoutFilter.java
index cd5b76320f..3587c52404 100644
--- a/backend/src/main/java/io/dataease/auth/filter/F2CLogoutFilter.java
+++ b/backend/src/main/java/io/dataease/auth/filter/F2CLogoutFilter.java
@@ -4,7 +4,6 @@ import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.authc.LogoutFilter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
diff --git a/backend/src/main/java/io/dataease/auth/server/AuthServer.java b/backend/src/main/java/io/dataease/auth/server/AuthServer.java
index 74bf04c371..57bce9fbaa 100644
--- a/backend/src/main/java/io/dataease/auth/server/AuthServer.java
+++ b/backend/src/main/java/io/dataease/auth/server/AuthServer.java
@@ -14,20 +14,26 @@ import io.dataease.commons.utils.BeanUtils;
import io.dataease.commons.utils.CodingUtil;
import io.dataease.commons.utils.LogUtil;
import io.dataease.commons.utils.ServletUtils;
-
import io.dataease.exception.DataEaseException;
import io.dataease.i18n.Translator;
+import io.dataease.plugins.config.SpringContextUtil;
+import io.dataease.plugins.util.PluginUtils;
+import io.dataease.plugins.xpack.ldap.dto.request.LdapValidateRequest;
+import io.dataease.plugins.xpack.ldap.dto.response.ValidateResult;
+import io.dataease.plugins.xpack.ldap.service.LdapXpackService;
+import io.dataease.plugins.xpack.oidc.service.OidcXpackService;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
-
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import javax.servlet.http.HttpServletRequest;
+
@RestController
public class AuthServer implements AuthApi {
@@ -35,10 +41,29 @@ public class AuthServer implements AuthApi {
private AuthUserService authUserService;
+
+
@Override
public Object login(@RequestBody LoginDto loginDto) throws Exception {
String username = loginDto.getUsername();
String password = loginDto.getPassword();
+
+
+ String pwd = RsaUtil.decryptByPrivateKey(RsaProperties.privateKey, password);
+ // 增加ldap登录方式
+ Integer loginType = loginDto.getLoginType();
+ boolean isSupportLdap = authUserService.supportLdap();
+ if (loginType == 1 && isSupportLdap) {
+ LdapXpackService ldapXpackService = SpringContextUtil.getBean(LdapXpackService.class);
+ LdapValidateRequest request = LdapValidateRequest.builder().userName(username).password(pwd).build();
+ ValidateResult validateResult = ldapXpackService.login(request);
+ if (!validateResult.isSuccess()) {
+ DataEaseException.throwException(validateResult.getMsg());
+ }
+ username = validateResult.getUserName();
+ }
+ // 增加ldap登录方式
+
SysUserEntity user = authUserService.getUserByName(username);
if (ObjectUtils.isEmpty(user)) {
@@ -48,14 +73,19 @@ public class AuthServer implements AuthApi {
DataEaseException.throwException(Translator.get("i18n_id_or_pwd_error"));
}
String realPwd = user.getPassword();
- //私钥解密
- String pwd = RsaUtil.decryptByPrivateKey(RsaProperties.privateKey, password);
- //md5加密
- pwd = CodingUtil.md5(pwd);
- if (!StringUtils.equals(pwd, realPwd)) {
- DataEaseException.throwException(Translator.get("i18n_id_or_pwd_error"));
+ // 普通登录需要验证密码
+ if (loginType == 0 || !isSupportLdap) {
+ //私钥解密
+
+ //md5加密
+ pwd = CodingUtil.md5(pwd);
+
+ if (!StringUtils.equals(pwd, realPwd)) {
+ DataEaseException.throwException(Translator.get("i18n_id_or_pwd_error"));
+ }
}
+
Map result = new HashMap<>();
TokenInfo tokenInfo = TokenInfo.builder().userId(user.getUserId()).username(username).build();
String token = JWTUtils.sign(tokenInfo, realPwd);
@@ -85,6 +115,16 @@ public class AuthServer implements AuthApi {
@Override
public String logout() {
String token = ServletUtils.getToken();
+
+ if (isOpenOidc()) {
+ HttpServletRequest request = ServletUtils.request();
+ String idToken = request.getHeader("IdToken");
+ if (StringUtils.isNotBlank(idToken)) {
+ OidcXpackService oidcXpackService = SpringContextUtil.getBean(OidcXpackService.class);
+ oidcXpackService.logout(idToken);
+ }
+
+ }
if (StringUtils.isEmpty(token) || StringUtils.equals("null", token) || StringUtils.equals("undefined", token)) {
return "success";
}
@@ -108,6 +148,23 @@ public class AuthServer implements AuthApi {
return true;
}
+ @Override
+ public boolean isOpenLdap() {
+ Boolean licValid = PluginUtils.licValid();
+ if(!licValid) return false;
+ boolean open = authUserService.supportLdap();
+ return open;
+ }
+
+ @Override
+ public boolean isOpenOidc() {
+ Boolean licValid = PluginUtils.licValid();
+ if(!licValid) return false;
+ return authUserService.supportOidc();
+ }
+
+
+
/*@Override
public Boolean isLogin() {
return null;
diff --git a/backend/src/main/java/io/dataease/auth/service/AuthUserService.java b/backend/src/main/java/io/dataease/auth/service/AuthUserService.java
index 8154412bbd..22462d5fe9 100644
--- a/backend/src/main/java/io/dataease/auth/service/AuthUserService.java
+++ b/backend/src/main/java/io/dataease/auth/service/AuthUserService.java
@@ -13,6 +13,8 @@ public interface AuthUserService {
SysUserEntity getUserByName(String username);
+ SysUserEntity getUserBySub(String sub);
+
List roles(Long userId);
List permissions(Long userId);
@@ -21,6 +23,10 @@ public interface AuthUserService {
void clearCache(Long userId);
+ boolean supportLdap();
+
+ Boolean supportOidc();
+
}
diff --git a/backend/src/main/java/io/dataease/auth/service/impl/AuthUserServiceImpl.java b/backend/src/main/java/io/dataease/auth/service/impl/AuthUserServiceImpl.java
index 5e7b31d617..fe11af4de1 100644
--- a/backend/src/main/java/io/dataease/auth/service/impl/AuthUserServiceImpl.java
+++ b/backend/src/main/java/io/dataease/auth/service/impl/AuthUserServiceImpl.java
@@ -8,6 +8,11 @@ import io.dataease.base.mapper.ext.AuthMapper;
import io.dataease.auth.service.AuthUserService;
import io.dataease.commons.constants.AuthConstants;
import io.dataease.commons.utils.LogUtil;
+import io.dataease.plugins.config.SpringContextUtil;
+import io.dataease.plugins.xpack.ldap.service.LdapXpackService;
+import io.dataease.plugins.xpack.oidc.service.OidcXpackService;
+
+import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
@@ -16,6 +21,7 @@ import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
+import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
@@ -46,6 +52,11 @@ public class AuthUserServiceImpl implements AuthUserService {
return authMapper.findUserByName(username);
}
+ @Override
+ public SysUserEntity getUserBySub(String sub) {
+ return authMapper.findUserBySub(sub);
+ }
+
@Override
public List roles(Long userId){
return authMapper.roleCodes(userId);
@@ -102,4 +113,23 @@ public class AuthUserServiceImpl implements AuthUserService {
LogUtil.info("正在清除用户缓存【{}】",userId);
}
+ @Override
+ public boolean supportLdap() {
+ Map beansOfType = SpringContextUtil.getApplicationContext().getBeansOfType((LdapXpackService.class));
+ if(beansOfType.keySet().size() == 0) return false;
+ LdapXpackService ldapXpackService = SpringContextUtil.getBean(LdapXpackService.class);
+ if(ObjectUtils.isEmpty(ldapXpackService)) return false;
+ return ldapXpackService.isOpen();
+ }
+
+ @Override
+ public Boolean supportOidc() {
+ Map beansOfType = SpringContextUtil.getApplicationContext().getBeansOfType((OidcXpackService.class));
+ if(beansOfType.keySet().size() == 0) return false;
+ OidcXpackService oidcXpackService = SpringContextUtil.getBean(OidcXpackService.class);
+ if(ObjectUtils.isEmpty(oidcXpackService)) return false;
+ return oidcXpackService.isSuuportOIDC();
+ }
+
+
}
diff --git a/backend/src/main/java/io/dataease/auth/service/impl/DynamicMenuServiceImpl.java b/backend/src/main/java/io/dataease/auth/service/impl/DynamicMenuServiceImpl.java
index 70b7f9f280..667aaa09e6 100644
--- a/backend/src/main/java/io/dataease/auth/service/impl/DynamicMenuServiceImpl.java
+++ b/backend/src/main/java/io/dataease/auth/service/impl/DynamicMenuServiceImpl.java
@@ -13,7 +13,6 @@ import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
-
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
diff --git a/backend/src/main/java/io/dataease/auth/service/impl/ShiroServiceImpl.java b/backend/src/main/java/io/dataease/auth/service/impl/ShiroServiceImpl.java
index 0e9361b330..aecb307469 100644
--- a/backend/src/main/java/io/dataease/auth/service/impl/ShiroServiceImpl.java
+++ b/backend/src/main/java/io/dataease/auth/service/impl/ShiroServiceImpl.java
@@ -56,8 +56,15 @@ public class ShiroServiceImpl implements ShiroService {
// filterChainDefinitionMap.put("/axios.map", ANON);
filterChainDefinitionMap.put("/api/auth/login", ANON);
- filterChainDefinitionMap.put("/api/auth/logout", ANON);
+ // filterChainDefinitionMap.put("/api/auth/logout", ANON);
filterChainDefinitionMap.put("/api/auth/validateName", ANON);
+ filterChainDefinitionMap.put("/api/auth/isOpenLdap", ANON);
+ filterChainDefinitionMap.put("/api/auth/isOpenOidc", ANON);
+ filterChainDefinitionMap.put("/api/pluginCommon/component/*", ANON);
+ filterChainDefinitionMap.put("/plugin/oidc/authInfo", ANON);
+ filterChainDefinitionMap.put("/sso/callBack*", ANON);
+
+
filterChainDefinitionMap.put("/unauth", ANON);
filterChainDefinitionMap.put("/display/**", ANON);
filterChainDefinitionMap.put("/tokenExpired", ANON);
diff --git a/backend/src/main/java/io/dataease/auth/util/JWTUtils.java b/backend/src/main/java/io/dataease/auth/util/JWTUtils.java
index 7736983d55..544c7a9cb8 100644
--- a/backend/src/main/java/io/dataease/auth/util/JWTUtils.java
+++ b/backend/src/main/java/io/dataease/auth/util/JWTUtils.java
@@ -2,16 +2,18 @@ package io.dataease.auth.util;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
+import com.auth0.jwt.JWTCreator.Builder;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTDecodeException;
import com.auth0.jwt.interfaces.DecodedJWT;
+import com.auth0.jwt.interfaces.Verification;
import io.dataease.auth.entity.TokenInfo;
+import io.dataease.auth.entity.TokenInfo.TokenInfoBuilder;
import io.dataease.commons.utils.CommonBeanFactory;
import io.dataease.exception.DataEaseException;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.core.env.Environment;
-
import java.util.Date;
@@ -34,10 +36,13 @@ public class JWTUtils {
*/
public static boolean verify(String token, TokenInfo tokenInfo, String secret) {
Algorithm algorithm = Algorithm.HMAC256(secret);
- JWTVerifier verifier = JWT.require(algorithm)
+ Verification verification = JWT.require(algorithm)
.withClaim("username", tokenInfo.getUsername())
- .withClaim("userId", tokenInfo.getUserId())
- .build();
+ .withClaim("userId", tokenInfo.getUserId());
+ /* if (StringUtils.isNotBlank(tokenInfo.getIdToken())) {
+ verification.withClaim("idToken", tokenInfo.getIdToken());
+ } */
+ JWTVerifier verifier = verification.build();
verifier.verify(token);
return true;
}
@@ -50,10 +55,15 @@ public class JWTUtils {
DecodedJWT jwt = JWT.decode(token);
String username = jwt.getClaim("username").asString();
Long userId = jwt.getClaim("userId").asLong();
+ // String idToken = jwt.getClaim("idToken").asString();
if (StringUtils.isEmpty(username) || ObjectUtils.isEmpty(userId) ){
DataEaseException.throwException("token格式错误!");
}
- TokenInfo tokenInfo = TokenInfo.builder().username(username).userId(userId).build();
+ TokenInfoBuilder tokenInfoBuilder = TokenInfo.builder().username(username).userId(userId);
+ /* if (StringUtils.isNotBlank(idToken)) {
+ tokenInfoBuilder.idToken(idToken);
+ } */
+ TokenInfo tokenInfo = tokenInfoBuilder.build();
return tokenInfo;
}
@@ -107,12 +117,14 @@ public class JWTUtils {
try {
Date date = new Date(System.currentTimeMillis()+EXPIRE_TIME);
Algorithm algorithm = Algorithm.HMAC256(secret);
- // 附带username信息
- return JWT.create()
+ Builder builder = JWT.create()
.withClaim("username", tokenInfo.getUsername())
- .withClaim("userId", tokenInfo.getUserId())
- .withExpiresAt(date)
- .sign(algorithm);
+ .withClaim("userId", tokenInfo.getUserId());
+ /* if (StringUtils.isNotBlank(tokenInfo.getIdToken())) {
+ builder.withClaim("idToken", tokenInfo.getIdToken());
+ } */
+ return builder.withExpiresAt(date).sign(algorithm);
+
} catch (Exception e) {
return null;
}
diff --git a/backend/src/main/java/io/dataease/base/domain/ChartView.java b/backend/src/main/java/io/dataease/base/domain/ChartView.java
index 2bb2de365e..f8e662c1d5 100644
--- a/backend/src/main/java/io/dataease/base/domain/ChartView.java
+++ b/backend/src/main/java/io/dataease/base/domain/ChartView.java
@@ -1,31 +1,28 @@
package io.dataease.base.domain;
import java.io.Serializable;
-
-import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class ChartView implements Serializable {
- @ApiModelProperty("ID")
private String id;
- @ApiModelProperty("名称")
+
private String name;
- @ApiModelProperty("场景ID")
+
private String sceneId;
- @ApiModelProperty("表ID")
+
private String tableId;
- @ApiModelProperty("类型")
+
private String type;
- @ApiModelProperty("标题")
+
private String title;
- @ApiModelProperty("创建者")
+
private String createBy;
- @ApiModelProperty("创建时间")
+
private Long createTime;
- @ApiModelProperty("更新时间")
+
private Long updateTime;
- @ApiModelProperty("样式优先级")
+
private String stylePriority;
private static final long serialVersionUID = 1L;
diff --git a/backend/src/main/java/io/dataease/base/domain/ChartViewWithBLOBs.java b/backend/src/main/java/io/dataease/base/domain/ChartViewWithBLOBs.java
index 5ac886681d..61779e0cdd 100644
--- a/backend/src/main/java/io/dataease/base/domain/ChartViewWithBLOBs.java
+++ b/backend/src/main/java/io/dataease/base/domain/ChartViewWithBLOBs.java
@@ -15,15 +15,17 @@ public class ChartViewWithBLOBs extends ChartView implements Serializable {
private String xAxis;
@ApiModelProperty("y轴")
private String yAxis;
+ @ApiModelProperty("副y轴")
+ private String yAxisExt;
@ApiModelProperty("堆叠")
private String extStack;
@ApiModelProperty("气泡")
private String extBubble;
- @ApiModelProperty("客户端属性")
+ @ApiModelProperty("图形属性")
private String customAttr;
- @ApiModelProperty("客户端样式")
+ @ApiModelProperty("组件样式")
private String customStyle;
- @ApiModelProperty("客户端过滤条件")
+ @ApiModelProperty("过滤条件")
private String customFilter;
@ApiModelProperty("下钻字段")
private String drillFields;
diff --git a/backend/src/main/java/io/dataease/base/domain/Datasource.java b/backend/src/main/java/io/dataease/base/domain/Datasource.java
index 86b2bca643..37dfeefa85 100644
--- a/backend/src/main/java/io/dataease/base/domain/Datasource.java
+++ b/backend/src/main/java/io/dataease/base/domain/Datasource.java
@@ -1,29 +1,26 @@
package io.dataease.base.domain;
import java.io.Serializable;
-
-import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class Datasource implements Serializable {
- @ApiModelProperty("ID")
private String id;
- @ApiModelProperty("名称")
+
private String name;
- @ApiModelProperty("描述")
+
private String desc;
- @ApiModelProperty("类型")
+
private String type;
- @ApiModelProperty("创建时间")
+
private Long createTime;
- @ApiModelProperty("更新时间")
+
private Long updateTime;
- @ApiModelProperty("创建者")
+
private String createBy;
- @ApiModelProperty("状态")
+
private String status;
- @ApiModelProperty("配置")
+
private String configuration;
private static final long serialVersionUID = 1L;
diff --git a/backend/src/main/java/io/dataease/base/domain/PanelPdfTemplate.java b/backend/src/main/java/io/dataease/base/domain/PanelPdfTemplate.java
new file mode 100644
index 0000000000..4df504b8fc
--- /dev/null
+++ b/backend/src/main/java/io/dataease/base/domain/PanelPdfTemplate.java
@@ -0,0 +1,21 @@
+package io.dataease.base.domain;
+
+import java.io.Serializable;
+import lombok.Data;
+
+@Data
+public class PanelPdfTemplate implements Serializable {
+ private String id;
+
+ private String name;
+
+ private Long createTime;
+
+ private String createUser;
+
+ private Integer sort;
+
+ private String templateContent;
+
+ private static final long serialVersionUID = 1L;
+}
\ No newline at end of file
diff --git a/backend/src/main/java/io/dataease/base/domain/PanelPdfTemplateExample.java b/backend/src/main/java/io/dataease/base/domain/PanelPdfTemplateExample.java
new file mode 100644
index 0000000000..3f3b9d343a
--- /dev/null
+++ b/backend/src/main/java/io/dataease/base/domain/PanelPdfTemplateExample.java
@@ -0,0 +1,530 @@
+package io.dataease.base.domain;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class PanelPdfTemplateExample {
+ protected String orderByClause;
+
+ protected boolean distinct;
+
+ protected List oredCriteria;
+
+ public PanelPdfTemplateExample() {
+ oredCriteria = new ArrayList();
+ }
+
+ public void setOrderByClause(String orderByClause) {
+ this.orderByClause = orderByClause;
+ }
+
+ public String getOrderByClause() {
+ return orderByClause;
+ }
+
+ public void setDistinct(boolean distinct) {
+ this.distinct = distinct;
+ }
+
+ public boolean isDistinct() {
+ return distinct;
+ }
+
+ public List getOredCriteria() {
+ return oredCriteria;
+ }
+
+ public void or(Criteria criteria) {
+ oredCriteria.add(criteria);
+ }
+
+ public Criteria or() {
+ Criteria criteria = createCriteriaInternal();
+ oredCriteria.add(criteria);
+ return criteria;
+ }
+
+ public Criteria createCriteria() {
+ Criteria criteria = createCriteriaInternal();
+ if (oredCriteria.size() == 0) {
+ oredCriteria.add(criteria);
+ }
+ return criteria;
+ }
+
+ protected Criteria createCriteriaInternal() {
+ Criteria criteria = new Criteria();
+ return criteria;
+ }
+
+ public void clear() {
+ oredCriteria.clear();
+ orderByClause = null;
+ distinct = false;
+ }
+
+ protected abstract static class GeneratedCriteria {
+ protected List criteria;
+
+ protected GeneratedCriteria() {
+ super();
+ criteria = new ArrayList();
+ }
+
+ public boolean isValid() {
+ return criteria.size() > 0;
+ }
+
+ public List getAllCriteria() {
+ return criteria;
+ }
+
+ public List getCriteria() {
+ return criteria;
+ }
+
+ protected void addCriterion(String condition) {
+ if (condition == null) {
+ throw new RuntimeException("Value for condition cannot be null");
+ }
+ criteria.add(new Criterion(condition));
+ }
+
+ protected void addCriterion(String condition, Object value, String property) {
+ if (value == null) {
+ throw new RuntimeException("Value for " + property + " cannot be null");
+ }
+ criteria.add(new Criterion(condition, value));
+ }
+
+ protected void addCriterion(String condition, Object value1, Object value2, String property) {
+ if (value1 == null || value2 == null) {
+ throw new RuntimeException("Between values for " + property + " cannot be null");
+ }
+ criteria.add(new Criterion(condition, value1, value2));
+ }
+
+ public Criteria andIdIsNull() {
+ addCriterion("id is null");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdIsNotNull() {
+ addCriterion("id is not null");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdEqualTo(String value) {
+ addCriterion("id =", value, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdNotEqualTo(String value) {
+ addCriterion("id <>", value, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdGreaterThan(String value) {
+ addCriterion("id >", value, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdGreaterThanOrEqualTo(String value) {
+ addCriterion("id >=", value, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdLessThan(String value) {
+ addCriterion("id <", value, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdLessThanOrEqualTo(String value) {
+ addCriterion("id <=", value, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdLike(String value) {
+ addCriterion("id like", value, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdNotLike(String value) {
+ addCriterion("id not like", value, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdIn(List values) {
+ addCriterion("id in", values, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdNotIn(List values) {
+ addCriterion("id not in", values, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdBetween(String value1, String value2) {
+ addCriterion("id between", value1, value2, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andIdNotBetween(String value1, String value2) {
+ addCriterion("id not between", value1, value2, "id");
+ return (Criteria) this;
+ }
+
+ public Criteria andNameIsNull() {
+ addCriterion("`name` is null");
+ return (Criteria) this;
+ }
+
+ public Criteria andNameIsNotNull() {
+ addCriterion("`name` is not null");
+ return (Criteria) this;
+ }
+
+ public Criteria andNameEqualTo(String value) {
+ addCriterion("`name` =", value, "name");
+ return (Criteria) this;
+ }
+
+ public Criteria andNameNotEqualTo(String value) {
+ addCriterion("`name` <>", value, "name");
+ return (Criteria) this;
+ }
+
+ public Criteria andNameGreaterThan(String value) {
+ addCriterion("`name` >", value, "name");
+ return (Criteria) this;
+ }
+
+ public Criteria andNameGreaterThanOrEqualTo(String value) {
+ addCriterion("`name` >=", value, "name");
+ return (Criteria) this;
+ }
+
+ public Criteria andNameLessThan(String value) {
+ addCriterion("`name` <", value, "name");
+ return (Criteria) this;
+ }
+
+ public Criteria andNameLessThanOrEqualTo(String value) {
+ addCriterion("`name` <=", value, "name");
+ return (Criteria) this;
+ }
+
+ public Criteria andNameLike(String value) {
+ addCriterion("`name` like", value, "name");
+ return (Criteria) this;
+ }
+
+ public Criteria andNameNotLike(String value) {
+ addCriterion("`name` not like", value, "name");
+ return (Criteria) this;
+ }
+
+ public Criteria andNameIn(List values) {
+ addCriterion("`name` in", values, "name");
+ return (Criteria) this;
+ }
+
+ public Criteria andNameNotIn(List values) {
+ addCriterion("`name` not in", values, "name");
+ return (Criteria) this;
+ }
+
+ public Criteria andNameBetween(String value1, String value2) {
+ addCriterion("`name` between", value1, value2, "name");
+ return (Criteria) this;
+ }
+
+ public Criteria andNameNotBetween(String value1, String value2) {
+ addCriterion("`name` not between", value1, value2, "name");
+ return (Criteria) this;
+ }
+
+ public Criteria andCreateTimeIsNull() {
+ addCriterion("create_time is null");
+ return (Criteria) this;
+ }
+
+ public Criteria andCreateTimeIsNotNull() {
+ addCriterion("create_time is not null");
+ return (Criteria) this;
+ }
+
+ public Criteria andCreateTimeEqualTo(Long value) {
+ addCriterion("create_time =", value, "createTime");
+ return (Criteria) this;
+ }
+
+ public Criteria andCreateTimeNotEqualTo(Long value) {
+ addCriterion("create_time <>", value, "createTime");
+ return (Criteria) this;
+ }
+
+ public Criteria andCreateTimeGreaterThan(Long value) {
+ addCriterion("create_time >", value, "createTime");
+ return (Criteria) this;
+ }
+
+ public Criteria andCreateTimeGreaterThanOrEqualTo(Long value) {
+ addCriterion("create_time >=", value, "createTime");
+ return (Criteria) this;
+ }
+
+ public Criteria andCreateTimeLessThan(Long value) {
+ addCriterion("create_time <", value, "createTime");
+ return (Criteria) this;
+ }
+
+ public Criteria andCreateTimeLessThanOrEqualTo(Long value) {
+ addCriterion("create_time <=", value, "createTime");
+ return (Criteria) this;
+ }
+
+ public Criteria andCreateTimeIn(List values) {
+ addCriterion("create_time in", values, "createTime");
+ return (Criteria) this;
+ }
+
+ public Criteria andCreateTimeNotIn(List values) {
+ addCriterion("create_time not in", values, "createTime");
+ return (Criteria) this;
+ }
+
+ public Criteria andCreateTimeBetween(Long value1, Long value2) {
+ addCriterion("create_time between", value1, value2, "createTime");
+ return (Criteria) this;
+ }
+
+ public Criteria andCreateTimeNotBetween(Long value1, Long value2) {
+ addCriterion("create_time not between", value1, value2, "createTime");
+ return (Criteria) this;
+ }
+
+ public Criteria andCreateUserIsNull() {
+ addCriterion("create_user is null");
+ return (Criteria) this;
+ }
+
+ public Criteria andCreateUserIsNotNull() {
+ addCriterion("create_user is not null");
+ return (Criteria) this;
+ }
+
+ public Criteria andCreateUserEqualTo(String value) {
+ addCriterion("create_user =", value, "createUser");
+ return (Criteria) this;
+ }
+
+ public Criteria andCreateUserNotEqualTo(String value) {
+ addCriterion("create_user <>", value, "createUser");
+ return (Criteria) this;
+ }
+
+ public Criteria andCreateUserGreaterThan(String value) {
+ addCriterion("create_user >", value, "createUser");
+ return (Criteria) this;
+ }
+
+ public Criteria andCreateUserGreaterThanOrEqualTo(String value) {
+ addCriterion("create_user >=", value, "createUser");
+ return (Criteria) this;
+ }
+
+ public Criteria andCreateUserLessThan(String value) {
+ addCriterion("create_user <", value, "createUser");
+ return (Criteria) this;
+ }
+
+ public Criteria andCreateUserLessThanOrEqualTo(String value) {
+ addCriterion("create_user <=", value, "createUser");
+ return (Criteria) this;
+ }
+
+ public Criteria andCreateUserLike(String value) {
+ addCriterion("create_user like", value, "createUser");
+ return (Criteria) this;
+ }
+
+ public Criteria andCreateUserNotLike(String value) {
+ addCriterion("create_user not like", value, "createUser");
+ return (Criteria) this;
+ }
+
+ public Criteria andCreateUserIn(List values) {
+ addCriterion("create_user in", values, "createUser");
+ return (Criteria) this;
+ }
+
+ public Criteria andCreateUserNotIn(List values) {
+ addCriterion("create_user not in", values, "createUser");
+ return (Criteria) this;
+ }
+
+ public Criteria andCreateUserBetween(String value1, String value2) {
+ addCriterion("create_user between", value1, value2, "createUser");
+ return (Criteria) this;
+ }
+
+ public Criteria andCreateUserNotBetween(String value1, String value2) {
+ addCriterion("create_user not between", value1, value2, "createUser");
+ return (Criteria) this;
+ }
+
+ public Criteria andSortIsNull() {
+ addCriterion("sort is null");
+ return (Criteria) this;
+ }
+
+ public Criteria andSortIsNotNull() {
+ addCriterion("sort is not null");
+ return (Criteria) this;
+ }
+
+ public Criteria andSortEqualTo(Integer value) {
+ addCriterion("sort =", value, "sort");
+ return (Criteria) this;
+ }
+
+ public Criteria andSortNotEqualTo(Integer value) {
+ addCriterion("sort <>", value, "sort");
+ return (Criteria) this;
+ }
+
+ public Criteria andSortGreaterThan(Integer value) {
+ addCriterion("sort >", value, "sort");
+ return (Criteria) this;
+ }
+
+ public Criteria andSortGreaterThanOrEqualTo(Integer value) {
+ addCriterion("sort >=", value, "sort");
+ return (Criteria) this;
+ }
+
+ public Criteria andSortLessThan(Integer value) {
+ addCriterion("sort <", value, "sort");
+ return (Criteria) this;
+ }
+
+ public Criteria andSortLessThanOrEqualTo(Integer value) {
+ addCriterion("sort <=", value, "sort");
+ return (Criteria) this;
+ }
+
+ public Criteria andSortIn(List values) {
+ addCriterion("sort in", values, "sort");
+ return (Criteria) this;
+ }
+
+ public Criteria andSortNotIn(List values) {
+ addCriterion("sort not in", values, "sort");
+ return (Criteria) this;
+ }
+
+ public Criteria andSortBetween(Integer value1, Integer value2) {
+ addCriterion("sort between", value1, value2, "sort");
+ return (Criteria) this;
+ }
+
+ public Criteria andSortNotBetween(Integer value1, Integer value2) {
+ addCriterion("sort not between", value1, value2, "sort");
+ return (Criteria) this;
+ }
+ }
+
+ public static class Criteria extends GeneratedCriteria {
+
+ protected Criteria() {
+ super();
+ }
+ }
+
+ public static class Criterion {
+ private String condition;
+
+ private Object value;
+
+ private Object secondValue;
+
+ private boolean noValue;
+
+ private boolean singleValue;
+
+ private boolean betweenValue;
+
+ private boolean listValue;
+
+ private String typeHandler;
+
+ public String getCondition() {
+ return condition;
+ }
+
+ public Object getValue() {
+ return value;
+ }
+
+ public Object getSecondValue() {
+ return secondValue;
+ }
+
+ public boolean isNoValue() {
+ return noValue;
+ }
+
+ public boolean isSingleValue() {
+ return singleValue;
+ }
+
+ public boolean isBetweenValue() {
+ return betweenValue;
+ }
+
+ public boolean isListValue() {
+ return listValue;
+ }
+
+ public String getTypeHandler() {
+ return typeHandler;
+ }
+
+ protected Criterion(String condition) {
+ super();
+ this.condition = condition;
+ this.typeHandler = null;
+ this.noValue = true;
+ }
+
+ protected Criterion(String condition, Object value, String typeHandler) {
+ super();
+ this.condition = condition;
+ this.value = value;
+ this.typeHandler = typeHandler;
+ if (value instanceof List>) {
+ this.listValue = true;
+ } else {
+ this.singleValue = true;
+ }
+ }
+
+ protected Criterion(String condition, Object value) {
+ this(condition, value, null);
+ }
+
+ protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+ super();
+ this.condition = condition;
+ this.value = value;
+ this.secondValue = secondValue;
+ this.typeHandler = typeHandler;
+ this.betweenValue = true;
+ }
+
+ protected Criterion(String condition, Object value, Object secondValue) {
+ this(condition, value, secondValue, null);
+ }
+ }
+}
\ No newline at end of file
diff --git a/backend/src/main/java/io/dataease/base/domain/SysUser.java b/backend/src/main/java/io/dataease/base/domain/SysUser.java
index 6ebfbcf4d3..8867cc75c4 100644
--- a/backend/src/main/java/io/dataease/base/domain/SysUser.java
+++ b/backend/src/main/java/io/dataease/base/domain/SysUser.java
@@ -1,59 +1,45 @@
package io.dataease.base.domain;
import java.io.Serializable;
-
-import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class SysUser implements Serializable {
- @ApiModelProperty(value = "用户ID" , allowEmptyValue = false, position = 0)
private Long userId;
- @ApiModelProperty(value = "组织ID" , allowEmptyValue = false, position = 7)
private Long deptId;
- @ApiModelProperty(value = "账号" , required = true)
private String username;
- @ApiModelProperty(value = "姓名" , required = true, position = 2)
private String nickName;
- @ApiModelProperty(value = "性别" ,allowableValues = "男,女", allowEmptyValue = true, position = 5)
private String gender;
- @ApiModelProperty(value = "电话" , allowEmptyValue = true, position = 1)
private String phone;
- @ApiModelProperty(value = "邮箱" , required = true, position = 3)
private String email;
- @ApiModelProperty(value = "密码" , required = true, position = 4)
private String password;
- @ApiModelProperty(hidden = true)
private Boolean isAdmin;
- @ApiModelProperty(value = "状态" , allowableValues = "1,0", required = true, position = 6)
private Long enabled;
- @ApiModelProperty(hidden = true)
private String createBy;
- @ApiModelProperty(hidden = true)
private String updateBy;
- @ApiModelProperty(hidden = true)
private Long pwdResetTime;
- @ApiModelProperty(hidden = true)
private Long createTime;
- @ApiModelProperty(hidden = true)
private Long updateTime;
- @ApiModelProperty(hidden = true)
private String language;
+ private Integer from;
+
+ private String sub;
+
private static final long serialVersionUID = 1L;
}
\ No newline at end of file
diff --git a/backend/src/main/java/io/dataease/base/domain/SysUserExample.java b/backend/src/main/java/io/dataease/base/domain/SysUserExample.java
index 27cef73bb8..1b8fc36618 100644
--- a/backend/src/main/java/io/dataease/base/domain/SysUserExample.java
+++ b/backend/src/main/java/io/dataease/base/domain/SysUserExample.java
@@ -1153,6 +1153,136 @@ public class SysUserExample {
addCriterion("`language` not between", value1, value2, "language");
return (Criteria) this;
}
+
+ public Criteria andFromIsNull() {
+ addCriterion("`from` is null");
+ return (Criteria) this;
+ }
+
+ public Criteria andFromIsNotNull() {
+ addCriterion("`from` is not null");
+ return (Criteria) this;
+ }
+
+ public Criteria andFromEqualTo(Integer value) {
+ addCriterion("`from` =", value, "from");
+ return (Criteria) this;
+ }
+
+ public Criteria andFromNotEqualTo(Integer value) {
+ addCriterion("`from` <>", value, "from");
+ return (Criteria) this;
+ }
+
+ public Criteria andFromGreaterThan(Integer value) {
+ addCriterion("`from` >", value, "from");
+ return (Criteria) this;
+ }
+
+ public Criteria andFromGreaterThanOrEqualTo(Integer value) {
+ addCriterion("`from` >=", value, "from");
+ return (Criteria) this;
+ }
+
+ public Criteria andFromLessThan(Integer value) {
+ addCriterion("`from` <", value, "from");
+ return (Criteria) this;
+ }
+
+ public Criteria andFromLessThanOrEqualTo(Integer value) {
+ addCriterion("`from` <=", value, "from");
+ return (Criteria) this;
+ }
+
+ public Criteria andFromIn(List values) {
+ addCriterion("`from` in", values, "from");
+ return (Criteria) this;
+ }
+
+ public Criteria andFromNotIn(List values) {
+ addCriterion("`from` not in", values, "from");
+ return (Criteria) this;
+ }
+
+ public Criteria andFromBetween(Integer value1, Integer value2) {
+ addCriterion("`from` between", value1, value2, "from");
+ return (Criteria) this;
+ }
+
+ public Criteria andFromNotBetween(Integer value1, Integer value2) {
+ addCriterion("`from` not between", value1, value2, "from");
+ return (Criteria) this;
+ }
+
+ public Criteria andSubIsNull() {
+ addCriterion("sub is null");
+ return (Criteria) this;
+ }
+
+ public Criteria andSubIsNotNull() {
+ addCriterion("sub is not null");
+ return (Criteria) this;
+ }
+
+ public Criteria andSubEqualTo(String value) {
+ addCriterion("sub =", value, "sub");
+ return (Criteria) this;
+ }
+
+ public Criteria andSubNotEqualTo(String value) {
+ addCriterion("sub <>", value, "sub");
+ return (Criteria) this;
+ }
+
+ public Criteria andSubGreaterThan(String value) {
+ addCriterion("sub >", value, "sub");
+ return (Criteria) this;
+ }
+
+ public Criteria andSubGreaterThanOrEqualTo(String value) {
+ addCriterion("sub >=", value, "sub");
+ return (Criteria) this;
+ }
+
+ public Criteria andSubLessThan(String value) {
+ addCriterion("sub <", value, "sub");
+ return (Criteria) this;
+ }
+
+ public Criteria andSubLessThanOrEqualTo(String value) {
+ addCriterion("sub <=", value, "sub");
+ return (Criteria) this;
+ }
+
+ public Criteria andSubLike(String value) {
+ addCriterion("sub like", value, "sub");
+ return (Criteria) this;
+ }
+
+ public Criteria andSubNotLike(String value) {
+ addCriterion("sub not like", value, "sub");
+ return (Criteria) this;
+ }
+
+ public Criteria andSubIn(List values) {
+ addCriterion("sub in", values, "sub");
+ return (Criteria) this;
+ }
+
+ public Criteria andSubNotIn(List values) {
+ addCriterion("sub not in", values, "sub");
+ return (Criteria) this;
+ }
+
+ public Criteria andSubBetween(String value1, String value2) {
+ addCriterion("sub between", value1, value2, "sub");
+ return (Criteria) this;
+ }
+
+ public Criteria andSubNotBetween(String value1, String value2) {
+ addCriterion("sub not between", value1, value2, "sub");
+ return (Criteria) this;
+ }
}
public static class Criteria extends GeneratedCriteria {
diff --git a/backend/src/main/java/io/dataease/base/mapper/ChartViewMapper.xml b/backend/src/main/java/io/dataease/base/mapper/ChartViewMapper.xml
index 10137408e3..72b2eaaca0 100644
--- a/backend/src/main/java/io/dataease/base/mapper/ChartViewMapper.xml
+++ b/backend/src/main/java/io/dataease/base/mapper/ChartViewMapper.xml
@@ -16,6 +16,7 @@
+
@@ -87,7 +88,7 @@
style_priority
- x_axis, y_axis, ext_stack, ext_bubble, custom_attr, custom_style, custom_filter,
+ x_axis, y_axis, y_axis_ext, ext_stack, ext_bubble, custom_attr, custom_style, custom_filter,
drill_fields, snapshot
@@ -79,7 +81,8 @@
user_id, dept_id, username, nick_name, gender, phone, email, `password`, is_admin,
- enabled, create_by, update_by, pwd_reset_time, create_time, update_time, `language`
+ enabled, create_by, update_by, pwd_reset_time, create_time, update_time, `language`,
+ `from`, sub
select
@@ -117,13 +120,15 @@
email, `password`, is_admin,
enabled, create_by, update_by,
pwd_reset_time, create_time, update_time,
- `language`)
+ `language`, `from`, sub
+ )
values (#{userId,jdbcType=BIGINT}, #{deptId,jdbcType=BIGINT}, #{username,jdbcType=VARCHAR},
#{nickName,jdbcType=VARCHAR}, #{gender,jdbcType=VARCHAR}, #{phone,jdbcType=VARCHAR},
#{email,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR}, #{isAdmin,jdbcType=BIT},
#{enabled,jdbcType=BIGINT}, #{createBy,jdbcType=VARCHAR}, #{updateBy,jdbcType=VARCHAR},
#{pwdResetTime,jdbcType=BIGINT}, #{createTime,jdbcType=BIGINT}, #{updateTime,jdbcType=BIGINT},
- #{language,jdbcType=VARCHAR})
+ #{language,jdbcType=VARCHAR}, #{from,jdbcType=INTEGER}, #{sub,jdbcType=VARCHAR}
+ )
insert into sys_user
@@ -176,6 +181,12 @@
`language`,
+
+ `from`,
+
+
+ sub,
+
@@ -226,6 +237,12 @@
#{language,jdbcType=VARCHAR},
+
+ #{from,jdbcType=INTEGER},
+
+
+ #{sub,jdbcType=VARCHAR},
+
@@ -285,6 +302,12 @@
`language` = #{record.language,jdbcType=VARCHAR},
+
+ `from` = #{record.from,jdbcType=INTEGER},
+
+
+ sub = #{record.sub,jdbcType=VARCHAR},
+
@@ -307,7 +330,9 @@
pwd_reset_time = #{record.pwdResetTime,jdbcType=BIGINT},
create_time = #{record.createTime,jdbcType=BIGINT},
update_time = #{record.updateTime,jdbcType=BIGINT},
- `language` = #{record.language,jdbcType=VARCHAR}
+ `language` = #{record.language,jdbcType=VARCHAR},
+ `from` = #{record.from,jdbcType=INTEGER},
+ sub = #{record.sub,jdbcType=VARCHAR}
@@ -360,6 +385,12 @@
`language` = #{language,jdbcType=VARCHAR},
+
+ `from` = #{from,jdbcType=INTEGER},
+
+
+ sub = #{sub,jdbcType=VARCHAR},
+
where user_id = #{userId,jdbcType=BIGINT}
@@ -379,7 +410,9 @@
pwd_reset_time = #{pwdResetTime,jdbcType=BIGINT},
create_time = #{createTime,jdbcType=BIGINT},
update_time = #{updateTime,jdbcType=BIGINT},
- `language` = #{language,jdbcType=VARCHAR}
+ `language` = #{language,jdbcType=VARCHAR},
+ `from` = #{from,jdbcType=INTEGER},
+ sub = #{sub,jdbcType=VARCHAR}
where user_id = #{userId,jdbcType=BIGINT}
\ No newline at end of file
diff --git a/backend/src/main/java/io/dataease/base/mapper/ext/AuthMapper.java b/backend/src/main/java/io/dataease/base/mapper/ext/AuthMapper.java
index d082a0faea..2b1355256f 100644
--- a/backend/src/main/java/io/dataease/base/mapper/ext/AuthMapper.java
+++ b/backend/src/main/java/io/dataease/base/mapper/ext/AuthMapper.java
@@ -25,6 +25,8 @@ public interface AuthMapper {
SysUserEntity findUserByName(@Param("username") String username);
+ SysUserEntity findUserBySub(@Param("sub") String sub);
+
List roles(@Param("userId") Long userId);
diff --git a/backend/src/main/java/io/dataease/base/mapper/ext/AuthMapper.xml b/backend/src/main/java/io/dataease/base/mapper/ext/AuthMapper.xml
index 981dfc5c93..3492d7ec10 100644
--- a/backend/src/main/java/io/dataease/base/mapper/ext/AuthMapper.xml
+++ b/backend/src/main/java/io/dataease/base/mapper/ext/AuthMapper.xml
@@ -28,6 +28,10 @@
select user_id, username,nick_name, dept_id, password, enabled,email, phone, language ,is_admin from sys_user where username = #{username}
+
+ select user_id, username,nick_name, dept_id, password, enabled,email, phone, language ,is_admin from sys_user where sub = #{sub}
+
+
select r.id from sys_role r
left join sys_users_roles sur on sur.role_id = r.role_id
diff --git a/backend/src/main/java/io/dataease/base/mapper/ext/ExtDataSourceMapper.xml b/backend/src/main/java/io/dataease/base/mapper/ext/ExtDataSourceMapper.xml
index d2dd06d0b8..0c994290b9 100644
--- a/backend/src/main/java/io/dataease/base/mapper/ext/ExtDataSourceMapper.xml
+++ b/backend/src/main/java/io/dataease/base/mapper/ext/ExtDataSourceMapper.xml
@@ -8,7 +8,7 @@
- select id , name , `desc` ,`type` , configuration ,create_time ,update_time,
+ select datasource.*,
authInfo.privileges as `privileges`
from (select GET_V_AUTH_MODEL_ID_P_USE (#{extendCondition}, 'link') cids) t,datasource
left join (
@@ -55,7 +55,7 @@
- select id , name , `desc` ,`type` , configuration ,create_time ,update_time, status,
+ select datasource.*,
authInfo.privileges as `privileges`
from (select GET_V_AUTH_MODEL_ID_P_USE (#{userId}, 'link') cids) t,datasource
left join (
diff --git a/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelViewMapper.xml b/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelViewMapper.xml
index 8e0a523da4..82b22623a3 100644
--- a/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelViewMapper.xml
+++ b/backend/src/main/java/io/dataease/base/mapper/ext/ExtPanelViewMapper.xml
@@ -17,7 +17,7 @@
FIND_IN_SET(chart_group.id,cids)
- order by create_time desc
+ order by `type` desc,name asc
@@ -27,7 +27,7 @@
FIND_IN_SET(chart_view.id,cids)
- order by create_time desc
+ order by `type` desc,name asc
diff --git a/backend/src/main/java/io/dataease/base/mapper/ext/ExtSysUserMapper.java b/backend/src/main/java/io/dataease/base/mapper/ext/ExtSysUserMapper.java
index b12402e76e..40e31cd7af 100644
--- a/backend/src/main/java/io/dataease/base/mapper/ext/ExtSysUserMapper.java
+++ b/backend/src/main/java/io/dataease/base/mapper/ext/ExtSysUserMapper.java
@@ -7,4 +7,6 @@ import java.util.List;
public interface ExtSysUserMapper {
List query(GridExample example);
+
+ List ldapUserNames(Integer from);
}
diff --git a/backend/src/main/java/io/dataease/base/mapper/ext/ExtSysUserMapper.xml b/backend/src/main/java/io/dataease/base/mapper/ext/ExtSysUserMapper.xml
index b7af624db4..cc1bfa5e25 100644
--- a/backend/src/main/java/io/dataease/base/mapper/ext/ExtSysUserMapper.xml
+++ b/backend/src/main/java/io/dataease/base/mapper/ext/ExtSysUserMapper.xml
@@ -62,4 +62,8 @@
left join sys_role r on r.role_id = sur.role_id
where sur.user_id = #{user_id}
+
+
+ select username from sys_user u where u.from = #{from}
+
diff --git a/backend/src/main/java/io/dataease/commons/constants/AuthConstants.java b/backend/src/main/java/io/dataease/commons/constants/AuthConstants.java
index b78abf26f8..4e06f9216f 100644
--- a/backend/src/main/java/io/dataease/commons/constants/AuthConstants.java
+++ b/backend/src/main/java/io/dataease/commons/constants/AuthConstants.java
@@ -6,6 +6,7 @@ public class AuthConstants {
public final static String USER_CACHE_NAME = "users_info";
public final static String USER_ROLE_CACHE_NAME = "users_roles_info";
public final static String USER_PERMISSION_CACHE_NAME = "users_permissions_info";
+ public final static String ID_TOKEN_KEY = "IdToken";
}
diff --git a/backend/src/main/java/io/dataease/commons/constants/DeTypeConstants.java b/backend/src/main/java/io/dataease/commons/constants/DeTypeConstants.java
index 50a925c2ee..a03ca54f05 100644
--- a/backend/src/main/java/io/dataease/commons/constants/DeTypeConstants.java
+++ b/backend/src/main/java/io/dataease/commons/constants/DeTypeConstants.java
@@ -7,6 +7,7 @@ public class DeTypeConstants {
public final static Integer DE_INT = 2;
public final static Integer DE_FLOAT = 3;
public final static Integer DE_BOOL = 4;
- public final static Integer DE_Binary = 5;
+ public final static Integer DE_LOCATION = 5;
+ public final static Integer DE_BINARY = 6;
}
diff --git a/backend/src/main/java/io/dataease/commons/license/DefaultLicenseService.java b/backend/src/main/java/io/dataease/commons/license/DefaultLicenseService.java
index f79f9afc54..fd30061367 100644
--- a/backend/src/main/java/io/dataease/commons/license/DefaultLicenseService.java
+++ b/backend/src/main/java/io/dataease/commons/license/DefaultLicenseService.java
@@ -45,9 +45,12 @@ public class DefaultLicenseService {
}
return f2CLicenseResponse;
}catch (Exception e){
- e.printStackTrace();
- return F2CLicenseResponse.invalid(e.getMessage());
+ LogUtil.error(e.getMessage());
+ // e.printStackTrace();
+ // return F2CLicenseResponse.invalid(e.getMessage());
+ return F2CLicenseResponse.noRecord();
}
+
}
diff --git a/backend/src/main/java/io/dataease/commons/utils/DateUtils.java b/backend/src/main/java/io/dataease/commons/utils/DateUtils.java
index e750ced0c6..4da7f5721b 100644
--- a/backend/src/main/java/io/dataease/commons/utils/DateUtils.java
+++ b/backend/src/main/java/io/dataease/commons/utils/DateUtils.java
@@ -95,7 +95,7 @@ public class DateUtils {
}
- public static void main(String[] args) throws Exception {
+ /* public static void main(String[] args) throws Exception {
// System.out.println("start:");
Date paramTime = getTime(getTimeString(new Long("1607672440731")));
@@ -110,7 +110,7 @@ public class DateUtils {
// System.out.println(getTimeString(--countTimeLong));
- }
+ } */
/**
diff --git a/backend/src/main/java/io/dataease/commons/utils/ExcelReaderUtil.java b/backend/src/main/java/io/dataease/commons/utils/ExcelReaderUtil.java
index 53249d256b..c2f80fbdff 100644
--- a/backend/src/main/java/io/dataease/commons/utils/ExcelReaderUtil.java
+++ b/backend/src/main/java/io/dataease/commons/utils/ExcelReaderUtil.java
@@ -68,8 +68,8 @@ public class ExcelReaderUtil {
}
}
- public static void main(String[] args) throws Exception {
+ /* public static void main(String[] args) throws Exception {
String file ="Metersphere_case_DataEase功能用例.xlsx";
ExcelReaderUtil.readExcel(file, new FileInputStream("/Users/taojinlong/Desktop/" + file));
- }
+ } */
}
diff --git a/backend/src/main/java/io/dataease/controller/panel/PanelPdfTemplateController.java b/backend/src/main/java/io/dataease/controller/panel/PanelPdfTemplateController.java
new file mode 100644
index 0000000000..9d9bef9d16
--- /dev/null
+++ b/backend/src/main/java/io/dataease/controller/panel/PanelPdfTemplateController.java
@@ -0,0 +1,33 @@
+package io.dataease.controller.panel;
+
+import com.github.xiaoymin.knife4j.annotations.ApiSupport;
+import io.dataease.base.domain.PanelPdfTemplate;
+import io.dataease.service.panel.PanelPdfTemplateService;
+import io.swagger.annotations.Api;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+
+/**
+ * Author: wangjiahao
+ * Date: 2021-03-05
+ * Description:
+ */
+@Api(tags = "仪表板:PDF导出模板")
+@ApiSupport(order = 170)
+@RestController
+@RequestMapping("pdf-template")
+public class PanelPdfTemplateController {
+
+ @Resource
+ private PanelPdfTemplateService panelPdfTemplateService;
+
+ @GetMapping("queryAll")
+ public List queryAll(){
+ return panelPdfTemplateService.queryAll();
+ }
+
+
+}
diff --git a/backend/src/main/java/io/dataease/controller/sys/MsgController.java b/backend/src/main/java/io/dataease/controller/sys/MsgController.java
index 729edbae37..b100aea861 100644
--- a/backend/src/main/java/io/dataease/controller/sys/MsgController.java
+++ b/backend/src/main/java/io/dataease/controller/sys/MsgController.java
@@ -6,7 +6,6 @@ import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import io.dataease.base.domain.SysMsgChannel;
import io.dataease.base.domain.SysMsgSetting;
import io.dataease.base.domain.SysMsgType;
-import io.dataease.commons.exception.DEException;
import io.dataease.commons.utils.AuthUtils;
import io.dataease.commons.utils.PageUtils;
import io.dataease.commons.utils.Pager;
@@ -71,6 +70,12 @@ public class MsgController {
sysMsgService.setBatchReaded(msgIds);
}
+ @ApiOperation("全部设置已读")
+ @PostMapping("/allRead")
+ public void allRead() {
+ sysMsgService.setAllRead();
+ }
+
@ApiOperation("批量删除")
@PostMapping("/batchDelete")
public void batchDelete(@RequestBody List msgIds) {
diff --git a/backend/src/main/java/io/dataease/controller/sys/SysUserController.java b/backend/src/main/java/io/dataease/controller/sys/SysUserController.java
index 0a1052f787..fc8978f56c 100644
--- a/backend/src/main/java/io/dataease/controller/sys/SysUserController.java
+++ b/backend/src/main/java/io/dataease/controller/sys/SysUserController.java
@@ -10,6 +10,7 @@ import io.dataease.commons.utils.AuthUtils;
import io.dataease.commons.utils.PageUtils;
import io.dataease.commons.utils.Pager;
import io.dataease.controller.sys.base.BaseGridRequest;
+import io.dataease.controller.sys.request.LdapAddRequest;
import io.dataease.controller.sys.request.SysUserCreateRequest;
import io.dataease.controller.sys.request.SysUserPwdRequest;
import io.dataease.controller.sys.request.SysUserStateRequest;
@@ -127,4 +128,18 @@ public class SysUserController {
Pager> listPager = PageUtils.setPageInfo(page, sysRoleService.query(request));
return listPager;
}
+
+
+ @ApiOperation("同步用户")
+ @PostMapping("/sync")
+ public void importLdap(@RequestBody LdapAddRequest request) {
+ sysUserService.saveLdapUsers(request);
+ }
+
+ @ApiOperation("已同步用户")
+ @PostMapping("/existLdapUsers")
+ public List getExistLdapUsers() {
+ return sysUserService.ldapUserNames();
+ }
+
}
diff --git a/backend/src/main/java/io/dataease/controller/sys/request/LdapAddRequest.java b/backend/src/main/java/io/dataease/controller/sys/request/LdapAddRequest.java
new file mode 100644
index 0000000000..e115541fcf
--- /dev/null
+++ b/backend/src/main/java/io/dataease/controller/sys/request/LdapAddRequest.java
@@ -0,0 +1,19 @@
+package io.dataease.controller.sys.request;
+
+import io.dataease.plugins.common.entity.XpackLdapUserEntity;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+public class LdapAddRequest implements Serializable {
+
+ private Long deptId;
+
+ private List roleIds;
+
+ private Long enabled;
+
+ private List users;
+}
diff --git a/backend/src/main/java/io/dataease/datasource/constants/DatasourceTypes.java b/backend/src/main/java/io/dataease/datasource/constants/DatasourceTypes.java
index 3724c7f8ea..c9da730433 100644
--- a/backend/src/main/java/io/dataease/datasource/constants/DatasourceTypes.java
+++ b/backend/src/main/java/io/dataease/datasource/constants/DatasourceTypes.java
@@ -6,7 +6,9 @@ public enum DatasourceTypes {
pg("pg", "pg", "org.postgresql.Driver", "\"", "\"", "\"", "\""),
sqlServer("sqlServer", "sqlServer", "com.microsoft.sqlserver.jdbc.SQLServerDriver", "\"", "\"", "\"", "\""),
doris("doris", "doris", "com.mysql.jdbc.Driver", "`", "`", "", ""),
- oracle("oracle", "oracle", "oracle.jdbc.driver.OracleDriver", "\"", "\"", "\"", "\"");
+ oracle("oracle", "oracle", "oracle.jdbc.driver.OracleDriver", "\"", "\"", "\"", "\""),
+ ck("ch", "ch", "ru.yandex.clickhouse.ClickHouseDriver", "`", "`", "'", "'"),
+ es("es", "es", "", "\"", "\"", "\"", "\"");
private String feature;
private String desc;
diff --git a/backend/src/main/java/io/dataease/datasource/dto/CHConfigration.java b/backend/src/main/java/io/dataease/datasource/dto/CHConfigration.java
new file mode 100644
index 0000000000..5031769a5e
--- /dev/null
+++ b/backend/src/main/java/io/dataease/datasource/dto/CHConfigration.java
@@ -0,0 +1,19 @@
+package io.dataease.datasource.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class CHConfigration extends JdbcDTO {
+
+ private String driver = "ru.yandex.clickhouse.ClickHouseDriver";
+
+ public String getJdbc() {
+ // 连接参数先写死,后边要把编码、时区等参数放到数据源的设置中
+ return "jdbc:clickhouse://HOSTNAME:PORT/DATABASE"
+ .replace("HOSTNAME", getHost().trim())
+ .replace("PORT", getPort().toString().trim())
+ .replace("DATABASE", getDataBase().trim());
+ }
+}
\ No newline at end of file
diff --git a/backend/src/main/java/io/dataease/datasource/dto/EsConfigDTO.java b/backend/src/main/java/io/dataease/datasource/dto/EsConfigDTO.java
new file mode 100644
index 0000000000..b879eeb309
--- /dev/null
+++ b/backend/src/main/java/io/dataease/datasource/dto/EsConfigDTO.java
@@ -0,0 +1,16 @@
+package io.dataease.datasource.dto;
+
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class EsConfigDTO {
+ private String url;
+ private String username;
+ private String password;
+ private String version;
+ private String uri;
+ private String dataSourceType = "es";
+}
diff --git a/backend/src/main/java/io/dataease/datasource/dto/MysqlConfigration.java b/backend/src/main/java/io/dataease/datasource/dto/MysqlConfigration.java
index a94e3d0c4a..fcaeec3906 100644
--- a/backend/src/main/java/io/dataease/datasource/dto/MysqlConfigration.java
+++ b/backend/src/main/java/io/dataease/datasource/dto/MysqlConfigration.java
@@ -11,7 +11,7 @@ public class MysqlConfigration extends JdbcDTO {
public String getJdbc() {
// 连接参数先写死,后边要把编码、时区等参数放到数据源的设置中
- return "jdbc:mysql://HOSTNAME:PORT/DATABASE?characterEncoding=UTF-8&connectTimeout=5000"
+ return "jdbc:mysql://HOSTNAME:PORT/DATABASE?characterEncoding=UTF-8&connectTimeout=5000&useSSL=false"
.replace("HOSTNAME", getHost().trim())
.replace("PORT", getPort().toString().trim())
.replace("DATABASE", getDataBase().trim());
diff --git a/backend/src/main/java/io/dataease/datasource/dto/es/EsReponse.java b/backend/src/main/java/io/dataease/datasource/dto/es/EsReponse.java
new file mode 100644
index 0000000000..d40f214d53
--- /dev/null
+++ b/backend/src/main/java/io/dataease/datasource/dto/es/EsReponse.java
@@ -0,0 +1,29 @@
+package io.dataease.datasource.dto.es;
+
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+public class EsReponse {
+ private Listcolumns = new ArrayList<>();
+ private Listrows = new ArrayList<>();
+ private String cursor;
+ private Integer status;
+ private Error error;
+ private String version;
+
+ @Data
+ public class Error{
+ private String type;
+ private String reason;
+ }
+
+ @Data
+ public class Column {
+ private String name;
+ private String type;
+ }
+
+}
diff --git a/backend/src/main/java/io/dataease/datasource/dto/es/Requst.java b/backend/src/main/java/io/dataease/datasource/dto/es/Requst.java
new file mode 100644
index 0000000000..1e0bb8a608
--- /dev/null
+++ b/backend/src/main/java/io/dataease/datasource/dto/es/Requst.java
@@ -0,0 +1,9 @@
+package io.dataease.datasource.dto.es;
+
+import lombok.Data;
+
+@Data
+public class Requst {
+ private String query;
+ private Integer fetch_size = 10000;
+}
diff --git a/backend/src/main/java/io/dataease/datasource/dto/es/RequstWithCursor.java b/backend/src/main/java/io/dataease/datasource/dto/es/RequstWithCursor.java
new file mode 100644
index 0000000000..cb79c3460e
--- /dev/null
+++ b/backend/src/main/java/io/dataease/datasource/dto/es/RequstWithCursor.java
@@ -0,0 +1,8 @@
+package io.dataease.datasource.dto.es;
+
+import lombok.Data;
+
+@Data
+public class RequstWithCursor extends Requst{
+ private String cursor;
+}
diff --git a/backend/src/main/java/io/dataease/datasource/provider/EsProvider.java b/backend/src/main/java/io/dataease/datasource/provider/EsProvider.java
new file mode 100644
index 0000000000..4e0bf23afb
--- /dev/null
+++ b/backend/src/main/java/io/dataease/datasource/provider/EsProvider.java
@@ -0,0 +1,258 @@
+package io.dataease.datasource.provider;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.google.gson.Gson;
+import com.mchange.v2.c3p0.ComboPooledDataSource;
+import io.dataease.commons.utils.HttpClientConfig;
+import io.dataease.commons.utils.HttpClientUtil;
+import io.dataease.datasource.dto.*;
+import io.dataease.datasource.dto.es.EsReponse;
+import io.dataease.datasource.dto.es.Requst;
+import io.dataease.datasource.dto.es.RequstWithCursor;
+import io.dataease.datasource.request.DatasourceRequest;
+import io.dataease.exception.DataEaseException;
+import io.dataease.i18n.Translator;
+import io.dataease.provider.es.EsQueryProvider;
+import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.lang.StringUtils;
+import org.apache.http.HttpHeaders;
+import org.springframework.stereotype.Service;
+
+import java.nio.charset.StandardCharsets;
+import java.util.*;
+
+@Service("es")
+public class EsProvider extends DatasourceProvider {
+
+ private static Map jdbcConnection = new HashMap<>();
+ private static int initPoolSize = 5;
+ private static int maxConnections = 200;
+
+ /**
+ * 增加缓存机制 key 由 'provider_sql_' dsr.datasource.id dsr.table dsr.query共4部分组成,命中则使用缓存直接返回不再执行sql逻辑
+ * @param dsr
+ * @return
+ * @throws Exception
+ */
+ /**
+ * 这里使用声明式缓存不是很妥当
+ * 改为chartViewService中使用编程式缓存
+ @Cacheable(
+ value = JdbcConstants.JDBC_PROVIDER_KEY,
+ key = "'provider_sql_' + #dsr.datasource.id + '_' + #dsr.table + '_' + #dsr.query",
+ condition = "#dsr.pageSize == null || #dsr.pageSize == 0L"
+ )
+ */
+ @Override
+ public List getData(DatasourceRequest dsr) throws Exception {
+ List list = new LinkedList<>();
+ try {
+ EsConfigDTO esConfigDTO = new Gson().fromJson(dsr.getDatasource().getConfiguration(), EsConfigDTO.class);
+
+ HttpClientConfig httpClientConfig = new HttpClientConfig();
+ String auth = esConfigDTO.getUsername() + ":" + esConfigDTO.getPassword();
+ byte[] encodedAuth = Base64.encodeBase64(auth.getBytes(StandardCharsets.UTF_8));
+ httpClientConfig.addHeader(HttpHeaders.AUTHORIZATION, "Basic " + new String(encodedAuth));
+ Requst requst = new Requst();
+ requst.setQuery(dsr.getQuery());
+ requst.setFetch_size(dsr.getFetchSize());
+ String url = esConfigDTO.getUrl().endsWith("/") ? esConfigDTO.getUrl() + esConfigDTO.getUri() + "?format=json" : esConfigDTO.getUrl() + "/" + esConfigDTO.getUri() + "?format=json";
+ String response = HttpClientUtil.post(url, new Gson().toJson(requst), httpClientConfig);
+ EsReponse esReponse = new Gson().fromJson(response, EsReponse.class);
+
+ list.addAll(fetchResult(esReponse));
+ if(dsr.isPageable()){
+ Integer realSize = dsr.getPage() * dsr.getPageSize() < list.size() ? dsr.getPage() * dsr.getPageSize(): list.size();
+ list = list.subList((dsr.getPage() - 1) * dsr.getPageSize(), realSize);
+ }
+ if(!dsr.isPreviewData()){
+ while (StringUtils.isNotEmpty(esReponse.getCursor())) {
+ RequstWithCursor requstWithCursor = new RequstWithCursor();
+ requstWithCursor.setQuery(dsr.getQuery());
+ requstWithCursor.setFetch_size(dsr.getFetchSize());
+ requstWithCursor.setCursor(esReponse.getCursor());
+ response = HttpClientUtil.post(url, new Gson().toJson(requstWithCursor), httpClientConfig);
+ esReponse = new Gson().fromJson(response, EsReponse.class);
+ list.addAll(fetchResult(esReponse));
+ }
+ }
+ } catch (Exception e) {
+ DataEaseException.throwException(e);
+ }
+ return list;
+ }
+
+ @Override
+ public List fetchResult(DatasourceRequest datasourceRequest) throws Exception {
+ List list = new LinkedList<>();
+ try {
+ String response = exexQuery(datasourceRequest, datasourceRequest.getQuery(), "?format=json");
+ list = fetchResult(response);
+ } catch (Exception e) {
+ DataEaseException.throwException(e);
+ }
+ return list;
+ }
+
+ private List fetchResult(String response) throws Exception {
+ EsReponse esReponse = new Gson().fromJson(response, EsReponse.class);
+ return fetchResult(esReponse);
+ }
+
+ private List fetchResult(EsReponse esReponse) throws Exception {
+ List list = new LinkedList<>();
+ if(esReponse.getError() != null){
+ throw new Exception(esReponse.getError().getReason());
+ }
+ list.addAll(esReponse.getRows());
+ return list;
+ }
+
+ @Override
+ public List fetchResultField(DatasourceRequest datasourceRequest) throws Exception {
+ List tableFileds = new ArrayList<>();
+ try {
+ String response = exexQuery(datasourceRequest, datasourceRequest.getQuery(), "?format=json");
+ tableFileds = fetchResultField(response);
+ } catch (Exception e) {
+ DataEaseException.throwException(e);
+ }
+ return tableFileds;
+ }
+
+ private List fetchResultField(String response) throws Exception {
+ List fieldList = new ArrayList<>();
+ EsReponse esReponse = new Gson().fromJson(response, EsReponse.class);
+ if(esReponse.getError() != null){
+ throw new Exception(esReponse.getError().getReason());
+ }
+
+ for (String[] row : esReponse.getRows()) {
+ TableFiled field = new TableFiled();
+ field.setFieldName(row[0]);
+ field.setRemarks(row[0]);
+ field.setFieldType(row[2]);
+ field.setFieldSize(EsQueryProvider.transFieldTypeSize(row[2]));
+ fieldList.add(field);
+ }
+ return fieldList;
+ }
+
+ @Override
+ public Map fetchResultAndField(DatasourceRequest datasourceRequest) throws Exception {
+ Map result = new HashMap<>();
+ try {
+ String response = exexQuery(datasourceRequest, datasourceRequest.getQuery(), "?format=json");
+ result.put("dataList", fetchResult(response));
+ result.put("fieldList", fetchResultField(response));
+ } catch (Exception e) {
+ DataEaseException.throwException(e);
+ }
+ return result;
+ }
+
+ @Override
+ public void handleDatasource(DatasourceRequest datasourceRequest, String type) throws Exception {
+ }
+
+ @Override
+ public List getTables(DatasourceRequest datasourceRequest) throws Exception {
+ List tables = new ArrayList<>();
+ try {
+ String response = exexQuery(datasourceRequest, "show tables", "?format=json");
+ tables = fetchTables(response);
+ } catch (Exception e) {
+ DataEaseException.throwException(e);
+ }
+ return tables;
+ }
+
+ private List fetchTables(String response) throws Exception {
+ List tables = new ArrayList<>();
+ EsReponse esReponse = new Gson().fromJson(response, EsReponse.class);
+ if(esReponse.getError() != null){
+ throw new Exception(esReponse.getError().getReason());
+ }
+
+ for (String[] row : esReponse.getRows()) {
+ if(row.length == 3 && row[1].equalsIgnoreCase("TABLE") && row[2].equalsIgnoreCase("INDEX")){
+ tables.add(row[0]);
+ }
+ if(row.length == 2 && row[1].equalsIgnoreCase("BASE TABLE")){
+ tables.add(row[0]);
+ }
+ }
+ return tables;
+ }
+
+ @Override
+ public List getSchema(DatasourceRequest datasourceRequest) throws Exception {
+ return new ArrayList<>();
+ }
+
+ @Override
+ public List getTableFileds(DatasourceRequest datasourceRequest) throws Exception {
+ List tableFileds = new ArrayList<>();
+ try {
+ String response = exexQuery(datasourceRequest, "desc " + datasourceRequest.getTable(), "?format=json");
+ tableFileds = fetchResultField(response);
+ } catch (Exception e) {
+ DataEaseException.throwException(e);
+ }
+ return tableFileds;
+ }
+
+ @Override
+ public void checkStatus(DatasourceRequest datasourceRequest) throws Exception {
+ EsConfigDTO esConfigDTO = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), EsConfigDTO.class);
+ String response = exexGetQuery(datasourceRequest);
+ String version = JSONObject.parseObject(response).getJSONObject("version").getString("number");
+ if(Integer.valueOf(version.substring(0,1)) < 6 ){
+ throw new Exception(Translator.get("i18n_es_limit"));
+ }
+ if(Integer.valueOf(version.substring(2,3)) < 3 ){
+ throw new Exception(Translator.get("i18n_es_limit"));
+ }
+ if(Integer.valueOf(version.substring(0,1)) == 6 ) {
+ esConfigDTO.setUri("_xpack/sql");
+ }
+ if(Integer.valueOf(version.substring(0,1)) == 7 ) {
+ esConfigDTO.setUri("_sql");
+ }
+ datasourceRequest.getDatasource().setConfiguration(new Gson().toJson(esConfigDTO));
+ getTables(datasourceRequest);
+ }
+
+ private String exexQuery(DatasourceRequest datasourceRequest, String sql, String uri){
+ EsConfigDTO esConfigDTO = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), EsConfigDTO.class);
+ uri = esConfigDTO.getUri()+uri;
+ HttpClientConfig httpClientConfig = new HttpClientConfig();
+ if(StringUtils.isNotEmpty(esConfigDTO.getUsername()) && StringUtils.isNotEmpty(esConfigDTO.getPassword())){
+ String auth = esConfigDTO.getUsername() + ":" + esConfigDTO.getPassword();
+ byte[] encodedAuth = Base64.encodeBase64(auth.getBytes(StandardCharsets.UTF_8));
+ httpClientConfig.addHeader(HttpHeaders.AUTHORIZATION, "Basic " + new String(encodedAuth));
+ }
+
+ Requst requst = new Requst();
+ requst.setQuery(sql);
+ requst.setFetch_size(datasourceRequest.getFetchSize());
+ String url = esConfigDTO.getUrl().endsWith("/") ? esConfigDTO.getUrl() + uri : esConfigDTO.getUrl() + "/" + uri;
+ String response = HttpClientUtil.post(url, new Gson().toJson(requst), httpClientConfig);
+ return response;
+ }
+
+ private String exexGetQuery(DatasourceRequest datasourceRequest){
+ EsConfigDTO esConfigDTO = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), EsConfigDTO.class);
+ HttpClientConfig httpClientConfig = new HttpClientConfig();
+ if(StringUtils.isNotEmpty(esConfigDTO.getUsername()) && StringUtils.isNotEmpty(esConfigDTO.getPassword())){
+ String auth = esConfigDTO.getUsername() + ":" + esConfigDTO.getPassword();
+ byte[] encodedAuth = Base64.encodeBase64(auth.getBytes(StandardCharsets.UTF_8));
+ httpClientConfig.addHeader(HttpHeaders.AUTHORIZATION, "Basic " + new String(encodedAuth));
+ }
+
+ String response = HttpClientUtil.get(esConfigDTO.getUrl(), httpClientConfig);
+ return response;
+ }
+
+}
diff --git a/backend/src/main/java/io/dataease/datasource/provider/JdbcProvider.java b/backend/src/main/java/io/dataease/datasource/provider/JdbcProvider.java
index 5918a7f361..9ccda9d154 100644
--- a/backend/src/main/java/io/dataease/datasource/provider/JdbcProvider.java
+++ b/backend/src/main/java/io/dataease/datasource/provider/JdbcProvider.java
@@ -7,6 +7,7 @@ import io.dataease.datasource.dto.*;
import io.dataease.datasource.request.DatasourceRequest;
import io.dataease.exception.DataEaseException;
import io.dataease.i18n.Translator;
+import io.dataease.provider.QueryProvider;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import java.beans.PropertyVetoException;
@@ -40,7 +41,7 @@ public class JdbcProvider extends DatasourceProvider {
List list = new LinkedList<>();
Connection connection = null;
try {
- connection = getConnectionFromPool(dsr);
+ connection = getConnection(dsr);
Statement stat = connection.createStatement();
ResultSet rs = stat.executeQuery(dsr.getQuery());
list = fetchResult(rs);
@@ -127,7 +128,7 @@ public class JdbcProvider extends DatasourceProvider {
connection = getConnectionFromPool(datasourceRequest);
Statement stat = connection.createStatement();
rs = stat.executeQuery(datasourceRequest.getQuery());
- return fetchResultField(rs);
+ return fetchResultField(rs, datasourceRequest);
} catch (SQLException e) {
DataEaseException.throwException(e);
} catch (Exception e) {
@@ -152,7 +153,7 @@ public class JdbcProvider extends DatasourceProvider {
Statement stat = connection.createStatement();
rs = stat.executeQuery(datasourceRequest.getQuery());
dataList = fetchResult(rs);
- fieldList = fetchResultField(rs);
+ fieldList = fetchResultField(rs, datasourceRequest);
result.put("dataList", dataList);
result.put("fieldList", fieldList);
return result;
@@ -168,10 +169,11 @@ public class JdbcProvider extends DatasourceProvider {
return new HashMap<>();
}
- private List fetchResultField(ResultSet rs) throws Exception {
+ private List fetchResultField(ResultSet rs, DatasourceRequest datasourceRequest) throws Exception {
List fieldList = new ArrayList<>();
ResultSetMetaData metaData = rs.getMetaData();
int columnCount = metaData.getColumnCount();
+ QueryProvider qp = ProviderFactory.getQueryProvider(datasourceRequest.getDatasource().getType());
for (int j = 0; j < columnCount; j++) {
String f = metaData.getColumnName(j + 1);
String l = StringUtils.isNotEmpty(metaData.getColumnLabel(j + 1)) ? metaData.getColumnLabel(j + 1) : f;
@@ -180,7 +182,12 @@ public class JdbcProvider extends DatasourceProvider {
field.setFieldName(l);
field.setRemarks(l);
field.setFieldType(t);
- field.setFieldSize(metaData.getColumnDisplaySize(j + 1));
+
+ if(datasourceRequest.getDatasource().getType().equalsIgnoreCase(DatasourceTypes.ck.name())){
+ field.setFieldSize(qp.transFieldSize(t));
+ }else {
+ field.setFieldSize(metaData.getColumnDisplaySize(j + 1));
+ }
if(t.equalsIgnoreCase("LONG")){field.setFieldSize(65533);} //oracle LONG
if(StringUtils.isNotEmpty(t) && t.toLowerCase().contains("date") && field.getFieldSize() < 50 ){
field.setFieldSize(50);
@@ -196,7 +203,7 @@ public class JdbcProvider extends DatasourceProvider {
String queryStr = getTablesSql(datasourceRequest);
Connection con = null;
try {
- con = getConnectionFromPool(datasourceRequest);
+ con = getConnection(datasourceRequest);
Statement statement = con.createStatement();
ResultSet resultSet = statement.executeQuery(queryStr);
while (resultSet.next()) {
@@ -250,15 +257,20 @@ public class JdbcProvider extends DatasourceProvider {
ResultSet resultSet = databaseMetaData.getColumns(null, "%", datasourceRequest.getTable(), "%");
while (resultSet.next()) {
String tableName = resultSet.getString("TABLE_NAME");
- String database = resultSet.getString("TABLE_CAT");
+ String database = null;
+ if(datasourceRequest.getDatasource().getType().equalsIgnoreCase(DatasourceTypes.ck.name())){
+ database = resultSet.getString("TABLE_SCHEM");
+ }else {
+ database = resultSet.getString("TABLE_CAT");
+ }
if(database != null){
if (tableName.equals(datasourceRequest.getTable()) && database.equalsIgnoreCase(getDatabase(datasourceRequest))) {
- TableFiled tableFiled = getTableFiled(resultSet);
+ TableFiled tableFiled = getTableFiled(resultSet, datasourceRequest);
list.add(tableFiled);
}
}else {
if (tableName.equals(datasourceRequest.getTable())) {
- TableFiled tableFiled = getTableFiled(resultSet);
+ TableFiled tableFiled = getTableFiled(resultSet, datasourceRequest);
list.add(tableFiled);
}
}
@@ -276,7 +288,7 @@ public class JdbcProvider extends DatasourceProvider {
return list;
}
- private TableFiled getTableFiled(ResultSet resultSet) throws SQLException {
+ private TableFiled getTableFiled(ResultSet resultSet, DatasourceRequest datasourceRequest) throws SQLException {
TableFiled tableFiled = new TableFiled();
String colName = resultSet.getString("COLUMN_NAME");
tableFiled.setFieldName(colName);
@@ -285,13 +297,19 @@ public class JdbcProvider extends DatasourceProvider {
remarks = colName;
}
tableFiled.setRemarks(remarks);
- tableFiled.setFieldSize(Integer.valueOf(resultSet.getString("COLUMN_SIZE")));
String dbType = resultSet.getString("TYPE_NAME").toUpperCase();
tableFiled.setFieldType(dbType);
if(dbType.equalsIgnoreCase("LONG")){tableFiled.setFieldSize(65533);}
if(StringUtils.isNotEmpty(dbType) && dbType.toLowerCase().contains("date") && tableFiled.getFieldSize() < 50 ){
tableFiled.setFieldSize(50);
}
+
+ if(datasourceRequest.getDatasource().getType().equalsIgnoreCase(DatasourceTypes.ck.name())){
+ QueryProvider qp = ProviderFactory.getQueryProvider(datasourceRequest.getDatasource().getType());
+ tableFiled.setFieldSize(qp.transFieldSize(dbType));
+ }else {
+ tableFiled.setFieldSize(Integer.valueOf(resultSet.getString("COLUMN_SIZE")));
+ }
return tableFiled;
}
@@ -436,6 +454,14 @@ public class JdbcProvider extends DatasourceProvider {
password = pgConfigration.getPassword();
driver = pgConfigration.getDriver();
jdbcurl = pgConfigration.getJdbc();
+ break;
+ case ck:
+ CHConfigration chConfigration = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), CHConfigration.class);
+ username = chConfigration.getUsername();
+ password = chConfigration.getPassword();
+ driver = chConfigration.getDriver();
+ jdbcurl = chConfigration.getJdbc();
+ break;
default:
break;
}
@@ -493,6 +519,14 @@ public class JdbcProvider extends DatasourceProvider {
dataSource.setJdbcUrl(pgConfigration.getJdbc());
jdbcDTO = pgConfigration;
break;
+ case ck:
+ CHConfigration chConfigration = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), CHConfigration.class);
+ dataSource.setUser(chConfigration.getUsername());
+ dataSource.setDriverClass(chConfigration.getDriver());
+ dataSource.setPassword(chConfigration.getPassword());
+ dataSource.setJdbcUrl(chConfigration.getJdbc());
+ jdbcDTO = chConfigration;
+ break;
default:
break;
}
@@ -515,7 +549,8 @@ public class JdbcProvider extends DatasourceProvider {
PgConfigration pgConfigration = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), PgConfigration.class);
return pgConfigration.getDataBase();
default:
- return null;
+ JdbcDTO jdbcDTO = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), JdbcDTO.class);
+ return jdbcDTO.getDataBase();
}
}
@@ -528,6 +563,9 @@ public class JdbcProvider extends DatasourceProvider {
return "show tables;";
case sqlServer:
SqlServerConfigration sqlServerConfigration = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), SqlServerConfigration.class);
+ if(StringUtils.isEmpty(sqlServerConfigration.getSchema())){
+ throw new Exception(Translator.get("i18n_schema_is_empty"));
+ }
return "SELECT TABLE_NAME FROM DATABASE.INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_SCHEMA = 'DS_SCHEMA' ;"
.replace("DATABASE", sqlServerConfigration.getDataBase())
.replace("DS_SCHEMA", sqlServerConfigration.getSchema());
@@ -543,6 +581,9 @@ public class JdbcProvider extends DatasourceProvider {
throw new Exception(Translator.get("i18n_schema_is_empty"));
}
return "SELECT tablename FROM pg_tables WHERE tablename NOT LIKE 'pg%' AND tablename NOT LIKE 'sql_%' AND schemaname='SCHEMA' ;".replace("SCHEMA", pgConfigration.getSchema());
+ case ck:
+ CHConfigration chConfigration = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), CHConfigration.class);
+ return "SELECT name FROM system.tables where database='DATABASE';".replace("DATABASE", chConfigration.getDataBase());
default:
return "show tables;";
}
diff --git a/backend/src/main/java/io/dataease/datasource/provider/ProviderFactory.java b/backend/src/main/java/io/dataease/datasource/provider/ProviderFactory.java
index d780399648..b05acd9d44 100644
--- a/backend/src/main/java/io/dataease/datasource/provider/ProviderFactory.java
+++ b/backend/src/main/java/io/dataease/datasource/provider/ProviderFactory.java
@@ -30,6 +30,8 @@ public class ProviderFactory implements ApplicationContextAware {
return context.getBean("jdbc", DatasourceProvider.class);
case pg:
return context.getBean("jdbc", DatasourceProvider.class);
+ case es:
+ return context.getBean("es", DatasourceProvider.class);
default:
return context.getBean("jdbc", DatasourceProvider.class);
}
@@ -48,6 +50,10 @@ public class ProviderFactory implements ApplicationContextAware {
return context.getBean("pgQuery", QueryProvider.class);
case oracle:
return context.getBean("oracleQuery", QueryProvider.class);
+ case es:
+ return context.getBean("esQuery", QueryProvider.class);
+ case ck:
+ return context.getBean("ckQuery", QueryProvider.class);
default:
return context.getBean("mysqlQuery", QueryProvider.class);
}
diff --git a/backend/src/main/java/io/dataease/datasource/request/DatasourceRequest.java b/backend/src/main/java/io/dataease/datasource/request/DatasourceRequest.java
index 9521b50af5..ebf237e3fd 100644
--- a/backend/src/main/java/io/dataease/datasource/request/DatasourceRequest.java
+++ b/backend/src/main/java/io/dataease/datasource/request/DatasourceRequest.java
@@ -11,8 +11,12 @@ public class DatasourceRequest {
protected String query;
protected String table;
protected Datasource datasource;
- private Long pageSize;
- private Long startPage;
+ private Integer pageSize;
+ private Integer page;
+ private Integer realSize;
+ private Integer fetchSize = 10000;
+ private boolean pageable = false;
+ private boolean previewData = false;
}
diff --git a/backend/src/main/java/io/dataease/datasource/service/DatasourceService.java b/backend/src/main/java/io/dataease/datasource/service/DatasourceService.java
index 529cdb16af..ab02e97586 100644
--- a/backend/src/main/java/io/dataease/datasource/service/DatasourceService.java
+++ b/backend/src/main/java/io/dataease/datasource/service/DatasourceService.java
@@ -7,6 +7,7 @@ import io.dataease.base.mapper.*;
import io.dataease.base.mapper.ext.ExtDataSourceMapper;
import io.dataease.base.mapper.ext.query.GridExample;
import io.dataease.commons.exception.DEException;
+import io.dataease.commons.model.AuthURD;
import io.dataease.commons.utils.AuthUtils;
import io.dataease.commons.utils.CommonThreadPool;
import io.dataease.commons.utils.LogUtil;
@@ -25,6 +26,8 @@ import io.dataease.dto.dataset.DataTableInfoDTO;
import io.dataease.exception.DataEaseException;
import io.dataease.i18n.Translator;
import io.dataease.service.dataset.DataSetGroupService;
+import io.dataease.service.message.DeMsgutil;
+
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
@@ -34,7 +37,10 @@ import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
+import java.util.Set;
import java.util.UUID;
@Service
@@ -59,9 +65,10 @@ public class DatasourceService {
datasource.setUpdateTime(currentTimeMillis);
datasource.setCreateTime(currentTimeMillis);
datasource.setCreateBy(String.valueOf(AuthUtils.getUser().getUsername()));
+ checkAndUpdateDatasourceStatus(datasource);
datasourceMapper.insertSelective(datasource);
handleConnectionPool(datasource, "add");
- checkAndUpdateDatasourceStatus(datasource);
+
return datasource;
}
@@ -123,9 +130,9 @@ public class DatasourceService {
checkName(datasource);
datasource.setCreateTime(null);
datasource.setUpdateTime(System.currentTimeMillis());
+ checkAndUpdateDatasourceStatus(datasource);
datasourceMapper.updateByPrimaryKeySelective(datasource);
handleConnectionPool(datasource, "edit");
- checkAndUpdateDatasourceStatus(datasource);
}
public ResultHolder validate(Datasource datasource) throws Exception {
@@ -238,7 +245,8 @@ public class DatasourceService {
public void updateDatasourceStatus(){
List datasources = datasourceMapper.selectByExampleWithBLOBs(new DatasourceExample());
datasources.forEach(datasource -> {
- checkAndUpdateDatasourceStatus(datasource);
+ // checkAndUpdateDatasourceStatus(datasource);
+ checkAndUpdateDatasourceStatus(datasource, true);
});
}
@@ -249,10 +257,47 @@ public class DatasourceService {
datasourceRequest.setDatasource(datasource);
datasourceProvider.checkStatus(datasourceRequest);
datasource.setStatus("Success");
- datasourceMapper.updateByPrimaryKeySelective(datasource);
} catch (Exception e) {
datasource.setStatus("Error");
- datasourceMapper.updateByPrimaryKeySelective(datasource);
}
}
+
+ private void checkAndUpdateDatasourceStatus(Datasource datasource, Boolean withMsg){
+ try {
+ DatasourceProvider datasourceProvider = ProviderFactory.getProvider(datasource.getType());
+ DatasourceRequest datasourceRequest = new DatasourceRequest();
+ datasourceRequest.setDatasource(datasource);
+ datasourceProvider.checkStatus(datasourceRequest);
+ datasource.setStatus("Success");
+ datasourceMapper.updateByPrimaryKeySelective(datasource);
+ } catch (Exception e) {
+ Datasource temp = datasourceMapper.selectByPrimaryKey(datasource.getId());
+ datasource.setStatus("Error");
+ if (!StringUtils.equals(temp.getStatus(), "Error")) {
+ sendWebMsg(datasource);
+ datasourceMapper.updateByPrimaryKeySelective(datasource);
+ }
+
+ }
+ }
+
+
+ private void sendWebMsg(Datasource datasource) {
+
+ String id = datasource.getId();
+ AuthURD authURD = AuthUtils.authURDR(id);
+ Set userIds = AuthUtils.userIdsByURD(authURD);
+ Long typeId = 8L;// 代表数据源失效
+ Gson gson = new Gson();
+ userIds.forEach(userId -> {
+ Map param = new HashMap<>();
+ param.put("id", id);
+ param.put("name", datasource.getName());
+
+
+ String content = "数据源【" + datasource.getName() + "】无效";
+
+ DeMsgutil.sendMsg(userId, typeId, 1L, content, gson.toJson(param));
+ });
+ }
}
diff --git a/backend/src/main/java/io/dataease/dto/chart/ChartViewFieldDTO.java b/backend/src/main/java/io/dataease/dto/chart/ChartViewFieldDTO.java
index 2d90dfbcbf..221ff0d218 100644
--- a/backend/src/main/java/io/dataease/dto/chart/ChartViewFieldDTO.java
+++ b/backend/src/main/java/io/dataease/dto/chart/ChartViewFieldDTO.java
@@ -44,4 +44,6 @@ public class ChartViewFieldDTO implements Serializable {
private String datePattern;
private Integer extField;
+
+ private String chartType;
}
diff --git a/backend/src/main/java/io/dataease/plugins/config/LoadjarUtil.java b/backend/src/main/java/io/dataease/plugins/config/LoadjarUtil.java
index 8637a0beb1..f50d6d04ed 100644
--- a/backend/src/main/java/io/dataease/plugins/config/LoadjarUtil.java
+++ b/backend/src/main/java/io/dataease/plugins/config/LoadjarUtil.java
@@ -2,6 +2,7 @@ package io.dataease.plugins.config;
import io.dataease.base.domain.MyPlugin;
import io.dataease.plugins.loader.ClassloaderResponsity;
+import io.dataease.plugins.loader.ControllerLoader;
import io.dataease.plugins.loader.ModuleClassLoader;
import io.dataease.plugins.loader.MybatisLoader;
import org.springframework.beans.factory.annotation.Autowired;
@@ -19,6 +20,9 @@ public class LoadjarUtil {
@Autowired
private MybatisLoader mybatisLoader;
+ @Autowired
+ private ControllerLoader controllerLoader;
+
public List> loadJar(String jarPath, MyPlugin myPlugin) throws Exception{
File jar = new File(jarPath);
URI uri = jar.toURI();
@@ -34,6 +38,10 @@ public class LoadjarUtil {
Thread.currentThread().setContextClassLoader(classLoader);
classLoader.initBean();
mybatisLoader.loadMybatis(myPlugin);
+
+ List controllers = classLoader.getRegisteredController();
+ controllerLoader.registerController(controllers);
+
ClassloaderResponsity.getInstance().addClassLoader(moduleName,classLoader);
diff --git a/backend/src/main/java/io/dataease/plugins/loader/ControllerLoader.java b/backend/src/main/java/io/dataease/plugins/loader/ControllerLoader.java
new file mode 100644
index 0000000000..99c5cce463
--- /dev/null
+++ b/backend/src/main/java/io/dataease/plugins/loader/ControllerLoader.java
@@ -0,0 +1,95 @@
+package io.dataease.plugins.loader;
+
+
+import io.dataease.commons.utils.LogUtil;
+import io.dataease.plugins.config.SpringContextUtil;
+import org.springframework.stereotype.Component;
+import org.springframework.util.ClassUtils;
+import org.springframework.util.ReflectionUtils;
+import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
+import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
+import java.lang.reflect.Method;
+import java.util.List;
+
+@Component
+public class ControllerLoader {
+
+ /**
+ * 去掉Controller的Mapping
+ * @param controllerBeanName
+ */
+ private void unregisterController(String controllerBeanName){
+ final RequestMappingHandlerMapping requestMappingHandlerMapping=(RequestMappingHandlerMapping)SpringContextUtil.getBean("requestMappingHandlerMapping");
+
+ if(requestMappingHandlerMapping!=null){
+ String handler=controllerBeanName;
+ Object controller= SpringContextUtil.getBean(handler);
+ if(controller==null){
+ return;
+ }
+ final Class> targetClass=controller.getClass();
+ ReflectionUtils.doWithMethods(targetClass, new ReflectionUtils.MethodCallback() {
+ public void doWith(Method method) {
+ Method specificMethod = ClassUtils.getMostSpecificMethod(method, targetClass);
+ try {
+ Method createMappingMethod = RequestMappingHandlerMapping.class.
+ getDeclaredMethod("getMappingForMethod", Method.class, Class.class);
+ createMappingMethod.setAccessible(true);
+ RequestMappingInfo requestMappingInfo =(RequestMappingInfo)
+ createMappingMethod.invoke(requestMappingHandlerMapping,specificMethod,targetClass);
+ if(requestMappingInfo != null) {
+ requestMappingHandlerMapping.unregisterMapping(requestMappingInfo);
+ }
+ }catch (Exception e){
+ e.printStackTrace();
+ }
+ }
+ }, ReflectionUtils.USER_DECLARED_METHODS);
+ }
+ }
+
+ /**
+ * 注册Controller
+ * @param controllerBeanName
+ * @throws Exception
+ */
+ private void registerController(String controllerBeanName) throws Exception{
+ final RequestMappingHandlerMapping requestMappingHandlerMapping=(RequestMappingHandlerMapping) SpringContextUtil.getBean("requestMappingHandlerMapping");
+
+ if(requestMappingHandlerMapping!=null){
+ String handler=controllerBeanName;
+ Object controller= SpringContextUtil.getBean(handler);
+ if(controller==null){
+ return;
+ }
+ unregisterController(controllerBeanName);
+ //注册Controller
+ Method method=requestMappingHandlerMapping.getClass().getSuperclass().getSuperclass().getDeclaredMethod("detectHandlerMethods",Object.class);
+
+ method.setAccessible(true);
+ method.invoke(requestMappingHandlerMapping,handler);
+ }
+ }
+
+ public void registerController(List beanNames) {
+ beanNames.forEach(name -> {
+ try {
+ registerController(name);
+ } catch (Exception e) {
+ // e.printStackTrace();
+ LogUtil.error(e);
+ }
+ });
+ }
+
+
+
+
+
+
+
+
+
+
+
+}
diff --git a/backend/src/main/java/io/dataease/plugins/loader/ModuleClassLoader.java b/backend/src/main/java/io/dataease/plugins/loader/ModuleClassLoader.java
index 794c7b49e1..5a357ae773 100644
--- a/backend/src/main/java/io/dataease/plugins/loader/ModuleClassLoader.java
+++ b/backend/src/main/java/io/dataease/plugins/loader/ModuleClassLoader.java
@@ -7,10 +7,14 @@ import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.type.TypeAliasRegistry;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
+import org.springframework.core.annotation.AnnotatedElementUtils;
import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
@@ -35,6 +39,8 @@ public class ModuleClassLoader extends URLClassLoader {
//需要注册的spring bean的name集合
private List registeredBean = new ArrayList<>();
+ private List registeredController = new ArrayList<>();
+
//构造
public ModuleClassLoader(URL[] urls, ClassLoader parent) {
@@ -150,8 +156,12 @@ public class ModuleClassLoader extends URLClassLoader {
beanName = StringUtils.uncapitalize(beanName);
SpringContextUtil.getBeanFactory().registerBeanDefinition(beanName,beanDefinition);
+
+ if (isHandler(cla)) {
+ registeredController.add(beanName);
+ }
+
registeredBean.add(beanName);
-// System.out.println("注册bean:"+beanName);
}
}
@@ -164,6 +174,10 @@ public class ModuleClassLoader extends URLClassLoader {
return registeredBean;
}
+ public List getRegisteredController() {
+ return registeredController;
+ }
+
/**
* 方法描述 判断class对象是否带有spring的注解
@@ -184,6 +198,9 @@ public class ModuleClassLoader extends URLClassLoader {
if( Modifier.isAbstract(cla.getModifiers())){
return false;
}
+ if (isHandler(cla)) {
+ return true;
+ }
if(cla.getAnnotation(Component.class)!=null){
return true;
@@ -194,8 +211,15 @@ public class ModuleClassLoader extends URLClassLoader {
if(cla.getAnnotation(Service.class)!=null){
return true;
}
+ if(cla.getAnnotation(Service.class)!=null){
+ return true;
+ }
return false;
}
+ protected boolean isHandler(Class> beanType) {
+ return AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) || AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class);
+ }
+
}
diff --git a/backend/src/main/java/io/dataease/plugins/server/PluginCommonServer.java b/backend/src/main/java/io/dataease/plugins/server/PluginCommonServer.java
index 225542842f..b33e60244c 100644
--- a/backend/src/main/java/io/dataease/plugins/server/PluginCommonServer.java
+++ b/backend/src/main/java/io/dataease/plugins/server/PluginCommonServer.java
@@ -2,6 +2,7 @@ package io.dataease.plugins.server;
import io.dataease.commons.utils.ServletUtils;
import io.dataease.plugins.common.dto.PluginSysMenu;
+import io.dataease.plugins.common.service.PluginComponentService;
import io.dataease.plugins.common.service.PluginMenuService;
import io.dataease.plugins.config.SpringContextUtil;
import org.springframework.web.bind.annotation.GetMapping;
@@ -9,7 +10,6 @@ import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import springfox.documentation.annotations.ApiIgnore;
-
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedInputStream;
import java.io.IOException;
@@ -25,7 +25,7 @@ import java.util.concurrent.atomic.AtomicReference;
public class PluginCommonServer {
@GetMapping("/async/{menuId}")
- public void componentInfo(@PathVariable Long menuId) {
+ public void menuInfo(@PathVariable Long menuId) {
Map pluginMenuServiceMap = SpringContextUtil.getApplicationContext().getBeansOfType(PluginMenuService.class);
pluginMenuServiceMap.values().stream().forEach(service -> {
AtomicReference atomicReference = new AtomicReference<>();
@@ -65,4 +65,41 @@ public class PluginCommonServer {
return;
});
}
+
+ @GetMapping("/component/{componentName}")
+ public void componentInfo(@PathVariable String componentName) {
+ Map beansOfType = SpringContextUtil.getApplicationContext().getBeansOfType(PluginComponentService.class);
+ beansOfType.values().stream().forEach(service -> {
+ List components = service.components();
+ if (components.contains(componentName)) {
+ HttpServletResponse response = ServletUtils.response();
+ BufferedInputStream bis = null;
+ InputStream inputStream = null;
+ OutputStream os = null; //输出流
+ try{
+ inputStream = service.vueResource(componentName);
+ byte[] buffer = new byte[1024];
+ os = response.getOutputStream();
+ bis = new BufferedInputStream(inputStream);
+ int i = bis.read(buffer);
+ while(i != -1){
+ os.write(buffer, 0, i);
+ i = bis.read(buffer);
+ }
+ os.flush();
+ }catch (Exception e) {
+ e.printStackTrace();
+ }finally {
+ try {
+ bis.close();
+ inputStream.close();
+ os.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ return;
+ }
+ });
+ }
}
diff --git a/backend/src/main/java/io/dataease/plugins/server/SSOServer.java b/backend/src/main/java/io/dataease/plugins/server/SSOServer.java
new file mode 100644
index 0000000000..b50257be85
--- /dev/null
+++ b/backend/src/main/java/io/dataease/plugins/server/SSOServer.java
@@ -0,0 +1,85 @@
+package io.dataease.plugins.server;
+
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletResponse;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.servlet.ModelAndView;
+import io.dataease.auth.entity.SysUserEntity;
+import io.dataease.auth.entity.TokenInfo;
+import io.dataease.auth.service.AuthUserService;
+import io.dataease.auth.util.JWTUtils;
+import io.dataease.commons.exception.DEException;
+import io.dataease.commons.utils.CodingUtil;
+import io.dataease.commons.utils.ServletUtils;
+import io.dataease.plugins.config.SpringContextUtil;
+import io.dataease.plugins.xpack.display.dto.response.SysSettingDto;
+import io.dataease.plugins.xpack.oidc.dto.SSOToken;
+import io.dataease.plugins.xpack.oidc.dto.SSOUserInfo;
+import io.dataease.plugins.xpack.oidc.service.OidcXpackService;
+import io.dataease.service.sys.SysUserService;
+
+@RequestMapping("/sso")
+@Controller
+public class SSOServer {
+
+ @Autowired
+ private AuthUserService authUserService;
+
+ @Autowired
+ private SysUserService sysUserService;
+
+ @GetMapping("/callBack")
+ public ModelAndView callBack(@RequestParam("code") String code, @RequestParam("state") String state) {
+ Map beansOfType = SpringContextUtil.getApplicationContext().getBeansOfType((OidcXpackService.class));
+ if(beansOfType.keySet().size() == 0) {
+ DEException.throwException("缺少oidc插件");
+ }
+ OidcXpackService oidcXpackService = SpringContextUtil.getBean(OidcXpackService.class);
+ Boolean suuportOIDC = oidcXpackService.isSuuportOIDC();
+ if (!suuportOIDC) {
+ DEException.throwException("未开启oidc");
+ }
+ Map config = config(oidcXpackService);
+ SSOToken ssoToken = oidcXpackService.requestSsoToken(config, code, state);
+
+ SSOUserInfo ssoUserInfo = oidcXpackService.requestUserInfo(config, ssoToken.getAccessToken());
+ SysUserEntity sysUserEntity = authUserService.getUserBySub(ssoUserInfo.getSub());
+ if(null == sysUserEntity){
+ sysUserService.saveOIDCUser(ssoUserInfo);
+ sysUserEntity = authUserService.getUserBySub(ssoUserInfo.getSub());
+ }
+ TokenInfo tokenInfo = TokenInfo.builder().userId(sysUserEntity.getUserId()).username(sysUserEntity.getUsername()).build();
+ String realPwd = CodingUtil.md5(sysUserService.defaultPWD());
+ String token = JWTUtils.sign(tokenInfo, realPwd);
+ ServletUtils.setToken(token);
+ HttpServletResponse response = ServletUtils.response();
+
+ Cookie cookie_token = new Cookie("Authorization", token);cookie_token.setPath("/");
+ Cookie cookie_id_token = new Cookie("IdToken", ssoToken.getIdToken());cookie_id_token.setPath("/");
+ Cookie cookie_ac_token = new Cookie("AccessToken", ssoToken.getAccessToken());cookie_ac_token.setPath("/");
+
+ response.addCookie(cookie_token);
+ response.addCookie(cookie_id_token);
+ response.addCookie(cookie_ac_token);
+ ModelAndView modelAndView = new ModelAndView("redirect:/");
+ return modelAndView;
+ }
+ private Map config(OidcXpackService oidcXpackService) {
+ List sysSettingDtos = oidcXpackService.oidcSettings();
+ Map config = sysSettingDtos.stream().collect(Collectors.toMap(SysSettingDto::getParamKey, SysSettingDto::getParamValue));
+ return config;
+ }
+
+
+
+
+}
diff --git a/backend/src/main/java/io/dataease/plugins/server/XLdapServer.java b/backend/src/main/java/io/dataease/plugins/server/XLdapServer.java
new file mode 100644
index 0000000000..f06ab40dfa
--- /dev/null
+++ b/backend/src/main/java/io/dataease/plugins/server/XLdapServer.java
@@ -0,0 +1,41 @@
+package io.dataease.plugins.server;
+
+
+import io.dataease.plugins.common.entity.XpackLdapUserEntity;
+import io.dataease.plugins.config.SpringContextUtil;
+import io.dataease.plugins.xpack.display.dto.response.SysSettingDto;
+import io.dataease.plugins.xpack.ldap.dto.response.LdapInfo;
+import io.dataease.plugins.xpack.ldap.service.LdapXpackService;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RequestMapping("/plugin/ldap")
+@RestController
+public class XLdapServer {
+
+
+ @GetMapping("/info")
+ public LdapInfo getLdapInfo() {
+ LdapXpackService ldapXpackService = SpringContextUtil.getBean(LdapXpackService.class);
+ return ldapXpackService.info();
+ }
+
+ @PostMapping("/save")
+ public void save(@RequestBody List settings) {
+ LdapXpackService ldapXpackService = SpringContextUtil.getBean(LdapXpackService.class);
+ ldapXpackService.save(settings);
+ }
+
+ @PostMapping("/testConn")
+ public void testConn() {
+ LdapXpackService ldapXpackService = SpringContextUtil.getBean(LdapXpackService.class);
+ ldapXpackService.testConn();
+ }
+
+ @PostMapping("/users")
+ public List users() {
+ LdapXpackService ldapXpackService = SpringContextUtil.getBean(LdapXpackService.class);
+ return ldapXpackService.users();
+ }
+}
diff --git a/backend/src/main/java/io/dataease/plugins/server/XOidcServer.java b/backend/src/main/java/io/dataease/plugins/server/XOidcServer.java
new file mode 100644
index 0000000000..debb306ccc
--- /dev/null
+++ b/backend/src/main/java/io/dataease/plugins/server/XOidcServer.java
@@ -0,0 +1,59 @@
+package io.dataease.plugins.server;
+
+
+import io.dataease.plugins.config.SpringContextUtil;
+import io.dataease.plugins.xpack.display.dto.response.SysSettingDto;
+import io.dataease.plugins.xpack.oidc.service.OidcXpackService;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.web.bind.annotation.*;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@RequestMapping("/plugin/oidc")
+@RestController
+public class XOidcServer {
+
+
+ @PostMapping("/info")
+ public List getOidcInfo() {
+ OidcXpackService oidcXpackService = SpringContextUtil.getBean(OidcXpackService.class);
+ return oidcXpackService.oidcSettings();
+ }
+
+ @PostMapping("/save")
+ public void save(@RequestBody List settings) {
+ OidcXpackService oidcXpackService = SpringContextUtil.getBean(OidcXpackService.class);
+ oidcXpackService.save(settings);
+ }
+
+ @PostMapping(value="/authInfo")
+ public Map authInfo() {
+ OidcXpackService oidcXpackService = SpringContextUtil.getBean(OidcXpackService.class);
+ Map result = new HashMap();
+ List oidcSettings = oidcXpackService.oidcSettings();
+
+ Map authParam = new HashMap<>();
+ authParam.put("response_type", "code");
+ authParam.put("state", "state");
+ // authParam.put("redirect_uri", "http://localhost:9528");
+
+
+ oidcSettings.forEach(param -> {
+ if(StringUtils.isNotBlank(param.getParamKey())) {
+ if (StringUtils.equals(param.getParamKey(), "oidc.authEndpoint")) {
+ result.put("authEndpoint", param.getParamValue());
+ }
+ if (StringUtils.equals(param.getParamKey(), "oidc.scope")) {
+ authParam.put("scope", param.getParamValue());
+ }
+ if (StringUtils.equals(param.getParamKey(), "oidc.clientId")) {
+ authParam.put("client_id", param.getParamValue());
+ }
+ }
+
+ });
+ result.put("authParam", authParam);
+ return result;
+ }
+}
diff --git a/backend/src/main/java/io/dataease/plugins/util/PluginUtils.java b/backend/src/main/java/io/dataease/plugins/util/PluginUtils.java
index 52c422b870..57a8cabca5 100644
--- a/backend/src/main/java/io/dataease/plugins/util/PluginUtils.java
+++ b/backend/src/main/java/io/dataease/plugins/util/PluginUtils.java
@@ -46,6 +46,16 @@ public class PluginUtils {
return f2CLicenseResponse;
}
+ public static Boolean licValid() {
+ try{
+ F2CLicenseResponse f2CLicenseResponse = PluginUtils.currentLic();
+ if (f2CLicenseResponse.getStatus() != F2CLicenseResponse.Status.valid) return false;
+ }catch (Exception e) {
+ return false;
+ }
+ return true;
+ }
+
diff --git a/backend/src/main/java/io/dataease/provider/QueryProvider.java b/backend/src/main/java/io/dataease/provider/QueryProvider.java
index 9caa1ebb68..6894222ce6 100644
--- a/backend/src/main/java/io/dataease/provider/QueryProvider.java
+++ b/backend/src/main/java/io/dataease/provider/QueryProvider.java
@@ -38,6 +38,10 @@ public abstract class QueryProvider {
public abstract String getSQLAsTmp(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList);
+ public abstract String getSQLTableInfo(String table, List xAxis, List customFilter, List extFilterRequestList, Datasource ds);
+
+ public abstract String getSQLAsTmpTableInfo(String sql, List xAxis, List customFilter, List extFilterRequestList, Datasource ds);
+
public abstract String getSQLStack(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extStack, Datasource ds);
public abstract String getSQLAsTmpStack(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extStack);
@@ -50,6 +54,9 @@ public abstract class QueryProvider {
public abstract String getSQLSummary(String table, List yAxis, List customFilter, List extFilterRequestList);
+ public Integer transFieldSize(String type){
+ return 50;
+ };
/**
* 单指标汇总
*
diff --git a/backend/src/main/java/io/dataease/provider/ck/CKConstants.java b/backend/src/main/java/io/dataease/provider/ck/CKConstants.java
new file mode 100644
index 0000000000..362477e27c
--- /dev/null
+++ b/backend/src/main/java/io/dataease/provider/ck/CKConstants.java
@@ -0,0 +1,41 @@
+package io.dataease.provider.ck;
+
+import io.dataease.provider.SQLConstants;
+
+import static io.dataease.datasource.constants.DatasourceTypes.ck;
+
+/**
+ * @Author gin
+ * @Date 2021/7/8 7:22 下午
+ */
+public class CKConstants extends SQLConstants {
+ public static final String KEYWORD_TABLE = ck.getKeywordPrefix() + "%s" + ck.getKeywordSuffix();
+
+ public static final String KEYWORD_FIX = "%s." + ck.getKeywordPrefix() + "%s" + ck.getKeywordSuffix();
+
+ public static final String toInt32 = "toInt32(%s)";
+
+ public static final String toDateTime = "toDateTime(%s)";
+
+ public static final String toInt64 = "toInt64(%s)";
+
+ public static final String toFloat64 = "toFloat64(%s)";
+
+ public static final String formatDateTime = "formatDateTime(%s,'%s')";
+
+ public static final String toDecimal = "toDecimal64(%s,2)";
+
+ public static final String DEFAULT_DATE_FORMAT = "%Y-%m-%d %H:%M:%S";
+
+ public static final String WHERE_VALUE_NULL = "(NULL,'')";
+
+ public static final String WHERE_VALUE_VALUE = "'%s'";
+
+ public static final String AGG_COUNT = "COUNT(*)";
+
+ public static final String AGG_FIELD = "%s(%s)";
+
+ public static final String WHERE_BETWEEN = "'%s' AND '%s'";
+
+ public static final String BRACKETS = "(%s)";
+}
diff --git a/backend/src/main/java/io/dataease/provider/ck/CKQueryProvider.java b/backend/src/main/java/io/dataease/provider/ck/CKQueryProvider.java
new file mode 100644
index 0000000000..410b05a06e
--- /dev/null
+++ b/backend/src/main/java/io/dataease/provider/ck/CKQueryProvider.java
@@ -0,0 +1,1027 @@
+package io.dataease.provider.ck;
+
+import io.dataease.base.domain.DatasetTableField;
+import io.dataease.base.domain.DatasetTableFieldExample;
+import io.dataease.base.domain.Datasource;
+import io.dataease.base.mapper.DatasetTableFieldMapper;
+import io.dataease.commons.constants.DeTypeConstants;
+import io.dataease.controller.request.chart.ChartExtFilterRequest;
+import io.dataease.dto.chart.ChartCustomFilterDTO;
+import io.dataease.dto.chart.ChartViewFieldDTO;
+import io.dataease.dto.sqlObj.SQLObj;
+import io.dataease.provider.QueryProvider;
+import io.dataease.provider.SQLConstants;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+import org.stringtemplate.v4.ST;
+import org.stringtemplate.v4.STGroup;
+import org.stringtemplate.v4.STGroupFile;
+
+import javax.annotation.Resource;
+import java.text.MessageFormat;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import static io.dataease.provider.SQLConstants.TABLE_ALIAS_PREFIX;
+
+/**
+ * @Author gin
+ * @Date 2021/5/17 2:43 下午
+ */
+@Service("ckQuery")
+public class CKQueryProvider extends QueryProvider {
+ @Resource
+ private DatasetTableFieldMapper datasetTableFieldMapper;
+
+ @Override
+ public Integer transFieldType(String field) {
+ if(field.indexOf("ARRAY") > -1){
+ field = "ARRAY";
+ }
+ if(field.indexOf("DATETIME64") > -1){
+ field = "DATETIME64";
+ }
+ switch (field) {
+ case "STRING":
+ case "VARCHAR":
+ case "TEXT":
+ case "TINYTEXT":
+ case "MEDIUMTEXT":
+ case "LONGTEXT":
+ case "ENUM":
+ return 0;// 文本
+ case "DATE":
+ case "DATETIME":
+ case "DATETIME64":
+ case "TIMESTAMP":
+ return 1;// 时间
+ case "INT8":
+ case "INT16":
+ case "INT32":
+ case "INT64":
+ case "UINT8":
+ case "UINT16":
+ case "UINT32":
+ case "UINT64":
+ return 2;// 整型
+ case "FLOAT32":
+ case "Float64":
+ case "DECIMAL":
+ return 3;// 浮点
+ case "BIT":
+ case "TINYINT":
+ return 4;// 布尔
+ default:
+ return 0;
+ }
+ }
+
+ @Override
+ public Integer transFieldSize(String field){
+ Integer type = transFieldType(field);
+ switch (type) {
+ case 0:
+ return 65533;
+ case 1:
+ return 60;
+ case 2:
+ return 0;
+ case 3:
+ return 0;
+ case 4:
+ return 0;
+ default:
+ return 65533;
+ }
+ }
+
+ @Override
+ public String createSQLPreview(String sql, String orderBy) {
+ return "SELECT * FROM (" + sqlFix(sql) + ") AS tmp ORDER BY null " + " LIMIT 0,1000";
+ }
+
+ @Override
+ public String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds) {
+ SQLObj tableObj = SQLObj.builder()
+ .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(CKConstants.KEYWORD_TABLE, table))
+ .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0))
+ .build();
+ List xFields = new ArrayList<>();
+ if (CollectionUtils.isNotEmpty(fields)) {
+ for (int i = 0; i < fields.size(); i++) {
+ DatasetTableField f = fields.get(i);
+ String originField;
+ if (ObjectUtils.isNotEmpty(f.getExtField()) && f.getExtField() == 2) {
+ // 解析origin name中有关联的字段生成sql表达式
+ originField = calcFieldRegex(f.getOriginName(), tableObj);
+ } else if (ObjectUtils.isNotEmpty(f.getExtField()) && f.getExtField() == 1) {
+ originField = String.format(CKConstants.KEYWORD_FIX, tableObj.getTableAlias(), f.getOriginName());
+ } else {
+ originField = String.format(CKConstants.KEYWORD_FIX, tableObj.getTableAlias(), f.getOriginName());
+ }
+ String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i);
+ String fieldName = "";
+ // 处理横轴字段
+ if (f.getDeExtractType() == DeTypeConstants.DE_TIME) {
+ if (f.getDeType() == DeTypeConstants.DE_INT || f.getDeType() == DeTypeConstants.DE_FLOAT) {
+ if(f.getType().equalsIgnoreCase("DATE")){
+ fieldName = String.format(CKConstants.toInt32, String.format(CKConstants.toDateTime, originField)) + "*1000";
+ }else {
+ fieldName = String.format(CKConstants.toInt32, originField) + "*1000";
+ }
+ } else {
+ fieldName = originField;
+ }
+ } else if (f.getDeExtractType() == DeTypeConstants.DE_STRING) {
+ if (f.getDeType() == DeTypeConstants.DE_INT) {
+ fieldName = String.format(CKConstants.toInt64, originField);
+ } else if (f.getDeType() == DeTypeConstants.DE_FLOAT) {
+ fieldName = String.format(CKConstants.toFloat64, originField);
+ } else if (f.getDeType() == DeTypeConstants.DE_TIME) {
+ fieldName = String.format(CKConstants.toDateTime, originField);
+ } else {
+ fieldName = originField;
+ }
+ } else {
+ if (f.getDeType() == DeTypeConstants.DE_TIME) {
+ String cast = String.format(CKConstants.toFloat64, originField);
+ fieldName = String.format(CKConstants.toDateTime, cast);
+ } else if (f.getDeType() == DeTypeConstants.DE_INT) {
+ fieldName = String.format(CKConstants.toInt64, originField);
+ } else {
+ fieldName = originField;
+ }
+ }
+ xFields.add(SQLObj.builder()
+ .fieldName(fieldName)
+ .fieldAlias(fieldAlias)
+ .build());
+ }
+ }
+
+ STGroup stg = new STGroupFile(SQLConstants.SQL_TEMPLATE);
+ ST st_sql = stg.getInstanceOf("previewSql");
+ st_sql.add("isGroup", isGroup);
+ if (CollectionUtils.isNotEmpty(xFields)) st_sql.add("groups", xFields);
+ if (ObjectUtils.isNotEmpty(tableObj)) st_sql.add("table", tableObj);
+ return st_sql.render();
+ }
+
+ @Override
+ public String createQuerySQLAsTmp(String sql, List fields, boolean isGroup) {
+ return createQuerySQL("(" + sqlFix(sql) + ")", fields, isGroup, null);
+ }
+
+ @Override
+ public String createQuerySQLWithPage(String table, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup, Datasource ds) {
+ return createQuerySQL(table, fields, isGroup, null) + " LIMIT " + (page - 1) * pageSize + "," + realSize;
+ }
+
+ @Override
+ public String createQueryTableWithLimit(String table, List fields, Integer limit, boolean isGroup, Datasource ds) {
+ return createQuerySQL(table, fields, isGroup, null) + " LIMIT 0," + limit;
+ }
+
+ @Override
+ public String createQuerySqlWithLimit(String sql, List fields, Integer limit, boolean isGroup) {
+ return createQuerySQLAsTmp(sql, fields, isGroup) + " LIMIT 0," + limit;
+ }
+
+ @Override
+ public String createQuerySQLAsTmpWithPage(String sql, List fields, Integer page, Integer pageSize, Integer realSize, boolean isGroup) {
+ return createQuerySQLAsTmp(sql, fields, isGroup) + " LIMIT " + (page - 1) * pageSize + "," + realSize;
+ }
+
+ @Override
+ public String getSQL(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, Datasource ds) {
+ SQLObj tableObj = SQLObj.builder()
+ .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(CKConstants.KEYWORD_TABLE, table))
+ .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0))
+ .build();
+ List xFields = new ArrayList<>();
+ List xWheres = new ArrayList<>();
+ List xOrders = new ArrayList<>();
+ if (CollectionUtils.isNotEmpty(xAxis)) {
+ for (int i = 0; i < xAxis.size(); i++) {
+ ChartViewFieldDTO x = xAxis.get(i);
+ String originField;
+ if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 2) {
+ // 解析origin name中有关联的字段生成sql表达式
+ originField = calcFieldRegex(x.getOriginName(), tableObj);
+ } else if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 1) {
+ originField = String.format(CKConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName());
+ } else {
+ originField = String.format(CKConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName());
+ }
+ String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i);
+ // 处理横轴字段
+ xFields.add(getXFields(x, originField, fieldAlias));
+ // 处理横轴过滤
+// xWheres.addAll(getXWheres(x, originField, fieldAlias));
+ // 处理横轴排序
+ if (StringUtils.isNotEmpty(x.getSort()) && !StringUtils.equalsIgnoreCase(x.getSort(), "none")) {
+ xOrders.add(SQLObj.builder()
+ .orderField(originField)
+ .orderAlias(fieldAlias)
+ .orderDirection(x.getSort())
+ .build());
+ }
+ }
+ }
+ List yFields = new ArrayList<>();
+ List yWheres = new ArrayList<>();
+ List yOrders = new ArrayList<>();
+ if (CollectionUtils.isNotEmpty(yAxis)) {
+ for (int i = 0; i < yAxis.size(); i++) {
+ ChartViewFieldDTO y = yAxis.get(i);
+ String originField;
+ if (ObjectUtils.isNotEmpty(y.getExtField()) && y.getExtField() == 2) {
+ // 解析origin name中有关联的字段生成sql表达式
+ originField = calcFieldRegex(y.getOriginName(), tableObj);
+ } else if (ObjectUtils.isNotEmpty(y.getExtField()) && y.getExtField() == 1) {
+ originField = String.format(CKConstants.KEYWORD_FIX, tableObj.getTableAlias(), y.getOriginName());
+ } else {
+ originField = String.format(CKConstants.KEYWORD_FIX, tableObj.getTableAlias(), y.getOriginName());
+ }
+ String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_Y_PREFIX, i);
+ // 处理纵轴字段
+ yFields.add(getYFields(y, originField, fieldAlias));
+ // 处理纵轴过滤
+ yWheres.addAll(getYWheres(y, originField, fieldAlias));
+ // 处理纵轴排序
+ if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) {
+ yOrders.add(SQLObj.builder()
+ .orderField(originField)
+ .orderAlias(fieldAlias)
+ .orderDirection(y.getSort())
+ .build());
+ }
+ }
+ }
+ // 处理视图中字段过滤
+ List customWheres = transCustomFilterList(tableObj, customFilter);
+ // 处理仪表板字段过滤
+ List extWheres = transExtFilterList(tableObj, extFilterRequestList);
+ // 构建sql所有参数
+ List fields = new ArrayList<>();
+ fields.addAll(xFields);
+ fields.addAll(yFields);
+ List wheres = new ArrayList<>();
+ wheres.addAll(xWheres);
+ if (customWheres != null) wheres.addAll(customWheres);
+ if (extWheres != null) wheres.addAll(extWheres);
+ List groups = new ArrayList<>();
+ groups.addAll(xFields);
+ // 外层再次套sql
+ List orders = new ArrayList<>();
+ orders.addAll(xOrders);
+ orders.addAll(yOrders);
+ List aggWheres = new ArrayList<>();
+ aggWheres.addAll(yWheres);
+
+ STGroup stg = new STGroupFile(SQLConstants.SQL_TEMPLATE);
+ ST st_sql = stg.getInstanceOf("querySql");
+ if (CollectionUtils.isNotEmpty(xFields)) st_sql.add("groups", xFields);
+ if (CollectionUtils.isNotEmpty(yFields)) st_sql.add("aggregators", yFields);
+ if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres);
+ if (ObjectUtils.isNotEmpty(tableObj)) st_sql.add("table", tableObj);
+ String sql = st_sql.render();
+
+ ST st = stg.getInstanceOf("querySql");
+ SQLObj tableSQL = SQLObj.builder()
+ .tableName(String.format(CKConstants.BRACKETS, sql))
+ .tableAlias(String.format(TABLE_ALIAS_PREFIX, 1))
+ .build();
+ if (CollectionUtils.isNotEmpty(aggWheres)) st.add("filters", aggWheres);
+ if (CollectionUtils.isNotEmpty(orders)) st.add("orders", orders);
+ if (ObjectUtils.isNotEmpty(tableSQL)) st.add("table", tableSQL);
+ return st.render();
+ }
+
+ @Override
+ public String getSQLTableInfo(String table, List xAxis, List customFilter, List extFilterRequestList, Datasource ds) {
+ SQLObj tableObj = SQLObj.builder()
+ .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(CKConstants.KEYWORD_TABLE, table))
+ .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0))
+ .build();
+ List xFields = new ArrayList<>();
+ List xWheres = new ArrayList<>();
+ List xOrders = new ArrayList<>();
+ if (CollectionUtils.isNotEmpty(xAxis)) {
+ for (int i = 0; i < xAxis.size(); i++) {
+ ChartViewFieldDTO x = xAxis.get(i);
+ String originField;
+ if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 2) {
+ // 解析origin name中有关联的字段生成sql表达式
+ originField = calcFieldRegex(x.getOriginName(), tableObj);
+ } else if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 1) {
+ originField = String.format(CKConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName());
+ } else {
+ originField = String.format(CKConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName());
+ }
+ String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i);
+ // 处理横轴字段
+ xFields.add(getXFields(x, originField, fieldAlias));
+ // 处理横轴过滤
+// xWheres.addAll(getXWheres(x, originField, fieldAlias));
+ // 处理横轴排序
+ if (StringUtils.isNotEmpty(x.getSort()) && !StringUtils.equalsIgnoreCase(x.getSort(), "none")) {
+ xOrders.add(SQLObj.builder()
+ .orderField(originField)
+ .orderAlias(fieldAlias)
+ .orderDirection(x.getSort())
+ .build());
+ }
+ }
+ }
+ // 处理视图中字段过滤
+ List customWheres = transCustomFilterList(tableObj, customFilter);
+ // 处理仪表板字段过滤
+ List extWheres = transExtFilterList(tableObj, extFilterRequestList);
+ // 构建sql所有参数
+ List fields = new ArrayList<>();
+ fields.addAll(xFields);
+ List wheres = new ArrayList<>();
+ wheres.addAll(xWheres);
+ if (customWheres != null) wheres.addAll(customWheres);
+ if (extWheres != null) wheres.addAll(extWheres);
+ List groups = new ArrayList<>();
+ groups.addAll(xFields);
+ // 外层再次套sql
+ List orders = new ArrayList<>();
+ orders.addAll(xOrders);
+
+ STGroup stg = new STGroupFile(SQLConstants.SQL_TEMPLATE);
+ ST st_sql = stg.getInstanceOf("previewSql");
+ st_sql.add("isGroup", false);
+ if (CollectionUtils.isNotEmpty(xFields)) st_sql.add("groups", xFields);
+ if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres);
+ if (ObjectUtils.isNotEmpty(tableObj)) st_sql.add("table", tableObj);
+ String sql = st_sql.render();
+
+ ST st = stg.getInstanceOf("previewSql");
+ st.add("isGroup", false);
+ SQLObj tableSQL = SQLObj.builder()
+ .tableName(String.format(CKConstants.BRACKETS, sql))
+ .tableAlias(String.format(TABLE_ALIAS_PREFIX, 1))
+ .build();
+ if (CollectionUtils.isNotEmpty(orders)) st.add("orders", orders);
+ if (ObjectUtils.isNotEmpty(tableSQL)) st.add("table", tableSQL);
+ return st.render();
+ }
+
+ @Override
+ public String getSQLAsTmpTableInfo(String sql, List xAxis, List customFilter, List extFilterRequestList, Datasource ds) {
+ return getSQLTableInfo("(" + sqlFix(sql) + ")", xAxis, customFilter, extFilterRequestList, null);
+ }
+
+
+ @Override
+ public String getSQLAsTmp(String sql, List xAxis, List yAxis, List customFilter, List extFilterRequestList) {
+ return getSQL("(" + sqlFix(sql) + ")", xAxis, yAxis, customFilter, extFilterRequestList, null);
+ }
+
+ @Override
+ public String getSQLStack(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extStack, Datasource ds) {
+ SQLObj tableObj = SQLObj.builder()
+ .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(CKConstants.KEYWORD_TABLE, table))
+ .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0))
+ .build();
+ List xFields = new ArrayList<>();
+ List xWheres = new ArrayList<>();
+ List xOrders = new ArrayList<>();
+ List xList = new ArrayList<>();
+ xList.addAll(xAxis);
+ xList.addAll(extStack);
+ if (CollectionUtils.isNotEmpty(xList)) {
+ for (int i = 0; i < xList.size(); i++) {
+ ChartViewFieldDTO x = xList.get(i);
+ String originField;
+ if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 2) {
+ // 解析origin name中有关联的字段生成sql表达式
+ originField = calcFieldRegex(x.getOriginName(), tableObj);
+ } else if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 1) {
+ originField = String.format(CKConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName());
+ } else {
+ originField = String.format(CKConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName());
+ }
+ String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i);
+ // 处理横轴字段
+ xFields.add(getXFields(x, originField, fieldAlias));
+ // 处理横轴过滤
+// xWheres.addAll(getXWheres(x, originField, fieldAlias));
+ // 处理横轴排序
+ if (StringUtils.isNotEmpty(x.getSort()) && !StringUtils.equalsIgnoreCase(x.getSort(), "none")) {
+ xOrders.add(SQLObj.builder()
+ .orderField(originField)
+ .orderAlias(fieldAlias)
+ .orderDirection(x.getSort())
+ .build());
+ }
+ }
+ }
+ List yFields = new ArrayList<>();
+ List yWheres = new ArrayList<>();
+ List yOrders = new ArrayList<>();
+ if (CollectionUtils.isNotEmpty(yAxis)) {
+ for (int i = 0; i < yAxis.size(); i++) {
+ ChartViewFieldDTO y = yAxis.get(i);
+ String originField;
+ if (ObjectUtils.isNotEmpty(y.getExtField()) && y.getExtField() == 2) {
+ // 解析origin name中有关联的字段生成sql表达式
+ originField = calcFieldRegex(y.getOriginName(), tableObj);
+ } else if (ObjectUtils.isNotEmpty(y.getExtField()) && y.getExtField() == 1) {
+ originField = String.format(CKConstants.KEYWORD_FIX, tableObj.getTableAlias(), y.getOriginName());
+ } else {
+ originField = String.format(CKConstants.KEYWORD_FIX, tableObj.getTableAlias(), y.getOriginName());
+ }
+ String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_Y_PREFIX, i);
+ // 处理纵轴字段
+ yFields.add(getYFields(y, originField, fieldAlias));
+ // 处理纵轴过滤
+ yWheres.addAll(getYWheres(y, originField, fieldAlias));
+ // 处理纵轴排序
+ if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) {
+ yOrders.add(SQLObj.builder()
+ .orderField(originField)
+ .orderAlias(fieldAlias)
+ .orderDirection(y.getSort())
+ .build());
+ }
+ }
+ }
+ // 处理视图中字段过滤
+ List customWheres = transCustomFilterList(tableObj, customFilter);
+ // 处理仪表板字段过滤
+ List extWheres = transExtFilterList(tableObj, extFilterRequestList);
+ // 构建sql所有参数
+ List fields = new ArrayList<>();
+ fields.addAll(xFields);
+ fields.addAll(yFields);
+ List wheres = new ArrayList<>();
+ wheres.addAll(xWheres);
+ if (customWheres != null) wheres.addAll(customWheres);
+ if (extWheres != null) wheres.addAll(extWheres);
+ List groups = new ArrayList<>();
+ groups.addAll(xFields);
+ // 外层再次套sql
+ List orders = new ArrayList<>();
+ orders.addAll(xOrders);
+ orders.addAll(yOrders);
+ List aggWheres = new ArrayList<>();
+ aggWheres.addAll(yWheres);
+
+ STGroup stg = new STGroupFile(SQLConstants.SQL_TEMPLATE);
+ ST st_sql = stg.getInstanceOf("querySql");
+ if (CollectionUtils.isNotEmpty(xFields)) st_sql.add("groups", xFields);
+ if (CollectionUtils.isNotEmpty(yFields)) st_sql.add("aggregators", yFields);
+ if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres);
+ if (ObjectUtils.isNotEmpty(tableObj)) st_sql.add("table", tableObj);
+ String sql = st_sql.render();
+
+ ST st = stg.getInstanceOf("querySql");
+ SQLObj tableSQL = SQLObj.builder()
+ .tableName(String.format(CKConstants.BRACKETS, sql))
+ .tableAlias(String.format(TABLE_ALIAS_PREFIX, 1))
+ .build();
+ if (CollectionUtils.isNotEmpty(aggWheres)) st.add("filters", aggWheres);
+ if (CollectionUtils.isNotEmpty(orders)) st.add("orders", orders);
+ if (ObjectUtils.isNotEmpty(tableSQL)) st.add("table", tableSQL);
+ return st.render();
+ }
+
+ @Override
+ public String getSQLAsTmpStack(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extStack) {
+ return getSQLStack("(" + sqlFix(table) + ")", xAxis, yAxis, customFilter, extFilterRequestList, extStack, null);
+ }
+
+ @Override
+ public String getSQLScatter(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extBubble, Datasource ds) {
+ SQLObj tableObj = SQLObj.builder()
+ .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(CKConstants.KEYWORD_TABLE, table))
+ .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0))
+ .build();
+ List xFields = new ArrayList<>();
+ List xWheres = new ArrayList<>();
+ List xOrders = new ArrayList<>();
+ if (CollectionUtils.isNotEmpty(xAxis)) {
+ for (int i = 0; i < xAxis.size(); i++) {
+ ChartViewFieldDTO x = xAxis.get(i);
+ String originField;
+ if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 2) {
+ // 解析origin name中有关联的字段生成sql表达式
+ originField = calcFieldRegex(x.getOriginName(), tableObj);
+ } else if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 1) {
+ originField = String.format(CKConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName());
+ } else {
+ originField = String.format(CKConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getOriginName());
+ }
+ String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i);
+ // 处理横轴字段
+ xFields.add(getXFields(x, originField, fieldAlias));
+ // 处理横轴过滤
+// xWheres.addAll(getXWheres(x, originField, fieldAlias));
+ // 处理横轴排序
+ if (StringUtils.isNotEmpty(x.getSort()) && !StringUtils.equalsIgnoreCase(x.getSort(), "none")) {
+ xOrders.add(SQLObj.builder()
+ .orderField(originField)
+ .orderAlias(fieldAlias)
+ .orderDirection(x.getSort())
+ .build());
+ }
+ }
+ }
+ List yFields = new ArrayList<>();
+ List yWheres = new ArrayList<>();
+ List yOrders = new ArrayList<>();
+ List yList = new ArrayList<>();
+ yList.addAll(yAxis);
+ yList.addAll(extBubble);
+ if (CollectionUtils.isNotEmpty(yList)) {
+ for (int i = 0; i < yList.size(); i++) {
+ ChartViewFieldDTO y = yList.get(i);
+ String originField;
+ if (ObjectUtils.isNotEmpty(y.getExtField()) && y.getExtField() == 2) {
+ // 解析origin name中有关联的字段生成sql表达式
+ originField = calcFieldRegex(y.getOriginName(), tableObj);
+ } else if (ObjectUtils.isNotEmpty(y.getExtField()) && y.getExtField() == 1) {
+ originField = String.format(CKConstants.KEYWORD_FIX, tableObj.getTableAlias(), y.getOriginName());
+ } else {
+ originField = String.format(CKConstants.KEYWORD_FIX, tableObj.getTableAlias(), y.getOriginName());
+ }
+ String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_Y_PREFIX, i);
+ // 处理纵轴字段
+ yFields.add(getYFields(y, originField, fieldAlias));
+ // 处理纵轴过滤
+ yWheres.addAll(getYWheres(y, originField, fieldAlias));
+ // 处理纵轴排序
+ if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) {
+ yOrders.add(SQLObj.builder()
+ .orderField(originField)
+ .orderAlias(fieldAlias)
+ .orderDirection(y.getSort())
+ .build());
+ }
+ }
+ }
+ // 处理视图中字段过滤
+ List customWheres = transCustomFilterList(tableObj, customFilter);
+ // 处理仪表板字段过滤
+ List extWheres = transExtFilterList(tableObj, extFilterRequestList);
+ // 构建sql所有参数
+ List fields = new ArrayList<>();
+ fields.addAll(xFields);
+ fields.addAll(yFields);
+ List wheres = new ArrayList<>();
+ wheres.addAll(xWheres);
+ if (customWheres != null) wheres.addAll(customWheres);
+ if (extWheres != null) wheres.addAll(extWheres);
+ List groups = new ArrayList<>();
+ groups.addAll(xFields);
+ // 外层再次套sql
+ List orders = new ArrayList<>();
+ orders.addAll(xOrders);
+ orders.addAll(yOrders);
+ List aggWheres = new ArrayList<>();
+ aggWheres.addAll(yWheres);
+
+ STGroup stg = new STGroupFile(SQLConstants.SQL_TEMPLATE);
+ ST st_sql = stg.getInstanceOf("querySql");
+ if (CollectionUtils.isNotEmpty(xFields)) st_sql.add("groups", xFields);
+ if (CollectionUtils.isNotEmpty(yFields)) st_sql.add("aggregators", yFields);
+ if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres);
+ if (ObjectUtils.isNotEmpty(tableObj)) st_sql.add("table", tableObj);
+ String sql = st_sql.render();
+
+ ST st = stg.getInstanceOf("querySql");
+ SQLObj tableSQL = SQLObj.builder()
+ .tableName(String.format(CKConstants.BRACKETS, sql))
+ .tableAlias(String.format(TABLE_ALIAS_PREFIX, 1))
+ .build();
+ if (CollectionUtils.isNotEmpty(aggWheres)) st.add("filters", aggWheres);
+ if (CollectionUtils.isNotEmpty(orders)) st.add("orders", orders);
+ if (ObjectUtils.isNotEmpty(tableSQL)) st.add("table", tableSQL);
+ return st.render();
+ }
+
+ @Override
+ public String getSQLAsTmpScatter(String table, List xAxis, List yAxis, List customFilter, List extFilterRequestList, List extBubble) {
+ return getSQLScatter("(" + sqlFix(table) + ")", xAxis, yAxis, customFilter, extFilterRequestList, extBubble, null);
+ }
+
+ @Override
+ public String searchTable(String table) {
+ return "SELECT table_name FROM information_schema.TABLES WHERE table_name ='" + table + "'";
+ }
+
+ @Override
+ public String getSQLSummary(String table, List yAxis, List customFilter, List extFilterRequestList) {
+ // 字段汇总 排序等
+ SQLObj tableObj = SQLObj.builder()
+ .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(CKConstants.KEYWORD_TABLE, table))
+ .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0))
+ .build();
+ List yFields = new ArrayList<>();
+ List yWheres = new ArrayList<>();
+ List yOrders = new ArrayList<>();
+ if (CollectionUtils.isNotEmpty(yAxis)) {
+ for (int i = 0; i < yAxis.size(); i++) {
+ ChartViewFieldDTO y = yAxis.get(i);
+ String originField;
+ if (ObjectUtils.isNotEmpty(y.getExtField()) && y.getExtField() == 2) {
+ // 解析origin name中有关联的字段生成sql表达式
+ originField = calcFieldRegex(y.getOriginName(), tableObj);
+ } else if (ObjectUtils.isNotEmpty(y.getExtField()) && y.getExtField() == 1) {
+ originField = String.format(CKConstants.KEYWORD_FIX, tableObj.getTableAlias(), y.getOriginName());
+ } else {
+ originField = String.format(CKConstants.KEYWORD_FIX, tableObj.getTableAlias(), y.getOriginName());
+ }
+ String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_Y_PREFIX, i);
+ // 处理纵轴字段
+ yFields.add(getYFields(y, originField, fieldAlias));
+ // 处理纵轴过滤
+ yWheres.addAll(getYWheres(y, originField, fieldAlias));
+ // 处理纵轴排序
+ if (StringUtils.isNotEmpty(y.getSort()) && !StringUtils.equalsIgnoreCase(y.getSort(), "none")) {
+ yOrders.add(SQLObj.builder()
+ .orderField(originField)
+ .orderAlias(fieldAlias)
+ .orderDirection(y.getSort())
+ .build());
+ }
+ }
+ }
+ // 处理视图中字段过滤
+ List customWheres = transCustomFilterList(tableObj, customFilter);
+ // 处理仪表板字段过滤
+ List extWheres = transExtFilterList(tableObj, extFilterRequestList);
+ // 构建sql所有参数
+ List fields = new ArrayList<>();
+ fields.addAll(yFields);
+ List wheres = new ArrayList<>();
+ if (customWheres != null) wheres.addAll(customWheres);
+ if (extWheres != null) wheres.addAll(extWheres);
+ List groups = new ArrayList<>();
+ // 外层再次套sql
+ List orders = new ArrayList<>();
+ orders.addAll(yOrders);
+ List aggWheres = new ArrayList<>();
+ aggWheres.addAll(yWheres);
+
+ STGroup stg = new STGroupFile(SQLConstants.SQL_TEMPLATE);
+ ST st_sql = stg.getInstanceOf("querySql");
+ if (CollectionUtils.isNotEmpty(yFields)) st_sql.add("aggregators", yFields);
+ if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres);
+ if (ObjectUtils.isNotEmpty(tableObj)) st_sql.add("table", tableObj);
+ String sql = st_sql.render();
+
+ ST st = stg.getInstanceOf("querySql");
+ SQLObj tableSQL = SQLObj.builder()
+ .tableName(String.format(CKConstants.BRACKETS, sql))
+ .tableAlias(String.format(TABLE_ALIAS_PREFIX, 1))
+ .build();
+ if (CollectionUtils.isNotEmpty(aggWheres)) st.add("filters", aggWheres);
+ if (CollectionUtils.isNotEmpty(orders)) st.add("orders", orders);
+ if (ObjectUtils.isNotEmpty(tableSQL)) st.add("table", tableSQL);
+ return st.render();
+ }
+
+ @Override
+ public String getSQLSummaryAsTmp(String sql, List yAxis, List customFilter, List extFilterRequestList) {
+ return getSQLSummary("(" + sqlFix(sql) + ")", yAxis, customFilter, extFilterRequestList);
+ }
+
+ @Override
+ public String wrapSql(String sql) {
+ sql = sql.trim();
+ if (sql.lastIndexOf(";") == (sql.length() - 1)) {
+ sql = sql.substring(0, sql.length() - 1);
+ }
+ String tmpSql = "SELECT * FROM (" + sql + ") AS tmp " + " LIMIT 0";
+ return tmpSql;
+ }
+
+ @Override
+ public String createRawQuerySQL(String table, List fields, Datasource ds) {
+ String[] array = fields.stream().map(f -> {
+ StringBuilder stringBuilder = new StringBuilder();
+ if (f.getDeExtractType() == 4) { // 处理 tinyint
+ stringBuilder.append("concat(`").append(f.getOriginName()).append("`,'') AS ").append(f.getDataeaseName());
+ } else {
+ stringBuilder.append("`").append(f.getOriginName()).append("` AS ").append(f.getDataeaseName());
+ }
+ return stringBuilder.toString();
+ }).toArray(String[]::new);
+ return MessageFormat.format("SELECT {0} FROM {1} ORDER BY null", StringUtils.join(array, ","), table);
+ }
+
+ @Override
+ public String createRawQuerySQLAsTmp(String sql, List fields) {
+ return createRawQuerySQL(" (" + sqlFix(sql) + ") AS tmp ", fields, null);
+ }
+
+ public String transMysqlFilterTerm(String term) {
+ switch (term) {
+ case "eq":
+ return " = ";
+ case "not_eq":
+ return " <> ";
+ case "lt":
+ return " < ";
+ case "le":
+ return " <= ";
+ case "gt":
+ return " > ";
+ case "ge":
+ return " >= ";
+ case "in":
+ return " IN ";
+ case "not in":
+ return " NOT IN ";
+ case "like":
+ return " LIKE ";
+ case "not like":
+ return " NOT LIKE ";
+ case "null":
+ return " IN ";
+ case "not_null":
+ return " IS NOT NULL AND %s <> ''";
+ case "between":
+ return " BETWEEN ";
+ default:
+ return "";
+ }
+ }
+
+ public List transCustomFilterList(SQLObj tableObj, List requestList) {
+ if (CollectionUtils.isEmpty(requestList)) {
+ return null;
+ }
+ List list = new ArrayList<>();
+ for (ChartCustomFilterDTO request : requestList) {
+ DatasetTableField field = request.getField();
+ if (ObjectUtils.isEmpty(field)) {
+ continue;
+ }
+ String value = request.getValue();
+ String whereName = "";
+ String whereTerm = transMysqlFilterTerm(request.getTerm());
+ String whereValue = "";
+ String originName;
+ if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) {
+ // 解析origin name中有关联的字段生成sql表达式
+ originName = calcFieldRegex(field.getOriginName(), tableObj);
+ } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 1) {
+ originName = String.format(CKConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName());
+ } else {
+ originName = String.format(CKConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName());
+ }
+ if (field.getDeType() == DeTypeConstants.DE_TIME) {
+ if (field.getDeExtractType() == DeTypeConstants.DE_STRING || field.getDeExtractType() == 5) {
+ whereName = String.format(CKConstants.toDateTime, originName);
+ }
+ if (field.getDeExtractType() == DeTypeConstants.DE_INT || field.getDeExtractType() == DeTypeConstants.DE_FLOAT || field.getDeExtractType() == 4) {
+ String cast = String.format(CKConstants.toFloat64, originName);
+ whereName = String.format(CKConstants.toDateTime, cast);
+ }
+ if (field.getDeExtractType() == 1) {
+ whereName = originName;
+ }
+ } else {
+ whereName = originName;
+ }
+ if (StringUtils.equalsIgnoreCase(request.getTerm(), "null")) {
+ whereValue = CKConstants.WHERE_VALUE_NULL;
+ } else if (StringUtils.equalsIgnoreCase(request.getTerm(), "not_null")) {
+ whereTerm = String.format(whereTerm, originName);
+ } else if (StringUtils.containsIgnoreCase(request.getTerm(), "in")) {
+ whereValue = "('" + StringUtils.join(value, "','") + "')";
+ } else if (StringUtils.containsIgnoreCase(request.getTerm(), "like")) {
+ whereValue = "'%" + value + "%'";
+ } else {
+ whereValue = String.format(CKConstants.WHERE_VALUE_VALUE, value);
+ }
+ list.add(SQLObj.builder()
+ .whereField(whereName)
+ .whereTermAndValue(whereTerm + whereValue)
+ .build());
+ }
+ return list;
+ }
+
+ public List transExtFilterList(SQLObj tableObj, List requestList) {
+ if (CollectionUtils.isEmpty(requestList)) {
+ return null;
+ }
+ List list = new ArrayList<>();
+ for (ChartExtFilterRequest request : requestList) {
+ List value = request.getValue();
+ DatasetTableField field = request.getDatasetTableField();
+ if (CollectionUtils.isEmpty(value) || ObjectUtils.isEmpty(field)) {
+ continue;
+ }
+ String whereName = "";
+ String whereTerm = transMysqlFilterTerm(request.getOperator());
+ String whereValue = "";
+
+ String originName;
+ if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 2) {
+ // 解析origin name中有关联的字段生成sql表达式
+ originName = calcFieldRegex(field.getOriginName(), tableObj);
+ } else if (ObjectUtils.isNotEmpty(field.getExtField()) && field.getExtField() == 1) {
+ originName = String.format(CKConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName());
+ } else {
+ originName = String.format(CKConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getOriginName());
+ }
+
+ if (field.getDeType() == DeTypeConstants.DE_TIME) {
+ if (field.getDeExtractType() == DeTypeConstants.DE_STRING || field.getDeExtractType() == 5) {
+ whereName = String.format(CKConstants.toDateTime, originName);
+ }
+ if (field.getDeExtractType() == DeTypeConstants.DE_FLOAT || field.getDeExtractType() == DeTypeConstants.DE_FLOAT || field.getDeExtractType() == 4) {
+ String cast = String.format(CKConstants.toFloat64, originName);
+ whereName = String.format(CKConstants.toDateTime, cast);
+ }
+ if (field.getDeExtractType() == 1) {
+ whereName = originName;
+ }
+ } else {
+ whereName = originName;
+ }
+
+
+ if (StringUtils.containsIgnoreCase(request.getOperator(), "in")) {
+ whereValue = "('" + StringUtils.join(value, "','") + "')";
+ } else if (StringUtils.containsIgnoreCase(request.getOperator(), "like")) {
+ whereValue = "'%" + value.get(0) + "%'";
+ } else if (StringUtils.containsIgnoreCase(request.getOperator(), "between")) {
+ if (request.getDatasetTableField().getDeType() == DeTypeConstants.DE_TIME) {
+ SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ String startTime = simpleDateFormat.format(new Date(Long.parseLong(value.get(0))));
+ String endTime = simpleDateFormat.format(new Date(Long.parseLong(value.get(1))));
+ whereValue = String.format(CKConstants.WHERE_BETWEEN, startTime, endTime);
+ } else {
+ whereValue = String.format(CKConstants.WHERE_BETWEEN, value.get(0), value.get(1));
+ }
+ } else {
+ whereValue = String.format(CKConstants.WHERE_VALUE_VALUE, value.get(0));
+ }
+ list.add(SQLObj.builder()
+ .whereField(whereName)
+ .whereTermAndValue(whereTerm + whereValue)
+ .build());
+ }
+ return list;
+ }
+
+ private String sqlFix(String sql) {
+ if (sql.lastIndexOf(";") == (sql.length() - 1)) {
+ sql = sql.substring(0, sql.length() - 1);
+ }
+ return sql;
+ }
+
+ private String transDateFormat(String dateStyle, String datePattern) {
+ String split = "-";
+ if (StringUtils.equalsIgnoreCase(datePattern, "date_sub")) {
+ split = "-";
+ } else if (StringUtils.equalsIgnoreCase(datePattern, "date_split")) {
+ split = "/";
+ } else {
+ split = "-";
+ }
+
+ if (StringUtils.isEmpty(dateStyle)) {
+ return "%Y-%m-%d %H:%M:%S";
+ }
+
+ switch (dateStyle) {
+ case "y":
+ return "%Y";
+ case "y_M":
+ return "%Y" + split + "%m";
+ case "y_M_d":
+ return "%Y" + split + "%m" + split + "%d";
+ case "H_m_s":
+ return "%H:%M:%S";
+ case "y_M_d_H_m":
+ return "%Y" + split + "%m" + split + "%d" + " %H:%M";
+ case "y_M_d_H_m_s":
+ return "%Y" + split + "%m" + split + "%d" + " %H:%M:%S";
+ default:
+ return "%Y-%m-%d %H:%M:%S";
+ }
+ }
+
+ private SQLObj getXFields(ChartViewFieldDTO x, String originField, String fieldAlias) {
+ String fieldName = "";
+ if (x.getDeExtractType() == DeTypeConstants.DE_TIME) {
+ if (x.getDeType() == DeTypeConstants.DE_INT || x.getDeType() == DeTypeConstants.DE_FLOAT) {
+ if(x.getType().equalsIgnoreCase("DATE")){
+ fieldName = String.format(CKConstants.toInt32, String.format(CKConstants.toDateTime, originField)) + "*1000";
+ }else {
+ fieldName = String.format(CKConstants.toInt32, originField) + "*1000";
+ }
+ } else if (x.getDeType() == DeTypeConstants.DE_TIME) {
+ String format = transDateFormat(x.getDateStyle(), x.getDatePattern());
+ fieldName = String.format(CKConstants.formatDateTime, originField, format);
+ } else {
+ fieldName = originField;
+ }
+ } else {
+ if (x.getDeType() == DeTypeConstants.DE_TIME) {
+ String format = transDateFormat(x.getDateStyle(), x.getDatePattern());
+ if (x.getDeExtractType() == DeTypeConstants.DE_STRING) {
+ fieldName = String.format(CKConstants.formatDateTime, String.format(CKConstants.toDateTime, originField), format);
+ } else {
+ fieldName = String.format(CKConstants.formatDateTime, String.format(CKConstants.toDateTime, String.format(CKConstants.toFloat64, originField)), format);
+ }
+ } else {
+ fieldName = originField;
+ }
+ }
+ return SQLObj.builder()
+ .fieldName(fieldName)
+ .fieldAlias(fieldAlias)
+ .build();
+ }
+
+
+ private SQLObj getYFields(ChartViewFieldDTO y, String originField, String fieldAlias) {
+ String fieldName = "";
+ if (StringUtils.equalsIgnoreCase(y.getOriginName(), "*")) {
+ fieldName = CKConstants.AGG_COUNT;
+ } else if (SQLConstants.DIMENSION_TYPE.contains(y.getDeType())) {
+ fieldName = String.format(CKConstants.AGG_FIELD, y.getSummary(), originField);
+ } else {
+ if (StringUtils.equalsIgnoreCase(y.getSummary(), "avg") || StringUtils.containsIgnoreCase(y.getSummary(), "pop")) {
+ String cast = y.getDeType() == 2? String.format(CKConstants.toInt64, originField) : String.format(CKConstants.toFloat64, originField);
+ String agg = String.format(CKConstants.AGG_FIELD, y.getSummary(), cast);
+ fieldName = String.format(CKConstants.toDecimal, agg);
+ } else {
+ String cast = y.getDeType() == 2 ? String.format(CKConstants.toInt64, originField) : String.format(CKConstants.toFloat64, originField);
+ fieldName = String.format(CKConstants.AGG_FIELD, y.getSummary(), cast);
+ }
+ }
+ return SQLObj.builder()
+ .fieldName(fieldName)
+ .fieldAlias(fieldAlias)
+ .build();
+ }
+
+ private List getYWheres(ChartViewFieldDTO y, String originField, String fieldAlias) {
+ List list = new ArrayList<>();
+ if (CollectionUtils.isNotEmpty(y.getFilter()) && y.getFilter().size() > 0) {
+ y.getFilter().forEach(f -> {
+ String whereTerm = transMysqlFilterTerm(f.getTerm());
+ String whereValue = "";
+ // 原始类型不是时间,在de中被转成时间的字段做处理
+ if (StringUtils.equalsIgnoreCase(f.getTerm(), "null")) {
+ whereValue = CKConstants.WHERE_VALUE_NULL;
+ } else if (StringUtils.equalsIgnoreCase(f.getTerm(), "not_null")) {
+ whereTerm = String.format(whereTerm, originField);
+ } else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) {
+ whereValue = "('" + StringUtils.join(f.getValue(), "','") + "')";
+ } else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) {
+ whereValue = "'%" + f.getValue() + "%'";
+ } else {
+ whereValue = String.format(CKConstants.WHERE_VALUE_VALUE, f.getValue());
+ }
+ list.add(SQLObj.builder()
+ .whereField(fieldAlias)
+ .whereAlias(fieldAlias)
+ .whereTermAndValue(whereTerm + whereValue)
+ .build());
+ });
+ }
+ return list;
+ }
+
+ private String calcFieldRegex(String originField, SQLObj tableObj) {
+ originField = originField.replaceAll("[\\t\\n\\r]]", "");
+ // 正则提取[xxx]
+ String regex = "\\[(.*?)]";
+ Pattern pattern = Pattern.compile(regex);
+ Matcher matcher = pattern.matcher(originField);
+ Set ids = new HashSet<>();
+ while (matcher.find()) {
+ String id = matcher.group(1);
+ ids.add(id);
+ }
+ if (CollectionUtils.isEmpty(ids)) {
+ return originField;
+ }
+ DatasetTableFieldExample datasetTableFieldExample = new DatasetTableFieldExample();
+ datasetTableFieldExample.createCriteria().andIdIn(new ArrayList<>(ids));
+ List calcFields = datasetTableFieldMapper.selectByExample(datasetTableFieldExample);
+ for (DatasetTableField ele : calcFields) {
+ originField = originField.replaceAll("\\[" + ele.getId() + "]",
+ String.format(CKConstants.KEYWORD_FIX, tableObj.getTableAlias(), ele.getOriginName()));
+ }
+ return originField;
+ }
+}
diff --git a/backend/src/main/java/io/dataease/provider/doris/DorisConstants.java b/backend/src/main/java/io/dataease/provider/doris/DorisConstants.java
index fda5ea41ef..6f9a65f1c8 100644
--- a/backend/src/main/java/io/dataease/provider/doris/DorisConstants.java
+++ b/backend/src/main/java/io/dataease/provider/doris/DorisConstants.java
@@ -19,6 +19,8 @@ public class DorisConstants extends SQLConstants {
public static final String FROM_UNIXTIME = "FROM_UNIXTIME(%s,'%s')";
+ public static final String STR_TO_DATE = "STR_TO_DATE(%s,'%s')";
+
public static final String CAST = "CAST(%s AS %s)";
public static final String DEFAULT_DATE_FORMAT = "%Y-%m-%d %H:%i:%S";
@@ -31,6 +33,8 @@ public class DorisConstants extends SQLConstants {
public static final String WHERE_VALUE_VALUE = "'%s'";
+ public static final String WHERE_NUMBER_VALUE = "%s";
+
public static final String AGG_COUNT = "COUNT(*)";
public static final String AGG_FIELD = "%s(%s)";
diff --git a/backend/src/main/java/io/dataease/provider/doris/DorisQueryProvider.java b/backend/src/main/java/io/dataease/provider/doris/DorisQueryProvider.java
index 8fe11624f3..ce05913ede 100644
--- a/backend/src/main/java/io/dataease/provider/doris/DorisQueryProvider.java
+++ b/backend/src/main/java/io/dataease/provider/doris/DorisQueryProvider.java
@@ -281,6 +281,83 @@ public class DorisQueryProvider extends QueryProvider {
return st.render();
}
+ @Override
+ public String getSQLTableInfo(String table, List xAxis, List customFilter, List extFilterRequestList, Datasource ds) {
+ SQLObj tableObj = SQLObj.builder()
+ .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(DorisConstants.KEYWORD_TABLE, table))
+ .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0))
+ .build();
+ List xFields = new ArrayList<>();
+ List xWheres = new ArrayList<>();
+ List xOrders = new ArrayList<>();
+ if (CollectionUtils.isNotEmpty(xAxis)) {
+ for (int i = 0; i < xAxis.size(); i++) {
+ ChartViewFieldDTO x = xAxis.get(i);
+ String originField;
+ if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 2) {
+ // 解析origin name中有关联的字段生成sql表达式
+ originField = calcFieldRegex(x.getOriginName(), tableObj);
+ } else if (ObjectUtils.isNotEmpty(x.getExtField()) && x.getExtField() == 1) {
+ originField = String.format(DorisConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getDataeaseName());
+ } else {
+ originField = String.format(DorisConstants.KEYWORD_FIX, tableObj.getTableAlias(), x.getDataeaseName());
+ }
+ String fieldAlias = String.format(SQLConstants.FIELD_ALIAS_X_PREFIX, i);
+ // 处理横轴字段
+ xFields.add(getXFields(x, originField, fieldAlias));
+ // 处理横轴过滤
+// xWheres.addAll(getXWheres(x, originField, fieldAlias));
+ // 处理横轴排序
+ if (StringUtils.isNotEmpty(x.getSort()) && !StringUtils.equalsIgnoreCase(x.getSort(), "none")) {
+ xOrders.add(SQLObj.builder()
+ .orderField(originField)
+ .orderAlias(fieldAlias)
+ .orderDirection(x.getSort())
+ .build());
+ }
+ }
+ }
+ // 处理视图中字段过滤
+ List customWheres = transCustomFilterList(tableObj, customFilter);
+ // 处理仪表板字段过滤
+ List extWheres = transExtFilterList(tableObj, extFilterRequestList);
+ // 构建sql所有参数
+ List fields = new ArrayList<>();
+ fields.addAll(xFields);
+ List wheres = new ArrayList<>();
+ wheres.addAll(xWheres);
+ if (customWheres != null) wheres.addAll(customWheres);
+ if (extWheres != null) wheres.addAll(extWheres);
+ List groups = new ArrayList<>();
+ groups.addAll(xFields);
+ // 外层再次套sql
+ List orders = new ArrayList<>();
+ orders.addAll(xOrders);
+
+ STGroup stg = new STGroupFile(SQLConstants.SQL_TEMPLATE);
+ ST st_sql = stg.getInstanceOf("previewSql");
+ st_sql.add("isGroup", false);
+ if (CollectionUtils.isNotEmpty(xFields)) st_sql.add("groups", xFields);
+ if (CollectionUtils.isNotEmpty(wheres)) st_sql.add("filters", wheres);
+ if (ObjectUtils.isNotEmpty(tableObj)) st_sql.add("table", tableObj);
+ String sql = st_sql.render();
+
+ ST st = stg.getInstanceOf("previewSql");
+ st.add("isGroup", false);
+ SQLObj tableSQL = SQLObj.builder()
+ .tableName(String.format(DorisConstants.BRACKETS, sql))
+ .tableAlias(String.format(TABLE_ALIAS_PREFIX, 1))
+ .build();
+ if (CollectionUtils.isNotEmpty(orders)) st.add("orders", orders);
+ if (ObjectUtils.isNotEmpty(tableSQL)) st.add("table", tableSQL);
+ return st.render();
+ }
+
+ @Override
+ public String getSQLAsTmpTableInfo(String sql, List xAxis, List customFilter, List extFilterRequestList, Datasource ds) {
+ return getSQLTableInfo("(" + sqlFix(sql) + ")", xAxis, customFilter, extFilterRequestList, null);
+ }
+
@Override
public String getSQLAsTmp(String sql, List xAxis, List yAxis, List customFilter, List extFilterRequestList) {
return getSQL("(" + sql + ")", xAxis, yAxis, customFilter, extFilterRequestList, null);
@@ -686,9 +763,14 @@ public class DorisQueryProvider extends QueryProvider {
originName = String.format(DorisConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getDataeaseName());
}
- if (field.getDeType() == 1 && field.getDeExtractType() != 1) {
- String cast = String.format(DorisConstants.CAST, originName, DorisConstants.DEFAULT_INT_FORMAT) + "/1000";
- whereName = String.format(DorisConstants.FROM_UNIXTIME, cast, DorisConstants.DEFAULT_DATE_FORMAT);
+ if (field.getDeType() == 1) {
+ if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5 || field.getDeExtractType() == 1) {
+ whereName = String.format(DorisConstants.STR_TO_DATE, originName, DorisConstants.DEFAULT_DATE_FORMAT);
+ }
+ if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) {
+ String cast = String.format(DorisConstants.CAST, originName, DorisConstants.DEFAULT_INT_FORMAT) + "/1000";
+ whereName = String.format(DorisConstants.FROM_UNIXTIME, cast, DorisConstants.DEFAULT_DATE_FORMAT);
+ }
} else if (field.getDeType() == 0) {
whereName = String.format(DorisConstants.CAST, originName, DorisConstants.VARCHAR);
} else {
@@ -703,7 +785,11 @@ public class DorisQueryProvider extends QueryProvider {
} else if (StringUtils.containsIgnoreCase(request.getTerm(), "like")) {
whereValue = "'%" + value + "%'";
} else {
- whereValue = String.format(DorisConstants.WHERE_VALUE_VALUE, value);
+ if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) {
+ whereValue = String.format(DorisConstants.WHERE_NUMBER_VALUE, value);
+ } else {
+ whereValue = String.format(DorisConstants.WHERE_VALUE_VALUE, value);
+ }
}
list.add(SQLObj.builder()
.whereField(whereName)
@@ -738,9 +824,14 @@ public class DorisQueryProvider extends QueryProvider {
originName = String.format(DorisConstants.KEYWORD_FIX, tableObj.getTableAlias(), field.getDataeaseName());
}
- if (field.getDeType() == 1 && field.getDeExtractType() != 1) {
- String cast = String.format(DorisConstants.CAST, originName, DorisConstants.DEFAULT_INT_FORMAT) + "/1000";
- whereName = String.format(DorisConstants.FROM_UNIXTIME, cast, DorisConstants.DEFAULT_DATE_FORMAT);
+ if (field.getDeType() == 1) {
+ if (field.getDeExtractType() == 0 || field.getDeExtractType() == 5 || field.getDeExtractType() == 1) {
+ whereName = String.format(DorisConstants.STR_TO_DATE, originName, DorisConstants.DEFAULT_DATE_FORMAT);
+ }
+ if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) {
+ String cast = String.format(DorisConstants.CAST, originName, DorisConstants.DEFAULT_INT_FORMAT) + "/1000";
+ whereName = String.format(DorisConstants.FROM_UNIXTIME, cast, DorisConstants.DEFAULT_DATE_FORMAT);
+ }
} else if (field.getDeType() == 0) {
whereName = String.format(DorisConstants.CAST, originName, DorisConstants.VARCHAR);
} else {
@@ -762,7 +853,11 @@ public class DorisQueryProvider extends QueryProvider {
whereValue = String.format(DorisConstants.WHERE_BETWEEN, value.get(0), value.get(1));
}
} else {
- whereValue = String.format(DorisConstants.WHERE_VALUE_VALUE, value.get(0));
+ if (field.getDeExtractType() == 2 || field.getDeExtractType() == 3 || field.getDeExtractType() == 4) {
+ whereValue = String.format(DorisConstants.WHERE_NUMBER_VALUE, value.get(0));
+ } else {
+ whereValue = String.format(DorisConstants.WHERE_VALUE_VALUE, value.get(0));
+ }
}
list.add(SQLObj.builder()
.whereField(whereName)
@@ -778,6 +873,12 @@ public class DorisQueryProvider extends QueryProvider {
split = "-";
} else if (StringUtils.equalsIgnoreCase(datePattern, "date_split")) {
split = "/";
+ } else {
+ split = "-";
+ }
+
+ if (StringUtils.isEmpty(dateStyle)) {
+ return "%Y-%m-%d %H:%i:%S";
}
switch (dateStyle) {
diff --git a/backend/src/main/java/io/dataease/provider/es/EsQueryProvider.java b/backend/src/main/java/io/dataease/provider/es/EsQueryProvider.java
new file mode 100644
index 0000000000..9f8924c6eb
--- /dev/null
+++ b/backend/src/main/java/io/dataease/provider/es/EsQueryProvider.java
@@ -0,0 +1,949 @@
+package io.dataease.provider.es;
+
+import io.dataease.base.domain.DatasetTableField;
+import io.dataease.base.domain.DatasetTableFieldExample;
+import io.dataease.base.domain.Datasource;
+import io.dataease.base.mapper.DatasetTableFieldMapper;
+import io.dataease.commons.constants.DeTypeConstants;
+import io.dataease.controller.request.chart.ChartExtFilterRequest;
+import io.dataease.dto.chart.ChartCustomFilterDTO;
+import io.dataease.dto.chart.ChartViewFieldDTO;
+import io.dataease.dto.sqlObj.SQLObj;
+import io.dataease.provider.QueryProvider;
+import io.dataease.provider.SQLConstants;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+import org.stringtemplate.v4.ST;
+import org.stringtemplate.v4.STGroup;
+import org.stringtemplate.v4.STGroupFile;
+
+import javax.annotation.Resource;
+import java.text.MessageFormat;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import static io.dataease.provider.SQLConstants.TABLE_ALIAS_PREFIX;
+
+@Service("esQuery")
+public class EsQueryProvider extends QueryProvider {
+ @Resource
+ private DatasetTableFieldMapper datasetTableFieldMapper;
+
+ @Override
+ public Integer transFieldType(String field) {
+ switch (field) {
+ case "keyword":
+ case "text":
+ case "binary":
+ case "object":
+ case "nested":
+ case "null":
+ case "ip":
+ case "unsupported":
+ return DeTypeConstants.DE_STRING;
+ case "boolean":
+ case "byte":
+ case "short":
+ case "integer":
+ case "long":
+ return DeTypeConstants.DE_INT;
+ case "double":
+ case "float":
+ case "half_float":
+ case "scaled_float":
+ return DeTypeConstants.DE_FLOAT;
+ case "datetime":
+ return DeTypeConstants.DE_TIME;
+ default:
+ return 0;
+ }
+ }
+
+ public static Integer transFieldTypeSize(String field) {
+ switch (field) {
+ case "null":
+ return 1;
+ case "boolean":
+ return 1;
+ case "byte":
+ return 3;
+ case "short":
+ return 5;
+ case "integer":
+ return 10;
+ case "long":
+ return 19;
+ case "double":
+ case "float":
+ case "half_float":
+ case "scaled_float":
+ return 15;
+ case "keyword":
+ case "text":
+ case "binary":
+ case "object":
+ case "nested":
+ return 65532;
+ case "datetime":
+ return 50;
+ case "ip":
+ return 50;
+ case "unsupported":
+ return 50;
+ default:
+ return 0;
+ }
+ }
+
+ @Override
+ public String createSQLPreview(String sql, String orderBy) {
+ return "SELECT * FROM (" + sqlFix(sql) + ") AS tmp ORDER BY null " + " LIMIT 1000";
+ }
+
+ @Override
+ public String createQuerySQL(String table, List fields, boolean isGroup, Datasource ds) {
+ SQLObj tableObj = SQLObj.builder()
+ .tableName((table.startsWith("(") && table.endsWith(")")) ? table : String.format(EsSqlLConstants.KEYWORD_TABLE, table))
+ .tableAlias(String.format(TABLE_ALIAS_PREFIX, 0))
+ .build();
+ List