package com.ruoyi.chargingPile.service.impl;
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.ruoyi.account.api.feignClient.AppUserClient;
|
import com.ruoyi.account.api.model.TAppUser;
|
import com.ruoyi.chargingPile.api.model.TAccountingStrategy;
|
import com.ruoyi.chargingPile.api.model.TAccountingStrategyDetail;
|
import com.ruoyi.chargingPile.api.vo.StrategyPriceVO;
|
import com.ruoyi.chargingPile.api.vo.TAccountingStrategyDetailVO;
|
import com.ruoyi.chargingPile.mapper.TAccountingStrategyDetailMapper;
|
import com.ruoyi.chargingPile.mapper.TAccountingStrategyMapper;
|
import com.ruoyi.chargingPile.service.TAccountingStrategyDetailService;
|
import com.ruoyi.common.core.exception.ServiceException;
|
import com.ruoyi.common.security.service.TokenService;
|
import com.ruoyi.other.api.domain.TVip;
|
import com.ruoyi.other.api.feignClient.VipClient;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
|
import javax.annotation.Resource;
|
import java.math.BigDecimal;
|
import java.time.LocalTime;
|
import java.util.ArrayList;
|
import java.util.Comparator;
|
import java.util.List;
|
import java.util.Objects;
|
import java.util.stream.Collectors;
|
|
/**
|
* <p>
|
* 计费策略明细 服务实现类
|
* </p>
|
*
|
* @author xiaochen
|
* @since 2024-08-06
|
*/
|
@Service
|
public class TAccountingStrategyDetailServiceImpl extends ServiceImpl<TAccountingStrategyDetailMapper, TAccountingStrategyDetail> implements TAccountingStrategyDetailService {
|
|
@Autowired
|
private TAccountingStrategyMapper accountingStrategyMapper;
|
@Autowired
|
private VipClient vipClient;
|
@Autowired
|
private TokenService tokenService;
|
@Autowired
|
private AppUserClient appUserClient;
|
@Override
|
public List<TAccountingStrategyDetailVO> queryAccountingStrategyDetailByStrategyId(Integer strategyId) {
|
return this.baseMapper.queryAccountingStrategyDetailByStrategyId(strategyId);
|
}
|
|
@Override
|
public List<TAccountingStrategyDetailVO> queryStrategyBySiteIdAndTime(Integer siteId) {
|
TAccountingStrategy accountingStrategy = accountingStrategyMapper.selectOne(Wrappers.lambdaQuery(TAccountingStrategy.class)
|
.eq(TAccountingStrategy::getSiteId, siteId)
|
.last("limit 1"));
|
if(Objects.isNull(accountingStrategy)){
|
throw new ServiceException("未查询到计费策略");
|
}
|
List<TAccountingStrategyDetailVO> list = this.queryAccountingStrategyDetailByStrategyId(accountingStrategy.getId());
|
// 获取当前登录用户id
|
Long userId = tokenService.getLoginUserApplet().getUserId();
|
// 根据id查询用户信息
|
TAppUser appUser = appUserClient.getUserById(userId).getData();
|
if(Objects.nonNull(appUser) && Objects.nonNull(appUser.getVipId())){
|
// 查询会员信息
|
TVip vip = vipClient.getInfo1(appUser.getVipId()).getData();
|
TAccountingStrategyDetailVO accountingStrategyDetailVO;
|
TAccountingStrategyDetailVO accountingStrategyDetailNext;
|
if(Objects.nonNull(vip) && vip.getType() == 2){
|
// 获取当前时间段的计费策略明细
|
accountingStrategyDetailVO = list.stream().filter(detail -> detail.getStartTime().compareTo(LocalTime.now().toString()) <= 0 && detail.getEndTime().compareTo(LocalTime.now().toString()) >= 0)
|
.findFirst().orElseThrow(() -> new ServiceException("当前时间段未查询到计费策略明细"));
|
accountingStrategyDetailVO.setDiscount(accountingStrategyDetailVO.getElectrovalence().add(accountingStrategyDetailVO.getServiceCharge()).multiply(vip.getDiscount()));
|
// 获取后一次的计费策略明细
|
accountingStrategyDetailNext = list.stream().filter(detail -> detail.getStartTime().compareTo(accountingStrategyDetailVO.getEndTime()) == 0)
|
.findFirst().orElseThrow(() -> new ServiceException("未查询到下一时间段的计费策略明细"));
|
accountingStrategyDetailNext.setDiscount(accountingStrategyDetailNext.getElectrovalence().add(accountingStrategyDetailNext.getServiceCharge()).multiply(vip.getDiscount()));
|
}else {
|
// 获取当前时间段的计费策略明细
|
accountingStrategyDetailVO = list.stream().filter(detail -> detail.getStartTime().compareTo(LocalTime.now().toString()) <= 0 && detail.getEndTime().compareTo(LocalTime.now().toString()) >= 0)
|
.findFirst().orElseThrow(() -> new ServiceException("当前时间段未查询到计费策略明细"));
|
accountingStrategyDetailVO.setDiscount(accountingStrategyDetailVO.getElectrovalence().add(accountingStrategyDetailVO.getServiceCharge()).multiply(accountingStrategy.getDiscount()));
|
// 获取后一次的计费策略明细
|
accountingStrategyDetailNext = list.stream().filter(detail -> detail.getStartTime().compareTo(accountingStrategyDetailVO.getEndTime()) == 0)
|
.findFirst().orElseThrow(() -> new ServiceException("未查询到下一时间段的计费策略明细"));
|
accountingStrategyDetailNext.setDiscount(accountingStrategyDetailNext.getElectrovalence().add(accountingStrategyDetailNext.getServiceCharge()).multiply(accountingStrategy.getDiscount()));
|
}
|
list = new ArrayList<>();
|
list.add(accountingStrategyDetailVO);
|
list.add(accountingStrategyDetailNext);
|
return list;
|
}
|
return new ArrayList<>();
|
}
|
|
@Override
|
public StrategyPriceVO queryPrice(Integer siteId) {
|
TAccountingStrategy accountingStrategy = accountingStrategyMapper.selectOne(Wrappers.lambdaQuery(TAccountingStrategy.class)
|
.eq(TAccountingStrategy::getSiteId, siteId)
|
.last("limit 1"));
|
if(Objects.isNull(accountingStrategy)){
|
throw new ServiceException("未查询到计费策略");
|
}
|
|
StrategyPriceVO strategyPriceVO = new StrategyPriceVO();
|
|
List<TAccountingStrategyDetailVO> list = this.queryAccountingStrategyDetailByStrategyId(accountingStrategy.getId());
|
// 获取当前时间段的计费策略明细
|
TAccountingStrategyDetailVO accountingStrategyDetailVO = list.stream().filter(detail -> detail.getStartTime().compareTo(LocalTime.now().toString()) <= 0 && detail.getEndTime().compareTo(LocalTime.now().toString()) >= 0)
|
.findFirst().orElseThrow(() -> new ServiceException("当前时间段未查询到计费策略明细"));
|
strategyPriceVO.setDiscountAmount(accountingStrategyDetailVO.getElectrovalence().add(accountingStrategyDetailVO.getServiceCharge())
|
.subtract(accountingStrategyDetailVO.getServiceCharge().multiply(accountingStrategy.getDiscount())).setScale(2, BigDecimal.ROUND_HALF_UP));
|
// 查询最高抵扣的会员
|
TVip maximumDeduction = vipClient.getVipInfoByType(1).getData();
|
strategyPriceVO.setMaxDiscountAmount(maximumDeduction.getMaximumDeduction());
|
// 查询最低起步价会员
|
TVip monthlyCard = vipClient.getVipInfoByType(2).getData();
|
strategyPriceVO.setVipStartPrice(monthlyCard.getMonthlyCard());
|
// 查询最高折扣的会员
|
TVip monthlyCardDiscount = vipClient.getVipInfoByType(3).getData();
|
strategyPriceVO.setServiceFeeDiscount(monthlyCardDiscount.getMonthlyCardDiscount());
|
return strategyPriceVO;
|
}
|
|
@Override
|
public Boolean isStrategy24Hour(List<TAccountingStrategyDetail> accountingStrategyDetails) {
|
String START_OF_DAY = "00:00:00";
|
String END_OF_DAY = "24:00:00";
|
List<TAccountingStrategyDetail> sortedDetails = accountingStrategyDetails.stream()
|
.sorted(Comparator.comparing(TAccountingStrategyDetail::getStartTime))
|
.collect(Collectors.toList());
|
|
boolean isFirstElementValid = sortedDetails.isEmpty() || !START_OF_DAY.equals(sortedDetails.get(0).getStartTime());
|
boolean isLastElementValid = sortedDetails.isEmpty() || !END_OF_DAY.equals(sortedDetails.get(sortedDetails.size() - 1).getEndTime());
|
|
boolean isTimeContinuous = sortedDetails.stream()
|
.skip(1)
|
.allMatch(detail -> detail.getStartTime().equals(sortedDetails.get(sortedDetails.indexOf(detail) - 1).getEndTime()));
|
|
return isFirstElementValid || isLastElementValid || !isTimeContinuous;
|
}
|
}
|