From 00650ce9f2ad15e758aa8f21aec5c9b92897e912 Mon Sep 17 00:00:00 2001 From: rc452860 <87719349@qq.com> Date: Tue, 11 Jan 2022 11:11:54 +0800 Subject: [PATCH 01/10] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93=E6=95=B0=E6=8D=AE=E9=9B=86=E6=97=B6=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E8=A1=A8=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dataease/dto/datasource/DBTableDTO.java | 2 + .../io/dataease/dto/datasource/TableDesc.java | 15 +++ .../datasource/DatasourceProvider.java | 3 +- .../provider/datasource/EsProvider.java | 96 ++++++++++--------- .../provider/datasource/JdbcProvider.java | 27 ++++-- .../service/datasource/DatasourceService.java | 9 +- frontend/src/views/dataset/add/AddDB.vue | 9 +- 7 files changed, 103 insertions(+), 58 deletions(-) create mode 100644 backend/src/main/java/io/dataease/dto/datasource/TableDesc.java diff --git a/backend/src/main/java/io/dataease/dto/datasource/DBTableDTO.java b/backend/src/main/java/io/dataease/dto/datasource/DBTableDTO.java index 3c42edf228..efa12809b8 100644 --- a/backend/src/main/java/io/dataease/dto/datasource/DBTableDTO.java +++ b/backend/src/main/java/io/dataease/dto/datasource/DBTableDTO.java @@ -15,6 +15,8 @@ public class DBTableDTO { private String datasourceId; @ApiModelProperty("数据源名称") private String name; + @ApiModelProperty("表注释") + private String remark; @ApiModelProperty("启用检测") private boolean enableCheck; @ApiModelProperty("数据集路径") diff --git a/backend/src/main/java/io/dataease/dto/datasource/TableDesc.java b/backend/src/main/java/io/dataease/dto/datasource/TableDesc.java new file mode 100644 index 0000000000..e53066e9d7 --- /dev/null +++ b/backend/src/main/java/io/dataease/dto/datasource/TableDesc.java @@ -0,0 +1,15 @@ +package io.dataease.dto.datasource; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class TableDesc { + @ApiModelProperty("表名称") + private String name; + @ApiModelProperty("表备注") + private String remark; +} diff --git a/backend/src/main/java/io/dataease/provider/datasource/DatasourceProvider.java b/backend/src/main/java/io/dataease/provider/datasource/DatasourceProvider.java index a09e5576cc..d99d7a80b0 100644 --- a/backend/src/main/java/io/dataease/provider/datasource/DatasourceProvider.java +++ b/backend/src/main/java/io/dataease/provider/datasource/DatasourceProvider.java @@ -1,5 +1,6 @@ package io.dataease.provider.datasource; +import io.dataease.dto.datasource.TableDesc; import io.dataease.dto.datasource.TableFiled; import io.dataease.controller.request.datasource.DatasourceRequest; @@ -12,7 +13,7 @@ public abstract class DatasourceProvider { abstract public List getData(DatasourceRequest datasourceRequest) throws Exception; - abstract public List getTables(DatasourceRequest datasourceRequest) throws Exception; + abstract public List getTables(DatasourceRequest datasourceRequest) throws Exception; public void checkStatus(DatasourceRequest datasourceRequest) throws Exception { getData(datasourceRequest); diff --git a/backend/src/main/java/io/dataease/provider/datasource/EsProvider.java b/backend/src/main/java/io/dataease/provider/datasource/EsProvider.java index 8943c498c5..3b1e9c7c61 100644 --- a/backend/src/main/java/io/dataease/provider/datasource/EsProvider.java +++ b/backend/src/main/java/io/dataease/provider/datasource/EsProvider.java @@ -9,6 +9,7 @@ import io.dataease.controller.request.datasource.es.Requst; import io.dataease.controller.request.datasource.es.RequstWithCursor; import io.dataease.controller.request.datasource.DatasourceRequest; import io.dataease.dto.datasource.EsConfiguration; +import io.dataease.dto.datasource.TableDesc; import io.dataease.dto.datasource.TableFiled; import io.dataease.exception.DataEaseException; import io.dataease.i18n.Translator; @@ -37,11 +38,11 @@ public class EsProvider extends DatasourceProvider { /** * 这里使用声明式缓存不是很妥当 * 改为chartViewService中使用编程式缓存 - @Cacheable( - value = JdbcConstants.JDBC_PROVIDER_KEY, - key = "'provider_sql_' + #dsr.datasource.id + '_' + #dsr.table + '_' + #dsr.query", - condition = "#dsr.pageSize == null || #dsr.pageSize == 0L" - ) + * + * @Cacheable( value = JdbcConstants.JDBC_PROVIDER_KEY, + * key = "'provider_sql_' + #dsr.datasource.id + '_' + #dsr.table + '_' + #dsr.query", + * condition = "#dsr.pageSize == null || #dsr.pageSize == 0L" + * ) */ @Override public List getData(DatasourceRequest dsr) throws Exception { @@ -49,7 +50,7 @@ public class EsProvider extends DatasourceProvider { try { EsConfiguration esConfiguration = new Gson().fromJson(dsr.getDatasource().getConfiguration(), EsConfiguration.class); HttpClientConfig httpClientConfig = new HttpClientConfig(); - if(StringUtils.isNotEmpty(esConfiguration.getEsUsername())){ + if (StringUtils.isNotEmpty(esConfiguration.getEsUsername())) { String auth = esConfiguration.getEsUsername() + ":" + esConfiguration.getEsPassword(); byte[] encodedAuth = Base64.encodeBase64(auth.getBytes(StandardCharsets.UTF_8)); httpClientConfig.addHeader(HttpHeaders.AUTHORIZATION, "Basic " + new String(encodedAuth)); @@ -58,24 +59,24 @@ public class EsProvider extends DatasourceProvider { requst.setQuery(dsr.getQuery()); requst.setFetch_size(dsr.getFetchSize()); String url = esConfiguration.getUrl().endsWith("/") ? esConfiguration.getUrl() + esConfiguration.getUri() + "?format=json" : esConfiguration.getUrl() + "/" + esConfiguration.getUri() + "?format=json"; - String response = HttpClientUtil.post(url, new Gson().toJson(requst), httpClientConfig); + String response = HttpClientUtil.post(url, new Gson().toJson(requst), httpClientConfig); EsReponse esReponse = new Gson().fromJson(response, EsReponse.class); list.addAll(fetchResult(esReponse)); - if(dsr.isPageable()){ - Integer realSize = dsr.getPage() * dsr.getPageSize() < list.size() ? dsr.getPage() * dsr.getPageSize(): list.size(); + if (dsr.isPageable()) { + Integer realSize = dsr.getPage() * dsr.getPageSize() < list.size() ? dsr.getPage() * dsr.getPageSize() : list.size(); list = list.subList((dsr.getPage() - 1) * dsr.getPageSize(), realSize); } - if(!dsr.isPreviewData()){ - while (StringUtils.isNotEmpty(esReponse.getCursor())) { - RequstWithCursor requstWithCursor = new RequstWithCursor(); - requstWithCursor.setQuery(dsr.getQuery()); - requstWithCursor.setFetch_size(dsr.getFetchSize()); - requstWithCursor.setCursor(esReponse.getCursor()); - response = HttpClientUtil.post(url, new Gson().toJson(requstWithCursor), httpClientConfig); - esReponse = new Gson().fromJson(response, EsReponse.class); - list.addAll(fetchResult(esReponse)); - } + if (!dsr.isPreviewData()) { + while (StringUtils.isNotEmpty(esReponse.getCursor())) { + RequstWithCursor requstWithCursor = new RequstWithCursor(); + requstWithCursor.setQuery(dsr.getQuery()); + requstWithCursor.setFetch_size(dsr.getFetchSize()); + requstWithCursor.setCursor(esReponse.getCursor()); + response = HttpClientUtil.post(url, new Gson().toJson(requstWithCursor), httpClientConfig); + esReponse = new Gson().fromJson(response, EsReponse.class); + list.addAll(fetchResult(esReponse)); + } } } catch (Exception e) { e.printStackTrace(); @@ -110,7 +111,7 @@ public class EsProvider extends DatasourceProvider { private List fetchResult(EsReponse esReponse) throws Exception { List list = new LinkedList<>(); - if(esReponse.getError() != null){ + if (esReponse.getError() != null) { throw new Exception(esReponse.getError().getReason()); } list.addAll(esReponse.getRows()); @@ -132,7 +133,7 @@ public class EsProvider extends DatasourceProvider { private List fetchResultField(String response) throws Exception { List fieldList = new ArrayList<>(); EsReponse esReponse = new Gson().fromJson(response, EsReponse.class); - if(esReponse.getError() != null){ + if (esReponse.getError() != null) { throw new Exception(esReponse.getError().getReason()); } @@ -150,7 +151,7 @@ public class EsProvider extends DatasourceProvider { private List fetchResultField4Sql(String response) throws Exception { List fieldList = new ArrayList<>(); EsReponse esReponse = new Gson().fromJson(response, EsReponse.class); - if(esReponse.getError() != null){ + if (esReponse.getError() != null) { throw new Exception(esReponse.getError().getReason()); } @@ -183,31 +184,35 @@ public class EsProvider extends DatasourceProvider { } @Override - public List getTables(DatasourceRequest datasourceRequest) throws Exception { - List tables = new ArrayList<>(); + public List getTables(DatasourceRequest datasourceRequest) throws Exception { + List tables = new ArrayList<>(); try { String response = exexQuery(datasourceRequest, "show tables", "?format=json"); tables = fetchTables(response); - tables = tables.stream().filter(table -> !table.startsWith(".")).collect(Collectors.toList()); + tables = tables.stream().filter(table -> !table.getName().startsWith(".")).collect(Collectors.toList()); } catch (Exception e) { DataEaseException.throwException(e); } return tables; } - private List fetchTables(String response) throws Exception { - List tables = new ArrayList<>(); + private List fetchTables(String response) throws Exception { + List tables = new ArrayList<>(); EsReponse esReponse = new Gson().fromJson(response, EsReponse.class); - if(esReponse.getError() != null){ + if (esReponse.getError() != null) { throw new Exception(esReponse.getError().getReason()); } for (String[] row : esReponse.getRows()) { - if(row.length == 3 && row[1].contains("TABLE") && row[2].equalsIgnoreCase("INDEX")){ - tables.add(row[0]); - } - if(row.length == 2 && row[1].contains("TABLE")){ - tables.add(row[0]); + if (row.length == 3 && row[1].contains("TABLE") && row[2].equalsIgnoreCase("INDEX")) { + TableDesc tableDesc = new TableDesc(); + tableDesc.setName(row[0]); + tables.add(tableDesc); + } + if (row.length == 2 && row[1].contains("TABLE")) { + TableDesc tableDesc = new TableDesc(); + tableDesc.setName(row[0]); + tables.add(tableDesc); } } return tables; @@ -219,36 +224,35 @@ public class EsProvider extends DatasourceProvider { } - @Override public void checkStatus(DatasourceRequest datasourceRequest) throws Exception { EsConfiguration esConfiguration = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), EsConfiguration.class); String response = exexGetQuery(datasourceRequest); - if(JSONObject.parseObject(response).getJSONObject("error") != null){ + if (JSONObject.parseObject(response).getJSONObject("error") != null) { throw new Exception(JSONObject.parseObject(response).getJSONObject("error").getString("reason")); } - String version = JSONObject.parseObject(response).getJSONObject("version").getString("number"); + String version = JSONObject.parseObject(response).getJSONObject("version").getString("number"); String[] versionList = version.split("\\."); - if(Integer.valueOf(versionList[0]) < 7 && Integer.valueOf(versionList[1]) < 3){ + if (Integer.valueOf(versionList[0]) < 7 && Integer.valueOf(versionList[1]) < 3) { throw new Exception(Translator.get("i18n_es_limit")); } - if(Integer.valueOf(versionList[0]) == 6 ) { + if (Integer.valueOf(versionList[0]) == 6) { esConfiguration.setUri("_xpack/sql"); } - if(Integer.valueOf(versionList[0]) == 7 ) { + if (Integer.valueOf(versionList[0]) == 7) { esConfiguration.setUri("_sql"); } datasourceRequest.getDatasource().setConfiguration(new Gson().toJson(esConfiguration)); getTables(datasourceRequest); } - private String exexQuery(DatasourceRequest datasourceRequest, String sql, String uri){ + private String exexQuery(DatasourceRequest datasourceRequest, String sql, String uri) { EsConfiguration esConfiguration = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), EsConfiguration.class); - uri = esConfiguration.getUri()+uri; + uri = esConfiguration.getUri() + uri; HttpClientConfig httpClientConfig = new HttpClientConfig(); - if(StringUtils.isNotEmpty(esConfiguration.getEsUsername()) && StringUtils.isNotEmpty(esConfiguration.getEsPassword())){ + if (StringUtils.isNotEmpty(esConfiguration.getEsUsername()) && StringUtils.isNotEmpty(esConfiguration.getEsPassword())) { String auth = esConfiguration.getEsUsername() + ":" + esConfiguration.getEsPassword(); byte[] encodedAuth = Base64.encodeBase64(auth.getBytes(StandardCharsets.UTF_8)); httpClientConfig.addHeader(HttpHeaders.AUTHORIZATION, "Basic " + new String(encodedAuth)); @@ -258,20 +262,20 @@ public class EsProvider extends DatasourceProvider { requst.setQuery(sql); requst.setFetch_size(datasourceRequest.getFetchSize()); String url = esConfiguration.getUrl().endsWith("/") ? esConfiguration.getUrl() + uri : esConfiguration.getUrl() + "/" + uri; - String response = HttpClientUtil.post(url, new Gson().toJson(requst), httpClientConfig); + String response = HttpClientUtil.post(url, new Gson().toJson(requst), httpClientConfig); return response; } - private String exexGetQuery(DatasourceRequest datasourceRequest){ + private String exexGetQuery(DatasourceRequest datasourceRequest) { EsConfiguration esConfiguration = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), EsConfiguration.class); HttpClientConfig httpClientConfig = new HttpClientConfig(); - if(StringUtils.isNotEmpty(esConfiguration.getEsUsername()) && StringUtils.isNotEmpty(esConfiguration.getEsPassword())){ + if (StringUtils.isNotEmpty(esConfiguration.getEsUsername()) && StringUtils.isNotEmpty(esConfiguration.getEsPassword())) { String auth = esConfiguration.getEsUsername() + ":" + esConfiguration.getEsPassword(); byte[] encodedAuth = Base64.encodeBase64(auth.getBytes(StandardCharsets.UTF_8)); httpClientConfig.addHeader(HttpHeaders.AUTHORIZATION, "Basic " + new String(encodedAuth)); } - String response = HttpClientUtil.get(esConfiguration.getUrl(), httpClientConfig); + String response = HttpClientUtil.get(esConfiguration.getUrl(), httpClientConfig); return response; } diff --git a/backend/src/main/java/io/dataease/provider/datasource/JdbcProvider.java b/backend/src/main/java/io/dataease/provider/datasource/JdbcProvider.java index 48a2af205f..5e558dd700 100644 --- a/backend/src/main/java/io/dataease/provider/datasource/JdbcProvider.java +++ b/backend/src/main/java/io/dataease/provider/datasource/JdbcProvider.java @@ -302,12 +302,12 @@ public class JdbcProvider extends DatasourceProvider { } @Override - public List getTables(DatasourceRequest datasourceRequest) throws Exception { - List tables = new ArrayList<>(); + public List getTables(DatasourceRequest datasourceRequest) throws Exception { + List tables = new ArrayList<>(); String queryStr = getTablesSql(datasourceRequest); try (Connection con = getConnectionFromPool(datasourceRequest); Statement statement = con.createStatement(); ResultSet resultSet = statement.executeQuery(queryStr)) { while (resultSet.next()) { - tables.add(resultSet.getString(1)); + tables.add(getTableDesc(datasourceRequest, resultSet)); } } catch (Exception e) { DataEaseException.throwException(e); @@ -317,7 +317,7 @@ public class JdbcProvider extends DatasourceProvider { if (queryView != null) { try (Connection con = getConnectionFromPool(datasourceRequest); Statement statement = con.createStatement(); ResultSet resultSet = statement.executeQuery(queryView)) { while (resultSet.next()) { - tables.add(resultSet.getString(1)); + tables.add(getTableDesc(datasourceRequest, resultSet)); } } catch (Exception e) { DataEaseException.throwException(e); @@ -327,6 +327,19 @@ public class JdbcProvider extends DatasourceProvider { return tables; } + private TableDesc getTableDesc(DatasourceRequest datasourceRequest, ResultSet resultSet) throws SQLException { + TableDesc tableDesc = new TableDesc(); + DatasourceTypes datasourceType = DatasourceTypes.valueOf(datasourceRequest.getDatasource().getType()); + if (datasourceType == DatasourceTypes.oracle) { + tableDesc.setRemark(resultSet.getString(3)); + } + if (datasourceType == DatasourceTypes.mysql) { + tableDesc.setRemark(resultSet.getString(2)); + } + tableDesc.setName(resultSet.getString(1)); + return tableDesc; + } + @Override public List getSchema(DatasourceRequest datasourceRequest) throws Exception { List schemas = new ArrayList<>(); @@ -583,6 +596,8 @@ public class JdbcProvider extends DatasourceProvider { switch (datasourceType) { case mysql: case mariadb: + JdbcConfiguration jdbcConfiguration = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), JdbcConfiguration.class); + return String.format("SELECT TABLE_NAME,TABLE_COMMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_SCHEMA = '%s' ;", jdbcConfiguration.getDataBase()); case de_doris: case ds_doris: case hive: @@ -600,7 +615,7 @@ public class JdbcProvider extends DatasourceProvider { if (StringUtils.isEmpty(oracleConfiguration.getSchema())) { throw new Exception(Translator.get("i18n_schema_is_empty")); } - return "select table_name, owner from all_tables where owner='" + oracleConfiguration.getSchema() + "'"; + return "select table_name, owner, comments from all_tab_comments where owner='" + oracleConfiguration.getSchema() + "' AND table_type = 'TABLE'"; case pg: PgConfiguration pgConfiguration = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), PgConfiguration.class); if (StringUtils.isEmpty(pgConfiguration.getSchema())) { @@ -649,7 +664,7 @@ public class JdbcProvider extends DatasourceProvider { if (StringUtils.isEmpty(oracleConfiguration.getSchema())) { throw new Exception(Translator.get("i18n_schema_is_empty")); } - return "select VIEW_NAME from all_views where owner='" + oracleConfiguration.getSchema() + "'"; + return "select table_name, owner, comments from all_tab_comments where owner='" + oracleConfiguration.getSchema() + "' AND table_type = 'VIEW'"; case pg: PgConfiguration pgConfiguration = new Gson().fromJson(datasourceRequest.getDatasource().getConfiguration(), PgConfiguration.class); if (StringUtils.isEmpty(pgConfiguration.getSchema())) { diff --git a/backend/src/main/java/io/dataease/service/datasource/DatasourceService.java b/backend/src/main/java/io/dataease/service/datasource/DatasourceService.java index e900d106bd..c709074ebf 100644 --- a/backend/src/main/java/io/dataease/service/datasource/DatasourceService.java +++ b/backend/src/main/java/io/dataease/service/datasource/DatasourceService.java @@ -193,22 +193,23 @@ public class DatasourceService { DatasourceRequest datasourceRequest = new DatasourceRequest(); datasourceRequest.setDatasource(ds); datasourceProvider.checkStatus(datasourceRequest); - List tables = datasourceProvider.getTables(datasourceRequest); + List tables = datasourceProvider.getTables(datasourceRequest); // 获取当前数据源下的db类型数据集 DatasetTableExample datasetTableExample = new DatasetTableExample(); datasetTableExample.createCriteria().andTypeEqualTo("db").andDataSourceIdEqualTo(datasource.getId()); List datasetTables = datasetTableMapper.selectByExampleWithBLOBs(datasetTableExample); List list = new ArrayList<>(); - for (String name : tables) { + for (TableDesc tableDesc : tables) { DBTableDTO dbTableDTO = new DBTableDTO(); dbTableDTO.setDatasourceId(datasource.getId()); - dbTableDTO.setName(name); + dbTableDTO.setName(tableDesc.getName()); + dbTableDTO.setRemark(tableDesc.getRemark()); dbTableDTO.setEnableCheck(true); dbTableDTO.setDatasetPath(null); for (DatasetTable datasetTable : datasetTables) { DataTableInfoDTO dataTableInfoDTO = new Gson().fromJson(datasetTable.getInfo(), DataTableInfoDTO.class); - if (StringUtils.equals(name, dataTableInfoDTO.getTable())) { + if (StringUtils.equals(tableDesc.getName(), dataTableInfoDTO.getTable())) { dbTableDTO.setEnableCheck(false); List parents = dataSetGroupService.getParents(datasetTable.getSceneId()); StringBuilder stringBuilder = new StringBuilder(); diff --git a/frontend/src/views/dataset/add/AddDB.vue b/frontend/src/views/dataset/add/AddDB.vue index ef82b31e8c..1a773e0d79 100644 --- a/frontend/src/views/dataset/add/AddDB.vue +++ b/frontend/src/views/dataset/add/AddDB.vue @@ -58,7 +58,7 @@ border :label="t.name" :disabled="!t.enableCheck" - /> + >{{ showTableNameWithComment(t) }} @@ -133,6 +133,13 @@ export default { this.kettleRunning = res.data }) }, + showTableNameWithComment(t) { + if (t.remark) { + return `${t.name}(${t.remark})` + } else { + return `${t.name}` + } + }, save() { let ds = {} this.options.forEach(ele => { From 9cd891556f13db205dbdfd4ba4c5ef4bbcfaf1ea Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Thu, 13 Jan 2022 17:28:25 +0800 Subject: [PATCH 02/10] =?UTF-8?q?feat:=20=E5=AE=9A=E6=97=B6=E6=8A=A5?= =?UTF-8?q?=E5=91=8A=E4=BD=BF=E7=94=A8=E4=BC=98=E5=85=88=E7=BA=A7=E7=BA=BF?= =?UTF-8?q?=E7=A8=8B=E6=B1=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base/mapper/ext/ExtTaskMapper.java | 9 ++ .../base/mapper/ext/ExtTaskMapper.xml | 13 ++ .../pool/PriorityThreadPoolExecutor.java | 113 ++++++++++++++++++ .../pool/PriorityThreadPoolProperties.java | 17 +++ .../java/io/dataease/config/AsyncConfig.java | 24 ++++ .../job/sechedule/ScheduleManager.java | 36 +++--- .../job/sechedule/strategy/TaskHandler.java | 44 ++++--- .../strategy/impl/EmailTaskHandler.java | 37 +++++- .../listener/GlobalTaskStartListener.java | 1 + .../plugins/server/XEmailTaskServer.java | 21 +++- 10 files changed, 269 insertions(+), 46 deletions(-) create mode 100644 backend/src/main/java/io/dataease/base/mapper/ext/ExtTaskMapper.java create mode 100644 backend/src/main/java/io/dataease/base/mapper/ext/ExtTaskMapper.xml create mode 100644 backend/src/main/java/io/dataease/commons/pool/PriorityThreadPoolExecutor.java create mode 100644 backend/src/main/java/io/dataease/commons/pool/PriorityThreadPoolProperties.java diff --git a/backend/src/main/java/io/dataease/base/mapper/ext/ExtTaskMapper.java b/backend/src/main/java/io/dataease/base/mapper/ext/ExtTaskMapper.java new file mode 100644 index 0000000000..efec50afcf --- /dev/null +++ b/backend/src/main/java/io/dataease/base/mapper/ext/ExtTaskMapper.java @@ -0,0 +1,9 @@ +package io.dataease.base.mapper.ext; + +public interface ExtTaskMapper { + + int runningCount(Long taskId); + + void resetRunnings(Long taskId); + +} diff --git a/backend/src/main/java/io/dataease/base/mapper/ext/ExtTaskMapper.xml b/backend/src/main/java/io/dataease/base/mapper/ext/ExtTaskMapper.xml new file mode 100644 index 0000000000..213d5ae488 --- /dev/null +++ b/backend/src/main/java/io/dataease/base/mapper/ext/ExtTaskMapper.xml @@ -0,0 +1,13 @@ + + + + + + + + update sys_task_instance set status = -1, info = 'System Interrupt Error' where task_id = #{taskId} and status = 0 + + + diff --git a/backend/src/main/java/io/dataease/commons/pool/PriorityThreadPoolExecutor.java b/backend/src/main/java/io/dataease/commons/pool/PriorityThreadPoolExecutor.java new file mode 100644 index 0000000000..d55d9e8a65 --- /dev/null +++ b/backend/src/main/java/io/dataease/commons/pool/PriorityThreadPoolExecutor.java @@ -0,0 +1,113 @@ +package io.dataease.commons.pool; + +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicLong; + +import io.dataease.commons.utils.LogUtil; + +public class PriorityThreadPoolExecutor extends ThreadPoolExecutor { + + public static AtomicInteger globaInteger = new AtomicInteger(1); + + private ThreadLocal local = new ThreadLocal() { + @Override + protected Integer initialValue() { + return 1; + } + }; + + public PriorityThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit) { + super(corePoolSize, maximumPoolSize, keepAliveTime, unit, getWorkQueue()); + } + + public PriorityThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, + ThreadFactory threadFactory) { + super(corePoolSize, maximumPoolSize, keepAliveTime, unit, getWorkQueue(), threadFactory); + } + + public PriorityThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, + RejectedExecutionHandler handler) { + super(corePoolSize, maximumPoolSize, keepAliveTime, unit, getWorkQueue(), handler); + } + + public PriorityThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, + ThreadFactory threadFactory, RejectedExecutionHandler handler) { + super(corePoolSize, maximumPoolSize, keepAliveTime, unit, getWorkQueue(), threadFactory, handler); + } + + protected static PriorityBlockingQueue getWorkQueue() { + return new PriorityBlockingQueue(); + } + + @Override + public void execute(Runnable command) { + int andIncrement = globaInteger.getAndIncrement(); + Integer theadInteger = local.get(); + try { + if (theadInteger == 0) { + this.execute(command, 0); + } else { + this.execute(command, andIncrement); + } + + } finally { + local.set(1); + } + } + + public void execute(Runnable command, int priority) { + super.execute(new PriorityRunnable(command, priority)); + } + + public Future submit(Callable task, int priority) { + local.set(priority); + return super.submit(task); + } + + protected static class PriorityRunnable> + implements Runnable, Comparable> { + private final static AtomicLong seq = new AtomicLong(); + private final long seqNum; + Runnable run; + private int priority; + + public PriorityRunnable(Runnable run, int priority) { + seqNum = seq.getAndIncrement(); + this.run = run; + this.priority = priority; + } + + public int getPriority() { + return priority; + } + + public void setPriority(int priority) { + this.priority = priority; + } + + public Runnable getRun() { + return run; + } + + @Override + public void run() { + LogUtil.info("number " + priority + " is starting..."); + this.run.run(); + } + + @Override + public int compareTo(PriorityRunnable other) { + int res = 0; + if (this.priority == other.priority) { + if (other.run != this.run) {// ASC + res = (seqNum < other.seqNum ? -1 : 1); + } + } else {// DESC + res = this.priority > other.priority ? 1 : -1; + } + return res; + } + } + +} diff --git a/backend/src/main/java/io/dataease/commons/pool/PriorityThreadPoolProperties.java b/backend/src/main/java/io/dataease/commons/pool/PriorityThreadPoolProperties.java new file mode 100644 index 0000000000..efb807ba86 --- /dev/null +++ b/backend/src/main/java/io/dataease/commons/pool/PriorityThreadPoolProperties.java @@ -0,0 +1,17 @@ +package io.dataease.commons.pool; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import lombok.Data; + +@ConfigurationProperties(prefix = "detask", ignoreInvalidFields = true) +@Data +@Component +public class PriorityThreadPoolProperties { + + private int corePoolSize = 2; + private int maximumPoolSize = 100; + private int keepAliveTime = 60; + +} diff --git a/backend/src/main/java/io/dataease/config/AsyncConfig.java b/backend/src/main/java/io/dataease/config/AsyncConfig.java index 22a88ef995..8a8786c294 100644 --- a/backend/src/main/java/io/dataease/config/AsyncConfig.java +++ b/backend/src/main/java/io/dataease/config/AsyncConfig.java @@ -1,15 +1,25 @@ package io.dataease.config; +import java.util.concurrent.TimeUnit; + +import javax.annotation.Resource; + import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.task.AsyncTaskExecutor; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import io.dataease.commons.pool.PriorityThreadPoolExecutor; +import io.dataease.commons.pool.PriorityThreadPoolProperties; + @EnableAsync(proxyTargetClass = true) @Configuration public class AsyncConfig { + @Resource + private PriorityThreadPoolProperties priorityThreadPoolProperties; + @Bean public AsyncTaskExecutor taskExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); @@ -18,4 +28,18 @@ public class AsyncConfig { executor.setMaxPoolSize(10); return executor; } + + @Bean + public PriorityThreadPoolExecutor priorityExecutor() { + int corePoolSize = priorityThreadPoolProperties.getCorePoolSize(); + + int maximumPoolSize = priorityThreadPoolProperties.getMaximumPoolSize(); + + int keepAliveTime = priorityThreadPoolProperties.getKeepAliveTime(); + + PriorityThreadPoolExecutor executor = new PriorityThreadPoolExecutor(corePoolSize, maximumPoolSize, + keepAliveTime, TimeUnit.SECONDS); + return executor; + } + } diff --git a/backend/src/main/java/io/dataease/job/sechedule/ScheduleManager.java b/backend/src/main/java/io/dataease/job/sechedule/ScheduleManager.java index c93e59e11c..3a41798e93 100644 --- a/backend/src/main/java/io/dataease/job/sechedule/ScheduleManager.java +++ b/backend/src/main/java/io/dataease/job/sechedule/ScheduleManager.java @@ -28,7 +28,7 @@ public class ScheduleManager { * @throws SchedulerException */ public void addSimpleJob(JobKey jobKey, TriggerKey triggerKey, Class cls, int repeatIntervalTime, - JobDataMap jobDataMap) throws SchedulerException { + JobDataMap jobDataMap) throws SchedulerException { JobBuilder jobBuilder = JobBuilder.newJob(cls).withIdentity(jobKey); @@ -46,7 +46,8 @@ public class ScheduleManager { scheduler.scheduleJob(jd, trigger); } - public void addSimpleJob(JobKey jobKey, TriggerKey triggerKey, Class cls, int repeatIntervalTime) throws SchedulerException { + public void addSimpleJob(JobKey jobKey, TriggerKey triggerKey, Class cls, int repeatIntervalTime) + throws SchedulerException { addSimpleJob(jobKey, triggerKey, cls, repeatIntervalTime); } @@ -59,7 +60,8 @@ public class ScheduleManager { * @param cron * @param jobDataMap */ - public void addCronJob(JobKey jobKey, TriggerKey triggerKey, Class jobClass, String cron, Date startTime, Date endTime, JobDataMap jobDataMap) { + public void addCronJob(JobKey jobKey, TriggerKey triggerKey, Class jobClass, String cron, Date startTime, + Date endTime, JobDataMap jobDataMap) { try { LogUtil.info("addCronJob: " + triggerKey.getName() + "," + triggerKey.getGroup()); @@ -99,7 +101,8 @@ public class ScheduleManager { } } - public void addCronJob(JobKey jobKey, TriggerKey triggerKey, Class jobClass, String cron, Date startTime, Date endTime) { + public void addCronJob(JobKey jobKey, TriggerKey triggerKey, Class jobClass, String cron, Date startTime, + Date endTime) { addCronJob(jobKey, triggerKey, jobClass, cron, startTime, endTime, null); } @@ -140,7 +143,8 @@ public class ScheduleManager { * @param cron * @throws SchedulerException */ - public void modifyCronJobTime(TriggerKey triggerKey, String cron, Date startTime, Date endTime) throws SchedulerException { + public void modifyCronJobTime(TriggerKey triggerKey, String cron, Date startTime, Date endTime) + throws SchedulerException { LogUtil.info("modifyCronJobTime: " + triggerKey.getName() + "," + triggerKey.getGroup()); @@ -151,7 +155,6 @@ public class ScheduleManager { return; } - /** 方式一 :调用 rescheduleJob 开始 */ TriggerBuilder triggerBuilder = TriggerBuilder.newTrigger();// 触发器 @@ -279,7 +282,6 @@ public class ScheduleManager { } } - public static void startJobs(Scheduler sched) { try { sched.start(); @@ -289,7 +291,6 @@ public class ScheduleManager { } } - public void shutdownJobs(Scheduler sched) { try { if (!sched.isShutdown()) { @@ -312,7 +313,7 @@ public class ScheduleManager { * @throws SchedulerException */ public void addOrUpdateSimpleJob(JobKey jobKey, TriggerKey triggerKey, Class clz, - int intervalTime, JobDataMap jobDataMap) throws SchedulerException { + int intervalTime, JobDataMap jobDataMap) throws SchedulerException { if (scheduler.checkExists(triggerKey)) { modifySimpleJobTime(triggerKey, intervalTime); @@ -323,7 +324,7 @@ public class ScheduleManager { } public void addOrUpdateSingleJob(JobKey jobKey, TriggerKey triggerKey, Class clz, - Date date, JobDataMap jobDataMap) throws SchedulerException { + Date date, JobDataMap jobDataMap) throws SchedulerException { if (scheduler.checkExists(triggerKey)) { modifySingleJobTime(triggerKey, date); } else { @@ -333,15 +334,15 @@ public class ScheduleManager { } public void addOrUpdateSingleJob(JobKey jobKey, TriggerKey triggerKey, Class clz, - Date date) throws SchedulerException { + Date date) throws SchedulerException { addOrUpdateSingleJob(jobKey, triggerKey, clz, date, null); } - public void addOrUpdateSimpleJob(JobKey jobKey, TriggerKey triggerKey, Class clz, int intervalTime) throws SchedulerException { + public void addOrUpdateSimpleJob(JobKey jobKey, TriggerKey triggerKey, Class clz, int intervalTime) + throws SchedulerException { addOrUpdateSimpleJob(jobKey, triggerKey, clz, intervalTime, null); } - /** * 添加或修改 cronJob * @@ -352,7 +353,8 @@ public class ScheduleManager { * @param jobDataMap * @throws SchedulerException */ - public void addOrUpdateCronJob(JobKey jobKey, TriggerKey triggerKey, Class jobClass, String cron, Date startTime, Date endTime, JobDataMap jobDataMap) throws SchedulerException { + public void addOrUpdateCronJob(JobKey jobKey, TriggerKey triggerKey, Class jobClass, String cron, Date startTime, + Date endTime, JobDataMap jobDataMap) throws SchedulerException { LogUtil.info("AddOrUpdateCronJob: " + jobKey.getName() + "," + triggerKey.getGroup()); @@ -363,7 +365,8 @@ public class ScheduleManager { } } - public void addOrUpdateCronJob(JobKey jobKey, TriggerKey triggerKey, Class jobClass, String cron, Date startTime, Date endTime) throws SchedulerException { + public void addOrUpdateCronJob(JobKey jobKey, TriggerKey triggerKey, Class jobClass, String cron, Date startTime, + Date endTime) throws SchedulerException { addOrUpdateCronJob(jobKey, triggerKey, jobClass, cron, startTime, endTime, null); } @@ -398,7 +401,8 @@ public class ScheduleManager { if (!CronExpression.isValidExpression(cron)) { DataEaseException.throwException("cron :" + cron + " error"); } - return TriggerBuilder.newTrigger().withIdentity("Calculate Date").withSchedule(CronScheduleBuilder.cronSchedule(cron)).build(); + return TriggerBuilder.newTrigger().withIdentity("Calculate Date") + .withSchedule(CronScheduleBuilder.cronSchedule(cron)).build(); } diff --git a/backend/src/main/java/io/dataease/job/sechedule/strategy/TaskHandler.java b/backend/src/main/java/io/dataease/job/sechedule/strategy/TaskHandler.java index c685930a17..87dff10bdf 100644 --- a/backend/src/main/java/io/dataease/job/sechedule/strategy/TaskHandler.java +++ b/backend/src/main/java/io/dataease/job/sechedule/strategy/TaskHandler.java @@ -13,9 +13,6 @@ import java.util.Date; public abstract class TaskHandler implements InitializingBean { - private static final String[] week = {"SUNDAY", "MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY"}; - - public void addTask(ScheduleManager scheduleManager, GlobalTaskEntity taskEntity) throws Exception { // 1。首先看看是否过期 Long endTime = taskEntity.getEndTime(); @@ -30,12 +27,11 @@ public abstract class TaskHandler implements InitializingBean { if (ObjectUtils.isNotEmpty(taskEntity.getEndTime())) { new Date(taskEntity.getEndTime()); } - Class executor = this.getClass(); + Class executor = this.getClass(); String cron = cron(taskEntity); scheduleManager.addOrUpdateCronJob(jobKey, triggerKey, executor, cron, start, end, jobDataMap(taskEntity)); } - protected abstract JobDataMap jobDataMap(GlobalTaskEntity taskEntity); private String cron(GlobalTaskEntity taskEntity) { @@ -54,36 +50,34 @@ public abstract class TaskHandler implements InitializingBean { instance.setTime(date); if (taskEntity.getRateType() == 0) { - return - instance.get(Calendar.SECOND) + " " + - instance.get(Calendar.MINUTE) + " " + - instance.get(Calendar.HOUR_OF_DAY) + " * * ?"; + return instance.get(Calendar.SECOND) + " " + + instance.get(Calendar.MINUTE) + " " + + instance.get(Calendar.HOUR_OF_DAY) + " * * ?"; } if (taskEntity.getRateType() == 1) { - return - instance.get(Calendar.SECOND) + " " + - instance.get(Calendar.MINUTE) + " " + - instance.get(Calendar.HOUR_OF_DAY) + " ? * " + - getDayOfWeek(instance); + return instance.get(Calendar.SECOND) + " " + + instance.get(Calendar.MINUTE) + " " + + instance.get(Calendar.HOUR_OF_DAY) + " ? * " + + getDayOfWeek(instance); } if (taskEntity.getRateType() == 2) { - return - instance.get(Calendar.SECOND) + " " + - instance.get(Calendar.MINUTE) + " " + - instance.get(Calendar.HOUR_OF_DAY) + " " + - instance.get(Calendar.DATE) + " * ?"; + return instance.get(Calendar.SECOND) + " " + + instance.get(Calendar.MINUTE) + " " + + instance.get(Calendar.HOUR_OF_DAY) + " " + + instance.get(Calendar.DATE) + " * ?"; } return null; } + public abstract void resetRunningInstance(Long taskId); + private String getDayOfWeek(Calendar instance) { int index = instance.get(Calendar.DAY_OF_WEEK); - index = (index + 1) % 7; + index = (index + 1) % 7; return String.valueOf(index); } - public void removeTask(ScheduleManager scheduleManager, GlobalTaskEntity taskEntity) { JobKey jobKey = new JobKey(taskEntity.getTaskId().toString()); TriggerKey triggerKey = new TriggerKey(taskEntity.getTaskId().toString()); @@ -95,14 +89,16 @@ public abstract class TaskHandler implements InitializingBean { scheduleManager.fireNow(jobKey); } - - //判断任务是否过期 + // 判断任务是否过期 public Boolean taskExpire(Long endTime) { - if (ObjectUtils.isEmpty(endTime)) return false; + if (ObjectUtils.isEmpty(endTime)) + return false; Long now = System.currentTimeMillis(); return now > endTime; } + protected abstract Boolean taskIsRunning(Long taskId); + @Override public void afterPropertiesSet() throws Exception { String beanName = null; diff --git a/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskHandler.java b/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskHandler.java index d84ba736de..12ba9352a2 100644 --- a/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskHandler.java +++ b/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskHandler.java @@ -5,6 +5,7 @@ import io.dataease.auth.entity.TokenInfo; import io.dataease.auth.service.AuthUserService; import io.dataease.auth.service.impl.AuthUserServiceImpl; import io.dataease.auth.util.JWTUtils; +import io.dataease.base.mapper.ext.ExtTaskMapper; import io.dataease.commons.utils.CommonBeanFactory; import io.dataease.commons.utils.LogUtil; import io.dataease.commons.utils.ServletUtils; @@ -20,6 +21,7 @@ import io.dataease.service.system.EmailService; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.quartz.*; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -46,6 +48,16 @@ public class EmailTaskHandler extends TaskHandler implements Job { return jobDataMap; } + public EmailTaskHandler proxy() { + return CommonBeanFactory.getBean(EmailTaskHandler.class); + } + + @Override + protected Boolean taskIsRunning(Long taskId) { + ExtTaskMapper extTaskMapper = CommonBeanFactory.getBean(ExtTaskMapper.class); + return extTaskMapper.runningCount(taskId) > 0; + } + @Override public void execute(JobExecutionContext context) throws JobExecutionException { // 插件没有加载 空转 @@ -54,11 +66,16 @@ public class EmailTaskHandler extends TaskHandler implements Job { JobDataMap jobDataMap = context.getJobDetail().getJobDataMap(); GlobalTaskEntity taskEntity = (GlobalTaskEntity) jobDataMap.get("taskEntity"); + ScheduleManager scheduleManager = SpringContextUtil.getBean(ScheduleManager.class); if (taskExpire(taskEntity.getEndTime())) { - ScheduleManager scheduleManager = SpringContextUtil.getBean(ScheduleManager.class); removeTask(scheduleManager, taskEntity); return; } + if (taskIsRunning(taskEntity.getTaskId())) { + LogUtil.info("Skip synchronization task: {} ,due to task status is {}", + taskEntity.getTaskId(), "running"); + return; + } GlobalTaskInstance taskInstance = buildInstance(taskEntity); Long instanceId = saveInstance(taskInstance); @@ -67,10 +84,15 @@ public class EmailTaskHandler extends TaskHandler implements Job { XpackEmailTemplateDTO emailTemplate = (XpackEmailTemplateDTO) jobDataMap.get("emailTemplate"); SysUserEntity creator = (SysUserEntity) jobDataMap.get("creator"); LogUtil.info("start execute send panel report task..."); - sendReport(taskInstance, emailTemplate, creator); + proxy().sendReport(taskInstance, emailTemplate, creator); } + @Override + public void resetRunningInstance(Long taskId) { + ExtTaskMapper extTaskMapper = CommonBeanFactory.getBean(ExtTaskMapper.class); + extTaskMapper.resetRunnings(taskId); + } public Long saveInstance(GlobalTaskInstance taskInstance) { EmailXpackService emailXpackService = SpringContextUtil.getBean(EmailXpackService.class); @@ -99,11 +121,12 @@ public class EmailTaskHandler extends TaskHandler implements Job { emailXpackService.saveInstance(taskInstance); } - + @Async("priorityExecutor") public void sendReport(GlobalTaskInstance taskInstance, XpackEmailTemplateDTO emailTemplateDTO, - SysUserEntity user) { + SysUserEntity user) { EmailXpackService emailXpackService = SpringContextUtil.getBean(EmailXpackService.class); try { + String panelId = emailTemplateDTO.getPanelId(); String url = panelUrl(panelId); String token = tokenByUser(user); @@ -116,11 +139,15 @@ public class EmailTaskHandler extends TaskHandler implements Job { String recipients = emailTemplateDTO.getRecipients(); byte[] content = emailTemplateDTO.getContent(); EmailService emailService = SpringContextUtil.getBean(EmailService.class); + String contentStr = ""; if (ObjectUtils.isNotEmpty(content)) { contentStr = new String(content, "UTF-8"); } - emailService.sendWithImage(recipients, emailTemplateDTO.getTitle(), contentStr, bytes); + emailService.sendWithImage(recipients, emailTemplateDTO.getTitle(), + contentStr, bytes); + + Thread.sleep(10000); success(taskInstance); } catch (Exception e) { error(taskInstance, e); diff --git a/backend/src/main/java/io/dataease/listener/GlobalTaskStartListener.java b/backend/src/main/java/io/dataease/listener/GlobalTaskStartListener.java index c7361ee93b..c8de41274a 100644 --- a/backend/src/main/java/io/dataease/listener/GlobalTaskStartListener.java +++ b/backend/src/main/java/io/dataease/listener/GlobalTaskStartListener.java @@ -32,6 +32,7 @@ public class GlobalTaskStartListener implements ApplicationListener { TaskHandler taskHandler = TaskStrategyFactory.getInvokeStrategy(task.getTaskType()); try { + taskHandler.resetRunningInstance(task.getTaskId()); taskHandler.addTask(scheduleManager, task); } catch (Exception e) { e.printStackTrace(); diff --git a/backend/src/main/java/io/dataease/plugins/server/XEmailTaskServer.java b/backend/src/main/java/io/dataease/plugins/server/XEmailTaskServer.java index 9ecd645704..fd8eb56a74 100644 --- a/backend/src/main/java/io/dataease/plugins/server/XEmailTaskServer.java +++ b/backend/src/main/java/io/dataease/plugins/server/XEmailTaskServer.java @@ -3,6 +3,7 @@ package io.dataease.plugins.server; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; import io.dataease.commons.exception.DEException; +import io.dataease.commons.pool.PriorityThreadPoolExecutor; import io.dataease.commons.utils.*; import io.dataease.plugins.common.entity.GlobalTaskEntity; import io.dataease.plugins.common.entity.GlobalTaskInstance; @@ -23,6 +24,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.List; +import java.util.concurrent.Future; + +import javax.annotation.Resource; @Api(tags = "xpack:定时报告") @RequestMapping("/plugin/task") @@ -32,6 +36,9 @@ public class XEmailTaskServer { @Autowired private ScheduleService scheduleService; + @Resource + private PriorityThreadPoolExecutor priorityExecutor; + @PostMapping("/queryTasks/{goPage}/{pageSize}") public Pager> queryTask(@PathVariable int goPage, @PathVariable int pageSize, @RequestBody XpackGridRequest request) { @@ -85,7 +92,19 @@ public class XEmailTaskServer { String token = ServletUtils.getToken(); String fileId = null; try { - fileId = emailXpackService.print(url, token, buildPixel(request.getPixel())); + Future future = priorityExecutor.submit(() -> { + try { + return emailXpackService.print(url, token, buildPixel(request.getPixel())); + } catch (Exception e) { + LogUtil.error(e.getMessage(), e); + DEException.throwException("预览失败,请联系管理员"); + } + return null; + }, 0); + Object object = future.get(); + if (ObjectUtils.isNotEmpty(object)) { + fileId = object.toString(); + } } catch (Exception e) { LogUtil.error(e.getMessage(), e); DEException.throwException("预览失败,请联系管理员"); From c287b41afbcde2604de53b1a7461f343bc340f34 Mon Sep 17 00:00:00 2001 From: wangjiahao <1522128093@qq.com> Date: Fri, 14 Jan 2022 10:57:36 +0800 Subject: [PATCH 03/10] =?UTF-8?q?refactor:=20=E7=BB=84=E4=BB=B6=E9=97=B4?= =?UTF-8?q?=E9=9A=99=E5=9C=A8=E6=9C=89=E8=83=8C=E6=99=AF=E9=A2=9C=E8=89=B2?= =?UTF-8?q?=E6=97=B6=E4=B9=9F=E4=BF=9D=E6=8C=81=E4=B8=80=E8=87=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/components/DeDrag/index.vue | 2 +- frontend/src/components/dataease/DeOutWidget.vue | 12 +++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/frontend/src/components/DeDrag/index.vue b/frontend/src/components/DeDrag/index.vue index 0c339f1b8f..8832a2c813 100644 --- a/frontend/src/components/DeDrag/index.vue +++ b/frontend/src/components/DeDrag/index.vue @@ -535,7 +535,7 @@ export default { return this.$store.state.curComponent }, curGap() { - return (this.canvasStyleData.panel.gap === 'yes' && this.element.auxiliaryMatrix && this.element.type !== 'custom') ? this.componentGap : 0 + return (this.canvasStyleData.panel.gap === 'yes' && this.element.auxiliaryMatrix) ? this.componentGap : 0 }, ...mapState([ 'editor', diff --git a/frontend/src/components/dataease/DeOutWidget.vue b/frontend/src/components/dataease/DeOutWidget.vue index 42ef2809cd..a749aaad05 100644 --- a/frontend/src/components/dataease/DeOutWidget.vue +++ b/frontend/src/components/dataease/DeOutWidget.vue @@ -161,12 +161,13 @@ export default {