业务场景
背景
在以日期维度展示数据时,数据库中保存的数据一般会制作成宽表的形式
比如:(id, projectNmae, projectID, indicator_name, indicator_value1,indicator_value1...,day)
根据indicator_name
获取对应指标,根据indicator_value
获取对应周期数据,比如indicator_value1
代表(day-1)
问题
indicator_name
存在商品价格,折扣价格两种指标,现在需要将其制作成柱状图,比较每一个周期内商品价格和折扣价格
数据样式
{
"data": [
{
"indicatorName": "01/18",
"shangpin": 499.0,
"zhekou": 398.0
},
{
"indicatorName": "01/19",
"shangpin": 88.0,
"zhekou": 56.0
},
{
"indicatorName": "01/20",
"shangpin": 0.0,
"zhekou": 0.0
}
...
],
"errorCode": "NO-ERROR",
"errorMessage": "NO-MESSAGE",
"success": true
}
解决方案
1.从表中查出当前日期对应的两条数据
(id, projectNmae, projectID, "商品价格", 0.0, 88.0, 499.0...,"2023-01-20")
(id, projectNmae, projectID, "折扣价格", 0.0, 56.0, 398.0...,"2023-01-20")
2.根据柱状图展示的数据量进行循环遍历,比如这个柱状图展示三个周期的数据,即循环三次
3.返回组装好的数据列表
//current为展示的周期数量
List<Vo> result = new ArrayList<>();
for (int i = 0; i < current; i++) {
VO vo = new VO();
// 将pDay设置为当前时间,相减获取x轴月份参数
String timeTemp = day;
SimpleDateFormat date = new SimpleDateFormat("yyyy-MM-dd");
vo.setDay(date.parse(day).getTime() - (i * 86400000L));
//list 为查询出来的两条数据集合,xx为数据对应的实体类
List<String> nameList =list.stream().map(XX::getDeptId).collect(Collectors.toList());
//将list转化为key为indicatorName, value为indicator_value的map集合
Map<String, XX> map = list.stream().collect(Collectors.groupingBy(XX::getIndicatorName));
for (String name : nameList) {
if (name.equals("商品价格") {
vo.setShanpin((Double) map.get(name).get(0).getClass().getMethod(CharSequenceUtil.concat(true, INDICATOR_VALUE, String.valueOf(i))).invoke(map.get(name).get(0)));
}
if (name.equals("折扣价格")) {
vo.setZhekou((Double) map.get(name).get(0).getClass().getMethod(CharSequenceUtil.concat(true, INDICATOR_VALUE, String.valueOf(i))).invoke(map.get(name).get(0)));
}
}
result.add(vo);
}
此处仅做一个简单的代码demo,根据业务需求添加逻辑或者判断