无关风月
2024-08-16 e05fe75a9f48455692aef753bbfbb39542349017
选择优惠券
9个文件已修改
194 ■■■■■ 已修改文件
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/dto/CouponListDto.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/vo/CouponListVOVO.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/ChargingPileFallbackFactory.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/ChargingPileClient.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/TVip.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/TAppCouponServiceImpl.java 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyController.java 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TVipController.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/resources/mapper/other/TVipMapper.xml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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;
}
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;
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());
            }
        };
    }
}
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);
}
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;
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;
    }
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);
    }
}
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),
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