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.api.vo.AccountListVO;
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.HashSet;
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;
@Resource
private ITAccountSettlementStatementService accountSettlementStatementService;
@Override
public AccountListVO accountSettlementBillList(ChargingListQuery dto) {
SysUser sysUser = sysUserClient.getSysUser(tokenService.getLoginUser().getUserid()).getData();
List siteIds = resolveAccountStatementSiteIds(dto, sysUser);
LocalDate[] cycleRange = resolveBillingCycleRange(dto.getDateRange());
PageInfo statementPage = accountSettlementStatementService.queryPage(
dto, siteIds, cycleRange[0], cycleRange[1]);
AccountListVO result = accountSettlementStatementService.querySummary(
dto, siteIds, cycleRange[0], cycleRange[1]);
if (result == null) {
result = new AccountListVO();
}
Set pageSiteIds = statementPage.getRecords().stream()
.map(TAccountSettlementStatement::getSiteId)
.filter(siteId -> siteId != null && siteId > 0)
.collect(Collectors.toSet());
Map siteNameMap = pageSiteIds.isEmpty() ? Collections.emptyMap()
: safeData(siteClient.getSiteByIds(new ArrayList<>(pageSiteIds))).stream()
.collect(Collectors.toMap(Site::getId, Site::getName, (first, ignored) -> first));
List records = statementPage.getRecords().stream()
.map(statement -> toAccountStatementVO(statement, siteNameMap))
.collect(Collectors.toList());
PageInfo page = new PageInfo<>(statementPage.getCurrent(), statementPage.getSize());
page.setTotal(statementPage.getTotal());
page.setRecords(records);
result.setList(page);
result.setOrderList(Collections.emptyList());
result.setBillCount(result.getBillCount() == null ? 0 : result.getBillCount());
result.setTotalAmount(zeroIfNull(result.getTotalAmount()));
result.setPaymentAmount(zeroIfNull(result.getPaymentAmount()));
result.setRefundAmount(zeroIfNull(result.getRefundAmount()));
result.setCommissionAmount(zeroIfNull(result.getCommissionAmount()));
result.setSharingAmount(zeroIfNull(result.getSharingAmount()));
result.setPlatformIncome(zeroIfNull(result.getPlatformIncome()));
result.setPartnerIncome(zeroIfNull(result.getPartnerIncome()));
return result;
}
private List resolveAccountStatementSiteIds(ChargingListQuery dto, SysUser sysUser) {
List siteIds = new ArrayList<>();
if (dto.getSiteId() != null) {
siteIds.add(dto.getSiteId());
} else {
List sites = safeData(siteClient.getSiteListByUserId(tokenService.getLoginUser().getUserid()));
siteIds.addAll(sites.stream().map(GetSiteListDTO::getId).filter(Objects::nonNull).collect(Collectors.toList()));
}
if (Integer.valueOf(2).equals(sysUser.getRoleType())) {
siteIds = siteIds.stream().filter(siteId -> {
List permissions = safeData(partnerClient.getAccountMenu(sysUser.getObjectId(), siteId));
return permissions.size() > 1 && Boolean.TRUE.equals(permissions.get(1));
}).collect(Collectors.toList());
}
if (Integer.valueOf(1).equals(sysUser.getRoleType())) {
siteIds.add(0);
}
if (siteIds.isEmpty()) {
siteIds.add(-1);
}
return siteIds.stream().distinct().collect(Collectors.toList());
}
private LocalDate[] resolveBillingCycleRange(List dateRange) {
LocalDate start = null;
LocalDate end = null;
if (dateRange != null && !dateRange.isEmpty()) {
start = parseBillingMonth(dateRange.get(0));
String endValue = dateRange.size() > 1 ? dateRange.get(1) : dateRange.get(0);
LocalDate endMonth = parseBillingMonth(endValue);
end = endMonth == null ? null : endMonth.plusMonths(1);
}
return new LocalDate[]{start, end};
}
private LocalDate parseBillingMonth(String value) {
if (!StringUtils.hasLength(value) || value.length() < 7) {
return null;
}
return LocalDate.parse(value.substring(0, 7) + "-01");
}
private ChargingBillListVO toAccountStatementVO(TAccountSettlementStatement statement,
Map siteNameMap) {
ChargingBillListVO vo = new ChargingBillListVO();
vo.setId(statement.getId());
vo.setUid(String.valueOf(statement.getId()));
vo.setCode(statement.getCode());
vo.setType(Integer.valueOf(0).equals(statement.getSiteId()) ? 1 : 2);
vo.setSiteId(statement.getSiteId());
vo.setSiteName(Integer.valueOf(0).equals(statement.getSiteId())
? "全站" : siteNameMap.getOrDefault(statement.getSiteId(), "-"));
vo.setStatus(statement.getStatus());
vo.setOrderState(2);
vo.setPayType(statement.getAccountType());
vo.setPayTypeName(accountTypeName(statement.getAccountType()));
vo.setBillWeek(statement.getBillingCycle() == null
? null : statement.getBillingCycle().format(DateTimeFormatter.ofPattern("yyyy-MM")));
vo.setBillTime(statement.getCreateTime());
vo.setCreateTime(statement.getCreateTime());
vo.setPaymentAmount(zeroIfNull(statement.getRechargeAmount()));
vo.setRefundAmount(zeroIfNull(statement.getRefundAmount()));
vo.setCommissionAmount(zeroIfNull(statement.getPlatformFee()));
vo.setSharingAmount(zeroIfNull(statement.getTripartiteCommission()));
vo.setBillMoney(zeroIfNull(statement.getRecordedAmount()));
vo.setPlatformIncome(zeroIfNull(statement.getPlatformIncome()));
vo.setPartnerIncome(zeroIfNull(statement.getPartnerIncome()));
vo.setAuthDownLoad(false);
return vo;
}
private String accountTypeName(Integer accountType) {
if (Integer.valueOf(1).equals(accountType)) {
return "微信商户";
}
if (Integer.valueOf(2).equals(accountType)) {
return "支付宝商户";
}
if (Integer.valueOf(3).equals(accountType)) {
return "工商银行商户";
}
return "-";
}
private BigDecimal zeroIfNull(BigDecimal value) {
return value == null ? BigDecimal.ZERO : value;
}
@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];
}
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);
List billScope = list1.isEmpty() ? list : list1;
LocalDateTime scopeStart = billScope.stream()
.map(ChargingBillListVO::getBillTime)
.filter(Objects::nonNull)
.map(time -> time.minusMonths(1).with(TemporalAdjusters.firstDayOfMonth()).toLocalDate().atStartOfDay())
.min(LocalDateTime::compareTo)
.orElse(null);
LocalDateTime scopeEnd = billScope.stream()
.map(ChargingBillListVO::getBillTime)
.filter(Objects::nonNull)
.map(time -> time.minusMonths(1).with(TemporalAdjusters.lastDayOfMonth()).withHour(23).withMinute(59).withSecond(59))
.max(LocalDateTime::compareTo)
.orElse(null);
Set scopedSiteIds = billScope.stream()
.filter(item -> Integer.valueOf(2).equals(item.getType()))
.map(ChargingBillListVO::getSiteId)
.filter(id -> id != null && id > 0)
.collect(Collectors.toSet());
boolean onlySiteBills = !billScope.isEmpty() && billScope.stream().allMatch(item -> Integer.valueOf(2).equals(item.getType()));
LambdaQueryWrapper orderQuery = new LambdaQueryWrapper()
.isNotNull(TChargingOrder::getPayTime)
.between(scopeStart != null && scopeEnd != null, TChargingOrder::getPayTime, scopeStart, scopeEnd)
.in(onlySiteBills && !scopedSiteIds.isEmpty(), TChargingOrder::getSiteId, scopedSiteIds);
List total = billScope.isEmpty() ? Collections.emptyList() : chargingOrderList.selectList(orderQuery);
List orderIds = total.stream().map(TChargingOrder::getId).filter(Objects::nonNull).collect(Collectors.toList());
List totalRefund = orderIds.isEmpty() ? Collections.emptyList()
: chargingOrderRefundService.lambdaQuery()
.eq(TChargingOrderRefund::getRefundStatus, 2)
.in(TChargingOrderRefund::getChargingOrderId, orderIds)
.list();
Set lookupSiteIds = total.stream().map(TChargingOrder::getSiteId).filter(Objects::nonNull).filter(id -> id > 0).collect(Collectors.toSet());
lookupSiteIds.addAll(scopedSiteIds);
List siteList = lookupSiteIds.isEmpty() ? Collections.emptyList() : safeData(siteClient.getSiteByIds(new ArrayList<>(lookupSiteIds)));
List pileList = lookupSiteIds.isEmpty() ? Collections.emptyList() : safeData(chargingPileClient.getChargingPileBySiteIds(new ArrayList<>(lookupSiteIds)));
List gunIds = total.stream().map(TChargingOrder::getChargingGunId).filter(Objects::nonNull).distinct().collect(Collectors.toList());
List gunList = gunIds.isEmpty() ? Collections.emptyList() : safeData(chargingGunClient.getChargingGunByIds(gunIds));
List userIds = total.stream().map(TChargingOrder::getAppUserId).filter(Objects::nonNull).distinct().collect(Collectors.toList());
List userList = userIds.isEmpty() ? Collections.emptyList() : safeData(appUserClient.getUserByIds(userIds));
List carIds = total.stream().map(TChargingOrder::getAppUserCarId).filter(Objects::nonNull).distinct().collect(Collectors.toList());
List carList = carIds.isEmpty() ? Collections.emptyList() : safeData(appUserCarClient.getCarByIds(carIds));
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 = orderIds.isEmpty() ? Collections.emptyList()
: chargingOrderAccountingStrategyService.lambdaQuery()
.in(TChargingOrderAccountingStrategy::getChargingOrderId, orderIds)
.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<>();
Map> chargingBillPermissionMap = new HashMap<>();
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 permissions = safeData(partnerClient.getChargingBillMenu(sysUser.getObjectId(), siteId));
chargingBillPermissionMap.put(siteId, permissions);
if (permissions.size() > 1 && Boolean.TRUE.equals(permissions.get(1))){
integers.add(siteId);
}
}
siteIds = integers;
}
}
if (roleType==1){
siteIds.add(0);
}
if (siteIds.isEmpty()){
siteIds.add(-1);
}
dto.setSiteIds(siteIds);
PageInfo