diff --git a/core/backend/src/main/java/io/dataease/service/chart/ChartViewService.java b/core/backend/src/main/java/io/dataease/service/chart/ChartViewService.java index 24524c602e..be20810d78 100644 --- a/core/backend/src/main/java/io/dataease/service/chart/ChartViewService.java +++ b/core/backend/src/main/java/io/dataease/service/chart/ChartViewService.java @@ -341,7 +341,7 @@ public class ChartViewService { String[] dsHeader = null; Integer[] dsTypes = null; //downloadType = dataset 为下载原始名字 这里做数据转换模拟 table-info类型图表导出 - if("dataset".equals(request.getDownloadType())){ + if ("dataset".equals(request.getDownloadType())) { view.setType("table-info"); List sourceFields = dataSetTableFieldsService.getFieldsByTableId(view.getTableId()); dsHeader = sourceFields.stream() @@ -353,9 +353,9 @@ public class ChartViewService { view.setXAxis(JSONObject.toJSONString(sourceFields)); } ChartViewDTO result = calcData(view, request, request.isCache()); - if("dataset".equals(request.getDownloadType())){ - result.getData().put("header",dsHeader); - result.getData().put("dsTypes",dsTypes); + if ("dataset".equals(request.getDownloadType())) { + result.getData().put("header", dsHeader); + result.getData().put("dsTypes", dsTypes); } return result; } @@ -1107,11 +1107,15 @@ public class ChartViewService { if (Arrays.asList(ChartConstants.M_Y).contains(compareCalc.getType())) { if (StringUtils.equalsIgnoreCase(compareCalc.getField() + "", filterDTO.getFieldId())) { // -1 year - Calendar calendar = Calendar.getInstance(); - calendar.setTime(new Date(Long.parseLong(filterDTO.getValue().get(0)))); - calendar.add(Calendar.YEAR, -1); - filterDTO.getValue().set(0, String.valueOf(calendar.getTime().getTime())); - isYOY = true; + try { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(new Date(Long.parseLong(filterDTO.getValue().get(0)))); + calendar.add(Calendar.YEAR, -1); + filterDTO.getValue().set(0, String.valueOf(calendar.getTime().getTime())); + isYOY = true; + } catch (Exception e) { + + } } } } @@ -1146,9 +1150,11 @@ public class ChartViewService { datasourceRequest.setQuery(sql); data = datasourceProvider.getData(datasourceRequest); data = resultCustomSort(xAxis, data); - Map mapChart = pluginViewResult(pluginViewParam, view, data, isDrill); + // 请求正确的数据,然后取值 if (isYOY) { + // 如果有同环比,先走插件同环比计算逻辑 + data = pluginViewYOY(pluginViewParam, view, data); PluginViewParam yoyPluginViewParam = buildPluginParam(fieldMap, fieldCustomFilter, yoyFilterList, ds, table, view, rowPermissionsTree, chartExtRequest); String yoySql = pluginViewSql(yoyPluginViewParam, view); if (StringUtils.isBlank(yoySql)) { @@ -1177,6 +1183,7 @@ public class ChartViewService { data.clear(); data.addAll(resultData); } + Map mapChart = pluginViewResult(pluginViewParam, view, data, isDrill); Map mapTableNormal = ChartDataBuild.transTableNormal(fieldMap, view, data, desensitizationList); @@ -1832,7 +1839,7 @@ public class ChartViewService { return chartViewDTO; } - private List> forecastData(ChartSeniorForecastDTO forecastCfg, List data, List xAxis, List yAxis, ChartViewDTO view) throws ParseException { + private List> forecastData(ChartSeniorForecastDTO forecastCfg, List data, List xAxis, List yAxis, ChartViewDTO view) throws ParseException { List trainingData = data; if (!forecastCfg.isAllPeriod() && data.size() > forecastCfg.getTrainingPeriod()) { trainingData = data.subList(data.size() - forecastCfg.getTrainingPeriod(), data.size() - 1); @@ -1842,7 +1849,7 @@ public class ChartViewService { String lastTime = data.get(data.size() - 1)[0]; ChartViewFieldDTO timeAxis = xAxis.get(0); List forecastPeriod = DateUtils.getForecastPeriod(lastTime, forecastCfg.getPeriod(), timeAxis.getDateStyle(), timeAxis.getDatePattern()); - if(!forecastPeriod.isEmpty()){ + if (!forecastPeriod.isEmpty()) { ForecastAlgo algo = ForecastAlgoManager.getAlgo(forecastCfg.getAlgorithm()); List forecastData = algo.forecast(forecastCfg, trainingData, view); if (forecastPeriod.size() == forecastData.size()) { @@ -2000,6 +2007,11 @@ public class ChartViewService { return result; } + private List pluginViewYOY(PluginViewParam param, ChartViewDTO view, List args) { + ViewPluginService viewPluginService = getPluginService(view.getType()); + return viewPluginService.yoy(param, args); + } + private ChartViewDTO emptyChartViewDTO(ChartViewDTO view) { ChartViewDTO dto = new ChartViewDTO(); BeanUtils.copyBean(dto, view); diff --git a/core/frontend/src/lang/en.js b/core/frontend/src/lang/en.js index 4ee3d2d25c..bf4bc30232 100644 --- a/core/frontend/src/lang/en.js +++ b/core/frontend/src/lang/en.js @@ -1841,7 +1841,8 @@ export default { linear_regression: 'Linear regression', polynomial_regression: 'Polynomial regression', show_summary: 'Show summary', - summary_label: 'Summary label' + summary_label: 'Summary label', + tip: 'Tip' }, dataset: { scope_edit: 'Effective only when editing', diff --git a/core/frontend/src/lang/tw.js b/core/frontend/src/lang/tw.js index 485141a1db..15d6625205 100644 --- a/core/frontend/src/lang/tw.js +++ b/core/frontend/src/lang/tw.js @@ -1834,7 +1834,8 @@ export default { linear_regression: '線性回歸', polynomial_regression: '多項式擬合', show_summary: '顯示總計', - summary_label: '總計標籤' + summary_label: '總計標籤', + tip: '提示' }, dataset: { scope_edit: '僅編輯時生效', diff --git a/core/frontend/src/lang/zh.js b/core/frontend/src/lang/zh.js index c69cd4b868..c797519c0e 100644 --- a/core/frontend/src/lang/zh.js +++ b/core/frontend/src/lang/zh.js @@ -1831,7 +1831,8 @@ export default { linear_regression: '线性回归', polynomial_regression: '多项式拟合', show_summary: '显示总计', - summary_label: '总计标签' + summary_label: '总计标签', + tip: '提示' }, dataset: { goto: ', 前往 ', diff --git a/core/frontend/src/views/chart/components/compare/CompareEdit.vue b/core/frontend/src/views/chart/components/compare/CompareEdit.vue index 0b1be3b600..6217e41514 100644 --- a/core/frontend/src/views/chart/components/compare/CompareEdit.vue +++ b/core/frontend/src/views/chart/components/compare/CompareEdit.vue @@ -50,6 +50,12 @@ class="exp-style" >(本期数据 / |上期数据| - 1) * 100% + + + 当对比日期需要过滤时,请使用过滤组件实现过滤;使用视图过滤器,仪表板下钻和联动等功能,会导致结果不一致 + diff --git a/extensions/dataease-extensions-view/view-chartmix/view-chartmix-backend/src/main/java/io/dataease/plugins/view/official/impl/ChartMixService.java b/extensions/dataease-extensions-view/view-chartmix/view-chartmix-backend/src/main/java/io/dataease/plugins/view/official/impl/ChartMixService.java index 22a60d2a62..d7e7950b4e 100644 --- a/extensions/dataease-extensions-view/view-chartmix/view-chartmix-backend/src/main/java/io/dataease/plugins/view/official/impl/ChartMixService.java +++ b/extensions/dataease-extensions-view/view-chartmix/view-chartmix-backend/src/main/java/io/dataease/plugins/view/official/impl/ChartMixService.java @@ -118,9 +118,8 @@ public class ChartMixService extends ViewPluginService { } - @Override - public Map formatResult(PluginViewParam pluginViewParam, List data, Boolean isDrill) { + public List yoy(PluginViewParam pluginViewParam, List data) { List xAxis = new ArrayList<>(); List yAxis = new ArrayList<>(); @@ -133,17 +132,7 @@ public class ChartMixService extends ViewPluginService { yAxis.add(pluginViewField); } }); - Map map = new HashMap<>(); - List series = format(pluginViewParam.getPluginViewLimit().getType(), data, xAxis, yAxis); - - map.put("data", series); - - - return map; - } - - private List format(String type, List data, List xAxis, List yAxis) { // 同比/环比计算 // 调整data数据 for (int i = 0; i < yAxis.size(); i++) { @@ -247,9 +236,35 @@ public class ChartMixService extends ViewPluginService { } } - // 同比/环比计算 over + return data; + } + @Override + public Map formatResult(PluginViewParam pluginViewParam, List data, Boolean isDrill) { + List xAxis = new ArrayList<>(); + List yAxis = new ArrayList<>(); + + + pluginViewParam.getPluginViewFields().forEach(pluginViewField -> { + if (StringUtils.equals(pluginViewField.getTypeField(), "xAxis")) { + xAxis.add(pluginViewField); + } + if (StringUtils.equals(pluginViewField.getTypeField(), "yAxis")) { + yAxis.add(pluginViewField); + } + }); + Map map = new HashMap<>(); + + List series = format(pluginViewParam.getPluginViewLimit().getType(), data, xAxis, yAxis); + + map.put("data", series); + + + return map; + } + + private List format(String type, List data, List xAxis, List yAxis) { List series = new ArrayList<>(); for (PluginViewField y : yAxis) { PluginSeries series1 = new PluginSeries(); diff --git a/sdk/dataease-plugin-view/src/main/java/io/dataease/plugins/view/handler/PluginViewYOYHandler.java b/sdk/dataease-plugin-view/src/main/java/io/dataease/plugins/view/handler/PluginViewYOYHandler.java new file mode 100644 index 0000000000..36341e76fe --- /dev/null +++ b/sdk/dataease-plugin-view/src/main/java/io/dataease/plugins/view/handler/PluginViewYOYHandler.java @@ -0,0 +1,12 @@ +package io.dataease.plugins.view.handler; + +import io.dataease.plugins.view.entity.PluginViewParam; + +import java.util.List; + +/** + * @Author Junjun + */ +public interface PluginViewYOYHandler { + List yoy(PluginViewParam pluginViewParam, List data); +} diff --git a/sdk/dataease-plugin-view/src/main/java/io/dataease/plugins/view/handler/impl/DefaultViewYOYHandler.java b/sdk/dataease-plugin-view/src/main/java/io/dataease/plugins/view/handler/impl/DefaultViewYOYHandler.java new file mode 100644 index 0000000000..e54563c113 --- /dev/null +++ b/sdk/dataease-plugin-view/src/main/java/io/dataease/plugins/view/handler/impl/DefaultViewYOYHandler.java @@ -0,0 +1,16 @@ +package io.dataease.plugins.view.handler.impl; + +import io.dataease.plugins.view.entity.PluginViewParam; +import io.dataease.plugins.view.handler.PluginViewYOYHandler; + +import java.util.List; + +/** + * @Author Junjun + */ +public class DefaultViewYOYHandler implements PluginViewYOYHandler { + @Override + public List yoy(PluginViewParam pluginViewParam, List data) { + return data; + } +} diff --git a/sdk/dataease-plugin-view/src/main/java/io/dataease/plugins/view/service/ViewPluginService.java b/sdk/dataease-plugin-view/src/main/java/io/dataease/plugins/view/service/ViewPluginService.java index 06740ec3c4..599a97a958 100644 --- a/sdk/dataease-plugin-view/src/main/java/io/dataease/plugins/view/service/ViewPluginService.java +++ b/sdk/dataease-plugin-view/src/main/java/io/dataease/plugins/view/service/ViewPluginService.java @@ -6,8 +6,11 @@ import io.dataease.plugins.view.entity.PluginViewParam; import io.dataease.plugins.view.entity.PluginViewType; import io.dataease.plugins.view.handler.PluginViewRSHandler; import io.dataease.plugins.view.handler.PluginViewStatHandler; +import io.dataease.plugins.view.handler.PluginViewYOYHandler; import io.dataease.plugins.view.handler.impl.DefaultViewRSHandler; import io.dataease.plugins.view.handler.impl.DefaultViewStatHandler; +import io.dataease.plugins.view.handler.impl.DefaultViewYOYHandler; + import java.util.List; import java.util.Map; @@ -20,6 +23,8 @@ public abstract class ViewPluginService extends PluginComponentService { private PluginViewRSHandler rsHandler; + private PluginViewYOYHandler yoyHandler; + public abstract PluginViewType viewType(); @@ -35,11 +40,16 @@ public abstract class ViewPluginService extends PluginComponentService { return rsHandler.format(param, lists, isDrill); } + public List yoy(PluginViewParam param, List lists) { + yoyHandler = new DefaultViewYOYHandler(); + return yoyHandler.yoy(param, lists); + } + public ViewPluginBaseService getBaseService() { return viewPluginBaseService; } public ViewPluginService() { - this.viewPluginBaseService = (ViewPluginBaseService)PluginSpringContextUtil.getBean("viewPluginBaseServiceImpl"); + this.viewPluginBaseService = (ViewPluginBaseService) PluginSpringContextUtil.getBean("viewPluginBaseServiceImpl"); } }