diff --git a/.typos.toml b/.typos.toml index a8df7036c2..224a0de64e 100644 --- a/.typos.toml +++ b/.typos.toml @@ -12,6 +12,10 @@ Wheres = "Wheres" Parenthesed = "Parenthesed" pogress = "pogress" Pogress = "Pogress" +yoy = "yoy" +YOY = "YOY" +Leafs = "Leafs" +leafs = "leafs" [files] extend-exclude = [ diff --git a/core/backend/src/main/java/io/dataease/provider/engine/doris/DorisQueryProvider.java b/core/backend/src/main/java/io/dataease/provider/engine/doris/DorisQueryProvider.java index 7b22212f9c..ac5055635b 100644 --- a/core/backend/src/main/java/io/dataease/provider/engine/doris/DorisQueryProvider.java +++ b/core/backend/src/main/java/io/dataease/provider/engine/doris/DorisQueryProvider.java @@ -1094,7 +1094,7 @@ public class DorisQueryProvider extends QueryProvider { whereValue = "''"; } else if (StringUtils.equalsIgnoreCase(item.getTerm(), "in")) { whereValue = "('" + StringUtils.join(value, "','") + "')"; - } else if (StringUtils.equalsIgnoreCase(item.getTerm(), "like")) { + } else if (StringUtils.containsIgnoreCase(item.getTerm(), "like")) { whereValue = "'%" + value + "%'"; } else if (StringUtils.equalsIgnoreCase(item.getTerm(), "begin_with")) { whereValue = "'" + value + "%'"; @@ -1173,7 +1173,7 @@ public class DorisQueryProvider extends QueryProvider { whereValue = "''"; } else if (StringUtils.equalsIgnoreCase(item.getTerm(), "in")) { whereValue = "('" + StringUtils.join(value, "','") + "')"; - } else if (StringUtils.equalsIgnoreCase(item.getTerm(), "like")) { + } else if (StringUtils.containsIgnoreCase(item.getTerm(), "like")) { whereValue = "'%" + value + "%'"; } else if (StringUtils.equalsIgnoreCase(item.getTerm(), "begin_with")) { whereValue = "'" + value + "%'"; diff --git a/core/backend/src/main/java/io/dataease/provider/engine/mysql/MysqlQueryProvider.java b/core/backend/src/main/java/io/dataease/provider/engine/mysql/MysqlQueryProvider.java index 50e6864457..6638f06f5c 100644 --- a/core/backend/src/main/java/io/dataease/provider/engine/mysql/MysqlQueryProvider.java +++ b/core/backend/src/main/java/io/dataease/provider/engine/mysql/MysqlQueryProvider.java @@ -1040,7 +1040,7 @@ public class MysqlQueryProvider extends QueryProvider { whereValue = "''"; } else if (StringUtils.equalsIgnoreCase(item.getTerm(), "in")) { whereValue = "('" + StringUtils.join(value, "','") + "')"; - } else if (StringUtils.equalsIgnoreCase(item.getTerm(), "like")) { + } else if (StringUtils.containsIgnoreCase(item.getTerm(), "like")) { whereValue = "'%" + value + "%'"; } else if (StringUtils.equalsIgnoreCase(item.getTerm(), "begin_with")) { whereValue = "'" + value + "%'"; @@ -1119,7 +1119,7 @@ public class MysqlQueryProvider extends QueryProvider { whereValue = "''"; } else if (StringUtils.equalsIgnoreCase(item.getTerm(), "in")) { whereValue = "('" + StringUtils.join(value, "','") + "')"; - } else if (StringUtils.equalsIgnoreCase(item.getTerm(), "like")) { + } else if (StringUtils.containsIgnoreCase(item.getTerm(), "like")) { whereValue = "'%" + value + "%'"; } else if (StringUtils.equalsIgnoreCase(item.getTerm(), "begin_with")) { whereValue = "'" + value + "%'"; diff --git a/core/backend/src/main/java/io/dataease/provider/query/ck/CKQueryProvider.java b/core/backend/src/main/java/io/dataease/provider/query/ck/CKQueryProvider.java index f7cd5d8111..a0e0c1acd1 100644 --- a/core/backend/src/main/java/io/dataease/provider/query/ck/CKQueryProvider.java +++ b/core/backend/src/main/java/io/dataease/provider/query/ck/CKQueryProvider.java @@ -1090,7 +1090,7 @@ public class CKQueryProvider extends QueryProvider { whereValue = "''"; } else if (StringUtils.equalsIgnoreCase(item.getTerm(), "in")) { whereValue = "('" + StringUtils.join(value, "','") + "')"; - } else if (StringUtils.equalsIgnoreCase(item.getTerm(), "like")) { + } else if (StringUtils.containsIgnoreCase(item.getTerm(), "like")) { whereValue = "'%" + value + "%'"; } else if (StringUtils.equalsIgnoreCase(item.getTerm(), "begin_with")) { whereValue = "'" + value + "%'"; @@ -1186,7 +1186,7 @@ public class CKQueryProvider extends QueryProvider { whereValue = "''"; } else if (StringUtils.equalsIgnoreCase(item.getTerm(), "in")) { whereValue = "('" + StringUtils.join(value, "','") + "')"; - } else if (StringUtils.equalsIgnoreCase(item.getTerm(), "like")) { + } else if (StringUtils.containsIgnoreCase(item.getTerm(), "like")) { whereValue = "'%" + value + "%'"; } else if (StringUtils.equalsIgnoreCase(item.getTerm(), "begin_with")) { whereValue = "'" + value + "%'"; diff --git a/core/backend/src/main/java/io/dataease/service/chart/util/ChartDataBuild.java b/core/backend/src/main/java/io/dataease/service/chart/util/ChartDataBuild.java index 28f1fc450f..1a9037c5cf 100644 --- a/core/backend/src/main/java/io/dataease/service/chart/util/ChartDataBuild.java +++ b/core/backend/src/main/java/io/dataease/service/chart/util/ChartDataBuild.java @@ -1,7 +1,11 @@ package io.dataease.service.chart.util; +import io.dataease.auth.api.dto.CurrentUserDto; +import io.dataease.commons.utils.AuthUtils; import io.dataease.controller.request.chart.ChartDrillRequest; import io.dataease.dto.chart.*; +import io.dataease.i18n.Lang; +import io.dataease.i18n.Translator; import io.dataease.plugins.common.base.domain.ChartViewWithBLOBs; import io.dataease.plugins.common.dto.chart.ChartViewFieldDTO; import io.dataease.plugins.xpack.auth.dto.request.ColumnPermissionItem; @@ -1390,20 +1394,24 @@ public class ChartDataBuild { values.add(row[xAxis.size() - 2]); values.add(row[xAxis.size() - 1]); obj.put("values", values); + Date date1 = null, date2 = null; try { - Date date = sdf.parse(row[xAxis.size() - 2]); - if (date != null) { - dates.add(date); + date1 = sdf.parse(row[xAxis.size() - 2]); + if (date1 != null) { + dates.add(date1); } } catch (Exception ignore) { } try { - Date date = sdf.parse(row[xAxis.size() - 1]); - if (date != null) { - dates.add(date); + date2 = sdf.parse(row[xAxis.size() - 1]); + if (date2 != null) { + dates.add(date2); } } catch (Exception ignore) { } + //间隔时间 + obj.put("gap", getTimeGap(date1, date2, xAxis1.getDateStyle())); + } else { values.add(new BigDecimal(row[xAxis.size() - 2])); values.add(new BigDecimal(row[xAxis.size() - 1])); @@ -1411,6 +1419,9 @@ public class ChartDataBuild { numbers.add(new BigDecimal(row[xAxis.size() - 2])); numbers.add(new BigDecimal(row[xAxis.size() - 1])); + + //间隔差 + obj.put("gap", new BigDecimal(row[xAxis.size() - 1]).subtract(new BigDecimal(row[xAxis.size() - 2]))); } dataList.add(obj); @@ -1436,6 +1447,114 @@ public class ChartDataBuild { } + private static String getTimeGap(Date from, Date to, String dateStyle) { + if (from == null || to == null) { + return ""; + } + Calendar fromCalender = Calendar.getInstance(); + fromCalender.setTime(from); + + Calendar toCalender = Calendar.getInstance(); + toCalender.setTime(to); + + long yearGap = 0; + long monthGap = 0; + long dayGap = (toCalender.getTimeInMillis() - fromCalender.getTimeInMillis()) / (1000 * 3600 * 24); + long hourGap = ((toCalender.getTimeInMillis() - fromCalender.getTimeInMillis()) / (1000 * 3600)) % 24; + long minuteGap = ((toCalender.getTimeInMillis() - fromCalender.getTimeInMillis()) / (1000 * 60)) % 60; + long secondGap = ((toCalender.getTimeInMillis() - fromCalender.getTimeInMillis()) / 1000) % 60; + + CurrentUserDto user = AuthUtils.getUser(); + String language = null; + if (user != null) { + language = user.getLanguage(); + } + Lang lang = Lang.getLangWithoutDefault(language); + boolean isEnUs = Lang.en_US.equals(lang); + String splitter = isEnUs ? " " : ""; + + String yearGapStr = ""; + String monthGapStr = ""; + + String dayGapStr = ""; + if (dayGap != 0) { + dayGapStr = dayGap + splitter + Translator.get("i18n_day") + (isEnUs && dayGap != 1 ? "s" : ""); + } + String hourGapStr = ""; + if (hourGap != 0) { + hourGapStr = hourGap + splitter + Translator.get("i18n_hour") + (isEnUs && hourGap != 1 ? "s" : ""); + } + String minuteGapStr = ""; + if (minuteGap != 0) { + minuteGapStr = minuteGap + splitter + Translator.get("i18n_minute") + (isEnUs && minuteGap != 1 ? "s" : ""); + } + String secondGapStr = ""; + if (secondGap != 0) { + secondGapStr = secondGap + splitter + Translator.get("i18n_second") + (isEnUs && secondGap != 1 ? "s" : ""); + } + + List list = new ArrayList<>(); + + switch (dateStyle) { + case "y": + yearGap = toCalender.get(Calendar.YEAR) - fromCalender.get(Calendar.YEAR); + yearGapStr = yearGap == 0 ? "" : (yearGap + splitter + Translator.get("i18n_year") + (isEnUs && yearGap != 1 ? "s" : "")); + return yearGapStr; + case "y_M": + yearGap = ((toCalender.get(Calendar.YEAR) - fromCalender.get(Calendar.YEAR)) * 12L + (toCalender.get(Calendar.MONTH) - fromCalender.get(Calendar.MONTH))) / 12; + monthGap = ((toCalender.get(Calendar.YEAR) - fromCalender.get(Calendar.YEAR)) * 12L + (toCalender.get(Calendar.MONTH) - fromCalender.get(Calendar.MONTH))) % 12; + + yearGapStr = yearGap == 0 ? "" : (yearGap + splitter + Translator.get("i18n_year") + (isEnUs && yearGap != 1 ? "s" : "")); + monthGapStr = monthGap == 0 ? "" : (monthGap + splitter + Translator.get("i18n_month") + (isEnUs && monthGap != 1 ? "s" : "")); + + if (!yearGapStr.isEmpty()) { + list.add(yearGapStr); + } + if (!monthGapStr.isEmpty()) { + list.add(monthGapStr); + } + return StringUtils.join(list, splitter); + case "y_M_d": + return dayGapStr; + case "y_M_d_H": + if (!dayGapStr.isEmpty()) { + list.add(dayGapStr); + } + if (!hourGapStr.isEmpty()) { + list.add(hourGapStr); + } + return StringUtils.join(list, splitter); + case "y_M_d_H_m": + if (!dayGapStr.isEmpty()) { + list.add(dayGapStr); + } + if (!hourGapStr.isEmpty()) { + list.add(hourGapStr); + } + if (!minuteGapStr.isEmpty()) { + list.add(minuteGapStr); + } + return StringUtils.join(list, splitter); + case "H_m_s": + case "y_M_d_H_m_s": + if (!dayGapStr.isEmpty()) { + list.add(dayGapStr); + } + if (!hourGapStr.isEmpty()) { + list.add(hourGapStr); + } + if (!minuteGapStr.isEmpty()) { + list.add(minuteGapStr); + } + if (!secondGapStr.isEmpty()) { + list.add(secondGapStr); + } + return StringUtils.join(list, splitter); + default: + return ""; + } + } + public static Map transBidirectionalBarData(List xAxis, List yAxis, ChartViewDTO view, List data, boolean isDrill) { Map map = new HashMap<>(); diff --git a/core/backend/src/main/java/io/dataease/service/datafill/DataFillDataService.java b/core/backend/src/main/java/io/dataease/service/datafill/DataFillDataService.java index e19a4c9a8f..4146af01ff 100644 --- a/core/backend/src/main/java/io/dataease/service/datafill/DataFillDataService.java +++ b/core/backend/src/main/java/io/dataease/service/datafill/DataFillDataService.java @@ -715,7 +715,7 @@ public class DataFillDataService { if (StringUtils.equalsIgnoreCase(field.getType(), "checkbox") || StringUtils.equalsIgnoreCase(field.getType(), "select") && field.getSettings().isMultiple()) { List list = new ArrayList<>(); - String[] strArr = excelRowData.split(","); + String[] strArr = excelRowData.split(";"); for (String str : strArr) { if (StringUtils.isNotBlank(str)) { list.add(str); diff --git a/core/backend/src/main/resources/i18n/messages_en_US.properties b/core/backend/src/main/resources/i18n/messages_en_US.properties index 466514f092..12654fe7d6 100644 --- a/core/backend/src/main/resources/i18n/messages_en_US.properties +++ b/core/backend/src/main/resources/i18n/messages_en_US.properties @@ -292,3 +292,9 @@ i18n_field_circular_ref=Field has Circular Reference \u8868\u5355\u7BA1\u7406=From Manage \u6211\u7684\u586B\u62A5=My Job \u8868\u5355\u521B\u5EFA=Form Create +i18n_year=Year +i18n_month=Month +i18n_day=Day +i18n_hour=Hour +i18n_minute=Minute +i18n_second=Second \ No newline at end of file diff --git a/core/backend/src/main/resources/i18n/messages_zh_CN.properties b/core/backend/src/main/resources/i18n/messages_zh_CN.properties index 2111f2f73e..ff7b9e6490 100644 --- a/core/backend/src/main/resources/i18n/messages_zh_CN.properties +++ b/core/backend/src/main/resources/i18n/messages_zh_CN.properties @@ -282,3 +282,9 @@ i18n_field_circular_ref=\u5B57\u6BB5\u5B58\u5728\u5FAA\u73AF\u5F15\u7528 \u8868\u5355\u7BA1\u7406=\u8868\u5355\u7BA1\u7406 \u6211\u7684\u586B\u62A5=\u6211\u7684\u586B\u62A5 \u8868\u5355\u521B\u5EFA=\u8868\u5355\u521B\u5EFA +i18n_year=\u5E74 +i18n_month=\u6708 +i18n_day=\u5929 +i18n_hour=\u5C0F\u65F6 +i18n_minute=\u5206\u949F +i18n_second=\u79D2 \ No newline at end of file diff --git a/core/backend/src/main/resources/i18n/messages_zh_TW.properties b/core/backend/src/main/resources/i18n/messages_zh_TW.properties index 9c7aebdfa4..d2eeab8433 100644 --- a/core/backend/src/main/resources/i18n/messages_zh_TW.properties +++ b/core/backend/src/main/resources/i18n/messages_zh_TW.properties @@ -287,3 +287,9 @@ i18n_field_circular_ref=\u5B57\u6BB5\u5B58\u5728\u5FAA\u74B0\u5F15\u7528 \u8868\u5355\u7BA1\u7406=\u8868\u55AE\u7BA1\u7406 \u6211\u7684\u586B\u62A5=\u6211\u7684\u586B\u5831 \u8868\u5355\u521B\u5EFA=\u8868\u55AE\u5275\u5EFA +i18n_year=\u5E74 +i18n_month=\u6708 +i18n_day=\u5929 +i18n_hour=\u5C0F\u6642 +i18n_minute=\u5206\u9418 +i18n_second=\u79D2 \ No newline at end of file diff --git a/core/frontend/src/api/dataset/dataset.js b/core/frontend/src/api/dataset/dataset.js index 6a74a4eb22..52904932f9 100644 --- a/core/frontend/src/api/dataset/dataset.js +++ b/core/frontend/src/api/dataset/dataset.js @@ -289,7 +289,7 @@ export function exportDataset(data) { url: 'dataset/table/exportDataset', method: 'post', data: data, - loading: true, + loading: true }) } diff --git a/core/frontend/src/components/canvas/DeCanvas.vue b/core/frontend/src/components/canvas/DeCanvas.vue index e5a3a65bdd..61e3370276 100644 --- a/core/frontend/src/components/canvas/DeCanvas.vue +++ b/core/frontend/src/components/canvas/DeCanvas.vue @@ -93,7 +93,6 @@ diff --git a/core/frontend/src/components/widget/deWidget/TabStyle.vue b/core/frontend/src/components/widget/deWidget/TabStyle.vue index db1e25ce23..c80b5f73d3 100644 --- a/core/frontend/src/components/widget/deWidget/TabStyle.vue +++ b/core/frontend/src/components/widget/deWidget/TabStyle.vue @@ -14,7 +14,12 @@ label="选项卡标题" prop="titleShow" > - 隐藏 + + 隐藏 + - - +} + - \ No newline at end of file diff --git a/core/frontend/src/layout/components/Topbar.vue b/core/frontend/src/layout/components/Topbar.vue index 57bbb690f1..60349c50a3 100644 --- a/core/frontend/src/layout/components/Topbar.vue +++ b/core/frontend/src/layout/components/Topbar.vue @@ -47,8 +47,8 @@ >
- + - + { state.arrowSide = arrowSide - }, + } } const actions = { diff --git a/core/frontend/src/utils/index.js b/core/frontend/src/utils/index.js index 6a01dce9e8..29fa97da2c 100644 --- a/core/frontend/src/utils/index.js +++ b/core/frontend/src/utils/index.js @@ -11,7 +11,7 @@ export function timeSection(date, type, labelFormat = 'yyyy-MM-dd') { return null } if (typeof date === 'string') { - date = parseInt(date); + date = parseInt(date) } if (!(date instanceof Date)) { date = new Date(date) diff --git a/core/frontend/src/views/background/index.vue b/core/frontend/src/views/background/index.vue index 80ffb48e98..bd8b82f583 100644 --- a/core/frontend/src/views/background/index.vue +++ b/core/frontend/src/views/background/index.vue @@ -236,74 +236,74 @@ -