longz
2026-07-18 9c3aae72bb1faf4cedcc8f91b5a53f0bf2c4f91a
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -2548,17 +2548,84 @@
   
   @Override
   public TCharingOrderVO chargingOrder(ChargingOrderQuery dto) {
      TCharingOrderVO summary = chargingOrderSummary(dto);
      summary.setList(chargingOrderList(dto));
      return summary;
   }
   @Override
   public PageInfo<ChargingOrderVO> chargingOrderList(ChargingOrderQuery dto) {
      String[] timeRange = parseChargingOrderTimeRange(dto);
      String startTime1 = timeRange[0];
      String startTime2 = timeRange[1];
      String endTime1 = timeRange[2];
      String endTime2 = timeRange[3];
      PageInfo<ChargingOrderVO> pageInfo = new PageInfo<>(dto.getPageCurr(), dto.getPageSize());
      if (StringUtils.hasLength(dto.getPhone())) {
         List<Long> data = appUserClient.getUserIdsByPhone(dto.getPhone()).getData();
         if (data == null || data.isEmpty()) {
            return pageInfo;
         }
         dto.setUserIds(data);
      }
      Long userId = tokenService.getLoginUser().getUserid();
      SysUser sysUser = sysUserClient.getSysUser(userId).getData();
      Integer roleType = sysUser.getRoleType();
      setChargingOrderAuthSiteIds(dto, sysUser, userId, roleType);
      List<ChargingOrderVO> list = this.baseMapper.chargingOrder(pageInfo, dto, startTime1, startTime2, endTime1, endTime2);
      fillChargingOrderBalanceIncome(list);
      fillChargingOrderShareIncome(list);
      fillChargingOrderPageExtra(list, dto.getSiteIds(), sysUser, roleType);
      pageInfo.setRecords(list);
      return pageInfo;
   }
   @Override
   public TCharingOrderVO chargingOrderSummary(ChargingOrderQuery dto) {
      TCharingOrderVO tCharingOrderVO = new TCharingOrderVO();
      List<TChargingGun> allGun = chargingGunClient.getAllGun().getData();
      List<TChargingPile> allPile = chargingGunClient.getAllPile().getData();
      List<Site> data9 = siteClient.getSiteAll().getData();
      List<TAppUser> data6 = appUserClient.getAllUser().getData();
      List<TAppUserCar> data4 = appUserCarClient.getAllCar().getData();
      fillEmptyChargingOrderSummary(tCharingOrderVO);
      String[] timeRange = parseChargingOrderTimeRange(dto);
      String startTime1 = timeRange[0];
      String startTime2 = timeRange[1];
      String endTime1 = timeRange[2];
      String endTime2 = timeRange[3];
      if (StringUtils.hasLength(dto.getPhone())) {
         List<Long> data = appUserClient.getUserIdsByPhone(dto.getPhone()).getData();
         if (data == null || data.isEmpty()) {
            return tCharingOrderVO;
         }
         dto.setUserIds(data);
      }
      Long userId = tokenService.getLoginUser().getUserid();
      SysUser sysUser = sysUserClient.getSysUser(userId).getData();
      setChargingOrderAuthSiteIds(dto, sysUser, userId, sysUser.getRoleType());
      Map<String, Object> map = this.baseMapper.chargingOrderBaseSummary(dto, startTime1, startTime2, endTime1, endTime2);
      if (null != map) {
         tCharingOrderVO.setTotal(getSummaryDecimal(map, "total"));
         tCharingOrderVO.setTime(getSummaryLong(map, "time"));
         tCharingOrderVO.setIncome(getSummaryDecimal(map, "income"));
         tCharingOrderVO.setElectronicMoney(getSummaryDecimal(map, "electronicMoney"));
         tCharingOrderVO.setServiceMoney(getSummaryDecimal(map, "serviceMoney"));
         tCharingOrderVO.setWechatIncome(getSummaryDecimal(map, "wechatIncome"));
         tCharingOrderVO.setAlipayIncome(getSummaryDecimal(map, "alipayIncome"));
         tCharingOrderVO.setWhitelistChargingIncome(getSummaryDecimal(map, "whitelistChargingIncome"));
         tCharingOrderVO.setWhitelistRefund(getSummaryDecimal(map, "whitelistRefund"));
      }
      List<Long> summaryOrderIds = this.baseMapper.chargingOrderSummaryOrderIds(dto, startTime1, startTime2, endTime1, endTime2);
      Map<String, Object> shareIncomeMap = getChargingOrderShareIncomeSummary(summaryOrderIds);
      tCharingOrderVO.setPlatformIncomeTotal(getSummaryDecimal(shareIncomeMap, "platformIncomeTotal"));
      tCharingOrderVO.setPartnerIncomeTotal(getSummaryDecimal(shareIncomeMap, "partnerIncomeTotal"));
      Map<String, Object> balanceMap = getExchangeCodeBalanceSummary(summaryOrderIds);
      tCharingOrderVO.setBalanceIncome(getSummaryDecimal(balanceMap, "balanceIncome"));
      tCharingOrderVO.setBalanceGiftIncome(getSummaryDecimal(balanceMap, "balanceGiftIncome"));
      return tCharingOrderVO;
   }
   private String[] parseChargingOrderTimeRange(ChargingOrderQuery dto) {
      String startTime1 = null;
      String startTime2 = null;
      String endTime1 = null;
      String endTime2 = null;
      if (StringUtils.hasLength(dto.getStartTime())) {
         String[] split = dto.getStartTime().split(" - ");
         startTime1 = split[0];
@@ -2569,115 +2636,76 @@
         endTime1 = split[0];
         endTime2 = split[1];
      }
      PageInfo<ChargingOrderVO> pageInfo = new PageInfo<>(dto.getPageCurr(), dto.getPageSize());
      if (StringUtils.hasLength(dto.getPhone())) {
         List<Long> data = appUserClient.getUserIdsByPhone(dto.getPhone()).getData();
         if (data.isEmpty()) {
            tCharingOrderVO.setList(pageInfo);
            return tCharingOrderVO;
         }
         dto.setUserIds(data);
      return new String[]{startTime1, startTime2, endTime1, endTime2};
   }
   private void fillChargingOrderPageExtra(List<ChargingOrderVO> list, List<Integer> siteIds, SysUser sysUser, Integer roleType) {
      if (list == null || list.isEmpty()) {
         return;
      }
      Long userId = tokenService.getLoginUser().getUserid();
      // 查询当前登陆人按钮权限
      SysUser sysUser = sysUserClient.getSysUser(tokenService.getLoginUser().getUserid()).getData();
      Integer roleType = sysUser.getRoleType();
         setChargingOrderAuthSiteIds(dto, sysUser, userId, roleType);
         List<Integer> siteIds = dto.getSiteIds();
         List<ChargingOrderVO> list = this.baseMapper.chargingOrder(pageInfo, dto, startTime1, startTime2, endTime1, endTime2);
         fillChargingOrderBalanceIncome(list);
         fillChargingOrderShareIncome(list);
         List<TChargingOrderAccountingStrategy> list3 = chargingOrderAccountingStrategyService.list();
      List<Long> orderIds = list.stream().map(ChargingOrderVO::getId).filter(Objects::nonNull).collect(Collectors.toList());
      List<Integer> pageSiteIds = list.stream().map(ChargingOrderVO::getSiteId).filter(Objects::nonNull).distinct().collect(Collectors.toList());
      List<Integer> pageGunIds = list.stream().map(ChargingOrderVO::getChargingGunId).filter(Objects::nonNull).distinct().collect(Collectors.toList());
      List<TChargingGun> pageGuns = pageGunIds.isEmpty() ? new ArrayList<>() : Optional.ofNullable(chargingGunClient.getChargingGunByIds(pageGunIds).getData()).orElse(new ArrayList<>());
      Map<Integer, TChargingGun> gunMap = pageGuns.stream()
            .filter(item -> item.getId() != null)
            .collect(Collectors.toMap(TChargingGun::getId, item -> item, (a, b) -> a));
      List<TChargingPile> pagePiles = pageSiteIds.isEmpty() ? new ArrayList<>() : Optional.ofNullable(chargingPileClient.getChargingPileBySiteIds(pageSiteIds).getData()).orElse(new ArrayList<>());
      Map<Integer, TChargingPile> pileMap = pagePiles.stream()
            .filter(item -> item.getId() != null)
            .collect(Collectors.toMap(TChargingPile::getId, item -> item, (a, b) -> a));
      List<Site> pageSites = pageSiteIds.isEmpty() ? new ArrayList<>() : Optional.ofNullable(siteClient.getSiteByIds(pageSiteIds).getData()).orElse(new ArrayList<>());
      Map<Integer, Site> siteMap = pageSites.stream()
            .filter(item -> item.getId() != null)
            .collect(Collectors.toMap(Site::getId, item -> item, (a, b) -> a));
      Map<Long, List<TChargingOrderAccountingStrategy>> strategyMap = orderIds.isEmpty() ? new HashMap<>() :
            chargingOrderAccountingStrategyService.lambdaQuery()
                  .in(TChargingOrderAccountingStrategy::getChargingOrderId, orderIds)
                  .list()
                  .stream()
                  .collect(Collectors.groupingBy(TChargingOrderAccountingStrategy::getChargingOrderId));
      Map<Integer, Boolean> authRecordMap = new HashMap<>();
      if (roleType == 2 && siteIds != null) {
         for (Integer siteId : siteIds) {
            List<Boolean> permission = partnerClient.getChargingOrderMenu(sysUser.getObjectId(), siteId).getData();
            authRecordMap.put(siteId, permission != null && !permission.isEmpty() && Boolean.TRUE.equals(permission.get(0)));
         }
      }
      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));
            }
         if (roleType == 2 && chargingOrderVO.getSiteId() != null) {
            chargingOrderVO.setAuthRecord(Boolean.TRUE.equals(authRecordMap.get(chargingOrderVO.getSiteId())));
         }
         chargingOrderVO.setCommissionAmount(chargingOrderVO.getRechargeAmount() != null ? chargingOrderVO.getRechargeAmount().multiply(new BigDecimal("0.006")) : new BigDecimal("0"));
         chargingOrderVO.setPlatFormMoney(chargingOrderVO.getRechargeAmount() != null ? chargingOrderVO.getRechargeAmount().multiply(new BigDecimal("0.006")).setScale(2, BigDecimal.ROUND_DOWN) : new BigDecimal("0"));
         chargingOrderVO.setUid(chargingOrderVO.getId() + "");
         TChargingGun data3 = allGun.stream().filter(e -> e.getId().equals(chargingOrderVO.getChargingGunId())).findFirst().orElse(null);
         TChargingPile data2 = allPile.stream().filter(e -> e.getId().equals(chargingOrderVO.getChargingPileId())).findFirst().orElse(null);
         if (chargingOrderVO.getSiteId() != null) {
            List<Integer> integers = new ArrayList<>();
            integers.add(chargingOrderVO.getSiteId());
            Site site = data9.stream().filter(e -> e.getId().equals(chargingOrderVO.getSiteId())).findFirst().orElse(null);
            if (site != null) chargingOrderVO.setSiteName(site.getName());
         Site site = siteMap.get(chargingOrderVO.getSiteId());
         if (site != null) {
            chargingOrderVO.setSiteName(site.getName());
         }
         if (data2 != null && data3 != null) {
            chargingOrderVO.setTerminalName(data2.getName() + "-" + data3.getName());
         TChargingGun gun = gunMap.get(chargingOrderVO.getChargingGunId());
         TChargingPile pile = pileMap.get(chargingOrderVO.getChargingPileId());
         if (pile != null && gun != null) {
            chargingOrderVO.setTerminalName(pile.getName() + "-" + gun.getName());
         }
         // 充电订单 明细记录
         List<TChargingOrderAccountingStrategy> chargingOrderId = list3.stream().filter(e -> e.getChargingOrderId().equals(chargingOrderVO.getId())).collect(Collectors.toList());
         List<TChargingOrderAccountingStrategy> strategies = strategyMap.getOrDefault(chargingOrderVO.getId(), new ArrayList<>());
         if (chargingOrderVO.getStartTime() != null && chargingOrderVO.getEndTime() != null) {
            LocalDateTime startTime = chargingOrderVO.getStartTime();
            LocalDateTime endTime = chargingOrderVO.getEndTime();
            // 计算时间差 单位秒
            long between = ChronoUnit.SECONDS.between(startTime, endTime);
            long between = ChronoUnit.SECONDS.between(chargingOrderVO.getStartTime(), chargingOrderVO.getEndTime());
            chargingOrderVO.setChargingSecond(between);
            BigDecimal electronic_reduce = chargingOrderId.stream().map(TChargingOrderAccountingStrategy::getPeriodElectricPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
            chargingOrderVO.setElectrovalence(electronic_reduce);
            BigDecimal service_reduce = chargingOrderId.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add);
            if (!chargingOrderVO.getOrderSource().equals(2)) {
               chargingOrderVO.setServiceCharge(service_reduce);
            BigDecimal electronicReduce = strategies.stream().map(TChargingOrderAccountingStrategy::getPeriodElectricPrice).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
            chargingOrderVO.setElectrovalence(electronicReduce);
            BigDecimal serviceReduce = strategies.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
            if (!Objects.equals(chargingOrderVO.getOrderSource(), 2)) {
               chargingOrderVO.setServiceCharge(serviceReduce);
               chargingOrderVO.setSharingAmount(BigDecimal.ZERO);
            } else {
               chargingOrderVO.setServiceCharge(service_reduce.multiply(new BigDecimal("0.8")));
               chargingOrderVO.setSharingAmount(service_reduce.multiply(new BigDecimal("0.2")));
               chargingOrderVO.setServiceCharge(serviceReduce.multiply(new BigDecimal("0.8")));
               chargingOrderVO.setSharingAmount(serviceReduce.multiply(new BigDecimal("0.2")));
            }
         }
         // 充电时段数
         int size = chargingOrderId.size();
         chargingOrderVO.setCount(size);
         // 用户手机号
         TAppUser data = data6.stream().filter(e -> e.getId().equals(chargingOrderVO.getAppUserId())).findFirst().orElse(null);
         if (data != null) {
            // 车牌号
            chargingOrderVO.setPhone(data.getPhone());
            List<Long> longs = new ArrayList<>();
            if (chargingOrderVO.getAppUserCarId() != null) {
               longs.add(chargingOrderVO.getAppUserCarId());
               TAppUserCar tAppUserCar = data4.stream().filter(e -> e.getId().equals(chargingOrderVO.getAppUserCarId())).findFirst().orElse(null);
               if (tAppUserCar != null) {
                  chargingOrderVO.setLicensePlate(tAppUserCar.getLicensePlate());
               }
            } else {
               chargingOrderVO.setLicensePlate(chargingOrderVO.getPlateNum());
            }
         }
         chargingOrderVO.setCount(strategies.size());
         chargingOrderVO.setLicensePlate(chargingOrderVO.getPlateNum());
      }
      fillEmptyChargingOrderSummary(tCharingOrderVO);
      Map<String, Object> map = this.baseMapper.chargingOrderNolimit(dto, startTime1, startTime2, endTime1, endTime2);
      if (null != map) {
         tCharingOrderVO.setTotal(getSummaryDecimal(map, "total"));
         tCharingOrderVO.setTime(getSummaryLong(map, "time"));
         tCharingOrderVO.setIncome(getSummaryDecimal(map, "income"));
         tCharingOrderVO.setElectronicMoney(getSummaryDecimal(map, "electronicMoney"));
         tCharingOrderVO.setServiceMoney(getSummaryDecimal(map, "serviceMoney"));
      }
      Map<String, Object> fundMap = this.baseMapper.chargingOrderFundSummary(dto, startTime1, startTime2, endTime1, endTime2);
      if (null != fundMap) {
         tCharingOrderVO.setWechatIncome(getSummaryDecimal(fundMap, "wechatIncome"));
         tCharingOrderVO.setAlipayIncome(getSummaryDecimal(fundMap, "alipayIncome"));
         tCharingOrderVO.setWhitelistChargingIncome(getSummaryDecimal(fundMap, "whitelistChargingIncome"));
         tCharingOrderVO.setWhitelistRefund(getSummaryDecimal(fundMap, "whitelistRefund"));
      }
      Map<String, Object> shareIncomeMap = getChargingOrderShareIncomeSummary(dto, startTime1, startTime2, endTime1, endTime2);
      tCharingOrderVO.setPlatformIncomeTotal(getSummaryDecimal(shareIncomeMap, "platformIncomeTotal"));
      tCharingOrderVO.setPartnerIncomeTotal(getSummaryDecimal(shareIncomeMap, "partnerIncomeTotal"));
      Map<String, Object> balanceMap = getExchangeCodeBalanceSummary(dto, startTime1, startTime2, endTime1, endTime2);
      tCharingOrderVO.setBalanceIncome(getSummaryDecimal(balanceMap, "balanceIncome"));
      tCharingOrderVO.setBalanceGiftIncome(getSummaryDecimal(balanceMap, "balanceGiftIncome"));
      pageInfo.setRecords(list);
      tCharingOrderVO.setList(pageInfo);
         return tCharingOrderVO;
      }
   }
      /**
       * 填充充电桩订单列表余额收入,余额收入按真实充值余额统计,赠送余额单独展示。
@@ -2827,11 +2855,10 @@
   /**
    * 汇总充电桩订单余额收入,兑换码使用记录的usedAmount包含赠送余额,SQL中需扣除giftUsedAmount。
    */
   private Map<String, Object> getExchangeCodeBalanceSummary(ChargingOrderQuery dto, String startTime1, String startTime2, String endTime1, String endTime2) {
   private Map<String, Object> getExchangeCodeBalanceSummary(List<Long> orderIds) {
      Map<String, Object> totalMap = new HashMap<>();
      totalMap.put("balanceIncome", BigDecimal.ZERO);
      totalMap.put("balanceGiftIncome", BigDecimal.ZERO);
      List<Long> orderIds = this.baseMapper.chargingOrderSummaryOrderIds(dto, startTime1, startTime2, endTime1, endTime2);
      if (orderIds == null || orderIds.isEmpty()) {
         return totalMap;
      }
@@ -2851,11 +2878,10 @@
      return totalMap;
   }
   private Map<String, Object> getChargingOrderShareIncomeSummary(ChargingOrderQuery dto, String startTime1, String startTime2, String endTime1, String endTime2) {
   private Map<String, Object> getChargingOrderShareIncomeSummary(List<Long> orderIds) {
      Map<String, Object> totalMap = new HashMap<>();
      totalMap.put("platformIncomeTotal", BigDecimal.ZERO);
      totalMap.put("partnerIncomeTotal", BigDecimal.ZERO);
      List<Long> orderIds = this.baseMapper.chargingOrderSummaryOrderIds(dto, startTime1, startTime2, endTime1, endTime2);
      if (orderIds == null || orderIds.isEmpty()) {
         return totalMap;
      }