无关风月
2024-08-24 80835bcc12f4788c1a88da61e623b362e57f1cb1
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/TAppCouponServiceImpl.java
@@ -1,25 +1,42 @@
package com.ruoyi.account.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.account.api.dto.CouponListDto;
import com.ruoyi.account.api.model.TAppCoupon;
import com.ruoyi.account.api.model.TAppUser;
import com.ruoyi.account.api.model.TAppUserVipDetail;
import com.ruoyi.account.api.query.ExchangeRecordGoodsQuery;
import com.ruoyi.account.api.vo.CouponListVOVO;
import com.ruoyi.other.api.vo.CouponListVOVO;
import com.ruoyi.account.api.vo.ExchangeRecordVO;
import com.ruoyi.account.mapper.TAppCouponMapper;
import com.ruoyi.account.mapper.TAppUserMapper;
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;
import com.ruoyi.common.security.service.TokenService;
import com.ruoyi.order.api.feignClient.ChargingOrderClient;
import com.ruoyi.order.api.feignClient.OrderClient;
import com.ruoyi.order.api.query.TChargingCountQuery;
import com.ruoyi.other.api.domain.TCoupon;
import com.ruoyi.other.api.domain.TVip;
import com.ruoyi.other.api.feignClient.OtherClient;
import com.ruoyi.other.api.feignClient.VipClient;
import io.swagger.models.auth.In;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.beans.factory.annotation.Autowired;
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;
@@ -38,6 +55,19 @@
    private OrderClient orderClient;
    @Autowired
    private OtherClient otherClient;
    @Autowired
    private VipClient vipClient;
    @Autowired
    private ChargingPileClient chargingPileClient;
    @Autowired
    private ChargingOrderClient chargingOrderClient;
    @Autowired
    private TAppUserVipDetailService tAppUserVipDetailService;
    @Autowired
    private TAppUserMapper tAppUserMapper;
    @Autowired
    private TokenService tokenService;
    @Override
    public PageInfo<ExchangeRecordVO> pagelist(ExchangeRecordGoodsQuery dto) {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@@ -105,15 +135,116 @@
        return pageInfo;
    }
    @Override
    public PageInfo<CouponListVOVO> couponList(CouponListDto dto) {
        // todo token获取用户id
        dto.setUserId(tokenService.getLoginUserApplet().getUserId());
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        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;// 是否能享受会员折扣 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())){
                // 没过期 判断用户本月会员充电折扣次数是否还有剩余
                TAppUserVipDetail tAppUserVipDetail = tAppUserVipDetailService.list(new LambdaQueryWrapper<TAppUserVipDetail>()
                        .orderByDesc(TAppUserVipDetail::getStartTime)).get(0);
                LocalDateTime startTime = tAppUserVipDetail.getStartTime();
                LocalDateTime endTime = tAppUserVipDetail.getEndTime();
                TChargingCountQuery tChargingCountQuery = new TChargingCountQuery();
                tChargingCountQuery.setStartTime(startTime);
                tChargingCountQuery.setEndTime(endTime);
                tChargingCountQuery.setUserId(dto.getUserId());
                // 当月已享受会员折扣充电次数
                Integer data = chargingOrderClient.getChargingCount(tChargingCountQuery).getData();
                // 查询用户当前会员每月享受折扣次数和折扣比例是多少
                Integer vipId = tAppUser.getVipId();
                TVip data1 = vipClient.getInfo1(vipId).getData();
                Integer discountTimes = data1.getDiscountTimes();
                if (data>=discountTimes){
                    //  折扣次数用光了 不能再享受会员折扣
                    isVip = 0;
                }else{
                    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、isUse字段 将money、isUse从大到小排序 将不可用的排在最后
        data.sort(Comparator.comparing(CouponListVOVO::getMoney).reversed().thenComparing(CouponListVOVO::getIsUse));
        pageInfo.setRecords(data);
        return pageInfo;
    }