xuhy
2024-08-24 bf97fa0e67a01dbb0b9df0bed5c81f8f50bf538c
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TAccountingStrategyDetailServiceImpl.java
@@ -4,14 +4,17 @@
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.Site;
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.ISiteService;
import com.ruoyi.chargingPile.service.TAccountingStrategyDetailService;
import com.ruoyi.common.core.exception.ServiceException;
import com.ruoyi.common.core.utils.DateUtils;
import com.ruoyi.common.security.service.TokenService;
import com.ruoyi.other.api.domain.TVip;
import com.ruoyi.other.api.feignClient.VipClient;
@@ -45,6 +48,8 @@
    @Autowired
    private TokenService tokenService;
    @Autowired
    private ISiteService siteService;
    @Autowired
    private AppUserClient appUserClient;
    @Override
    public List<TAccountingStrategyDetailVO> queryAccountingStrategyDetailByStrategyId(Integer strategyId) {
@@ -53,9 +58,8 @@
    @Override
    public List<TAccountingStrategyDetailVO> queryStrategyBySiteIdAndTime(Integer siteId) {
        TAccountingStrategy accountingStrategy = accountingStrategyMapper.selectOne(Wrappers.lambdaQuery(TAccountingStrategy.class)
                .eq(TAccountingStrategy::getSiteId, siteId)
                .last("limit 1"));
        Site site = siteService.getById(siteId);
        TAccountingStrategy accountingStrategy = accountingStrategyMapper.selectById(site.getAccountingStrategyId());
        if(Objects.isNull(accountingStrategy)){
            throw new ServiceException("未查询到计费策略");
        }
@@ -64,28 +68,23 @@
        Long userId = tokenService.getLoginUserApplet().getUserId();
        // 根据id查询用户信息
        TAppUser appUser = appUserClient.getUserById(userId).getData();
        if(Objects.nonNull(appUser) && Objects.nonNull(appUser.getVipId())){
        if(Objects.nonNull(appUser)){
            // 查询会员信息
            TVip vip = vipClient.getInfo1(appUser.getVipId()).getData();
            TAccountingStrategyDetailVO accountingStrategyDetailVO;
            TAccountingStrategyDetailVO accountingStrategyDetailNext;
            // 获取当前时间段的计费策略明细
            accountingStrategyDetailVO = list.stream().filter(detail -> DateUtils.string2LocalTime(detail.getStartTime() + ":00").compareTo(LocalTime.now()) <= 0
                            && DateUtils.string2LocalTime(detail.getEndTime() + ":00").compareTo(LocalTime.now()) > 0)
                    .findFirst().orElseThrow(() -> new ServiceException("当前时间段未查询到计费策略明细"));
            // 获取后一次的计费策略明细
            accountingStrategyDetailNext = list.stream().filter(detail -> detail.getStartTime().compareTo(accountingStrategyDetailVO.getEndTime()) == 0)
                    .findFirst().orElseThrow(() -> new ServiceException("未查询到下一时间段的计费策略明细"));
            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<>();
@@ -127,19 +126,16 @@
    @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 isFirstElementValid = sortedDetails.isEmpty() || !sortedDetails.get(0).getStartTime().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;
        return isFirstElementValid || !isTimeContinuous;
    }
}