最近的需求需要统计用户一年内,每个月收益总额的折线统计图。废话不多说,直接开整。
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 ListbrokenLineStatisticalChartByYear(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
ListbrokenLineStatisticalChartByYear(@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



