package com.ruoyi.order.service.impl; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.order.api.model.TChargingOrder; import com.ruoyi.order.api.model.TChargingOrderAccountingStrategy; import com.ruoyi.order.mapper.TChargingOrderAccountingStrategyMapper; import com.ruoyi.order.service.TChargingOrderAccountingStrategyService; import com.ruoyi.order.service.TChargingOrderService; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.math.BigDecimal; import java.math.RoundingMode; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.time.Duration; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; import java.util.stream.LongStream; /** *

* 服务实现类 *

* * @author xiaochen * @since 2024-08-07 */ @Service public class TChargingOrderAccountingStrategyServiceImpl extends ServiceImpl implements TChargingOrderAccountingStrategyService { @Resource private TChargingOrderService chargingOrderService; /** * 获取给定天数范围内的充电量统计 * @param days 天数 * @return */ @Override public List>> getTotalElectricQuantity(Integer days, Set siteIds) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); DateTimeFormatter sdf1 = DateTimeFormatter.ofPattern("yyyy-MM-dd"); Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) - days); String startTime = sdf.format(calendar.getTime()) + " 00:00:00"; List list = chargingOrderService.list(new LambdaQueryWrapper().in(TChargingOrder::getSiteId, siteIds).eq(TChargingOrder::getStatus, 5) .eq(TChargingOrder::getDelFlag, 0).last(" and start_time between '" + startTime + "' and DATE_FORMAT(now(), '%Y-%m-%d %H:%i:%s')")); List orderId = list.stream().map(TChargingOrder::getId).collect(Collectors.toList()); List list1 = new ArrayList<>(); if(orderId.size() > 0){ list1 = this.list(new LambdaQueryWrapper().in(TChargingOrderAccountingStrategy::getChargingOrderId, orderId)); } List>> list2 = new ArrayList<>(); for (int i = days; i >= 0; i--) { Calendar nowDateTime = Calendar.getInstance(); nowDateTime.set(Calendar.DAY_OF_YEAR, nowDateTime.get(Calendar.DAY_OF_YEAR) - i); List collect = list.stream().filter(s -> s.getStartTime().format(sdf1).equals(sdf.format(nowDateTime.getTime()))).collect(Collectors.toList()); List orderIds = collect.stream().map(TChargingOrder::getId).collect(Collectors.toList()); List> datas = new ArrayList<>(); Map map1 = new HashMap<>(); map1.put("name", "尖"); BigDecimal value1 = list1.stream().filter(s -> orderIds.contains(s.getChargingOrderId()) && s.getType() == 1) .map(TChargingOrderAccountingStrategy::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add); map1.put("value", value1.setScale(2, RoundingMode.HALF_EVEN)); datas.add(map1); Map map2 = new HashMap<>(); map2.put("name", "峰"); BigDecimal value2 = list1.stream().filter(s -> orderIds.contains(s.getChargingOrderId()) && s.getType() == 2) .map(TChargingOrderAccountingStrategy::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add); map2.put("value", value2.setScale(2, RoundingMode.HALF_EVEN)); datas.add(map2); Map map3 = new HashMap<>(); map3.put("name", "平"); BigDecimal value3 = list1.stream().filter(s -> orderIds.contains(s.getChargingOrderId()) && s.getType() == 3) .map(TChargingOrderAccountingStrategy::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add); map3.put("value", value3.setScale(2, RoundingMode.HALF_EVEN)); datas.add(map3); Map map4 = new HashMap<>(); map4.put("name", "谷"); BigDecimal value4 = list1.stream().filter(s -> orderIds.contains(s.getChargingOrderId()) && s.getType() == 4) .map(TChargingOrderAccountingStrategy::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add); map4.put("value", value4.setScale(2, RoundingMode.HALF_EVEN)); datas.add(map4); list2.add(datas); } return list2; } /** * 获取给定天数每天的充电度数 * @param days 天数 * @return */ @Override public List getDailyChargingDegree(Integer days, Set siteIds) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) - days); String startTime = sdf.format(calendar.getTime()) + " 00:00:00"; List list = chargingOrderService.list(new LambdaQueryWrapper().in(TChargingOrder::getSiteId, siteIds).eq(TChargingOrder::getStatus, 5) .eq(TChargingOrder::getDelFlag, 0).last(" and start_time between '" + startTime + "' and DATE_FORMAT(now(), '%Y-%m-%d %H:%i:%s')")); List list2 = new ArrayList<>(); //遍历获取每天的数值 for (int i = days; i >= 0; i--) { Calendar nowDateTime = Calendar.getInstance(); nowDateTime.set(Calendar.DAY_OF_YEAR, nowDateTime.get(Calendar.DAY_OF_YEAR) - i); //充电量 BigDecimal reduce = list.stream().filter(s -> s.getStartTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")).equals(sdf.format(nowDateTime.getTime()))) .map(TChargingOrder::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add); list2.add(reduce.doubleValue()); } return list2; } }