refactor(视图): 优化同环比日期字段过滤逻辑

This commit is contained in:
junjun 2024-06-17 17:30:48 +08:00
parent 4ff059eb70
commit 5344ed3b17
9 changed files with 103 additions and 29 deletions

View File

@ -341,7 +341,7 @@ public class ChartViewService {
String[] dsHeader = null; String[] dsHeader = null;
Integer[] dsTypes = null; Integer[] dsTypes = null;
//downloadType = dataset 为下载原始名字 这里做数据转换模拟 table-info类型图表导出 //downloadType = dataset 为下载原始名字 这里做数据转换模拟 table-info类型图表导出
if("dataset".equals(request.getDownloadType())){ if ("dataset".equals(request.getDownloadType())) {
view.setType("table-info"); view.setType("table-info");
List<DatasetTableField> sourceFields = dataSetTableFieldsService.getFieldsByTableId(view.getTableId()); List<DatasetTableField> sourceFields = dataSetTableFieldsService.getFieldsByTableId(view.getTableId());
dsHeader = sourceFields.stream() dsHeader = sourceFields.stream()
@ -353,9 +353,9 @@ public class ChartViewService {
view.setXAxis(JSONObject.toJSONString(sourceFields)); view.setXAxis(JSONObject.toJSONString(sourceFields));
} }
ChartViewDTO result = calcData(view, request, request.isCache()); ChartViewDTO result = calcData(view, request, request.isCache());
if("dataset".equals(request.getDownloadType())){ if ("dataset".equals(request.getDownloadType())) {
result.getData().put("header",dsHeader); result.getData().put("header", dsHeader);
result.getData().put("dsTypes",dsTypes); result.getData().put("dsTypes", dsTypes);
} }
return result; return result;
} }
@ -1107,11 +1107,15 @@ public class ChartViewService {
if (Arrays.asList(ChartConstants.M_Y).contains(compareCalc.getType())) { if (Arrays.asList(ChartConstants.M_Y).contains(compareCalc.getType())) {
if (StringUtils.equalsIgnoreCase(compareCalc.getField() + "", filterDTO.getFieldId())) { if (StringUtils.equalsIgnoreCase(compareCalc.getField() + "", filterDTO.getFieldId())) {
// -1 year // -1 year
Calendar calendar = Calendar.getInstance(); try {
calendar.setTime(new Date(Long.parseLong(filterDTO.getValue().get(0)))); Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.YEAR, -1); calendar.setTime(new Date(Long.parseLong(filterDTO.getValue().get(0))));
filterDTO.getValue().set(0, String.valueOf(calendar.getTime().getTime())); calendar.add(Calendar.YEAR, -1);
isYOY = true; filterDTO.getValue().set(0, String.valueOf(calendar.getTime().getTime()));
isYOY = true;
} catch (Exception e) {
}
} }
} }
} }
@ -1146,9 +1150,11 @@ public class ChartViewService {
datasourceRequest.setQuery(sql); datasourceRequest.setQuery(sql);
data = datasourceProvider.getData(datasourceRequest); data = datasourceProvider.getData(datasourceRequest);
data = resultCustomSort(xAxis, data); data = resultCustomSort(xAxis, data);
Map<String, Object> mapChart = pluginViewResult(pluginViewParam, view, data, isDrill);
// 请求正确的数据然后取值 // 请求正确的数据然后取值
if (isYOY) { if (isYOY) {
// 如果有同环比先走插件同环比计算逻辑
data = pluginViewYOY(pluginViewParam, view, data);
PluginViewParam yoyPluginViewParam = buildPluginParam(fieldMap, fieldCustomFilter, yoyFilterList, ds, table, view, rowPermissionsTree, chartExtRequest); PluginViewParam yoyPluginViewParam = buildPluginParam(fieldMap, fieldCustomFilter, yoyFilterList, ds, table, view, rowPermissionsTree, chartExtRequest);
String yoySql = pluginViewSql(yoyPluginViewParam, view); String yoySql = pluginViewSql(yoyPluginViewParam, view);
if (StringUtils.isBlank(yoySql)) { if (StringUtils.isBlank(yoySql)) {
@ -1177,6 +1183,7 @@ public class ChartViewService {
data.clear(); data.clear();
data.addAll(resultData); data.addAll(resultData);
} }
Map<String, Object> mapChart = pluginViewResult(pluginViewParam, view, data, isDrill);
Map<String, Object> mapTableNormal = ChartDataBuild.transTableNormal(fieldMap, view, data, desensitizationList); Map<String, Object> mapTableNormal = ChartDataBuild.transTableNormal(fieldMap, view, data, desensitizationList);
@ -1832,7 +1839,7 @@ public class ChartViewService {
return chartViewDTO; return chartViewDTO;
} }
private List<? extends ForecastDataVO<?,?>> forecastData(ChartSeniorForecastDTO forecastCfg, List<String[]> data, List<ChartViewFieldDTO> xAxis, List<ChartViewFieldDTO> yAxis, ChartViewDTO view) throws ParseException { private List<? extends ForecastDataVO<?, ?>> forecastData(ChartSeniorForecastDTO forecastCfg, List<String[]> data, List<ChartViewFieldDTO> xAxis, List<ChartViewFieldDTO> yAxis, ChartViewDTO view) throws ParseException {
List<String[]> trainingData = data; List<String[]> trainingData = data;
if (!forecastCfg.isAllPeriod() && data.size() > forecastCfg.getTrainingPeriod()) { if (!forecastCfg.isAllPeriod() && data.size() > forecastCfg.getTrainingPeriod()) {
trainingData = data.subList(data.size() - forecastCfg.getTrainingPeriod(), data.size() - 1); 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]; String lastTime = data.get(data.size() - 1)[0];
ChartViewFieldDTO timeAxis = xAxis.get(0); ChartViewFieldDTO timeAxis = xAxis.get(0);
List<String> forecastPeriod = DateUtils.getForecastPeriod(lastTime, forecastCfg.getPeriod(), timeAxis.getDateStyle(), timeAxis.getDatePattern()); List<String> forecastPeriod = DateUtils.getForecastPeriod(lastTime, forecastCfg.getPeriod(), timeAxis.getDateStyle(), timeAxis.getDatePattern());
if(!forecastPeriod.isEmpty()){ if (!forecastPeriod.isEmpty()) {
ForecastAlgo algo = ForecastAlgoManager.getAlgo(forecastCfg.getAlgorithm()); ForecastAlgo algo = ForecastAlgoManager.getAlgo(forecastCfg.getAlgorithm());
List<ForecastDataDTO> forecastData = algo.forecast(forecastCfg, trainingData, view); List<ForecastDataDTO> forecastData = algo.forecast(forecastCfg, trainingData, view);
if (forecastPeriod.size() == forecastData.size()) { if (forecastPeriod.size() == forecastData.size()) {
@ -2000,6 +2007,11 @@ public class ChartViewService {
return result; return result;
} }
private List<String[]> pluginViewYOY(PluginViewParam param, ChartViewDTO view, List<String[]> args) {
ViewPluginService viewPluginService = getPluginService(view.getType());
return viewPluginService.yoy(param, args);
}
private ChartViewDTO emptyChartViewDTO(ChartViewDTO view) { private ChartViewDTO emptyChartViewDTO(ChartViewDTO view) {
ChartViewDTO dto = new ChartViewDTO(); ChartViewDTO dto = new ChartViewDTO();
BeanUtils.copyBean(dto, view); BeanUtils.copyBean(dto, view);

View File

@ -1841,7 +1841,8 @@ export default {
linear_regression: 'Linear regression', linear_regression: 'Linear regression',
polynomial_regression: 'Polynomial regression', polynomial_regression: 'Polynomial regression',
show_summary: 'Show summary', show_summary: 'Show summary',
summary_label: 'Summary label' summary_label: 'Summary label',
tip: 'Tip'
}, },
dataset: { dataset: {
scope_edit: 'Effective only when editing', scope_edit: 'Effective only when editing',

View File

@ -1834,7 +1834,8 @@ export default {
linear_regression: '線性回歸', linear_regression: '線性回歸',
polynomial_regression: '多項式擬合', polynomial_regression: '多項式擬合',
show_summary: '顯示總計', show_summary: '顯示總計',
summary_label: '總計標籤' summary_label: '總計標籤',
tip: '提示'
}, },
dataset: { dataset: {
scope_edit: '僅編輯時生效', scope_edit: '僅編輯時生效',

View File

@ -1831,7 +1831,8 @@ export default {
linear_regression: '线性回归', linear_regression: '线性回归',
polynomial_regression: '多项式拟合', polynomial_regression: '多项式拟合',
show_summary: '显示总计', show_summary: '显示总计',
summary_label: '总计标签' summary_label: '总计标签',
tip: '提示'
}, },
dataset: { dataset: {
goto: ', 前往 ', goto: ', 前往 ',

View File

@ -50,6 +50,12 @@
class="exp-style" class="exp-style"
>(本期数据 / |上期数据| - 1) * 100%</span> >(本期数据 / |上期数据| - 1) * 100%</span>
</el-form-item> </el-form-item>
<el-form-item :label="$t('chart.tip')">
<span
class="exp-style"
>当对比日期需要过滤时请使用过滤组件实现过滤使用视图过滤器仪表板下钻和联动等功能会导致结果不一致</span>
</el-form-item>
</el-form> </el-form>
</div> </div>
</template> </template>

View File

@ -118,9 +118,8 @@ public class ChartMixService extends ViewPluginService {
} }
@Override @Override
public Map<String, Object> formatResult(PluginViewParam pluginViewParam, List<String[]> data, Boolean isDrill) { public List<String[]> yoy(PluginViewParam pluginViewParam, List<String[]> data) {
List<PluginViewField> xAxis = new ArrayList<>(); List<PluginViewField> xAxis = new ArrayList<>();
List<PluginViewField> yAxis = new ArrayList<>(); List<PluginViewField> yAxis = new ArrayList<>();
@ -133,17 +132,7 @@ public class ChartMixService extends ViewPluginService {
yAxis.add(pluginViewField); yAxis.add(pluginViewField);
} }
}); });
Map<String, Object> map = new HashMap<>();
List<PluginSeries> series = format(pluginViewParam.getPluginViewLimit().getType(), data, xAxis, yAxis);
map.put("data", series);
return map;
}
private List<PluginSeries> format(String type, List<String[]> data, List<PluginViewField> xAxis, List<PluginViewField> yAxis) {
// 同比/环比计算 // 同比/环比计算
// 调整data数据 // 调整data数据
for (int i = 0; i < yAxis.size(); i++) { for (int i = 0; i < yAxis.size(); i++) {
@ -247,9 +236,35 @@ public class ChartMixService extends ViewPluginService {
} }
} }
// 同比/环比计算 over // 同比/环比计算 over
return data;
}
@Override
public Map<String, Object> formatResult(PluginViewParam pluginViewParam, List<String[]> data, Boolean isDrill) {
List<PluginViewField> xAxis = new ArrayList<>();
List<PluginViewField> 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<String, Object> map = new HashMap<>();
List<PluginSeries> series = format(pluginViewParam.getPluginViewLimit().getType(), data, xAxis, yAxis);
map.put("data", series);
return map;
}
private List<PluginSeries> format(String type, List<String[]> data, List<PluginViewField> xAxis, List<PluginViewField> yAxis) {
List<PluginSeries> series = new ArrayList<>(); List<PluginSeries> series = new ArrayList<>();
for (PluginViewField y : yAxis) { for (PluginViewField y : yAxis) {
PluginSeries series1 = new PluginSeries(); PluginSeries series1 = new PluginSeries();

View File

@ -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<String[]> yoy(PluginViewParam pluginViewParam, List<String[]> data);
}

View File

@ -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<String[]> yoy(PluginViewParam pluginViewParam, List<String[]> data) {
return data;
}
}

View File

@ -6,8 +6,11 @@ import io.dataease.plugins.view.entity.PluginViewParam;
import io.dataease.plugins.view.entity.PluginViewType; import io.dataease.plugins.view.entity.PluginViewType;
import io.dataease.plugins.view.handler.PluginViewRSHandler; import io.dataease.plugins.view.handler.PluginViewRSHandler;
import io.dataease.plugins.view.handler.PluginViewStatHandler; 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.DefaultViewRSHandler;
import io.dataease.plugins.view.handler.impl.DefaultViewStatHandler; import io.dataease.plugins.view.handler.impl.DefaultViewStatHandler;
import io.dataease.plugins.view.handler.impl.DefaultViewYOYHandler;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -20,6 +23,8 @@ public abstract class ViewPluginService extends PluginComponentService {
private PluginViewRSHandler<Map> rsHandler; private PluginViewRSHandler<Map> rsHandler;
private PluginViewYOYHandler yoyHandler;
public abstract PluginViewType viewType(); public abstract PluginViewType viewType();
@ -35,11 +40,16 @@ public abstract class ViewPluginService extends PluginComponentService {
return rsHandler.format(param, lists, isDrill); return rsHandler.format(param, lists, isDrill);
} }
public List<String[]> yoy(PluginViewParam param, List<String[]> lists) {
yoyHandler = new DefaultViewYOYHandler();
return yoyHandler.yoy(param, lists);
}
public ViewPluginBaseService getBaseService() { public ViewPluginBaseService getBaseService() {
return viewPluginBaseService; return viewPluginBaseService;
} }
public ViewPluginService() { public ViewPluginService() {
this.viewPluginBaseService = (ViewPluginBaseService)PluginSpringContextUtil.getBean("viewPluginBaseServiceImpl"); this.viewPluginBaseService = (ViewPluginBaseService) PluginSpringContextUtil.getBean("viewPluginBaseServiceImpl");
} }
} }