栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java 统计一年12个月每月的收益总额 折线统计图

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java 统计一年12个月每月的收益总额 折线统计图

最近的需求需要统计用户一年内,每个月收益总额的折线统计图。废话不多说,直接开整。

1.首先定义一个返回数据实体类

import lombok.Data;

@Data
public class TaskYearChartVo {

    private String monthName;

    private String monthMoney;
}

用来接收sql语句查询的实体,这里sql只查了金额这一个字段,用该实体接收。

@Data
public class TaskMyWalletVo {

    private Double orderAmount;
}

2.StringSizeUtil 工具类,数据库中存储的月份,6月之前,数字前面都有个0,6月之后没有0,该工具类主要是处理这里。

public class StringSizeUtil {

    public static String stringSize(String a){

        if (a.length()<2){
            return "0"+a;
        }else {
            return a;
        }
    }
    public static void main(String[] args) {

        System.out.println(stringSize("6"));
        System.out.println(stringSize("11"));
    }
}

ExchangeRateTransformUtil 工具类,用来做元和万元之间的换算,并去掉小数点后多余的0。例如10000元通过该工具类返回的值为1.00W,多了两个0,看起来怪怪的。该工具了可以去掉小数点后多余的0

public class ExchangeRateTransformUtil {

    public static String exchangeRateTransform(Double param){

        if (param == 0){
            return "0W";
        }else{
            Double money = param/10000;
            BigDecimal decimal = new BigDecimal(money);
            BigDecimal percentage = decimal.setScale(2, RoundingMode.HALF_UP);
            return percentage.stripTrailingZeros().toPlainString()+"W";
        }
    }

    public static void main(String[] args) {

        System.out.println(exchangeRateTransform(10000D));
    }
}

3.处理逻辑

public List brokenLineStatisticalChartByYear(int year) {

        //获取当前登录用户
        TaskUser user = (TaskUser) SecurityUtils.getSubject().getPrincipal();
        List taskYearChartVoList = new ArrayList<>();
        for (int i =1;i<=12;i++){
            String start = year + "-" + StringSizeUtil.stringSize(String.valueOf(i)) + "-" + "01" + " 00:00:00";
            String end = year + "-" + StringSizeUtil.stringSize(String.valueOf(i)) + "-"+ "31" + " 23:59:59";
            List list = taskMyWalletMapper.brokenLineStatisticalChartByYear(start,end,user.getId());
            if (list.size() == 0){
                Double money = 0D;
                TaskYearChartVo taskYearChartVo = new TaskYearChartVo();
                taskYearChartVo.setMonthName(i+"月");
                taskYearChartVo.setMonthMoney(ExchangeRateTransformUtil.exchangeRateTransform(money));
                taskYearChartVoList.add(taskYearChartVo);
            }else {
                Double money = list.stream().collect(Collectors.summingDouble(TaskMyWalletVo::getOrderAmount));
                TaskYearChartVo taskYearChartVo = new TaskYearChartVo();
                taskYearChartVo.setMonthName(i+"月");
                taskYearChartVo.setMonthMoney(ExchangeRateTransformUtil.exchangeRateTransform(money));
                taskYearChartVoList.add(taskYearChartVo);
            }
        }
        return taskYearChartVoList;
    }

4.sql语句使用between and,brokenLineStatisticalChartByYear()方法,我还传了一个当前用户id,大家可以根据的自己的需求来确定需要传哪些值。

mapper

List brokenLineStatisticalChartByYear(@Param("startTime") String startTime,
													@Param("endTime") String endTime,
													@Param("userId") String userId);

xml

		
        select b.order_amount FROM 表名 a
        INNER JOIN 表名 b ON a.order_no = b.order_reference
        AND a.order_flag = 4 AND a.create_time BETWEEN #{startTime} AND #{endTime}
        and a.task_user_id = #{userId}
    

5.最后效果

6.之前也写过类似统计的文章,那时候还不知道stream的方法,计算总额那里是循环一个一个加的。用stream的方法就方便多了,它还有其他方法,有兴趣的可以了解一下,很方便的。
个人码云 springboot demo

暑期编程PK赛 得CSDN机械键盘等精美礼品!
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1016692.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号