package com.ruoyi.order.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.account.api.feignClient.AppUserCarClient; import com.ruoyi.account.api.feignClient.AppUserClient; import com.ruoyi.account.api.model.TAppUser; import com.ruoyi.account.api.model.TAppUserCar; import com.ruoyi.chargingPile.api.dto.GetSiteListDTO; import com.ruoyi.chargingPile.api.feignClient.ChargingGunClient; import com.ruoyi.chargingPile.api.feignClient.ChargingPileClient; import com.ruoyi.chargingPile.api.feignClient.PartnerClient; import com.ruoyi.chargingPile.api.feignClient.SiteClient; import com.ruoyi.chargingPile.api.model.Partner; import com.ruoyi.chargingPile.api.model.Site; import com.ruoyi.chargingPile.api.model.TChargingGun; import com.ruoyi.chargingPile.api.model.TChargingPile; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.utils.DateUtils; import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.common.security.service.TokenService; import com.ruoyi.integration.api.feignClient.UploadRealTimeMonitoringDataClient; import com.ruoyi.order.api.model.*; import com.ruoyi.order.api.vo.ChargingBillListVO; import com.ruoyi.order.api.vo.ChargingBillVO; import com.ruoyi.order.api.vo.ChargingBillWapper; import com.ruoyi.order.mapper.TChargingBillMapper; import com.ruoyi.order.mapper.TChargingOrderMapper; import com.ruoyi.order.service.*; import com.ruoyi.system.api.domain.SysUser; import com.ruoyi.system.api.feignClient.SysUserClient; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import javax.annotation.Resource; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.time.temporal.TemporalAdjusters; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; /** *

* 服务实现类 *

* * @author xiaochen * @since 2024-08-07 */ @Service public class TChargingBillServiceImpl extends ServiceImpl implements TChargingBillService { @Resource private SysUserClient sysUserClient; @Resource private TChargingOrderMapper chargingOrderList; @Resource private UploadRealTimeMonitoringDataClient uploadRealTimeMonitoringDataClient; @Resource private SiteClient siteClient; @Resource private ChargingPileClient chargingPileClient; @Resource private ChargingGunClient chargingGunClient; @Resource private AppUserClient appUserClient; @Resource private AppUserCarClient appUserCarClient; @Resource private TChargingOrderRefundService chargingOrderRefundService; @Resource private TokenService tokenService; @Resource private PartnerClient partnerClient; @Resource private TChargingOrderAccountingStrategyService chargingOrderAccountingStrategyService; @Resource private TChargingOrderService chargingOrderService; @Resource private ITChargingSettlementBillService chargingSettlementBillService; @Override public ChargingBillVO chargingBillList1(ChargingListQuery dto) { ChargingBillVO chargingBillVO = new ChargingBillVO(); List tChargingOrders1 = new ArrayList<>(); String startTime1 = null; String startTime2 = null; if (StringUtils.hasLength(dto.getStartTime())){ String[] split = dto.getStartTime().split(" - "); startTime1 = split[0]; startTime2 = split[1]; } List siteList = siteClient.getSiteAll().getData(); List gunList = chargingGunClient.getAllGun().getData(); List pileList = chargingGunClient.getAllPile().getData(); List userList = appUserClient.getAllUser().getData(); List carList = appUserCarClient.getAllCar().getData(); List total = chargingOrderList.selectList(new LambdaQueryWrapper<>(TChargingOrder.class) .isNotNull(TChargingOrder::getPayTime)); List totalRefund = chargingOrderRefundService.lambdaQuery().eq(TChargingOrderRefund::getRefundStatus, 2).list(); Long userId = tokenService.getLoginUser().getUserid(); // 查询当前登陆人按钮权限 SysUser sysUser = sysUserClient.getSysUser(tokenService.getLoginUser().getUserid()).getData(); Integer roleType = sysUser.getRoleType(); //如果没传siteId,获取当前登陆人所有的siteIds List siteIds = new ArrayList<>(); if (dto.getSiteId()==null){ if (userId != null){ List 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 integers = new ArrayList<>(); for (Integer siteId : siteIds) { // 校验有没有这个站点的权限 List t1= partnerClient.getChargingOrderMenu(sysUser.getObjectId(),siteId).getData(); Boolean b = t1.get(1); if (b){ integers.add(siteId); } } siteIds = integers; } } if (roleType==1){ siteIds.add(0); } if (siteIds.isEmpty())siteIds.add(-1); dto.setSiteIds(siteIds); PageInfo pageInfo = new PageInfo<>(dto.getPageCurr(),dto.getPageSize()); List list = this.baseMapper.chargingBillList1(pageInfo,dto,startTime1,startTime2); List list1 = this.baseMapper.chargingBillList1Nolimt(dto,startTime1,startTime2); BigDecimal paymentAmountTotal = new BigDecimal("0"); BigDecimal orderAmountTotal = new BigDecimal("0"); BigDecimal refundAmountTotal = new BigDecimal("0"); BigDecimal electrovalenceTotal = new BigDecimal("0"); BigDecimal serviceChargeTotal = new BigDecimal("0"); BigDecimal commissionAmountTotal = new BigDecimal("0"); BigDecimal sharingAmountTotal = new BigDecimal("0"); BigDecimal platformIncomeTotal = new BigDecimal("0"); BigDecimal partnerIncomeTotal = new BigDecimal("0"); BigDecimal chargingCapacityTotal = new BigDecimal("0"); BigDecimal discountTotal = new BigDecimal("0"); List list3 = chargingOrderAccountingStrategyService.list(); Map siteServiceShareRatioMap = loadSiteServiceShareRatioMap(); for (ChargingBillListVO chargingBillListVO : list) { if (roleType==2){ List data = partnerClient.getAccountMenu(sysUser.getObjectId(), chargingBillListVO.getSiteId()).getData(); chargingBillListVO.setAuthDownLoad(data.get(0)); if (chargingBillListVO.getType()==1){ continue; } } String temp = ""; String temp1 = ""; switch (chargingBillListVO.getType()){ case 1: temp = "全站账单"; temp1 = "全站"; break; case 2: temp = "各个站点账单"; Site site = siteList.stream().filter(e -> e.getId().equals(chargingBillListVO.getSiteId())).findFirst().orElse(null); if (site!=null){ temp1 =site.getName(); } break; } chargingBillVO.setCategory(temp); chargingBillVO.setSiteName(temp1); chargingBillVO.setType("月账单"); chargingBillVO.setCode(chargingBillListVO.getCode()); LocalDateTime billTime = chargingBillListVO.getBillTime(); // 将其转化为yyyy-MM格式字符串 chargingBillVO.setCreateTime(billTime.format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); // 将billTime减去一个月 转化为yyyy-MM格式字符串 chargingBillVO.setBillWeek(billTime.minusMonths(1).format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM"))); chargingBillListVO.setUid(chargingBillListVO.getId().toString()); // 根据账单的出账时间 查询上个月的充电订单 LocalDateTime localDate = chargingBillListVO.getBillTime().minusMonths(1); // 账单周期 chargingBillListVO.setBillWeek(localDate.format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM"))); // 获取 LocalDate 对象 // // 获取该月份的第一天 // 获取该月份的最后一天 LocalDateTime lastDayOfMonth = localDate.with(TemporalAdjusters.lastDayOfMonth()); LocalDateTime firstDayOfMonth = localDate.with(TemporalAdjusters.firstDayOfMonth()); List tChargingOrders = new ArrayList<>(); if (chargingBillListVO.getType() == 2){ tChargingOrders = total.stream().filter(e -> e.getSiteId().equals(chargingBillListVO.getSiteId()) && e.getPayTime().isBefore(lastDayOfMonth.withHour(23).withMinute(59).withSecond(59)) && e.getPayTime().isAfter(firstDayOfMonth.withHour(0).withMinute(0).withSecond(0))).collect(Collectors.toList()); }else{ tChargingOrders = total.stream().filter(e -> e.getPayTime().isBefore(lastDayOfMonth.withHour(23).withMinute(59).withSecond(59)) && e.getPayTime().isAfter(firstDayOfMonth.withHour(0).withMinute(0).withSecond(0))).collect(Collectors.toList()); } tChargingOrders = filterAccountSettlementOrders(tChargingOrders, chargingBillListVO.getPayType()); chargingBillListVO.setPayTypeName(resolveAccountPayTypeName(chargingBillListVO.getPayType(), tChargingOrders)); int chargingSecond = 0; BigDecimal paymentAmount = new BigDecimal("0"); BigDecimal rechargeAmount = new BigDecimal("0"); BigDecimal orderAmount = new BigDecimal("0"); BigDecimal electrovalence = new BigDecimal("0"); BigDecimal serviceCharge = new BigDecimal("0"); BigDecimal commissionAmount = new BigDecimal("0"); BigDecimal sharingAmount = new BigDecimal("0"); BigDecimal chargingCapacity = new BigDecimal("0"); BigDecimal refundAmount = new BigDecimal("0"); chargingBillVO.setCategory(""); chargingBillVO.setExportList(tChargingOrders); for (TChargingOrder tChargingOrder : tChargingOrders) { Site site1 = siteList.stream().filter(site -> site.getId().equals(tChargingOrder.getSiteId())).findFirst().orElse(null); if (site1!=null){ chargingBillVO.setSiteName(site1.getName()); } TChargingPile data1 = pileList.stream().filter(e -> e.getId().equals(tChargingOrder.getChargingPileId())).findFirst().orElse(null); TChargingGun data2 = gunList.stream().filter(e -> e.getId().equals(tChargingOrder.getChargingGunId())).findFirst().orElse(null); if (data1!=null && data2!=null){ tChargingOrder.setTerminalName(data1.getName()+data2.getName()); tChargingOrder.setTerminalCode(data2.getCode()); } tChargingOrder.setOrderClassification1("线上订单"); tChargingOrder.setRechargePaymentType1("预付"); tChargingOrder.setChargingType("充电桩接口充电服务"); if (tChargingOrder.getStatus()!=null){ switch (tChargingOrder.getStatus()){ case 1: tChargingOrder.setStatus1("等待中"); break; case 2: tChargingOrder.setStatus1("启动中"); break; case 3: tChargingOrder.setStatus1("充电中"); break; case 4: tChargingOrder.setStatus1("停止中"); break; case 5: tChargingOrder.setStatus1("已结束"); break; case 0: tChargingOrder.setStatus1("未知"); break; } } if (tChargingOrder.getEndMode()!=null){ switch (tChargingOrder.getEndMode()){ case 1: tChargingOrder.setEndMode1("主动终止"); break; case 2: tChargingOrder.setEndMode1("满电终止"); break; case 3: tChargingOrder.setEndMode1("费用不足终止"); break; case 0: tChargingOrder.setEndMode1("异常终止"); break; } } tChargingOrder.setDiscount(tChargingOrder.getCouponDiscountAmount()!=null?tChargingOrder.getCouponDiscountAmount().toString():"0"); // UploadRealTimeMonitoringData data5 = uploadRealTimeMonitoringDataClient.chargingOrderInfo(tChargingOrder.getCode()).getData(); // if (data5!=null){ // tChargingOrder.setEndSoc(data5.getSoc().toString()); // } if (tChargingOrder.getStartTime()!=null && tChargingOrder.getEndTime()!=null){ LocalDateTime startTime = tChargingOrder.getStartTime(); LocalDateTime endTime = tChargingOrder.getEndTime(); // 计算时间差 单位秒 long between = ChronoUnit.SECONDS.between(startTime, endTime); chargingSecond+=between; // 将其转化为xx小时xx分钟xx秒显示 如果是0小时则不展示小时 如果是0分钟则不展示分钟 // 计算小时、分钟和秒 long hours = between / 60 / 60; long minutes = (between % 3600) / 60; long seconds = between % 60; // 如果没有秒数,则默认是0 StringBuilder result = new StringBuilder(); if (hours > 0) { result.append(hours).append("小时"); } if (minutes > 0) { result.append(minutes).append("分钟"); } if (seconds > 0 || result.length() == 0) { // 如果秒数大于0,或者小时和分钟都为0,则显示秒数 result.append(seconds).append("秒"); } tChargingOrder.setChargingTime(result.toString()); } TAppUser data3 = userList.stream().filter(e -> e.getId().equals(tChargingOrder.getAppUserId())).findFirst().orElse(null); if (data3!=null)tChargingOrder.setUserName(data3.getName()); if (tChargingOrder.getAppUserCarId()!=null){ TAppUserCar data4 = carList.stream().filter(e -> e.getId().equals(tChargingOrder.getAppUserCarId())).findFirst().orElse(null); if (data4!=null){ tChargingOrder.setLicensePlate(data4.getLicensePlate()); tChargingOrder.setVehicleModel(data4.getVehicleModel()); } }else{ tChargingOrder.setLicensePlate(tChargingOrder.getPlateNum()); } List list4 = list3.stream().filter(e -> e.getChargingOrderId().equals(tChargingOrder.getId())).collect(Collectors.toList()); BigDecimal electronic_reduce = list4.stream().map(TChargingOrderAccountingStrategy::getPeriodElectricPrice).reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal service_reduce = list4.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal charging_capacity = list4.stream().map(TChargingOrderAccountingStrategy::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add); tChargingOrder.setTotalAmount(electronic_reduce.add(service_reduce)+""); // 累加实收金额 支付结算金额 if (tChargingOrder.getOrderSource()!=2){ paymentAmount = paymentAmount.add(electronic_reduce.add(service_reduce)); // 累加累计服务费 serviceCharge = serviceCharge.add(service_reduce); }else{ paymentAmount = paymentAmount.add(electronic_reduce.add(service_reduce.multiply(new BigDecimal("0.8")))); // 累加累计服务费 serviceCharge = serviceCharge.add(service_reduce.multiply(new BigDecimal("0.8"))); } // 总金额 if (tChargingOrder.getRechargeAmount()!=null){ orderAmount = orderAmount.add(tChargingOrder.getRechargeAmount()); } // 累加累计电费 electrovalence = electrovalence.add(electronic_reduce); if (tChargingOrder.getRechargeAmount()!=null){ rechargeAmount = rechargeAmount.add(tChargingOrder.getRechargeAmount()); } List list2 = totalRefund.stream().filter(e -> e.getChargingOrderId().equals(tChargingOrder.getId())).collect(Collectors.toList()); for (TChargingOrderRefund tChargingOrderRefund : list2) { refundAmount = refundAmount.add(tChargingOrderRefund.getRefundTotalAmount()); } // 累加平台手续费 if (tChargingOrder.getOrderAmount()!=null){ commissionAmount = commissionAmount.add(tChargingOrder.getRechargeAmount().multiply(BigDecimal.valueOf(0.006)) .setScale(2,BigDecimal.ROUND_DOWN)); } // 累加平台分佣 if (tChargingOrder.getOrderSource()==2){ sharingAmount = sharingAmount.add(service_reduce.multiply(BigDecimal.valueOf(0.2)).setScale(2,BigDecimal.ROUND_DOWN)); } // 累加充电度数 chargingCapacity = chargingCapacity.add(charging_capacity); } // 将chargingSecond 这是以秒为单位存放的总秒数 将其转化为xx小时xx分钟xx秒 int hours = chargingSecond / 3600; int minutes = (chargingSecond % 3600) / 60; int seconds = chargingSecond % 60; // 格式化为字符串 String timeString = String.format("%d小时%d分钟%d秒", hours, minutes, seconds); chargingBillVO.setChargingTime(timeString); if (chargingBillVO.getPaymentAmount() == null){ chargingBillVO.setPaymentAmount(BigDecimal.ZERO); } chargingBillListVO.setPaymentAmount(paymentAmount); chargingBillListVO.setOrderAmount(refundAmount); chargingBillListVO.setRefundAmount(refundAmount == null?BigDecimal.ZERO:refundAmount); chargingBillListVO.setElectrovalence(electrovalence == null?BigDecimal.ZERO:electrovalence); chargingBillListVO.setServiceCharge(serviceCharge == null?BigDecimal.ZERO:serviceCharge); chargingBillListVO.setCommissionAmount(commissionAmount == null?BigDecimal.ZERO:commissionAmount.setScale(2,BigDecimal.ROUND_DOWN)); chargingBillListVO.setSharingAmount(sharingAmount == null?BigDecimal.ZERO:sharingAmount); chargingBillListVO.setChargingCapacity(chargingCapacity == null?BigDecimal.ZERO:chargingCapacity); chargingBillListVO.setBillMoney(paymentAmount .subtract(commissionAmount.setScale(2,BigDecimal.ROUND_DOWN)).subtract(sharingAmount).setScale(2, BigDecimal.ROUND_DOWN)); Map incomeMap = calculateChargingBillIncome(chargingBillListVO.getType(), chargingBillListVO.getSiteId(), chargingBillListVO.getBillWeek(), tChargingOrders, list3, siteServiceShareRatioMap); chargingBillListVO.setPlatformIncome(incomeMap.get("platformIncome")); chargingBillListVO.setPartnerIncome(incomeMap.get("partnerIncome")); switch (chargingBillListVO.getType()){ case 1: chargingBillListVO.setSiteName("全站"); break; case 2: Site site = siteList.stream().filter(e -> e.getId().equals(chargingBillListVO.getSiteId())).findFirst().orElse(null); if (site!=null){ chargingBillListVO.setSiteName(site.getName()); } break; } // 订单数 chargingBillListVO.setOrderCount(tChargingOrders.size()); // 充电时间秒 chargingBillListVO.setChargingSecond(chargingSecond); } BigDecimal bigDecimal = new BigDecimal("0"); int i = 0; for (ChargingBillListVO chargingBillListVO : list1) { if (dto.getType() == 1){ }else{ if (chargingBillListVO.getSiteId()!=0&&!siteIds.contains(chargingBillListVO.getSiteId())){ continue; } if (chargingBillListVO.getType()==1){ continue; } } i++; LocalDateTime billTime = chargingBillListVO.getBillTime(); // 将其转化为yyyy-MM格式字符串 chargingBillVO.setCreateTime(billTime.format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); // 将billTime减去一个月 转化为yyyy-MM格式字符串 chargingBillVO.setBillWeek(billTime.minusMonths(1).format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM"))); chargingBillListVO.setUid(chargingBillListVO.getId().toString()); // 根据账单的出账时间 查询上个月的充电订单 LocalDateTime localDate = chargingBillListVO.getBillTime().minusMonths(1); // 账单周期 chargingBillListVO.setBillWeek(localDate.format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM"))); // 获取 LocalDate 对象 // // 获取该月份的第一天 // 获取该月份的最后一天 LocalDateTime lastDayOfMonth = localDate.with(TemporalAdjusters.lastDayOfMonth()); LocalDateTime firstDayOfMonth = localDate.with(TemporalAdjusters.firstDayOfMonth()); List tChargingOrders = new ArrayList<>(); if (chargingBillListVO.getType() == 2){ tChargingOrders = total.stream().filter(e -> e.getSiteId().equals(chargingBillListVO.getSiteId()) && e.getPayTime().isBefore(lastDayOfMonth.withHour(23).withMinute(59).withSecond(59)) && e.getPayTime().isAfter(firstDayOfMonth.withHour(0).withMinute(0).withSecond(0))).collect(Collectors.toList()); }else{ tChargingOrders = total.stream().filter(e -> e.getPayTime().isBefore(lastDayOfMonth.withHour(23).withMinute(59).withSecond(59)) && e.getPayTime().isAfter(firstDayOfMonth.withHour(0).withMinute(0).withSecond(0))).collect(Collectors.toList()); } tChargingOrders = filterAccountSettlementOrders(tChargingOrders, chargingBillListVO.getPayType()); for (TChargingOrder tChargingOrder : tChargingOrders) { List list4 = list3.stream().filter(e -> e.getChargingOrderId().equals(tChargingOrder.getId())).collect(Collectors.toList()); BigDecimal electronic_reduce = list4.stream().map(TChargingOrderAccountingStrategy::getPeriodElectricPrice).reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal service_reduce = list4.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal charging_capacity = list4.stream().map(TChargingOrderAccountingStrategy::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add); tChargingOrder.setTotalAmount(electronic_reduce.add(service_reduce)+""); if (tChargingOrder.getOrderSource()!=2){ paymentAmountTotal = paymentAmountTotal.add(electronic_reduce.add(service_reduce)); // 累加累计服务费 serviceChargeTotal = serviceChargeTotal.add(service_reduce); }else{ paymentAmountTotal = paymentAmountTotal.add(electronic_reduce.add(service_reduce.multiply(new BigDecimal("0.8")))); // 累加累计服务费 serviceChargeTotal = serviceChargeTotal.add(service_reduce.multiply(new BigDecimal("0.8"))); } // 累加订单金额 if (tChargingOrder.getRechargeAmount()!=null){ orderAmountTotal = orderAmountTotal.add(tChargingOrder.getRechargeAmount()); } // 累加累计电费 electrovalenceTotal = electrovalenceTotal.add(electronic_reduce); List list2 = totalRefund.stream().filter(e -> e.getChargingOrderId().equals(tChargingOrder.getId())).collect(Collectors.toList()); for (TChargingOrderRefund tChargingOrderRefund : list2) { refundAmountTotal =refundAmountTotal.add(tChargingOrderRefund.getRefundAmount()); tChargingOrder.setRefundAmount(tChargingOrderRefund.getRefundAmount()); tChargingOrder.setRefundContent(tChargingOrderRefund.getRefundReason()); tChargingOrder.setRefundCode(tChargingOrderRefund.getRefundCode()); tChargingOrder.setRefundTime1(DateUtils.localDateTimeToString(tChargingOrderRefund.getRefundTime())); bigDecimal = bigDecimal.add(tChargingOrderRefund.getRefundAmount()); } // 累加平台手续费 if (tChargingOrder.getOrderAmount()!=null){ commissionAmountTotal = commissionAmountTotal.add(tChargingOrder.getRechargeAmount().multiply(new BigDecimal("0.006")) .setScale(2,BigDecimal.ROUND_DOWN)); } // 累加平台分佣 if (tChargingOrder.getOrderSource()==2 ){ sharingAmountTotal = sharingAmountTotal.add(service_reduce.multiply(BigDecimal.valueOf(0.2)).setScale(2,BigDecimal.ROUND_DOWN)); } // 累加充电度数 chargingCapacityTotal = chargingCapacityTotal.add(charging_capacity); // 累加优惠金额 if (tChargingOrder.getCouponDiscountAmount()!=null){ discountTotal = discountTotal.add(tChargingOrder.getCouponDiscountAmount()); } if (tChargingOrder.getVipDiscountAmount()!=null){ discountTotal = discountTotal.add(tChargingOrder.getVipDiscountAmount()); } } Map incomeMap = calculateChargingBillIncome(chargingBillListVO.getType(), chargingBillListVO.getSiteId(), chargingBillListVO.getBillWeek(), tChargingOrders, list3, siteServiceShareRatioMap); platformIncomeTotal = platformIncomeTotal.add(incomeMap.get("platformIncome")); partnerIncomeTotal = partnerIncomeTotal.add(incomeMap.get("partnerIncome")); tChargingOrders1.addAll(tChargingOrders); chargingBillVO.setExportList(tChargingOrders); } chargingBillVO.setOrderCount(i); chargingBillVO.setChargingCapacity(chargingCapacityTotal); chargingBillVO.setPaymentAmount(paymentAmountTotal); chargingBillVO.setOrderAmount(orderAmountTotal); chargingBillVO.setElectrovalence(electrovalenceTotal); chargingBillVO.setServiceCharge(serviceChargeTotal); chargingBillVO.setCommissionAmount(commissionAmountTotal); chargingBillVO.setSharingAmount(sharingAmountTotal); chargingBillVO.setPlatformIncome(platformIncomeTotal.setScale(2, RoundingMode.HALF_UP)); chargingBillVO.setPartnerIncome(partnerIncomeTotal.setScale(2, RoundingMode.HALF_UP)); chargingBillVO.setDiscount(discountTotal); chargingBillVO.setRefundAmount(refundAmountTotal); List collect = tChargingOrders1.stream().distinct().collect(Collectors.toList()); if (!collect.isEmpty()){ collect.get(0).setRefundAmount1(bigDecimal); } chargingBillVO.setExportList(collect); pageInfo.setRecords(list); chargingBillVO.setList(pageInfo); return chargingBillVO; } @Override public ChargingBillVO chargingBillList(ChargingListQuery dto) { if (dto.getState()!=null){ if (dto.getState()==1){ dto.setState(2); }else { dto.setState(1); } } ChargingBillVO chargingBillVO = new ChargingBillVO(); String startTime1 = null; String startTime2 = null; if (StringUtils.hasLength(dto.getStartTime())){ String[] split = dto.getStartTime().split(" - "); startTime1 = split[0]; startTime2 = split[1]; } List total = chargingOrderList.selectList(new LambdaQueryWrapper<>(TChargingOrder.class) .isNotNull(TChargingOrder::getPayTime)); PageInfo pageInfo = new PageInfo<>(dto.getPageCurr(),dto.getPageSize()); List data6 = siteClient.getSiteAll().getData(); List gunList = chargingGunClient.getAllGun().getData(); List pileList = chargingGunClient.getAllPile().getData(); List userList = appUserClient.getAllUser().getData(); List carList = appUserCarClient.getAllCar().getData(); List list3 = chargingOrderAccountingStrategyService.list(); Map siteServiceShareRatioMap = loadSiteServiceShareRatioMap(); Long userId = tokenService.getLoginUser().getUserid(); // 查询当前登陆人按钮权限 SysUser sysUser = sysUserClient.getSysUser(tokenService.getLoginUser().getUserid()).getData(); Integer roleType = sysUser.getRoleType(); //如果没传siteId,获取当前登陆人所有的siteIds List siteIds = new ArrayList<>(); //如果没传siteId,获取当前登陆人所有的siteIds if (dto.getSiteId()==null){ if (userId != null){ List 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 integers = new ArrayList<>(); for (Integer siteId : siteIds) { // 校验有没有这个站点的权限 List t1= partnerClient.getChargingBillMenu(sysUser.getObjectId(),siteId).getData(); Boolean b = t1.get(1); if (b){ integers.add(siteId); } } siteIds = integers; } } if (roleType==1){ siteIds.add(0); } if (siteIds.isEmpty()){ siteIds.add(-1); } dto.setSiteIds(siteIds); List list = this.baseMapper.chargingBillList(pageInfo,dto,startTime1,startTime2); List list1 = this.baseMapper.chargingBillListNoLimit(dto,startTime1,startTime2); BigDecimal paymentAmountTotal = new BigDecimal("0"); BigDecimal orderAmountTotal = new BigDecimal("0"); BigDecimal electrovalenceTotal = new BigDecimal("0"); BigDecimal serviceChargeTotal = new BigDecimal("0"); BigDecimal commissionAmountTotal = new BigDecimal("0"); BigDecimal sharingAmountTotal = new BigDecimal("0"); BigDecimal platformIncomeTotal = new BigDecimal("0"); BigDecimal partnerIncomeTotal = new BigDecimal("0"); BigDecimal chargingCapacityTotal = new BigDecimal("0"); BigDecimal discountTotal = new BigDecimal("0"); BigDecimal refundAmountTotal = new BigDecimal("0"); int orderCount = 0; List chargingBillListVOS = new ArrayList<>(); for (ChargingBillListVO chargingBillListVO : list) { if (roleType==2 && chargingBillListVO.getSiteId()!=0){ chargingBillListVOS.add(chargingBillListVO); } if (roleType ==1 && (siteIds.contains(chargingBillListVO.getSiteId())|| chargingBillListVO.getSiteId()==0)){ chargingBillListVOS.add(chargingBillListVO); } } for (ChargingBillListVO chargingBillListVO : chargingBillListVOS) { if (chargingBillListVO.getSiteId()!=0&&!siteIds.contains(chargingBillListVO.getSiteId())){ continue; } if (roleType == 2){ // 校验有没有这个站点的权限 List t1= partnerClient.getChargingBillMenu(sysUser.getObjectId(),chargingBillListVO.getSiteId()).getData(); chargingBillListVO.setAuthDownLoad(t1.get(0)); if (chargingBillListVO.getSiteId()==0){ continue; } } String temp = ""; String temp1 = ""; switch (chargingBillListVO.getType()){ case 1: temp = "全站账单"; temp1 = "全站"; break; case 2: temp = "各个站点账单"; Site site = data6.stream().filter(e -> e.getId().equals(chargingBillListVO.getSiteId())).findFirst().orElse(null); if(site!=null){ temp1 = site.getName(); } break; } chargingBillVO.setCategory(temp); chargingBillVO.setSiteName(temp1); chargingBillVO.setType("月账单"); chargingBillVO.setCode(chargingBillListVO.getCode()); LocalDateTime billTime = chargingBillListVO.getBillTime(); // 将其转化为yyyy-MM格式字符串 chargingBillVO.setCreateTime(billTime.format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); // 将billTime减去一个月 转化为yyyy-MM格式字符串 chargingBillVO.setBillWeek(billTime.minusMonths(1).format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM"))); chargingBillListVO.setUid(chargingBillListVO.getId().toString()); // 根据账单的出账时间 查询上个月的充电订单 LocalDateTime localDate = chargingBillListVO.getBillTime().minusMonths(1); // 账单周期 chargingBillListVO.setBillWeek(localDate.format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM"))); // 获取 LocalDate 对象 // // 获取该月份的第一天 // 获取该月份的最后一天 LocalDateTime lastDayOfMonth = localDate.with(TemporalAdjusters.lastDayOfMonth()); LocalDateTime firstDayOfMonth = localDate.with(TemporalAdjusters.firstDayOfMonth()); List tChargingOrders = new ArrayList<>(); if (chargingBillListVO.getType() == 2){ tChargingOrders = total.stream().filter(e -> e.getSiteId().equals(chargingBillListVO.getSiteId()) && e.getPayTime().isBefore(lastDayOfMonth.withHour(23).withMinute(59).withSecond(59)) && e.getPayTime().isAfter(firstDayOfMonth.withHour(0).withMinute(0).withSecond(0))).collect(Collectors.toList()); }else{ tChargingOrders = total.stream().filter(e -> e.getPayTime().isBefore(lastDayOfMonth.withHour(23).withMinute(59).withSecond(59)) && e.getPayTime().isAfter(firstDayOfMonth.withHour(0).withMinute(0).withSecond(0))).collect(Collectors.toList()); } int chargingSecond = 0; BigDecimal paymentAmount = new BigDecimal("0"); BigDecimal orderAmount = new BigDecimal("0"); BigDecimal electrovalence = new BigDecimal("0"); BigDecimal serviceCharge = new BigDecimal("0"); BigDecimal commissionAmount = new BigDecimal("0"); BigDecimal sharingAmount = new BigDecimal("0"); BigDecimal chargingCapacity = new BigDecimal("0"); BigDecimal refundAmount = new BigDecimal("0"); chargingBillVO.setCategory(""); chargingBillListVO.setOrderCount(tChargingOrders.size()); chargingBillVO.setExportList(tChargingOrders); int t = 1; for (TChargingOrder tChargingOrder : tChargingOrders) { tChargingOrder.setXuhao(t); t++; if (tChargingOrder.getRechargePaymentType()!=null && tChargingOrder.getRechargePaymentType()==1){ chargingBillListVO.setPayTypeName("微信商户"); } if (tChargingOrder.getRechargePaymentType()!=null && tChargingOrder.getRechargePaymentType()==2){ if (StringUtils.hasLength(chargingBillListVO.getPayTypeName())){ chargingBillListVO.setPayTypeName("微信商户+支付宝商户"); }else{ chargingBillListVO.setPayTypeName("支付宝商户"); } } chargingBillVO.setSiteName(data6.stream().filter(e->e.getId().equals(chargingBillListVO.getSiteId())).findFirst().orElse(new Site()).getName()); TChargingGun data2 = gunList.stream().filter(e -> e.getId().equals(tChargingOrder.getChargingGunId())).findFirst().orElse(null); TChargingPile data1 = pileList.stream().filter(e -> e.getId().equals(tChargingOrder.getChargingPileId())).findFirst().orElse(null); if (data1!=null && data2!=null){ tChargingOrder.setTerminalName(data1.getName()+data2.getName()); tChargingOrder.setTerminalCode(data2.getCode()); } tChargingOrder.setOrderClassification1("线上订单"); tChargingOrder.setRechargePaymentType1("预付"); tChargingOrder.setChargingType("充电桩接口充电服务"); if (tChargingOrder.getStatus()!=null){ switch (tChargingOrder.getStatus()){ case 1: tChargingOrder.setStatus1("等待中"); break; case 2: tChargingOrder.setStatus1("启动中"); break; case 3: tChargingOrder.setStatus1("充电中"); break; case 4: tChargingOrder.setStatus1("停止中"); break; case 5: tChargingOrder.setStatus1("已结束"); break; case 0: tChargingOrder.setStatus1("未知"); break; } } if (tChargingOrder.getEndMode()!=null){ switch (tChargingOrder.getEndMode()){ case 1: tChargingOrder.setEndMode1("主动终止"); break; case 2: tChargingOrder.setEndMode1("满电终止"); break; case 3: tChargingOrder.setEndMode1("费用不足终止"); break; case 0: tChargingOrder.setEndMode1("异常终止"); break; } } tChargingOrder.setDiscount(tChargingOrder.getCouponDiscountAmount()!=null?tChargingOrder.getCouponDiscountAmount().toString():"0"); if (tChargingOrder.getStartTime()!=null && tChargingOrder.getEndTime()!=null){ LocalDateTime startTime = tChargingOrder.getStartTime(); LocalDateTime endTime = tChargingOrder.getEndTime(); // 计算时间差 单位秒 long between = ChronoUnit.SECONDS.between(startTime, endTime); chargingSecond+=between; // 将其转化为xx小时xx分钟xx秒显示 如果是0小时则不展示小时 如果是0分钟则不展示分钟 // 计算小时、分钟和秒 long hours = between / 60 / 60; long minutes = (between % 3600) / 60; long seconds = between % 60; // 如果没有秒数,则默认是0 StringBuilder result = new StringBuilder(); if (hours > 0) { result.append(hours).append("小时"); } if (minutes > 0) { result.append(minutes).append("分钟"); } if (seconds > 0 || result.length() == 0) { // 如果秒数大于0,或者小时和分钟都为0,则显示秒数 result.append(seconds).append("秒"); } tChargingOrder.setChargingTime(result.toString()); } TAppUser data3 = userList.stream().filter(e -> e.getId().equals(tChargingOrder.getAppUserId())).findFirst().orElse(null); if (tChargingOrder.getAppUserCarId()!=null){ TAppUserCar tAppUserCar = carList.stream().filter(e -> e.getId().equals(tChargingOrder.getAppUserCarId())).findFirst().orElse(null); if (tAppUserCar!=null){ tChargingOrder.setLicensePlate(tAppUserCar.getLicensePlate()); tChargingOrder.setVehicleModel(tAppUserCar.getVehicleModel()); } }else{ tChargingOrder.setLicensePlate(tChargingOrder.getPlateNum()); } if (data3!=null){ tChargingOrder.setUserName(data3.getName()); tChargingOrder.setPhone(data3.getPhone()); } List list4 = list3.stream().filter(e -> e.getChargingOrderId().equals(tChargingOrder.getId())).collect(Collectors.toList()); BigDecimal electronic_reduce = list4.stream().map(TChargingOrderAccountingStrategy::getPeriodElectricPrice).reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal service_reduce = list4.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal charging_capacity = list4.stream().map(TChargingOrderAccountingStrategy::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add); if ( !tChargingOrder.getOrderSource().equals(2)){ // 实收 paymentAmount = paymentAmount.add(electronic_reduce).add(service_reduce); BigDecimal add = electronic_reduce.add(service_reduce); tChargingOrder.setTotalAmount(add.toString()); } // 总金额 if (tChargingOrder.getRechargeAmount()!=null){ orderAmount = orderAmount.add(tChargingOrder.getRechargeAmount()); } // 累加累计电费 electrovalence = electrovalence.add(electronic_reduce); if (tChargingOrder.getRefundAmount()!=null && tChargingOrder.getRefundStatus() !=null && tChargingOrder.getRefundStatus() == 2){ refundAmount = refundAmount.add(tChargingOrder.getRefundAmount()); } // 累加累计服务费 if (tChargingOrder.getOrderSource().equals(2)) { serviceCharge = serviceCharge.add(service_reduce.multiply(new BigDecimal("0.8")).setScale(2, BigDecimal.ROUND_DOWN)); // 累加平台分佣 sharingAmount = sharingAmount.add(service_reduce.multiply(new BigDecimal("0.2")).setScale(2,BigDecimal.ROUND_DOWN)); // 累加实收 paymentAmount = paymentAmount.add(electronic_reduce).add(service_reduce.multiply(new BigDecimal("0.8")).setScale(2,BigDecimal.ROUND_DOWN)); BigDecimal add = electronic_reduce.add(service_reduce.multiply(new BigDecimal("0.8"))); tChargingOrder.setTotalAmount(add.toString()); }else { serviceCharge = serviceCharge.add(service_reduce); } // 累加平台手续费 if (tChargingOrder.getRechargeAmount()!=null){ commissionAmount = commissionAmount.add(tChargingOrder.getRechargeAmount().multiply(BigDecimal.valueOf(0.006)).setScale(2,BigDecimal.ROUND_DOWN)); } // 累加充电度数 chargingCapacity = chargingCapacity.add(charging_capacity); } // 将chargingSecond 这是以秒为单位存放的总秒数 将其转化为xx小时xx分钟xx秒 int hours = chargingSecond / 3600; int minutes = (chargingSecond % 3600) / 60; int seconds = chargingSecond % 60; // 格式化为字符串 String timeString = String.format("%d小时%d分钟%d秒", hours, minutes, seconds); chargingBillVO.setChargingTime(timeString); chargingBillListVO.setOrderAmount(paymentAmount); chargingBillListVO.setPaymentAmount(paymentAmount.subtract(sharingAmount).setScale(2,BigDecimal.ROUND_DOWN)); chargingBillListVO.setElectrovalence(electrovalence); chargingBillListVO.setServiceCharge(serviceCharge.setScale(2,BigDecimal.ROUND_DOWN)); chargingBillListVO.setCommissionAmount(commissionAmount.setScale(2,BigDecimal.ROUND_DOWN)); chargingBillListVO.setSharingAmount(sharingAmount.setScale(2,BigDecimal.ROUND_DOWN)); chargingBillListVO.setChargingCapacity(chargingCapacity); switch (chargingBillListVO.getType()){ case 1: chargingBillListVO.setSiteName("全站"); break; case 2: Site site = data6.stream().filter(e -> e.getId().equals(chargingBillListVO.getSiteId())).findFirst().orElse(null); if (site!=null){ chargingBillListVO.setSiteName(site.getName()); } break; } // 订单数 chargingBillListVO.setOrderCount(tChargingOrders.size()); // 充电时间秒 chargingBillListVO.setChargingSecond(chargingSecond); Map incomeMap = calculateChargingBillIncome(chargingBillListVO.getType(), chargingBillListVO.getSiteId(), chargingBillListVO.getBillWeek(), tChargingOrders, list3, siteServiceShareRatioMap); chargingBillListVO.setPlatformIncome(incomeMap.get("platformIncome")); chargingBillListVO.setPartnerIncome(incomeMap.get("partnerIncome")); } for (ChargingBillListVO chargingBillListVO : list1) { if (dto.getType() == 1){ if (chargingBillListVO.getSiteId()!=0){ continue; } }else{ if (chargingBillListVO.getSiteId()!=0&&!siteIds.contains(chargingBillListVO.getSiteId())){ continue; } if (chargingBillListVO.getType()==1){ continue; } } if (roleType == 2){ if (chargingBillListVO.getSiteId()==0){ continue; } } LocalDateTime billTime = chargingBillListVO.getBillTime(); // 将其转化为yyyy-MM格式字符串 chargingBillVO.setCreateTime(billTime.format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); // 将billTime减去一个月 转化为yyyy-MM格式字符串 chargingBillVO.setBillWeek(billTime.minusMonths(1).format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM"))); chargingBillListVO.setUid(chargingBillListVO.getId().toString()); // 根据账单的出账时间 查询上个月的充电订单 LocalDateTime localDate = chargingBillListVO.getBillTime().minusMonths(1); // 账单周期 chargingBillListVO.setBillWeek(localDate.format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM"))); // 获取 LocalDate 对象 // // 获取该月份的第一天 // 获取该月份的最后一天 LocalDateTime lastDayOfMonth = localDate.with(TemporalAdjusters.lastDayOfMonth()); LocalDateTime firstDayOfMonth = localDate.with(TemporalAdjusters.firstDayOfMonth()); List tChargingOrders = new ArrayList<>(); if (chargingBillListVO.getType() == 2){ tChargingOrders = total.stream().filter(e -> e.getSiteId().equals(chargingBillListVO.getSiteId()) && e.getPayTime().isBefore(lastDayOfMonth.withHour(23).withMinute(59).withSecond(59)) && e.getPayTime().isAfter(firstDayOfMonth.withHour(0).withMinute(0).withSecond(0))).collect(Collectors.toList()); }else{ tChargingOrders = total.stream().filter(e -> e.getPayTime().isBefore(lastDayOfMonth.withHour(23).withMinute(59).withSecond(59)) && e.getPayTime().isAfter(firstDayOfMonth.withHour(0).withMinute(0).withSecond(0))).collect(Collectors.toList()); } orderCount+=tChargingOrders.size(); BigDecimal paymentAmount = new BigDecimal("0"); BigDecimal orderAmount = new BigDecimal("0"); BigDecimal electrovalence = new BigDecimal("0"); BigDecimal serviceCharge = new BigDecimal("0"); BigDecimal commissionAmount = new BigDecimal("0"); BigDecimal sharingAmount = new BigDecimal("0"); BigDecimal chargingCapacity = new BigDecimal("0"); chargingBillListVO.setOrderCount(tChargingOrders.size()); for (TChargingOrder tChargingOrder : tChargingOrders) { List list4 = list3.stream().filter(e -> e.getChargingOrderId().equals(tChargingOrder.getId())).collect(Collectors.toList()); BigDecimal electronic_reduce = list4.stream().map(TChargingOrderAccountingStrategy::getPeriodElectricPrice).reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal service_reduce = list4.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal charging_capacity = list4.stream().map(TChargingOrderAccountingStrategy::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add); // 累加实收金额 if (!tChargingOrder.getOrderSource().equals(2)){ paymentAmount = paymentAmount.add(electronic_reduce.add(service_reduce)); paymentAmountTotal = paymentAmountTotal.add(electronic_reduce.add(service_reduce)); } // 累加订单金额 if (tChargingOrder.getRechargeAmount()!=null){ orderAmount = orderAmount.add(tChargingOrder.getRechargeAmount()); orderAmountTotal = orderAmountTotal.add(tChargingOrder.getRechargeAmount()); } // 累加累计电费 if (tChargingOrder.getElectrovalence()!=null){ electrovalence = electrovalence.add(electronic_reduce); electrovalenceTotal = electrovalenceTotal.add(electronic_reduce); } if (tChargingOrder.getRefundAmount()!=null && tChargingOrder.getRefundStatus() !=null && tChargingOrder.getRefundStatus() == 2){ refundAmountTotal = refundAmountTotal.add(tChargingOrder.getRefundAmount()); } // 累加累计服务费 if (tChargingOrder.getOrderSource().equals(2)) { serviceCharge = serviceCharge.add(service_reduce.multiply(new BigDecimal("0.8")).setScale(2, BigDecimal.ROUND_DOWN)); serviceChargeTotal = serviceChargeTotal.add(service_reduce.multiply(new BigDecimal("0.8")).setScale(2, BigDecimal.ROUND_DOWN)); // 累加平台分佣 sharingAmount = sharingAmount.add(service_reduce.multiply(new BigDecimal("0.2")).setScale(2, BigDecimal.ROUND_DOWN)); sharingAmountTotal = sharingAmountTotal.add(service_reduce.multiply(new BigDecimal("0.2")).setScale(2, BigDecimal.ROUND_DOWN)); // 累加实收 paymentAmount = paymentAmount.add(electronic_reduce.add(service_reduce.multiply(new BigDecimal("0.8")).setScale(2,BigDecimal.ROUND_DOWN))); paymentAmountTotal = paymentAmountTotal.add(electronic_reduce.add(service_reduce.multiply(new BigDecimal("0.8")).setScale(2,BigDecimal.ROUND_DOWN))); }else{ serviceCharge = serviceCharge.add(service_reduce); serviceChargeTotal = serviceChargeTotal.add(service_reduce); } // 累加平台手续费 if (tChargingOrder.getOrderAmount()!=null){ commissionAmount = commissionAmount.add(tChargingOrder.getRechargeAmount().multiply(new BigDecimal("0.006")).setScale(2,BigDecimal.ROUND_DOWN)); commissionAmountTotal = commissionAmountTotal.add(tChargingOrder.getRechargeAmount().multiply(new BigDecimal("0.006")).setScale(2,BigDecimal.ROUND_DOWN)); } // 累加充电度数 chargingCapacity = chargingCapacity.add(charging_capacity); chargingCapacityTotal = chargingCapacityTotal.add(charging_capacity); // 累加优惠金额 if (tChargingOrder.getCouponDiscountAmount()!=null){ discountTotal = discountTotal.add(tChargingOrder.getCouponDiscountAmount()); } if (tChargingOrder.getVipDiscountAmount()!=null){ discountTotal = discountTotal.add(tChargingOrder.getVipDiscountAmount()); } } Map incomeMap = calculateChargingBillIncome(chargingBillListVO.getType(), chargingBillListVO.getSiteId(), chargingBillListVO.getBillWeek(), tChargingOrders, list3, siteServiceShareRatioMap); platformIncomeTotal = platformIncomeTotal.add(incomeMap.get("platformIncome")); partnerIncomeTotal = partnerIncomeTotal.add(incomeMap.get("partnerIncome")); } chargingBillVO.setChargingCapacity(chargingCapacityTotal); chargingBillVO.setPaymentAmount(paymentAmountTotal.subtract(commissionAmountTotal).subtract(sharingAmountTotal).setScale(2, BigDecimal.ROUND_DOWN)); chargingBillVO.setOrderAmount(orderAmountTotal.setScale(2, BigDecimal.ROUND_DOWN)); chargingBillVO.setElectrovalence(electrovalenceTotal.setScale(2, BigDecimal.ROUND_DOWN)); chargingBillVO.setServiceCharge(serviceChargeTotal.setScale(2, BigDecimal.ROUND_DOWN)); chargingBillVO.setOrderCount(orderCount); chargingBillVO.setCommissionAmount(commissionAmountTotal.setScale(2, BigDecimal.ROUND_DOWN)); chargingBillVO.setSharingAmount(sharingAmountTotal.setScale(2, BigDecimal.ROUND_DOWN)); chargingBillVO.setPlatformIncome(platformIncomeTotal.setScale(2, RoundingMode.HALF_UP)); chargingBillVO.setPartnerIncome(partnerIncomeTotal.setScale(2, RoundingMode.HALF_UP)); chargingBillVO.setDiscount(discountTotal.setScale(2, BigDecimal.ROUND_DOWN)); pageInfo.setRecords(chargingBillListVOS); chargingBillVO.setList(pageInfo); return chargingBillVO; } @Override public ChargingBillWapper chargingBillList2(ChargingListQuery dto) { if (dto.getState()!=null){ if (dto.getState()==1){ dto.setState(2); }else { dto.setState(1); } } Integer statisticalDateType = 1; if (StringUtils.hasLength(dto.getEndTime())){ statisticalDateType = 2; } Long userId = tokenService.getLoginUser().getUserid(); // 查询当前登陆人按钮权限 SysUser sysUser = sysUserClient.getSysUser(tokenService.getLoginUser().getUserid()).getData(); Integer roleType = sysUser.getRoleType(); //如果没传siteId,获取当前登陆人所有的siteIds List siteIds = new ArrayList<>(); List data = siteClient.getSiteListByUserId(userId).getData(); for (GetSiteListDTO datum : data) { siteIds.add(datum.getId()); } if (siteIds.isEmpty()){ siteIds.add(-1); }else{ if (roleType == 2){ List integers = new ArrayList<>(); for (Integer siteId : siteIds) { // 校验有没有这个站点的权限 List t1= partnerClient.getChargingBillMenu(sysUser.getObjectId(),siteId).getData(); Boolean b = t1.get(1); if (b){ integers.add(siteId); } } siteIds = integers; } } if (roleType==1){ siteIds.add(0); } if (siteIds.isEmpty()){ siteIds.add(-1); } dto.setSiteIds(siteIds); PageInfo> pageInfo = new PageInfo<>(dto.getPageCurr(),dto.getPageSize()); List> list = chargingSettlementBillService.queryList(pageInfo, dto.getType(), dto.getState(), dto.getDateRange(), statisticalDateType, dto.getSiteIds()); ChargingBillWapper chargingBillVO = new ChargingBillWapper(); List> pageList = new ArrayList<>(); Map siteServiceShareRatioMap = loadSiteServiceShareRatioMap(); PageInfo> sumPageInfo = new PageInfo<>(1, 100000); List> sumList = chargingSettlementBillService.queryList(sumPageInfo, dto.getType(), dto.getState(), dto.getDateRange(), statisticalDateType, dto.getSiteIds()); Map> incomeIndex = buildChargingBillIncomeIndex(sumList, siteServiceShareRatioMap); if(null != list){ for (Map map : list) { Integer site_id = Integer.valueOf(map.get("site_id").toString()); String code = map.get("code").toString(); String billingCycle = map.get("billingCycle").toString(); String createTime = map.get("createTime").toString(); String siteName = 1 == dto.getType() ? "全站" : map.get("siteName").toString(); Long charging_duration = Long.valueOf(map.get("charging_duration").toString()); Integer order_number = Integer.valueOf(map.get("order_number").toString()); String orderAmount = map.get("total_amount").toString(); String commissionAmount = map.get("platform_fee").toString(); String sharingAmount = map.get("tripartite_commission").toString(); String paymentAmount = map.get("funds_received").toString(); String chargingCapacity = map.get("total_electricity").toString(); String electrovalence = map.get("total_electricity_charge").toString(); String serviceCharge = map.get("total_service_fee").toString(); Map incomeMap = getChargingBillIncome(incomeIndex, site_id, billingCycle); Map data1 = new HashMap<>(); data1.put("code", code); data1.put("orderState", 2); data1.put("type", dto.getType()); data1.put("billWeek", billingCycle); data1.put("billTime", createTime); data1.put("chargingSecond", charging_duration); data1.put("orderCount", order_number); data1.put("siteName", siteName); data1.put("orderAmount", orderAmount); data1.put("commissionAmount", commissionAmount); data1.put("sharingAmount", sharingAmount); data1.put("paymentAmount", paymentAmount); data1.put("platformIncome", incomeMap.get("platformIncome")); data1.put("partnerIncome", incomeMap.get("partnerIncome")); data1.put("chargingCapacity", chargingCapacity); data1.put("electrovalence", electrovalence); data1.put("serviceCharge", serviceCharge); data1.put("authDownLoad", true); if (roleType == 2 && 0 != site_id){ // 校验有没有这个站点的权限 List t1= partnerClient.getChargingBillMenu(sysUser.getObjectId(),site_id).getData(); data1.put("authDownLoad", t1.get(0)); } pageList.add(data1); } } Map map = chargingSettlementBillService.queryListSum(dto.getType(), dto.getState(), dto.getDateRange(), statisticalDateType, dto.getSiteIds()); BigDecimal chargingCapacity = (null == map || null == map.get("totalElectricity")) ? BigDecimal.ZERO : new BigDecimal(map.get("totalElectricity").toString()); BigDecimal paymentAmount = (null == map || null == map.get("fundsReceived")) ? BigDecimal.ZERO : new BigDecimal(map.get("fundsReceived").toString()); BigDecimal orderAmount = (null == map || null == map.get("totalAmount")) ? BigDecimal.ZERO : new BigDecimal(map.get("totalAmount").toString()); BigDecimal electrovalence = (null == map || null == map.get("totalElectricityCharge")) ? BigDecimal.ZERO : new BigDecimal(map.get("totalElectricityCharge").toString()); BigDecimal serviceCharge = (null == map || null == map.get("totalServiceFee")) ? BigDecimal.ZERO : new BigDecimal(map.get("totalServiceFee").toString()); Integer orderCount = (null == map || null == map.get("orderNumber")) ? 0 : Integer.valueOf(map.get("orderNumber").toString()); BigDecimal commissionAmount = (null == map || null == map.get("platformFee")) ? BigDecimal.ZERO : new BigDecimal(map.get("platformFee").toString()); BigDecimal sharingAmount = (null == map || null == map.get("tripartiteCommission")) ? BigDecimal.ZERO : new BigDecimal(map.get("tripartiteCommission").toString()); BigDecimal discount = (null == map || null == map.get("couponDeduction")) ? BigDecimal.ZERO : new BigDecimal(map.get("couponDeduction").toString()); BigDecimal platformIncome = BigDecimal.ZERO; BigDecimal partnerIncome = BigDecimal.ZERO; if (sumList != null) { for (Map row : sumList) { Integer siteId = Integer.valueOf(row.get("site_id").toString()); String billingCycle = row.get("billingCycle").toString(); Map incomeMap = getChargingBillIncome(incomeIndex, siteId, billingCycle); platformIncome = platformIncome.add(incomeMap.get("platformIncome")); partnerIncome = partnerIncome.add(incomeMap.get("partnerIncome")); } } chargingBillVO.setChargingCapacity(chargingCapacity); chargingBillVO.setPaymentAmount(paymentAmount.setScale(2, BigDecimal.ROUND_DOWN)); chargingBillVO.setOrderAmount(orderAmount.setScale(2, BigDecimal.ROUND_DOWN)); chargingBillVO.setElectrovalence(electrovalence.setScale(2, BigDecimal.ROUND_DOWN)); chargingBillVO.setServiceCharge(serviceCharge.setScale(2, BigDecimal.ROUND_DOWN)); chargingBillVO.setOrderCount(orderCount); chargingBillVO.setCommissionAmount(commissionAmount.setScale(2, BigDecimal.ROUND_DOWN)); chargingBillVO.setSharingAmount(sharingAmount.setScale(2, BigDecimal.ROUND_DOWN)); chargingBillVO.setPlatformIncome(platformIncome.setScale(2, RoundingMode.HALF_UP)); chargingBillVO.setPartnerIncome(partnerIncome.setScale(2, RoundingMode.HALF_UP)); chargingBillVO.setDiscount(discount.setScale(2, BigDecimal.ROUND_DOWN)); pageInfo.setRecords(pageList); chargingBillVO.setList(pageInfo); return chargingBillVO; } private Map> buildChargingBillIncomeIndex(List> billRows, Map siteServiceShareRatioMap) { Map> incomeIndex = new HashMap<>(); if (billRows == null || billRows.isEmpty()) { return incomeIndex; } Set billingCycles = billRows.stream() .map(row -> row.get("billingCycle")) .filter(Objects::nonNull) .map(Object::toString) .collect(Collectors.toSet()); if (billingCycles.isEmpty()) { return incomeIndex; } LocalDate firstMonth = billingCycles.stream() .map(cycle -> LocalDate.parse(cycle + "-01")) .min(LocalDate::compareTo) .orElse(null); LocalDate lastMonth = billingCycles.stream() .map(cycle -> LocalDate.parse(cycle + "-01")) .max(LocalDate::compareTo) .orElse(null); if (firstMonth == null || lastMonth == null) { return incomeIndex; } List orders = chargingOrderList.selectList(new LambdaQueryWrapper<>(TChargingOrder.class) .select(TChargingOrder::getId, TChargingOrder::getSiteId, TChargingOrder::getPayTime, TChargingOrder::getOrderSource) .ge(TChargingOrder::getPayTime, firstMonth.atStartOfDay()) .lt(TChargingOrder::getPayTime, lastMonth.plusMonths(1).atStartOfDay())); if (orders == null || orders.isEmpty()) { return incomeIndex; } Map strategyAmountMap = new HashMap<>(); List orderIds = orders.stream().map(TChargingOrder::getId).filter(Objects::nonNull).collect(Collectors.toList()); final int batchSize = 1000; for (int from = 0; from < orderIds.size(); from += batchSize) { List batchIds = orderIds.subList(from, Math.min(from + batchSize, orderIds.size())); List strategies = chargingOrderAccountingStrategyService.list( new LambdaQueryWrapper() .select(TChargingOrderAccountingStrategy::getChargingOrderId, TChargingOrderAccountingStrategy::getPeriodElectricPrice, TChargingOrderAccountingStrategy::getPeriodServicePrice) .in(TChargingOrderAccountingStrategy::getChargingOrderId, batchIds)); for (TChargingOrderAccountingStrategy strategy : strategies) { BigDecimal[] amounts = strategyAmountMap.computeIfAbsent(strategy.getChargingOrderId(), key -> new BigDecimal[]{BigDecimal.ZERO, BigDecimal.ZERO}); amounts[0] = amounts[0].add(strategy.getPeriodElectricPrice() == null ? BigDecimal.ZERO : strategy.getPeriodElectricPrice()); amounts[1] = amounts[1].add(strategy.getPeriodServicePrice() == null ? BigDecimal.ZERO : strategy.getPeriodServicePrice()); } } for (TChargingOrder order : orders) { if (order.getPayTime() == null || order.getSiteId() == null) { continue; } String billingCycle = order.getPayTime().format(DateTimeFormatter.ofPattern("yyyy-MM")); if (!billingCycles.contains(billingCycle)) { continue; } BigDecimal[] amounts = strategyAmountMap.getOrDefault(order.getId(), new BigDecimal[]{BigDecimal.ZERO, BigDecimal.ZERO}); BigDecimal paymentAmount; BigDecimal partnerIncome = BigDecimal.ZERO; if (Integer.valueOf(2).equals(order.getOrderSource())) { paymentAmount = amounts[0].add(amounts[1].multiply(new BigDecimal("0.8")).setScale(2, RoundingMode.DOWN)); } else { paymentAmount = amounts[0].add(amounts[1]); if (Integer.valueOf(1).equals(order.getOrderSource())) { BigDecimal serviceShareRatio = siteServiceShareRatioMap.get(order.getSiteId()); if (serviceShareRatio != null && serviceShareRatio.compareTo(BigDecimal.ZERO) > 0) { partnerIncome = amounts[1].multiply(serviceShareRatio).divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP); } } } addChargingBillIncome(incomeIndex, chargingBillIncomeKey(0, billingCycle), paymentAmount, partnerIncome); addChargingBillIncome(incomeIndex, chargingBillIncomeKey(order.getSiteId(), billingCycle), paymentAmount, partnerIncome); } return incomeIndex; } private void addChargingBillIncome(Map> incomeIndex, String key, BigDecimal paymentAmount, BigDecimal partnerIncome) { Map income = incomeIndex.computeIfAbsent(key, ignored -> { Map value = new HashMap<>(); value.put("platformIncome", BigDecimal.ZERO); value.put("partnerIncome", BigDecimal.ZERO); return value; }); income.put("platformIncome", income.get("platformIncome").add(paymentAmount).subtract(partnerIncome)); income.put("partnerIncome", income.get("partnerIncome").add(partnerIncome)); } private Map getChargingBillIncome(Map> incomeIndex, Integer siteId, String billingCycle) { Map income = incomeIndex.get(chargingBillIncomeKey(siteId, billingCycle)); Map result = new HashMap<>(); result.put("platformIncome", income == null ? BigDecimal.ZERO : income.get("platformIncome").max(BigDecimal.ZERO).setScale(2, RoundingMode.HALF_UP)); result.put("partnerIncome", income == null ? BigDecimal.ZERO : income.get("partnerIncome").setScale(2, RoundingMode.HALF_UP)); return result; } private String chargingBillIncomeKey(Integer siteId, String billingCycle) { return (siteId == null ? 0 : siteId) + "|" + billingCycle; } @Override public ChargingBillVO chargingBillListExport(ChargingListQuery dto) { if (dto.getState()!=null){ if (dto.getState()==1){ dto.setState(2); }else { dto.setState(1); } } ChargingBillVO chargingBillVO = new ChargingBillVO(); String startTime1 = null; String startTime2 = null; if (StringUtils.hasLength(dto.getStartTime())){ String[] split = dto.getStartTime().split(" - "); startTime1 = split[0]; startTime2 = split[1]; } List total = chargingOrderList.selectList(new LambdaQueryWrapper<>(TChargingOrder.class) .isNotNull(TChargingOrder::getPayTime)); PageInfo pageInfo = new PageInfo<>(dto.getPageCurr(),dto.getPageSize()); List data6 = siteClient.getSiteAll().getData(); List gunList = chargingGunClient.getAllGun().getData(); List pileList = chargingGunClient.getAllPile().getData(); List userList = appUserClient.getAllUser().getData(); List carList = appUserCarClient.getAllCar().getData(); List list3 = chargingOrderAccountingStrategyService.list(); Map siteServiceShareRatioMap = loadSiteServiceShareRatioMap(); Long userId = tokenService.getLoginUser().getUserid(); // 查询当前登陆人按钮权限 SysUser sysUser = sysUserClient.getSysUser(tokenService.getLoginUser().getUserid()).getData(); Integer roleType = sysUser.getRoleType(); //如果没传siteId,获取当前登陆人所有的siteIds List siteIds = new ArrayList<>(); //如果没传siteId,获取当前登陆人所有的siteIds if (dto.getSiteId()==null){ if (userId != null){ List 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 integers = new ArrayList<>(); for (Integer siteId : siteIds) { // 校验有没有这个站点的权限 List t1= partnerClient.getChargingBillMenu(sysUser.getObjectId(),siteId).getData(); Boolean b = t1.get(1); if (b){ integers.add(siteId); } } siteIds = integers; } } if (roleType==1){ siteIds.add(0); } if (siteIds.isEmpty()){ siteIds.add(-1); } dto.setSiteIds(siteIds); List list = this.baseMapper.chargingBillList(pageInfo,dto,startTime1,startTime2); List list1 = this.baseMapper.chargingBillListNoLimit(dto,startTime1,startTime2); BigDecimal paymentAmountTotal = new BigDecimal("0"); BigDecimal orderAmountTotal = new BigDecimal("0"); BigDecimal electrovalenceTotal = new BigDecimal("0"); BigDecimal serviceChargeTotal = new BigDecimal("0"); BigDecimal commissionAmountTotal = new BigDecimal("0"); BigDecimal sharingAmountTotal = new BigDecimal("0"); BigDecimal platformIncomeTotal = new BigDecimal("0"); BigDecimal partnerIncomeTotal = new BigDecimal("0"); BigDecimal chargingCapacityTotal = new BigDecimal("0"); BigDecimal discountTotal = new BigDecimal("0"); BigDecimal refundAmountTotal = new BigDecimal("0"); int orderCount = 0; List chargingBillListVOS = new ArrayList<>(); for (ChargingBillListVO chargingBillListVO : list) { if (roleType==2 && chargingBillListVO.getSiteId()!=0){ chargingBillListVOS.add(chargingBillListVO); } if (roleType ==1 && (siteIds.contains(chargingBillListVO.getSiteId())|| chargingBillListVO.getSiteId()==0)){ chargingBillListVOS.add(chargingBillListVO); } } for (ChargingBillListVO chargingBillListVO : chargingBillListVOS) { if (chargingBillListVO.getSiteId()!=0&&!siteIds.contains(chargingBillListVO.getSiteId())){ continue; } if (roleType == 2){ // 校验有没有这个站点的权限 List t1= partnerClient.getChargingBillMenu(sysUser.getObjectId(),chargingBillListVO.getSiteId()).getData(); chargingBillListVO.setAuthDownLoad(t1.get(0)); if (chargingBillListVO.getSiteId()==0){ continue; } } String temp = ""; String temp1 = ""; switch (chargingBillListVO.getType()){ case 1: temp = "全站账单"; temp1 = "全站"; break; case 2: temp = "各个站点账单"; Site site = data6.stream().filter(e -> e.getId().equals(chargingBillListVO.getSiteId())).findFirst().orElse(null); if(site!=null){ temp1 = site.getName(); } break; } chargingBillVO.setCategory(temp); chargingBillVO.setSiteName(temp1); chargingBillVO.setType("月账单"); chargingBillVO.setCode(chargingBillListVO.getCode()); LocalDateTime billTime = chargingBillListVO.getBillTime(); // 将其转化为yyyy-MM格式字符串 chargingBillVO.setCreateTime(billTime.format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); // 将billTime减去一个月 转化为yyyy-MM格式字符串 chargingBillVO.setBillWeek(billTime.minusMonths(1).format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM"))); chargingBillListVO.setUid(chargingBillListVO.getId().toString()); // 根据账单的出账时间 查询上个月的充电订单 LocalDateTime localDate = chargingBillListVO.getBillTime().minusMonths(1); // 账单周期 chargingBillListVO.setBillWeek(localDate.format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM"))); // 获取 LocalDate 对象 // // 获取该月份的第一天 // 获取该月份的最后一天 LocalDateTime lastDayOfMonth = localDate.with(TemporalAdjusters.lastDayOfMonth()); LocalDateTime firstDayOfMonth = localDate.with(TemporalAdjusters.firstDayOfMonth()); List tChargingOrders = new ArrayList<>(); if (chargingBillListVO.getType() == 2){ tChargingOrders = total.stream().filter(e -> e.getSiteId().equals(chargingBillListVO.getSiteId()) && e.getPayTime().isBefore(lastDayOfMonth.withHour(23).withMinute(59).withSecond(59)) && e.getPayTime().isAfter(firstDayOfMonth.withHour(0).withMinute(0).withSecond(0))).collect(Collectors.toList()); }else{ tChargingOrders = total.stream().filter(e -> e.getPayTime().isBefore(lastDayOfMonth.withHour(23).withMinute(59).withSecond(59)) && e.getPayTime().isAfter(firstDayOfMonth.withHour(0).withMinute(0).withSecond(0))).collect(Collectors.toList()); } int chargingSecond = 0; BigDecimal paymentAmount = new BigDecimal("0"); BigDecimal orderAmount = new BigDecimal("0"); BigDecimal electrovalence = new BigDecimal("0"); BigDecimal serviceCharge = new BigDecimal("0"); BigDecimal commissionAmount = new BigDecimal("0"); BigDecimal sharingAmount = new BigDecimal("0"); BigDecimal chargingCapacity = new BigDecimal("0"); BigDecimal refundAmount = new BigDecimal("0"); chargingBillVO.setCategory(""); chargingBillListVO.setOrderCount(tChargingOrders.size()); chargingBillVO.setExportList(tChargingOrders); int t = 1; for (TChargingOrder tChargingOrder : tChargingOrders) { tChargingOrder.setXuhao(t); t++; if (tChargingOrder.getRechargePaymentType()!=null && tChargingOrder.getRechargePaymentType()==1){ chargingBillListVO.setPayTypeName("微信商户"); } if (tChargingOrder.getRechargePaymentType()!=null && tChargingOrder.getRechargePaymentType()==2){ if (StringUtils.hasLength(chargingBillListVO.getPayTypeName())){ chargingBillListVO.setPayTypeName("微信商户+支付宝商户"); }else{ chargingBillListVO.setPayTypeName("支付宝商户"); } } chargingBillVO.setSiteName(data6.stream().filter(e->e.getId().equals(chargingBillListVO.getSiteId())).findFirst().orElse(new Site()).getName()); TChargingGun data2 = gunList.stream().filter(e -> e.getId().equals(tChargingOrder.getChargingGunId())).findFirst().orElse(null); TChargingPile data1 = pileList.stream().filter(e -> e.getId().equals(tChargingOrder.getChargingPileId())).findFirst().orElse(null); if (data1!=null && data2!=null){ tChargingOrder.setTerminalName(data1.getName()+data2.getName()); tChargingOrder.setTerminalCode(data2.getCode()); } tChargingOrder.setOrderClassification1("线上订单"); tChargingOrder.setRechargePaymentType1("预付"); tChargingOrder.setChargingType("充电桩接口充电服务"); if (tChargingOrder.getStatus()!=null){ switch (tChargingOrder.getStatus()){ case 1: tChargingOrder.setStatus1("等待中"); break; case 2: tChargingOrder.setStatus1("启动中"); break; case 3: tChargingOrder.setStatus1("充电中"); break; case 4: tChargingOrder.setStatus1("停止中"); break; case 5: tChargingOrder.setStatus1("已结束"); break; case 0: tChargingOrder.setStatus1("未知"); break; } } if (tChargingOrder.getEndMode()!=null){ switch (tChargingOrder.getEndMode()){ case 1: tChargingOrder.setEndMode1("主动终止"); break; case 2: tChargingOrder.setEndMode1("满电终止"); break; case 3: tChargingOrder.setEndMode1("费用不足终止"); break; case 0: tChargingOrder.setEndMode1("异常终止"); break; } } tChargingOrder.setDiscount(tChargingOrder.getCouponDiscountAmount()!=null?tChargingOrder.getCouponDiscountAmount().toString():"0"); if (tChargingOrder.getStartTime()!=null && tChargingOrder.getEndTime()!=null){ LocalDateTime startTime = tChargingOrder.getStartTime(); LocalDateTime endTime = tChargingOrder.getEndTime(); // 计算时间差 单位秒 long between = ChronoUnit.SECONDS.between(startTime, endTime); chargingSecond+=between; // 将其转化为xx小时xx分钟xx秒显示 如果是0小时则不展示小时 如果是0分钟则不展示分钟 // 计算小时、分钟和秒 long hours = between / 60 / 60; long minutes = (between % 3600) / 60; long seconds = between % 60; // 如果没有秒数,则默认是0 StringBuilder result = new StringBuilder(); if (hours > 0) { result.append(hours).append("小时"); } if (minutes > 0) { result.append(minutes).append("分钟"); } if (seconds > 0 || result.length() == 0) { // 如果秒数大于0,或者小时和分钟都为0,则显示秒数 result.append(seconds).append("秒"); } tChargingOrder.setChargingTime(result.toString()); } TAppUser data3 = userList.stream().filter(e -> e.getId().equals(tChargingOrder.getAppUserId())).findFirst().orElse(null); if (tChargingOrder.getAppUserCarId()!=null){ TAppUserCar tAppUserCar = carList.stream().filter(e -> e.getId().equals(tChargingOrder.getAppUserCarId())).findFirst().orElse(null); if (tAppUserCar!=null){ tChargingOrder.setLicensePlate(tAppUserCar.getLicensePlate()); tChargingOrder.setVehicleModel(tAppUserCar.getVehicleModel()); } }else{ tChargingOrder.setLicensePlate(tChargingOrder.getPlateNum()); } if (data3!=null){ tChargingOrder.setUserName(data3.getName()); tChargingOrder.setPhone(data3.getPhone()); } List list4 = list3.stream().filter(e -> e.getChargingOrderId().equals(tChargingOrder.getId())).collect(Collectors.toList()); BigDecimal electronic_reduce = list4.stream().map(TChargingOrderAccountingStrategy::getPeriodElectricPrice).reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal service_reduce = list4.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal charging_capacity = list4.stream().map(TChargingOrderAccountingStrategy::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add); if ( !tChargingOrder.getOrderSource().equals(2)){ // 实收 paymentAmount = paymentAmount.add(electronic_reduce).add(service_reduce); BigDecimal add = electronic_reduce.add(service_reduce); tChargingOrder.setTotalAmount(add.toString()); } // 总金额 if (tChargingOrder.getRechargeAmount()!=null){ orderAmount = orderAmount.add(tChargingOrder.getRechargeAmount()); } // 累加累计电费 electrovalence = electrovalence.add(electronic_reduce); if (tChargingOrder.getRefundAmount()!=null && tChargingOrder.getRefundStatus() !=null && tChargingOrder.getRefundStatus() == 2){ refundAmount = refundAmount.add(tChargingOrder.getRefundAmount()); } // 累加累计服务费 if (tChargingOrder.getOrderSource().equals(2)) { serviceCharge = serviceCharge.add(service_reduce.multiply(new BigDecimal("0.8")).setScale(2, BigDecimal.ROUND_DOWN)); // 累加平台分佣 sharingAmount = sharingAmount.add(service_reduce.multiply(new BigDecimal("0.2")).setScale(2,BigDecimal.ROUND_DOWN)); // 累加实收 paymentAmount = paymentAmount.add(electronic_reduce).add(service_reduce.multiply(new BigDecimal("0.8")).setScale(2,BigDecimal.ROUND_DOWN)); BigDecimal add = electronic_reduce.add(service_reduce.multiply(new BigDecimal("0.8"))); tChargingOrder.setTotalAmount(add.toString()); }else { serviceCharge = serviceCharge.add(service_reduce); } // 累加平台手续费 if (tChargingOrder.getRechargeAmount()!=null){ commissionAmount = commissionAmount.add(tChargingOrder.getRechargeAmount().multiply(BigDecimal.valueOf(0.006)).setScale(2,BigDecimal.ROUND_DOWN)); } // 累加充电度数 chargingCapacity = chargingCapacity.add(charging_capacity); } // 将chargingSecond 这是以秒为单位存放的总秒数 将其转化为xx小时xx分钟xx秒 int hours = chargingSecond / 3600; int minutes = (chargingSecond % 3600) / 60; int seconds = chargingSecond % 60; // 格式化为字符串 String timeString = String.format("%d小时%d分钟%d秒", hours, minutes, seconds); chargingBillVO.setChargingTime(timeString); chargingBillListVO.setOrderAmount(paymentAmount); chargingBillListVO.setPaymentAmount(paymentAmount.subtract(sharingAmount).setScale(2,BigDecimal.ROUND_DOWN)); chargingBillListVO.setElectrovalence(electrovalence); chargingBillListVO.setServiceCharge(serviceCharge.setScale(2,BigDecimal.ROUND_DOWN)); chargingBillListVO.setCommissionAmount(commissionAmount.setScale(2,BigDecimal.ROUND_DOWN)); chargingBillListVO.setSharingAmount(sharingAmount.setScale(2,BigDecimal.ROUND_DOWN)); chargingBillListVO.setChargingCapacity(chargingCapacity); switch (chargingBillListVO.getType()){ case 1: chargingBillListVO.setSiteName("全站"); break; case 2: Site site = data6.stream().filter(e -> e.getId().equals(chargingBillListVO.getSiteId())).findFirst().orElse(null); if (site!=null){ chargingBillListVO.setSiteName(site.getName()); } break; } // 订单数 chargingBillListVO.setOrderCount(tChargingOrders.size()); // 充电时间秒 chargingBillListVO.setChargingSecond(chargingSecond); Map incomeMap = calculateChargingBillIncome(chargingBillListVO.getType(), chargingBillListVO.getSiteId(), chargingBillListVO.getBillWeek(), tChargingOrders, list3, siteServiceShareRatioMap); chargingBillListVO.setPlatformIncome(incomeMap.get("platformIncome")); chargingBillListVO.setPartnerIncome(incomeMap.get("partnerIncome")); } for (ChargingBillListVO chargingBillListVO : list1) { if (dto.getType() == 1){ if (chargingBillListVO.getSiteId()!=0){ continue; } }else{ if (chargingBillListVO.getSiteId()!=0&&!siteIds.contains(chargingBillListVO.getSiteId())){ continue; } if (chargingBillListVO.getType()==1){ continue; } } if (roleType == 2){ if (chargingBillListVO.getSiteId()==0){ continue; } } LocalDateTime billTime = chargingBillListVO.getBillTime(); // 将其转化为yyyy-MM格式字符串 chargingBillVO.setCreateTime(billTime.format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); // 将billTime减去一个月 转化为yyyy-MM格式字符串 chargingBillVO.setBillWeek(billTime.minusMonths(1).format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM"))); chargingBillListVO.setUid(chargingBillListVO.getId().toString()); // 根据账单的出账时间 查询上个月的充电订单 LocalDateTime localDate = chargingBillListVO.getBillTime().minusMonths(1); // 账单周期 chargingBillListVO.setBillWeek(localDate.format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM"))); // 获取 LocalDate 对象 // // 获取该月份的第一天 // 获取该月份的最后一天 LocalDateTime lastDayOfMonth = localDate.with(TemporalAdjusters.lastDayOfMonth()); LocalDateTime firstDayOfMonth = localDate.with(TemporalAdjusters.firstDayOfMonth()); List tChargingOrders = new ArrayList<>(); if (chargingBillListVO.getType() == 2){ tChargingOrders = total.stream().filter(e -> e.getSiteId().equals(chargingBillListVO.getSiteId()) && e.getPayTime().isBefore(lastDayOfMonth.withHour(23).withMinute(59).withSecond(59)) && e.getPayTime().isAfter(firstDayOfMonth.withHour(0).withMinute(0).withSecond(0))).collect(Collectors.toList()); }else{ tChargingOrders = total.stream().filter(e -> e.getPayTime().isBefore(lastDayOfMonth.withHour(23).withMinute(59).withSecond(59)) && e.getPayTime().isAfter(firstDayOfMonth.withHour(0).withMinute(0).withSecond(0))).collect(Collectors.toList()); } orderCount+=tChargingOrders.size(); BigDecimal paymentAmount = new BigDecimal("0"); BigDecimal orderAmount = new BigDecimal("0"); BigDecimal electrovalence = new BigDecimal("0"); BigDecimal serviceCharge = new BigDecimal("0"); BigDecimal commissionAmount = new BigDecimal("0"); BigDecimal sharingAmount = new BigDecimal("0"); BigDecimal chargingCapacity = new BigDecimal("0"); chargingBillListVO.setOrderCount(tChargingOrders.size()); for (TChargingOrder tChargingOrder : tChargingOrders) { List list4 = list3.stream().filter(e -> e.getChargingOrderId().equals(tChargingOrder.getId())).collect(Collectors.toList()); BigDecimal electronic_reduce = list4.stream().map(TChargingOrderAccountingStrategy::getPeriodElectricPrice).reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal service_reduce = list4.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal charging_capacity = list4.stream().map(TChargingOrderAccountingStrategy::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add); // 累加实收金额 if (!tChargingOrder.getOrderSource().equals(2)){ paymentAmount = paymentAmount.add(electronic_reduce.add(service_reduce)); paymentAmountTotal = paymentAmountTotal.add(electronic_reduce.add(service_reduce)); } // 累加订单金额 if (tChargingOrder.getRechargeAmount()!=null){ orderAmount = orderAmount.add(tChargingOrder.getRechargeAmount()); orderAmountTotal = orderAmountTotal.add(tChargingOrder.getRechargeAmount()); } // 累加累计电费 if (tChargingOrder.getElectrovalence()!=null){ electrovalence = electrovalence.add(electronic_reduce); electrovalenceTotal = electrovalenceTotal.add(electronic_reduce); } if (tChargingOrder.getRefundAmount()!=null && tChargingOrder.getRefundStatus() !=null && tChargingOrder.getRefundStatus() == 2){ refundAmountTotal = refundAmountTotal.add(tChargingOrder.getRefundAmount()); } // 累加累计服务费 if (tChargingOrder.getOrderSource().equals(2)) { serviceCharge = serviceCharge.add(service_reduce.multiply(new BigDecimal("0.8")).setScale(2, BigDecimal.ROUND_DOWN)); serviceChargeTotal = serviceChargeTotal.add(service_reduce.multiply(new BigDecimal("0.8")).setScale(2, BigDecimal.ROUND_DOWN)); // 累加平台分佣 sharingAmount = sharingAmount.add(service_reduce.multiply(new BigDecimal("0.2")).setScale(2, BigDecimal.ROUND_DOWN)); sharingAmountTotal = sharingAmountTotal.add(service_reduce.multiply(new BigDecimal("0.2")).setScale(2, BigDecimal.ROUND_DOWN)); // 累加实收 paymentAmount = paymentAmount.add(electronic_reduce.add(service_reduce.multiply(new BigDecimal("0.8")).setScale(2,BigDecimal.ROUND_DOWN))); paymentAmountTotal = paymentAmountTotal.add(electronic_reduce.add(service_reduce.multiply(new BigDecimal("0.8")).setScale(2,BigDecimal.ROUND_DOWN))); }else{ serviceCharge = serviceCharge.add(service_reduce); serviceChargeTotal = serviceChargeTotal.add(service_reduce); } // 累加平台手续费 if (tChargingOrder.getOrderAmount()!=null){ commissionAmount = commissionAmount.add(tChargingOrder.getRechargeAmount().multiply(new BigDecimal("0.006")).setScale(2,BigDecimal.ROUND_DOWN)); commissionAmountTotal = commissionAmountTotal.add(tChargingOrder.getRechargeAmount().multiply(new BigDecimal("0.006")).setScale(2,BigDecimal.ROUND_DOWN)); } // 累加充电度数 chargingCapacity = chargingCapacity.add(charging_capacity); chargingCapacityTotal = chargingCapacityTotal.add(charging_capacity); // 累加优惠金额 if (tChargingOrder.getCouponDiscountAmount()!=null){ discountTotal = discountTotal.add(tChargingOrder.getCouponDiscountAmount()); } if (tChargingOrder.getVipDiscountAmount()!=null){ discountTotal = discountTotal.add(tChargingOrder.getVipDiscountAmount()); } } Map incomeMap = calculateChargingBillIncome(chargingBillListVO.getType(), chargingBillListVO.getSiteId(), chargingBillListVO.getBillWeek(), tChargingOrders, list3, siteServiceShareRatioMap); platformIncomeTotal = platformIncomeTotal.add(incomeMap.get("platformIncome")); partnerIncomeTotal = partnerIncomeTotal.add(incomeMap.get("partnerIncome")); } chargingBillVO.setChargingCapacity(chargingCapacityTotal); chargingBillVO.setPaymentAmount(paymentAmountTotal.subtract(commissionAmountTotal).subtract(sharingAmountTotal).setScale(2, BigDecimal.ROUND_DOWN)); chargingBillVO.setOrderAmount(orderAmountTotal.setScale(2, BigDecimal.ROUND_DOWN)); chargingBillVO.setElectrovalence(electrovalenceTotal.setScale(2, BigDecimal.ROUND_DOWN)); chargingBillVO.setServiceCharge(serviceChargeTotal.setScale(2, BigDecimal.ROUND_DOWN)); chargingBillVO.setOrderCount(orderCount); chargingBillVO.setCommissionAmount(commissionAmountTotal.setScale(2, BigDecimal.ROUND_DOWN)); chargingBillVO.setSharingAmount(sharingAmountTotal.setScale(2, BigDecimal.ROUND_DOWN)); chargingBillVO.setPlatformIncome(platformIncomeTotal.setScale(2, RoundingMode.HALF_UP)); chargingBillVO.setPartnerIncome(partnerIncomeTotal.setScale(2, RoundingMode.HALF_UP)); chargingBillVO.setDiscount(discountTotal.setScale(2, BigDecimal.ROUND_DOWN)); pageInfo.setRecords(chargingBillListVOS); chargingBillVO.setList(pageInfo); return chargingBillVO; } private Map calculateChargingBillIncome(Integer billType, Integer billSiteId, String billingCycle, List allOrders, List allStrategies, Map siteServiceShareRatioMap) { Map incomeMap = new HashMap<>(); BigDecimal platformIncome = BigDecimal.ZERO; BigDecimal partnerIncome = BigDecimal.ZERO; if (!StringUtils.hasLength(billingCycle) || allOrders == null || allOrders.isEmpty()) { incomeMap.put("platformIncome", platformIncome); incomeMap.put("partnerIncome", partnerIncome); return incomeMap; } LocalDate billMonth = LocalDate.parse(billingCycle + "-01"); LocalDateTime firstDayOfMonth = billMonth.withDayOfMonth(1).atStartOfDay(); LocalDateTime lastDayOfMonth = billMonth.with(TemporalAdjusters.lastDayOfMonth()).atTime(23, 59, 59); List strategies = allStrategies == null ? Collections.emptyList() : allStrategies; for (TChargingOrder order : allOrders) { if (order == null || order.getPayTime() == null) { continue; } if (billType != null && billType == 2 && !billSiteId.equals(order.getSiteId())) { continue; } if (order.getPayTime().isBefore(firstDayOfMonth) || order.getPayTime().isAfter(lastDayOfMonth)) { continue; } List orderStrategies = strategies.stream() .filter(strategy -> strategy.getChargingOrderId().equals(order.getId())) .collect(Collectors.toList()); BigDecimal electronicReduce = orderStrategies.stream() .map(TChargingOrderAccountingStrategy::getPeriodElectricPrice) .reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal serviceReduce = orderStrategies.stream() .map(TChargingOrderAccountingStrategy::getPeriodServicePrice) .reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal paymentAmount; if (Integer.valueOf(2).equals(order.getOrderSource())) { paymentAmount = electronicReduce.add(serviceReduce.multiply(new BigDecimal("0.8")).setScale(2, RoundingMode.DOWN)); } else { paymentAmount = electronicReduce.add(serviceReduce); if (Integer.valueOf(1).equals(order.getOrderSource())) { BigDecimal serviceShareRatio = siteServiceShareRatioMap.get(order.getSiteId()); if (serviceShareRatio != null && serviceShareRatio.compareTo(BigDecimal.ZERO) > 0) { partnerIncome = partnerIncome.add(serviceReduce.multiply(serviceShareRatio).divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP)); } } } platformIncome = platformIncome.add(paymentAmount); } platformIncome = platformIncome.subtract(partnerIncome).max(BigDecimal.ZERO); incomeMap.put("platformIncome", platformIncome.setScale(2, RoundingMode.HALF_UP)); incomeMap.put("partnerIncome", partnerIncome.setScale(2, RoundingMode.HALF_UP)); return incomeMap; } private List filterAccountSettlementOrders(List orders, Integer payType) { if (orders == null || orders.isEmpty() || payType == null || payType == 0) { return orders == null ? Collections.emptyList() : orders; } return orders.stream() .filter(order -> accountSettlementOrderMatches(order, payType)) .collect(Collectors.toList()); } private boolean accountSettlementOrderMatches(TChargingOrder order, Integer payType) { if (order == null || payType == null) { return true; } if (payType == 1) { return !isIcbcOrder(order) && Integer.valueOf(1).equals(order.getRechargePaymentType()); } if (payType == 2) { return !isIcbcOrder(order) && (Integer.valueOf(2).equals(order.getRechargePaymentType()) || Integer.valueOf(3).equals(order.getRechargePaymentType())); } if (payType == 3) { return isIcbcOrder(order) && Integer.valueOf(1).equals(order.getOrderSource()); } return true; } private String resolveAccountPayTypeName(Integer payType, List orders) { if (payType != null && payType != 0) { switch (payType) { case 1: return "微信商户"; case 2: return "支付宝商户"; case 3: return "工商银行商户"; default: break; } } boolean hasWx = false; boolean hasAli = false; boolean hasIcbc = false; if (orders != null) { for (TChargingOrder order : orders) { if (isIcbcOrder(order)) { hasIcbc = true; } else if (Integer.valueOf(1).equals(order.getRechargePaymentType())) { hasWx = true; } else if (Integer.valueOf(2).equals(order.getRechargePaymentType()) || Integer.valueOf(3).equals(order.getRechargePaymentType())) { hasAli = true; } } } List names = new ArrayList<>(); if (hasWx) { names.add("微信商户"); } if (hasAli) { names.add("支付宝商户"); } if (hasIcbc) { names.add("工商银行商户"); } return names.isEmpty() ? "" : String.join("+", names); } private boolean isIcbcOrder(TChargingOrder order) { return order != null && "ICBC".equals(order.getSourceName()); } private Map loadSiteServiceShareRatioMap() { Map ratioMap = new HashMap<>(); R> siteResult = siteClient.getSiteAll(); R> partnerResult = siteClient.getAllPartner(); List sites = siteResult == null ? Collections.emptyList() : siteResult.getData(); List partners = partnerResult == null ? Collections.emptyList() : partnerResult.getData(); if (sites == null || sites.isEmpty() || partners == null || partners.isEmpty()) { return ratioMap; } Map partnerMap = partners.stream() .filter(partner -> partner != null && partner.getId() != null) .collect(Collectors.toMap(Partner::getId, partner -> partner, (left, right) -> left)); for (Site site : sites) { if (site == null || site.getId() == null || site.getPartnerId() == null) { continue; } Partner partner = partnerMap.get(site.getPartnerId()); if (partner != null && partner.getServiceShareRatio() != null) { ratioMap.put(site.getId(), partner.getServiceShareRatio()); } } return ratioMap; } }