| | |
| | | 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; |
| | |
| | | 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; |
| | |
| | | @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(); |
| | |
| | | @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); |
| | | } |
| | | } |