From e05fe75a9f48455692aef753bbfbb39542349017 Mon Sep 17 00:00:00 2001
From: 无关风月 <443237572@qq.com>
Date: 星期五, 16 八月 2024 13:40:04 +0800
Subject: [PATCH] 选择优惠券

---
 ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/vo/CouponListVOVO.java                              |    4 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TVipController.java                              |   10 +-
 ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/ChargingPileFallbackFactory.java  |    6 +
 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/TAppCouponServiceImpl.java                 |   78 ++++++++++++++++++-
 ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/TVip.java                                        |    2 
 ruoyi-service/ruoyi-other/src/main/resources/mapper/other/TVipMapper.xml                                            |    3 
 ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/ChargingPileClient.java       |    8 +
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyController.java |   81 +++++++++++++++++++-
 ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/dto/CouponListDto.java                              |    2 
 9 files changed, 175 insertions(+), 19 deletions(-)

diff --git a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/dto/CouponListDto.java b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/dto/CouponListDto.java
index fe130a9..f97603a 100644
--- a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/dto/CouponListDto.java
+++ b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/dto/CouponListDto.java
@@ -16,5 +16,7 @@
     private Long userId;
     @ApiModelProperty("预付价格")
     private BigDecimal payMoney;
+    @ApiModelProperty("桩编号")
+    private Integer number;
 
 }
diff --git a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/vo/CouponListVOVO.java b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/vo/CouponListVOVO.java
index 28287eb..333b107 100644
--- a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/vo/CouponListVOVO.java
+++ b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/vo/CouponListVOVO.java
@@ -34,9 +34,7 @@
     private Integer isUse;
     @ApiModelProperty(value = "优惠券id")
     private Long couponId;
-    @ApiModelProperty(value = "优惠券id")
-    private BigDecimal payMoney;
-    @ApiModelProperty(value = "最高折扣金额 用于判断哪一张优惠券优惠力度最大 前端忽略")
+    @ApiModelProperty(value = "使用了优惠券后的服务费 用于判断哪一张优惠券优惠力度最大 前端忽略")
     private BigDecimal money;
     @ApiModelProperty(value = "当前用户是否为会员0否1是 前端忽略")
     private Integer isVip;
diff --git a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/ChargingPileFallbackFactory.java b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/ChargingPileFallbackFactory.java
index a868183..8b4f691 100644
--- a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/ChargingPileFallbackFactory.java
+++ b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/ChargingPileFallbackFactory.java
@@ -8,6 +8,7 @@
 import org.springframework.cloud.openfeign.FallbackFactory;
 import org.springframework.stereotype.Component;
 
+import java.math.BigDecimal;
 import java.util.List;
 
 /**
@@ -29,6 +30,11 @@
             public R<List<TChargingPile>> getChargingPileBySiteId(Integer siteId) {
                 return R.fail("通过站点id获取充电桩列表失败:"+throwable.getMessage());
             }
+
+            @Override
+            public R<BigDecimal> getServiceMoney(String param) {
+                return R.fail("根据会员折扣、预付金额 计算服务费失败:"+throwable.getMessage());
+            }
         };
     }
 }
diff --git a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/ChargingPileClient.java b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/ChargingPileClient.java
index 7487856..a330a00 100644
--- a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/ChargingPileClient.java
+++ b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/ChargingPileClient.java
@@ -9,6 +9,7 @@
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 
+import java.math.BigDecimal;
 import java.util.List;
 
 /**
@@ -25,5 +26,10 @@
     @PostMapping(value = "/t-charging-pile/getChargingPileBySiteId")
     public R<List<TChargingPile>> getChargingPileBySiteId(@RequestParam("siteId") Integer siteId);
 
-
+    /**
+     * 小程序远程调用 根据会员折扣、预付金额 计算服务费
+     * @return
+     */
+    @PostMapping(value = "/getServiceMoney")
+    public R<BigDecimal> getServiceMoney(@RequestParam("param") String param);
 }
diff --git a/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/TVip.java b/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/TVip.java
index a7a6a22..6375a23 100644
--- a/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/TVip.java
+++ b/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/TVip.java
@@ -137,7 +137,7 @@
     @ApiModelProperty(value = "内部会员折扣")
     @TableField("discount")
     private BigDecimal discount;
-    @ApiModelProperty(value = "会员类型 1常规 2内部")
+    @ApiModelProperty(value = "添加的会员类型 1常规 2内部")
     @TableField("type")
     private Integer type;
 
diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/TAppCouponServiceImpl.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/TAppCouponServiceImpl.java
index d7c6dcc..a499a52 100644
--- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/TAppCouponServiceImpl.java
+++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/TAppCouponServiceImpl.java
@@ -14,6 +14,7 @@
 import com.ruoyi.account.service.TAppCouponService;
 import com.ruoyi.account.service.TAppUserVipDetailService;
 import com.ruoyi.chargingPile.api.feignClient.ChargingPileClient;
+import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.core.utils.DateUtils;
 import com.ruoyi.common.core.web.page.BasePage;
 import com.ruoyi.common.core.web.page.PageInfo;
@@ -31,8 +32,11 @@
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 
+import java.math.BigDecimal;
+import java.math.BigInteger;
 import java.text.SimpleDateFormat;
 import java.time.LocalDateTime;
+import java.util.Comparator;
 import java.util.Date;
 import java.util.List;
 
@@ -139,9 +143,14 @@
         PageInfo<CouponListVOVO> pageInfo = new PageInfo<>(dto.getPageCurr(),dto.getPageSize());
         List<CouponListVOVO> list = this.baseMapper.couponList(pageInfo,dto.getUserId());
         TAppUser tAppUser = tAppUserMapper.selectById(dto.getUserId());
-        Integer isVip = 0;// 是否能享受会员折扣
+        Integer isVip = 0;// 是否能享受会员折扣 0否 1是普通会员 2内部会员
+        // 会员折扣
+        Double discount = 0.0;
+        // 普通会员最高折扣金额
+        Double discountMoney = 0.0;
         if (tAppUser.getVipEndTime() == null){
             // 不是会员
+            isVip = 0;
         }else {
             // 判断会员有没有过期
             if (tAppUser.getVipEndTime().isAfter(java.time.LocalDateTime.now())){
@@ -161,20 +170,79 @@
                 TVip data1 = vipClient.getInfo1(vipId).getData();
                 Integer discountTimes = data1.getDiscountTimes();
                 if (data>=discountTimes){
-                    // 不能再享受会员折扣
+                    //  折扣次数用光了 不能再享受会员折扣
+                    isVip = 0;
                 }else{
-                    isVip = 1;
+                    if (data1.getType() == 2){
+                        // 如果内部会员 使用该折扣
+                        discount = data1.getDiscount().doubleValue();
+                        isVip = 2;
+                    }else{
+                        // 普通会员 最高折扣金额
+                        discountMoney = data1.getMaximumDeduction().doubleValue();
+                        isVip = 1;
+                    }
+
                 }
+            }else{
+                // 会员过期 不能享受
+                isVip = 0;
             }
         }
         for (CouponListVOVO couponListVOVO : list) {
             couponListVOVO.setValidityTime("有效期:"+format.format(couponListVOVO.getCreateTime())+" - "+format.format(couponListVOVO.getEndTime()));
         }
         List<CouponListVOVO> data = otherClient.getCouponInfoByCouponIds(list).getData();
+        // 桩编号 + 是否是会员 + 内部会员折扣 + 普通会员最高折扣金额 + 预付金额
+        String temp = dto.getNumber()+"-"+isVip+"-"+discount+"-"+discountMoney+"-"+dto.getPayMoney();
+        // 根据当前时间段和预付金额计算服务费
+        BigDecimal serviceMoney = chargingPileClient.getServiceMoney(temp).getData();
         for (CouponListVOVO datum : data) {
-            // 根据当前时间段和预付金额计算服务费
-
+            // 判断优惠券类型
+            switch (datum.getPreferentialMode()){
+                case 1:
+                    datum.setIsUse(1);
+                    // 满减券 判断服务费是否满足满减条件
+                    if (datum.getMeetTheConditions().compareTo(new BigDecimal(BigInteger.ZERO)) == 0){
+                        // 无门槛优惠券
+                        datum.setMoney(serviceMoney.subtract(datum.getDiscountAmount()));
+                    }else if (serviceMoney.compareTo(datum.getMeetTheConditions())>=0){
+                        // 满足条件
+                        datum.setMoney(serviceMoney.subtract(datum.getDiscountAmount()));
+                    }else{
+                        // 不满足条件
+                        datum.setMoney(serviceMoney);
+                        datum.setIsUse(0);
+                    }
+                    break;
+                case 2:
+                    datum.setIsUse(1);
+                    // 折扣券 判断
+                    if (datum.getMeetTheConditions().compareTo(new BigDecimal(BigInteger.ZERO)) == 0){
+                        // 无门槛优惠券
+                        datum.setMoney(serviceMoney.subtract(datum.getDiscountAmount()));
+                    }else if (serviceMoney.compareTo(datum.getMeetTheConditions())>=0){
+                        // 折扣后的服务费
+                        BigDecimal divide = serviceMoney.multiply(datum.getDiscount()).divide(new BigDecimal(10), 2, BigDecimal.ROUND_HALF_UP);
+                        // 计算折扣了多少钱 判断是否超过最高折扣金额
+                        BigDecimal subtract = serviceMoney.subtract(divide);
+                        if (subtract.compareTo(datum.getMaximumDiscountAmount())>0){
+                            // 超过最高折扣金额 减去最高折扣金额
+                            datum.setMoney(serviceMoney.subtract(datum.getMaximumDiscountAmount()));
+                        }else{
+                            // 没超过最高折扣金额
+                            datum.setMoney(divide);
+                        }
+                    }else{
+                        // 不满足条件
+                        datum.setMoney(serviceMoney);
+                        datum.setIsUse(0);
+                    }
+                    break;
+            }
         }
+        // 通过集合的money字段 将money从大到小排序
+        data.sort(Comparator.comparing(CouponListVOVO::getMoney).reversed());
         pageInfo.setRecords(data);
         return pageInfo;
     }
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyController.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyController.java
index 456c64f..d7f4f4c 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyController.java
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyController.java
@@ -1,18 +1,19 @@
 package com.ruoyi.chargingPile.controller;
 
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.chargingPile.api.dto.TAccountingStrategyDTO;
-import com.ruoyi.chargingPile.api.model.TAccountingStrategy;
-import com.ruoyi.chargingPile.api.model.TAccountingStrategyDetail;
-import com.ruoyi.chargingPile.api.model.TCarport;
-import com.ruoyi.chargingPile.api.model.TVehicleRamp;
+import com.ruoyi.chargingPile.api.model.*;
 import com.ruoyi.chargingPile.api.query.TAccountingStrategyQuery;
 import com.ruoyi.chargingPile.api.vo.TAccountingStrategyDetailVO;
 import com.ruoyi.chargingPile.api.vo.TAccountingStrategyVO;
+import com.ruoyi.chargingPile.service.ISiteService;
 import com.ruoyi.chargingPile.service.TAccountingStrategyDetailService;
 import com.ruoyi.chargingPile.service.TAccountingStrategyService;
+import com.ruoyi.chargingPile.service.TChargingPileService;
+import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.core.web.domain.AjaxResult;
 import com.ruoyi.common.core.web.page.PageInfo;
 import com.ruoyi.common.security.service.TokenService;
@@ -25,6 +26,10 @@
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.math.RoundingMode;
+import java.time.LocalTime;
 import java.util.List;
 
 /**
@@ -42,6 +47,10 @@
 
     private final TAccountingStrategyService accountingStrategyService;
     private final TAccountingStrategyDetailService accountingStrategyDetailService;
+    @Autowired
+    private TChargingPileService chargingPileService;
+    @Autowired
+    private ISiteService siteService;
 
     @Resource
     private TokenService tokenService;
@@ -175,5 +184,69 @@
         return AjaxResult.ok(accountingStrategyService.pageList(query));
     }
 
+    /**
+     * 小程序远程调用 根据会员折扣、预付金额 计算服务费
+     * @return
+     */
+    @PostMapping(value = "/getServiceMoney")
+    public R<BigDecimal> getServiceMoney(@RequestParam("param") String param){
+        // 桩编号 + 是否是会员 + 内部会员折扣金额 + 普通会员最高折扣金额 + 预付金额
+        String[] split = param.split("-");
+        // 根据桩编号 查询电站
+        TChargingPile one = chargingPileService.lambdaQuery().eq(TChargingPile::getNumber, split[0]).one();
+        Site byId = siteService.getById(one.getSiteId());
+        // 计费策略
+        TAccountingStrategy one1 = accountingStrategyService.lambdaQuery().eq(TAccountingStrategy::getSiteId, byId.getId())
+                .eq(TAccountingStrategy::getAuditStatus, 3).one();
+        // 会员折扣
+        BigDecimal discount = one1.getDiscount();
+        List<TAccountingStrategyDetail> list = accountingStrategyDetailService.lambdaQuery().eq(TAccountingStrategyDetail::getAccountingStrategyId, one1.getId())
+                .list();
+        // 当前时间属于哪个计费策略
+        LocalTime now = LocalTime.now();
+        // 电价
+        BigDecimal electronic = new BigDecimal(BigInteger.ZERO);
+        // 最终服务费
+        BigDecimal serviceMoney = new BigDecimal(BigInteger.ZERO);
+        // 预付金额
+        BigDecimal beforeMoney = new BigDecimal(split[4]);
+        // 普通会员最高折扣金额
+        BigDecimal discountMoney = new BigDecimal(split[3]);
+        // 内部会员折扣
+        BigDecimal discountInner = new BigDecimal(split[2]);
+        // 最终服务费
+        BigDecimal res = new BigDecimal(BigInteger.ZERO);
+        for (TAccountingStrategyDetail tAccountingStrategyDetail : list) {
+            if (now.isAfter(LocalTime.parse(tAccountingStrategyDetail.getStartTime())) && now.isBefore(LocalTime.parse(tAccountingStrategyDetail.getEndTime()))){
+                electronic = tAccountingStrategyDetail.getElectrovalence();
+                // 非会员下的服务费
+                BigDecimal multiply = beforeMoney.multiply(tAccountingStrategyDetail.getServiceCharge()).divide(electronic, 2, RoundingMode.HALF_UP);
+                if (byId.getBusinessCategory() == 1){
+                    // 直营才享受会员折扣
+                    // 根据电价和预付金额 是否有会员折扣 计算最终服务费
+                    if (split[1].equals("1")){
+                        // 抵扣金额
+                        BigDecimal multiply1 = multiply.multiply(discount);
+                        if (multiply1.compareTo(discountMoney)>0){
+                            multiply1 = discountMoney;
+                        }
+                        // 普通最终服务费
+                        res = multiply.subtract(multiply1);
+                    }
+                    if (split[1].equals("2")){
+                        // 内部会员折扣 最终服务费
+                        res = discountInner.multiply(multiply);
+                    }
+                }else{
+                    // 非直营
+                    res = multiply;
+                }
+                break;
+            }
+        }
+
+
+        return R.ok(res);
+    }
 }
 
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TVipController.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TVipController.java
index f2509c6..97f0451 100644
--- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TVipController.java
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TVipController.java
@@ -34,25 +34,25 @@
     @Autowired
     private TVipService vipService;
     @PostMapping("/saveVip")
-    @ApiOperation(value = "会员添加")
+    @ApiOperation(tags = {"管理后台-会员管理"},value = "会员添加")
     public AjaxResult saveVip(@RequestBody TVip dto) {
         vipService.save(dto);
         return AjaxResult.success();
     }
     @GetMapping("/delete")
-    @ApiOperation(value = "会员删除")
+    @ApiOperation(tags = {"管理后台-会员管理"},value = "会员删除")
     public AjaxResult delete(Integer id) {
         vipService.removeById(id);
         return AjaxResult.success();
     }
     @PostMapping("/updateVip")
-    @ApiOperation(value = "会员修改")
+    @ApiOperation(tags = {"管理后台-会员管理"},value = "会员修改")
     public AjaxResult updateVip(@RequestBody TVip dto) {
             vipService.updateById(dto);
         return AjaxResult.success();
     }
     @GetMapping("/getInfo")
-    @ApiOperation(value = "会员查看详情")
+    @ApiOperation(tags = {"管理后台-会员管理"},value = "会员查看详情")
     public AjaxResult<TVip> getInfo(Integer id) {
         return AjaxResult.ok(vipService.getById(id));
     }
@@ -66,7 +66,7 @@
     public R<TVip> getInfo1(@RequestParam("id")Integer id) {
         return R.ok(vipService.getById(id));
     }
-    @ApiOperation(value = "会员列表分页查询")
+    @ApiOperation(tags = {"管理后台-会员管理"},value = "会员列表分页查询")
     @PostMapping(value = "/pageList")
     @ApiImplicitParams({
             @ApiImplicitParam(name = "pageCurr", value = "分页参数,当前页码", required = true),
diff --git a/ruoyi-service/ruoyi-other/src/main/resources/mapper/other/TVipMapper.xml b/ruoyi-service/ruoyi-other/src/main/resources/mapper/other/TVipMapper.xml
index 941a10c..5114d48 100644
--- a/ruoyi-service/ruoyi-other/src/main/resources/mapper/other/TVipMapper.xml
+++ b/ruoyi-service/ruoyi-other/src/main/resources/mapper/other/TVipMapper.xml
@@ -32,12 +32,15 @@
         <result column="double_integration" property="doubleIntegration" />
         <result column="mall_exclusive_price" property="mallExclusivePrice" />
         <result column="create_time" property="createTime" />
+        <result column="discount" property="discount" />
+        <result column="type" property="type" />
         <result column="del_flag" property="delFlag" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
         id, name, reveal, monthly_card, monthly_card_reveal, monthly_card_discount, monthly_card_discount_start, monthly_card_discount_end, monthly_card_discount_reveal, season_card, season_card_reveal, season_card_discount, season_card_discount_start, season_card_discount_end, season_card_discount_reveal, annual_card, annual_card_reveal, annual_card_discount, annual_card_discount_start, annual_card_discount_end, annual_card_discount_reveal, discount_times, maximum_deduction, deduction_type, coupon, double_integration, mall_exclusive_price, create_time, del_flag
+          ,discount, type
     </sql>
     <select id="pageList" resultType="com.ruoyi.other.api.domain.TVip">
         select * from t_vip

--
Gitblit v1.7.1