| | |
| | | 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.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; |
| | |
| | | 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; |
| | | |
| | |
| | | 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()); |
| | | |
| | | List<SeckillActivityVO> seckillActivityVOS = seckillActivityInfoMapper.listSeckillActivity(goods); |
| | | return seckillActivityVOS; |
| | | 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) { |
| | | 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(); |
| | |
| | | }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(); |
| | | for (GoodsSeckill goodsSeckill : 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(); |