业务场景

背景

在以日期维度展示数据时,数据库中保存的数据一般会制作成宽表的形式

比如:(id, projectNmae, projectID, indicator_name, indicator_value1,indicator_value1...,day)

根据indicator_name获取对应指标,根据indicator_value获取对应周期数据,比如indicator_value1代表(day-1)

问题

indicator_name存在商品价格,折扣价格两种指标,现在需要将其制作成柱状图,比较每一个周期内商品价格和折扣价格

通过反射获取进行字段赋值_List

数据样式

{
    "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,根据业务需求添加逻辑或者判断