Java8分组并求和,填充年月数据求同比,只求近一年的同比与返回近一年的数据(作个人纪录)

13 篇文章 1 订阅
11 篇文章 0 订阅

返回对象实体类

@Getter
@Setter
public class CostDTO {

    /**
     * 费用年月
     */
    private String yearMonth;

    /**
     * 费用
     */
    private Double cost;

    /**
     * 同比
     */
    private Double costRate;
}

实现类业务代码

		//时间格式:"startTime":"2021-04-01", "endTime":"2022-03-01"
 		DateTimeFormatter timeFormatter = DateTimeFormatter.ISO_LOCAL_DATE;
        if (StringUtils.isBlank(qqlVehicleMaintenanceStatisticsVo.getStartTime()) || StringUtils.isBlank(qqlVehicleMaintenanceStatisticsVo.getEndTime())) {
            LocalDate localDate = LocalDate.now();
            qqlVehicleMaintenanceStatisticsVo.setStartTime(localDate.minusYears(2).plusMonths(1).format(timeFormatter));
            qqlVehicleMaintenanceStatisticsVo.setEndTime(localDate.format(timeFormatter));
        }else{
            qqlVehicleMaintenanceStatisticsVo.setStartTime(LocalDate.parse(qqlVehicleMaintenanceStatisticsVo.getStartTime(),timeFormatter).minusYears(1).format(timeFormatter));
        }
		//查询三组相同类型的数据
		List<CostDTO> maintenanceCostDTOList = this.baseMapper.listMaintenanceCost(qqlVehicleMaintenanceStatisticsVo);
        List<CostDTO> oilCostDTOList = this.baseMapper.listOilCost(qqlVehicleMaintenanceStatisticsVo);
        List<CostDTO> otherCostDTOList = this.baseMapper.listOtherCost(qqlVehicleMaintenanceStatisticsVo);
        List<String> formatTime = generateFormatTime(qqlVehicleMaintenanceStatisticsVo.getStartTime(), qqlVehicleMaintenanceStatisticsVo.getEndTime());
        addLackDataCost(maintenanceCostDTOList, formatTime);
        addLackDataCost(oilCostDTOList, formatTime);
        addLackDataCost(otherCostDTOList, formatTime);
        //计算每个年月各项费用之和
        Map<String, DoubleSummaryStatistics> computeCostByYearMonth = computeCostByYearMonth(maintenanceCostDTOList, oilCostDTOList, otherCostDTOList);
        Iterator<Map.Entry<String, DoubleSummaryStatistics>> it = computeCostByYearMonth.entrySet().iterator();
        List<CostDTO> costDTOS = new ArrayList<CostDTO>();
        CostDTO costDTO = null;
        while (it.hasNext()) {
            Map.Entry<String, DoubleSummaryStatistics> entry = it.next();
            String key = entry.getKey();
            double cost = entry.getValue().getSum();
            costDTO = new CostDTO();
            costDTO.setYearMonth(key);
            costDTO.setCost(cost);
            costDTOS.add(costDTO);
        }
        List<CostDTO> dtoList = costDTOS.stream().sorted(Comparator.comparing(CostDTO::getYearMonth)).collect(Collectors.toList());
        List<CostDTO> previousYearCostDTOS = new ArrayList<CostDTO>();
        for (int i = 0, j = 11; i <= j; i++) {
            previousYearCostDTOS.add(dtoList.get(i));
        }
        List<CostDTO> currentYearCostDTOS = dtoList.stream().filter(item -> !previousYearCostDTOS.contains(item)).collect(Collectors.toList());
        for (int i = 0, j = currentYearCostDTOS.size(); i < j; i++) {
            CostDTO dto = currentYearCostDTOS.get(i);
            Double cost = previousYearCostDTOS.get(i).getCost();
            if (cost != 0) {
                dto.setCostRate(DoubleUtil.div(dto.getCost() - cost, cost, 4) * 100);
            } else {
                dto.setCostRate(0D);
            }
        }
        CostRateVO costRateVO = new CostRateVO();
        costRateVO.setCurrentYearCostDTOS(currentYearCostDTOS);
        costRateVO.setMaintenanceCostDTOList(maintenanceCostDTOList.stream().sorted(Comparator.comparing(CostDTO::getYearMonth)).skip(12).collect(Collectors.toList()));
        costRateVO.setOilCostDTOList(oilCostDTOList.stream().sorted(Comparator.comparing(CostDTO::getYearMonth)).skip(12).collect(Collectors.toList()));
        costRateVO.setOtherCostDTOList(otherCostDTOList.stream().sorted(Comparator.comparing(CostDTO::getYearMonth)).skip(12).collect(Collectors.toList()));

实现类private 方法

 private Map<String, DoubleSummaryStatistics> computeCostByYearMonth(List<CostDTO> maintenanceCostDTOList, List<CostDTO> costDTOList, List<CostDTO> otherCostDTOList) {
        List<CostDTO> costDTOS = new ArrayList<>();
        costDTOS.addAll(maintenanceCostDTOList);
        costDTOS.addAll(costDTOList);
        costDTOS.addAll(otherCostDTOList);
        //按年月分组求和
        Map<String, DoubleSummaryStatistics> doubleSummaryStatisticsMap = costDTOS.stream()
                .collect(Collectors.groupingBy(CostDTO::getYearMonth, Collectors.summarizingDouble(CostDTO::getCost)));
        return doubleSummaryStatisticsMap;
    }
	//补充缺失的年月数据
    private void addLackDataCost(List<CostDTO> costList, List<String> formatTime) {
        if (CollectionUtils.isNotEmpty(costList)) {
            List<String> mDate = costList.stream().map(CostDTO::getYearMonth).collect(Collectors.toList());
            List<String> lackDate = formatTime.stream().filter(item -> !mDate.contains(item)).collect(Collectors.toList());
            CostDTO costDTO = null;
            for (String lack : lackDate) {
                costDTO = new CostDTO();
                costDTO.setYearMonth(lack);
                costDTO.setCost(0D);
                costList.add(costDTO);
            }
        }
    }
	//生成指定时间段的年月(yyyy-MM)
    private List<String> generateFormatTime(String startTime, String endTime) {
        LocalDate startDate = LocalDate.parse(startTime, DateTimeFormatter.ISO_LOCAL_DATE);
        LocalDate endDate = LocalDate.parse(endTime, DateTimeFormatter.ISO_LOCAL_DATE);
        int startDateYear = startDate.getYear();
        int midYear = startDateYear + 1;
        int endDateYear = endDate.getYear();
        int startDateMonthValue = startDate.getMonthValue();
        int endDateMonthValue = endDate.getMonthValue();
        List<String> strDateList = new ArrayList<>();
        int ten = 10;
        int twelve = 12;
        if (startDateMonthValue < ten) {
            for (int i = startDateMonthValue, j = ten; i < j; i++) {
                strDateList.add(startDateYear + "-" + "0" + i);
            }
            for (int i = ten, j = twelve; i <= j; i++) {
                strDateList.add(startDateYear + "-" + i);
            }
        } else {
            for (int i = startDateMonthValue, j = twelve; i <= j; i++) {
                strDateList.add(startDateYear + "-" + i);
            }
        }
        for (int i = 1, j = twelve; i <= j; i++) {
            if (i < 10) {
                strDateList.add(midYear + "-" + "0" + i);
            } else {
                strDateList.add(midYear + "-" + i);
            }
        }
        for (int i = 1, j = endDateMonthValue; i <= j; i++) {
            if (i < 10) {
                strDateList.add(endDateYear + "-" + "0" + i);
            } else {
                strDateList.add(endDateYear + "-" + i);
            }
        }
        return strDateList;
    }

mysql查询语句(date_day_time为yyyy-MM-dd格式)

#维修费用
SELECT
	DATE_FORMAT( date_day_time, '%Y-%m' ) yearMonth,
	ROUND( SUM( maintenance_cost ), 2 ) AS cost 
FROM
	qql_vehicle_maintenance_maintenance 
WHERE
	  org_id = #{orgId}
      AND date_day_time BETWEEN #{startTime}
      AND #{endTime}
GROUP BY
	yearMonth 
#油费
SELECT
	DATE_FORMAT( date_day_time, '%Y-%m' ) yearMonth,
	ROUND( SUM( oil_cost ), 2 ) AS cost 
FROM
	qql_vehicle_maintenance_oil 
WHERE
	 org_id = #{orgId}
     AND date_day_time BETWEEN #{startTime}
     AND #{endTime} 
GROUP BY
	yearMonth 
#其他费用
SELECT
	DATE_FORMAT( date_day_time, '%Y-%m' ) yearMonth,
	ROUND( SUM( other_cost ), 2 ) AS cost 
FROM
	qql_vehicle_maintenance_other 
WHERE
	 org_id = #{orgId}
     AND date_day_time BETWEEN #{startTime}
     AND #{endTime} 
GROUP BY
	yearMonth
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值