forked from github/dataease
Merge remote-tracking branch 'origin/dev' into pr@dev@panel
# Conflicts: # frontend/src/views/chart/view/ChartEdit.vue
This commit is contained in:
commit
c05e4b842d
@ -46,6 +46,10 @@ public class ShiroServiceImpl implements ShiroService {
|
||||
|
||||
|
||||
filterChainDefinitionMap.put("/system/ui/**", ANON);
|
||||
filterChainDefinitionMap.put("/**/*.js", ANON);
|
||||
filterChainDefinitionMap.put("/**/*.css", ANON);
|
||||
filterChainDefinitionMap.put("/**/*.map", ANON);
|
||||
// filterChainDefinitionMap.put("/axios.map", ANON);
|
||||
|
||||
filterChainDefinitionMap.put("/api/auth/login", ANON);
|
||||
filterChainDefinitionMap.put("/api/auth/logout", ANON);
|
||||
|
@ -12,6 +12,8 @@ public interface ExtPanelShareMapper {
|
||||
|
||||
int batchInsert(@Param("shares") List<PanelShare> shares);
|
||||
|
||||
int batchDelete(@Param("shareIds") List<Long> shareIds);
|
||||
|
||||
List<PanelSharePo> query(Map<String, Object> param);
|
||||
|
||||
List<PanelShare> queryWithResource(GridExample example);
|
||||
|
@ -16,6 +16,14 @@
|
||||
</foreach>
|
||||
</insert>
|
||||
|
||||
<delete id="batchDelete" parameterType="java.lang.Long" >
|
||||
delete from panel_share
|
||||
where share_id in
|
||||
<foreach collection="shareIds" item="shareId" open="(" separator="," close=")" >
|
||||
#{shareId}
|
||||
</foreach>
|
||||
</delete>
|
||||
|
||||
<select id="query" resultMap="treeNodeMap">
|
||||
select distinct s.panel_group_id as id, g.create_by as creator, g.name
|
||||
from panel_share s
|
||||
|
@ -0,0 +1,36 @@
|
||||
package io.dataease.base.mapper.ext;
|
||||
|
||||
import org.apache.ibatis.annotations.Delete;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import org.apache.ibatis.annotations.Update;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Mapper
|
||||
public interface ExtSysMsgMapper {
|
||||
|
||||
|
||||
@Update({
|
||||
"<script>",
|
||||
"update sys_msg set status = 1 where msg_id in ",
|
||||
"<foreach collection='msgIds' item='msgId' open='(' separator=',' close=')' >",
|
||||
" #{msgId}",
|
||||
"</foreach>",
|
||||
"</script>"
|
||||
})
|
||||
int batchStatus(@Param("msgIds") List<Long> msgIds);
|
||||
|
||||
|
||||
@Delete({
|
||||
"<script>",
|
||||
"delete from sys_msg where msg_id in ",
|
||||
"<foreach collection='msgIds' item='msgId' open='(' separator=',' close=')' >",
|
||||
" #{msgId}",
|
||||
"</foreach>",
|
||||
"</script>"
|
||||
})
|
||||
int batchDelete(@Param("msgIds") List<Long> msgIds);
|
||||
|
||||
|
||||
}
|
@ -36,4 +36,15 @@ public class MsgController {
|
||||
public void setReaded(@PathVariable Long msgId) {
|
||||
sysMsgService.setReaded(msgId);
|
||||
}
|
||||
|
||||
|
||||
@PostMapping("/batchRead")
|
||||
public void batchRead(@RequestBody List<Long> msgIds) {
|
||||
sysMsgService.setBatchReaded(msgIds);
|
||||
}
|
||||
|
||||
@PostMapping("/batchDelete")
|
||||
public void batchDelete(@RequestBody List<Long> msgIds) {
|
||||
sysMsgService.batchDelete(msgIds);
|
||||
}
|
||||
}
|
||||
|
@ -3,11 +3,16 @@ package io.dataease.controller.message.dto;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
public class MsgRequest implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 1920091635946508658L;
|
||||
|
||||
private Integer type;
|
||||
|
||||
private Boolean status;
|
||||
|
||||
private List<String> orders;
|
||||
}
|
||||
|
@ -1,6 +1,7 @@
|
||||
package io.dataease.controller.panel.api;
|
||||
|
||||
import io.dataease.base.domain.PanelShare;
|
||||
import io.dataease.controller.request.panel.PanelShareFineDto;
|
||||
import io.dataease.controller.request.panel.PanelShareRequest;
|
||||
import io.dataease.controller.sys.base.BaseGridRequest;
|
||||
import io.dataease.dto.panel.PanelShareDto;
|
||||
@ -31,5 +32,9 @@ public interface ShareApi {
|
||||
@PostMapping("/queryWithResourceId")
|
||||
List<PanelShare> queryWithResourceId(BaseGridRequest request);
|
||||
|
||||
|
||||
@ApiOperation("优化创建分享")
|
||||
@PostMapping("/fineSave")
|
||||
void fineSave(PanelShareFineDto panelShareFineDto);
|
||||
|
||||
}
|
||||
|
@ -2,6 +2,7 @@ package io.dataease.controller.panel.server;
|
||||
|
||||
import io.dataease.base.domain.PanelShare;
|
||||
import io.dataease.controller.panel.api.ShareApi;
|
||||
import io.dataease.controller.request.panel.PanelShareFineDto;
|
||||
import io.dataease.controller.request.panel.PanelShareRequest;
|
||||
import io.dataease.controller.sys.base.BaseGridRequest;
|
||||
import io.dataease.dto.panel.PanelShareDto;
|
||||
@ -32,4 +33,11 @@ public class ShareServer implements ShareApi {
|
||||
public List<PanelShare> queryWithResourceId(@RequestBody BaseGridRequest request) {
|
||||
return shareService.queryWithResource(request);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void fineSave(@RequestBody PanelShareFineDto panelShareFineDto) {
|
||||
shareService.fineSave(panelShareFineDto);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -0,0 +1,18 @@
|
||||
package io.dataease.controller.request.panel;
|
||||
|
||||
import io.dataease.commons.model.AuthURD;
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
|
||||
@Data
|
||||
public class PanelShareFineDto implements Serializable {
|
||||
|
||||
|
||||
private static final long serialVersionUID = -792964171742204428L;
|
||||
|
||||
private String resourceId;
|
||||
|
||||
private AuthURD authURD;
|
||||
}
|
@ -61,4 +61,11 @@ public class DatasourceController {
|
||||
public List<DBTableDTO> getTables(@RequestBody Datasource datasource) throws Exception {
|
||||
return datasourceService.getTables(datasource);
|
||||
}
|
||||
|
||||
@PostMapping("/getSchema")
|
||||
public List<String> getSchema(@RequestBody Datasource datasource) throws Exception {
|
||||
return datasourceService.getSchema(datasource);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -9,6 +9,7 @@ public class OracleConfigration extends JdbcDTO {
|
||||
|
||||
private String driver = "oracle.jdbc.driver.OracleDriver";
|
||||
private String connectionType;
|
||||
private String schema;
|
||||
|
||||
public String getJdbc() {
|
||||
// 连接参数先写死,后边要把编码、时区等参数放到数据源的设置中
|
||||
|
@ -30,4 +30,6 @@ public abstract class DatasourceProvider {
|
||||
abstract public Map<String, List> fetchResultAndField(DatasourceRequest datasourceRequest) throws Exception;
|
||||
|
||||
abstract public void handleDatasource(DatasourceRequest datasourceRequest, String type) throws Exception;
|
||||
|
||||
abstract public List<String> getSchema(DatasourceRequest datasourceRequest) throws Exception;
|
||||
}
|
||||
|
@ -2,6 +2,7 @@ package io.dataease.datasource.provider;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import com.mchange.v2.c3p0.ComboPooledDataSource;
|
||||
import io.dataease.controller.handler.annotation.I18n;
|
||||
import io.dataease.datasource.constants.DatasourceTypes;
|
||||
import io.dataease.datasource.dto.MysqlConfigration;
|
||||
import io.dataease.datasource.dto.OracleConfigration;
|
||||
@ -9,10 +10,12 @@ import io.dataease.datasource.dto.SqlServerConfigration;
|
||||
import io.dataease.datasource.dto.TableFiled;
|
||||
import io.dataease.datasource.request.DatasourceRequest;
|
||||
import io.dataease.exception.DataEaseException;
|
||||
import io.dataease.i18n.Translator;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
import java.beans.PropertyVetoException;
|
||||
import java.sql.*;
|
||||
import java.text.MessageFormat;
|
||||
import java.util.*;
|
||||
|
||||
@Service("jdbc")
|
||||
@ -212,6 +215,31 @@ public class JdbcProvider extends DatasourceProvider {
|
||||
return new ArrayList<>();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getSchema(DatasourceRequest datasourceRequest) throws Exception {
|
||||
List<String> schemas = new ArrayList<>();
|
||||
String queryStr = getSchemaSql(datasourceRequest);
|
||||
Connection con = null;
|
||||
try {
|
||||
con = getConnection(datasourceRequest);
|
||||
Statement statement = con.createStatement();
|
||||
ResultSet resultSet = statement.executeQuery(queryStr);
|
||||
while (resultSet.next()) {
|
||||
schemas.add(resultSet.getString(1));
|
||||
}
|
||||
resultSet.close();
|
||||
statement.close();
|
||||
return schemas;
|
||||
} catch (Exception e) {
|
||||
DataEaseException.throwException(e);
|
||||
} finally {
|
||||
if(con != null){
|
||||
con.close();
|
||||
}
|
||||
}
|
||||
return new ArrayList<>();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<TableFiled> getTableFileds(DatasourceRequest datasourceRequest) throws Exception {
|
||||
List<TableFiled> list = new LinkedList<>();
|
||||
@ -466,7 +494,7 @@ public class JdbcProvider extends DatasourceProvider {
|
||||
}
|
||||
}
|
||||
|
||||
private String getTablesSql(DatasourceRequest datasourceRequest) {
|
||||
private String getTablesSql(DatasourceRequest datasourceRequest) throws Exception {
|
||||
DatasourceTypes datasourceType = DatasourceTypes.valueOf(datasourceRequest.getDatasource().getType());
|
||||
switch (datasourceType) {
|
||||
case mysql:
|
||||
@ -477,7 +505,21 @@ public class JdbcProvider extends DatasourceProvider {
|
||||
SqlServerConfigration sqlServerConfigration = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), SqlServerConfigration.class);
|
||||
return "SELECT TABLE_NAME FROM DATABASE.INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE';".replace("DATABASE", sqlServerConfigration.getDataBase());
|
||||
case oracle:
|
||||
return "select TABLE_NAME from USER_TABLES";
|
||||
OracleConfigration oracleConfigration = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), OracleConfigration.class);
|
||||
if(StringUtils.isEmpty(oracleConfigration.getSchema())){
|
||||
throw new Exception(Translator.get("i18n_schema_is_empty"));
|
||||
}
|
||||
return "select table_name, owner from all_tables where owner='" + oracleConfigration.getSchema() + "'";
|
||||
default:
|
||||
return "show tables;";
|
||||
}
|
||||
}
|
||||
|
||||
private String getSchemaSql(DatasourceRequest datasourceRequest) {
|
||||
DatasourceTypes datasourceType = DatasourceTypes.valueOf(datasourceRequest.getDatasource().getType());
|
||||
switch (datasourceType) {
|
||||
case oracle:
|
||||
return "select * from all_users";
|
||||
default:
|
||||
return "show tables;";
|
||||
}
|
||||
|
@ -120,6 +120,13 @@ public class DatasourceService {
|
||||
datasourceProvider.checkStatus(datasourceRequest);
|
||||
}
|
||||
|
||||
public List<String> getSchema(Datasource datasource) throws Exception {
|
||||
DatasourceProvider datasourceProvider = ProviderFactory.getProvider(datasource.getType());
|
||||
DatasourceRequest datasourceRequest = new DatasourceRequest();
|
||||
datasourceRequest.setDatasource(datasource);
|
||||
return datasourceProvider.getSchema(datasourceRequest);
|
||||
}
|
||||
|
||||
public List<DBTableDTO> getTables(Datasource datasource) throws Exception {
|
||||
Datasource ds = datasourceMapper.selectByPrimaryKey(datasource.getId());
|
||||
DatasourceProvider datasourceProvider = ProviderFactory.getProvider(ds.getType());
|
||||
|
@ -193,11 +193,14 @@ public class DorisQueryProvider extends QueryProvider {
|
||||
filter.append(" AND ").append(x.getDataeaseName());
|
||||
}
|
||||
filter.append(transMysqlFilterTerm(f.getTerm()));
|
||||
if (StringUtils.containsIgnoreCase(f.getTerm(), "null")) {
|
||||
if (StringUtils.equalsIgnoreCase(f.getTerm(), "null")) {
|
||||
filter.append("(null,'')");
|
||||
} else if (StringUtils.equalsIgnoreCase(f.getTerm(), "not_null")) {
|
||||
filter.append(" AND ").append(x.getDataeaseName()).append(" <> ''");
|
||||
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) {
|
||||
filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')");
|
||||
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) {
|
||||
filter.append("%").append(f.getValue()).append("%");
|
||||
filter.append("'%").append(f.getValue()).append("%'");
|
||||
} else {
|
||||
filter.append("'").append(f.getValue()).append("'");
|
||||
}
|
||||
@ -229,11 +232,16 @@ public class DorisQueryProvider extends QueryProvider {
|
||||
filter.append(" AND _").append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getDataeaseName(), "*") ? "" : y.getDataeaseName());
|
||||
}
|
||||
filter.append(transMysqlFilterTerm(f.getTerm()));
|
||||
if (StringUtils.containsIgnoreCase(f.getTerm(), "null")) {
|
||||
if (StringUtils.equalsIgnoreCase(f.getTerm(), "null")) {
|
||||
filter.append("(null)");
|
||||
} else if (StringUtils.equalsIgnoreCase(f.getTerm(), "not_null")) {
|
||||
// filter.append(" AND _")
|
||||
// .append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getDataeaseName(), "*") ? "" : y.getDataeaseName())
|
||||
// .append(" <> ''");
|
||||
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) {
|
||||
filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')");
|
||||
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) {
|
||||
filter.append("%").append(f.getValue()).append("%");
|
||||
filter.append("'%").append(f.getValue()).append("%'");
|
||||
} else {
|
||||
filter.append("'").append(f.getValue()).append("'");
|
||||
}
|
||||
@ -310,11 +318,16 @@ public class DorisQueryProvider extends QueryProvider {
|
||||
filter.append(" AND _").append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getDataeaseName(), "*") ? "" : y.getDataeaseName());
|
||||
}
|
||||
filter.append(transMysqlFilterTerm(f.getTerm()));
|
||||
if (StringUtils.containsIgnoreCase(f.getTerm(), "null")) {
|
||||
if (StringUtils.equalsIgnoreCase(f.getTerm(), "null")) {
|
||||
filter.append("(null)");
|
||||
} else if (StringUtils.equalsIgnoreCase(f.getTerm(), "not_null")) {
|
||||
// filter.append(" AND _")
|
||||
// .append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getDataeaseName(), "*") ? "" : y.getDataeaseName())
|
||||
// .append(" <> ''");
|
||||
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) {
|
||||
filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')");
|
||||
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) {
|
||||
filter.append("%").append(f.getValue()).append("%");
|
||||
filter.append("'%").append(f.getValue()).append("%'");
|
||||
} else {
|
||||
filter.append("'").append(f.getValue()).append("'");
|
||||
}
|
||||
@ -349,7 +362,7 @@ public class DorisQueryProvider extends QueryProvider {
|
||||
}
|
||||
|
||||
@Override
|
||||
public String createRawQuerySQL(String table, List<DatasetTableField> fields){
|
||||
public String createRawQuerySQL(String table, List<DatasetTableField> fields) {
|
||||
String[] array = fields.stream().map(f -> {
|
||||
StringBuilder stringBuilder = new StringBuilder();
|
||||
stringBuilder.append("`").append(f.getOriginName()).append("` AS ").append(f.getDataeaseName());
|
||||
@ -393,7 +406,7 @@ public class DorisQueryProvider extends QueryProvider {
|
||||
case "not like":
|
||||
return " NOT LIKE ";
|
||||
case "null":
|
||||
return " IS NULL ";
|
||||
return " IN ";
|
||||
case "not_null":
|
||||
return " IS NOT NULL ";
|
||||
case "between":
|
||||
@ -424,7 +437,10 @@ public class DorisQueryProvider extends QueryProvider {
|
||||
filter.append(" ")
|
||||
.append(transMysqlFilterTerm(request.getTerm()))
|
||||
.append(" ");
|
||||
if (StringUtils.containsIgnoreCase(request.getTerm(), "null")) {
|
||||
if (StringUtils.equalsIgnoreCase(request.getTerm(), "null")) {
|
||||
filter.append("(null,'')");
|
||||
} else if (StringUtils.equalsIgnoreCase(request.getTerm(), "not_null")) {
|
||||
filter.append(" AND ").append(field.getDataeaseName()).append(" <> ''");
|
||||
} else if (StringUtils.containsIgnoreCase(request.getTerm(), "in")) {
|
||||
filter.append("('").append(StringUtils.join(value, "','")).append("')");
|
||||
} else if (StringUtils.containsIgnoreCase(request.getTerm(), "like")) {
|
||||
|
@ -198,11 +198,14 @@ public class MysqlQueryProvider extends QueryProvider {
|
||||
filter.append(" AND `").append(x.getOriginName()).append("`");
|
||||
}
|
||||
filter.append(transMysqlFilterTerm(f.getTerm()));
|
||||
if (StringUtils.containsIgnoreCase(f.getTerm(), "null")) {
|
||||
if (StringUtils.equalsIgnoreCase(f.getTerm(), "null")) {
|
||||
filter.append("(null,'')");
|
||||
} else if (StringUtils.equalsIgnoreCase(f.getTerm(), "not_null")) {
|
||||
filter.append(" AND `").append(x.getOriginName()).append("`").append(" <> ''");
|
||||
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) {
|
||||
filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')");
|
||||
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) {
|
||||
filter.append("%").append(f.getValue()).append("%");
|
||||
filter.append("'%").append(f.getValue()).append("%'");
|
||||
} else {
|
||||
filter.append("'").append(f.getValue()).append("'");
|
||||
}
|
||||
@ -235,11 +238,16 @@ public class MysqlQueryProvider extends QueryProvider {
|
||||
filter.append(" AND `_").append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName()).append("`");
|
||||
}
|
||||
filter.append(transMysqlFilterTerm(f.getTerm()));
|
||||
if (StringUtils.containsIgnoreCase(f.getTerm(), "null")) {
|
||||
if (StringUtils.equalsIgnoreCase(f.getTerm(), "null")) {
|
||||
filter.append("(null,'')");
|
||||
} else if (StringUtils.equalsIgnoreCase(f.getTerm(), "not_null")) {
|
||||
filter.append(" AND `_")
|
||||
.append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName())
|
||||
.append("`").append(" <> ''");
|
||||
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) {
|
||||
filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')");
|
||||
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) {
|
||||
filter.append("%").append(f.getValue()).append("%");
|
||||
filter.append("'%").append(f.getValue()).append("%'");
|
||||
} else {
|
||||
filter.append("'").append(f.getValue()).append("'");
|
||||
}
|
||||
@ -316,11 +324,16 @@ public class MysqlQueryProvider extends QueryProvider {
|
||||
filter.append(" AND `_").append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName()).append("`");
|
||||
}
|
||||
filter.append(transMysqlFilterTerm(f.getTerm()));
|
||||
if (StringUtils.containsIgnoreCase(f.getTerm(), "null")) {
|
||||
if (StringUtils.equalsIgnoreCase(f.getTerm(), "null")) {
|
||||
filter.append("(null,'')");
|
||||
} else if (StringUtils.equalsIgnoreCase(f.getTerm(), "not_null")) {
|
||||
filter.append(" AND `_")
|
||||
.append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName())
|
||||
.append("`").append(" <> ''");
|
||||
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) {
|
||||
filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')");
|
||||
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) {
|
||||
filter.append("%").append(f.getValue()).append("%");
|
||||
filter.append("'%").append(f.getValue()).append("%'");
|
||||
} else {
|
||||
filter.append("'").append(f.getValue()).append("'");
|
||||
}
|
||||
@ -355,7 +368,7 @@ public class MysqlQueryProvider extends QueryProvider {
|
||||
}
|
||||
|
||||
@Override
|
||||
public String createRawQuerySQL(String table, List<DatasetTableField> fields){
|
||||
public String createRawQuerySQL(String table, List<DatasetTableField> fields) {
|
||||
String[] array = fields.stream().map(f -> {
|
||||
StringBuilder stringBuilder = new StringBuilder();
|
||||
stringBuilder.append("`").append(f.getOriginName()).append("` AS ").append(f.getDataeaseName());
|
||||
@ -392,7 +405,7 @@ public class MysqlQueryProvider extends QueryProvider {
|
||||
case "not like":
|
||||
return " NOT LIKE ";
|
||||
case "null":
|
||||
return " IS NULL ";
|
||||
return " IN ";
|
||||
case "not_null":
|
||||
return " IS NOT NULL ";
|
||||
case "between":
|
||||
@ -423,7 +436,10 @@ public class MysqlQueryProvider extends QueryProvider {
|
||||
filter.append(" ")
|
||||
.append(transMysqlFilterTerm(request.getTerm()))
|
||||
.append(" ");
|
||||
if (StringUtils.containsIgnoreCase(request.getTerm(), "null")) {
|
||||
if (StringUtils.equalsIgnoreCase(request.getTerm(), "null")) {
|
||||
filter.append("(null,'')");
|
||||
} else if (StringUtils.equalsIgnoreCase(request.getTerm(), "not_null")) {
|
||||
filter.append(" AND `").append(field.getOriginName()).append("`").append(" <> ''");
|
||||
} else if (StringUtils.containsIgnoreCase(request.getTerm(), "in")) {
|
||||
filter.append("('").append(StringUtils.join(value, "','")).append("')");
|
||||
} else if (StringUtils.containsIgnoreCase(request.getTerm(), "like")) {
|
||||
|
@ -1,12 +1,10 @@
|
||||
package io.dataease.provider.oracle;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import io.dataease.base.domain.DatasetTableField;
|
||||
import io.dataease.controller.request.chart.ChartExtFilterRequest;
|
||||
import io.dataease.dto.chart.ChartCustomFilterDTO;
|
||||
import io.dataease.dto.chart.ChartViewFieldDTO;
|
||||
import io.dataease.provider.QueryProvider;
|
||||
import io.swagger.models.auth.In;
|
||||
import org.apache.commons.collections4.CollectionUtils;
|
||||
import org.apache.commons.lang3.ObjectUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
@ -93,9 +91,9 @@ public class OracleQueryProvider extends QueryProvider {
|
||||
// 如果原始类型为时间
|
||||
if (f.getDeExtractType() == TIME) {
|
||||
if (f.getDeType() == INT || f.getDeType() == FLOAT) { //日期转数值
|
||||
if(f.getType().equalsIgnoreCase("DATE")){
|
||||
if (f.getType().equalsIgnoreCase("DATE")) {
|
||||
stringBuilder.append("TO_NUMBER( ").append(f.getOriginName()).append(" - TO_DATE('1970-01-01 8:0:0', 'YYYY-MM-DD HH24:MI:SS')) * 24 * 60 * 60 * 1000 AS ").append(f.getDataeaseName());
|
||||
}else {
|
||||
} else {
|
||||
stringBuilder.append("TO_NUMBER(to_date(to_char( ").append(f.getOriginName()).append(" ,'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss') - TO_DATE('1970-01-01 8:0:0', 'YYYY-MM-DD HH24:MI:SS')) * 24 * 60 * 60 * 1000 AS ").append(f.getDataeaseName());
|
||||
}
|
||||
} else {
|
||||
@ -123,9 +121,9 @@ public class OracleQueryProvider extends QueryProvider {
|
||||
return MessageFormat.format("SELECT {0} FROM {1} ", StringUtils.join(array, ","), table);
|
||||
}
|
||||
|
||||
private String sqlColumn(List<DatasetTableField> fields){
|
||||
private String sqlColumn(List<DatasetTableField> fields) {
|
||||
String[] array = fields.stream().map(f -> {
|
||||
return f.getDataeaseName();
|
||||
return f.getDataeaseName();
|
||||
}).toArray(String[]::new);
|
||||
return StringUtils.join(array, ",");
|
||||
}
|
||||
@ -184,17 +182,17 @@ public class OracleQueryProvider extends QueryProvider {
|
||||
// 如果原始类型为时间
|
||||
if (x.getDeExtractType() == TIME) {
|
||||
if (x.getDeType() == INT || x.getDeType() == FLOAT) { //时间转数值
|
||||
if(x.getType().equalsIgnoreCase("DATE")){
|
||||
if (x.getType().equalsIgnoreCase("DATE")) {
|
||||
stringBuilder.append("TO_NUMBER( ").append(x.getOriginName()).append(" - TO_DATE('1970-01-01 8:0:0', 'YYYY-MM-DD HH24:MI:SS')) * 24 * 60 * 60 * 1000 AS \"_").append(x.getDataeaseName()).append("\" ");
|
||||
}else {
|
||||
} else {
|
||||
stringBuilder.append("TO_NUMBER(to_date(to_char( ").append(x.getOriginName()).append(" ,'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss') - TO_DATE('1970-01-01 8:0:0', 'YYYY-MM-DD HH24:MI:SS')) * 24 * 60 * 60 * 1000 AS ")
|
||||
.append(x.getDataeaseName()).append("\" ");
|
||||
}
|
||||
} else if (x.getDeType() == TIME) { //格式化显示时间
|
||||
String format = transDateFormat(x.getDateStyle(), x.getDatePattern());
|
||||
if(x.getType().equalsIgnoreCase("DATE")){
|
||||
if (x.getType().equalsIgnoreCase("DATE")) {
|
||||
stringBuilder.append("to_char( ").append(x.getOriginName()).append(" ,'").append(format).append("') AS \"_").append(x.getOriginName()).append("\" ");
|
||||
}else {
|
||||
} else {
|
||||
stringBuilder.append("to_char(to_date(to_char( ").append(x.getOriginName()).append(" ,'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss'), '").append(format).append("') AS \"_").append(x.getOriginName()).append("\" ");
|
||||
}
|
||||
} else {
|
||||
@ -206,7 +204,7 @@ public class OracleQueryProvider extends QueryProvider {
|
||||
if (x.getDeExtractType() == STRING) { //字符串转时间
|
||||
stringBuilder.append("to_char(to_date(").append(x.getOriginName()).append(" , 'yyyy-MM-dd hh24:mi:ss'), '").append(format).append("') AS \"_").append(x.getOriginName()).append("\" ");
|
||||
} else { //数值转时间
|
||||
stringBuilder.append("to_char(").append(x.getOriginName()) .append("/ (1000 * 60 * 60 * 24) + TO_DATE('1970-01-01 08:00:00', 'YYYY-MM-DD HH24:MI:SS'), '").append(format).append("') AS \"_").append(x.getOriginName()).append("\" ");
|
||||
stringBuilder.append("to_char(").append(x.getOriginName()).append("/ (1000 * 60 * 60 * 24) + TO_DATE('1970-01-01 08:00:00', 'YYYY-MM-DD HH24:MI:SS'), '").append(format).append("') AS \"_").append(x.getOriginName()).append("\" ");
|
||||
}
|
||||
} else {
|
||||
stringBuilder.append(" ").append(x.getOriginName()).append(" AS \"_").append(x.getOriginName()).append("\" ");
|
||||
@ -234,11 +232,14 @@ public class OracleQueryProvider extends QueryProvider {
|
||||
filter.append(" AND ").append(x.getOriginName()).append(" ");
|
||||
}
|
||||
filter.append(transMysqlFilterTerm(f.getTerm()));
|
||||
if (StringUtils.containsIgnoreCase(f.getTerm(), "null")) {
|
||||
if (StringUtils.equalsIgnoreCase(f.getTerm(), "null")) {
|
||||
filter.append("(null,'')");
|
||||
} else if (StringUtils.equalsIgnoreCase(f.getTerm(), "not_null")) {
|
||||
filter.append(" AND ").append(x.getOriginName()).append(" <> ''");
|
||||
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) {
|
||||
filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')");
|
||||
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) {
|
||||
filter.append("%").append(f.getValue()).append("%");
|
||||
filter.append("'%").append(f.getValue()).append("%'");
|
||||
} else {
|
||||
filter.append("'").append(f.getValue()).append("'");
|
||||
}
|
||||
@ -271,11 +272,16 @@ public class OracleQueryProvider extends QueryProvider {
|
||||
filter.append(" AND _").append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName()).append(" ");
|
||||
}
|
||||
filter.append(transMysqlFilterTerm(f.getTerm()));
|
||||
if (StringUtils.containsIgnoreCase(f.getTerm(), "null")) {
|
||||
if (StringUtils.equalsIgnoreCase(f.getTerm(), "null")) {
|
||||
filter.append("(null,'')");
|
||||
} else if (StringUtils.equalsIgnoreCase(f.getTerm(), "not_null")) {
|
||||
filter.append(" AND _")
|
||||
.append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName())
|
||||
.append(" <> ''");
|
||||
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) {
|
||||
filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')");
|
||||
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) {
|
||||
filter.append("%").append(f.getValue()).append("%");
|
||||
filter.append("'%").append(f.getValue()).append("%'");
|
||||
} else {
|
||||
filter.append("'").append(f.getValue()).append("'");
|
||||
}
|
||||
@ -352,11 +358,16 @@ public class OracleQueryProvider extends QueryProvider {
|
||||
filter.append(" AND _").append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName()).append(" ");
|
||||
}
|
||||
filter.append(transMysqlFilterTerm(f.getTerm()));
|
||||
if (StringUtils.containsIgnoreCase(f.getTerm(), "null")) {
|
||||
if (StringUtils.equalsIgnoreCase(f.getTerm(), "null")) {
|
||||
filter.append("(null,'')");
|
||||
} else if (StringUtils.equalsIgnoreCase(f.getTerm(), "not_null")) {
|
||||
filter.append(" AND _")
|
||||
.append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName()).append(" ")
|
||||
.append(" <> ''");
|
||||
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) {
|
||||
filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')");
|
||||
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) {
|
||||
filter.append("%").append(f.getValue()).append("%");
|
||||
filter.append("'%").append(f.getValue()).append("%'");
|
||||
} else {
|
||||
filter.append("'").append(f.getValue()).append("'");
|
||||
}
|
||||
@ -391,7 +402,7 @@ public class OracleQueryProvider extends QueryProvider {
|
||||
}
|
||||
|
||||
@Override
|
||||
public String createRawQuerySQL(String table, List<DatasetTableField> fields){
|
||||
public String createRawQuerySQL(String table, List<DatasetTableField> fields) {
|
||||
String[] array = fields.stream().map(f -> {
|
||||
StringBuilder stringBuilder = new StringBuilder();
|
||||
stringBuilder.append(" ").append(f.getOriginName()).append(" AS ").append(f.getDataeaseName());
|
||||
@ -428,7 +439,7 @@ public class OracleQueryProvider extends QueryProvider {
|
||||
case "not like":
|
||||
return " NOT LIKE ";
|
||||
case "null":
|
||||
return " IS NULL ";
|
||||
return " IN ";
|
||||
case "not_null":
|
||||
return " IS NOT NULL ";
|
||||
case "between":
|
||||
@ -459,7 +470,10 @@ public class OracleQueryProvider extends QueryProvider {
|
||||
filter.append(" ")
|
||||
.append(transMysqlFilterTerm(request.getTerm()))
|
||||
.append(" ");
|
||||
if (StringUtils.containsIgnoreCase(request.getTerm(), "null")) {
|
||||
if (StringUtils.equalsIgnoreCase(request.getTerm(), "null")) {
|
||||
filter.append("(null,'')");
|
||||
} else if (StringUtils.equalsIgnoreCase(request.getTerm(), "not_null")) {
|
||||
filter.append(" AND `").append(field.getOriginName()).append("`").append(" <> ''");
|
||||
} else if (StringUtils.containsIgnoreCase(request.getTerm(), "in")) {
|
||||
filter.append("('").append(StringUtils.join(value, "','")).append("')");
|
||||
} else if (StringUtils.containsIgnoreCase(request.getTerm(), "like")) {
|
||||
|
@ -6,31 +6,31 @@ import io.dataease.dto.chart.ChartCustomFilterDTO;
|
||||
import io.dataease.dto.chart.ChartViewFieldDTO;
|
||||
import io.dataease.provider.QueryProvider;
|
||||
import org.apache.commons.collections4.CollectionUtils;
|
||||
import org.apache.commons.lang3.ObjectUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.text.MessageFormat;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Arrays;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @Author gin
|
||||
* @Date 2021/5/17 2:43 下午
|
||||
*/
|
||||
@Service("sqlserverQuery")
|
||||
@Service("sqlServerQuery")
|
||||
public class SqlserverQueryProvider extends QueryProvider {
|
||||
@Override
|
||||
public Integer transFieldType(String field) {
|
||||
switch (field.toUpperCase()) {
|
||||
switch (field) {
|
||||
case "CHAR":
|
||||
case "VARCHAR":
|
||||
case "TEXT":
|
||||
case "TINYTEXT":
|
||||
case "MEDIUMTEXT":
|
||||
case "LONGTEXT":
|
||||
case "NCHAR":
|
||||
case "NVARCHAR":
|
||||
case "NTEXT":
|
||||
case "ENUM":
|
||||
return 0;// 文本
|
||||
case "DATE":
|
||||
@ -59,7 +59,7 @@ public class SqlserverQueryProvider extends QueryProvider {
|
||||
|
||||
@Override
|
||||
public String createQueryCountSQL(String table) {
|
||||
return MessageFormat.format("SELECT count(*) FROM {0}", table);
|
||||
return MessageFormat.format("SELECT COUNT(*) FROM {0}", table);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -69,7 +69,7 @@ public class SqlserverQueryProvider extends QueryProvider {
|
||||
|
||||
@Override
|
||||
public String createSQLPreview(String sql, String orderBy) {
|
||||
return "SELECT * FROM (" + sqlFix(sql) + ") AS tmp ORDER BY " + orderBy + " LIMIT 0,1000";
|
||||
return "SELECT * FROM (" + sqlFix(sql) + ") AS tmp ORDER BY null " + " LIMIT 0,1000";
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -79,21 +79,30 @@ public class SqlserverQueryProvider extends QueryProvider {
|
||||
// 如果原始类型为时间
|
||||
if (f.getDeExtractType() == 1) {
|
||||
if (f.getDeType() == 2 || f.getDeType() == 3) {
|
||||
stringBuilder.append("unix_timestamp(").append(f.getOriginName()).append(")*1000 as ").append(f.getOriginName());
|
||||
stringBuilder.append("UNIX_TIMESTAMP(`").append(f.getOriginName()).append("`)*1000 AS ").append(f.getDataeaseName());
|
||||
} else {
|
||||
stringBuilder.append(f.getOriginName());
|
||||
stringBuilder.append("`").append(f.getOriginName()).append("` AS ").append(f.getDataeaseName());
|
||||
}
|
||||
} else if (f.getDeExtractType() == 0) {
|
||||
if (f.getDeType() == 2) {
|
||||
stringBuilder.append("CAST(`").append(f.getOriginName()).append("` AS DECIMAL(20,0)) AS ").append(f.getDataeaseName());
|
||||
} else if (f.getDeType() == 3) {
|
||||
stringBuilder.append("CAST(`").append(f.getOriginName()).append("` AS DECIMAL(20,2)) AS ").append(f.getDataeaseName());
|
||||
} else if (f.getDeType() == 1) {
|
||||
stringBuilder.append("DATE_FORMAT(`").append(f.getOriginName()).append("`,'%Y-%m-%d %H:%i:%S') AS _").append(f.getDataeaseName());
|
||||
} else {
|
||||
stringBuilder.append("`").append(f.getOriginName()).append("` AS ").append(f.getDataeaseName());
|
||||
}
|
||||
} else {
|
||||
if (f.getDeType() == 1) {
|
||||
stringBuilder.append("FROM_UNIXTIME(cast(").append(f.getOriginName()).append(" as decimal(20,0))/1000,'%Y-%m-%d %H:%i:%S') as ").append(f.getOriginName());
|
||||
stringBuilder.append("FROM_UNIXTIME(CAST(`").append(f.getOriginName()).append("` AS DECIMAL(20,0))/1000,'%Y-%m-%d %H:%i:%S') AS ").append(f.getDataeaseName());
|
||||
} else {
|
||||
stringBuilder.append(f.getOriginName());
|
||||
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 " + (fields.size() > 0 ? fields.get(0).getOriginName() : "null"), StringUtils.join(array, ","), table);
|
||||
return MessageFormat.format("SELECT {0} FROM {1} ORDER BY null", StringUtils.join(array, ","), table);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -103,7 +112,7 @@ public class SqlserverQueryProvider extends QueryProvider {
|
||||
|
||||
@Override
|
||||
public String createQuerySQLWithPage(String table, List<DatasetTableField> fields, Integer page, Integer pageSize, Integer realSize) {
|
||||
return createQuerySQL(table, fields) + " offset " + (page - 1) * pageSize + " rows fetch next " + realSize + " rows only";
|
||||
return createQuerySQL(table, fields) + " LIMIT " + (page - 1) * pageSize + "," + realSize;
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -132,15 +141,15 @@ public class SqlserverQueryProvider extends QueryProvider {
|
||||
if (StringUtils.equalsIgnoreCase(y.getSummary(), "avg") || StringUtils.containsIgnoreCase(y.getSummary(), "pop")) {
|
||||
f.append("CAST(")
|
||||
.append(y.getSummary()).append("(")
|
||||
.append("CAST(").append(y.getOriginName()).append(" AS ").append(y.getDeType() == 2 ? "DECIMAL(20,0)" : "DECIMAL(20,2)").append(")")
|
||||
.append("CAST(`").append(y.getOriginName()).append("` AS ").append(y.getDeType() == 2 ? "DECIMAL(20,0)" : "DECIMAL(20,2)").append(")")
|
||||
.append(") AS DECIMAL(20,2)").append(")");
|
||||
} else {
|
||||
f.append(y.getSummary()).append("(")
|
||||
.append("CAST(").append(y.getOriginName()).append(" AS ").append(y.getDeType() == 2 ? "DECIMAL(20,0)" : "DECIMAL(20,2)").append(")")
|
||||
.append("CAST(`").append(y.getOriginName()).append("` AS ").append(y.getDeType() == 2 ? "DECIMAL(20,0)" : "DECIMAL(20,2)").append(")")
|
||||
.append(")");
|
||||
}
|
||||
}
|
||||
f.append(" AS _").append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName());
|
||||
f.append(" AS `_").append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName()).append("`");
|
||||
return f.toString();
|
||||
}).toArray(String[]::new);
|
||||
String[] groupField = xAxis.stream().map(x -> {
|
||||
@ -148,24 +157,32 @@ public class SqlserverQueryProvider extends QueryProvider {
|
||||
// 如果原始类型为时间
|
||||
if (x.getDeExtractType() == 1) {
|
||||
if (x.getDeType() == 2 || x.getDeType() == 3) {
|
||||
stringBuilder.append("unix_timestamp(").append(x.getOriginName()).append(")*1000 as ").append(x.getOriginName());
|
||||
stringBuilder.append("UNIX_TIMESTAMP(`").append(x.getOriginName()).append("`)*1000 AS `_").append(x.getOriginName()).append("`");
|
||||
} else if (x.getDeType() == 1) {
|
||||
String format = transDateFormat(x.getDateStyle(), x.getDatePattern());
|
||||
stringBuilder.append("DATE_FORMAT(`").append(x.getOriginName()).append("`,'").append(format).append("') AS `_").append(x.getOriginName()).append("`");
|
||||
} else {
|
||||
stringBuilder.append(x.getOriginName());
|
||||
stringBuilder.append("`").append(x.getOriginName()).append("` AS `_").append(x.getOriginName()).append("`");
|
||||
}
|
||||
} else {
|
||||
if (x.getDeType() == 1) {
|
||||
stringBuilder.append("FROM_UNIXTIME(cast(").append(x.getOriginName()).append(" as decimal(20,0))/1000,'%Y-%m-%d %H:%i:%S') as ").append(x.getOriginName());
|
||||
String format = transDateFormat(x.getDateStyle(), x.getDatePattern());
|
||||
if (x.getDeExtractType() == 0) {
|
||||
stringBuilder.append("DATE_FORMAT(`").append(x.getOriginName()).append("`,'").append(format).append("') AS `_").append(x.getOriginName()).append("`");
|
||||
} else {
|
||||
stringBuilder.append("DATE_FORMAT(").append("FROM_UNIXTIME(CAST(`").append(x.getOriginName()).append("` AS DECIMAL(20,0))/1000,'%Y-%m-%d %H:%i:%S')").append(",'").append(format).append("') AS `_").append(x.getOriginName()).append("`");
|
||||
}
|
||||
} else {
|
||||
stringBuilder.append(x.getOriginName());
|
||||
stringBuilder.append("`").append(x.getOriginName()).append("` AS `_").append(x.getOriginName()).append("`");
|
||||
}
|
||||
}
|
||||
return stringBuilder.toString();
|
||||
}).toArray(String[]::new);
|
||||
String[] group = xAxis.stream().map(ChartViewFieldDTO::getOriginName).toArray(String[]::new);
|
||||
String[] group = xAxis.stream().map(x -> "`_" + x.getOriginName() + "`").toArray(String[]::new);
|
||||
String[] xOrder = xAxis.stream().filter(f -> StringUtils.isNotEmpty(f.getSort()) && !StringUtils.equalsIgnoreCase(f.getSort(), "none"))
|
||||
.map(f -> f.getOriginName() + " " + f.getSort()).toArray(String[]::new);
|
||||
.map(f -> "`_" + f.getOriginName() + "` " + f.getSort()).toArray(String[]::new);
|
||||
String[] yOrder = yAxis.stream().filter(f -> StringUtils.isNotEmpty(f.getSort()) && !StringUtils.equalsIgnoreCase(f.getSort(), "none"))
|
||||
.map(f -> "_" + f.getSummary() + "_" + (StringUtils.equalsIgnoreCase(f.getOriginName(), "*") ? "" : f.getOriginName()) + " " + f.getSort()).toArray(String[]::new);
|
||||
.map(f -> "`_" + f.getSummary() + "_" + (StringUtils.equalsIgnoreCase(f.getOriginName(), "*") ? "" : f.getOriginName()) + "` " + f.getSort()).toArray(String[]::new);
|
||||
String[] order = Arrays.copyOf(xOrder, xOrder.length + yOrder.length);
|
||||
System.arraycopy(yOrder, 0, order, xOrder.length, yOrder.length);
|
||||
|
||||
@ -174,14 +191,17 @@ public class SqlserverQueryProvider extends QueryProvider {
|
||||
String[] s = x.getFilter().stream().map(f -> {
|
||||
StringBuilder filter = new StringBuilder();
|
||||
if (x.getDeType() == 1 && x.getDeExtractType() != 1) {
|
||||
filter.append(" AND FROM_UNIXTIME(cast(")
|
||||
filter.append(" AND FROM_UNIXTIME(cast(`")
|
||||
.append(x.getOriginName())
|
||||
.append(" AS decimal(20,0))/1000,'%Y-%m-%d %H:%i:%S') ");
|
||||
.append("` AS DECIMAL(20,0))/1000,'%Y-%m-%d %H:%i:%S') ");
|
||||
} else {
|
||||
filter.append(" AND ").append(x.getOriginName());
|
||||
filter.append(" AND `").append(x.getOriginName()).append("`");
|
||||
}
|
||||
filter.append(transMysqlFilterTerm(f.getTerm()));
|
||||
if (StringUtils.containsIgnoreCase(f.getTerm(), "null")) {
|
||||
if (StringUtils.equalsIgnoreCase(f.getTerm(), "null")) {
|
||||
filter.append("(null,'')");
|
||||
} else if (StringUtils.equalsIgnoreCase(f.getTerm(), "not_null")) {
|
||||
filter.append(" AND `").append(x.getOriginName()).append("`").append(" <> ''");
|
||||
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) {
|
||||
filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')");
|
||||
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) {
|
||||
@ -211,14 +231,19 @@ public class SqlserverQueryProvider extends QueryProvider {
|
||||
StringBuilder filter = new StringBuilder();
|
||||
// 原始类型不是时间,在de中被转成时间的字段做处理
|
||||
if (y.getDeType() == 1 && y.getDeExtractType() != 1) {
|
||||
filter.append(" AND FROM_UNIXTIME(cast(_")
|
||||
.append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName())
|
||||
.append(" AS decimal(20,0))/1000,'%Y-%m-%d %H:%i:%S') ");
|
||||
filter.append(" AND FROM_UNIXTIME(CAST(`_")
|
||||
.append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName()).append("`")
|
||||
.append(" AS DECIMAL(20,0))/1000,'%Y-%m-%d %H:%i:%S') ");
|
||||
} else {
|
||||
filter.append(" AND _").append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName());
|
||||
filter.append(" AND `_").append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName()).append("`");
|
||||
}
|
||||
filter.append(transMysqlFilterTerm(f.getTerm()));
|
||||
if (StringUtils.containsIgnoreCase(f.getTerm(), "null")) {
|
||||
if (StringUtils.equalsIgnoreCase(f.getTerm(), "null")) {
|
||||
filter.append("(null,'')");
|
||||
} else if (StringUtils.equalsIgnoreCase(f.getTerm(), "not_null")) {
|
||||
filter.append(" AND `_")
|
||||
.append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName())
|
||||
.append("`").append(" <> ''");
|
||||
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) {
|
||||
filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')");
|
||||
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) {
|
||||
@ -233,9 +258,10 @@ public class SqlserverQueryProvider extends QueryProvider {
|
||||
if (resultFilter.length == 0) {
|
||||
return sql;
|
||||
} else {
|
||||
String filterSql = MessageFormat.format("SELECT * FROM {0} WHERE 1=1 {1}",
|
||||
String filterSql = MessageFormat.format("SELECT * FROM {0} WHERE 1=1 {1} ORDER BY {2}",
|
||||
"(" + sql + ") AS tmp",
|
||||
StringUtils.join(resultFilter, " "));
|
||||
StringUtils.join(resultFilter, " "),
|
||||
ObjectUtils.isNotEmpty(yOrder) ? StringUtils.join(yOrder, ",") : "null");
|
||||
return filterSql;
|
||||
}
|
||||
}
|
||||
@ -252,12 +278,83 @@ public class SqlserverQueryProvider extends QueryProvider {
|
||||
|
||||
@Override
|
||||
public String getSQLSummary(String table, List<ChartViewFieldDTO> yAxis, List<ChartCustomFilterDTO> customFilter, List<ChartExtFilterRequest> extFilterRequestList) {
|
||||
return null;
|
||||
// 字段汇总 排序等
|
||||
String[] field = yAxis.stream().map(y -> {
|
||||
StringBuilder f = new StringBuilder();
|
||||
if (StringUtils.equalsIgnoreCase(y.getOriginName(), "*")) {
|
||||
f.append(y.getSummary()).append("(").append(y.getOriginName()).append(")");
|
||||
} else {
|
||||
if (StringUtils.equalsIgnoreCase(y.getSummary(), "avg") || StringUtils.containsIgnoreCase(y.getSummary(), "pop")) {
|
||||
f.append("CAST(")
|
||||
.append(y.getSummary()).append("(")
|
||||
.append("CAST(`").append(y.getOriginName()).append("` AS ").append(y.getDeType() == 2 ? "DECIMAL(20,0)" : "DECIMAL(20,2)").append(")")
|
||||
.append(") AS DECIMAL(20,2)").append(")");
|
||||
} else {
|
||||
f.append(y.getSummary()).append("(")
|
||||
.append("CAST(`").append(y.getOriginName()).append("` AS ").append(y.getDeType() == 2 ? "DECIMAL(20,0)" : "DECIMAL(20,2)").append(")")
|
||||
.append(")");
|
||||
}
|
||||
}
|
||||
f.append(" AS `_").append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName()).append("`");
|
||||
return f.toString();
|
||||
}).toArray(String[]::new);
|
||||
|
||||
String[] order = yAxis.stream().filter(f -> StringUtils.isNotEmpty(f.getSort()) && !StringUtils.equalsIgnoreCase(f.getSort(), "none"))
|
||||
.map(f -> "`_" + f.getSummary() + "_" + (StringUtils.equalsIgnoreCase(f.getOriginName(), "*") ? "" : f.getOriginName()) + "` " + f.getSort()).toArray(String[]::new);
|
||||
|
||||
String sql = MessageFormat.format("SELECT {0} FROM {1} WHERE 1=1 {2} ORDER BY null,{3}",
|
||||
StringUtils.join(field, ","),
|
||||
table,
|
||||
transCustomFilter(customFilter) + transExtFilter(extFilterRequestList),// origin field filter and panel field filter
|
||||
StringUtils.join(order, ","));
|
||||
if (sql.endsWith(",")) {
|
||||
sql = sql.substring(0, sql.length() - 1);
|
||||
}
|
||||
// 如果是对结果字段过滤,则再包裹一层sql
|
||||
String[] resultFilter = yAxis.stream().filter(y -> CollectionUtils.isNotEmpty(y.getFilter()) && y.getFilter().size() > 0)
|
||||
.map(y -> {
|
||||
String[] s = y.getFilter().stream().map(f -> {
|
||||
StringBuilder filter = new StringBuilder();
|
||||
// 原始类型不是时间,在de中被转成时间的字段做处理
|
||||
if (y.getDeType() == 1 && y.getDeExtractType() != 1) {
|
||||
filter.append(" AND FROM_UNIXTIME(CAST(`_")
|
||||
.append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName()).append("`")
|
||||
.append(" AS DECIMAL(20,0))/1000,'%Y-%m-%d %H:%i:%S') ");
|
||||
} else {
|
||||
filter.append(" AND `_").append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName()).append("`");
|
||||
}
|
||||
filter.append(transMysqlFilterTerm(f.getTerm()));
|
||||
if (StringUtils.equalsIgnoreCase(f.getTerm(), "null")) {
|
||||
filter.append("(null,'')");
|
||||
} else if (StringUtils.equalsIgnoreCase(f.getTerm(), "not_null")) {
|
||||
filter.append(" AND `_")
|
||||
.append(y.getSummary()).append("_").append(StringUtils.equalsIgnoreCase(y.getOriginName(), "*") ? "" : y.getOriginName())
|
||||
.append("`").append(" <> ''");
|
||||
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "in")) {
|
||||
filter.append("('").append(StringUtils.join(f.getValue(), "','")).append("')");
|
||||
} else if (StringUtils.containsIgnoreCase(f.getTerm(), "like")) {
|
||||
filter.append("%").append(f.getValue()).append("%");
|
||||
} else {
|
||||
filter.append("'").append(f.getValue()).append("'");
|
||||
}
|
||||
return filter.toString();
|
||||
}).toArray(String[]::new);
|
||||
return StringUtils.join(s, " ");
|
||||
}).toArray(String[]::new);
|
||||
if (resultFilter.length == 0) {
|
||||
return sql;
|
||||
} else {
|
||||
String filterSql = MessageFormat.format("SELECT * FROM {0} WHERE 1=1 {1} ORDER BY {2}",
|
||||
"(" + sql + ") AS tmp",
|
||||
StringUtils.join(resultFilter, " "),
|
||||
ObjectUtils.isNotEmpty(order) ? StringUtils.join(order, ",") : "null");
|
||||
return filterSql;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getSQLSummaryAsTmp(String table, List<ChartViewFieldDTO> yAxis, List<ChartCustomFilterDTO> customFilter, List<ChartExtFilterRequest> extFilterRequestList) {
|
||||
return null;
|
||||
public String getSQLSummaryAsTmp(String sql, List<ChartViewFieldDTO> yAxis, List<ChartCustomFilterDTO> customFilter, List<ChartExtFilterRequest> extFilterRequestList) {
|
||||
return getSQLSummary(" (" + sqlFix(sql) + ") AS tmp ", yAxis, customFilter, extFilterRequestList);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -271,7 +368,7 @@ public class SqlserverQueryProvider extends QueryProvider {
|
||||
}
|
||||
|
||||
@Override
|
||||
public String createRawQuerySQL(String table, List<DatasetTableField> fields){
|
||||
public String createRawQuerySQL(String table, List<DatasetTableField> fields) {
|
||||
String[] array = fields.stream().map(f -> {
|
||||
StringBuilder stringBuilder = new StringBuilder();
|
||||
stringBuilder.append("`").append(f.getOriginName()).append("` AS ").append(f.getDataeaseName());
|
||||
@ -308,9 +405,11 @@ public class SqlserverQueryProvider extends QueryProvider {
|
||||
case "not like":
|
||||
return " NOT LIKE ";
|
||||
case "null":
|
||||
return " IS NULL ";
|
||||
return " IN ";
|
||||
case "not_null":
|
||||
return " IS NOT NULL ";
|
||||
case "between":
|
||||
return " BETWEEN ";
|
||||
default:
|
||||
return "";
|
||||
}
|
||||
@ -324,17 +423,24 @@ public class SqlserverQueryProvider extends QueryProvider {
|
||||
for (ChartCustomFilterDTO request : requestList) {
|
||||
String value = request.getValue();
|
||||
DatasetTableField field = request.getField();
|
||||
if (ObjectUtils.isEmpty(field)) {
|
||||
continue;
|
||||
}
|
||||
if (field.getDeType() == 1 && field.getDeExtractType() != 1) {
|
||||
filter.append(" AND FROM_UNIXTIME(cast(")
|
||||
filter.append(" AND FROM_UNIXTIME(CAST(`")
|
||||
.append(field.getOriginName())
|
||||
.append(" AS decimal(20,0))/1000,'%Y-%m-%d %H:%i:%S') ");
|
||||
.append("` AS DECIMAL(20,0))/1000,'%Y-%m-%d %H:%i:%S') ");
|
||||
} else {
|
||||
filter.append(" AND ").append(field.getOriginName());
|
||||
filter.append(" AND `").append(field.getOriginName()).append("`");
|
||||
}
|
||||
filter.append(" ")
|
||||
.append(transMysqlFilterTerm(request.getTerm()))
|
||||
.append(" ");
|
||||
if (StringUtils.containsIgnoreCase(request.getTerm(), "in")) {
|
||||
if (StringUtils.equalsIgnoreCase(request.getTerm(), "null")) {
|
||||
filter.append("(null,'')");
|
||||
} else if (StringUtils.equalsIgnoreCase(request.getTerm(), "not_null")) {
|
||||
filter.append(" AND `").append(field.getOriginName()).append("`").append(" <> ''");
|
||||
} else if (StringUtils.containsIgnoreCase(request.getTerm(), "in")) {
|
||||
filter.append("('").append(StringUtils.join(value, "','")).append("')");
|
||||
} else if (StringUtils.containsIgnoreCase(request.getTerm(), "like")) {
|
||||
filter.append("'%").append(value).append("%'");
|
||||
@ -357,11 +463,11 @@ public class SqlserverQueryProvider extends QueryProvider {
|
||||
}
|
||||
DatasetTableField field = request.getDatasetTableField();
|
||||
if (field.getDeType() == 1 && field.getDeExtractType() != 1) {
|
||||
filter.append(" AND FROM_UNIXTIME(cast(")
|
||||
filter.append(" AND FROM_UNIXTIME(CAST(`")
|
||||
.append(field.getOriginName())
|
||||
.append(" AS decimal(20,0))/1000,'%Y-%m-%d %H:%i:%S') ");
|
||||
.append("` AS DECIMAL(20,0))/1000,'%Y-%m-%d %H:%i:%S') ");
|
||||
} else {
|
||||
filter.append(" AND ").append(field.getOriginName());
|
||||
filter.append(" AND `").append(field.getOriginName()).append("`");
|
||||
}
|
||||
filter.append(" ")
|
||||
.append(transMysqlFilterTerm(request.getOperator()))
|
||||
@ -370,6 +476,11 @@ public class SqlserverQueryProvider extends QueryProvider {
|
||||
filter.append("('").append(StringUtils.join(value, "','")).append("')");
|
||||
} else if (StringUtils.containsIgnoreCase(request.getOperator(), "like")) {
|
||||
filter.append("'%").append(value.get(0)).append("%'");
|
||||
} else if (StringUtils.containsIgnoreCase(request.getOperator(), "between")) {
|
||||
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))));
|
||||
filter.append("'").append(startTime).append("' AND '").append(endTime).append("'");
|
||||
} else {
|
||||
filter.append("'").append(value.get(0)).append("'");
|
||||
}
|
||||
@ -383,4 +494,30 @@ public class SqlserverQueryProvider extends QueryProvider {
|
||||
}
|
||||
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 = "/";
|
||||
}
|
||||
|
||||
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:%i:%S";
|
||||
case "y_M_d_H_m":
|
||||
return "%Y" + split + "%m" + split + "%d" + " %H:%i";
|
||||
case "y_M_d_H_m_s":
|
||||
return "%Y" + split + "%m" + split + "%d" + " %H:%i:%S";
|
||||
default:
|
||||
return "%Y-%m-%d %H:%i:%S";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -10,6 +10,7 @@ import io.dataease.commons.constants.JdbcConstants;
|
||||
import io.dataease.commons.utils.AuthUtils;
|
||||
import io.dataease.commons.utils.BeanUtils;
|
||||
import io.dataease.commons.utils.CommonBeanFactory;
|
||||
import io.dataease.commons.utils.LogUtil;
|
||||
import io.dataease.controller.request.chart.ChartExtFilterRequest;
|
||||
import io.dataease.controller.request.chart.ChartExtRequest;
|
||||
import io.dataease.controller.request.chart.ChartGroupRequest;
|
||||
@ -239,7 +240,23 @@ public class ChartViewService {
|
||||
else {
|
||||
data = (List<String[]>) cache;
|
||||
}*/
|
||||
data = cacheViewData(datasourceProvider, datasourceRequest, id);
|
||||
// 仪表板有参数不实用缓存
|
||||
if (CollectionUtils.isNotEmpty(requestList.getFilter())) {
|
||||
data = datasourceProvider.getData(datasourceRequest);
|
||||
}else {
|
||||
try{
|
||||
data = cacheViewData(datasourceProvider, datasourceRequest, id);
|
||||
}catch (Exception e) {
|
||||
LogUtil.error(e);
|
||||
}finally {
|
||||
// 如果当前对象被锁 且 当前线程冲入次数 > 0 则释放锁
|
||||
if (lock.isLocked() && lock.getHoldCount() > 0) {
|
||||
lock.unlock();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
if (StringUtils.containsIgnoreCase(view.getType(), "pie") && data.size() > 1000) {
|
||||
data = data.subList(0, 1000);
|
||||
@ -320,11 +337,17 @@ public class ChartViewService {
|
||||
Object cache = CacheUtils.get(JdbcConstants.VIEW_CACHE_KEY, viewId);
|
||||
if (cache == null) {
|
||||
if (lock.tryLock()) {// 获取锁成功
|
||||
result = datasourceProvider.getData(datasourceRequest);
|
||||
if (result != null) {
|
||||
CacheUtils.put(JdbcConstants.VIEW_CACHE_KEY, viewId, result, null, null);
|
||||
try{
|
||||
result = datasourceProvider.getData(datasourceRequest);
|
||||
if (result != null) {
|
||||
CacheUtils.put(JdbcConstants.VIEW_CACHE_KEY, viewId, result, null, null);
|
||||
}
|
||||
}catch (Exception e) {
|
||||
LogUtil.error(e);
|
||||
throw e;
|
||||
}finally {
|
||||
lock.unlock();
|
||||
}
|
||||
lock.unlock();
|
||||
}else {//获取锁失败
|
||||
Thread.sleep(100);//避免CAS自旋频率过大 占用cpu资源过高
|
||||
result = cacheViewData(datasourceProvider, datasourceRequest, viewId);
|
||||
|
@ -282,52 +282,101 @@ public class DataSetTableService {
|
||||
realSize = Integer.parseInt(dataSetTableRequest.getRow()) % pageSize;
|
||||
}
|
||||
if (StringUtils.equalsIgnoreCase(datasetTable.getType(), "db")) {
|
||||
Datasource ds = datasourceMapper.selectByPrimaryKey(dataSetTableRequest.getDataSourceId());
|
||||
if (ObjectUtils.isEmpty(ds)) {
|
||||
throw new RuntimeException(Translator.get("i18n_datasource_delete"));
|
||||
if (datasetTable.getMode() == 0) {
|
||||
Datasource ds = datasourceMapper.selectByPrimaryKey(dataSetTableRequest.getDataSourceId());
|
||||
if (ObjectUtils.isEmpty(ds)) {
|
||||
throw new RuntimeException(Translator.get("i18n_datasource_delete"));
|
||||
}
|
||||
DatasourceProvider datasourceProvider = ProviderFactory.getProvider(ds.getType());
|
||||
DatasourceRequest datasourceRequest = new DatasourceRequest();
|
||||
datasourceRequest.setDatasource(ds);
|
||||
String table = dataTableInfoDTO.getTable();
|
||||
QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType());
|
||||
datasourceRequest.setQuery(qp.createQuerySQLWithPage(table, fields, page, pageSize, realSize));
|
||||
try {
|
||||
data.addAll(datasourceProvider.getData(datasourceRequest));
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
try {
|
||||
datasourceRequest.setQuery(qp.createQueryTableWithLimit(table, fields, Integer.valueOf(dataSetTableRequest.getRow())));
|
||||
dataSetPreviewPage.setTotal(datasourceProvider.getData(datasourceRequest).size());
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
} else {
|
||||
// check doris table
|
||||
if (!checkDorisTableIsExists(dataSetTableRequest.getId())) {
|
||||
throw new RuntimeException(Translator.get("i18n_data_not_sync"));
|
||||
}
|
||||
Datasource ds = (Datasource) CommonBeanFactory.getBean("DorisDatasource");
|
||||
JdbcProvider jdbcProvider = CommonBeanFactory.getBean(JdbcProvider.class);
|
||||
DatasourceRequest datasourceRequest = new DatasourceRequest();
|
||||
datasourceRequest.setDatasource(ds);
|
||||
String table = DorisTableUtils.dorisName(dataSetTableRequest.getId());
|
||||
QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType());
|
||||
datasourceRequest.setQuery(qp.createQuerySQLWithPage(table, fields, page, pageSize, realSize));
|
||||
try {
|
||||
data.addAll(jdbcProvider.getData(datasourceRequest));
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
try {
|
||||
datasourceRequest.setQuery(qp.createQueryCountSQL(table));
|
||||
dataSetPreviewPage.setTotal(Integer.valueOf(jdbcProvider.getData(datasourceRequest).get(0)[0]));
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
DatasourceProvider datasourceProvider = ProviderFactory.getProvider(ds.getType());
|
||||
DatasourceRequest datasourceRequest = new DatasourceRequest();
|
||||
datasourceRequest.setDatasource(ds);
|
||||
|
||||
String table = dataTableInfoDTO.getTable();
|
||||
QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType());
|
||||
datasourceRequest.setQuery(qp.createQuerySQLWithPage(table, fields, page, pageSize, realSize));
|
||||
try {
|
||||
data.addAll(datasourceProvider.getData(datasourceRequest));
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
try {
|
||||
datasourceRequest.setQuery(qp.createQueryTableWithLimit(table, fields, Integer.valueOf(dataSetTableRequest.getRow())));
|
||||
dataSetPreviewPage.setTotal(datasourceProvider.getData(datasourceRequest).size());
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
} else if (StringUtils.equalsIgnoreCase(datasetTable.getType(), "sql")) {
|
||||
Datasource ds = datasourceMapper.selectByPrimaryKey(dataSetTableRequest.getDataSourceId());
|
||||
if (ObjectUtils.isEmpty(ds)) {
|
||||
throw new RuntimeException(Translator.get("i18n_datasource_delete"));
|
||||
}
|
||||
DatasourceProvider datasourceProvider = ProviderFactory.getProvider(ds.getType());
|
||||
DatasourceRequest datasourceRequest = new DatasourceRequest();
|
||||
datasourceRequest.setDatasource(ds);
|
||||
if (datasetTable.getMode() == 0) {
|
||||
Datasource ds = datasourceMapper.selectByPrimaryKey(dataSetTableRequest.getDataSourceId());
|
||||
if (ObjectUtils.isEmpty(ds)) {
|
||||
throw new RuntimeException(Translator.get("i18n_datasource_delete"));
|
||||
}
|
||||
DatasourceProvider datasourceProvider = ProviderFactory.getProvider(ds.getType());
|
||||
DatasourceRequest datasourceRequest = new DatasourceRequest();
|
||||
datasourceRequest.setDatasource(ds);
|
||||
|
||||
String sql = dataTableInfoDTO.getSql();
|
||||
QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType());
|
||||
datasourceRequest.setQuery(qp.createQuerySQLAsTmpWithPage(sql, fields, page, pageSize, realSize));
|
||||
System.out.println(datasourceRequest.getQuery());
|
||||
try {
|
||||
data.addAll(datasourceProvider.getData(datasourceRequest));
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
try {
|
||||
datasourceRequest.setQuery(qp.createQuerySqlWithLimit(sql, fields, Integer.valueOf(dataSetTableRequest.getRow())));
|
||||
String sql = dataTableInfoDTO.getSql();
|
||||
QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType());
|
||||
datasourceRequest.setQuery(qp.createQuerySQLAsTmpWithPage(sql, fields, page, pageSize, realSize));
|
||||
System.out.println(datasourceRequest.getQuery());
|
||||
dataSetPreviewPage.setTotal(datasourceProvider.getData(datasourceRequest).size());
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
try {
|
||||
data.addAll(datasourceProvider.getData(datasourceRequest));
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
try {
|
||||
datasourceRequest.setQuery(qp.createQuerySqlWithLimit(sql, fields, Integer.valueOf(dataSetTableRequest.getRow())));
|
||||
dataSetPreviewPage.setTotal(datasourceProvider.getData(datasourceRequest).size());
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
} else {
|
||||
// check doris table
|
||||
if (!checkDorisTableIsExists(dataSetTableRequest.getId())) {
|
||||
throw new RuntimeException(Translator.get("i18n_data_not_sync"));
|
||||
}
|
||||
Datasource ds = (Datasource) CommonBeanFactory.getBean("DorisDatasource");
|
||||
JdbcProvider jdbcProvider = CommonBeanFactory.getBean(JdbcProvider.class);
|
||||
DatasourceRequest datasourceRequest = new DatasourceRequest();
|
||||
datasourceRequest.setDatasource(ds);
|
||||
String table = DorisTableUtils.dorisName(dataSetTableRequest.getId());
|
||||
QueryProvider qp = ProviderFactory.getQueryProvider(ds.getType());
|
||||
datasourceRequest.setQuery(qp.createQuerySQLWithPage(table, fields, page, pageSize, realSize));
|
||||
try {
|
||||
data.addAll(jdbcProvider.getData(datasourceRequest));
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
try {
|
||||
datasourceRequest.setQuery(qp.createQueryCountSQL(table));
|
||||
dataSetPreviewPage.setTotal(Integer.valueOf(jdbcProvider.getData(datasourceRequest).get(0)[0]));
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
} else if (StringUtils.equalsIgnoreCase(datasetTable.getType(), "excel")) {
|
||||
if (StringUtils.isEmpty(datasetTable.getSyncStatus()) || datasetTable.getSyncStatus().equalsIgnoreCase(JobStatus.Underway.name())) {
|
||||
@ -363,7 +412,6 @@ public class DataSetTableService {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
} else if (StringUtils.equalsIgnoreCase(datasetTable.getType(), "custom")) {
|
||||
Datasource ds = (Datasource) CommonBeanFactory.getBean("DorisDatasource");
|
||||
JdbcProvider jdbcProvider = CommonBeanFactory.getBean(JdbcProvider.class);
|
||||
|
@ -4,7 +4,9 @@ package io.dataease.service.message;
|
||||
import io.dataease.base.domain.SysMsg;
|
||||
import io.dataease.base.domain.SysMsgExample;
|
||||
import io.dataease.base.mapper.SysMsgMapper;
|
||||
import io.dataease.base.mapper.ext.ExtSysMsgMapper;
|
||||
import io.dataease.controller.message.dto.MsgRequest;
|
||||
import org.apache.commons.collections.CollectionUtils;
|
||||
import org.apache.commons.lang3.ObjectUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
import javax.annotation.Resource;
|
||||
@ -16,12 +18,20 @@ public class SysMsgService {
|
||||
@Resource
|
||||
private SysMsgMapper sysMsgMapper;
|
||||
|
||||
@Resource
|
||||
private ExtSysMsgMapper extSysMsgMapper;
|
||||
|
||||
public List<SysMsg> query(Long userId, MsgRequest msgRequest) {
|
||||
String orderClause = "";
|
||||
String orderClause = " create_time desc";
|
||||
SysMsgExample example = new SysMsgExample();
|
||||
SysMsgExample.Criteria criteria = example.createCriteria();
|
||||
criteria.andUserIdEqualTo(userId);
|
||||
|
||||
List<String> orders = msgRequest.getOrders();
|
||||
|
||||
if (CollectionUtils.isNotEmpty(orders)) {
|
||||
orderClause = String.join(", ", orders);
|
||||
}
|
||||
|
||||
if (ObjectUtils.isNotEmpty(msgRequest.getType())) {
|
||||
criteria.andTypeEqualTo(msgRequest.getType());
|
||||
@ -29,11 +39,8 @@ public class SysMsgService {
|
||||
|
||||
if (ObjectUtils.isNotEmpty(msgRequest.getStatus())) {
|
||||
criteria.andStatusEqualTo(msgRequest.getStatus());
|
||||
}else {
|
||||
orderClause += " status asc ,";
|
||||
}
|
||||
|
||||
orderClause += " create_time desc";
|
||||
example.setOrderByClause(orderClause);
|
||||
List<SysMsg> sysMsgs = sysMsgMapper.selectByExample(example);
|
||||
return sysMsgs;
|
||||
@ -43,18 +50,20 @@ public class SysMsgService {
|
||||
SysMsg sysMsg = new SysMsg();
|
||||
sysMsg.setMsgId(msgId);
|
||||
sysMsg.setStatus(true);
|
||||
sysMsg.setReadTime(System.currentTimeMillis());
|
||||
sysMsgMapper.updateByPrimaryKeySelective(sysMsg);
|
||||
}
|
||||
|
||||
public void save(SysMsg sysMsg) {
|
||||
// sysMsg.setStatus(false);
|
||||
// sysMsg.setCreateTime(System.currentTimeMillis());
|
||||
sysMsgMapper.insert(sysMsg);
|
||||
public void setBatchReaded(List<Long> msgIds) {
|
||||
extSysMsgMapper.batchStatus(msgIds);
|
||||
}
|
||||
|
||||
public void update(SysMsg sysMsg) {
|
||||
public void batchDelete(List<Long> msgIds) {
|
||||
extSysMsgMapper.batchDelete(msgIds);
|
||||
}
|
||||
|
||||
sysMsgMapper.updateByPrimaryKey(sysMsg);
|
||||
public void save(SysMsg sysMsg) {
|
||||
sysMsgMapper.insert(sysMsg);
|
||||
}
|
||||
|
||||
|
||||
|
@ -14,11 +14,13 @@ import io.dataease.commons.model.AuthURD;
|
||||
import io.dataease.commons.utils.AuthUtils;
|
||||
import io.dataease.commons.utils.BeanUtils;
|
||||
import io.dataease.commons.utils.CommonBeanFactory;
|
||||
import io.dataease.controller.request.panel.PanelShareFineDto;
|
||||
import io.dataease.controller.request.panel.PanelShareRequest;
|
||||
import io.dataease.controller.sys.base.BaseGridRequest;
|
||||
import io.dataease.dto.panel.PanelShareDto;
|
||||
import io.dataease.dto.panel.PanelSharePo;
|
||||
import io.dataease.service.message.DeMsgutil;
|
||||
import lombok.Data;
|
||||
import org.apache.commons.collections.CollectionUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
@ -41,6 +43,176 @@ public class ShareService {
|
||||
@Resource
|
||||
private ExtPanelShareMapper extPanelShareMapper;
|
||||
|
||||
/**
|
||||
* 1.查询当前节点已经分享给了哪些目标
|
||||
* 2.过滤出新增的目标
|
||||
* 3.过滤出减少的目标
|
||||
* 4.批量删除
|
||||
* 5.批量新增
|
||||
* 6.发送取消分享消息
|
||||
* 7.发送新增分享消息
|
||||
* @param panelShareFineDto
|
||||
*/
|
||||
@Transactional
|
||||
public void fineSave(PanelShareFineDto panelShareFineDto) {
|
||||
|
||||
List<PanelShare> addShares = new ArrayList<>();//新增的分享
|
||||
List<Long> redShareIdLists = new ArrayList<>();//取消的分享
|
||||
|
||||
String panelGroupId = panelShareFineDto.getResourceId();
|
||||
AuthURD authURD = panelShareFineDto.getAuthURD();
|
||||
AuthURD sharedAuthURD = new AuthURD();
|
||||
AuthURD addAuthURD = new AuthURD();
|
||||
|
||||
|
||||
|
||||
Map<Integer, List<Long>> authURDMap = new HashMap<>();
|
||||
authURDMap.put(0, authURD.getUserIds());
|
||||
authURDMap.put(1, authURD.getRoleIds());
|
||||
authURDMap.put(2, authURD.getDeptIds());
|
||||
|
||||
PanelShareExample example = new PanelShareExample();
|
||||
example.createCriteria().andPanelGroupIdEqualTo(panelGroupId);
|
||||
List<PanelShare> panelShares = mapper.selectByExample(example);
|
||||
/*if (CollectionUtils.isEmpty(panelShares)) {
|
||||
return;
|
||||
}*/
|
||||
Map<Integer, List<TempShareNode>> typeSharedMap = panelShares.stream().map(this::convertNode).collect(Collectors.groupingBy(TempShareNode::getType));
|
||||
|
||||
for (Map.Entry<Integer, List<Long>> entry : authURDMap.entrySet()) {
|
||||
Integer key = entry.getKey();
|
||||
List<TempShareNode> shareNodes = null;
|
||||
if (null == typeSharedMap || null == typeSharedMap.get(key)) {
|
||||
shareNodes = new ArrayList<>();
|
||||
}else{
|
||||
shareNodes = typeSharedMap.get(key);
|
||||
}
|
||||
|
||||
if (null != authURDMap.get(key)) {
|
||||
Map<String, Object> dataMap = filterData(authURDMap.get(key), shareNodes);
|
||||
List<Long> newIds = (List<Long>)dataMap.get("add");
|
||||
for (int i = 0; i < newIds.size(); i++) {
|
||||
Long id = newIds.get(i);
|
||||
PanelShare share = new PanelShare();
|
||||
share.setCreateTime(System.currentTimeMillis());
|
||||
share.setPanelGroupId(panelGroupId);
|
||||
share.setTargetId(id);
|
||||
share.setType(key);
|
||||
addShares.add(share);
|
||||
}
|
||||
List<TempShareNode> redNodes = (List<TempShareNode>)dataMap.get("red");
|
||||
List<Long> redIds = redNodes.stream().map(TempShareNode::getShareId).distinct().collect(Collectors.toList());
|
||||
|
||||
redShareIdLists.addAll(redIds);
|
||||
buildRedAuthURD(key, redNodes.stream().map(TempShareNode::getTargetId).distinct().collect(Collectors.toList()) , sharedAuthURD);
|
||||
buildRedAuthURD(key, newIds, addAuthURD);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (CollectionUtils.isNotEmpty(redShareIdLists)){
|
||||
extPanelShareMapper.batchDelete(redShareIdLists);
|
||||
}
|
||||
|
||||
if (CollectionUtils.isNotEmpty(addShares)){
|
||||
extPanelShareMapper.batchInsert(addShares);
|
||||
}
|
||||
|
||||
// 以上是业务代码
|
||||
// 下面是消息发送
|
||||
Set<Long> addUserIdSet = AuthUtils.userIdsByURD(addAuthURD);
|
||||
Set<Long> redUserIdSet = AuthUtils.userIdsByURD(sharedAuthURD);
|
||||
|
||||
|
||||
PanelGroup panelGroup = panelGroupMapper.selectByPrimaryKey(panelGroupId);;
|
||||
CurrentUserDto user = AuthUtils.getUser();
|
||||
Gson gson = new Gson();
|
||||
String msg = panelGroup.getName();
|
||||
|
||||
|
||||
List<String> msgParam = new ArrayList<String>();
|
||||
msgParam.add(panelGroupId);
|
||||
addUserIdSet.forEach(userId -> {
|
||||
if (!redUserIdSet.contains(userId)){
|
||||
DeMsgutil.sendMsg(userId, 0, user.getNickName()+" 分享了仪表板【"+msg+"】,请查收!", gson.toJson(msgParam));
|
||||
}
|
||||
});
|
||||
|
||||
redUserIdSet.forEach(userId -> {
|
||||
if (!addUserIdSet.contains(userId)){
|
||||
DeMsgutil.sendMsg(userId, 0, user.getNickName()+" 取消分享了仪表板【"+msg+"】,请查收!", gson.toJson(msgParam));
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
private void buildRedAuthURD(Integer type, List<Long> redIds , AuthURD authURD) {
|
||||
if (type == 0) {
|
||||
authURD.setUserIds(redIds);
|
||||
}
|
||||
if (type == 1) {
|
||||
authURD.setRoleIds(redIds);
|
||||
}
|
||||
if (type == 2) {
|
||||
authURD.setDeptIds(redIds);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param newTargets 新的分享目标
|
||||
* @param shareNodes 已景分享目标
|
||||
* @return
|
||||
*/
|
||||
private Map<String, Object> filterData(List<Long> newTargets, List<TempShareNode> shareNodes) {
|
||||
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
/*if (null == newTargets) {
|
||||
result.put("add", new ArrayList<>());
|
||||
result.put("red", new ArrayList<>());
|
||||
return result;
|
||||
}*/
|
||||
List<Long> newUserIds = new ArrayList<>();
|
||||
for (int i = 0; i < newTargets.size(); i++) {
|
||||
Long newTargetId = newTargets.get(i);
|
||||
Boolean isNew = true;
|
||||
for (int j = 0; j < shareNodes.size(); j++) {
|
||||
TempShareNode shareNode = shareNodes.get(j);
|
||||
Long sharedId = shareNode.getTargetId();
|
||||
if (newTargetId == sharedId) {
|
||||
shareNode.setMatched(true); // 已分享 重新命中
|
||||
isNew = false;
|
||||
}
|
||||
}
|
||||
if (isNew) {
|
||||
// 获取新增的
|
||||
newUserIds.add(newTargetId);
|
||||
}
|
||||
}
|
||||
//获取需要取消分享的
|
||||
List<TempShareNode> missNodes = shareNodes.stream().filter(item -> !item.getMatched()).collect(Collectors.toList());
|
||||
result.put("add", newUserIds);
|
||||
result.put("red", missNodes);
|
||||
return result;
|
||||
}
|
||||
|
||||
@Data
|
||||
private class TempShareNode {
|
||||
private Long shareId;
|
||||
private Integer type;
|
||||
private Long targetId;
|
||||
private Boolean matched = false;
|
||||
|
||||
public boolean targetMatch(Long tid) {
|
||||
return targetId == tid;
|
||||
}
|
||||
}
|
||||
|
||||
private TempShareNode convertNode(PanelShare panelShare) {
|
||||
return BeanUtils.copyBean(new TempShareNode(), panelShare);
|
||||
}
|
||||
|
||||
|
||||
@Transactional
|
||||
public void save(PanelShareRequest request){
|
||||
List<PanelGroup> panelGroups = queryGroup(request.getPanelIds());
|
||||
|
@ -16,4 +16,16 @@ CREATE TABLE `sys_msg` (
|
||||
KEY `inx_msg_userid` (`user_id`) USING BTREE,
|
||||
KEY `inx_msg_type` (`type`) USING BTREE,
|
||||
KEY `inx_msg_status` (`status`) USING BTREE
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='消息通知表';
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='消息通知表';
|
||||
|
||||
BEGIN;
|
||||
INSERT INTO `sys_menu` VALUES (53, 1, 3, 1, '站内消息', 'sys-msg-web', 'msg/index', 1000, 'all-msg', 'system-msg-web', b'0', b'0', b'0', NULL, NULL, NULL, NULL, NULL);
|
||||
INSERT INTO `sys_menu` VALUES (54, 53, 0, 1, '所有消息', 'sys-msg-web-all', 'msg/all', 1, 'web-msg', 'all', b'0', b'0', b'0', NULL, NULL, NULL, NULL, NULL);
|
||||
INSERT INTO `sys_menu` VALUES (55, 53, 0, 1, '未读消息', 'sys-msg-web-unread', 'msg/unread', 2, 'unread-msg', 'unread', b'0', b'0', b'0', NULL, NULL, NULL, NULL, NULL);
|
||||
INSERT INTO `sys_menu` VALUES (56, 53, 0, 1, '已读消息', 'sys-msg-web-readed', 'msg/readed', 3, 'readed-msg', 'readed', b'0', b'0', b'0', NULL, NULL, NULL, NULL, NULL);
|
||||
COMMIT;
|
||||
|
||||
BEGIN;
|
||||
UPDATE `sys_menu` SET permission = null WHERE menu_id = 1;
|
||||
COMMIT;
|
||||
|
||||
|
@ -261,3 +261,9 @@ i18n_sql_delete_not_matching=The data column of incremental delete SQL does not
|
||||
i18n_cst_ds_tb_or_field_deleted=Custom dataset union data is deleted or field changed,can not display
|
||||
i18n_no_all_delete_privilege_folder=This folder have sources which have no manage or view privilege,Can Not Be Deleted.
|
||||
i18n_excel_field_repeat=Excel exists repeat field,please fix and upload again.
|
||||
i18n_schema_is_empty=Database schema is empty
|
||||
站内消息=Internal Messages
|
||||
所有消息=All Messages
|
||||
未读消息=Unread Messages
|
||||
已读消息=Read Messages
|
||||
i18n_data_not_sync=Please sync data first
|
@ -260,3 +260,9 @@ i18n_sql_delete_not_matching=增量删除 sql 的数据列与数据集不匹配,
|
||||
i18n_cst_ds_tb_or_field_deleted=自定义数据集所关联数据被删除或字段发生变化,无法正常显示
|
||||
i18n_no_all_delete_privilege_folder=该目录下存在没有管理权限或查看权限的资源,无法删除
|
||||
i18n_excel_field_repeat=Excel存在重复字段,请修改后重新上传
|
||||
i18n_schema_is_empty=数据库 Schema 为空
|
||||
站内消息=站内消息
|
||||
所有消息=所有消息
|
||||
未读消息=未读消息
|
||||
已读消息=已读消息
|
||||
i18n_data_not_sync=请先完成数据同步
|
||||
|
@ -263,3 +263,9 @@ i18n_sql_delete_not_matching=增量刪除 sql 的數據列與數據集不匹配,
|
||||
i18n_cst_ds_tb_or_field_deleted=自定義數據集所關聯數據被刪除或字段發生變化,無法正常顯示
|
||||
i18n_no_all_delete_privilege_folder=該目錄下存在沒有管理權限或查看權限的資源,無法刪除
|
||||
i18n_excel_field_repeat=Excel存在重復字段,請修改後重新上傳
|
||||
i18n_schema_is_empty=數據庫 Schema 為空
|
||||
站内消息=站內消息
|
||||
所有消息=所有消息
|
||||
未读消息=未讀消息
|
||||
已读消息=已讀消息
|
||||
i18n_data_not_sync=請先完成數據同步
|
@ -27,3 +27,12 @@ export function loadTree(data) {
|
||||
})
|
||||
}
|
||||
|
||||
export function fineSave(data) {
|
||||
return request({
|
||||
url: '/api/share/fineSave',
|
||||
method: 'post',
|
||||
loading: true,
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
|
@ -50,4 +50,13 @@ export function validateDs(data) {
|
||||
})
|
||||
}
|
||||
|
||||
export default { dsGrid, addDs, editDs, delDs, validateDs, listDatasource }
|
||||
export function getSchema(data) {
|
||||
return request({
|
||||
url: 'datasource/getSchema/',
|
||||
method: 'post',
|
||||
loading: true,
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
export default { dsGrid, addDs, editDs, delDs, validateDs, listDatasource, getSchema }
|
||||
|
@ -4,7 +4,7 @@ export function query(pageIndex, pageSize, data) {
|
||||
return request({
|
||||
url: '/api/sys_msg/list/' + pageIndex + '/' + pageSize,
|
||||
method: 'post',
|
||||
loading: true,
|
||||
loading: false,
|
||||
data
|
||||
})
|
||||
}
|
||||
@ -17,3 +17,12 @@ export function updateStatus(msgId) {
|
||||
})
|
||||
}
|
||||
|
||||
export function batchRead(data) {
|
||||
return request({
|
||||
url: '/api/sys_msg/batchRead',
|
||||
method: 'post',
|
||||
loading: true,
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
|
@ -41,9 +41,9 @@
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<div class="msg-foot-class">
|
||||
<div class="msg-foot-class" @click="showMore">
|
||||
<el-row style="padding: 5px 0;margin-bottom: -5px;cursor:point;" @click="showMore">
|
||||
<span @click="showMore">{{ $t('webmsg.show_more') }}</span>
|
||||
<span>{{ $t('webmsg.show_more') }}</span>
|
||||
</el-row>
|
||||
</div>
|
||||
|
||||
@ -62,6 +62,8 @@
|
||||
<script>
|
||||
import { query, updateStatus } from '@/api/system/msg'
|
||||
import { msgTypes, getTypeName } from '@/utils/webMsg'
|
||||
import { mapGetters } from 'vuex'
|
||||
import bus from '@/utils/bus'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
@ -73,28 +75,49 @@ export default {
|
||||
currentPage: 1,
|
||||
pageSize: 5,
|
||||
total: 0
|
||||
}
|
||||
},
|
||||
timer: null
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
|
||||
...mapGetters([
|
||||
'permission_routes'
|
||||
])
|
||||
},
|
||||
created() {
|
||||
this.search()
|
||||
// 每30s定时刷新拉取消息
|
||||
setInterval(() => {
|
||||
this.timer = setInterval(() => {
|
||||
this.search()
|
||||
}, 30000)
|
||||
},
|
||||
mounted() {
|
||||
bus.$on('refresh-top-notification', () => {
|
||||
this.search()
|
||||
})
|
||||
},
|
||||
beforeDestroy() {
|
||||
this.timer && clearInterval(this.timer)
|
||||
},
|
||||
destroyed() {
|
||||
this.timer && clearInterval(this.timer)
|
||||
},
|
||||
methods: {
|
||||
handClick(lang) {
|
||||
console.log(lang)
|
||||
},
|
||||
// handClick(lang) {
|
||||
// console.log(lang)
|
||||
// },
|
||||
showDetail(row) {
|
||||
const param = { ...{ msgNotification: true, msgType: row.type, sourceParam: row.param }}
|
||||
this.visible = false
|
||||
this.$router.push({ name: row.router, params: param })
|
||||
this.setReaded(row.msgId)
|
||||
if (this.$route && this.$route.name && this.$route.name.includes('panel') && row.type === 0) {
|
||||
bus.$emit('to-msg-share', param)
|
||||
} else if (this.$route && this.$route.name && this.$route.name.includes('dataset') && row.type === 1) {
|
||||
bus.$emit('to-msg-dataset', param)
|
||||
} else {
|
||||
this.$router.push({ name: row.router, params: param })
|
||||
}
|
||||
|
||||
row.status || this.setReaded(row.msgId)
|
||||
},
|
||||
remove(row) {
|
||||
|
||||
@ -106,11 +129,24 @@ export default {
|
||||
const routerName = 'sys-msg-web-all'
|
||||
this.visible = false
|
||||
this.$router.push({ name: routerName })
|
||||
this.$emit('refresh-top-bar')
|
||||
this.openSystem()
|
||||
},
|
||||
openSystem() {
|
||||
const path = '/system'
|
||||
let route = this.permission_routes.find(
|
||||
item => item.path === '/' + path.split('/')[1]
|
||||
)
|
||||
// 如果找不到这个路由,说明是首页
|
||||
if (!route) {
|
||||
route = this.permission_routes.find(item => item.path === '/')
|
||||
}
|
||||
this.$store.commit('permission/SET_CURRENT_ROUTES', route)
|
||||
// this.setSidebarHide(route)
|
||||
},
|
||||
search() {
|
||||
const param = {
|
||||
status: false
|
||||
status: false,
|
||||
orders: [' create_time desc ']
|
||||
}
|
||||
const { currentPage, pageSize } = this.paginationConfig
|
||||
query(currentPage, pageSize, param).then(response => {
|
||||
|
@ -1,4 +1,46 @@
|
||||
export default {
|
||||
fu: {
|
||||
search_bar: {
|
||||
search: 'Search',
|
||||
adv_search: 'Advanced search',
|
||||
ok: 'Confirm',
|
||||
cancel: 'Cancel',
|
||||
please_select: 'Please select',
|
||||
please_input: 'Please input',
|
||||
like: 'like ',
|
||||
not_like: 'not like',
|
||||
in: 'in',
|
||||
not_in: 'not in',
|
||||
gt: 'greater than',
|
||||
ge: 'Greater than or equal to',
|
||||
lt: 'less than',
|
||||
le: 'Less than or equal to',
|
||||
eq: 'equal to',
|
||||
ne: 'bot equal to',
|
||||
between: 'between',
|
||||
select_date: 'Select a date',
|
||||
start_date: 'Start date',
|
||||
end_date: 'End date',
|
||||
select_date_time: 'Select date time',
|
||||
start_date_time: 'Start date time',
|
||||
end_date_time: 'End date time',
|
||||
range_separator: 'To',
|
||||
data_time_error: 'The start date cannot be greater than the end date',
|
||||
clean: 'Clean',
|
||||
refresh: 'Refresh'
|
||||
},
|
||||
table: {
|
||||
ok: 'Confirm',
|
||||
custom_table_fields: 'Custom table fields',
|
||||
custom_table_fields_desc: 'Fixed field is not in the selection range'
|
||||
},
|
||||
steps: {
|
||||
cancel: 'Cancle',
|
||||
next: 'next',
|
||||
prev: 'Last step',
|
||||
finish: 'Finish'
|
||||
}
|
||||
},
|
||||
route: {
|
||||
dashboard: 'Dashboard',
|
||||
documentation: 'Documentation',
|
||||
@ -707,8 +749,8 @@ export default {
|
||||
chart_funnel: 'Funnel',
|
||||
chart_radar: 'Radar',
|
||||
chart_gauge: 'Gauge',
|
||||
dateStyle: '日期顯示',
|
||||
datePattern: '日期格式',
|
||||
dateStyle: 'Date Style',
|
||||
datePattern: 'Date Format',
|
||||
y: 'Year',
|
||||
y_M: 'Year Month',
|
||||
y_M_d: 'Year Month Day',
|
||||
@ -741,7 +783,18 @@ export default {
|
||||
axis_name_fontsize: 'Name Fontsize',
|
||||
pie_label_line_show: 'Line',
|
||||
outside: 'Outside',
|
||||
center: 'Center'
|
||||
center: 'Center',
|
||||
split: 'Axis',
|
||||
axis_line: 'Axis Line',
|
||||
axis_label: 'Axis Label',
|
||||
label_fontsize: 'Label Fontsize',
|
||||
split_line: 'Split Line',
|
||||
split_color: 'Split Color',
|
||||
shadow: 'Shadow',
|
||||
condition: 'Filter Value',
|
||||
filter_value_can_null: 'Filter value can not empty',
|
||||
filter_like: 'Contain',
|
||||
filter_not_like: 'Not Contain'
|
||||
},
|
||||
dataset: {
|
||||
sheet_warn: 'There are multiple sheet pages, and the first one is extracted by default',
|
||||
@ -892,7 +945,13 @@ export default {
|
||||
delete_warning: 'Confirm to delete?',
|
||||
input_name: 'Please input name',
|
||||
input_limit_2_25: '2-25 chars',
|
||||
input_limit_0_50: '0-50 chars'
|
||||
input_limit_0_50: '0-50 chars',
|
||||
oracle_connection_type: 'Service Name/SID',
|
||||
oracle_sid: 'SID',
|
||||
oracle_service_name: 'Service Name',
|
||||
get_schema: 'Get Schema',
|
||||
schema: 'Database Schema',
|
||||
please_choose_schema: 'Please select Schema'
|
||||
},
|
||||
pblink: {
|
||||
key_pwd: 'Please enter the password to open the link',
|
||||
@ -1145,6 +1204,13 @@ export default {
|
||||
show_more: 'View more',
|
||||
all_type: 'All type',
|
||||
panel_type: 'Panel Share',
|
||||
dataset_type: 'Dataset sync'
|
||||
dataset_type: 'Dataset sync',
|
||||
content: 'Content',
|
||||
sned_time: 'Send Time',
|
||||
read_time: 'Read Time',
|
||||
type: 'Type',
|
||||
mark_readed: 'Mark As Read',
|
||||
please_select: 'Please select at least one message',
|
||||
mark_success: 'Mark read successfully'
|
||||
}
|
||||
}
|
||||
|
@ -783,7 +783,18 @@ export default {
|
||||
axis_name_fontsize: '名稱字體',
|
||||
pie_label_line_show: '引導線',
|
||||
outside: '外',
|
||||
center: '中心'
|
||||
center: '中心',
|
||||
split: '軸線',
|
||||
axis_line: '軸線',
|
||||
axis_label: '軸標簽',
|
||||
label_fontsize: '標簽大小',
|
||||
split_line: '分割線',
|
||||
split_color: '分割顏色',
|
||||
shadow: '陰影',
|
||||
condition: '過濾值',
|
||||
filter_value_can_null: '過濾值不能為空',
|
||||
filter_like: '包含',
|
||||
filter_not_like: '不包含'
|
||||
},
|
||||
dataset: {
|
||||
sheet_warn: '有多個sheet頁面,默認抽取第一個',
|
||||
@ -934,7 +945,13 @@ export default {
|
||||
delete_warning: '確認刪除?',
|
||||
input_name: '請輸入名稱',
|
||||
input_limit_2_25: '2-25字符',
|
||||
input_limit_0_50: '0-50字符'
|
||||
input_limit_0_50: '0-50字符',
|
||||
oracle_connection_type: '服務名/SID',
|
||||
oracle_sid: 'SID',
|
||||
oracle_service_name: '服務名',
|
||||
get_schema: '獲取 Schema',
|
||||
schema: '數據庫 Schema',
|
||||
please_choose_schema: '請選擇數據庫 Schema'
|
||||
},
|
||||
pblink: {
|
||||
key_pwd: '請輸入密碼打開鏈接',
|
||||
@ -1187,6 +1204,13 @@ export default {
|
||||
show_more: '查看更多',
|
||||
all_type: '全部類型',
|
||||
panel_type: '儀表板分享',
|
||||
dataset_type: '數據集同步'
|
||||
dataset_type: '數據集同步',
|
||||
content: '消息內容',
|
||||
sned_time: '提交時間',
|
||||
read_time: '查看時間',
|
||||
type: '類型',
|
||||
mark_readed: '標記已讀',
|
||||
please_select: '請至少選擇一條消息',
|
||||
mark_success: '標記已讀成功'
|
||||
}
|
||||
}
|
||||
|
@ -1,4 +1,46 @@
|
||||
export default {
|
||||
fu: {
|
||||
search_bar: {
|
||||
search: '搜索',
|
||||
adv_search: '高級搜索',
|
||||
ok: '确定',
|
||||
cancel: '取消',
|
||||
please_select: '请选择',
|
||||
please_input: '请输入',
|
||||
like: '包含',
|
||||
not_like: '不包含',
|
||||
in: '属于',
|
||||
not_in: '不屬于',
|
||||
gt: '大于',
|
||||
ge: '大于等于',
|
||||
lt: '小于',
|
||||
le: '小于等于',
|
||||
eq: '等于',
|
||||
ne: '不等于',
|
||||
between: '之间',
|
||||
select_date: '选择日期',
|
||||
start_date: '开始日期',
|
||||
end_date: '結束日期',
|
||||
select_date_time: '选择日期时间',
|
||||
start_date_time: '开始日期时间',
|
||||
end_date_time: '結束日期时间',
|
||||
range_separator: '至',
|
||||
data_time_error: '开始日期不能大于結束日期',
|
||||
clean: '清空',
|
||||
refresh: '刷新'
|
||||
},
|
||||
table: {
|
||||
ok: '确定',
|
||||
custom_table_fields: '自定义表格字段',
|
||||
custom_table_fields_desc: '固定字段不在选择范围'
|
||||
},
|
||||
steps: {
|
||||
cancel: '取消',
|
||||
next: '下一步',
|
||||
prev: '上一步',
|
||||
finish: '完成'
|
||||
}
|
||||
},
|
||||
route: {
|
||||
dashboard: '首页',
|
||||
documentation: '文档',
|
||||
@ -741,7 +783,18 @@ export default {
|
||||
axis_name_fontsize: '名称字体',
|
||||
pie_label_line_show: '引导线',
|
||||
outside: '外',
|
||||
center: '中心'
|
||||
center: '中心',
|
||||
split: '轴线',
|
||||
axis_line: '轴线',
|
||||
axis_label: '轴标签',
|
||||
label_fontsize: '标签大小',
|
||||
split_line: '分割线',
|
||||
split_color: '分割颜色',
|
||||
shadow: '阴影',
|
||||
condition: '过滤值',
|
||||
filter_value_can_null: '过滤值不能为空',
|
||||
filter_like: '包含',
|
||||
filter_not_like: '不包含'
|
||||
},
|
||||
dataset: {
|
||||
sheet_warn: '有多个 Sheet 页,默认抽取第一个',
|
||||
@ -896,7 +949,10 @@ export default {
|
||||
input_limit_0_50: '0-50字符',
|
||||
oracle_connection_type: '服务名/SID',
|
||||
oracle_sid: 'SID',
|
||||
oracle_service_name: '服务名'
|
||||
oracle_service_name: '服务名',
|
||||
get_schema: '获取 Schema',
|
||||
schema: '数据库 Schema',
|
||||
please_choose_schema: '请选择数据库 Schema'
|
||||
},
|
||||
pblink: {
|
||||
key_pwd: '请输入密码打开链接',
|
||||
@ -1150,6 +1206,13 @@ export default {
|
||||
show_more: '查看更多',
|
||||
all_type: '全部类型',
|
||||
panel_type: '仪表板分享',
|
||||
dataset_type: '数据集同步'
|
||||
dataset_type: '数据集同步',
|
||||
content: '消息内容',
|
||||
sned_time: '提交时间',
|
||||
read_time: '查看时间',
|
||||
type: '类型',
|
||||
mark_readed: '标记已读',
|
||||
please_select: '请至少选择一条消息',
|
||||
mark_success: '标记已读成功'
|
||||
}
|
||||
}
|
||||
|
@ -35,7 +35,7 @@
|
||||
<!-- <el-tooltip :content="$t('navbar.size')" effect="dark" placement="bottom">
|
||||
<size-select id="size-select" class="right-menu-item hover-effect" />
|
||||
</el-tooltip> -->
|
||||
<notification class="right-menu-item hover-effect" @refresh-top-bar="initCurrentRoutes" />
|
||||
<notification class="right-menu-item hover-effect" />
|
||||
<lang-select class="right-menu-item hover-effect" />
|
||||
<div style="height: 100%;padding: 0 8px;" class="right-menu-item hover-effect">
|
||||
<a href="https://dataease.io/docs/" target="_blank" style="display: flex;height: 100%;width: 100%;justify-content: center;align-items: center;">
|
||||
|
@ -76,7 +76,7 @@ export const loadMenus = (next, to) => {
|
||||
buildMenus().then(res => {
|
||||
const filterDatas = filterRouter(res.data)
|
||||
const asyncRouter = filterAsyncRouter(filterDatas)
|
||||
addMsgMenu(asyncRouter)
|
||||
// addMsgMenu(asyncRouter)
|
||||
asyncRouter.push({ path: '*', redirect: '/404', hidden: true })
|
||||
store.dispatch('permission/GenerateRoutes', asyncRouter).then(() => { // 存储路由
|
||||
router.addRoutes(asyncRouter)
|
||||
|
@ -132,6 +132,50 @@ export const DEFAULT_BACKGROUND_COLOR = {
|
||||
color: '#ffffff',
|
||||
alpha: 0
|
||||
}
|
||||
export const DEFAULT_SPLIT = {
|
||||
name: {
|
||||
show: true,
|
||||
color: '#999999',
|
||||
fontSize: '12'
|
||||
},
|
||||
splitNumber: 5,
|
||||
axisLine: {
|
||||
show: true,
|
||||
lineStyle: {
|
||||
color: '#999999',
|
||||
width: 1,
|
||||
type: 'solid'
|
||||
}
|
||||
},
|
||||
axisTick: {
|
||||
show: false,
|
||||
length: 5,
|
||||
lineStyle: {
|
||||
color: '#999999',
|
||||
width: 1,
|
||||
type: 'solid'
|
||||
}
|
||||
},
|
||||
axisLabel: {
|
||||
show: false,
|
||||
rotate: 0,
|
||||
margin: 8,
|
||||
color: '#999999',
|
||||
fontSize: '12',
|
||||
formatter: '{value}'
|
||||
},
|
||||
splitLine: {
|
||||
show: true,
|
||||
lineStyle: {
|
||||
color: '#999999',
|
||||
width: 1,
|
||||
type: 'solid'
|
||||
}
|
||||
},
|
||||
splitArea: {
|
||||
show: true
|
||||
}
|
||||
}
|
||||
// chart config
|
||||
export const BASE_BAR = {
|
||||
title: {
|
||||
@ -349,13 +393,47 @@ export const BASE_RADAR = {
|
||||
radar: {
|
||||
shape: 'polygon',
|
||||
name: {
|
||||
textStyle: {
|
||||
color: '#000000'
|
||||
// backgroundColor: '#999',
|
||||
// borderRadius: 3,
|
||||
// padding: [3, 5]
|
||||
show: true,
|
||||
color: '#999999',
|
||||
fontSize: '12'
|
||||
},
|
||||
splitNumber: 5,
|
||||
axisLine: {
|
||||
show: true,
|
||||
lineStyle: {
|
||||
color: '#999999',
|
||||
width: 1,
|
||||
type: 'solid'
|
||||
}
|
||||
},
|
||||
axisTick: {
|
||||
show: false,
|
||||
length: 5,
|
||||
lineStyle: {
|
||||
color: '#999999',
|
||||
width: 1,
|
||||
type: 'solid'
|
||||
}
|
||||
},
|
||||
axisLabel: {
|
||||
show: false,
|
||||
rotate: 0,
|
||||
margin: 8,
|
||||
color: '#999999',
|
||||
fontSize: '12',
|
||||
formatter: '{value}'
|
||||
},
|
||||
splitLine: {
|
||||
show: true,
|
||||
lineStyle: {
|
||||
color: '#999999',
|
||||
width: 1,
|
||||
type: 'solid'
|
||||
}
|
||||
},
|
||||
splitArea: {
|
||||
show: true
|
||||
},
|
||||
indicator: []
|
||||
},
|
||||
series: [{
|
||||
|
@ -38,6 +38,15 @@ export function componentStyle(chart_option, chart) {
|
||||
chart_option.yAxis.splitLine = customStyle.yAxis.splitLine
|
||||
chart_option.yAxis.nameTextStyle = customStyle.yAxis.nameTextStyle
|
||||
}
|
||||
if (customStyle.split && chart.type.includes('radar')) {
|
||||
chart_option.radar.name = customStyle.split.name
|
||||
chart_option.radar.splitNumber = customStyle.split.splitNumber
|
||||
chart_option.radar.axisLine = customStyle.split.axisLine
|
||||
chart_option.radar.axisTick = customStyle.split.axisTick
|
||||
chart_option.radar.axisLabel = customStyle.split.axisLabel
|
||||
chart_option.radar.splitLine = customStyle.split.splitLine
|
||||
chart_option.radar.splitArea = customStyle.split.splitArea
|
||||
}
|
||||
if (customStyle.background) {
|
||||
chart_option.backgroundColor = hexColorToRGBA(customStyle.background.color, customStyle.background.alpha)
|
||||
}
|
||||
|
@ -0,0 +1,155 @@
|
||||
<template>
|
||||
<div>
|
||||
<div style="width: 100%">
|
||||
<el-popover
|
||||
placement="right"
|
||||
width="400"
|
||||
trigger="click"
|
||||
>
|
||||
<el-col>
|
||||
<el-form ref="splitForm" :model="splitForm" label-width="80px" size="mini">
|
||||
<el-form-item :label="$t('chart.name')" class="form-item">
|
||||
<el-checkbox v-model="splitForm.name.show" @change="changeSplitStyle">{{ $t('chart.show') }}</el-checkbox>
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('chart.color')" class="form-item">
|
||||
<colorPicker v-model="splitForm.name.color" style="margin-top: 6px;cursor: pointer;z-index: 1004;border: solid 1px black" @change="changeSplitStyle" />
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('chart.text_fontsize')" class="form-item form-item-slider">
|
||||
<el-select v-model="splitForm.name.fontSize" :placeholder="$t('chart.text_fontsize')" @change="changeSplitStyle">
|
||||
<el-option v-for="option in fontSize" :key="option.value" :label="option.name" :value="option.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('chart.axis_line')" class="form-item">
|
||||
<el-checkbox v-model="splitForm.axisLine.show" @change="changeSplitStyle">{{ $t('chart.show') }}</el-checkbox>
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('chart.axis_color')" class="form-item">
|
||||
<colorPicker v-model="splitForm.axisLine.lineStyle.color" style="margin-top: 6px;cursor: pointer;z-index: 1004;border: solid 1px black" @change="changeSplitStyle" />
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('chart.axis_label')" class="form-item">
|
||||
<el-checkbox v-model="splitForm.axisLabel.show" @change="changeSplitStyle">{{ $t('chart.show') }}</el-checkbox>
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('chart.axis_label_color')" class="form-item">
|
||||
<colorPicker v-model="splitForm.axisLabel.color" style="margin-top: 6px;cursor: pointer;z-index: 1004;border: solid 1px black" @change="changeSplitStyle" />
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('chart.label_fontsize')" class="form-item form-item-slider">
|
||||
<el-select v-model="splitForm.axisLabel.fontSize" :placeholder="$t('chart.label_fontsize')" @change="changeSplitStyle">
|
||||
<el-option v-for="option in fontSize" :key="option.value" :label="option.name" :value="option.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('chart.split_line')" class="form-item">
|
||||
<el-checkbox v-model="splitForm.splitLine.show" @change="changeSplitStyle">{{ $t('chart.show') }}</el-checkbox>
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('chart.split_color')" class="form-item">
|
||||
<colorPicker v-model="splitForm.splitLine.lineStyle.color" style="margin-top: 6px;cursor: pointer;z-index: 1004;border: solid 1px black" @change="changeSplitStyle" />
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('chart.shadow')" class="form-item">
|
||||
<el-checkbox v-model="splitForm.splitArea.show" @change="changeSplitStyle">{{ $t('chart.show') }}</el-checkbox>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-col>
|
||||
|
||||
<el-button slot="reference" size="mini" class="shape-item">
|
||||
{{ $t('chart.split') }}<i class="el-icon-setting el-icon--right" />
|
||||
</el-button>
|
||||
</el-popover>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { DEFAULT_SPLIT } from '../../chart/chart'
|
||||
|
||||
export default {
|
||||
name: 'SplitSelector',
|
||||
props: {
|
||||
chart: {
|
||||
type: Object,
|
||||
required: true
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
splitForm: JSON.parse(JSON.stringify(DEFAULT_SPLIT)),
|
||||
isSetting: false,
|
||||
fontSize: []
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
'chart': {
|
||||
handler: function() {
|
||||
const chart = JSON.parse(JSON.stringify(this.chart))
|
||||
if (chart.customStyle) {
|
||||
let customStyle = null
|
||||
if (Object.prototype.toString.call(chart.customStyle) === '[object Object]') {
|
||||
customStyle = JSON.parse(JSON.stringify(chart.customStyle))
|
||||
} else {
|
||||
customStyle = JSON.parse(chart.customStyle)
|
||||
}
|
||||
if (customStyle.split) {
|
||||
this.splitForm = customStyle.split
|
||||
} else {
|
||||
this.splitForm = JSON.parse(JSON.stringify(DEFAULT_SPLIT))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.init()
|
||||
},
|
||||
methods: {
|
||||
init() {
|
||||
const arr = []
|
||||
for (let i = 6; i <= 40; i = i + 2) {
|
||||
arr.push({
|
||||
name: i + '',
|
||||
value: i + ''
|
||||
})
|
||||
}
|
||||
this.fontSize = arr
|
||||
},
|
||||
changeSplitStyle() {
|
||||
if (!this.splitForm.show) {
|
||||
this.isSetting = false
|
||||
}
|
||||
this.$emit('onChangeSplitForm', this.splitForm)
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.el-divider--horizontal {
|
||||
margin: 10px 0
|
||||
}
|
||||
.shape-item{
|
||||
padding: 6px;
|
||||
border: none;
|
||||
width: 100%;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
}
|
||||
.form-item-slider>>>.el-form-item__label{
|
||||
font-size: 12px;
|
||||
line-height: 38px;
|
||||
}
|
||||
.form-item>>>.el-form-item__label{
|
||||
font-size: 12px;
|
||||
}
|
||||
.el-select-dropdown__item{
|
||||
padding: 0 20px;
|
||||
}
|
||||
span{
|
||||
font-size: 12px
|
||||
}
|
||||
.el-form-item{
|
||||
margin-bottom: 6px;
|
||||
}
|
||||
|
||||
.switch-style{
|
||||
position: absolute;
|
||||
right: 10px;
|
||||
margin-top: -4px;
|
||||
}
|
||||
</style>
|
@ -23,7 +23,7 @@
|
||||
</el-select>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-input v-show="!f.term.includes('null')" v-model="f.value" class="value-item" :placeholder="$t('chart.no_limit')" size="mini" clearable />
|
||||
<el-input v-show="!f.term.includes('null')" v-model="f.value" class="value-item" :placeholder="$t('chart.condition')" size="mini" clearable />
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-button type="text" icon="el-icon-delete" circle style="float: right" @click="removeFilter(index)" />
|
||||
@ -53,7 +53,18 @@ export default {
|
||||
value: 'not_eq',
|
||||
label: this.$t('chart.filter_not_eq')
|
||||
}]
|
||||
}, {
|
||||
},
|
||||
{
|
||||
label: '',
|
||||
options: [{
|
||||
value: 'like',
|
||||
label: this.$t('chart.filter_like')
|
||||
}, {
|
||||
value: 'not like',
|
||||
label: this.$t('chart.filter_not_like')
|
||||
}]
|
||||
},
|
||||
{
|
||||
label: '',
|
||||
options: [{
|
||||
value: 'lt',
|
||||
|
@ -23,7 +23,7 @@
|
||||
</el-select>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-input v-show="!f.term.includes('null')" v-model="f.value" class="value-item" :placeholder="$t('chart.no_limit')" size="mini" clearable />
|
||||
<el-input v-show="!f.term.includes('null')" v-model="f.value" class="value-item" :placeholder="$t('chart.condition')" size="mini" clearable />
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-button type="text" icon="el-icon-delete" circle style="float: right" @click="removeFilter(index)" />
|
||||
@ -53,7 +53,18 @@ export default {
|
||||
value: 'not_eq',
|
||||
label: this.$t('chart.filter_not_eq')
|
||||
}]
|
||||
}, {
|
||||
},
|
||||
{
|
||||
label: '',
|
||||
options: [{
|
||||
value: 'like',
|
||||
label: this.$t('chart.filter_like')
|
||||
}, {
|
||||
value: 'not like',
|
||||
label: this.$t('chart.filter_not_like')
|
||||
}]
|
||||
},
|
||||
{
|
||||
label: '',
|
||||
options: [{
|
||||
value: 'lt',
|
||||
|
@ -37,7 +37,7 @@
|
||||
</el-select>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-input v-show="!f.term.includes('null')" v-model="f.value" class="value-item" :placeholder="$t('chart.no_limit')" size="mini" clearable />
|
||||
<el-input v-show="!f.term.includes('null')" v-model="f.value" class="value-item" :placeholder="$t('chart.condition')" size="mini" clearable />
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-button type="text" icon="el-icon-delete" circle style="float: right" @click="removeFilter(index)" />
|
||||
@ -69,7 +69,18 @@ export default {
|
||||
value: 'not_eq',
|
||||
label: this.$t('chart.filter_not_eq')
|
||||
}]
|
||||
}, {
|
||||
},
|
||||
{
|
||||
label: '',
|
||||
options: [{
|
||||
value: 'like',
|
||||
label: this.$t('chart.filter_like')
|
||||
}, {
|
||||
value: 'not like',
|
||||
label: this.$t('chart.filter_not_like')
|
||||
}]
|
||||
},
|
||||
{
|
||||
label: '',
|
||||
options: [{
|
||||
value: 'lt',
|
||||
|
@ -34,7 +34,7 @@
|
||||
<span>{{ $t('chart.content_formatter') }}</span>
|
||||
<el-tooltip class="item" effect="dark" placement="bottom">
|
||||
<div slot="content">
|
||||
字符串支持用 \n 换行<br>字符串模板 模板变量有:<br>{a}:系列名。<br>{b}:数据名。<br>{c}:数据值。<br>{d}:百分比(用于饼图等)。
|
||||
字符串模板 模板变量有:<br>{a}:系列名。<br>{b}:数据名。<br>{c}:数据值。<br>{d}:百分比(用于饼图等)。
|
||||
</div>
|
||||
<i class="el-icon-info" style="cursor: pointer;" />
|
||||
</el-tooltip>
|
||||
|
@ -353,7 +353,8 @@ import {
|
||||
DEFAULT_TOOLTIP,
|
||||
DEFAULT_XAXIS_STYLE,
|
||||
DEFAULT_YAXIS_STYLE,
|
||||
DEFAULT_BACKGROUND_COLOR
|
||||
DEFAULT_BACKGROUND_COLOR,
|
||||
DEFAULT_SPLIT
|
||||
} from '../chart/chart'
|
||||
|
||||
export default {
|
||||
@ -781,7 +782,8 @@ export default {
|
||||
legend: DEFAULT_LEGEND_STYLE,
|
||||
xAxis: DEFAULT_XAXIS_STYLE,
|
||||
yAxis: DEFAULT_YAXIS_STYLE,
|
||||
background: DEFAULT_BACKGROUND_COLOR
|
||||
background: DEFAULT_BACKGROUND_COLOR,
|
||||
split: DEFAULT_SPLIT
|
||||
})
|
||||
view.customFilter = JSON.stringify([])
|
||||
post('/chart/view/save', view).then(response => {
|
||||
|
@ -29,10 +29,20 @@
|
||||
<el-col
|
||||
style="height: 100%;width: 20%;min-width: 180px;max-width:220px;border: 1px solid #E6E6E6;border-left: 0 solid;"
|
||||
>
|
||||
<div style="height: 50%;border-bottom: 1px solid #E6E6E6;" class="padding-lr">
|
||||
<div style="display: flex;align-items: center;justify-content: center;padding: 6px;">
|
||||
<el-input
|
||||
v-model="searchField"
|
||||
size="mini"
|
||||
:placeholder="$t('chart.search')"
|
||||
prefix-icon="el-icon-search"
|
||||
clearable
|
||||
/>
|
||||
<el-button icon="el-icon-setting" type="text" size="mini" style="float: right;width: 20px;margin-left: 6px;" @click="editField" />
|
||||
</div>
|
||||
<div style="border-bottom: 1px solid #E6E6E6;" class="padding-lr field-height">
|
||||
<span>{{ $t('chart.dimension') }}</span>
|
||||
<draggable
|
||||
v-model="dimension"
|
||||
v-model="dimensionData"
|
||||
:options="{group:{name: 'dimension',pull:'clone'},sort: true}"
|
||||
animation="300"
|
||||
:move="onMove"
|
||||
@ -41,7 +51,7 @@
|
||||
@start="start1"
|
||||
>
|
||||
<transition-group>
|
||||
<span v-for="item in dimension" :key="item.id" class="item" :title="item.name">
|
||||
<span v-for="item in dimensionData" :key="item.id" class="item" :title="item.name">
|
||||
<svg-icon v-if="item.deType === 0" icon-class="field_text" class="field-icon-text" />
|
||||
<svg-icon v-if="item.deType === 1" icon-class="field_time" class="field-icon-time" />
|
||||
<svg-icon v-if="item.deType === 2 || item.deType === 3" icon-class="field_value" class="field-icon-value" />
|
||||
@ -50,10 +60,10 @@
|
||||
</transition-group>
|
||||
</draggable>
|
||||
</div>
|
||||
<div style="height: 50%;" class="padding-lr">
|
||||
<div class="padding-lr field-height">
|
||||
<span>{{ $t('chart.quota') }}</span>
|
||||
<draggable
|
||||
v-model="quota"
|
||||
v-model="quotaData"
|
||||
:options="{group:{name: 'quota',pull:'clone'},sort: true}"
|
||||
animation="300"
|
||||
:move="onMove"
|
||||
@ -62,7 +72,7 @@
|
||||
@start="start1"
|
||||
>
|
||||
<transition-group>
|
||||
<span v-for="item in quota" :key="item.id" class="item" :title="item.name">
|
||||
<span v-for="item in quotaData" :key="item.id" class="item" :title="item.name">
|
||||
<svg-icon v-if="item.deType === 0" icon-class="field_text" class="field-icon-text" />
|
||||
<svg-icon v-if="item.deType === 1" icon-class="field_time" class="field-icon-time" />
|
||||
<svg-icon v-if="item.deType === 2 || item.deType === 3" icon-class="field_value" class="field-icon-value" />
|
||||
@ -213,6 +223,7 @@
|
||||
<el-tab-pane :label="$t('chart.module_style')" class="padding-lr">
|
||||
<x-axis-selector v-show="view.type.includes('bar') || view.type.includes('line')" class="attr-selector" :chart="chart" @onChangeXAxisForm="onChangeXAxisForm" />
|
||||
<y-axis-selector v-show="view.type.includes('bar') || view.type.includes('line')" class="attr-selector" :chart="chart" @onChangeYAxisForm="onChangeYAxisForm" />
|
||||
<split-selector v-show="view.type.includes('radar')" class="attr-selector" :chart="chart" @onChangeSplitForm="onChangeSplitForm" />
|
||||
<title-selector class="attr-selector" :chart="chart" @onTextChange="onTextChange" />
|
||||
<legend-selector v-show="!view.type.includes('table') && !view.type.includes('text')" class="attr-selector" :chart="chart" @onLegendChange="onLegendChange" />
|
||||
<background-color-selector class="attr-selector" :chart="chart" @onChangeBackgroundForm="onChangeBackgroundForm" />
|
||||
@ -351,6 +362,18 @@
|
||||
<el-button type="primary" size="mini" :disabled="!table.id" @click="changeChart">{{ $t('chart.confirm') }}</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
|
||||
<!--编辑视图使用的数据集的字段-->
|
||||
<el-dialog
|
||||
v-dialogDrag
|
||||
:visible="editDsField"
|
||||
:show-close="false"
|
||||
class="dialog-css"
|
||||
:destroy-on-close="true"
|
||||
:fullscreen="true"
|
||||
>
|
||||
<field-edit :param="{table:table}" @switchComponent="closeEditDsField" />
|
||||
</el-dialog>
|
||||
</el-row>
|
||||
</template>
|
||||
|
||||
@ -373,7 +396,8 @@ import {
|
||||
DEFAULT_TITLE_STYLE,
|
||||
DEFAULT_TOOLTIP,
|
||||
DEFAULT_XAXIS_STYLE,
|
||||
DEFAULT_YAXIS_STYLE
|
||||
DEFAULT_YAXIS_STYLE,
|
||||
DEFAULT_SPLIT
|
||||
} from '../chart/chart'
|
||||
import ColorSelector from '../components/shape-attr/ColorSelector'
|
||||
import SizeSelector from '../components/shape-attr/SizeSelector'
|
||||
@ -384,16 +408,18 @@ import TooltipSelector from '../components/shape-attr/TooltipSelector'
|
||||
import XAxisSelector from '../components/component-style/XAxisSelector'
|
||||
import YAxisSelector from '../components/component-style/YAxisSelector'
|
||||
import BackgroundColorSelector from '../components/component-style/BackgroundColorSelector'
|
||||
import SplitSelector from '../components/component-style/SplitSelector'
|
||||
import QuotaFilterEditor from '../components/filter/QuotaFilterEditor'
|
||||
import DimensionFilterEditor from '../components/filter/DimensionFilterEditor'
|
||||
import TableNormal from '../components/table/TableNormal'
|
||||
import LabelNormal from '../components/normal/LabelNormal'
|
||||
import html2canvas from 'html2canvas'
|
||||
import TableSelector from './TableSelector'
|
||||
import FieldEdit from '../../dataset/data/FieldEdit'
|
||||
|
||||
export default {
|
||||
name: 'ChartEdit',
|
||||
components: { TableSelector, ResultFilterEditor, LabelNormal, DimensionFilterEditor, TableNormal, DatasetChartDetail, QuotaFilterEditor, BackgroundColorSelector, XAxisSelector, YAxisSelector, TooltipSelector, LabelSelector, LegendSelector, TitleSelector, SizeSelector, ColorSelector, ChartComponent, QuotaItem, DimensionItem, draggable },
|
||||
components: { FieldEdit, SplitSelector, TableSelector, ResultFilterEditor, LabelNormal, DimensionFilterEditor, TableNormal, DatasetChartDetail, QuotaFilterEditor, BackgroundColorSelector, XAxisSelector, YAxisSelector, TooltipSelector, LabelSelector, LegendSelector, TitleSelector, SizeSelector, ColorSelector, ChartComponent, QuotaItem, DimensionItem, draggable },
|
||||
props: {
|
||||
param: {
|
||||
type: Object,
|
||||
@ -406,6 +432,8 @@ export default {
|
||||
table: {},
|
||||
dimension: [],
|
||||
quota: [],
|
||||
dimensionData: [],
|
||||
quotaData: [],
|
||||
view: {
|
||||
xaxis: [],
|
||||
yaxis: [],
|
||||
@ -423,7 +451,8 @@ export default {
|
||||
legend: DEFAULT_LEGEND_STYLE,
|
||||
xAxis: DEFAULT_XAXIS_STYLE,
|
||||
yAxis: DEFAULT_YAXIS_STYLE,
|
||||
background: DEFAULT_BACKGROUND_COLOR
|
||||
background: DEFAULT_BACKGROUND_COLOR,
|
||||
split: DEFAULT_SPLIT
|
||||
},
|
||||
customFilter: []
|
||||
},
|
||||
@ -454,7 +483,9 @@ export default {
|
||||
msg: ''
|
||||
},
|
||||
selectTableFlag: false,
|
||||
changeTable: {}
|
||||
changeTable: {},
|
||||
searchField: '',
|
||||
editDsField: false
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
@ -463,7 +494,6 @@ export default {
|
||||
// this.getData(this.$store.state.chart.viewId)
|
||||
// return this.$store.state.chart.viewId
|
||||
// }
|
||||
|
||||
},
|
||||
watch: {
|
||||
'param': function() {
|
||||
@ -472,6 +502,9 @@ export default {
|
||||
}else{
|
||||
this.getData(this.param.id)
|
||||
}
|
||||
},
|
||||
searchField(val) {
|
||||
this.fieldFilter(val)
|
||||
}
|
||||
},
|
||||
created() {
|
||||
@ -503,6 +536,9 @@ export default {
|
||||
post('/dataset/table/getFieldsFromDE', this.table).then(response => {
|
||||
this.dimension = response.data.dimension
|
||||
this.quota = response.data.quota
|
||||
this.dimensionData = JSON.parse(JSON.stringify(this.dimension))
|
||||
this.quotaData = JSON.parse(JSON.stringify(this.quota))
|
||||
this.fieldFilter(this.searchField)
|
||||
}).catch(err => {
|
||||
this.resetView()
|
||||
this.httpRequest.status = err.response.data.success
|
||||
@ -865,6 +901,11 @@ export default {
|
||||
this.save()
|
||||
},
|
||||
|
||||
onChangeSplitForm(val) {
|
||||
this.view.customStyle.split = val
|
||||
this.save()
|
||||
},
|
||||
|
||||
showDimensionEditFilter(item) {
|
||||
this.dimensionItem = JSON.parse(JSON.stringify(item))
|
||||
this.dimensionFilterEdit = true
|
||||
@ -873,6 +914,17 @@ export default {
|
||||
this.dimensionFilterEdit = false
|
||||
},
|
||||
saveDimensionFilter() {
|
||||
for (let i = 0; i < this.dimensionItem.filter.length; i++) {
|
||||
const f = this.dimensionItem.filter[i]
|
||||
if (!f.term.includes('null') && (!f.value || f.value === '')) {
|
||||
this.$message({
|
||||
message: this.$t('chart.filter_value_can_null'),
|
||||
type: 'error',
|
||||
showClose: true
|
||||
})
|
||||
return
|
||||
}
|
||||
}
|
||||
this.view.xaxis[this.dimensionItem.index].filter = this.dimensionItem.filter
|
||||
this.save(true)
|
||||
this.closeDimensionFilter()
|
||||
@ -886,6 +938,17 @@ export default {
|
||||
this.quotaFilterEdit = false
|
||||
},
|
||||
saveQuotaFilter() {
|
||||
for (let i = 0; i < this.quotaItem.filter.length; i++) {
|
||||
const f = this.quotaItem.filter[i]
|
||||
if (!f.term.includes('null') && (!f.value || f.value === '')) {
|
||||
this.$message({
|
||||
message: this.$t('chart.filter_value_can_null'),
|
||||
type: 'error',
|
||||
showClose: true
|
||||
})
|
||||
return
|
||||
}
|
||||
}
|
||||
this.view.yaxis[this.quotaItem.index].filter = this.quotaItem.filter
|
||||
this.save(true)
|
||||
this.closeQuotaFilter()
|
||||
@ -909,6 +972,14 @@ export default {
|
||||
})
|
||||
return
|
||||
}
|
||||
if (!f.term.includes('null') && (!f.value || f.value === '')) {
|
||||
this.$message({
|
||||
message: this.$t('chart.filter_value_can_null'),
|
||||
type: 'error',
|
||||
showClose: true
|
||||
})
|
||||
return
|
||||
}
|
||||
}
|
||||
this.view.customFilter = this.chartForFilter.customFilter
|
||||
this.save(true)
|
||||
@ -980,6 +1051,25 @@ export default {
|
||||
this.view.yaxis = []
|
||||
this.view.customFilter = []
|
||||
this.save(true, 'chart', false)
|
||||
},
|
||||
|
||||
fieldFilter(val) {
|
||||
if (val && val !== '') {
|
||||
this.dimensionData = JSON.parse(JSON.stringify(this.dimension.filter(ele => { return ele.name.includes(val) })))
|
||||
this.quotaData = JSON.parse(JSON.stringify(this.quota.filter(ele => { return ele.name.includes(val) })))
|
||||
} else {
|
||||
this.dimensionData = JSON.parse(JSON.stringify(this.dimension))
|
||||
this.quotaData = JSON.parse(JSON.stringify(this.quota))
|
||||
}
|
||||
},
|
||||
|
||||
editField() {
|
||||
this.editDsField = true
|
||||
},
|
||||
|
||||
closeEditDsField() {
|
||||
this.editDsField = false
|
||||
this.initTableField()
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1173,4 +1263,7 @@ export default {
|
||||
justify-content: center;
|
||||
background-color: #ece7e7;
|
||||
}
|
||||
.field-height{
|
||||
height: calc(50% - 20px);
|
||||
}
|
||||
</style>
|
||||
|
@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<el-row style="height: 100%;overflow-y: hidden;width: 100%;">
|
||||
<span v-show="false">{{ tableRefresh }}</span>
|
||||
<!-- <span v-show="false">{{ tableRefresh }}</span>-->
|
||||
<el-row style="height: 26px;">
|
||||
<el-popover
|
||||
placement="right-start"
|
||||
@ -94,10 +94,10 @@ export default {
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
tableRefresh() {
|
||||
this.initTable(this.param)
|
||||
return this.$store.state.dataset.table
|
||||
}
|
||||
// tableRefresh() {
|
||||
// this.initTable(this.param)
|
||||
// return this.$store.state.dataset.table
|
||||
// }
|
||||
},
|
||||
watch: {
|
||||
'param': function() {
|
||||
|
@ -26,7 +26,7 @@ import AddExcel from './add/AddExcel'
|
||||
import AddCustom from './add/AddCustom'
|
||||
import FieldEdit from './data/FieldEdit'
|
||||
import { removeClass } from '@/utils'
|
||||
|
||||
import bus from '@/utils/bus'
|
||||
export default {
|
||||
name: 'DataSet',
|
||||
components: { DeMainContainer, DeContainer, DeAsideContainer, Group, DataHome, ViewTable, AddDB, AddSQL, AddExcel, AddCustom },
|
||||
@ -39,27 +39,31 @@ export default {
|
||||
},
|
||||
mounted() {
|
||||
removeClass(document.body, 'showRightPanel')
|
||||
bus.$on('to-msg-dataset', params => {
|
||||
this.toMsgShare(params)
|
||||
})
|
||||
},
|
||||
created() {
|
||||
this.$store.dispatch('app/toggleSideBarHide', true)
|
||||
let routerParam
|
||||
if ((routerParam = this.$router.currentRoute.params) !== null && routerParam.msgNotification) {
|
||||
// 说明是从消息通知跳转过来的
|
||||
if (routerParam.msgType === 1) { // 是数据集同步
|
||||
if (routerParam.sourceParam) {
|
||||
try {
|
||||
const msgParam = JSON.parse(routerParam.sourceParam)
|
||||
this.param = msgParam.tableId
|
||||
this.component = ViewTable
|
||||
this.$nextTick(() => {
|
||||
this.$refs.dynamic_component.msg2Current(routerParam.sourceParam)
|
||||
})
|
||||
} catch (error) {
|
||||
console.error(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
const routerParam = this.$router.currentRoute.params
|
||||
this.toMsgShare(routerParam)
|
||||
// if ((routerParam = this.$router.currentRoute.params) !== null && routerParam.msgNotification) {
|
||||
// // 说明是从消息通知跳转过来的
|
||||
// if (routerParam.msgType === 1) { // 是数据集同步
|
||||
// if (routerParam.sourceParam) {
|
||||
// try {
|
||||
// const msgParam = JSON.parse(routerParam.sourceParam)
|
||||
// this.param = msgParam.tableId
|
||||
// this.component = ViewTable
|
||||
// this.$nextTick(() => {
|
||||
// this.$refs.dynamic_component.msg2Current(routerParam.sourceParam)
|
||||
// })
|
||||
// } catch (error) {
|
||||
// console.error(error)
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
},
|
||||
methods: {
|
||||
switchComponent(c) {
|
||||
@ -91,6 +95,26 @@ export default {
|
||||
|
||||
saveSuccess(val) {
|
||||
this.saveStatus = val
|
||||
},
|
||||
|
||||
toMsgShare(routerParam) {
|
||||
if (routerParam !== null && routerParam.msgNotification) {
|
||||
// 说明是从消息通知跳转过来的
|
||||
if (routerParam.msgType === 1) { // 是数据集同步
|
||||
if (routerParam.sourceParam) {
|
||||
try {
|
||||
const msgParam = JSON.parse(routerParam.sourceParam)
|
||||
this.param = msgParam.tableId
|
||||
this.component = ViewTable
|
||||
this.$nextTick(() => {
|
||||
this.$refs.dynamic_component.msg2Current(routerParam.sourceParam)
|
||||
})
|
||||
} catch (error) {
|
||||
console.error(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -11,10 +11,11 @@
|
||||
:pagination-config="paginationConfig"
|
||||
@select="select"
|
||||
@search="search"
|
||||
@sort-change="sortChange"
|
||||
>
|
||||
|
||||
<el-table-column prop="content" :label="$t('commons.name')">
|
||||
<template v-slot:default="scope">
|
||||
<el-table-column prop="content" :label="$t('webmsg.content')">
|
||||
<template slot-scope="scope">
|
||||
|
||||
<span style="display: flex;flex: 1;">
|
||||
<span>
|
||||
@ -29,13 +30,13 @@
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column prop="createTime" :label="$t('commons.create_time')" width="180">
|
||||
<template v-slot:default="scope">
|
||||
<el-table-column prop="createTime" sortable="custom" :label="$t('webmsg.sned_time')" width="180">
|
||||
<template slot-scope="scope">
|
||||
<span>{{ scope.row.createTime | timestampFormatDate }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column prop="type" :label="$t('datasource.type')" width="120">
|
||||
<el-table-column prop="type" sortable="custom" :label="$t('webmsg.type')" width="120">
|
||||
<template slot-scope="scope">
|
||||
<span>{{ $t(getTypeName(scope.row.type)) }}</span>
|
||||
</template>
|
||||
@ -52,6 +53,8 @@ import LayoutContent from '@/components/business/LayoutContent'
|
||||
import ComplexTable from '@/components/business/complex-table'
|
||||
import { query, updateStatus } from '@/api/system/msg'
|
||||
import { msgTypes, getTypeName } from '@/utils/webMsg'
|
||||
import bus from '@/utils/bus'
|
||||
import { addOrder, formatOrders } from '@/utils/index'
|
||||
export default {
|
||||
components: {
|
||||
LayoutContent,
|
||||
@ -75,7 +78,8 @@ export default {
|
||||
currentPage: 1,
|
||||
pageSize: 10,
|
||||
total: 0
|
||||
}
|
||||
},
|
||||
orderConditions: []
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
@ -91,6 +95,13 @@ export default {
|
||||
if (this.selectType >= 0) {
|
||||
param.type = this.selectType
|
||||
}
|
||||
|
||||
if (this.orderConditions.length === 0) {
|
||||
param.orders = [' status asc ', 'create_time desc ']
|
||||
} else {
|
||||
param.orders = formatOrders(this.orderConditions)
|
||||
}
|
||||
|
||||
const { currentPage, pageSize } = this.paginationConfig
|
||||
query(currentPage, pageSize, param).then(response => {
|
||||
this.data = response.data.listObject
|
||||
@ -106,13 +117,26 @@ export default {
|
||||
toDetail(row) {
|
||||
const param = { ...{ msgNotification: true, msgType: row.type, sourceParam: row.param }}
|
||||
this.$router.push({ name: row.router, params: param })
|
||||
this.setReaded(row)
|
||||
row.status || this.setReaded(row)
|
||||
},
|
||||
// 设置已读
|
||||
setReaded(row) {
|
||||
updateStatus(row.msgId).then(res => {
|
||||
bus.$emit('refresh-top-notification')
|
||||
this.search()
|
||||
})
|
||||
},
|
||||
sortChange({ column, prop, order }) {
|
||||
this.orderConditions = []
|
||||
if (!order) {
|
||||
this.search()
|
||||
return
|
||||
}
|
||||
if (prop === 'createTime') {
|
||||
prop = 'create_time'
|
||||
}
|
||||
addOrder({ field: prop, value: order }, this.orderConditions)
|
||||
this.search()
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -11,10 +11,11 @@
|
||||
:pagination-config="paginationConfig"
|
||||
@select="select"
|
||||
@search="search"
|
||||
@sort-change="sortChange"
|
||||
>
|
||||
|
||||
<el-table-column prop="content" :label="$t('commons.name')">
|
||||
<template v-slot:default="scope">
|
||||
<el-table-column prop="content" :label="$t('webmsg.content')">
|
||||
<template slot-scope="scope">
|
||||
|
||||
<span style="display: flex;flex: 1;">
|
||||
<span>
|
||||
@ -29,13 +30,19 @@
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column prop="createTime" :label="$t('commons.create_time')" width="180">
|
||||
<template v-slot:default="scope">
|
||||
<el-table-column prop="createTime" sortable="custom" :label="$t('webmsg.sned_time')" width="180">
|
||||
<template slot-scope="scope">
|
||||
<span>{{ scope.row.createTime | timestampFormatDate }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column prop="type" :label="$t('datasource.type')" width="120">
|
||||
<el-table-column prop="readTime" sortable="custom" :label="$t('webmsg.read_time')" width="180">
|
||||
<template slot-scope="scope">
|
||||
<span>{{ scope.row.readTime | timestampFormatDate }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column prop="type" sortable="custom" :label="$t('webmsg.type')" width="120">
|
||||
<template slot-scope="scope">
|
||||
<span>{{ $t(getTypeName(scope.row.type)) }}</span>
|
||||
</template>
|
||||
@ -52,6 +59,7 @@ import LayoutContent from '@/components/business/LayoutContent'
|
||||
import ComplexTable from '@/components/business/complex-table'
|
||||
import { query } from '@/api/system/msg'
|
||||
import { msgTypes, getTypeName } from '@/utils/webMsg'
|
||||
import { addOrder, formatOrders } from '@/utils/index'
|
||||
export default {
|
||||
components: {
|
||||
LayoutContent,
|
||||
@ -70,6 +78,7 @@ export default {
|
||||
allTypes: [{ name: 'mysql', type: 'jdbc' }, { name: 'sqlServer', type: 'jdbc' }],
|
||||
|
||||
columns: [],
|
||||
orderConditions: [],
|
||||
|
||||
paginationConfig: {
|
||||
currentPage: 1,
|
||||
@ -91,6 +100,13 @@ export default {
|
||||
if (this.selectType >= 0) {
|
||||
param.type = this.selectType
|
||||
}
|
||||
|
||||
if (this.orderConditions.length === 0) {
|
||||
param.orders = [' create_time desc ']
|
||||
} else {
|
||||
param.orders = formatOrders(this.orderConditions)
|
||||
}
|
||||
|
||||
const { currentPage, pageSize } = this.paginationConfig
|
||||
query(currentPage, pageSize, param).then(response => {
|
||||
this.data = response.data.listObject
|
||||
@ -106,6 +122,21 @@ export default {
|
||||
toDetail(row) {
|
||||
const param = { ...{ msgNotification: true, msgType: row.type, sourceParam: row.param }}
|
||||
this.$router.push({ name: row.router, params: param })
|
||||
},
|
||||
sortChange({ column, prop, order }) {
|
||||
this.orderConditions = []
|
||||
if (!order) {
|
||||
this.search()
|
||||
return
|
||||
}
|
||||
if (prop === 'createTime') {
|
||||
prop = 'create_time'
|
||||
}
|
||||
if (prop === 'readTime') {
|
||||
prop = 'read_time'
|
||||
}
|
||||
addOrder({ field: prop, value: order }, this.orderConditions)
|
||||
this.search()
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -9,12 +9,22 @@
|
||||
:data="data"
|
||||
:columns="columns"
|
||||
:pagination-config="paginationConfig"
|
||||
:search-config="searchConfig"
|
||||
@select="select"
|
||||
@search="search"
|
||||
@selection-change="handleSelectionChange"
|
||||
@sort-change="sortChange"
|
||||
>
|
||||
|
||||
<el-table-column prop="content" :label="$t('commons.name')">
|
||||
<template v-slot:default="scope">
|
||||
<template #toolbar>
|
||||
<el-button :disabled="multipleSelection.length === 0" @click="markReaded">{{ $t('webmsg.mark_readed') }}</el-button>
|
||||
<!-- <fu-table-button v-permission="['user:add']" icon="el-icon-circle-plus-outline" :label="$t('user.create')" @click="create" /> -->
|
||||
</template>
|
||||
<el-table-column
|
||||
type="selection"
|
||||
width="55"
|
||||
/>
|
||||
<el-table-column prop="content" :label="$t('webmsg.content')">
|
||||
<template slot-scope="scope">
|
||||
|
||||
<span style="display: flex;flex: 1;">
|
||||
<span>
|
||||
@ -29,13 +39,13 @@
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column prop="createTime" :label="$t('commons.create_time')" width="180">
|
||||
<template v-slot:default="scope">
|
||||
<el-table-column prop="createTime" sortable="custom" :label="$t('webmsg.sned_time')" width="180">
|
||||
<template slot-scope="scope">
|
||||
<span>{{ scope.row.createTime | timestampFormatDate }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column prop="type" :label="$t('datasource.type')" width="120">
|
||||
<el-table-column prop="type" sortable="custom" :label="$t('webmsg.type')" width="120">
|
||||
<template slot-scope="scope">
|
||||
<span>{{ $t(getTypeName(scope.row.type)) }}</span>
|
||||
</template>
|
||||
@ -50,8 +60,11 @@
|
||||
|
||||
import LayoutContent from '@/components/business/LayoutContent'
|
||||
import ComplexTable from '@/components/business/complex-table'
|
||||
import { query, updateStatus } from '@/api/system/msg'
|
||||
import { query, updateStatus, batchRead } from '@/api/system/msg'
|
||||
import { msgTypes, getTypeName } from '@/utils/webMsg'
|
||||
import bus from '@/utils/bus'
|
||||
import { addOrder, formatOrders } from '@/utils/index'
|
||||
|
||||
export default {
|
||||
components: {
|
||||
LayoutContent,
|
||||
@ -75,7 +88,13 @@ export default {
|
||||
currentPage: 1,
|
||||
pageSize: 10,
|
||||
total: 0
|
||||
}
|
||||
},
|
||||
searchConfig: {
|
||||
useQuickSearch: false,
|
||||
useComplexSearch: false
|
||||
},
|
||||
multipleSelection: [],
|
||||
orderConditions: []
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
@ -91,6 +110,13 @@ export default {
|
||||
if (this.selectType >= 0) {
|
||||
param.type = this.selectType
|
||||
}
|
||||
|
||||
if (this.orderConditions.length === 0) {
|
||||
param.orders = [' create_time desc ']
|
||||
} else {
|
||||
param.orders = formatOrders(this.orderConditions)
|
||||
}
|
||||
|
||||
const { currentPage, pageSize } = this.paginationConfig
|
||||
query(currentPage, pageSize, param).then(response => {
|
||||
this.data = response.data.listObject
|
||||
@ -111,9 +137,37 @@ export default {
|
||||
// 设置已读
|
||||
setReaded(row) {
|
||||
updateStatus(row.msgId).then(res => {
|
||||
bus.$emit('refresh-top-notification')
|
||||
this.search()
|
||||
})
|
||||
},
|
||||
markReaded() {
|
||||
if (this.multipleSelection.length === 0) {
|
||||
this.$warning(this.$t('webmsg.please_select'))
|
||||
return
|
||||
}
|
||||
const param = this.multipleSelection.map(item => item.msgId)
|
||||
batchRead(param).then(res => {
|
||||
this.$success('webmsg.mark_success')
|
||||
this.search()
|
||||
})
|
||||
},
|
||||
handleSelectionChange(val) {
|
||||
this.multipleSelection = val
|
||||
},
|
||||
sortChange({ column, prop, order }) {
|
||||
this.orderConditions = []
|
||||
if (!order) {
|
||||
this.search()
|
||||
return
|
||||
}
|
||||
if (prop === 'createTime') {
|
||||
prop = 'create_time'
|
||||
}
|
||||
addOrder({ field: prop, value: order }, this.orderConditions)
|
||||
this.search()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -158,6 +158,12 @@ export default {
|
||||
return roots
|
||||
},
|
||||
|
||||
getSelected() {
|
||||
return {
|
||||
deptIds: this.$refs.table.store.states.selection.map(item => item.deptId)
|
||||
}
|
||||
},
|
||||
|
||||
save(msg) {
|
||||
const rows = this.$refs.table.store.states.selection
|
||||
const request = this.buildRequest(rows)
|
||||
|
@ -26,6 +26,7 @@
|
||||
import GrantDept from './dept'
|
||||
import GrantRole from './role'
|
||||
import GrantUser from './user'
|
||||
import { fineSave } from '@/api/panel/share'
|
||||
export default {
|
||||
name: 'GrantAuth',
|
||||
components: { GrantDept, GrantRole, GrantUser },
|
||||
@ -58,8 +59,27 @@ export default {
|
||||
this.showSearchInput = false
|
||||
},
|
||||
save() {
|
||||
this.$refs[this.activeName].save(this.$t('commons.share_success'))
|
||||
this.$emit('close-grant', 0)
|
||||
// this.$refs[this.activeName].save(this.$t('commons.share_success'))
|
||||
// this.$emit('close-grant', 0)
|
||||
this.fineSave()
|
||||
},
|
||||
fineSave() {
|
||||
let targetDto = {}
|
||||
this.tabNames.forEach(tabName => {
|
||||
if (this.$refs[tabName] && this.$refs[tabName].getSelected) {
|
||||
const tempSelected = this.$refs[tabName].getSelected()
|
||||
targetDto = Object.assign({}, targetDto, tempSelected)
|
||||
}
|
||||
})
|
||||
const resourceId = this.resourceId
|
||||
const param = {
|
||||
resourceId,
|
||||
authURD: targetDto
|
||||
}
|
||||
fineSave(param).then(res => {
|
||||
this.$success(this.$t('commons.share_success'))
|
||||
this.$emit('close-grant', 0)
|
||||
})
|
||||
},
|
||||
cancel() {
|
||||
this.$refs[this.activeName].cancel()
|
||||
|
@ -78,6 +78,13 @@ export default {
|
||||
this.setCheckNodes()
|
||||
})
|
||||
},
|
||||
|
||||
getSelected() {
|
||||
return {
|
||||
roleIds: this.$refs.table.store.states.selection.map(item => item.roleId)
|
||||
}
|
||||
},
|
||||
|
||||
save(msg) {
|
||||
const rows = this.$refs.table.store.states.selection
|
||||
const request = this.buildRequest(rows)
|
||||
|
@ -71,7 +71,7 @@ export default {
|
||||
return data
|
||||
},
|
||||
expandMsgNode(panelIds) {
|
||||
console.log(panelIds)
|
||||
// console.log(panelIds)
|
||||
this.$nextTick(() => {
|
||||
this.getMsgNodes(panelIds)
|
||||
})
|
||||
|
@ -86,6 +86,12 @@ export default {
|
||||
})
|
||||
},
|
||||
|
||||
getSelected() {
|
||||
return {
|
||||
userIds: this.$refs.table.store.states.selection.map(item => item.userId)
|
||||
}
|
||||
},
|
||||
|
||||
save(msg) {
|
||||
const rows = this.$refs.table.store.states.selection
|
||||
const request = this.buildRequest(rows)
|
||||
|
@ -27,7 +27,17 @@ export default {
|
||||
param: {}
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
$route(to, from) {
|
||||
console.log(to)
|
||||
console.log(from)
|
||||
// 对路由变化作出响应...
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
bus.$on('to-msg-share', params => {
|
||||
this.toMsgShare(params)
|
||||
})
|
||||
bus.$on('PanelSwitchComponent', (c) => {
|
||||
this.param = c.param
|
||||
this.componentName = c.name
|
||||
@ -50,18 +60,30 @@ export default {
|
||||
},
|
||||
created() {
|
||||
this.$store.dispatch('app/toggleSideBarHide', true)
|
||||
let routerParam
|
||||
if ((routerParam = this.$router.currentRoute.params) !== null && routerParam.msgNotification) {
|
||||
// 说明是从消息通知跳转过来的
|
||||
if (routerParam.msgType === 0) { // 是仪表板分享
|
||||
this.componentName = 'PanelMain'
|
||||
this.$nextTick(() => {
|
||||
this.$refs.panel_main.msg2Current(routerParam.sourceParam)
|
||||
})
|
||||
}
|
||||
}
|
||||
const routerParam = this.$router.currentRoute.params
|
||||
// if ((routerParam = this.$router.currentRoute.params) !== null && routerParam.msgNotification) {
|
||||
// // 说明是从消息通知跳转过来的
|
||||
// if (routerParam.msgType === 0) { // 是仪表板分享
|
||||
// this.componentName = 'PanelMain'
|
||||
// this.$nextTick(() => {
|
||||
// this.$refs.panel_main.msg2Current(routerParam.sourceParam)
|
||||
// })
|
||||
// }
|
||||
// }
|
||||
this.toMsgShare(routerParam)
|
||||
},
|
||||
methods: {
|
||||
toMsgShare(routerParam) {
|
||||
if (routerParam !== null && routerParam.msgNotification) {
|
||||
// 说明是从消息通知跳转过来的
|
||||
if (routerParam.msgType === 0) { // 是仪表板分享
|
||||
this.componentName = 'PanelMain'
|
||||
this.$nextTick(() => {
|
||||
this.$refs.panel_main.msg2Current(routerParam.sourceParam)
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -114,7 +114,7 @@ export default {
|
||||
},
|
||||
mounted() {
|
||||
this.queryTreeDatas()
|
||||
console.log('permis:' + JSON.stringify(this.$store.getters.permissions))
|
||||
// console.log('permis:' + JSON.stringify(this.$store.getters.permissions))
|
||||
},
|
||||
methods: {
|
||||
filterNode(value, data) {
|
||||
@ -154,7 +154,7 @@ export default {
|
||||
return 'MySQL'
|
||||
} else if (type === 'sqlServer') {
|
||||
return 'SQL Server'
|
||||
}else if (type === 'oracle') {
|
||||
} else if (type === 'oracle') {
|
||||
return 'Oracle'
|
||||
}
|
||||
},
|
||||
|
@ -46,6 +46,23 @@
|
||||
<el-form-item v-if="form.configuration.dataSourceType=='jdbc'" :label="$t('datasource.port')" prop="configuration.port">
|
||||
<el-input v-model="form.configuration.port" autocomplete="off" />
|
||||
</el-form-item>
|
||||
<el-form-item v-if="form.type=='oracle'">
|
||||
<el-button icon="el-icon-plus" size="mini" @click="getSchema()">
|
||||
{{ $t('datasource.get_schema') }}
|
||||
</el-button>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item v-if="form.type=='oracle'" :label="$t('datasource.schema')">
|
||||
<el-select v-model="form.configuration.schema" :placeholder="$t('datasource.please_choose_schema')" class="select-width" :disabled="formType=='modify'">
|
||||
<el-option
|
||||
v-for="item in schemas"
|
||||
:key="item"
|
||||
:label="item"
|
||||
:value="item"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
|
||||
</el-form>
|
||||
<div v-if="canEdit" slot="footer" class="dialog-footer">
|
||||
<el-button v-if="formType==='add'?true: hasDataPermission('manage',params.privileges)" @click="validaDatasource">{{ $t('commons.validate') }}</el-button>
|
||||
@ -61,7 +78,7 @@
|
||||
|
||||
<script>
|
||||
import LayoutContent from '@/components/business/LayoutContent'
|
||||
import { addDs, editDs, validateDs } from '@/api/system/datasource'
|
||||
import { addDs, editDs, getSchema, validateDs } from '@/api/system/datasource'
|
||||
export default {
|
||||
name: 'DsForm',
|
||||
components: { LayoutContent },
|
||||
@ -84,9 +101,11 @@ export default {
|
||||
'configuration.username': [{ required: true, message: this.$t('datasource.please_input_user_name'), trigger: 'blur' }],
|
||||
'configuration.password': [{ required: true, message: this.$t('datasource.please_input_password'), trigger: 'change' }],
|
||||
'configuration.host': [{ required: true, message: this.$t('datasource.please_input_host'), trigger: 'change' }],
|
||||
'configuration.port': [{ required: true, message: this.$t('datasource.please_input_port'), trigger: 'change' }]
|
||||
'configuration.port': [{ required: true, message: this.$t('datasource.please_input_port'), trigger: 'change' }],
|
||||
'configuration.schema': [{ required: true, message: this.$t('datasource.please_choose_schema'), trigger: 'change' }]
|
||||
},
|
||||
allTypes: [{ name: 'mysql', label: 'MySQL', type: 'jdbc' }, { name: 'oracle', label: 'Oracle', type: 'jdbc' }],
|
||||
schemas: [],
|
||||
canEdit: false
|
||||
}
|
||||
},
|
||||
@ -129,10 +148,13 @@ export default {
|
||||
this.$refs.dsForm.resetFields()
|
||||
},
|
||||
save() {
|
||||
if (!this.form.configuration.schema) {
|
||||
this.$message.error(this.$t('datasource.please_choose_schema'))
|
||||
return
|
||||
}
|
||||
this.$refs.dsForm.validate(valid => {
|
||||
if (valid) {
|
||||
const method = this.formType === 'add' ? addDs : editDs
|
||||
// this.form.configuration = JSON.stringify(this.form.configuration)
|
||||
const form = JSON.parse(JSON.stringify(this.form))
|
||||
form.configuration = JSON.stringify(form.configuration)
|
||||
method(form).then(res => {
|
||||
@ -145,12 +167,25 @@ export default {
|
||||
}
|
||||
})
|
||||
},
|
||||
getSchema() {
|
||||
this.$refs.dsForm.validate(valid => {
|
||||
if (valid) {
|
||||
const data = JSON.parse(JSON.stringify(this.form))
|
||||
data.configuration = JSON.stringify(data.configuration)
|
||||
getSchema(data).then(res => {
|
||||
this.schemas = res.data
|
||||
this.$success(this.$t('datasource.validate_success'))
|
||||
})
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
})
|
||||
},
|
||||
validaDatasource() {
|
||||
this.$refs.dsForm.validate(valid => {
|
||||
if (valid) {
|
||||
const data = JSON.parse(JSON.stringify(this.form))
|
||||
data.configuration = JSON.stringify(data.configuration)
|
||||
|
||||
validateDs(data).then(res => {
|
||||
this.$success(this.$t('datasource.validate_success'))
|
||||
})
|
||||
|
Loading…
Reference in New Issue
Block a user