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