huliguo
2025-06-09 3348eda2c33469e9935ae6afcf83ea5c52cea906
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/SeckillActivityInfoServiceImpl.java
@@ -1,10 +1,13 @@
package com.ruoyi.other.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.account.api.feignClient.AppUserClient;
import com.ruoyi.account.api.model.AppUser;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.utils.PageUtils;
import com.ruoyi.common.core.utils.ServletUtils;
import com.ruoyi.common.core.utils.StringUtils;
@@ -22,11 +25,14 @@
import com.ruoyi.other.util.GeodesyUtil;
import com.ruoyi.other.vo.SeckillActivityDetailVO;
import com.ruoyi.other.vo.SeckillActivityVO;
import com.ruoyi.system.api.domain.SysConfig;
import com.ruoyi.system.api.feignClient.SysConfigClient;
import com.ruoyi.system.api.model.LoginUser;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
@@ -57,13 +63,13 @@
    @Resource
    private GoodsSeckillService goodsSeckillService;
    @Resource
    private SysConfigClient sysConfigClient;
    @Resource
    private GoodsService goodsService;
    @Resource
    private OrderClient orderClient;
    @Override
    public TableDataInfo<SeckillActivityVO> listSeckillActivity(Goods goods) {
        LoginUser loginUserApplet = tokenService.getLoginUserApplet();
        List<SeckillActivityVO> seckillActivityVOS = seckillActivityInfoMapper.listSeckillActivity(goods);
        for (SeckillActivityVO seckillActivityVO : seckillActivityVOS) {
            Integer data = orderClient.getGoodsSaleNum(seckillActivityVO.getGoodsId(), 2).getData();
@@ -190,42 +196,77 @@
    @Transactional(rollbackFor = Exception.class)
    public void saveSeckillActivityInfo(SeckillActivityInfo seckillActivityInfo) {
        Integer goodId = seckillActivityInfo.getGoodId();
        String startTime = seckillActivityInfo.getStartTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        String endTime = seckillActivityInfo.getEndTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        long count = this.count(new LambdaQueryWrapper<SeckillActivityInfo>().eq(SeckillActivityInfo::getGoodId, goodId).eq(SeckillActivityInfo::getDelFlag, 0)
                .eq(SeckillActivityInfo::getIsShelves, 1).last(" and ('" + startTime + "' between start_time and end_time or '" + endTime + "' between start_time and end_time)"));
        if(0 < count){
        //检查该商品是否有秒杀活动
        SeckillActivityInfo one = this.getOne(new LambdaQueryWrapper<SeckillActivityInfo>().eq(SeckillActivityInfo::getGoodId, goodId).eq(SeckillActivityInfo::getDelFlag, 0));
        if(null!=one){
            throw new RuntimeException("该秒杀商品已在其他秒杀活动中存在");
        }
        seckillActivityInfo.setId(null);
        seckillActivityInfo.setDelFlag(0);
        seckillActivityInfo.setIsShelves(0);//下架状态
        seckillActivityInfo.setSellingPrice(seckillActivityInfo.getActivityPrice());
        this.baseMapper.insert(seckillActivityInfo);
        List<GoodsSeckill> goodsSeckills = seckillActivityInfo.getGoodsSeckills();
        for (GoodsSeckill goodsSeckill : goodsSeckills) {
            goodsSeckill.setCashPayment(null == goodsSeckill.getSellingPrice() ? 0 : 1);
            goodsSeckill.setPointPayment(null == goodsSeckill.getIntegral() ? 0 : 1);
            goodsSeckill.setSeckillActivityInfoId(seckillActivityInfo.getId());
        }
        goodsSeckillService.saveBatch(goodsSeckills);
        //添加价格积分
        GoodsSeckill goodsSeckill = new GoodsSeckill();
        goodsSeckill.setSeckillActivityInfoId(seckillActivityInfo.getId());
        goodsSeckill.setSellingPrice(seckillActivityInfo.getSellingPrice());
        Integer point =getPoint(seckillActivityInfo.getSellingPrice());
        goodsSeckill.setIntegral(point);
        goodsSeckillService.save(goodsSeckill);
    }
    /**
     * 获取现金对应积分
     */
    public Integer getPoint(BigDecimal cash){
        if (cash == null || cash.compareTo(BigDecimal.ZERO) < 0) {
            throw new IllegalArgumentException("金额不能为null或负数");
        }
        // 获取积分兑换比例配置
        R<SysConfig> info = sysConfigClient.getInfo(6L);
        if (info == null || info.getData() == null) {
            throw new RuntimeException("获取积分兑换比例配置失败");
        }
        String configValue = info.getData().getConfigValue();
        if (StringUtils.isBlank(configValue)) {
            throw new RuntimeException("积分兑换比例配置值为空");
        }
        try {
            // 使用BigDecimal处理比例,避免精度问题
            BigDecimal ratio = new BigDecimal(configValue.trim());
            if (ratio.compareTo(BigDecimal.ZERO) <= 0) {
                throw new RuntimeException("积分兑换比例必须大于0");
            }
            // 计算积分并四舍五入取整
            return cash.multiply(ratio).intValue();
        } catch (NumberFormatException e) {
            throw new RuntimeException("积分兑换比例配置值格式错误", e);
        } catch (ArithmeticException e) {
            throw new RuntimeException("积分计算结果溢出", e);
        }
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateSeckillActivityInfo(SeckillActivityInfo seckillActivityInfo) {
        Integer goodId = seckillActivityInfo.getGoodId();
        String startTime = seckillActivityInfo.getStartTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        String endTime = seckillActivityInfo.getEndTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        long count = this.count(new LambdaQueryWrapper<SeckillActivityInfo>().eq(SeckillActivityInfo::getGoodId, goodId).eq(SeckillActivityInfo::getDelFlag, 0)
                .eq(SeckillActivityInfo::getIsShelves, 1).last(" and ('" + startTime + "' between start_time and end_time or '" + endTime + "' between start_time and end_time)"));
        if(1 < count){
            throw new RuntimeException("该秒杀商品已在其他秒杀活动中存在");
        SeckillActivityInfo one = this.getOne(new LambdaQueryWrapper<SeckillActivityInfo>()
                .eq(SeckillActivityInfo::getId, seckillActivityInfo.getId()).eq(SeckillActivityInfo::getDelFlag, 0));
        if(null==one){
            throw new RuntimeException("该秒杀活动不存在");
        }
        this.baseMapper.updateById(seckillActivityInfo);
        goodsSeckillService.remove(new LambdaQueryWrapper<GoodsSeckill>().eq(GoodsSeckill::getSeckillActivityInfoId, seckillActivityInfo.getId()));
        List<GoodsSeckill> goodsSeckills = seckillActivityInfo.getGoodsSeckills();
        for (GoodsSeckill goodsSeckill : goodsSeckills) {
            goodsSeckill.setCashPayment(null == goodsSeckill.getSellingPrice() ? 0 : 1);
            goodsSeckill.setPointPayment(null == goodsSeckill.getIntegral() ? 0 : 1);
            goodsSeckill.setSeckillActivityInfoId(seckillActivityInfo.getId());
        }
        goodsSeckillService.saveBatch(goodsSeckills);
        seckillActivityInfo.setSellingPrice(seckillActivityInfo.getActivityPrice());
        this.baseMapper.updateById(seckillActivityInfo);//修改限购数量、开始时间、结束时间
        //修改价格积分
        Integer point =getPoint(seckillActivityInfo.getSellingPrice());
        UpdateWrapper<GoodsSeckill> wrapper = new UpdateWrapper<>();
        wrapper.eq("seckill_activity_info_id", seckillActivityInfo.getId())
                .set("selling_price", seckillActivityInfo.getSellingPrice())
                .set("integral", point);
        goodsSeckillService.update(wrapper);
    }
}