3 Commits

Author SHA1 Message Date
pisces
f4be6f65ec Merge 5b45cfbad7 into 07f6be51c7 2024-12-12 11:07:08 +08:00
mislayming
07f6be51c7 SpringBoot3升级 (#1947)
Some checks failed
supersonic CentOS CI / build (21) (push) Has been cancelled
supersonic mac CI / build (21) (push) Has been cancelled
supersonic ubuntu CI / build (21) (push) Has been cancelled
supersonic windows CI / build (21) (push) Has been cancelled
2024-12-11 17:09:20 +08:00
pisces
5b45cfbad7 feat(chat-sdk/chatitem): 消息支持导出图表图片 2024-12-02 15:16:51 +08:00
100 changed files with 520 additions and 377 deletions

View File

@@ -37,9 +37,9 @@ jobs:
- name: Install Maven with retry
run: |
for i in {1..5}; do
for i in {1..5}; do
dnf install -y maven && break || sleep 15
done
done
- name: Verify Java and Maven installation
run: |
@@ -57,4 +57,5 @@ jobs:
run: mvn -B package --file pom.xml
- name: Test with Maven
run: mvn test
run: mvn test

View File

@@ -1,11 +1,11 @@
package com.tencent.supersonic.auth.api.authentication.adaptor;
import javax.servlet.http.HttpServletRequest;
import com.tencent.supersonic.auth.api.authentication.pojo.Organization;
import com.tencent.supersonic.auth.api.authentication.pojo.UserToken;
import com.tencent.supersonic.auth.api.authentication.request.UserReq;
import com.tencent.supersonic.common.pojo.User;
import jakarta.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Set;

View File

@@ -1,7 +1,7 @@
package com.tencent.supersonic.auth.api.authentication.request;
import javax.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
@Data

View File

@@ -1,7 +1,6 @@
package com.tencent.supersonic.auth.api.authentication.request;
import javax.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
@Data

View File

@@ -1,12 +1,13 @@
package com.tencent.supersonic.auth.api.authentication.service;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.tencent.supersonic.auth.api.authentication.pojo.Organization;
import com.tencent.supersonic.auth.api.authentication.pojo.UserToken;
import com.tencent.supersonic.auth.api.authentication.request.UserReq;
import com.tencent.supersonic.common.pojo.User;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Set;

View File

@@ -1,9 +1,8 @@
package com.tencent.supersonic.auth.api.authentication.service;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.tencent.supersonic.common.pojo.User;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
public interface UserStrategy {

View File

@@ -1,13 +1,12 @@
package com.tencent.supersonic.auth.api.authentication.utils;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.tencent.supersonic.auth.api.authentication.service.UserStrategy;
import com.tencent.supersonic.common.config.SystemConfig;
import com.tencent.supersonic.common.pojo.User;
import com.tencent.supersonic.common.service.SystemConfigService;
import com.tencent.supersonic.common.util.ContextUtils;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.util.CollectionUtils;
public final class UserHolder {

View File

@@ -1,7 +1,5 @@
package com.tencent.supersonic.auth.authentication.adaptor;
import javax.servlet.http.HttpServletRequest;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.tencent.supersonic.auth.api.authentication.adaptor.UserAdaptor;
@@ -16,6 +14,7 @@ import com.tencent.supersonic.auth.authentication.utils.TokenService;
import com.tencent.supersonic.common.pojo.User;
import com.tencent.supersonic.common.util.AESEncryptionUtil;
import com.tencent.supersonic.common.util.ContextUtils;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;

View File

@@ -1,12 +1,11 @@
package com.tencent.supersonic.auth.authentication.interceptor;
import javax.servlet.http.HttpServletRequest;
import com.tencent.supersonic.auth.api.authentication.config.AuthenticationConfig;
import com.tencent.supersonic.auth.api.authentication.constant.UserConstants;
import com.tencent.supersonic.auth.authentication.service.UserServiceImpl;
import com.tencent.supersonic.auth.authentication.utils.TokenService;
import com.tencent.supersonic.common.util.S2ThreadContext;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.apache.catalina.connector.RequestFacade;
import org.apache.commons.lang3.StringUtils;

View File

@@ -1,8 +1,5 @@
package com.tencent.supersonic.auth.authentication.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.tencent.supersonic.auth.api.authentication.annotation.AuthenticationIgnore;
import com.tencent.supersonic.auth.api.authentication.config.AuthenticationConfig;
import com.tencent.supersonic.auth.api.authentication.pojo.UserWithPassword;
@@ -14,6 +11,8 @@ import com.tencent.supersonic.common.util.ContextUtils;
import com.tencent.supersonic.common.util.S2ThreadContext;
import com.tencent.supersonic.common.util.ThreadContext;
import io.jsonwebtoken.Claims;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.method.HandlerMethod;

View File

@@ -1,14 +1,13 @@
package com.tencent.supersonic.auth.authentication.rest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.tencent.supersonic.auth.api.authentication.pojo.Organization;
import com.tencent.supersonic.auth.api.authentication.pojo.UserToken;
import com.tencent.supersonic.auth.api.authentication.request.UserReq;
import com.tencent.supersonic.auth.api.authentication.request.UserTokenReq;
import com.tencent.supersonic.auth.api.authentication.service.UserService;
import com.tencent.supersonic.common.pojo.User;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

View File

@@ -1,8 +1,5 @@
package com.tencent.supersonic.auth.authentication.service;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.tencent.supersonic.auth.api.authentication.pojo.Organization;
import com.tencent.supersonic.auth.api.authentication.pojo.UserToken;
import com.tencent.supersonic.auth.api.authentication.request.UserReq;
@@ -12,6 +9,8 @@ import com.tencent.supersonic.auth.authentication.utils.ComponentFactory;
import com.tencent.supersonic.common.config.SystemConfig;
import com.tencent.supersonic.common.pojo.User;
import com.tencent.supersonic.common.service.SystemConfigService;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

View File

@@ -1,10 +1,9 @@
package com.tencent.supersonic.auth.authentication.strategy;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.tencent.supersonic.auth.api.authentication.service.UserStrategy;
import com.tencent.supersonic.common.pojo.User;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Service;
@Service

View File

@@ -1,13 +1,12 @@
package com.tencent.supersonic.auth.authentication.strategy;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.tencent.supersonic.auth.api.authentication.constant.UserConstants;
import com.tencent.supersonic.auth.api.authentication.service.UserStrategy;
import com.tencent.supersonic.auth.authentication.utils.TokenService;
import com.tencent.supersonic.common.pojo.User;
import io.jsonwebtoken.Claims;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Service;
import java.util.Optional;

View File

@@ -1,10 +1,10 @@
package com.tencent.supersonic.auth.authentication.strategy;
import javax.annotation.PostConstruct;
import com.tencent.supersonic.auth.api.authentication.config.AuthenticationConfig;
import com.tencent.supersonic.auth.api.authentication.service.UserStrategy;
import com.tencent.supersonic.auth.api.authentication.utils.UserHolder;
import jakarta.annotation.PostConstruct;
import lombok.Data;
import org.springframework.context.annotation.Configuration;

View File

@@ -1,7 +1,8 @@
package com.tencent.supersonic.auth.authentication.utils;
import javax.crypto.spec.SecretKeySpec;
import javax.servlet.http.HttpServletRequest;
import com.tencent.supersonic.auth.api.authentication.config.AuthenticationConfig;
import com.tencent.supersonic.auth.api.authentication.pojo.UserWithPassword;
@@ -9,6 +10,7 @@ import com.tencent.supersonic.common.pojo.exception.AccessException;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;

View File

@@ -12,8 +12,8 @@
<artifactId>auth-authorization</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
</properties>
<dependencies>

View File

@@ -1,14 +1,13 @@
package com.tencent.supersonic.auth.authorization.rest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.tencent.supersonic.auth.api.authentication.utils.UserHolder;
import com.tencent.supersonic.auth.api.authorization.pojo.AuthGroup;
import com.tencent.supersonic.auth.api.authorization.request.QueryAuthResReq;
import com.tencent.supersonic.auth.api.authorization.response.AuthorizedResourceResp;
import com.tencent.supersonic.auth.api.authorization.service.AuthService;
import com.tencent.supersonic.common.pojo.User;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;

View File

@@ -1,9 +1,8 @@
package com.tencent.supersonic.chat.api.pojo.request;
import javax.validation.constraints.NotNull;
import com.tencent.supersonic.chat.api.pojo.enums.MemoryReviewResult;
import com.tencent.supersonic.chat.api.pojo.enums.MemoryStatus;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;

View File

@@ -1,8 +1,7 @@
package com.tencent.supersonic.chat.api.pojo.request;
import javax.validation.constraints.NotNull;
import com.tencent.supersonic.common.pojo.enums.TypeEnums;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
/** information about dictionary about the model */

View File

@@ -16,7 +16,7 @@ public class ChatContextDO implements Serializable {
private Integer chatId;
private Instant modifiedAt;
@TableField("query_user")
private String user;
private String queryUser;
private String queryText;
private String semanticParse;
}

View File

@@ -41,7 +41,7 @@ public class ChatContextRepositoryImpl implements ChatContextRepository {
private ChatContext cast(ChatContextDO contextDO) {
ChatContext chatContext = new ChatContext();
chatContext.setChatId(contextDO.getChatId());
chatContext.setUser(contextDO.getUser());
chatContext.setUser(contextDO.getQueryUser());
chatContext.setQueryText(contextDO.getQueryText());
if (contextDO.getSemanticParse() != null && !contextDO.getSemanticParse().isEmpty()) {
SemanticParseInfo semanticParseInfo =
@@ -55,7 +55,7 @@ public class ChatContextRepositoryImpl implements ChatContextRepository {
ChatContextDO chatContextDO = new ChatContextDO();
chatContextDO.setChatId(chatContext.getChatId());
chatContextDO.setQueryText(chatContext.getQueryText());
chatContextDO.setUser(chatContext.getUser());
chatContextDO.setQueryUser(chatContext.getUser());
if (chatContext.getParseInfo() != null) {
Gson g = new Gson();
chatContextDO.setSemanticParse(g.toJson(chatContext.getParseInfo()));

View File

@@ -1,14 +1,13 @@
package com.tencent.supersonic.chat.server.rest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.tencent.supersonic.auth.api.authentication.utils.UserHolder;
import com.tencent.supersonic.chat.server.agent.Agent;
import com.tencent.supersonic.chat.server.agent.AgentToolType;
import com.tencent.supersonic.chat.server.service.AgentService;
import com.tencent.supersonic.common.pojo.User;
import com.tencent.supersonic.common.pojo.enums.AuthType;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;

View File

@@ -1,8 +1,5 @@
package com.tencent.supersonic.chat.server.rest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.tencent.supersonic.auth.api.authentication.utils.UserHolder;
import com.tencent.supersonic.chat.api.pojo.request.ChatConfigBaseReq;
import com.tencent.supersonic.chat.api.pojo.request.ChatConfigEditReqReq;
@@ -14,6 +11,8 @@ import com.tencent.supersonic.common.pojo.User;
import com.tencent.supersonic.headless.api.pojo.DataSetSchema;
import com.tencent.supersonic.headless.api.pojo.response.ItemResp;
import com.tencent.supersonic.headless.server.facade.service.SemanticLayerService;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

View File

@@ -1,8 +1,5 @@
package com.tencent.supersonic.chat.server.rest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.github.pagehelper.PageInfo;
import com.tencent.supersonic.auth.api.authentication.utils.UserHolder;
import com.tencent.supersonic.chat.api.pojo.request.PageQueryInfoReq;
@@ -10,6 +7,8 @@ import com.tencent.supersonic.chat.api.pojo.response.QueryResp;
import com.tencent.supersonic.chat.api.pojo.response.ShowCaseResp;
import com.tencent.supersonic.chat.server.persistence.dataobject.ChatDO;
import com.tencent.supersonic.chat.server.service.ChatManageService;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

View File

@@ -1,9 +1,5 @@
package com.tencent.supersonic.chat.server.rest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import com.tencent.supersonic.auth.api.authentication.utils.UserHolder;
import com.tencent.supersonic.chat.api.pojo.request.ChatExecuteReq;
import com.tencent.supersonic.chat.api.pojo.request.ChatParseReq;
@@ -14,6 +10,9 @@ import com.tencent.supersonic.common.pojo.User;
import com.tencent.supersonic.common.pojo.exception.InvalidArgumentException;
import com.tencent.supersonic.headless.api.pojo.SemanticParseInfo;
import com.tencent.supersonic.headless.api.pojo.request.DimensionValueReq;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.Valid;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;

View File

@@ -1,8 +1,5 @@
package com.tencent.supersonic.chat.server.rest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.github.pagehelper.PageInfo;
import com.tencent.supersonic.auth.api.authentication.utils.UserHolder;
import com.tencent.supersonic.chat.api.pojo.enums.MemoryReviewResult;
@@ -13,6 +10,8 @@ import com.tencent.supersonic.chat.server.pojo.ChatMemory;
import com.tencent.supersonic.chat.server.service.MemoryService;
import com.tencent.supersonic.common.pojo.User;
import com.tencent.supersonic.headless.api.pojo.request.MetaBatchReq;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

View File

@@ -1,14 +1,13 @@
package com.tencent.supersonic.chat.server.rest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.tencent.supersonic.auth.api.authentication.annotation.AuthenticationIgnore;
import com.tencent.supersonic.auth.api.authentication.utils.UserHolder;
import com.tencent.supersonic.chat.api.pojo.request.PluginQueryReq;
import com.tencent.supersonic.chat.server.plugin.ChatPlugin;
import com.tencent.supersonic.chat.server.service.PluginService;
import com.tencent.supersonic.common.pojo.User;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;

View File

@@ -9,7 +9,7 @@
type="com.tencent.supersonic.chat.server.persistence.dataobject.ChatContextDO">
<id column="chat_id" property="chatId"/>
<result column="modified_at" property="modifiedAt"/>
<result column="user" property="user"/>
<result column="query_user" property="queryUser"/>
<result column="query_text" property="queryText"/>
<result column="semantic_parse" property="semanticParse"/>
<!--<result column="ext_data" property="extData"/>-->
@@ -20,4 +20,4 @@
from s2_chat_context where chat_id=#{chatId} limit 1
</select>
</mapper>
</mapper>

View File

@@ -31,21 +31,21 @@
<!--http-->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.6</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
<version>${httpmime.version}</version>
<exclusions>
<exclusion>
<artifactId>httpclient</artifactId>
<groupId>org.apache.httpcomponents</groupId>
</exclusion>
</exclusions>
<groupId>org.apache.httpcomponents.client5</groupId>
<artifactId>httpclient5</artifactId>
<version>${httpclient5.version}</version> <!-- 请确认使用最新稳定版本 -->
</dependency>
<!-- <dependency>-->
<!-- <groupId>org.apache.httpcomponents</groupId>-->
<!-- <artifactId>httpmime</artifactId>-->
<!-- <version>${httpmime.version}</version>-->
<!-- <exclusions>-->
<!-- <exclusion>-->
<!-- <artifactId>httpclient</artifactId>-->
<!-- <groupId>org.apache.httpcomponents</groupId>-->
<!-- </exclusion>-->
<!-- </exclusions>-->
<!-- </dependency>-->
<dependency>
<groupId>com.alibaba</groupId>
@@ -130,7 +130,7 @@
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>${mybatis.plus.version}</version>
</dependency>

View File

@@ -1,9 +1,10 @@
package com.tencent.supersonic.common.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.tencent.supersonic.common.util.TraceIdUtil;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;

View File

@@ -1,8 +1,7 @@
package com.tencent.supersonic.common.pojo;
import javax.validation.constraints.NotBlank;
import com.tencent.supersonic.common.pojo.enums.AggOperatorEnum;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import java.util.List;

View File

@@ -1,8 +1,7 @@
package com.tencent.supersonic.common.pojo;
import javax.validation.constraints.NotBlank;
import com.google.common.base.Objects;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import static com.tencent.supersonic.common.pojo.Constants.ASC_UPPER;

View File

@@ -1,8 +1,7 @@
package com.tencent.supersonic.headless.api.pojo;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
@Data

View File

@@ -1,10 +1,10 @@
package com.tencent.supersonic.headless.api.pojo.request;
import javax.validation.constraints.NotNull;
import com.tencent.supersonic.common.pojo.enums.StatusEnum;
import com.tencent.supersonic.common.pojo.enums.TypeEnums;
import com.tencent.supersonic.headless.api.pojo.ItemValueConfig;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;

View File

@@ -1,8 +1,7 @@
package com.tencent.supersonic.headless.api.pojo.request;
import javax.validation.constraints.NotNull;
import com.tencent.supersonic.common.pojo.enums.TypeEnums;
import jakarta.validation.constraints.NotNull;
import lombok.Builder;
import lombok.Data;

View File

@@ -1,8 +1,7 @@
package com.tencent.supersonic.headless.api.pojo.request;
import javax.validation.constraints.NotNull;
import com.tencent.supersonic.headless.api.pojo.DimValueMap;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
/**

View File

@@ -1,11 +1,10 @@
package com.tencent.supersonic.headless.api.pojo.request;
import javax.validation.constraints.NotNull;
import com.tencent.supersonic.common.pojo.enums.DataTypeEnums;
import com.tencent.supersonic.headless.api.pojo.DimValueMap;
import com.tencent.supersonic.headless.api.pojo.DimensionTimeTypeParams;
import com.tencent.supersonic.headless.api.pojo.SchemaItem;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.util.List;

View File

@@ -1,8 +1,7 @@
package com.tencent.supersonic.headless.api.pojo.request;
import javax.validation.constraints.NotNull;
import com.tencent.supersonic.common.pojo.DateConf;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;

View File

@@ -1,8 +1,7 @@
package com.tencent.supersonic.headless.api.pojo.request;
import javax.validation.constraints.NotNull;
import com.tencent.supersonic.common.pojo.DateConf;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.ToString;

View File

@@ -1,8 +1,8 @@
package com.tencent.supersonic.headless.api.pojo.request;
import javax.validation.constraints.Size;
import com.tencent.supersonic.common.pojo.DateConf;
import jakarta.validation.constraints.Size;
import lombok.Data;
import java.util.List;

View File

@@ -1,11 +1,10 @@
package com.tencent.supersonic.headless.api.pojo.request;
import javax.validation.constraints.NotNull;
import com.tencent.supersonic.headless.api.pojo.ActionInfo;
import com.tencent.supersonic.headless.api.pojo.RuleInfo;
import com.tencent.supersonic.headless.api.pojo.SchemaItem;
import com.tencent.supersonic.headless.api.pojo.enums.QueryRuleType;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.ToString;

View File

@@ -1,9 +1,8 @@
package com.tencent.supersonic.headless.api.pojo.request;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import com.tencent.supersonic.common.pojo.enums.TypeEnums;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.util.List;

View File

@@ -1,9 +1,8 @@
package com.tencent.supersonic.headless.api.pojo.request;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import com.tencent.supersonic.headless.api.pojo.SqlVariable;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;

View File

@@ -1,8 +1,7 @@
package com.tencent.supersonic.headless.api.pojo.request;
import javax.validation.constraints.NotNull;
import com.tencent.supersonic.headless.api.pojo.SchemaElementType;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.ToString;

View File

@@ -1,9 +1,8 @@
package com.tencent.supersonic.headless.api.pojo.request;
import javax.validation.constraints.NotNull;
import com.alibaba.fastjson.JSONObject;
import com.tencent.supersonic.headless.api.pojo.SchemaItem;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.util.HashMap;

View File

@@ -1,9 +1,8 @@
package com.tencent.supersonic.headless.api.pojo.request;
import javax.validation.constraints.NotNull;
import com.tencent.supersonic.common.pojo.RecordInfo;
import com.tencent.supersonic.headless.api.pojo.enums.TagDefineType;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
@Data

View File

@@ -1,9 +1,8 @@
package com.tencent.supersonic.headless.api.pojo.request;
import javax.validation.constraints.NotNull;
import com.google.common.collect.Lists;
import com.tencent.supersonic.common.pojo.RecordInfo;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.util.List;

View File

@@ -1,8 +1,9 @@
package com.tencent.supersonic.headless.api.pojo.request;
import javax.validation.constraints.NotNull;
import com.tencent.supersonic.common.pojo.PageBaseReq;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.util.List;

View File

@@ -1,10 +1,9 @@
package com.tencent.supersonic.headless.api.pojo.response;
import javax.validation.constraints.NotNull;
import com.tencent.supersonic.common.pojo.enums.StatusEnum;
import com.tencent.supersonic.common.pojo.enums.TypeEnums;
import com.tencent.supersonic.headless.api.pojo.ItemValueConfig;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import static com.tencent.supersonic.common.pojo.Constants.UNDERLINE;

View File

@@ -1,11 +1,10 @@
package com.tencent.supersonic.headless.api.pojo.response;
import javax.validation.constraints.NotNull;
import com.tencent.supersonic.headless.api.pojo.ActionInfo;
import com.tencent.supersonic.headless.api.pojo.RuleInfo;
import com.tencent.supersonic.headless.api.pojo.SchemaItem;
import com.tencent.supersonic.headless.api.pojo.enums.QueryRuleType;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.util.Map;

View File

@@ -12,8 +12,8 @@
<artifactId>headless-chat</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
@@ -124,4 +124,4 @@
</dependency>
</dependencies>
</project>
</project>

View File

@@ -12,8 +12,8 @@
<artifactId>headless-core</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
</properties>

View File

@@ -12,8 +12,8 @@
<artifactId>headless-server</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
@@ -158,7 +158,7 @@
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>
</project>

View File

@@ -1,13 +1,12 @@
package com.tencent.supersonic.headless.server.aspect;
import javax.servlet.http.HttpServletRequest;
import com.tencent.supersonic.common.pojo.Pair;
import com.tencent.supersonic.common.pojo.exception.InvalidArgumentException;
import com.tencent.supersonic.common.util.SignatureUtils;
import com.tencent.supersonic.headless.api.pojo.enums.AppStatus;
import com.tencent.supersonic.headless.api.pojo.response.AppDetailResp;
import com.tencent.supersonic.headless.server.service.AppService;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.ProceedingJoinPoint;

View File

@@ -1,8 +1,5 @@
package com.tencent.supersonic.headless.server.facade.rest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.tencent.supersonic.auth.api.authentication.utils.UserHolder;
import com.tencent.supersonic.common.pojo.User;
import com.tencent.supersonic.headless.api.pojo.SemanticParseInfo;
@@ -11,6 +8,8 @@ import com.tencent.supersonic.headless.api.pojo.request.QuerySqlReq;
import com.tencent.supersonic.headless.api.pojo.response.ParseResp;
import com.tencent.supersonic.headless.server.facade.service.ChatLayerService;
import com.tencent.supersonic.headless.server.facade.service.SemanticLayerService;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;

View File

@@ -1,14 +1,13 @@
package com.tencent.supersonic.headless.server.facade.rest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.tencent.supersonic.auth.api.authentication.utils.UserHolder;
import com.tencent.supersonic.common.pojo.User;
import com.tencent.supersonic.headless.api.pojo.request.QueryDataSetReq;
import com.tencent.supersonic.headless.api.pojo.request.SemanticQueryReq;
import com.tencent.supersonic.headless.server.facade.service.SemanticLayerService;
import com.tencent.supersonic.headless.server.service.DataSetService;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;

View File

@@ -1,12 +1,11 @@
package com.tencent.supersonic.headless.server.facade.rest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.tencent.supersonic.auth.api.authentication.utils.UserHolder;
import com.tencent.supersonic.common.pojo.User;
import com.tencent.supersonic.headless.api.pojo.request.QueryMapReq;
import com.tencent.supersonic.headless.server.facade.service.ChatLayerService;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;

View File

@@ -1,8 +1,5 @@
package com.tencent.supersonic.headless.server.facade.rest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.tencent.supersonic.auth.api.authentication.utils.UserHolder;
import com.tencent.supersonic.common.pojo.User;
import com.tencent.supersonic.headless.api.pojo.request.BatchDownloadReq;
@@ -12,6 +9,8 @@ import com.tencent.supersonic.headless.api.pojo.request.QueryStructReq;
import com.tencent.supersonic.headless.server.facade.service.SemanticLayerService;
import com.tencent.supersonic.headless.server.service.DownloadService;
import com.tencent.supersonic.headless.server.service.MetricService;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;

View File

@@ -1,8 +1,5 @@
package com.tencent.supersonic.headless.server.facade.rest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.tencent.supersonic.auth.api.authentication.utils.UserHolder;
import com.tencent.supersonic.common.pojo.User;
import com.tencent.supersonic.common.util.StringUtil;
@@ -13,6 +10,8 @@ import com.tencent.supersonic.headless.api.pojo.request.SemanticQueryReq;
import com.tencent.supersonic.headless.api.pojo.response.SemanticQueryResp;
import com.tencent.supersonic.headless.server.facade.service.ChatLayerService;
import com.tencent.supersonic.headless.server.facade.service.SemanticLayerService;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;

View File

@@ -1,12 +1,11 @@
package com.tencent.supersonic.headless.server.facade.rest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.tencent.supersonic.auth.api.authentication.utils.UserHolder;
import com.tencent.supersonic.common.pojo.User;
import com.tencent.supersonic.headless.api.pojo.request.QueryStructReq;
import com.tencent.supersonic.headless.server.facade.service.SemanticLayerService;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;

View File

@@ -16,7 +16,7 @@ public class QueryStatDO {
private Long modelId;
private Long dataSetId;
@TableField("query_user")
private String user;
private String queryUser;
private String createdAt;
/** corresponding type, such as sql, struct, etc */
private String queryType;
@@ -28,7 +28,7 @@ public class QueryStatDO {
private String queryStructCmd;
@TableField("struct_cmd_md5")
private String queryStructCmdMd5;
@TableField("\"sql\"")
@TableField("`sql`")
private String sql;
private String sqlMd5;
private String queryEngine;

View File

@@ -1,8 +1,5 @@
package com.tencent.supersonic.headless.server.rest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.github.pagehelper.PageInfo;
import com.tencent.supersonic.auth.api.authentication.utils.UserHolder;
import com.tencent.supersonic.common.pojo.User;
@@ -11,6 +8,8 @@ import com.tencent.supersonic.headless.api.pojo.request.AppReq;
import com.tencent.supersonic.headless.api.pojo.response.AppDetailResp;
import com.tencent.supersonic.headless.api.pojo.response.AppResp;
import com.tencent.supersonic.headless.server.service.AppService;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;

View File

@@ -1,14 +1,13 @@
package com.tencent.supersonic.headless.server.rest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.tencent.supersonic.auth.api.authentication.utils.UserHolder;
import com.tencent.supersonic.common.pojo.User;
import com.tencent.supersonic.headless.api.pojo.request.CanvasReq;
import com.tencent.supersonic.headless.api.pojo.response.CanvasSchemaResp;
import com.tencent.supersonic.headless.server.persistence.dataobject.CanvasDO;
import com.tencent.supersonic.headless.server.service.CanvasService;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;

View File

@@ -1,8 +1,5 @@
package com.tencent.supersonic.headless.server.rest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.tencent.supersonic.auth.api.authentication.utils.UserHolder;
import com.tencent.supersonic.common.config.ChatModel;
import com.tencent.supersonic.common.pojo.ChatApp;
@@ -14,6 +11,8 @@ import com.tencent.supersonic.common.pojo.enums.AppModule;
import com.tencent.supersonic.common.service.ChatModelService;
import com.tencent.supersonic.common.util.ChatAppManager;
import com.tencent.supersonic.headless.server.utils.ModelConfigHelper;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;

View File

@@ -1,15 +1,14 @@
package com.tencent.supersonic.headless.server.rest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import com.tencent.supersonic.auth.api.authentication.utils.UserHolder;
import com.tencent.supersonic.common.pojo.User;
import com.tencent.supersonic.headless.api.pojo.request.ClassReq;
import com.tencent.supersonic.headless.api.pojo.response.ClassResp;
import com.tencent.supersonic.headless.server.pojo.ClassFilter;
import com.tencent.supersonic.headless.server.service.ClassService;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.Valid;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

View File

@@ -1,12 +1,11 @@
package com.tencent.supersonic.headless.server.rest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.tencent.supersonic.auth.api.authentication.utils.UserHolder;
import com.tencent.supersonic.common.pojo.User;
import com.tencent.supersonic.headless.server.persistence.dataobject.CollectDO;
import com.tencent.supersonic.headless.server.service.CollectService;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;

View File

@@ -1,14 +1,13 @@
package com.tencent.supersonic.headless.server.rest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.tencent.supersonic.auth.api.authentication.utils.UserHolder;
import com.tencent.supersonic.common.pojo.User;
import com.tencent.supersonic.headless.api.pojo.MetaFilter;
import com.tencent.supersonic.headless.api.pojo.request.DataSetReq;
import com.tencent.supersonic.headless.api.pojo.response.DataSetResp;
import com.tencent.supersonic.headless.server.service.DataSetService;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;

View File

@@ -1,8 +1,5 @@
package com.tencent.supersonic.headless.server.rest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.tencent.supersonic.auth.api.authentication.utils.UserHolder;
import com.tencent.supersonic.common.pojo.User;
import com.tencent.supersonic.headless.api.pojo.DBColumn;
@@ -13,6 +10,8 @@ import com.tencent.supersonic.headless.api.pojo.response.DatabaseResp;
import com.tencent.supersonic.headless.api.pojo.response.SemanticQueryResp;
import com.tencent.supersonic.headless.server.pojo.DatabaseParameter;
import com.tencent.supersonic.headless.server.service.DatabaseService;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

View File

@@ -1,8 +1,5 @@
package com.tencent.supersonic.headless.server.rest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.github.pagehelper.PageInfo;
import com.google.common.collect.Lists;
import com.tencent.supersonic.auth.api.authentication.utils.UserHolder;
@@ -20,6 +17,8 @@ import com.tencent.supersonic.headless.api.pojo.response.SemanticQueryResp;
import com.tencent.supersonic.headless.server.facade.service.SemanticLayerService;
import com.tencent.supersonic.headless.server.pojo.DimensionFilter;
import com.tencent.supersonic.headless.server.service.DimensionService;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;

View File

@@ -1,14 +1,13 @@
package com.tencent.supersonic.headless.server.rest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.tencent.supersonic.auth.api.authentication.utils.UserHolder;
import com.tencent.supersonic.common.pojo.User;
import com.tencent.supersonic.headless.api.pojo.request.DomainReq;
import com.tencent.supersonic.headless.api.pojo.request.DomainUpdateReq;
import com.tencent.supersonic.headless.api.pojo.response.DomainResp;
import com.tencent.supersonic.headless.server.service.DomainService;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

View File

@@ -1,9 +1,5 @@
package com.tencent.supersonic.headless.server.rest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import com.github.pagehelper.PageInfo;
import com.tencent.supersonic.auth.api.authentication.utils.UserHolder;
import com.tencent.supersonic.common.pojo.User;
@@ -21,6 +17,9 @@ import com.tencent.supersonic.headless.server.service.DictConfService;
import com.tencent.supersonic.headless.server.service.DictTaskService;
import com.tencent.supersonic.headless.server.task.DictionaryReloadTask;
import com.tencent.supersonic.headless.server.task.MetaEmbeddingTask;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;

View File

@@ -1,8 +1,5 @@
package com.tencent.supersonic.headless.server.rest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.github.pagehelper.PageInfo;
import com.google.common.collect.Lists;
import com.tencent.supersonic.auth.api.authentication.utils.UserHolder;
@@ -18,6 +15,8 @@ import com.tencent.supersonic.headless.api.pojo.request.PageMetricReq;
import com.tencent.supersonic.headless.api.pojo.response.MetricResp;
import com.tencent.supersonic.headless.server.pojo.MetricFilter;
import com.tencent.supersonic.headless.server.service.MetricService;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

View File

@@ -1,8 +1,5 @@
package com.tencent.supersonic.headless.server.rest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.google.common.collect.Lists;
import com.tencent.supersonic.auth.api.authentication.utils.UserHolder;
import com.tencent.supersonic.common.pojo.User;
@@ -17,6 +14,8 @@ import com.tencent.supersonic.headless.api.pojo.response.ModelResp;
import com.tencent.supersonic.headless.api.pojo.response.UnAvailableItemResp;
import com.tencent.supersonic.headless.server.pojo.ModelFilter;
import com.tencent.supersonic.headless.server.service.ModelService;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

View File

@@ -1,14 +1,13 @@
package com.tencent.supersonic.headless.server.rest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.tencent.supersonic.auth.api.authentication.utils.UserHolder;
import com.tencent.supersonic.common.pojo.User;
import com.tencent.supersonic.headless.api.pojo.request.QueryRuleFilter;
import com.tencent.supersonic.headless.api.pojo.request.QueryRuleReq;
import com.tencent.supersonic.headless.api.pojo.response.QueryRuleResp;
import com.tencent.supersonic.headless.server.service.QueryRuleService;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;

View File

@@ -1,14 +1,13 @@
package com.tencent.supersonic.headless.server.rest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.tencent.supersonic.auth.api.authentication.utils.UserHolder;
import com.tencent.supersonic.common.pojo.User;
import com.tencent.supersonic.common.pojo.enums.AuthType;
import com.tencent.supersonic.headless.api.pojo.response.DomainResp;
import com.tencent.supersonic.headless.api.pojo.response.ModelResp;
import com.tencent.supersonic.headless.server.service.SchemaService;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

View File

@@ -1,9 +1,5 @@
package com.tencent.supersonic.headless.server.rest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import com.github.pagehelper.PageInfo;
import com.tencent.supersonic.auth.api.authentication.utils.UserHolder;
import com.tencent.supersonic.common.pojo.User;
@@ -17,6 +13,9 @@ import com.tencent.supersonic.headless.server.persistence.dataobject.TagDO;
import com.tencent.supersonic.headless.server.pojo.TagFilter;
import com.tencent.supersonic.headless.server.service.TagMetaService;
import com.tencent.supersonic.headless.server.service.TagQueryService;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.Valid;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

View File

@@ -1,14 +1,13 @@
package com.tencent.supersonic.headless.server.rest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.tencent.supersonic.auth.api.authentication.utils.UserHolder;
import com.tencent.supersonic.common.pojo.User;
import com.tencent.supersonic.headless.api.pojo.request.TagObjectReq;
import com.tencent.supersonic.headless.api.pojo.response.TagObjectResp;
import com.tencent.supersonic.headless.server.pojo.TagObjectFilter;
import com.tencent.supersonic.headless.server.service.TagObjectService;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;

View File

@@ -1,14 +1,13 @@
package com.tencent.supersonic.headless.server.rest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.tencent.supersonic.auth.api.authentication.utils.UserHolder;
import com.tencent.supersonic.common.pojo.User;
import com.tencent.supersonic.headless.api.pojo.request.MetaBatchReq;
import com.tencent.supersonic.headless.api.pojo.request.TermReq;
import com.tencent.supersonic.headless.api.pojo.response.TermResp;
import com.tencent.supersonic.headless.server.service.TermService;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;

View File

@@ -1,10 +1,9 @@
package com.tencent.supersonic.headless.server.service;
import javax.servlet.http.HttpServletResponse;
import com.tencent.supersonic.common.pojo.User;
import com.tencent.supersonic.headless.api.pojo.request.BatchDownloadReq;
import com.tencent.supersonic.headless.api.pojo.request.DownloadMetricReq;
import jakarta.servlet.http.HttpServletResponse;
public interface DownloadService {

View File

@@ -1,7 +1,5 @@
package com.tencent.supersonic.headless.server.service.impl;
import javax.servlet.http.HttpServletResponse;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.util.FileUtils;
@@ -32,6 +30,7 @@ import com.tencent.supersonic.headless.server.pojo.DataDownload;
import com.tencent.supersonic.headless.server.service.DimensionService;
import com.tencent.supersonic.headless.server.service.DownloadService;
import com.tencent.supersonic.headless.server.service.MetricService;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.stereotype.Service;

View File

@@ -10,7 +10,7 @@
<result column="trace_id" property="traceId"/>
<result column="model_id" property="modelId"/>
<result column="data_set_id" property="dataSetId"/>
<result column="user" property="user"/>
<result column="user" property="queryUser"/>
<result column="created_at" property="createdAt"/>
<result column="query_type" property="queryType"/>
<result column="query_type_back" property="queryTypeBack"/>
@@ -40,4 +40,4 @@
<result column="query_opt_mode" property="queryOptMode"/>
</resultMap>
</mapper>
</mapper>

View File

@@ -12,8 +12,8 @@
<artifactId>launchers-chat</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<start-class>com.tencent.supersonic.ChatLauncher</start-class>
</properties>

View File

@@ -12,8 +12,8 @@
<artifactId>launchers-common</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
</properties>
<dependencies>
@@ -46,4 +46,4 @@
</dependencies>
</project>
</project>

View File

@@ -1,8 +1,10 @@
package com.tencent.supersonic.config;
import org.apache.http.client.HttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.LaxRedirectStrategy;
import org.apache.hc.client5.http.impl.LaxRedirectStrategy;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
@@ -16,14 +18,19 @@ public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate() {
// HttpClient 5 较新版本才会有LaxRedirectStrategy, 所以我重新定义了
CloseableHttpClient httpClient =
// HttpClientBuilder.create().setRedirectStrategy(new DefaultRedirectStrategy()) //
// 使用宽松重定向策略
HttpClientBuilder.create().setRedirectStrategy(new LaxRedirectStrategy()) // 使用宽松重定向策略
.build();
HttpComponentsClientHttpRequestFactory httpRequestFactory =
new HttpComponentsClientHttpRequestFactory();
new HttpComponentsClientHttpRequestFactory(httpClient);
httpRequestFactory.setConnectionRequestTimeout(2000);
httpRequestFactory.setConnectTimeout(10000);
httpRequestFactory.setReadTimeout(7200000);
HttpClient httpClient =
HttpClientBuilder.create().setRedirectStrategy(new LaxRedirectStrategy()).build();
httpRequestFactory.setHttpClient(httpClient);
RestTemplate restTemplate = new RestTemplate(httpRequestFactory);
restTemplate.getMessageConverters().set(1,
new StringHttpMessageConverter(StandardCharsets.UTF_8));

View File

@@ -1,18 +1,43 @@
package com.tencent.supersonic.web;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.boot.web.server.ErrorPage;
import org.springframework.boot.web.server.ErrorPageRegistrar;
import org.springframework.boot.web.server.ErrorPageRegistry;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.resource.NoResourceFoundException;
import org.springframework.web.servlet.resource.ResourceHttpRequestHandler;
/** error page config */
@Component
public class ErrorPageConfig implements ErrorPageRegistrar {
public class ErrorPageConfig implements ErrorPageRegistrar, HandlerExceptionResolver, Ordered {
@Override
public void registerErrorPages(ErrorPageRegistry registry) {
ErrorPage error404Page = new ErrorPage(HttpStatus.NOT_FOUND, "/webapp/index.html");
registry.addErrorPages(error404Page);
}
@Override
public int getOrder() {
return Ordered.HIGHEST_PRECEDENCE;
}
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response,
Object handler, Exception ex) {
if (handler instanceof ResourceHttpRequestHandler
&& ex instanceof NoResourceFoundException) {
ModelAndView modelAndView = new ModelAndView("/webapp/index.html");
response.setStatus(HttpStatus.OK.value());
return modelAndView;
}
return null;
}
}

View File

@@ -3,18 +3,20 @@ package com.tencent.supersonic.web;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
public class WebConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/webapp/**").addResourceLocations("classpath:/webapp/");
registry.addResourceHandler("/favicon.ico").addResourceLocations("classpath:/webapp/");
}
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("forward:webapp/index.html");
registry.addViewController("/").setViewName("forward:/webapp/index.html");
}
}

View File

@@ -12,8 +12,8 @@
<artifactId>launchers-standalone</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<start-class>com.tencent.supersonic.StandaloneLauncher</start-class>
</properties>
<dependencies>
@@ -121,6 +121,11 @@
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-properties-migrator</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>

View File

@@ -50,8 +50,8 @@ CREATE TABLE IF NOT EXISTS `company` (
`company_established_time` varchar(20) NOT NULL ,
`founder` varchar(20) NOT NULL ,
`ceo` varchar(20) NOT NULL ,
`annual_turnover` bigint(15) ,
`employee_count` int(7) ,
`annual_turnover` bigint ,
`employee_count` int ,
PRIMARY KEY (`company_id`)
);
@@ -61,15 +61,15 @@ CREATE TABLE IF NOT EXISTS `brand` (
`brand_established_time` varchar(20) NOT NULL ,
`company_id` varchar(50) NOT NULL ,
`legal_representative` varchar(20) NOT NULL ,
`registered_capital` bigint(15) ,
`registered_capital` bigint ,
PRIMARY KEY (`brand_id`)
);
CREATE TABLE IF NOT EXISTS `brand_revenue` (
`year_time` varchar(10) NOT NULL ,
`brand_id` varchar(50) NOT NULL ,
`revenue` bigint(15) NOT NULL,
`profit` bigint(15) NOT NULL ,
`revenue` bigint NOT NULL,
`profit` bigint NOT NULL ,
`revenue_growth_year_on_year` double NOT NULL ,
`profit_growth_year_on_year` double NOT NULL
);

View File

@@ -32,7 +32,7 @@ CREATE TABLE IF NOT EXISTS `s2_chat_query`
`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`query_text` mediumtext,
`user_name` varchar(150) DEFAULT NULL COMMENT '',
`query_state` int(1) DEFAULT NULL,
`query_state` int DEFAULT NULL,
`chat_id` BIGINT NOT NULL , -- context chat id
`query_result` mediumtext NOT NULL ,
`score` int DEFAULT '0',
@@ -61,7 +61,7 @@ CREATE TABLE IF NOT EXISTS `s2_chat_statistics`
`user_name` varchar(150) DEFAULT NULL COMMENT '',
`query_text` varchar(200),
`interface_name` varchar(100) DEFAULT NULL COMMENT '',
`cost` INT(6) NOT NULL ,
`cost` INT NOT NULL ,
`type` INT NOT NULL ,
`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

30
pom.xml
View File

@@ -22,25 +22,23 @@
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.2</version>
<version>3.2.4</version>
</parent>
<properties>
<revision>0.9.10-SNAPSHOT</revision>
<java.source.version>1.8</java.source.version>
<java.target.version>1.8</java.target.version>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<java.source.version>21</java.source.version>
<java.target.version>21</java.target.version>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<file.encoding>UTF-8</file.encoding>
<jsqlparser.version>4.7</jsqlparser.version>
<pagehelper.version>6.1.0</pagehelper.version>
<pagehelper.spring.version>2.1.0</pagehelper.spring.version>
<mybatis.version>3.5.3</mybatis.version>
<lombok.version>1.18.30</lombok.version>
<guava.version>32.0.0-jre</guava.version>
<hanlp.version>portable-1.8.3</hanlp.version>
<hadoop.version>2.7.2</hadoop.version>
<jackson.version>2.11.2</jackson.version>
<commons.lang.version>2.6</commons.lang.version>
<commons.lang3.version>3.7</commons.lang3.version>
<org.testng.version>6.13.1</org.testng.version>
@@ -50,11 +48,13 @@
<alibaba.druid.version>1.2.24</alibaba.druid.version>
<mysql.connector.java.version>5.1.46</mysql.connector.java.version>
<mybatis.plus.version>3.5.7</mybatis.plus.version>
<httpclient5.version>5.4.1</httpclient5.version>
<!-- <httpcore.version>4.4.16</httpcore.version>-->
<httpcore5.version>5.3.1</httpcore5.version>
<clickhouse.jdbc.version>0.4.6</clickhouse.jdbc.version>
<h2.version>1.4.200</h2.version>
<fastjson.version>2.0.40</fastjson.version>
<dozer.verson>7.0.0</dozer.verson>
<httpmime.version>4.5.6</httpmime.version>
<!-- <httpmime.version>4.5.6</httpmime.version>-->
<transmittable.version>2.12.1</transmittable.version>
<commons.compress.version>1.26.0</commons.compress.version>
<jetty.util.version>6.1.26</jetty.util.version>
@@ -68,7 +68,7 @@
<poi.version>3.17</poi.version>
<langchain4j.version>0.34.0</langchain4j.version>
<langchain4j.embedding.version>0.27.1</langchain4j.embedding.version>
<postgresql.version>42.7.1</postgresql.version>
<!-- <postgresql.version>42.7.1</postgresql.version>-->
<st.version>4.0.8</st.version>
<duckdb_jdbc.version>0.10.0</duckdb_jdbc.version>
<flight-sql.version>15.0.2</flight-sql.version>
@@ -197,6 +197,16 @@
<artifactId>stax2-api</artifactId>
<version>${stax2.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.connector.java.version}</version>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-inline</artifactId>
<version>${mockito-inline.version}</version>
</dependency>
</dependencies>
</dependencyManagement>

View File

@@ -9,10 +9,10 @@ import {
RangeValue,
SimilarQuestionType,
} from '../../common/type';
import { useEffect, useState } from 'react';
import { createContext, useEffect, useRef, useState } from 'react';
import { chatExecute, chatParse, queryData, deleteQuery, switchEntity } from '../../service';
import { PARSE_ERROR_TIP, PREFIX_CLS, SEARCH_EXCEPTION_TIP } from '../../common/constants';
import { Spin } from 'antd';
import { message, Spin } from 'antd';
import IconFont from '../IconFont';
import ExpandParseTip from './ExpandParseTip';
import ParseTip from './ParseTip';
@@ -25,6 +25,7 @@ import SimilarQuestionItem from './SimilarQuestionItem';
import { AgentType } from '../../Chat/type';
import dayjs, { Dayjs } from 'dayjs';
import { exportCsvFile } from '../../utils/utils';
import { useMethodRegister } from '../../hooks';
type Props = {
msg: string;
@@ -51,6 +52,11 @@ type Props = {
onSendMsg?: (msg: string) => void;
};
export const ChartItemContext = createContext({
register: (...args: any[]) => {},
call: (...args: any[]) => {},
});
const ChatItem: React.FC<Props> = ({
msg,
conversationId,
@@ -433,126 +439,135 @@ const ChatItem: React.FC<Props> = ({
const { llmReq, llmResp } = parseInfo?.properties?.CONTEXT || {};
const { register, call } = useMethodRegister(() => message.error('该条消息暂不支持该操作'));
return (
<div className={prefixCls}>
{!isMobile && <IconFont type="icon-zhinengsuanfa" className={`${prefixCls}-avatar`} />}
<div className={isMobile ? `${prefixCls}-mobile-msg-card` : ''}>
<div className={`${prefixCls}-time`}>
{parseTimeCost?.parseStartTime
? dayjs(parseTimeCost.parseStartTime).format('M月D日 HH:mm')
: ''}
</div>
<div className={contentClass}>
<>
{currentAgent?.enableFeedback === 1 && !questionId && showExpandParseTip && (
<div style={{ marginBottom: 10 }}>
<ExpandParseTip
<ChartItemContext.Provider value={{ register, call }}>
<div className={prefixCls}>
{!isMobile && <IconFont type="icon-zhinengsuanfa" className={`${prefixCls}-avatar`} />}
<div className={isMobile ? `${prefixCls}-mobile-msg-card` : ''}>
<div className={`${prefixCls}-time`}>
{parseTimeCost?.parseStartTime
? dayjs(parseTimeCost.parseStartTime).format('M月D日 HH:mm')
: ''}
</div>
<div className={contentClass}>
<>
{currentAgent?.enableFeedback === 1 && !questionId && showExpandParseTip && (
<div style={{ marginBottom: 10 }}>
<ExpandParseTip
isSimpleMode={isSimpleMode}
parseInfoOptions={preParseInfoOptions}
agentId={agentId}
integrateSystem={integrateSystem}
parseTimeCost={parseTimeCost?.parseTime}
isDeveloper={isDeveloper}
onSelectParseInfo={onExpandSelectParseInfo}
onSwitchEntity={onSwitchEntity}
onFiltersChange={onFiltersChange}
onDateInfoChange={onDateInfoChange}
onRefresh={onRefresh}
handlePresetClick={handlePresetClick}
/>
</div>
)}
{!preParseMode && (
<ParseTip
isSimpleMode={isSimpleMode}
parseInfoOptions={preParseInfoOptions}
parseLoading={parseLoading}
parseInfoOptions={parseInfoOptions}
parseTip={parseTip}
currentParseInfo={parseInfo}
agentId={agentId}
dimensionFilters={dimensionFilters}
dateInfo={dateInfo}
entityInfo={entityInfo}
integrateSystem={integrateSystem}
parseTimeCost={parseTimeCost?.parseTime}
isDeveloper={isDeveloper}
onSelectParseInfo={onExpandSelectParseInfo}
onSelectParseInfo={onSelectParseInfo}
onSwitchEntity={onSwitchEntity}
onFiltersChange={onFiltersChange}
onDateInfoChange={onDateInfoChange}
onRefresh={onRefresh}
onRefresh={() => {
onRefresh();
}}
handlePresetClick={handlePresetClick}
/>
</div>
)}
)}
</>
{!preParseMode && (
<ParseTip
isSimpleMode={isSimpleMode}
parseLoading={parseLoading}
parseInfoOptions={parseInfoOptions}
parseTip={parseTip}
currentParseInfo={parseInfo}
agentId={agentId}
dimensionFilters={dimensionFilters}
dateInfo={dateInfo}
entityInfo={entityInfo}
integrateSystem={integrateSystem}
parseTimeCost={parseTimeCost?.parseTime}
isDeveloper={isDeveloper}
onSelectParseInfo={onSelectParseInfo}
onSwitchEntity={onSwitchEntity}
onFiltersChange={onFiltersChange}
onDateInfoChange={onDateInfoChange}
onRefresh={() => {
onRefresh();
}}
handlePresetClick={handlePresetClick}
/>
)}
</>
{executeMode && (
<Spin spinning={entitySwitchLoading}>
<div style={{ minHeight: 50 }}>
{!isMobile && parseInfo?.sqlInfo && isDeveloper && isDebugMode && !isSimpleMode && (
<SqlItem
agentId={agentId}
queryId={parseInfo.queryId}
{executeMode && (
<Spin spinning={entitySwitchLoading}>
<div style={{ minHeight: 50 }}>
{!isMobile &&
parseInfo?.sqlInfo &&
isDeveloper &&
isDebugMode &&
!isSimpleMode && (
<SqlItem
agentId={agentId}
queryId={parseInfo.queryId}
question={msg}
llmReq={llmReq}
llmResp={llmResp}
integrateSystem={integrateSystem}
queryMode={parseInfo.queryMode}
sqlInfo={parseInfo.sqlInfo}
sqlTimeCost={parseTimeCost?.sqlTime}
executeErrorMsg={executeErrorMsg}
/>
)}
<ExecuteItem
isSimpleMode={isSimpleMode}
queryId={parseInfo?.queryId}
question={msg}
llmReq={llmReq}
llmResp={llmResp}
integrateSystem={integrateSystem}
queryMode={parseInfo.queryMode}
sqlInfo={parseInfo.sqlInfo}
sqlTimeCost={parseTimeCost?.sqlTime}
queryMode={parseInfo?.queryMode}
executeLoading={executeLoading}
executeTip={executeTip}
executeErrorMsg={executeErrorMsg}
chartIndex={0}
data={data}
triggerResize={triggerResize}
executeItemNode={executeItemNode}
isDeveloper={isDeveloper}
renderCustomExecuteNode={renderCustomExecuteNode}
/>
)}
<ExecuteItem
isSimpleMode={isSimpleMode}
</div>
</Spin>
)}
{executeMode &&
!executeLoading &&
!isSimpleMode &&
parseInfo?.queryMode !== 'PLAIN_TEXT' && (
<SimilarQuestionItem
queryId={parseInfo?.queryId}
question={msg}
queryMode={parseInfo?.queryMode}
executeLoading={executeLoading}
executeTip={executeTip}
executeErrorMsg={executeErrorMsg}
chartIndex={0}
data={data}
triggerResize={triggerResize}
executeItemNode={executeItemNode}
isDeveloper={isDeveloper}
renderCustomExecuteNode={renderCustomExecuteNode}
defaultExpanded={parseTip !== '' || executeTip !== ''}
similarQueries={data?.similarQueries}
onSelectQuestion={onSelectQuestion}
/>
</div>
</Spin>
)}
{executeMode &&
!executeLoading &&
!isSimpleMode &&
)}
</div>
{(parseTip !== '' || (executeMode && !executeLoading)) &&
parseInfo?.queryMode !== 'PLAIN_TEXT' && (
<SimilarQuestionItem
queryId={parseInfo?.queryId}
defaultExpanded={parseTip !== '' || executeTip !== ''}
similarQueries={data?.similarQueries}
onSelectQuestion={onSelectQuestion}
<Tools
isLastMessage={isLastMessage}
queryId={parseInfo?.queryId || 0}
scoreValue={score}
isParserError={isParserError}
onExportData={() => {
onExportData();
}}
isSimpleMode={isSimpleMode}
onReExecute={queryId => {
deleteQueryInfo(queryId);
}}
/>
)}
</div>
{(parseTip !== '' || (executeMode && !executeLoading)) &&
parseInfo?.queryMode !== 'PLAIN_TEXT' && (
<Tools
isLastMessage={isLastMessage}
queryId={parseInfo?.queryId || 0}
scoreValue={score}
isParserError={isParserError}
onExportData={() => {
onExportData();
}}
onReExecute={queryId => {
deleteQueryInfo(queryId);
}}
/>
)}
</div>
</div>
</ChartItemContext.Provider>
);
};

View File

@@ -7,10 +7,19 @@ import {
} from '../../../utils/utils';
import type { ECharts } from 'echarts';
import * as echarts from 'echarts';
import React, { useEffect, useRef, useState } from 'react';
import {
forwardRef,
ForwardRefRenderFunction,
useContext,
useEffect,
useImperativeHandle,
useRef,
} from 'react';
import NoPermissionChart from '../NoPermissionChart';
import { ColumnType } from '../../../common/type';
import { Spin } from 'antd';
import { ChartItemContext } from '../../ChatItem';
import { useExportByEcharts } from '../../../hooks';
type Props = {
data: MsgDataType;
@@ -30,7 +39,7 @@ const BarChart: React.FC<Props> = ({
onApplyAuth,
}) => {
const chartRef = useRef<any>();
const [instance, setInstance] = useState<ECharts>();
const instanceRef = useRef<ECharts>();
const { queryColumns, queryResults, entityInfo } = data;
@@ -41,11 +50,11 @@ const BarChart: React.FC<Props> = ({
const renderChart = () => {
let instanceObj: any;
if (!instance) {
if (!instanceRef.current) {
instanceObj = echarts.init(chartRef.current);
setInstance(instanceObj);
instanceRef.current = instanceObj;
} else {
instanceObj = instance;
instanceObj = instanceRef.current;
}
const data = (queryResults || []).sort(
(a: any, b: any) => b[metricColumnName] - a[metricColumnName]
@@ -163,8 +172,8 @@ const BarChart: React.FC<Props> = ({
}, [queryResults]);
useEffect(() => {
if (triggerResize && instance) {
instance.resize();
if (triggerResize && instanceRef.current) {
instanceRef.current.resize();
}
}, [triggerResize]);
@@ -180,6 +189,15 @@ const BarChart: React.FC<Props> = ({
const prefixCls = `${PREFIX_CLS}-bar`;
const { downloadChartAsImage } = useExportByEcharts({
instanceRef,
question,
});
const { register } = useContext(ChartItemContext);
register('downloadChartAsImage', downloadChartAsImage);
return (
<div>
<div className={`${prefixCls}-top-bar`}>

View File

@@ -8,12 +8,14 @@ import {
} from '../../../utils/utils';
import type { ECharts } from 'echarts';
import * as echarts from 'echarts';
import React, { useEffect, useRef, useState } from 'react';
import React, { useContext, useEffect, useRef, useState } from 'react';
import moment from 'moment';
import { ColumnType } from '../../../common/type';
import NoPermissionChart from '../NoPermissionChart';
import classNames from 'classnames';
import { isArray } from 'lodash';
import { useExportByEcharts } from '../../../hooks';
import { ChartItemContext } from '../../ChatItem';
type Props = {
model?: string;
@@ -37,15 +39,15 @@ const MetricTrendChart: React.FC<Props> = ({
chartType,
}) => {
const chartRef = useRef<any>();
const [instance, setInstance] = useState<ECharts>();
const instanceRef = useRef<ECharts>();
const renderChart = () => {
let instanceObj: any;
if (!instance) {
if (!instanceRef.current) {
instanceObj = echarts.init(chartRef.current);
setInstance(instanceObj);
instanceRef.current = instanceObj;
} else {
instanceObj = instance;
instanceObj = instanceRef.current;
instanceObj.clear();
}
@@ -195,6 +197,15 @@ const MetricTrendChart: React.FC<Props> = ({
instanceObj.resize();
};
const { downloadChartAsImage } = useExportByEcharts({
instanceRef,
question: metricField.name,
});
const { register } = useContext(ChartItemContext);
register('downloadChartAsImage', downloadChartAsImage);
useEffect(() => {
if (metricField.authorized) {
renderChart();
@@ -202,8 +213,8 @@ const MetricTrendChart: React.FC<Props> = ({
}, [resultList, metricField, chartType]);
useEffect(() => {
if (triggerResize && instance) {
instance.resize();
if (triggerResize && instanceRef.current) {
instanceRef.current.resize();
}
}, [triggerResize]);

View File

@@ -2,10 +2,12 @@ import { CHART_SECONDARY_COLOR, CLS_PREFIX, THEME_COLOR_LIST } from '../../../co
import { getFormattedValue } from '../../../utils/utils';
import type { ECharts } from 'echarts';
import * as echarts from 'echarts';
import React, { useEffect, useRef, useState } from 'react';
import React, { useContext, useEffect, useRef, useState } from 'react';
import moment from 'moment';
import { ColumnType } from '../../../common/type';
import { isArray } from 'lodash';
import { ChartItemContext } from '../../ChatItem';
import { useExportByEcharts } from '../../../hooks';
type Props = {
dateColumnName: string;
@@ -13,6 +15,7 @@ type Props = {
resultList: any[];
triggerResize?: boolean;
chartType?: string;
question: string;
};
const MultiMetricsTrendChart: React.FC<Props> = ({
@@ -21,17 +24,17 @@ const MultiMetricsTrendChart: React.FC<Props> = ({
resultList,
triggerResize,
chartType,
question,
}) => {
const chartRef = useRef<any>();
const [instance, setInstance] = useState<ECharts>();
const instanceRef = useRef<ECharts>();
const renderChart = () => {
let instanceObj: any;
if (!instance) {
if (!instanceRef.current) {
instanceObj = echarts.init(chartRef.current);
setInstance(instanceObj);
instanceRef.current = instanceObj;
} else {
instanceObj = instance;
instanceObj = instanceRef.current;
instanceObj.clear();
}
@@ -132,13 +135,22 @@ const MultiMetricsTrendChart: React.FC<Props> = ({
instanceObj.resize();
};
const { downloadChartAsImage } = useExportByEcharts({
instanceRef,
question,
});
const { register } = useContext(ChartItemContext);
register('downloadChartAsImage', downloadChartAsImage);
useEffect(() => {
renderChart();
}, [resultList, chartType]);
useEffect(() => {
if (triggerResize && instance) {
instance.resize();
if (triggerResize && instanceRef.current) {
instanceRef.current.resize();
}
}, [triggerResize]);

View File

@@ -100,6 +100,7 @@ const MetricTrend: React.FC<Props> = ({
<MultiMetricsTrendChart
dateColumnName={dateColumnName}
metricFields={metricFields}
question={question}
resultList={queryResults}
triggerResize={triggerResize}
chartType={chartType}

View File

@@ -1,16 +1,25 @@
import { isMobile } from '../../utils/utils';
import { DislikeOutlined, LikeOutlined, DownloadOutlined, RedoOutlined } from '@ant-design/icons';
import {
DislikeOutlined,
LikeOutlined,
DownloadOutlined,
RedoOutlined,
FileJpgOutlined,
} from '@ant-design/icons';
import { Button } from 'antd';
import { CLS_PREFIX } from '../../common/constants';
import { useState } from 'react';
import { useContext, useState } from 'react';
import classNames from 'classnames';
import { updateQAFeedback } from '../../service';
import { useMethodRegister } from '../../hooks';
import { ChartItemContext } from '../ChatItem';
type Props = {
queryId: number;
scoreValue?: number;
isLastMessage?: boolean;
isParserError?: boolean;
isSimpleMode?: boolean;
onExportData?: () => void;
onReExecute?: (queryId: number) => void;
};
@@ -20,6 +29,7 @@ const Tools: React.FC<Props> = ({
scoreValue,
isLastMessage,
isParserError = false,
isSimpleMode = false,
onExportData,
onReExecute,
}) => {
@@ -44,6 +54,8 @@ const Tools: React.FC<Props> = ({
[`${prefixCls}-feedback-active`]: score === 1,
});
const { call } = useContext(ChartItemContext);
return (
<div className={prefixCls}>
{!isMobile && (
@@ -68,6 +80,18 @@ const Tools: React.FC<Props> = ({
<DownloadOutlined />
<span className={`${prefixCls}-font-style`}></span>
</Button>
{!isSimpleMode && (
<Button
size="small"
onClick={() => {
call('downloadChartAsImage');
}}
type="text"
>
<FileJpgOutlined />
<span className={`${prefixCls}-font-style`}></span>
</Button>
)}
{isLastMessage && (
<Button
size="small"

View File

@@ -0,0 +1,3 @@
export * from './useMethodRegister';
export * from './useComposing';
export * from './useExportByEcharts';

View File

@@ -0,0 +1,41 @@
import { message } from 'antd';
import { ECharts } from 'echarts';
export interface ExportByEchartsProps {
instanceRef: React.MutableRefObject<ECharts | undefined>;
question: string;
options?: Parameters<ECharts['getConnectedDataURL']>[0];
}
export const useExportByEcharts = ({ instanceRef, question, options }: ExportByEchartsProps) => {
const handleSaveAsImage = () => {
if (instanceRef.current) {
return instanceRef.current.getConnectedDataURL({
type: 'png',
pixelRatio: 2,
backgroundColor: '#fff',
excludeComponents: ['toolbox'],
...options,
});
}
};
const downloadImage = (url: string) => {
const a = document.createElement('a');
a.href = url;
a.download = `${question}.png`;
a.click();
};
const downloadChartAsImage = () => {
const url = handleSaveAsImage();
if (url) {
downloadImage(url);
message.success('导出图片成功');
} else {
message.error('该条消息暂不支持导出图片');
}
};
return { downloadChartAsImage };
};

View File

@@ -0,0 +1,25 @@
import { useCallback, useRef } from 'react';
export const useMethodRegister = (fallback?: (...args: any[]) => any) => {
const methodStore = useRef<Map<string, (...args: any[]) => any>>(new Map());
const register = useCallback<(key: string, method: (...args: any[]) => any) => any>(
(key, method) => {
methodStore.current.set(key, method);
},
[methodStore]
);
const call = useCallback<(key: string, ...args: any[]) => any>(
(key, ...args) => {
const method = methodStore.current.get(key);
if (method) {
return method(...args);
}
return fallback?.(...args);
},
[methodStore]
);
return { register, call };
};