无关风月
2025-01-16 d1cab4b2f2690d1331f12f0d9de78bbbf926f390
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/SeckillActivityInfoServiceImpl.java
@@ -5,14 +5,21 @@
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.utils.PageUtils;
import com.ruoyi.common.core.utils.ServletUtils;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.security.service.TokenService;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.order.feignClient.OrderClient;
import com.ruoyi.other.api.domain.*;
import com.ruoyi.other.mapper.GoodsShopMapper;
import com.ruoyi.other.mapper.SeckillActivityInfoMapper;
import com.ruoyi.other.mapper.ShopMapper;
import com.ruoyi.other.service.GoodsEvaluateService;
import com.ruoyi.other.service.GoodsSeckillService;
import com.ruoyi.other.service.GoodsService;
import com.ruoyi.other.service.SeckillActivityInfoService;
import com.ruoyi.other.util.GeodesyUtil;
import com.ruoyi.other.vo.SeckillActivityDetailVO;
import com.ruoyi.other.vo.SeckillActivityVO;
import com.ruoyi.system.api.model.LoginUser;
@@ -20,7 +27,9 @@
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
@@ -48,53 +57,178 @@
    private GoodsSeckillService goodsSeckillService;
    @Resource
    private GoodsService goodsService;
    @Resource
    private OrderClient orderClient;
    @Resource
    private GoodsEvaluateService goodsEvaluateService;
    @Override
    public List<SeckillActivityVO> listSeckillActivity(Goods goods) {
        LoginUser loginUserApplet = tokenService.getLoginUserApplet();
        AppUser appUser = appUserClient.getAppUserById(loginUserApplet.getUserid());
        goods.setVipId(appUser.getVipId());
        return seckillActivityInfoMapper.listSeckillActivity(goods);
        List<SeckillActivityVO> seckillActivityVOS = seckillActivityInfoMapper.listSeckillActivity(goods);
        for (SeckillActivityVO seckillActivityVO : seckillActivityVOS) {
            Integer data = orderClient.getGoodsSaleNum(seckillActivityVO.getGoodsId(), 2).getData();
            seckillActivityVO.setSaleNum(data);
            LocalDateTime startTime = seckillActivityVO.getStartTime();
            LocalDateTime now = LocalDateTime.now();
            LocalDateTime endTime = seckillActivityVO.getEndTime();
            if (endTime.isBefore(now)){
                seckillActivityVO.setStatus(3); //已结束
            }else if (startTime.isBefore(now)){
                seckillActivityVO.setStatus(2); // 已开始
            }else {
                seckillActivityVO.setStatus(1); // 未开始
            }
        }
        Integer pageCurr = goods.getPageCurr();
        Integer pageSize = goods.getPageSize();
        String orderByColumn = goods.getOrderByColumn();
        String isAsc = goods.getIsAsc();
        // 排序
        Comparator<SeckillActivityVO> comparator = getComparator(orderByColumn, isAsc);
        List<SeckillActivityVO> sortedList = seckillActivityVOS.stream()
                .sorted(comparator)
                .collect(Collectors.toList());
        // 分页
        int startIndex = (pageCurr - 1) * pageSize;
        int endIndex = Math.min(startIndex + pageSize, sortedList.size());
        if (startIndex >= sortedList.size()) {
            return new ArrayList<>();
        }
        return sortedList.subList(startIndex, endIndex);
    }
    private Comparator<SeckillActivityVO> getComparator(String orderByColumn, String isAsc) {
        Comparator<SeckillActivityVO> comparator;
        switch (orderByColumn) {
            case "tgs.selling_price":
                comparator = Comparator.comparing(SeckillActivityVO::getSellingPrice);
                break;
            case "integral":
                comparator = Comparator.comparing(SeckillActivityVO::getIntegral);
                break;
            case "sale_num":
                comparator = Comparator.comparing(SeckillActivityVO::getSaleNum);
                break;
            // 添加其他排序字段
            default:
                comparator = Comparator.comparing(SeckillActivityVO::getId); // 默认按ID排序
                break;
        }
        if ("desc".equalsIgnoreCase(isAsc)) {
            comparator = comparator.reversed();
        }
        return comparator;
    }
    @Override
    public SeckillActivityDetailVO detail(Integer seckillActivityId) {
        Long userid = tokenService.getLoginUserApplet().getUserid();
        AppUser appUser = appUserClient.getAppUserById(userid);
        SeckillActivityDetailVO seckillActivityDetailVO = seckillActivityInfoMapper.selectDetail(seckillActivityId, appUser.getVipId());
    public SeckillActivityDetailVO detail(Integer seckillActivityId, String latitude, String longitude) {
        Integer vipId = 0;
        String token = SecurityUtils.getToken(ServletUtils.getRequest());
        if(StringUtils.isNotEmpty(token)){
            Long userid = tokenService.getLoginUserApplet().getUserid();
            AppUser appUser = appUserClient.getAppUserById(userid);
            vipId = appUser.getVipId();
        }
        SeckillActivityInfo activityInfo = this.getById(seckillActivityId);
        if(null == activityInfo || activityInfo.getDelFlag() == 1){
            throw new RuntimeException("活动不存在");
        }
        if(activityInfo.getIsShelves() == 0){
            throw new RuntimeException("活动已下架");
        }
        if(!activityInfo.getVipIds().contains(vipId.toString())){
            throw new RuntimeException("权限不足");
        }
        SeckillActivityDetailVO seckillActivityDetailVO = seckillActivityInfoMapper.selectDetail(seckillActivityId, vipId);
        Integer goodsId = seckillActivityDetailVO.getGoodsId();
        Goods goods = goodsService.getById(goodsId);
        seckillActivityDetailVO.setGoodsName(goods.getName());
        seckillActivityDetailVO.setGoodsType(goods.getType());
        List<Shop> shops;
        if(goods.getAppointStore() == 1){
            List<Integer> shopIdList = goodsShopMapper.selectList(new LambdaQueryWrapper<GoodsShop>()
                    .eq(GoodsShop::getGoodsId, goodsId)).stream().map(GoodsShop::getShopId).collect(Collectors.toList());
            shops = shopMapper.selectObjs(new LambdaQueryWrapper<Shop>()
                    .select(Shop::getName)
                    .in(shopIdList.size() > 0, Shop::getId, shopIdList));
            shops = shopMapper.selectList(new LambdaQueryWrapper<Shop>()
                    .in(shopIdList.size() > 0, Shop::getId, shopIdList).eq(Shop::getDelFlag, 0));
        }else{
            shops = shopMapper.selectList(new LambdaUpdateWrapper<Shop>().eq(Shop::getDelFlag, 0));
        }
        if(StringUtils.isNotEmpty(longitude) && StringUtils.isNotEmpty(latitude)){
            for (Shop shop : shops) {
                Double wgs84 = GeodesyUtil.getDistance(longitude + "," + latitude, shop.getLongitude() + "," + shop.getLatitude()).get("WGS84");
                shop.setDistance(wgs84);
            }
            shops.sort(new Comparator<Shop>() {
                @Override
                public int compare(Shop o1, Shop o2) {
                    return o1.getDistance().compareTo(o2.getDistance());
                }
            });
        }
        seckillActivityDetailVO.setShopList(shops);
        Integer integer = orderClient.getGoodsSaleNum(goods.getId(), 2).getData();
        seckillActivityDetailVO.setSaleNum(integer);
        GoodsEvaluate goodsEvaluate = goodsEvaluateService.lambdaQuery().eq(GoodsEvaluate::getGoodsId, goodsId).isNotNull(GoodsEvaluate::getComment).ne(GoodsEvaluate::getComment, "")
                .orderByDesc(GoodsEvaluate::getGrade).eq(GoodsEvaluate::getStatus, 2).eq(GoodsEvaluate::getDelFlag, 0).last(" limit 0, 1").one();
        if (null != goodsEvaluate) {
            AppUser appUserById = appUserClient.getAppUserById(goodsEvaluate.getAppUserId());
            if(null != appUserById){
                goodsEvaluate.setUserName(appUserById.getName());
                goodsEvaluate.setAvatar(appUserById.getAvatar());
                goodsEvaluate.setIdStr(String.valueOf(goodsEvaluate.getId()));
            }
        }
        seckillActivityDetailVO.setGoodsEvaluate(goodsEvaluate);
        return seckillActivityDetailVO;
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void saveSeckillActivityInfo(SeckillActivityInfo seckillActivityInfo) {
        Integer goodId = seckillActivityInfo.getGoodId();
        long count = this.count(new LambdaQueryWrapper<SeckillActivityInfo>().eq(SeckillActivityInfo::getGoodId, goodId).eq(SeckillActivityInfo::getDelFlag, 0)
                .eq(SeckillActivityInfo::getIsShelves, 1).last(" and now() between start_time and end_time"));
        if(0 < count){
            throw new RuntimeException("该秒杀商品已在其他秒杀活动中存在");
        }
        this.baseMapper.insert(seckillActivityInfo);
        List<GoodsSeckill> goodsSeckills = seckillActivityInfo.getGoodsSeckills();
        goodsSeckills.forEach(goodsSeckill -> goodsSeckill.setSeckillActivityInfoId(seckillActivityInfo.getId()));
        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);
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateSeckillActivityInfo(SeckillActivityInfo seckillActivityInfo) {
        Integer goodId = seckillActivityInfo.getGoodId();
        long count = this.count(new LambdaQueryWrapper<SeckillActivityInfo>().eq(SeckillActivityInfo::getGoodId, goodId).eq(SeckillActivityInfo::getDelFlag, 0)
                .eq(SeckillActivityInfo::getIsShelves, 1).last(" and now() between start_time and end_time"));
        if(1 < count){
            throw new RuntimeException("该秒杀商品已在其他秒杀活动中存在");
        }
        this.baseMapper.updateById(seckillActivityInfo);
        goodsSeckillService.remove(new LambdaQueryWrapper<GoodsSeckill>().eq(GoodsSeckill::getSeckillActivityInfoId, seckillActivityInfo.getId()));
        List<GoodsSeckill> goodsSeckills = seckillActivityInfo.getGoodsSeckills();
        goodsSeckills.forEach(goodsSeckill -> goodsSeckill.setSeckillActivityInfoId(seckillActivityInfo.getId()));
        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);
    }
}