puzhibing
2025-02-05 74b0e0814e37d640596f44ec86d20fa9ecce9ed6
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -9,6 +9,7 @@
import com.ruoyi.account.api.model.*;
import com.ruoyi.account.api.vo.GetAppUserVipDetail;
import com.ruoyi.account.api.vo.GetInviteUser;
import com.ruoyi.chargingPile.api.dto.GetSiteListDTO;
import com.ruoyi.chargingPile.api.feignClient.*;
import com.ruoyi.chargingPile.api.model.*;
import com.ruoyi.chargingPile.api.vo.GetChargingGunByCode;
@@ -19,6 +20,7 @@
import com.ruoyi.common.core.web.page.PageInfo;
import com.ruoyi.common.redis.service.RedisService;
import com.ruoyi.common.security.service.TokenService;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.integration.api.feignClient.ChargingHandshakeClient;
import com.ruoyi.integration.api.feignClient.PlatformStartChargingReplyClient;
import com.ruoyi.integration.api.feignClient.SendMessageClient;
@@ -58,6 +60,8 @@
import com.ruoyi.payment.api.model.RefundResp;
import com.ruoyi.payment.api.model.WxPaymentRefundModel;
import com.ruoyi.payment.api.vo.*;
import com.ruoyi.system.api.domain.SysUser;
import com.ruoyi.system.api.feignClient.SysUserClient;
import io.seata.spring.annotation.GlobalTransactional;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -76,6 +80,7 @@
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.format.TextStyle;
import java.time.temporal.ChronoUnit;
import java.time.temporal.WeekFields;
import java.util.*;
import java.util.concurrent.*;
@@ -98,7 +103,8 @@
   private ChargingGunClient chargingGunClient;
   @Resource
   private TSettlementConfirmMapper tSettlementConfirmMapper;
   @Resource
   private PartnerClient partnerClient;
   @Resource
   private SiteClient siteClient;
   
@@ -882,10 +888,13 @@
            dto.setRefundReason("充电失败,取消充电订单");
            RefundResp resp = aliPaymentClient.refund(dto).getData();
            if(null != resp){
               AjaxResult success = chargingOrderStartupFailureWxRefund(resp.getOutTradeNo(), resp.getTradeNo(), "SUCCESS", null);
               if(success.isSuccess()){
                  chargingOrderRefundService.save(chargingOrderRefund);
               chargingOrderRefundService.save(chargingOrderRefund);
               try {
                  Thread.sleep(1000);
               } catch (InterruptedException e) {
                  throw new RuntimeException(e);
               }
               chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null);
            }
         }
@@ -932,7 +941,7 @@
      Long userId = tokenService.getLoginUserApplet().getUserId();
      TChargingOrder one = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getAppUserId, userId).eq(TChargingOrder::getChargingGunId, id)
            .eq(TChargingOrder::getRechargePaymentStatus, 2).eq(TChargingOrder::getDelFlag, 0).orderByDesc(TChargingOrder::getStartTime).last(" limit 0, 1"));
      if(null == one){
      if(null == one || !one.getAppUserId().equals(userId)){
         return null;
      }
      ChargingDetails chargingDetails = new ChargingDetails();
@@ -982,6 +991,10 @@
      }
      if(status == 4 || status == 5){
         return AjaxResult.error("不能重复操作");
      }
      Long userId = tokenService.getLoginUserApplet().getUserId();
      if(!order.getAppUserId().equals(userId)){
         return AjaxResult.error("权限不足");
      }
      TChargingOrder chargingOrder = new TChargingOrder();
      chargingOrder.setId(Long.valueOf(id));
@@ -1138,7 +1151,7 @@
      TChargingGun chargingGun = chargingGunClient.getChargingGunByCode(code).getData();
      TChargingOrder order = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getChargingGunId, chargingGun.getId())
            .orderByDesc(TChargingOrder::getEndTime).eq(TChargingOrder::getRechargePaymentStatus, 2).last(" limit 0, 1"));
      if(null != order && order.getStatus() != 3){
      if(null != order && order.getStatus() != 4){
         return;
      }
      
@@ -1205,6 +1218,41 @@
         }
         dto.setUserIds(data);
      }
      Long userId = tokenService.getLoginUser().getUserid();
      // 查询当前登陆人按钮权限
      SysUser sysUser = sysUserClient.getSysUser(tokenService.getLoginUser().getUserid()).getData();
      Integer roleType = sysUser.getRoleType();
      //如果没传siteId,获取当前登陆人所有的siteIds
      List<Integer> siteIds = new ArrayList<>();
      if (dto.getSiteId()==null){
         if (userId != null){
            List<GetSiteListDTO> data = siteClient.getSiteListByUserId(userId).getData();
            for (GetSiteListDTO datum : data) {
               siteIds.add(datum.getId());
            }
         }
      }else {
         siteIds.add(dto.getSiteId());
      }
      if (siteIds.isEmpty()){
         siteIds.add(-1);
      }else{
         if (roleType == 2){
            List<Integer> integers = new ArrayList<>();
            for (Integer siteId : siteIds) {
               // 校验有没有这个站点的权限
               List<Boolean> t1= partnerClient.getChargingOrderMenu(sysUser.getObjectId(),siteId).getData();
               Boolean b = t1.get(1);
               if (b){
                  integers.add(siteId);
               }
            }
            siteIds = integers;
         }
      }
      if (siteIds.isEmpty())siteIds.add(-1);
      dto.setSiteIds(siteIds);
      List<ChargingOrderVO> list = this.baseMapper.chargingOrder(pageInfo,dto,startTime1,startTime2,endTime1,endTime2);
      List<ChargingOrderVO> list1 = this.baseMapper.chargingOrder(pageInfo1,dto,startTime1,startTime2,endTime1,endTime2);
       BigDecimal total = new BigDecimal("0");
@@ -1215,7 +1263,16 @@
       BigDecimal commissionMoney = new BigDecimal("0");
       BigDecimal refundMoney = new BigDecimal("0");
       BigDecimal paymentMoney = new BigDecimal("0");
      List<String> collect2 = list.stream().map(TChargingOrder::getCode).collect(Collectors.toList());
      for (ChargingOrderVO chargingOrderVO : list) {
         if (roleType == 2){
            for (Integer siteId : siteIds) {
               // 校验有没有这个站点的权限
               List<Boolean> t1= partnerClient.getChargingOrderMenu(sysUser.getObjectId(),siteId).getData();
               chargingOrderVO.setAuthRecord(t1.get(0));
            }
         }
         chargingOrderVO.setCommissionAmount(chargingOrderVO.getOrderAmount()!=null?chargingOrderVO.getOrderAmount().multiply(new BigDecimal("0.006")):new BigDecimal("0"));
         chargingOrderVO.setPlatFormMoney(chargingOrderVO.getOrderAmount()!=null?chargingOrderVO.getOrderAmount().multiply(new BigDecimal("0.006")).setScale(2,BigDecimal.ROUND_DOWN):new BigDecimal("0"));
         chargingOrderVO.setUid(chargingOrderVO.getId()+"");
@@ -1233,10 +1290,13 @@
         // 充电订单 明细记录
         List<TChargingOrderAccountingStrategy> chargingOrderId = chargingOrderAccountingStrategyService.list(new QueryWrapper<TChargingOrderAccountingStrategy>()
               .eq("charging_order_id", chargingOrderVO.getId()));
         UploadRealTimeMonitoringData data5 = uploadRealTimeMonitoringDataClient.chargingOrderInfo(chargingOrderVO.getCode()).getData();
         if (data5!=null){
            long l = data5.getCumulative_charging_time() * 60L;
            chargingOrderVO.setChargingSecond(l);
         if (chargingOrderVO.getStartTime()!=null && chargingOrderVO.getEndTime()!=null){
            LocalDateTime startTime = chargingOrderVO.getStartTime();
            LocalDateTime endTime = chargingOrderVO.getEndTime();
            // 计算时间差 单位秒
            long between = ChronoUnit.SECONDS.between(startTime, endTime);
            chargingOrderVO.setChargingSecond(between);
         }
         // 充电时段数
         int size = chargingOrderId.size();
@@ -1257,27 +1317,31 @@
         }
      }
      List<Long> orderIds = list1.stream().map(TChargingOrder::getId).collect(Collectors.toList());
      if(orderIds.isEmpty())orderIds.add(-1L);
      List<TChargingOrderRefund> chargingOrderRefunds = chargingOrderRefundService.lambdaQuery()
            .in(TChargingOrderRefund::getChargingOrderId, orderIds)
            .eq(TChargingOrderRefund::getRefundStatus,2).list();
      for (ChargingOrderVO chargingOrderVO : list1) {
         paymentMoney= paymentMoney.add(chargingOrderVO.getPaymentAmount()!=null?chargingOrderVO.getPaymentAmount():new BigDecimal("0"));
         commissionMoney = commissionMoney.add(chargingOrderVO.getOrderAmount()!=null?chargingOrderVO.getOrderAmount().multiply(new BigDecimal("0.006")):new BigDecimal("0"));
         if (chargingOrderVO.getChargingCapacity()!=null){
            total = total.add(chargingOrderVO.getElectricity());
            total = total.add(chargingOrderVO.getElectricity()!=null?chargingOrderVO.getElectricity():new BigDecimal("0"));
         }
         // 充电订单 明细记录
         List<TChargingOrderAccountingStrategy> chargingOrderId = chargingOrderAccountingStrategyService.list(new QueryWrapper<TChargingOrderAccountingStrategy>()
               .eq("charging_order_id", chargingOrderVO.getId()));
         UploadRealTimeMonitoringData data5 = uploadRealTimeMonitoringDataClient.chargingOrderInfo(chargingOrderVO.getCode()).getData();
         if (data5!=null){
            long l = data5.getCumulative_charging_time() * 60L;
            chargingOrderVO.setChargingSecond(l);
            time+=l;
         if (chargingOrderVO.getStartTime()!=null && chargingOrderVO.getEndTime()!=null){
            LocalDateTime startTime = chargingOrderVO.getStartTime();
            LocalDateTime endTime = chargingOrderVO.getEndTime();
            // 计算时间差 单位秒
            long between = ChronoUnit.SECONDS.between(startTime, endTime);
            time+=between;
         }
         List<TChargingOrderRefund> list2 = chargingOrderRefundService.lambdaQuery().eq(TChargingOrderRefund::getRefundStatus, 2)
               .eq(TChargingOrderRefund::getChargingOrderId, chargingOrderVO.getId()).list();
         List<TChargingOrderRefund> list2 = chargingOrderRefunds.stream().filter(e -> e.getChargingOrderId() != null && e.getChargingOrderId().equals(chargingOrderVO.getId()))
               .collect(Collectors.toList());
         for (TChargingOrderRefund tChargingOrderRefund : list2) {
            if (tChargingOrderRefund.getRefundStatus()==2){
               refundMoney = refundMoney.add(tChargingOrderRefund.getRefundTotalAmount());
            }
         }
         electronicMoney = electronicMoney.add(chargingOrderVO.getElectrovalence()!=null?chargingOrderVO.getElectrovalence():new BigDecimal("0"));
         serviceMoney = serviceMoney.add(chargingOrderVO.getServiceCharge()!=null?chargingOrderVO.getServiceCharge():new BigDecimal("0"));
@@ -1336,8 +1400,8 @@
   }
   @Override
   public Map<String, Object> countAll(LocalDate sixBefore) {
      return this.baseMapper.countAll(sixBefore);
   public Map<String, Object> countAll(LocalDate sixBefore,List<Integer> siteIds) {
      return this.baseMapper.countAll(sixBefore,siteIds);
   }
   @Override
@@ -1365,7 +1429,8 @@
      return this.baseMapper.getYearData(chargingOrderIds);
   }
   @Resource
   private SysUserClient sysUserClient;
   @Override
   public ChargingOrderTimeVO chargingList(ChargingListQuery dto) {
      String startTime1 = null;
@@ -1409,9 +1474,52 @@
            dto.setCarIds(carIds);
         }
      }
      Long userId = tokenService.getLoginUser().getUserid();
      // 查询当前登陆人按钮权限
      SysUser sysUser = sysUserClient.getSysUser(tokenService.getLoginUser().getUserid()).getData();
      Integer roleType = sysUser.getRoleType();
      //如果没传siteId,获取当前登陆人所有的siteIds
      List<Integer> siteIds = new ArrayList<>();
      if (dto.getSiteId()==null){
         if (userId != null){
            List<GetSiteListDTO> data = siteClient.getSiteListByUserId(userId).getData();
            for (GetSiteListDTO datum : data) {
               siteIds.add(datum.getId());
            }
         }
      }else {
         siteIds.add(dto.getSiteId());
      }
      if (siteIds.isEmpty()){
         siteIds.add(-1);
      }else{
         if (roleType == 2){
            List<Integer> integers = new ArrayList<>();
            for (Integer siteId : siteIds) {
               // 校验有没有这个站点的权限
               List<Boolean> t1= partnerClient.getChargingOrderMenu(sysUser.getObjectId(),siteId).getData();
               Boolean b = t1.get(1);
               if (b){
                  integers.add(siteId);
               }
            }
            siteIds = integers;
         }
      }
      dto.setSiteIds(siteIds);
      PageInfo<ChargingOrderListVO> pageInfo = new PageInfo<>(dto.getPageCurr(),dto.getPageSize());
      List<ChargingOrderListVO> list = this.baseMapper.chargingList(pageInfo,dto,startTime1,startTime2,endTime1,endTime2);
      List<Integer> siteIdsList = list.stream().map(ChargingOrderListVO::getSiteId).collect(Collectors.toList());
      if (siteIdsList.isEmpty())siteIdsList.add(-1);
      List<Site> sites = siteClient.getSiteByIds(siteIdsList).getData();
      for (ChargingOrderListVO chargingOrderListVO : list) {
         if (roleType==2){
            List<Boolean> data = partnerClient.getChargingListMenu(sysUser.getObjectId(), chargingOrderListVO.getSiteId()).getData();
            chargingOrderListVO.setAuthInfo(data.get(0));
            chargingOrderListVO.setAuthCurve(data.get(1));
         }
         chargingOrderListVO.setChargingCapacity(chargingOrderListVO.getElectricity());
         BigDecimal bigDecimal = new BigDecimal("0.006");
         if (chargingOrderListVO.getOrderAmount()!=null){
@@ -1421,9 +1529,9 @@
         chargingOrderListVO.setUid(chargingOrderListVO.getId()+"");
         List<Integer> integers = new ArrayList<>();
         integers.add(chargingOrderListVO.getSiteId());
         List<Site> data = siteClient.getSiteByIds(integers).getData();
         if (!data.isEmpty()) {
            chargingOrderListVO.setSiteName(data.get(0).getName());
         Site site = sites.stream().filter(e -> e.getId().equals(chargingOrderListVO.getSiteId())).findFirst().orElse(null);
         if (site!=null){
            chargingOrderListVO.setSiteName(site.getName());
         }
         if (chargingOrderListVO.getChargingGunId()!=null && chargingOrderListVO.getChargingPileId()!=null){
            TChargingGun data1 = chargingGunClient.getChargingGunById(chargingOrderListVO.getChargingGunId()).getData();
@@ -1432,13 +1540,12 @@
               chargingOrderListVO.setTerminalName(data2.getName() + "-" + data1.getName());
            }
         }
         // 获取充电时间
         UploadRealTimeMonitoringData data5 = uploadRealTimeMonitoringDataClient.chargingOrderInfo(chargingOrderListVO.getCode()).getData();
         if (data5!=null){
            if (data5.getTime_remaining()!=null){
               chargingOrderListVO.setChargingSecond(data5.getCumulative_charging_time()*60L);
            }
         if (chargingOrderListVO.getStartTime()!=null && chargingOrderListVO.getEndTime()!=null){
            LocalDateTime startTime = chargingOrderListVO.getStartTime();
            LocalDateTime endTime = chargingOrderListVO.getEndTime();
            // 计算时间差 单位秒
            long between = ChronoUnit.SECONDS.between(startTime, endTime);
            chargingOrderListVO.setChargingSecond(between);
         }
         // 获取开始SOC 结束soc
         if (chargingOrderListVO.getCode()!=null){
@@ -1474,7 +1581,6 @@
                  }
               }
               chargingOrderListVO.setPhone(data3.getPhone());
            }
         }
         List<TChargingOrderAccountingStrategy> list2 = chargingOrderAccountingStrategyService.lambdaQuery()
@@ -1523,6 +1629,28 @@
      // 不分页
      PageInfo<ChargingOrderListVO> pageInfo1 = new PageInfo<>(1,999999999);
      List<ChargingOrderListVO> list1 = this.baseMapper.chargingList(pageInfo1,dto,startTime1,startTime2,endTime1,endTime2);
      for (ChargingOrderListVO chargingOrderListVO : list1) {
         List<Integer> integers = new ArrayList<>();
         integers.add(chargingOrderListVO.getSiteId());
         Site site = sites.stream().filter(e -> e.getId().equals(chargingOrderListVO.getSiteId())).findFirst().orElse(null);
         if (site!=null){
            chargingOrderListVO.setSiteName(site.getName());
         }
         if (chargingOrderListVO.getStartTime()!=null && chargingOrderListVO.getEndTime()!=null){
            LocalDateTime startTime = chargingOrderListVO.getStartTime();
            LocalDateTime endTime = chargingOrderListVO.getEndTime();
            // 计算时间差 单位秒
            long between = ChronoUnit.SECONDS.between(startTime, endTime);
            chargingOrderListVO.setChargingSecond(between);
         }
         if (chargingOrderListVO.getChargingGunId()!=null && chargingOrderListVO.getChargingPileId()!=null){
            TChargingGun data1 = chargingGunClient.getChargingGunById(chargingOrderListVO.getChargingGunId()).getData();
            TChargingPile data2 = chargingPileClient.getChargingPileById(chargingOrderListVO.getChargingPileId()).getData();
            if (data2 != null && data1 != null) {
               chargingOrderListVO.setTerminalName(data2.getName() + "-" + data1.getName());
            }
         }
      }
      chargingOrderTimeVO.setExportList(list1);
      chargingOrderTimeVO.setOrderCount(list1.size());
      // 计算充电总度数
@@ -1548,14 +1676,17 @@
      BigDecimal feng = new BigDecimal("0");
      BigDecimal ping = new BigDecimal("0");
      BigDecimal gu = new BigDecimal("0");
      List<Long> collect = list1.stream().map(ChargingOrderListVO::getId).collect(Collectors.toList());
      List<TChargingOrderAccountingStrategy> chargingOrderAccountingStrategies = chargingOrderAccountingStrategyService.lambdaQuery()
            .in(TChargingOrderAccountingStrategy::getChargingOrderId,collect).list();
      for (ChargingOrderListVO chargingOrderListVO : list1) {
         if (chargingOrderListVO.getChargingCapacity()!=null)electronic = electronic.add(chargingOrderListVO.getElectricity());
         if (chargingOrderListVO.getPaymentAmount()!=null)paymentAmount = paymentAmount.add(chargingOrderListVO.getPaymentAmount());
         if (chargingOrderListVO.getElectrovalence()!=null)electrovalence = electrovalence.add(chargingOrderListVO.getElectrovalence());
         if (chargingOrderListVO.getServiceCharge()!=null)serviceCharge = serviceCharge.add(chargingOrderListVO.getServiceCharge());
         List<TChargingOrderAccountingStrategy> list2 = chargingOrderAccountingStrategyService.lambdaQuery()
               .eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrderListVO.getId()).list();
         List<TChargingOrderAccountingStrategy> list2 = chargingOrderAccountingStrategies.stream().filter(e -> e.getChargingOrderId().equals(chargingOrderListVO.getId()))
               .collect(Collectors.toList());
         for (TChargingOrderAccountingStrategy temp : list2) {
            switch (temp.getType()){
               case 1:
@@ -1637,6 +1768,8 @@
   public ChargingOrderListInfoVO chargingInfo(String uid) {
      TChargingOrder chargingOrder= this.getById(uid);
      ChargingOrderListInfoVO chargingOrderListInfoVO = new ChargingOrderListInfoVO();
      chargingOrderListInfoVO.setStartTime(chargingOrder.getStartTime());
      chargingOrderListInfoVO.setEndTime(chargingOrder.getEndTime());
      chargingOrderListInfoVO.setStatus(chargingOrder.getStatus());
      BigDecimal bigDecimal = new BigDecimal("0.006");
      if (chargingOrder.getOrderAmount()!=null){
@@ -1713,13 +1846,12 @@
         chargingOrderListInfoVO.setList(data6);
      }
      // 获取充电时间
      UploadRealTimeMonitoringData data5 = uploadRealTimeMonitoringDataClient.chargingOrderInfo(chargingOrder.getCode()).getData();
      if (data5!=null){
         if (data5.getTime_remaining()!=null){
            chargingOrderListInfoVO.setChargingSecond(data5.getCumulative_charging_time()*60L+"");
         }
      if (chargingOrderListInfoVO.getStartTime()!=null && chargingOrderListInfoVO.getEndTime()!=null){
         LocalDateTime startTime = chargingOrderListInfoVO.getStartTime();
         LocalDateTime endTime = chargingOrderListInfoVO.getEndTime();
         // 计算时间差 单位秒
         long between = ChronoUnit.SECONDS.between(startTime, endTime);
         chargingOrderListInfoVO.setChargingSecond(between+"");
      }
      if (chargingOrder.getAppUserCarId()!=null){
@@ -1834,83 +1966,134 @@
      chargingOrderAccountingStrategyService.remove(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>().eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrder.getId()));
      SimpleDateFormat sdfs = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
      List<AccountingStrategyDetailOrderVo> lists = new ArrayList<>();
      for (int i = 0; i < accountingStrategyDetailOrderList.size(); i++) {
         Class<? extends TransactionRecordMessageVO> clazz = vo.getClass();
         try {
            AccountingStrategyDetailOrder strategyDetail = accountingStrategyDetailOrderList.get(i);
            //阶段(1=尖阶段,2=峰阶段,3=平阶段,4=谷阶段)
            Object invoke = null;
            switch (strategyDetail.getType()){
               case 1:
                  //充电度数
                  invoke = clazz.getMethod("getSpike_charge" + (i + 1)).invoke(vo);
      try {
         //跨天
         if(!vo.getStart_time().split(" ")[0].equals(vo.getEnd_time().split(" ")[0])){
            //当天的
            //开始通过计费策略遍历解析每个时段的费用明细
            String start_time = vo.getStart_time();
            String end_time = vo.getEnd_time();
            long start = sdfs.parse(start_time).getTime();
            long end = sdfs.parse(end_time).getTime();
            Class<? extends TransactionRecordMessageVO> clazz = vo.getClass();
            /**
             * "start_time": "2025-01-03 23:06:43.00",
             *    "end_time": "2025-01-04 00:39:39.00",
             */
            for (int i = accountingStrategyDetailOrderList.size(); i > 0; i--) {
               AccountingStrategyDetailOrder strategyDetail = accountingStrategyDetailOrderList.get(i - 1);
               long time = sdfs.parse(start_time.split(" ")[0] + " " + strategyDetail.getEndTime() + ":00").getTime();
               if(time < start){
                  break;
               case 2:
                  //充电度数
                  invoke = clazz.getMethod("getPeak_charge" + (i + 1)).invoke(vo);
                  break;
               case 3:
                  //充电度数
                  invoke = clazz.getMethod("getFlat_charge" + (i + 1)).invoke(vo);
                  break;
               case 4:
                  //充电度数
                  invoke = clazz.getMethod("getValley_charge" + (i + 1)).invoke(vo);
                  break;
               }
               //阶段(1=尖阶段,2=峰阶段,3=平阶段,4=谷阶段)
               Object invoke = null;
               switch (strategyDetail.getType()){
                  case 1:
                     //充电度数
                     invoke = clazz.getMethod("getSpike_charge" + (i)).invoke(vo);
                     break;
                  case 2:
                     //充电度数
                     invoke = clazz.getMethod("getPeak_charge" + (i)).invoke(vo);
                     break;
                  case 3:
                     //充电度数
                     invoke = clazz.getMethod("getFlat_charge" + (i)).invoke(vo);
                     break;
                  case 4:
                     //充电度数
                     invoke = clazz.getMethod("getValley_charge" + (i)).invoke(vo);
                     break;
               }
               if(null == invoke || Double.valueOf(invoke.toString()) == 0){
                  continue;
               }
               BigDecimal sharp_peak_charge = new BigDecimal(invoke.toString());
               AccountingStrategyDetailOrderVo vo1 = new AccountingStrategyDetailOrderVo();
               BeanUtils.copyProperties(strategyDetail, vo1);
               vo1.setChargingCapacity(sharp_peak_charge);
               lists.add(vo1);
            }
            if(null == invoke || Double.valueOf(invoke.toString()) == 0){
               continue;
            //第二天的
            //开始通过计费策略遍历解析每个时段的费用明细
            for (int i = 0; i < accountingStrategyDetailOrderList.size(); i++) {
               AccountingStrategyDetailOrder strategyDetail = accountingStrategyDetailOrderList.get(i);
               long time = sdfs.parse(end_time.split(" ")[0] + " " + strategyDetail.getStartTime() + ":00").getTime();
               if(time > end){
                  break;
               }
               //阶段(1=尖阶段,2=峰阶段,3=平阶段,4=谷阶段)
               Object invoke = null;
               switch (strategyDetail.getType()){
                  case 1:
                     //充电度数
                     invoke = clazz.getMethod("getSpike_charge" + (i + 1)).invoke(vo);
                     break;
                  case 2:
                     //充电度数
                     invoke = clazz.getMethod("getPeak_charge" + (i + 1)).invoke(vo);
                     break;
                  case 3:
                     //充电度数
                     invoke = clazz.getMethod("getFlat_charge" + (i + 1)).invoke(vo);
                     break;
                  case 4:
                     //充电度数
                     invoke = clazz.getMethod("getValley_charge" + (i + 1)).invoke(vo);
                     break;
               }
               if(null == invoke || Double.valueOf(invoke.toString()) == 0){
                  continue;
               }
               BigDecimal sharp_peak_charge = new BigDecimal(invoke.toString());
               AccountingStrategyDetailOrderVo vo1 = new AccountingStrategyDetailOrderVo();
               BeanUtils.copyProperties(strategyDetail, vo1);
               vo1.setChargingCapacity(sharp_peak_charge);
               lists.add(vo1);
            }
            BigDecimal sharp_peak_charge = new BigDecimal(invoke.toString());
            AccountingStrategyDetailOrderVo vo1 = new AccountingStrategyDetailOrderVo();
            BeanUtils.copyProperties(strategyDetail, vo1);
            vo1.setStart(sdfs.parse(vo.getStart_time().split(" ")[0] + " " + strategyDetail.getStartTime() + ":00").getTime());
            vo1.setEnd(sdfs.parse(vo.getStart_time().split(" ")[0] + " " + strategyDetail.getEndTime() + ":00").getTime());
            vo1.setChargingCapacity(sharp_peak_charge);
            lists.add(vo1);
         } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
         } catch (InvocationTargetException e) {
            throw new RuntimeException(e);
         } catch (NoSuchMethodException e) {
            throw new RuntimeException(e);
         } catch (ParseException e) {
            throw new RuntimeException(e);
         }else{
            for (int i = 0; i < accountingStrategyDetailOrderList.size(); i++) {
               Class<? extends TransactionRecordMessageVO> clazz = vo.getClass();
               AccountingStrategyDetailOrder strategyDetail = accountingStrategyDetailOrderList.get(i);
               //阶段(1=尖阶段,2=峰阶段,3=平阶段,4=谷阶段)
               Object invoke = null;
               switch (strategyDetail.getType()){
                  case 1:
                     //充电度数
                     invoke = clazz.getMethod("getSpike_charge" + (i + 1)).invoke(vo);
                     break;
                  case 2:
                     //充电度数
                     invoke = clazz.getMethod("getPeak_charge" + (i + 1)).invoke(vo);
                     break;
                  case 3:
                     //充电度数
                     invoke = clazz.getMethod("getFlat_charge" + (i + 1)).invoke(vo);
                     break;
                  case 4:
                     //充电度数
                     invoke = clazz.getMethod("getValley_charge" + (i + 1)).invoke(vo);
                     break;
               }
               if(null == invoke || Double.valueOf(invoke.toString()) == 0){
                  continue;
               }
               BigDecimal sharp_peak_charge = new BigDecimal(invoke.toString());
               AccountingStrategyDetailOrderVo vo1 = new AccountingStrategyDetailOrderVo();
               BeanUtils.copyProperties(strategyDetail, vo1);
               vo1.setChargingCapacity(sharp_peak_charge);
               lists.add(vo1);
            }
         }
      }
      Collections.sort(lists, new Comparator<AccountingStrategyDetailOrderVo>() {
         public int compare(AccountingStrategyDetailOrderVo s1, AccountingStrategyDetailOrderVo s2) {
            return s1.getStart() < s2.getStart() ? -1 : s1.getStart() == s2.getStart() ? 0 : 1;
         }
      });
      if(!vo.getStart_time().split(" ")[0].equals(vo.getEnd_time().split(" ")[0])){
         List<AccountingStrategyDetailOrderVo> list1 = new ArrayList<>(lists);
         for (AccountingStrategyDetailOrderVo orderVo : list1) {
            Calendar start = Calendar.getInstance();
            start.setTimeInMillis(orderVo.getStart());
            start.set(Calendar.DAY_OF_YEAR, start.get(Calendar.DAY_OF_YEAR) + 1);
            orderVo.setStart(start.getTimeInMillis());
            Calendar end = Calendar.getInstance();
            end.setTimeInMillis(orderVo.getEnd());
            end.set(Calendar.DAY_OF_YEAR, end.get(Calendar.DAY_OF_YEAR) + 1);
            orderVo.setEnd(end.getTimeInMillis());
         }
         lists.addAll(list1);
      }catch (Exception e){
         e.printStackTrace();
      }
      
      //开始处理明细
      SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SS");
      SimpleDateFormat sdf2 = new SimpleDateFormat("HH:mm");
      Date start = null;
      Date end = null;
      try {
         start = sdf3.parse(vo.getStart_time());
         end = sdf3.parse(vo.getEnd_time());
      } catch (ParseException e) {
         throw new RuntimeException(e);
      }
      for (AccountingStrategyDetailOrderVo strategyDetail : lists) {
      for (int i = 0; i < lists.size(); i++) {
         AccountingStrategyDetailOrderVo strategyDetail = lists.get(i);
         BigDecimal sharp_peak_charge = strategyDetail.getChargingCapacity();
         TChargingOrderAccountingStrategy chargingOrderAccountingStrategy = new TChargingOrderAccountingStrategy();
         chargingOrderAccountingStrategy.setChargingOrderId(chargingOrder.getId());
@@ -1919,16 +2102,17 @@
         chargingOrderAccountingStrategy.setElectrovalence(strategyDetail.getElectrovalence());
         chargingOrderAccountingStrategy.setServiceCharge(strategyDetail.getServiceCharge());
         chargingOrderAccountingStrategy.setCostServiceCharge(strategyDetail.getCostServiceCharge());
         if(start.getTime() >= strategyDetail.getStart()){
            chargingOrderAccountingStrategy.setStartTime(sdf2.format(start));
         if(i == 0){
            String time = vo.getStart_time().split(" ")[1];
            chargingOrderAccountingStrategy.setStartTime(time.substring(0, time.lastIndexOf(":")));
         }else{
            chargingOrderAccountingStrategy.setStartTime(strategyDetail.getStartTime());
         }
         if(end.getTime() >= strategyDetail.getEnd()){
            chargingOrderAccountingStrategy.setEndTime(strategyDetail.getEndTime());
         if(i == lists.size() - 1){
            String time = vo.getEnd_time().split(" ")[1];
            chargingOrderAccountingStrategy.setEndTime(time.substring(0, time.lastIndexOf(":")));
         }else{
            chargingOrderAccountingStrategy.setEndTime(sdf2.format(end));
            chargingOrderAccountingStrategy.setEndTime(strategyDetail.getEndTime());
         }
         
         //已充电总度数
@@ -1938,6 +2122,7 @@
         BigDecimal vipDiscountAmount = BigDecimal.ZERO;
         //计算优惠金额
         if(null != chargingOrder.getVipDiscount()){
            //0.58折
            vipDiscountAmount = serviceCharge.multiply(new BigDecimal(1).subtract(chargingOrder.getVipDiscount()));
            serviceCharge = serviceCharge.multiply(chargingOrder.getVipDiscount());
         }
@@ -1953,8 +2138,6 @@
         periodServicePrice_total = periodServicePrice_total.add(originalServicePrice);
         total = total.add(electrovalenc.add(originalServicePrice));
      }
      
      //原金额
      BigDecimal rechargeAmount = chargingOrder.getRechargeAmount();
@@ -2137,6 +2320,7 @@
      referralReward(chargingOrder);
      
      //开始构建退款费用
      refundAmount = refundAmount.setScale(2, RoundingMode.HALF_EVEN);
      if(refundAmount.compareTo(BigDecimal.ZERO) > 0){
         Integer rechargePaymentType = chargingOrder.getRechargePaymentType();
         //构建退款明细
@@ -2174,20 +2358,21 @@
         if(2 == rechargePaymentType){
            RefundReq dto = new RefundReq();
            dto.setOutTradeNo(chargingOrder.getCode());
            dto.setOutRequestNo(chargingOrderRefund.getCode());
            dto.setOutRequestNo(chargingOrderRefund.getRefundCode());
            dto.setRefundAmount(refundAmount.toString());
            dto.setRefundReason("充电完成退款");
            RefundResp resp = aliPaymentClient.refund(dto).getData();
            if(null != resp){
               AjaxResult success = chargingOrderStartupFailureWxRefund(resp.getOutTradeNo(), resp.getTradeNo(), "SUCCESS", null);
               if(success.isSuccess()){
                  chargingOrderRefundService.save(chargingOrderRefund);
               }
               chargingOrderRefundService.save(chargingOrderRefund);
               this.chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null);
            }
         }
         
      }
   }
   
   @Override
   public List<Map<String, Object>> getByDate(List<Long> chargingOrderIds) {
@@ -2210,8 +2395,8 @@
   }
   @Override
   public List<Map<String, Object>> usersDay() {
      return this.baseMapper.usersDay();
   public List<Map<String, Object>> usersDay(ChargingStatisticsQueryDto statisticsQueryDto) {
      return this.baseMapper.usersDay(statisticsQueryDto);
   }
   @Override
@@ -2277,6 +2462,10 @@
   private TVipOrderService vipOrderService;
   @Resource
   private TVipOrderRefundService vipOrderRefundService;
   @Override
   public R payRefund(PayOrderRefundDto payOrderQueryDto) {
         if (payOrderQueryDto.getType()==1){
@@ -2334,7 +2523,6 @@
               dto.setRefundReason("取消订单");
               RefundResp resp = aliPaymentClient.refund(dto).getData();
               if(null != resp){
                  SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-DDTHH:mm:ss+TIMEZONE");
                  chargingOrderRefund.setRefundStatus(2);
                  chargingOrderRefund.setRefundAmount((tChargingOrder.getRefundAmount()==null? BigDecimal.valueOf(0) :tChargingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount()));
                  this.baseMapper.updateById(tChargingOrder);
@@ -2342,11 +2530,6 @@
               }
            }
         }
         if (payOrderQueryDto.getType()==2){
            TShoppingOrder tChargingOrder = shoppingOrderService.getById(payOrderQueryDto.getOrderId());
@@ -2402,16 +2585,10 @@
               dto.setRefundReason("取消订单");
               RefundResp resp = aliPaymentClient.refund(dto).getData();
               if(null != resp){
                  SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-DDTHH:mm:ss+TIMEZONE");
                  tChargingOrder.setRefundStatus(2);
                  tChargingOrder.setRefundAmount((tChargingOrder.getRefundAmount()==null? BigDecimal.valueOf(0) :tChargingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount()));
                  shoppingOrderService.updateById(tChargingOrder);
                  shoppingOrderRefundService.save(chargingOrderRefund);
               }
            }
@@ -2422,8 +2599,6 @@
         if (tChargingOrder.getPaymentAmount().compareTo(payOrderQueryDto.getRefundAmount())==-1){
            return R.fail("退款金额需小于支付金额");
         }
         TVipOrderRefund chargingOrderRefund = new TVipOrderRefund();
         chargingOrderRefund.setVipOrderId(tChargingOrder.getId());
         chargingOrderRefund.setRefundAmount(payOrderQueryDto.getRefundAmount());
@@ -2469,23 +2644,13 @@
            dto.setRefundReason("取消订单");
            RefundResp resp = aliPaymentClient.refund(dto).getData();
            if(null != resp){
               SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-DDTHH:mm:ss+TIMEZONE");
               tChargingOrder.setRefundStatus(2);
               tChargingOrder.setRefundAmount((tChargingOrder.getRefundAmount()==null? BigDecimal.valueOf(0) :tChargingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount()));
               vipOrderService.updateById(tChargingOrder);
               vipOrderRefundService.save(chargingOrderRefund);
            }
         }
      }
      return R.ok();
   }
@@ -2541,7 +2706,7 @@
            .eq("recharge_payment_status",2);
      switch (dto.getType()){
         case 1:
            eq.between("start_time", localDateTime, localDateTime1);
            eq.between("pay_time", localDateTime, localDateTime1);
            break;
         case 2:
            eq.between("end_time", localDateTime, localDateTime1);
@@ -2677,9 +2842,49 @@
      }
      dto.setStartTime(startTime);
      dto.setEndTime(endTime);
      Long userId = tokenService.getLoginUser().getUserid();
      // 查询当前登陆人按钮权限
      SysUser sysUser = sysUserClient.getSysUser(tokenService.getLoginUser().getUserid()).getData();
      Integer roleType = sysUser.getRoleType();
      //如果没传siteId,获取当前登陆人所有的siteIds
      List<Integer> siteIds = new ArrayList<>();
      if (dto.getSiteIds()==null){
         if (userId != null){
            List<GetSiteListDTO> data = siteClient.getSiteListByUserId(userId).getData();
            for (GetSiteListDTO datum : data) {
               siteIds.add(datum.getId());
            }
         }
      }else {
         siteIds.add(dto.getSiteIds());
      }
      if (siteIds.isEmpty()){
         siteIds.add(-1);
      }else{
         if (roleType == 2){
            List<Integer> integers = new ArrayList<>();
            for (Integer siteId : siteIds) {
               // 校验有没有这个站点的权限
               List<Boolean> t1= partnerClient.getSettlementListMenu(sysUser.getObjectId(),siteId).getData();
               Boolean b = t1.get(2);
               if (b){
                  integers.add(siteId);
               }
            }
            siteIds = integers;
         }
      }
      dto.setSiteIdss(siteIds);
      PageInfo<TSettlementConfirm> pageInfo = new PageInfo<>(dto.getPageCurr(),dto.getPageSize());
      List<TSettlementConfirm> list = tSettlementConfirmMapper.settlementList(pageInfo,dto);
      for (TSettlementConfirm tSettlementConfirm : list) {
         if (roleType==2){
            List<Boolean> data = partnerClient.getSettlementListMenu(sysUser.getObjectId(), tSettlementConfirm.getSiteId()).getData();
            tSettlementConfirm.setAuthDownLoad(data.get(0));
            tSettlementConfirm.setAuthDelete(data.get(1));
         }
         tSettlementConfirm.setUid(tSettlementConfirm.getId().toString());
         List<Site> data1 = siteClient.getSiteByIds(Arrays.asList(tSettlementConfirm.getSiteId())).getData();
         if (!data1.isEmpty()){
@@ -2702,12 +2907,265 @@
   @Override
   public SettlementTotalVO settlementTotal(String time) {
      Long userId = tokenService.getLoginUser().getUserid();
      //如果没传siteId,获取当前登陆人所有的siteIds
      List<Integer> siteIds = new ArrayList<>();
      if (userId != null){
            List<GetSiteListDTO> data = siteClient.getSiteListByUserId(userId).getData();
            for (GetSiteListDTO datum : data) {
               siteIds.add(datum.getId());
            }
      }
      if (siteIds.isEmpty()){
         siteIds.add(-1);
      }
      SettlementTotalVO res = new SettlementTotalVO();
      List<TSettlementConfirm> list1 = tSettlementConfirmMapper.settlementTotal(time);
      List<TSettlementConfirm> list1 = tSettlementConfirmMapper.settlementTotal(time,siteIds);
      LocalDateTime parse = LocalDateTime.parse(time, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
      // 减少一个月
      LocalDateTime minus = parse.minusMonths(1);
      List<TSettlementConfirm> list2 = tSettlementConfirmMapper.settlementTotal(time);
      List<TSettlementConfirm> list2 = tSettlementConfirmMapper.settlementTotal(time,siteIds);
      // 合计
      List<TSettlementConfirm> total = new ArrayList<>();
      TSettlementConfirm tSettlementConfirm1 = new TSettlementConfirm();
      BigDecimal meteringElectronic = new BigDecimal("0");
      BigDecimal chargingElectronic = new BigDecimal("0");
      BigDecimal lossElectronic = new BigDecimal("0");
      BigDecimal income = new BigDecimal("0");
      BigDecimal venue = new BigDecimal("0");
      BigDecimal metering = new BigDecimal("0");
      BigDecimal clean = new BigDecimal("0");
      BigDecimal maintain = new BigDecimal("0");
      BigDecimal cost = new BigDecimal("0");
      BigDecimal profitMoney = new BigDecimal("0");
      BigDecimal newMoney = new BigDecimal("0");
      BigDecimal newSettlement = new BigDecimal("0");
      BigDecimal supplyElectronic = new BigDecimal("0");
      BigDecimal proportionPartner = new BigDecimal("0");
      BigDecimal proportionMoney = new BigDecimal("0");
      BigDecimal totalElectronic = new BigDecimal("0");
      BigDecimal totalService = new BigDecimal("0");
      BigDecimal servicePartner = new BigDecimal("0");
      BigDecimal serviceMoney = new BigDecimal("0");
      BigDecimal sharingAmount = new BigDecimal("0");
      BigDecimal commissionAmount = new BigDecimal("0");
      BigDecimal electrovalence = new BigDecimal("0");
      BigDecimal serviceCharge = new BigDecimal("0");
      BigDecimal orderCommission = new BigDecimal("0");
      BigDecimal vipDiscount = new BigDecimal("0");
      BigDecimal couponDiscount = new BigDecimal("0");
//      tSettlementConfirm1.setIncomePercentage();
//      tSettlementConfirm1.setTotalPercentage();
      tSettlementConfirm1.setElectronicRefund(0);
      // 上月成本合计
      BigDecimal beforeCost= new BigDecimal("0");
      // 上月利润合计
      BigDecimal beforeIncome= new BigDecimal("0");
      int i = 1;
      for (TSettlementConfirm tSettlementConfirm : list1) {
         tSettlementConfirm.setXuhao(i);
         tSettlementConfirm.setMetering(tSettlementConfirm.getSupplyElectronic());
         List<Site> data1 = siteClient.getSiteByIds(Arrays.asList(tSettlementConfirm.getSiteId())).getData();
         if (!data1.isEmpty()){
            tSettlementConfirm.setSiteName(data1.get(0).getName());
         }
         if (tSettlementConfirm.getMeteringElectronic()!=null){
            meteringElectronic = meteringElectronic.add(tSettlementConfirm.getMeteringElectronic());
            chargingElectronic = chargingElectronic.add(tSettlementConfirm.getChargingElectronic());
         }
         if (tSettlementConfirm.getLossElectronic()!=null){
            lossElectronic = lossElectronic.add(tSettlementConfirm.getLossElectronic());
         }
         income = income.add(tSettlementConfirm.getIncome());
         venue = venue.add(tSettlementConfirm.getVenue());
         metering = metering.add(tSettlementConfirm.getMetering());
         clean = clean.add(tSettlementConfirm.getClean());
         maintain = maintain.add(tSettlementConfirm.getMaintain());
         cost = cost.add(tSettlementConfirm.getCost());
         profitMoney = profitMoney.add(tSettlementConfirm.getProfitMoney());
         newMoney = newMoney.add(tSettlementConfirm.getNewMoney());
         newSettlement = newSettlement.add(tSettlementConfirm.getNewSettlement());
         supplyElectronic = supplyElectronic.add(tSettlementConfirm.getSupplyElectronic());
         proportionPartner = proportionPartner.add(tSettlementConfirm.getProportionPartner());
         proportionMoney = proportionMoney.add(tSettlementConfirm.getProportionMoney());
         totalElectronic = totalElectronic.add(tSettlementConfirm.getTotalElectronic());
         totalService = totalService.add(tSettlementConfirm.getTotalService());
         servicePartner = servicePartner.add(tSettlementConfirm.getServicePartner());
         serviceMoney = serviceMoney.add(tSettlementConfirm.getServiceMoney());
         sharingAmount = sharingAmount.add(tSettlementConfirm.getSharingAmount());
         commissionAmount = commissionAmount.add(tSettlementConfirm.getCommissionAmount());
         electrovalence = electrovalence.add(tSettlementConfirm.getElectrovalence());
         serviceCharge = serviceCharge.add(tSettlementConfirm.getServiceCharge());
         orderCommission = orderCommission.add(tSettlementConfirm.getOrderCommission());
         vipDiscount = vipDiscount.add(tSettlementConfirm.getVipDiscount());
         couponDiscount = couponDiscount.add(tSettlementConfirm.getCouponDiscount());
         // 查询结算确认单开始时间和结束时间的单子
         QueryWrapper<TChargingOrder> eq = new QueryWrapper<TChargingOrder>()
               .eq("site_id", tSettlementConfirm.getSiteId())
               .eq("recharge_payment_status",2);
         switch (tSettlementConfirm.getType()){
            case 1:
               eq.between("start_time", tSettlementConfirm.getStartTime(), tSettlementConfirm.getEndTime());
               break;
            case 2:
               eq.between("end_time", tSettlementConfirm.getStartTime(), tSettlementConfirm.getEndTime());
               break;
         }
         List<TChargingOrder> tChargingOrders = this.baseMapper.selectList(eq);
         Map<String,TChargingOrder> map = new HashMap<>();
         StringBuilder stringBuilder = new StringBuilder();
         for (TChargingOrder tChargingOrder : tChargingOrders) {
            stringBuilder.append(tChargingOrder.getCode()).append(",");
         }
         // 充电总时长
         Long temp = 1L;
         if (StringUtils.hasLength(stringBuilder.toString())){
            String substring = stringBuilder.substring(0, stringBuilder.length() - 1);
            for (String s : substring.split(",")) {
               UploadRealTimeMonitoringData data6 = uploadRealTimeMonitoringDataClient.chargingOrderInfo(s).getData();
               if (data6!=null){
                  temp+=(data6.getCumulative_charging_time()*60);
               }
            }
         }
         List<TChargingPile> data = siteClient.getPileListBySiteId(tSettlementConfirm.getSiteId()).getData();
         // 计算充电桩的功率平均值
         BigDecimal bigDecimal = new BigDecimal("0");
         for (TChargingPile datum : data) {
            bigDecimal = bigDecimal.add(datum.getRatedPower());
         }
         tSettlementConfirm.setIncome(tSettlementConfirm.getElectrovalence().add(tSettlementConfirm.getServiceCharge()));
         //利用率=充电量/(桩数量*功率*时间)
         List<TChargingPile> data2 = chargingPileClient.getChargingPileBySiteId(tSettlementConfirm.getSiteId()).getData();
         BigDecimal bigDecimal2 = new BigDecimal("0");
         if (data2!=null && (!data2.isEmpty())){
            for (TChargingPile tChargingPile : data2) {
               bigDecimal2 = bigDecimal2.add(tChargingPile.getRatedPower());
            }
            BigDecimal bigDecimal1 = new BigDecimal(data2.size()+"");
            // 平均功率
            BigDecimal divide = bigDecimal2.divide(bigDecimal1, 2, RoundingMode.HALF_DOWN);
            // 充电量
            BigDecimal chargingElectronic1 = tSettlementConfirm.getChargingElectronic();
            // 桩数量
            BigDecimal bigDecimal3 = new BigDecimal(data2.size());
            BigDecimal multiply = chargingElectronic1.multiply(new BigDecimal("24"));
            BigDecimal multiply1 = bigDecimal3.multiply(divide).multiply(new BigDecimal(temp));
            tSettlementConfirm.setRate(chargingElectronic1.divide(multiply1,2,RoundingMode.HALF_DOWN)+"");
         }else{
            tSettlementConfirm.setRate("");
         }
         for (TSettlementConfirm settlementConfirm : list2) {
            int value = parse.getMonth().getValue();
            settlementConfirm.setMonth(value);
            settlementConfirm.setIncome(settlementConfirm.getElectrovalence().add(settlementConfirm.getServiceCharge()));
            tSettlementConfirm.setMetering(tSettlementConfirm.getSupplyElectronic());
            if (tSettlementConfirm.getSiteId().equals(settlementConfirm.getSiteId())){
               // 电站相同比较收入涨幅跌幅
               if (tSettlementConfirm.getIncome().compareTo(BigDecimal.ZERO)>0){
                  BigDecimal subtract = tSettlementConfirm.getIncome().subtract(settlementConfirm.getIncome()).divide(tSettlementConfirm.getIncome(),2, RoundingMode.HALF_DOWN).multiply(new BigDecimal("100"));
                  tSettlementConfirm.setIncomePercentage(subtract+"%");
               }else {
                  tSettlementConfirm.setIncomePercentage("100"+"%");
               }
               // 比较总利润 收入合计-成本合计
               BigDecimal subtract1 = tSettlementConfirm.getIncome().subtract(tSettlementConfirm.getCost());
               BigDecimal subtract2 = settlementConfirm.getIncome().subtract(settlementConfirm.getCost());
               BigDecimal bigDecimal1 = subtract1.subtract(subtract2)
                     .divide(subtract2, 2, RoundingMode.HALF_DOWN)
                     .multiply(new BigDecimal("100"))
                     .setScale(2, RoundingMode.HALF_DOWN);
               tSettlementConfirm.setTotalPercentage(bigDecimal1+"%");            }
            beforeCost = beforeCost.add(settlementConfirm.getCost());
            beforeIncome = beforeIncome.add(settlementConfirm.getIncome());
         }
         i++;
      }
      TSettlementConfirm tSettlementConfirm = new TSettlementConfirm();
      tSettlementConfirm.setMonth(parse.getMonthValue());
      tSettlementConfirm.setMeteringElectronic(meteringElectronic);
      tSettlementConfirm.setChargingElectronic(chargingElectronic);
      tSettlementConfirm.setLossElectronic(lossElectronic);
      tSettlementConfirm.setIncome(income);
      tSettlementConfirm.setVenue(venue);
      tSettlementConfirm.setMetering(metering);
      tSettlementConfirm.setClean(clean);
      tSettlementConfirm.setMaintain(maintain);
      tSettlementConfirm.setCost(cost);
      tSettlementConfirm.setProfitMoney(profitMoney);
      tSettlementConfirm.setNewMoney(newMoney);
      tSettlementConfirm.setNewSettlement(newSettlement);
      tSettlementConfirm.setSupplyElectronic(supplyElectronic);
      tSettlementConfirm.setProportionPartner(proportionPartner);
      tSettlementConfirm.setProportionMoney(proportionMoney);
      tSettlementConfirm.setTotalElectronic(totalElectronic);
      tSettlementConfirm.setTotalService(totalService);
      tSettlementConfirm.setServicePartner(servicePartner);
      tSettlementConfirm.setServiceMoney(serviceMoney);
      tSettlementConfirm.setSharingAmount(sharingAmount);
      tSettlementConfirm.setCommissionAmount(commissionAmount);
      tSettlementConfirm.setElectrovalence(electrovalence);
      tSettlementConfirm.setServiceCharge(serviceCharge);
      tSettlementConfirm.setOrderCommission(orderCommission);
      tSettlementConfirm.setVipDiscount(vipDiscount);
      tSettlementConfirm.setCouponDiscount(couponDiscount);
      // 本月
      if (beforeIncome.compareTo(new BigDecimal("0")) == 0){
         tSettlementConfirm.setIncomePercentage(0+"%");
         tSettlementConfirm.setIncomePercentage(0+"%");
      }else{
         BigDecimal subtract = income.subtract(beforeIncome).divide(beforeIncome,2,RoundingMode.HALF_DOWN).multiply(new BigDecimal("100"));
         tSettlementConfirm.setIncomePercentage(subtract+"%");
         tSettlementConfirm.setIncomePercentage(subtract+"%");
      }
      // 比较总利润 收入合计-成本合计
      BigDecimal subtract1 = income.subtract(cost);
      BigDecimal subtract2 = beforeIncome.subtract(beforeCost);
      if (subtract2.compareTo(new BigDecimal("0")) == 0){
         tSettlementConfirm.setTotalPercentage(0+"%");
      }else{
         tSettlementConfirm.setTotalPercentage(subtract1.subtract(subtract2).divide(subtract2,2, RoundingMode.HALF_DOWN).setScale(2, RoundingMode.HALF_DOWN).multiply(new BigDecimal("100"))+"%");
      }
      tSettlementConfirm.setElectronicRefund(0);
      // 查询上次汇报数据 进行比对涨幅跌幅
      total.add(tSettlementConfirm);
      res.setList1(list1);
      res.setList2(total);
      return res;
   }
   @Override
   public SettlementTotalVO settlementTotalR(String time,Long userId) {
      //如果没传siteId,获取当前登陆人所有的siteIds
      List<Integer> siteIds = new ArrayList<>();
      if (userId != null){
            List<GetSiteListDTO> data = siteClient.getSiteListByUserId(userId).getData();
            for (GetSiteListDTO datum : data) {
               siteIds.add(datum.getId());
            }
      }
      if (siteIds.isEmpty()){
         siteIds.add(-1);
      }
      SettlementTotalVO res = new SettlementTotalVO();
      List<TSettlementConfirm> list1 = tSettlementConfirmMapper.settlementTotal(time,siteIds);
      LocalDateTime parse = LocalDateTime.parse(time, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
      // 减少一个月
      LocalDateTime minus = parse.minusMonths(1);
      List<TSettlementConfirm> list2 = tSettlementConfirmMapper.settlementTotal(time,siteIds);
      // 合计
      List<TSettlementConfirm> total = new ArrayList<>();
@@ -3010,6 +3468,10 @@
   public EndOfChargePageInfo getEndOfChargePageInfo(String id) {
      EndOfChargePageInfo info = new EndOfChargePageInfo();
      TChargingOrder chargingOrder = this.getById(id);
      Long userId = tokenService.getLoginUserApplet().getUserId();
      if(!chargingOrder.getAppUserId().equals(userId)){
         throw new RuntimeException("权限不足");
      }
      info.setId(id);
      info.setCode(chargingOrder.getCode());
      info.setPaymentAmount(chargingOrder.getPaymentAmount());