From 14f62b1e99c93facce4245dbae56b9f43cb0e017 Mon Sep 17 00:00:00 2001
From: xuhy <3313886187@qq.com>
Date: 星期三, 18 九月 2024 18:23:45 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TAccountingStrategyDetailServiceImpl.java |   88 +++++++++++++++++++++++++++-----------------
 1 files changed, 54 insertions(+), 34 deletions(-)

diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TAccountingStrategyDetailServiceImpl.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TAccountingStrategyDetailServiceImpl.java
index 979620c..2412c8c 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TAccountingStrategyDetailServiceImpl.java
+++ b/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;
@@ -21,10 +24,7 @@
 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.*;
 import java.util.stream.Collectors;
 
 /**
@@ -45,6 +45,8 @@
     @Autowired
     private TokenService tokenService;
     @Autowired
+    private ISiteService siteService;
+    @Autowired
     private AppUserClient appUserClient;
     @Override
     public List<TAccountingStrategyDetailVO> queryAccountingStrategyDetailByStrategyId(Integer strategyId) {
@@ -53,40 +55,41 @@
 
     @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("未查询到计费策略");
         }
         List<TAccountingStrategyDetailVO> list = this.queryAccountingStrategyDetailByStrategyId(accountingStrategy.getId());
+        list.stream().filter(item -> "00:00".equals(item.getEndTime())).forEach(item -> item.setEndTime("23:59:59"));
         // 获取当前登录用户id
         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;
-            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()));
+            // 获取当前时间段的计费策略明细
+            accountingStrategyDetailVO = list.stream().filter(detail -> DateUtils.string2LocalTime(detail.getStartTime() + ":00").compareTo(LocalTime.now()) <= 0
+                            && DateUtils.string2LocalTime(detail.getEndTime() + ("23:59:59".equals(detail.getEndTime())?"":":00")).compareTo(LocalTime.now()) > 0)
+                    .findFirst().orElseThrow(() -> new ServiceException("当前时间段未查询到计费策略明细"));
+            // 获取后一次的计费策略明细
+            accountingStrategyDetailVO.setEndTime("23:59:59".equals(accountingStrategyDetailVO.getEndTime())? "00:00":accountingStrategyDetailVO.getEndTime());
+            accountingStrategyDetailNext = list.stream().filter(detail -> detail.getStartTime().compareTo(accountingStrategyDetailVO.getEndTime()) == 0)
+                    .findFirst().orElseThrow(() -> new ServiceException("未查询到下一时间段的计费策略明细"));
+            if(Objects.nonNull(vip)) {
+                if (vip.getType() == 2) {
+                    accountingStrategyDetailVO.setTotalPrice(accountingStrategyDetailVO.getElectrovalence().add(accountingStrategyDetailVO.getServiceCharge()).multiply(vip.getDiscount()));
+                    accountingStrategyDetailNext.setTotalPrice(accountingStrategyDetailNext.getElectrovalence().add(accountingStrategyDetailNext.getServiceCharge()).multiply(vip.getDiscount()));
+                } else {
+                    accountingStrategyDetailVO.setTotalPrice(accountingStrategyDetailVO.getElectrovalence().add(accountingStrategyDetailVO.getServiceCharge()).multiply(accountingStrategy.getDiscount()));
+                    accountingStrategyDetailNext.setTotalPrice(accountingStrategyDetailNext.getElectrovalence().add(accountingStrategyDetailNext.getServiceCharge()).multiply(accountingStrategy.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()));
+                accountingStrategyDetailVO.setTotalPrice(accountingStrategyDetailVO.getElectrovalence().add(accountingStrategyDetailVO.getServiceCharge()));
+                accountingStrategyDetailNext.setTotalPrice(accountingStrategyDetailNext.getElectrovalence().add(accountingStrategyDetailNext.getServiceCharge()));
             }
             list = new ArrayList<>();
             list.add(accountingStrategyDetailVO);
@@ -98,9 +101,8 @@
 
     @Override
     public StrategyPriceVO queryPrice(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("未查询到计费策略");
         }
@@ -108,8 +110,10 @@
         StrategyPriceVO strategyPriceVO = new StrategyPriceVO();
 
         List<TAccountingStrategyDetailVO> list = this.queryAccountingStrategyDetailByStrategyId(accountingStrategy.getId());
+        list.stream().filter(item -> "24:00".equals(item.getEndTime())).forEach(item -> item.setEndTime("23:59:59"));
         // 获取当前时间段的计费策略明细
-        TAccountingStrategyDetailVO accountingStrategyDetailVO = list.stream().filter(detail -> detail.getStartTime().compareTo(LocalTime.now().toString()) <= 0 && detail.getEndTime().compareTo(LocalTime.now().toString()) >= 0)
+        TAccountingStrategyDetailVO accountingStrategyDetailVO = list.stream().filter(detail -> DateUtils.string2LocalTime(detail.getStartTime() + ":00").compareTo(LocalTime.now()) <= 0
+                        && DateUtils.string2LocalTime(detail.getEndTime() + ("23:59:59".equals(detail.getEndTime())?"":":00")).compareTo(LocalTime.now()) > 0)
                 .findFirst().orElseThrow(() -> new ServiceException("当前时间段未查询到计费策略明细"));
         strategyPriceVO.setDiscountAmount(accountingStrategyDetailVO.getElectrovalence().add(accountingStrategyDetailVO.getServiceCharge())
                 .subtract(accountingStrategyDetailVO.getServiceCharge().multiply(accountingStrategy.getDiscount())).setScale(2, BigDecimal.ROUND_HALF_UP));
@@ -127,19 +131,35 @@
 
     @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;
+    }
+
+    @Override
+    public Boolean isStrategyPriceConsistent(List<TAccountingStrategyDetail> accountingStrategyDetails) {
+        Map<Integer, BigDecimal> phaseToServiceFee = new HashMap<>();
+        for (TAccountingStrategyDetail detail : accountingStrategyDetails) {
+            Integer type = detail.getType();
+            BigDecimal serviceFee = detail.getServiceCharge();
+
+            if (phaseToServiceFee.containsKey(type)) {
+                BigDecimal existingFee = phaseToServiceFee.get(type);
+                if (!existingFee.equals(serviceFee)) {
+                    return false; // 发现不一致的服务费
+                }
+            } else {
+                phaseToServiceFee.put(type, serviceFee);
+            }
+        }
+        return true; // 所有相同阶段的服务费一致
     }
 }

--
Gitblit v1.7.1