Merge pull request #8572 from dataease/pr@dev@feat_quick_calc_accumulate

feat(视图): 快速计算支持累加
This commit is contained in:
wisonic-s 2024-03-18 18:37:30 +08:00 committed by GitHub
commit 3baef7ccc4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 85 additions and 5 deletions

View File

@ -73,6 +73,7 @@ import java.math.BigDecimal;
import java.math.RoundingMode; import java.math.RoundingMode;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.*; import java.util.*;
import java.util.concurrent.atomic.AtomicReference;
import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.ReentrantLock;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
@ -1447,6 +1448,78 @@ public class ChartViewService {
.divide(sum, 8, RoundingMode.HALF_UP) .divide(sum, 8, RoundingMode.HALF_UP)
.toString(); .toString();
} }
} else if (StringUtils.equalsAnyIgnoreCase(compareCalc.getType(), "accumulate")) {
// 累加
if (data.isEmpty()) {
break;
}
if (StringUtils.containsAny(view.getType(), "group", "stack")) {
if (xAxisBase.isEmpty()) {
break;
}
if (StringUtils.containsIgnoreCase(view.getType(), "stack") && extStack.isEmpty()) {
break;
}
if (StringUtils.containsIgnoreCase(view.getType(), "group") && xAxisExt.isEmpty() ) {
break;
}
final Map<String, Integer> mainIndexMap = new HashMap<>();
final List<List<String[]>> mainMatrix = new ArrayList<>();
List<ChartViewFieldDTO> finalXAxisBase = xAxisBase;
data.forEach(item -> {
String[] mainAxisArr = Arrays.copyOfRange(item, 0, finalXAxisBase.size());
String mainAxis = StringUtils.join(mainAxisArr, '-');
Integer index = mainIndexMap.get(mainAxis);
if (index == null) {
mainIndexMap.put(mainAxis, mainMatrix.size());
List<String[]> tmp = new ArrayList<>();
tmp.add(item);
mainMatrix.add(tmp);
} else {
List<String[]> tmp = mainMatrix.get(index);
tmp.add(item);
}
});
int finalDataIndex = dataIndex;
int subEndIndex = finalXAxisBase.size();
if (StringUtils.containsIgnoreCase(view.getType(), "group")) {
subEndIndex += xAxisExt.size();
}
if (StringUtils.containsIgnoreCase(view.getType(), "stack")) {
subEndIndex += extStack.size();
}
int finalSubEndIndex = subEndIndex;
//滑动累加
for (int k = 1; k < mainMatrix.size(); k++) {
List<String[]> preDataItems = mainMatrix.get(k - 1);
List<String[]> curDataItems = mainMatrix.get(k);
Map<String, BigDecimal> preDataMap = new HashMap<>();
preDataItems.forEach(preDataItem -> {
String[] groupStackAxisArr = Arrays.copyOfRange(preDataItem, finalXAxisBase.size(), finalSubEndIndex);
String groupStackAxis = StringUtils.join(groupStackAxisArr, '-');
preDataMap.put(groupStackAxis, new BigDecimal(preDataItem[finalDataIndex]));
});
curDataItems.forEach(curDataItem -> {
String[] groupStackAxisArr = Arrays.copyOfRange(curDataItem, finalXAxisBase.size(), finalSubEndIndex);
String groupStackAxis = StringUtils.join(groupStackAxisArr, '-');
BigDecimal preValue = preDataMap.get(groupStackAxis);
if (preValue != null) {
curDataItem[finalDataIndex] = new BigDecimal(curDataItem[finalDataIndex])
.add(preValue)
.toString();
}
});
}
} else {
final int index = dataIndex;
final AtomicReference<BigDecimal> accumValue = new AtomicReference<>(new BigDecimal(0));
data.forEach(item -> {
BigDecimal curVal = new BigDecimal(item[index]);
BigDecimal curAccumValue = accumValue.get().add(curVal);
item[index] = curAccumValue.toString();
accumValue.set(curAccumValue);
});
}
} }
} }
} }

View File

@ -1373,6 +1373,7 @@ export default {
select_chart_type: 'Select Chart Type', select_chart_type: 'Select Chart Type',
recover: 'Reset', recover: 'Reset',
yoy_label: 'YOY/MOM', yoy_label: 'YOY/MOM',
accumulate: 'Accumulate',
yoy_setting: 'Setting', yoy_setting: 'Setting',
pls_select_field: 'Select Field', pls_select_field: 'Select Field',
compare_date: 'Compare Date', compare_date: 'Compare Date',

View File

@ -1371,6 +1371,7 @@ export default {
select_chart_type: '選擇圖表類型', select_chart_type: '選擇圖表類型',
recover: '重置', recover: '重置',
yoy_label: '同比/環比', yoy_label: '同比/環比',
accumulate: '累加',
yoy_setting: '同環比設置', yoy_setting: '同環比設置',
pls_select_field: '請選擇字段', pls_select_field: '請選擇字段',
compare_date: '對比日期', compare_date: '對比日期',

View File

@ -1372,6 +1372,7 @@ export default {
recover: '重置', recover: '重置',
yoy_label: '同比/环比', yoy_label: '同比/环比',
yoy_setting: '同环比设置', yoy_setting: '同环比设置',
accumulate: '累加',
pls_select_field: '请选择字段', pls_select_field: '请选择字段',
compare_date: '对比日期', compare_date: '对比日期',
compare_type: '对比类型', compare_type: '对比类型',

View File

@ -3657,7 +3657,7 @@ export function getColors(chart, colors, reset) {
if (chart.data) { if (chart.data) {
const data = chart.data.data const data = chart.data.data
const s = [] const s = []
data.forEach((cur) => { data?.forEach((cur) => {
if (s.indexOf(cur.category) < 0) { if (s.indexOf(cur.category) < 0) {
s.push(cur.category) s.push(cur.category)
} }

View File

@ -97,7 +97,6 @@ export default {
}, },
data() { data() {
return { return {
myChart: null,
chartId: uuid.v1(), chartId: uuid.v1(),
showTrackBar: true, showTrackBar: true,
trackBarStyle: { trackBarStyle: {

View File

@ -175,7 +175,6 @@ export default {
}, },
tableData: [], tableData: [],
showPage: false, showPage: false,
scrollTimer: null,
scrollTop: 0, scrollTop: 0,
remarkCfg: { remarkCfg: {
show: false, show: false,
@ -239,7 +238,6 @@ export default {
this.preDraw() this.preDraw()
}, },
beforeDestroy() { beforeDestroy() {
clearInterval(this.scrollTimer)
window.removeEventListener('resize', this.chartResize) window.removeEventListener('resize', this.chartResize)
this.myChart?.facet.timer?.stop() this.myChart?.facet.timer?.stop()
this.myChart?.destroy?.() this.myChart?.destroy?.()
@ -524,7 +522,6 @@ export default {
}, },
initScroll() { initScroll() {
clearTimeout(this.scrollTimer)
const customAttr = JSON.parse(this.chart.customAttr) const customAttr = JSON.parse(this.chart.customAttr)
const senior = JSON.parse(this.chart.senior) const senior = JSON.parse(this.chart.senior)
if (senior?.scrollCfg?.open && (this.chart.type === 'table-normal' || (this.chart.type === 'table-info' && !this.showPage))) { if (senior?.scrollCfg?.open && (this.chart.type === 'table-normal' || (this.chart.type === 'table-info' && !this.showPage))) {

View File

@ -179,6 +179,10 @@
:disabled="quotaViews.indexOf(chart.type) > -1" :disabled="quotaViews.indexOf(chart.type) > -1"
:command="beforeQuickCalc('percent')" :command="beforeQuickCalc('percent')"
>{{ $t('chart.percent') }}</el-dropdown-item> >{{ $t('chart.percent') }}</el-dropdown-item>
<el-dropdown-item
:disabled="quotaViews.indexOf(chart.type) > -1"
:command="beforeQuickCalc('accumulate')"
>{{ $t('chart.accumulate') }}</el-dropdown-item>
</el-dropdown-menu> </el-dropdown-menu>
</el-dropdown> </el-dropdown>
</el-dropdown-item> </el-dropdown-item>
@ -418,6 +422,10 @@ export default {
this.item.compareCalc.type = 'percent' this.item.compareCalc.type = 'percent'
this.$emit('onQuotaItemChange', this.item) this.$emit('onQuotaItemChange', this.item)
break break
case 'accumulate':
this.item.compareCalc.type = 'accumulate'
this.$emit('onQuotaItemChange', this.item)
break
default: default:
break break
} }