Merge remote-tracking branch 'origin/main'

This commit is contained in:
cun-nan 2024-09-26 13:46:09 +08:00
commit bff50c9f3b
20 changed files with 514 additions and 71 deletions

View File

@ -1,9 +1,20 @@
package com.fuint.business.fleet.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fuint.business.fleet.service.IFleetLinesChangeService;
import com.fuint.business.fleet.vo.FleetLinesChangeVo;
import com.fuint.business.order.dto.CardBalanceChangeDto;
import com.fuint.business.order.vo.CardBalanceChangeVo;
import com.fuint.framework.web.BaseController;
import com.fuint.framework.web.ResponseObject;
import io.lettuce.core.dynamic.annotation.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestParam;
/**
* <p>
@ -15,6 +26,16 @@ import org.springframework.stereotype.Controller;
*/
@Controller
@RequestMapping("/fleet-lines-change")
public class FleetLinesChangeController {
public class FleetLinesChangeController extends BaseController {
@Autowired
private IFleetLinesChangeService fleetLinesChangeService;
public ResponseObject queryByPageUni(@RequestParam(value = "page",defaultValue = "1") Integer page,
@RequestParam(value = "pageSize",defaultValue = "10") Integer pageSize,
@Param("integralDetail") FleetLinesChangeVo fleetLinesChangeVo) {
Page page1 = new Page(page, pageSize);
IPage<FleetLinesChangeVo> iPageList = fleetLinesChangeService.queryByPageUni(page1, fleetLinesChangeVo);
return getSuccessResult(iPageList);
}
}

View File

@ -1,7 +1,10 @@
package com.fuint.business.fleet.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fuint.business.fleet.entity.FleetLinesChange;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.fuint.business.fleet.vo.FleetLinesChangeVo;
/**
* <p>
@ -13,4 +16,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
*/
public interface FleetLinesChangeMapper extends BaseMapper<FleetLinesChange> {
IPage<FleetLinesChangeVo> queryAllByLimit(Page page1, FleetLinesChangeVo fleetLinesChangeVo);
}

View File

@ -6,6 +6,8 @@ import com.fuint.business.fleet.entity.FleetInfo;
import com.fuint.business.fleet.vo.FleetInfoUniVo;
import com.fuint.business.fleet.vo.FleetInfoVo;
import java.util.List;
/**
* 车队信息(FleetInfo)表服务接口
*
@ -65,7 +67,7 @@ public interface FleetInfoService {
* @param storeId
* @return
*/
FleetInfoUniVo queryByStoreId(Integer storeId);
List<FleetInfoUniVo> queryByStoreId(Integer storeId);
/**
* 新增车队信息(小程序)

View File

@ -1,7 +1,10 @@
package com.fuint.business.fleet.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fuint.business.fleet.entity.FleetLinesChange;
import com.baomidou.mybatisplus.extension.service.IService;
import com.fuint.business.fleet.vo.FleetLinesChangeVo;
/**
* <p>
@ -13,4 +16,5 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/
public interface IFleetLinesChangeService extends IService<FleetLinesChange> {
IPage<FleetLinesChangeVo> queryByPageUni(Page page1, FleetLinesChangeVo fleetLinesChangeVo);
}

View File

@ -1,6 +1,7 @@
package com.fuint.business.fleet.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@ -35,9 +36,11 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Random;
import java.util.stream.Collectors;
/**
@ -219,22 +222,29 @@ public class FleetInfoServiceImpl extends ServiceImpl<FleetInfoMapper,FleetInfo>
* @return
*/
@Override
public FleetInfoUniVo queryByStoreId(Integer storeId) {
public List<FleetInfoUniVo> queryByStoreId(Integer storeId) {
AccountInfo nowAccountInfo = TokenUtil.getNowAccountInfo();
FleetInfo fleetInfo = baseMapper.selectOne(new LambdaQueryWrapper<FleetInfo>()
.eq(FleetInfo::getStoreId, storeId)
.eq(FleetInfo::getUserId, nowAccountInfo.getId())
.last("limit 1"));
if (ObjectUtil.isEmpty(fleetInfo)) {
throw new RuntimeException("该会员未绑定车队");
//查询当前登录人的车队信息
List<FleetMember> fleetMembers = fleetMemberMapper.selectList(new LambdaQueryWrapper<FleetMember>()
.eq(FleetMember::getStoreId, storeId)
.eq(FleetMember::getUserId, nowAccountInfo.getId()));
//获取所在车队的id集合
List<Integer> fleetIds = fleetMembers.stream().map(FleetMember::getFleetId).collect(Collectors.toList());
if (CollUtil.isEmpty(fleetIds)) {
throw new RuntimeException("未绑定车队");
}
// FleetInfo fleetInfo = baseMapper.selectById(fleetMember.getFleetId());
FleetInfoUniVo fleetInfoUniVo = BeanUtil.copyProperties(fleetInfo, FleetInfoUniVo.class);
fleetInfoUniVo.setStoreName(mtStoreMapper.selectById(storeId).getName());
return fleetInfoUniVo;
List<FleetInfo> fleetInfos = baseMapper.selectList(new LambdaQueryWrapper<FleetInfo>()
.eq(FleetInfo::getStoreId, storeId)
.in(FleetInfo::getId, fleetIds));
List<FleetInfoUniVo> fleetInfoUniVos = new ArrayList<>();
for (FleetInfo fleetInfo : fleetInfos) {
FleetInfoUniVo fleetInfoUniVo = BeanUtil.copyProperties(fleetInfo, FleetInfoUniVo.class);
fleetInfoUniVo.setStoreName(mtStoreMapper.selectById(storeId).getName());
fleetInfoUniVos.add(fleetInfoUniVo);
}
return fleetInfoUniVos;
}
/**

View File

@ -1,9 +1,18 @@
package com.fuint.business.fleet.service.impl;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fuint.business.fleet.entity.FleetLinesChange;
import com.fuint.business.fleet.mapper.FleetLinesChangeMapper;
import com.fuint.business.fleet.service.IFleetLinesChangeService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fuint.business.fleet.vo.FleetLinesChangeVo;
import com.fuint.common.dto.AccountInfo;
import com.fuint.common.util.TokenUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
@ -17,4 +26,17 @@ import org.springframework.stereotype.Service;
@Service
public class FleetLinesChangeServiceImpl extends ServiceImpl<FleetLinesChangeMapper, FleetLinesChange> implements IFleetLinesChangeService {
@Autowired
private FleetLinesChangeMapper fleetLinesChangeMapper;
@Override
public IPage<FleetLinesChangeVo> queryByPageUni(Page page1, FleetLinesChangeVo fleetLinesChangeVo) {
AccountInfo nowAccountInfo = TokenUtil.getNowAccountInfo();
fleetLinesChangeVo.setUserId(nowAccountInfo.getId());
if (ObjectUtil.isNotEmpty(fleetLinesChangeVo.getStartTime())) {
DateTime parse = DateUtil.parse(fleetLinesChangeVo.getStartTime(), "yyyy-MM");
fleetLinesChangeVo.setStartTime(DateUtil.beginOfMonth(parse).toString());
fleetLinesChangeVo.setEndTime(DateUtil.endOfMonth(parse).toString());
}
return this.baseMapper.queryAllByLimit(page1, fleetLinesChangeVo);
}
}

View File

@ -1,5 +1,6 @@
package com.fuint.business.fleet.vo;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fuint.business.fleet.entity.FleetLinesChange;
import lombok.Data;
@ -13,4 +14,10 @@ public class FleetLinesChangeVo extends FleetLinesChange {
* 操作人名称
*/
private String creatName;
@JsonIgnore
private String startTime;
@JsonIgnore
private String endTime;
}

View File

@ -66,6 +66,8 @@ public class CardCoupon extends Model<CardCoupon> {
private Integer zkStartAmount;
//折扣卷满多少元的终
private Integer zkEndAmount;
//折扣最大优惠金额
private Double zkMaxAmount;
//适用会员等级 可多选
private String membershipLevel;
//生效日期类型1.领取后多少天内有效 2指定具体使用日期

View File

@ -8,7 +8,7 @@
main.mt_user_id AS mtUserId
FROM
card_coupon_user main
LEFT JOIN card_coupon cc ON main.card_coupon_id = cc.id
INNER JOIN card_coupon cc ON main.card_coupon_id = cc.id
WHERE
main.store_id = #{storeId}
AND main.mt_user_id = #{userId}

View File

@ -44,5 +44,15 @@ public interface CardCouponUserService extends IService<CardCouponUser> {
* @return
*/
IPage<CardCouponUserVo> queryPage(Page page,CardCouponUserVo cardCouponUserVo);
/**
* 查某用户某些优惠券的使用记录
* @author vinjor-M
* @date 17:31 2024/9/25
* @param userId 用户id
* @param couponIdList 优惠券idList
* @return java.util.List<com.fuint.business.marketingActivity.cardCoupon.entity.CardCouponUser>
**/
List<CardCouponUser> selectListByUsed(Integer userId,List<Integer> couponIdList);
}

View File

@ -145,5 +145,24 @@ public class CardCouponUserServiceImpl extends ServiceImpl<CardCouponUserMapper,
}
return cardCouponUserVoIPage;
}
/**
* 查某用户某些优惠券的使用记录
*
* @param userId 用户id
* @param couponIdList 优惠券idList
* @return java.util.List<com.fuint.business.marketingActivity.cardCoupon.entity.CardCouponUser>
* @author vinjor-M
* @date 17:31 2024/9/25
**/
@Override
public List<CardCouponUser> selectListByUsed(Integer userId, List<Integer> couponIdList) {
LambdaQueryWrapper<CardCouponUser> queryWrapper = new LambdaQueryWrapper<CardCouponUser>()
.eq(CardCouponUser::getMtUserId,userId)
.in(CardCouponUser::getCardCouponId,couponIdList)
//已核销的
.eq(CardCouponUser::getStatus,"1");
return this.list(queryWrapper);
}
}

View File

@ -1,5 +1,6 @@
package com.fuint.business.marketingActivity.cardGift.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
@ -12,6 +13,9 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fuint.business.marketingActivity.cardGift.mapper.CardGiftMapper;
import com.fuint.business.marketingActivity.cardGift.entity.CardGift;
import com.fuint.business.marketingActivity.cardGift.service.CardGiftService;
import com.fuint.business.marketingActivity.cardGift.vo.CardGiftVo;
import com.fuint.business.marketingActivity.cardGiftActive.entity.CardGiftActive;
import com.fuint.business.marketingActivity.cardGiftActive.mapper.CardGiftActiveMapper;
import com.fuint.business.member.entity.LJStaff;
import com.fuint.business.member.service.ILJStaffService;
import com.fuint.business.oilDepotConfiguration.entity.OilDepotConfig;
@ -30,6 +34,7 @@ import com.fuint.common.util.TokenUtil;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
@ -64,6 +69,8 @@ public class CardGiftServiceImpl extends ServiceImpl<CardGiftMapper, CardGift> i
private LJUserService ljUserService;
@Resource
private ILJStaffService ljStaffService;
@Autowired
private CardGiftActiveMapper cardGiftActiveMapper;
/**
* 新增数据
@ -246,7 +253,23 @@ public class CardGiftServiceImpl extends ServiceImpl<CardGiftMapper, CardGift> i
LambdaQueryWrapper<CardGift> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(CardGift::getUserId,userId);
queryWrapper.orderByDesc(CardGift::getUpdateTime);
return page(page,queryWrapper);
IPage page1 = page(page, queryWrapper);
List<CardGiftVo> cardGiftVos = new ArrayList<>();
for (Object record : page1.getRecords()) {
CardGiftVo cardGiftVo = BeanUtil.copyProperties(record, CardGiftVo.class);
CardGiftActive cardGiftActive = cardGiftActiveMapper.selectOne(new LambdaQueryWrapper<CardGiftActive>()
.eq(CardGiftActive::getId, cardGiftVo.getActiveId())
.last("limit 1"));
if (ObjectUtils.isNotEmpty(cardGiftActive)) {
cardGiftVo.setActiveName(cardGiftActive.getActiveName());
}
cardGiftVos.add(cardGiftVo);
}
page1.setRecords(cardGiftVos);
//查询兑换记录的活动名称
return page1;
}
/**

View File

@ -0,0 +1,9 @@
package com.fuint.business.marketingActivity.cardGift.vo;
import com.fuint.business.marketingActivity.cardGift.entity.CardGift;
import lombok.Data;
@Data
public class CardGiftVo extends CardGift {
private String activeName;
}

View File

@ -3,6 +3,8 @@ package com.fuint.pay.service.impl;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSONObject;
import com.fuint.business.marketingActivity.activePrice.entity.ActivePriceRecord;
import com.fuint.business.marketingActivity.activePrice.entity.ActivePriceRule;
@ -13,6 +15,8 @@ import com.fuint.business.marketingActivity.activePrice.service.ActivePriceServi
import com.fuint.business.marketingActivity.activePrice.service.ActiveSubPriceService;
import com.fuint.business.marketingActivity.activePrice.vo.ActivePriceRuleRespVO;
import com.fuint.business.marketingActivity.activePrice.vo.ActiveSubPriceRespVO;
import com.fuint.business.marketingActivity.cardCoupon.entity.CardCoupon;
import com.fuint.business.marketingActivity.cardCoupon.entity.CardCouponUser;
import com.fuint.business.marketingActivity.cardCoupon.service.CardCouponUserService;
import com.fuint.business.marketingActivity.cardCoupon.vo.CardCouponVO;
import com.fuint.business.userGroup.entity.UserDiscount;
@ -27,6 +31,7 @@ import com.fuint.pay.service.PayCenterService;
import com.fuint.pay.util.CheckUtil;
import com.fuint.pay.vo.ActivityVO;
import com.fuint.pay.vo.CouponVO;
import com.fuint.pay.vo.GoodsVO;
import com.google.common.collect.ImmutableList;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -166,11 +171,13 @@ public class PayCenterServiceImpl implements PayCenterService {
List<String> actTypeList = Arrays.asList("1,2".split(StrUtil.COMMA));
List<ActivePriceRecord> recordAllList = activePriceRecordService.selectListByUserIdAndActIds(userId,
filteredList.stream().map(ActivePriceRuleRespVO::getId).collect(Collectors.toList()),null,actTypeList);
filteredList = filteredList.stream()
//过滤掉超过每日参加次数限制的
.filter(rule -> checkUtil.checkUseNum(rule.getId(),rule.getDayLimitNum(),nowDate,recordAllList, "day"))
//过滤掉超过累计参加次数限制的
.filter(rule -> checkUtil.checkUseNum(rule.getId(),rule.getLimitNum(),null,recordAllList,null)).collect(Collectors.toList());
if(!recordAllList.isEmpty()){
filteredList = filteredList.stream()
//过滤掉超过每日参加次数限制的
.filter(rule -> checkUtil.checkUseNum(rule.getId(),rule.getDayLimitNum(),nowDate,recordAllList, "day"))
//过滤掉超过累计参加次数限制的
.filter(rule -> checkUtil.checkUseNum(rule.getId(),rule.getLimitNum(),null,recordAllList,null)).collect(Collectors.toList());
}
/*4.得到用户最终可以参加的活动,计算优惠金额并转换成统一的对象*/
List<ActivityVO> rtnList = new ArrayList<>();
if(!filteredList.isEmpty()){
@ -227,13 +234,15 @@ public class PayCenterServiceImpl implements PayCenterService {
List<String> actTypeList = Arrays.asList("3".split(StrUtil.COMMA));
List<ActivePriceRecord> recordAllList = activePriceRecordService.selectListByUserIdAndActIds(userId,
null,filteredList.stream().map(ActiveSubPriceRespVO::getId).collect(Collectors.toList()),actTypeList);
filteredList = filteredList.stream()
//过滤掉超过每日参加次数限制的
.filter(rule -> checkUtil.checkUseNum(rule.getId(),rule.getDayLimitNum(),nowDate,recordAllList,"day"))
//过滤掉超过每月参加次数限制的
.filter(rule -> checkUtil.checkUseNum(rule.getId(),rule.getMonthLimitNum(),nowDate,recordAllList,"month"))
//过滤掉超过累计参加次数限制的
.filter(rule -> checkUtil.checkUseNum(rule.getId(),rule.getLimitNum(),null,recordAllList,null)).collect(Collectors.toList());
if(!recordAllList.isEmpty()){
filteredList = filteredList.stream()
//过滤掉超过每日参加次数限制的
.filter(rule -> checkUtil.checkUseNum(rule.getId(),rule.getDayLimitNum(),nowDate,recordAllList,"day"))
//过滤掉超过每月参加次数限制的
.filter(rule -> checkUtil.checkUseNum(rule.getId(),rule.getMonthLimitNum(),nowDate,recordAllList,"month"))
//过滤掉超过累计参加次数限制的
.filter(rule -> checkUtil.checkUseNum(rule.getId(),rule.getLimitNum(),null,recordAllList,null)).collect(Collectors.toList());
}
/*4.得到用户最终可以参加的活动,计算优惠金额并转换成统一的对象*/
List<ActivityVO> rtnList = new ArrayList<>();
if(!filteredList.isEmpty()){
@ -350,26 +359,58 @@ public class PayCenterServiceImpl implements PayCenterService {
Integer storeId = nowAccountInfo.getStoreId();
int userId = Integer.parseInt(map.get("userId"));
//油号id
Integer oilId = Integer.valueOf(map.get("oilId"));
//油单价
Double oilPrice = Double.valueOf(map.get("oilPrice"));
Integer oilId = Integer.valueOf(map.getOrDefault("oilId","99999"));
//加油金额不含商品金额
Double oilAmount = Double.valueOf(map.get("oilAmount"));
//订单总额含商品金额
Double orderAmount = Double.valueOf(map.get("orderAmount"));
Double oilAmount = Double.valueOf(map.getOrDefault("oilAmount","0"));
//油升数
Double oilLiter = Double.valueOf(map.get("oilLiter"));
Double oilLiter = Double.valueOf(map.getOrDefault("oilLiter","0"));
//选择的商品
List<GoodsVO> goodsList = new ArrayList<>();
String goodsStr = map.getOrDefault("goods","");
if(StringUtils.isNotEmpty(goodsStr)){
JSONArray goodsArray = JSONUtil.parseArray(map.get("goods"));
goodsList = goodsArray.toList(GoodsVO.class);
}
/*1.先查满足条件的所有生效中的优惠券*/
List<CardCouponVO> couponVOList = cardCouponUserService.selectAllList(storeId, userId, nowDate);
/*2.进行初步过滤,这里只过滤优惠券硬性的限制*/
List<GoodsVO> finalGoodsList = goodsList;
List<CardCouponVO> filteredList = couponVOList.stream()
//当前时间在 适用时间段内 或者 当前时间不在 不适用时间段内的
.filter(rule -> this.checkTimeCouponPrex(rule,nowDate)).collect(Collectors.toList());
// //是否满足最低消费金额
// .filter(rule-> rule.getConsumeAmount() <=oilAmount)
// //适用当前支付方式的
// .filter(rule-> rule.getUsePaymentWay().contains(payWay))
.filter(rule -> this.checkTimeCouponPrex(rule,nowDate))
//如果是油品券需要过滤出当前油品可用的
.filter(rule -> checkUtil.checkOilCoupon(rule,oilId))
//如果是油品券需要过滤出达到满减条件的
.filter(rule -> checkUtil.checkMaxCoupon(rule,oilAmount,oilLiter))
//如果是单品立减券需要过滤出当前选择的商品可用且满足最低消费金额的
.filter(rule-> checkUtil.checkGoodsCoupon(rule, finalGoodsList)).collect(Collectors.toList());
if(filteredList.isEmpty()){
return new ArrayList<>();
}
/*3.再次过滤,这里过滤掉用户已经超出参加次数限制的*/
List<Integer> filteredCoupIdList = filteredList.stream().map(CardCoupon::getId).collect(Collectors.toList());
//查出本用户这些优惠券的使用记录
List<CardCouponUser> usedList = cardCouponUserService.selectListByUsed(userId,filteredCoupIdList);
if(!usedList.isEmpty()){
//过滤
filteredList = filteredList.stream()
//过滤掉使用次数限制的
.filter(rule->checkUtil.checkUseNumCoupon(rule.getId(),rule.getLimitTotalDay(), rule.getLimitTotalNum(), nowDate,usedList)).collect(Collectors.toList());
}
/*4.得到用户最终可以使用的优惠券,计算优惠金额并转换成统一的对象*/
List<CouponVO> rtnList = new ArrayList<>();
if(!filteredList.isEmpty()){
for(CardCouponVO rule:filteredList){
CouponVO couponVO = new CouponVO();
couponVO.setId(rule.getDataId());
couponVO.setCouponId(rule.getId());
couponVO.setName(rule.getName());
couponVO.setUseWithOther(rule.getUseWithOther());
//计算优惠金额
couponVO.setDisAmount(checkUtil.computeDisAmountCoupon(rule,oilAmount,oilLiter));
rtnList.add(couponVO);
}
}
return rtnList;
}

View File

@ -8,14 +8,18 @@ import com.fuint.business.marketingActivity.activePrice.entity.ActivePriceRecord
import com.fuint.business.marketingActivity.activePrice.entity.ActiveSubPriceRule;
import com.fuint.business.marketingActivity.activePrice.vo.ActivePriceRuleRespVO;
import com.fuint.business.marketingActivity.activePrice.vo.ActiveSubPriceRespVO;
import com.fuint.business.marketingActivity.cardCoupon.entity.CardCouponUser;
import com.fuint.business.marketingActivity.cardCoupon.vo.CardCouponVO;
import com.fuint.business.userGroup.entity.UserDiscount;
import com.fuint.common.util.StringUtils;
import com.fuint.pay.vo.GoodsVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.*;
import java.util.stream.Collectors;
@ -234,6 +238,127 @@ public class CheckUtil {
}
}
}
/**
* 判断当前加油的油号是否符合优惠券预设的油号----优惠券专用
* @author vinjor-M
* @date 14:42 2024/9/21
* @param couponVO 优惠券对象
* @param oilId 当前加油选择的油号id
* @return java.lang.Boolean
**/
public Boolean checkOilCoupon(CardCouponVO couponVO, Integer oilId){
//代金券折扣券油品立减券才需要判断油品是否满足
List<String> couponTypeList = Arrays.asList("1","3","4");
if(couponTypeList.contains(couponVO.getType())){
if("1".equals(couponVO.getOilLimit())){
//不限制油品符合
return true;
}else{
//限制油品
if(StringUtils.isNotEmpty(couponVO.getOilNumber())){
List<String> oilIdList = Arrays.asList(couponVO.getOilNumber().split(StrUtil.COMMA));
return oilIdList.contains(oilId.toString());
}else{
//没有配置可用油号不满足
return false;
}
}
}else{
//其他券不需要判断油品
return true;
}
}
/**
* 判断当前加油金额或者加油升数是否达到满减条件----优惠券专用
* @author vinjor-M
* @date 14:42 2024/9/21
* @param couponVO 优惠券对象
* @param oilAmount 加油金额
* @param oilLiter 加油升数
* @return java.lang.Boolean
**/
public Boolean checkMaxCoupon(CardCouponVO couponVO, Double oilAmount,Double oilLiter){
//代金券折扣券油品立减券才需要判断加油升数加油金额是否达到满减条件
List<String> couponTypeList = Arrays.asList("1","3","4");
if(couponTypeList.contains(couponVO.getType())){
Double thisValue;
if("1".equals(couponVO.getUseType())){
//加油金额
thisValue = oilAmount;
}else if("2".equals(couponVO.getUseType())){
//加油升数
thisValue = oilLiter;
}else {
//超出预设值范围不满足
return false;
}
if("1".equals(couponVO.getType())){
//代金券
return checkMaxCouponChild(null,couponVO.getReachAmount(),thisValue);
}else if("3".equals(couponVO.getType())){
//折扣券
return checkMaxCouponChild(couponVO.getZkStartAmount().doubleValue(),couponVO.getZkEndAmount().doubleValue(),thisValue);
}else if("4".equals(couponVO.getType())){
//油品立减券
return checkMaxCouponChild(null,couponVO.getReachAmount(),thisValue);
}else{
//超出预设值范围不可用
return false;
}
}else{
//其他券不需要判断默认满足
return true;
}
}
/**
* 判断加油金额或者加油升数是否符合某区间范围
* @author vinjor-M
* @date 16:45 2024/9/25
* @param min 最小值可能为null
* @param max 最大值一定有值
* @param thisValue 加油金额或加油升数一定有值
* @return java.lang.Boolean
**/
public Boolean checkMaxCouponChild(Double min,Double max,Double thisValue){
if(null==min){
return thisValue>=max;
}else {
return isBetween(thisValue,min,max);
}
}
/**
* 判断当前订单选择的商品是否满足优惠券的使用规则----优惠券专用
* @author vinjor-M
* @date 14:42 2024/9/21
* @param couponVO 优惠券对象
* @param goodsList 选择的商品列表
* @return java.lang.Boolean
**/
public Boolean checkGoodsCoupon(CardCouponVO couponVO, List<GoodsVO> goodsList){
if("5".equals(couponVO.getType()) || goodsList.isEmpty()){
//单品立减券
if(StringUtils.isNotEmpty(couponVO.getProductIds())){
//限制使用的商品id
List<String> ruleGoodsList = Arrays.asList(couponVO.getProductIds().split(StrUtil.COMMA));
//过滤出符合条件的本订单的商品
List<GoodsVO> filteredList = goodsList.stream().filter(goods->ruleGoodsList.contains(goods.getId())).collect(Collectors.toList());
//计算符合条件的商品订单总金额
double orderAmount =0.0;
if(!filteredList.isEmpty()){
orderAmount = filteredList.stream().mapToDouble(GoodsVO::getAmount).sum();
}
return orderAmount>=couponVO.getReachAmount();
}else{
//未设置可用商品不符合
return false;
}
}else{
//其他券或者本订单未选择商品不需要判断商品
return true;
}
}
/**
@ -279,6 +404,55 @@ public class CheckUtil {
return maxNum>nowNum;
}
/**
* 判断当前优惠券每多少天使用了多少次 是否满足优惠券设置的限制条件
* @author vinjor-M
* @date 14:51 2024/9/21
* @param coupId 优惠券id
* @param dayNum 多少天内
* @param maxNum 最大次数限制
* @param nowDate 结算日期
* @param recordAllList 所有使用记录
* @return java.lang.Boolean
**/
public Boolean checkUseNumCoupon(Integer coupId, Integer dayNum, Integer maxNum, Date nowDate, List<CardCouponUser> recordAllList){
if(0==dayNum){
//每多少天 设置为0代表不显示
return true;
}
int nowNum = 0;
//开始时间是结算时间 向前推 dayNum
LocalDateTime startTime = DateUtil.offsetDay(nowDate,-3).toLocalDateTime();
//结束时间为结算的时间
LocalDateTime endTime = DateUtil.date(nowDate).toLocalDateTime();
//优惠券使用时间过滤出近 dayNum 天内使用的次数
nowNum = (int) recordAllList.stream()
.filter(item->item.getCardCouponId().equals(coupId))
.filter(item->checkDateTimeIsIn(item.getUseTime(),startTime,endTime))
.count();
return maxNum>nowNum;
}
/**
* 判断一个时间是否在一个时间区间内
* @author vinjor-M
* @date 18:09 2024/9/25
* @param useDate 使用时间
* @param startTime 时间区间起始
* @param endTime 时间区间结束
* @return java.lang.Boolean
**/
private Boolean checkDateTimeIsIn(Date useDate,LocalDateTime startTime,LocalDateTime endTime){
LocalDateTime userDateTime = DateUtil.date(useDate).toLocalDateTime();
if(userDateTime.isAfter(startTime) && userDateTime.isBefore(endTime)){
return true;
}else if(userDateTime.equals(startTime ) || userDateTime.equals(endTime)){
return true;
}else{
return false;
}
}
/**
* 根据活动优惠规则计算优惠金额四舍五入保留2位小数--分时优惠和限时特价使用
* @author vinjor-M
@ -399,6 +573,48 @@ public class CheckUtil {
return Double.valueOf(df.format(disAmount));
}
/**
* 根据优惠券优惠规则计算优惠金额四舍五入保留2位小数--优惠券专用
* @author vinjor-M
* @date 16:35 2024/9/21
* @param coupon 优惠券
* @param oilAmount 加油总价
* @param oilLiter 加油升数
* @return java.lang.Double
**/
public Double computeDisAmountCoupon(CardCouponVO coupon, Double oilAmount, Double oilLiter){
//默认优惠后总价等于原来的总价
Double newOilAmount = oilAmount;
//优惠金额
Double disAmount = 0.0;
DecimalFormat df = new DecimalFormat("#.00");
try {
//1 按加油金额否则 按加油升数
Double thisValue = "1".equals(coupon.getUseType())?oilAmount:oilLiter;
if("1".equals(coupon.getType())){
//代金券-直接拿优惠金额
disAmount = coupon.getReduceAmount();
}else if("3".equals(coupon.getType())){
//折扣券打折
newOilAmount = newOilAmount*coupon.getZkData();
disAmount = oilAmount - newOilAmount;
if(disAmount>coupon.getZkMaxAmount()){
//超出折扣最大优惠金额
disAmount = coupon.getZkMaxAmount();
}
}else if("4".equals(coupon.getType())){
//油品立减券每满多少升减多少钱
//计算能除尽多少次就减多少次
int thisInt = (int) (thisValue / coupon.getLjOilNum());
//计算优惠金额
disAmount = thisInt * coupon.getLjOilAmount();
}
}catch (Exception e){
log.error("优惠券优惠金额计算失败:"+e.getMessage(),e);
}
return Double.valueOf(df.format(disAmount));
}
/**
* 从一个日期里面获取时间00:00格式
* @author vinjor-M
@ -512,7 +728,7 @@ public class CheckUtil {
* @return boolean
**/
private static boolean isBetween(double value, double min, double max) {
return value > min && value < max;
return value >= min && value <= max;
}
/**

View File

@ -11,8 +11,14 @@ import java.io.Serializable;
**/
@Data
public class CouponVO implements Serializable {
/** 优惠券id */
/** 优惠券和用户关联表的id */
private Integer id;
/** 优惠券id */
private Integer couponId;
/** 优惠券名称 */
private String name;
/**是否可与其他优惠一起使用1可以0不可以*/
private String useWithOther;
/** 优惠金额 */
private Double disAmount;
}

View File

@ -0,0 +1,20 @@
package com.fuint.pay.vo;
import lombok.Data;
/**
* 订单选择的商品
* @author vinjor-M
* @date 14:42 2024/9/25
**/
@Data
public class GoodsVO {
/** 商品id */
private String id;
/** 商品数量 */
private Integer num;
/** 商品单价 */
private Double price;
/** 总金额 */
private Double amount;
}

View File

@ -1,7 +1,7 @@
# \u57FA\u672C\u914D\u7F6E
server.port=8080
env.profile=dev
env.properties.path=D:/workspaces/oil-stations/fuintBackend/configure/
env.properties.path=D:/my_project/oil-station/fuintBackend/configure/
#env.properties.path=F:/work/oilSystem/fuintBackend/configure/
#env.properties.path=D:/oil/new-oil/oilSystem/fuintBackend/configure/
#env.properties.path=D:/work/oilSystem/fuintBackend/configure/

View File

@ -1 +1 @@
mvn install:install-file -Dfile=D:\Code\yuzhan\oil-station\fuintBackend\lib\yly_sdk_2.2.jar -DgroupId=yly_sdk -DartifactId=yly_sdk -Dversion=2.2 -Dpackaging=jar
mvn install:install-file -Dfile=D:\Code\yuzhan\oil-station\fuintBackend\lib\yly_sdk_2.2.jar -DgroupId=yly_sdk -DartifactId=yly_sdk -Dversion=2.2 -Dpackaging=jar

View File

@ -65,7 +65,7 @@
<div class="d-b">
<el-checkbox v-model="checkAll">活动优惠 <i class="el-icon-arrow-down"></i></el-checkbox>
<div class="or_num">-0.00</div>
<div class="or_num"></div>
</div>
<!-- 下拉列表插入-->
<div v-if="checkAll == true">
@ -83,22 +83,19 @@
<div class="d-b">
<el-checkbox v-model="checkAll">优惠券 <i class="el-icon-arrow-down"></i></el-checkbox>
<div class="or_num">-0.00</div>
<div class="or_num"></div>
</div>
<!-- 下拉列表插入-->
<div v-if="checkAll == true">
<div class="x-d-b">
<el-checkbox v-model="checkAll1">优惠券1</el-checkbox>
<div class="or_num">-0.00</div>
<div v-if="couponList.length>0">
<el-radio-group style="width: 100%" v-model="chooseAct">
<div class="x-d-b" v-for="(item,index) in activityList">
<el-radio :label="item.id">{{null==item.ruleName?item.actName:item.ruleName}}<div class="or_num">-{{item.disAmount}}</div></el-radio>
</div>
</el-radio-group>
</div>
<div class="x-d-b">
<el-checkbox v-model="checkAll2">优惠券2</el-checkbox>
<div class="or_num">-0.00</div>
</div>
<div class="x-d-b">
<el-checkbox v-model="checkAll3">优惠券3</el-checkbox>
<div class="or_num">-0.00</div>
<div v-if="couponList.length==0">
暂无可用优惠券
</div>
</div>
@ -545,8 +542,12 @@ export default {
},
//
activityList:[],
//
couponList:[],
// actId_ruleId
chooseAct:"",
//
chooseCoupon:"",
//--
payWay: "ALIPAY",
//
@ -661,6 +662,17 @@ export default {
}
},
watch: {
orderAmount: {
handler(newVal) {
console.log("订单总金额发生变化", newVal);
//
this.getActivity()
//
this.getCoupon()
},
deep: true,
immediate: true,
},
//
oilGunClearing: {
immediate: true,
@ -673,8 +685,6 @@ export default {
this.orderAmount = this.getGoodsNum
}
this.refuelingAmount = false
//
this.getActivity()
}
},
//
@ -1000,21 +1010,38 @@ export default {
*/
getCoupon(){
//
if(this.oilGunClearing!='' && this.oilGunClearing.hasOwnProperty("oilNameId") && this.chooseVipUser.hasOwnProperty("id")){
//
let oilLiter = (this.oilGunClearing.amount / this.oilGunClearing.oilPrice).toFixed(2)
//
if(this.chooseVipUser.hasOwnProperty("id") && (this.goodsList.length>0 || (this.oilGunClearing!='' && this.oilGunClearing.hasOwnProperty("oilNameId")))){
//
let dataObj = {
userId: this.chooseVipUser.id,
oilId: this.oilGunClearing.oilNameId,
oilPrice:this.oilGunClearing.oilPrice,
oilAmount: this.oilGunClearing.amount,
orderAmount: this.orderAmount,
oilLiter: oilLiter
userId: this.chooseVipUser.id
}
if(this.oilGunClearing!='' && this.oilGunClearing.hasOwnProperty("oilNameId")){
//
dataObj['oilId'] = this.oilGunClearing.oilNameId
dataObj['oilAmount'] = this.oilGunClearing.amount
dataObj['oilLiter'] = this.oilLiter
}
if(this.goodsList.length>0){
let goodsArray = []
for (let i = 0; i < this.goodsList.length; i++) {
let thisGoods = this.goodsList[i]
let goods = {
id: thisGoods.id,
num:thisGoods.num,
price:thisGoods.retailPrice,
amount:thisGoods.retailPrice * thisGoods.num
}
goodsArray.push(goods)
dataObj['goods'] = JSON.stringify(goodsArray)
}
console.log(dataObj)
}
getCouponList(dataObj).then(res => {
console.log("返回结果",res)
console.log("返回的可用的优惠券",res)
this.couponList = res.data
})
}else{
this.couponList=[]
}
},
copyToClipboard(textToCopy) {