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.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;
|
|
/**
|
* <p>
|
* 服务实现类
|
* </p>
|
*
|
* @author luodangjia
|
* @since 2024-08-06
|
*/
|
@Service
|
public class TAppCouponServiceImpl extends ServiceImpl<TAppCouponMapper, TAppCoupon> implements TAppCouponService {
|
|
@Autowired
|
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");
|
PageInfo<ExchangeRecordVO> pageInfo = new PageInfo<>(dto.getPageCurr(),dto.getPageSize());
|
List<ExchangeRecordVO> list = this.baseMapper.pageList(pageInfo,dto);
|
// 订单ids
|
StringBuilder stringBuilder = new StringBuilder();
|
for (ExchangeRecordVO exchangeRecordVO : list) {
|
switch (exchangeRecordVO.getWaysToObtain()){
|
case 1:
|
if (exchangeRecordVO.getOrderId()!=null){
|
stringBuilder.append(exchangeRecordVO.getOrderId()).append(",");
|
}else{
|
stringBuilder.append("0").append(",");
|
}
|
break;
|
case 2:
|
if (exchangeRecordVO.getOrderId()!=null){
|
stringBuilder.append("-").append(exchangeRecordVO.getOrderId()).append(",");
|
}else{
|
stringBuilder.append("-").append("0").append(",");
|
}
|
break;
|
}
|
Date date = DateUtils.toDate(exchangeRecordVO.getEndTime());
|
Date date1 = DateUtils.toDate(exchangeRecordVO.getCreateTime());
|
exchangeRecordVO.setEndTime1(format.format(date));
|
exchangeRecordVO.setCreateTime1(format.format(date1));
|
if (exchangeRecordVO.getStatus()==1){
|
if (exchangeRecordVO.getDelFlag() == 1){
|
// 删除了 就是已取消状态
|
exchangeRecordVO.setStatus(4);
|
}else{
|
// 未删除 判断endTime是否过期
|
// 设置了过期时间
|
if (exchangeRecordVO.getEndTime().isBefore(java.time.LocalDateTime.now())){
|
exchangeRecordVO.setStatus(3);
|
}else{
|
// 没过期
|
exchangeRecordVO.setStatus(1);
|
}
|
}
|
}
|
if (exchangeRecordVO.getStatus()==2){
|
if (exchangeRecordVO.getDelFlag() == 1){
|
// 删除了 就是已取消状态
|
exchangeRecordVO.setStatus(4);
|
}else{
|
exchangeRecordVO.setStatus(2);
|
}
|
}
|
}
|
|
// 去除最后一个字符
|
if (StringUtils.hasText(stringBuilder.toString())){
|
String string = stringBuilder.deleteCharAt(stringBuilder.length() - 1).toString();
|
// 远程调用 查询关联的订单编号
|
List<String> data = orderClient.getCodeByOrderId(string).getData();
|
for (int i = 0; i < list.size(); i++) {
|
list.get(i).setOrderId(data.get(i));
|
}
|
}
|
|
pageInfo.setRecords(list);
|
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;
|
}
|
}
|