huliguo
3 天以前 3348eda2c33469e9935ae6afcf83ea5c52cea906
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/GoodsServiceImpl.java
@@ -18,23 +18,30 @@
import com.ruoyi.order.feignClient.RemoteOrderGoodsClient;
import com.ruoyi.order.vo.Price;
import com.ruoyi.other.api.domain.*;
import com.ruoyi.other.dto.AddGoodsDTO;
import com.ruoyi.other.enums.GoodsStatus;
import com.ruoyi.other.mapper.GoodsEvaluateMapper;
import com.ruoyi.other.mapper.GoodsMapper;
import com.ruoyi.other.mapper.GoodsShopMapper;
import com.ruoyi.other.mapper.ShopMapper;
import com.ruoyi.other.service.*;
import com.ruoyi.other.util.GeodesyUtil;
import com.ruoyi.other.vo.GoodsEvaluateVO;
import com.ruoyi.other.vo.GoodsVO;
import com.ruoyi.other.vo.NearbyShopVO;
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 org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
@@ -72,6 +79,8 @@
    @Resource
    private ShopService shopService;
    @Resource
    private GoodsEvaluateMapper goodsEvaluateMapper;
    /**
     * 热门商品列表
@@ -83,26 +92,32 @@
    public PageInfo<GoodsVO> goodsList(Goods search) {
        List<Long> shopIds=null;
        if (null!=search.getLongitude()&&null!=search.getLatitude()){
            //获取最近十家店的id
            List<NearbyShopVO> nearbyShopVOS = shopService.nearbyShopList(search.getLongitude(), search.getLatitude(), new Shop());
            shopIds = nearbyShopVOS.subList(0, 10).stream().map(NearbyShopVO::getId).collect(Collectors.toList());
            int endIndex = Math.min(10, nearbyShopVOS.size());
            shopIds = nearbyShopVOS.subList(0, endIndex).stream().map(NearbyShopVO::getId).collect(Collectors.toList());
        }
        //查找满足条件的商品  分类、名称、附近十家店
        List<GoodsVO> list = this.baseMapper.goodsList(search.getGoodsCategoryId(), search.getName(),shopIds);
        //去重
        Map<Integer, GoodsVO> uniqueGoodsMap = new LinkedHashMap<>();
        for (GoodsVO goods : list) {
            uniqueGoodsMap.putIfAbsent(goods.getGoodsId(), goods);
        }
        list = new ArrayList<>(uniqueGoodsMap.values());
        for (GoodsVO goods : list) {
            //计算所需价格和积分
            Price price = getPrice( goods.getGoodsId(), 1);
            Price price = getPrice( goods.getGoodsId());
            if(null != price){
                //秒杀活动
                goods.setSellingPrice(price.getCash());
                goods.setIntegral(price.getPoint());
                goods.setStartTime(price.getStartTime());
                goods.setEndTime(price.getEndTime());
                goods.setPurchaseLimit(price.getPurchaseLimit());
            }
            //已售数量
            Integer data = orderClient.getGoodsSaleNum(goods.getGoodsId(), 1).getData();
            goods.setSaleNum(data);
        }
        //手动排序
        if(StringUtils.isNotEmpty(search.getOrderByColumn())){
@@ -185,6 +200,7 @@
        }
        Goods goods = this.getById(goodsId);
        if(null == goods || goods.getDelFlag() == 1){
            throw new RuntimeException("商品不存在");
        }
@@ -198,13 +214,14 @@
        goodsVO.setGoodsName(goods.getName());
        //计算所需价格和积分
        Price price = getPrice( goods.getId(), 1);
        Price price = getPrice( goods.getId());
        if(null != price){
            //秒杀活动
            goodsVO.setSellingPrice(price.getCash());
            goodsVO.setIntegral(price.getPoint());
            goodsVO.setStartTime(price.getStartTime());
            goodsVO.setEndTime(price.getEndTime());
            goodsVO.setPurchaseLimit(price.getPurchaseLimit());
        }
        //已售数量
        Integer data = orderClient.getGoodsSaleNum(goods.getId(), 1).getData();
@@ -214,12 +231,20 @@
        GoodsShop goodsShop = goodsShopMapper.selectOne(new LambdaQueryWrapper<GoodsShop>()
                .eq(GoodsShop::getGoodsId, goodsId));
        Shop shop1 = shopMapper.selectById(goodsShop.getShopId());
        ArrayList<Shop> shops = new ArrayList<>();
        shops.add(shop1);
        goodsVO.setShopList(shops);
        goodsVO.setShop(shop1);
        //已售数量
        Integer integer = orderClient.getGoodsSaleNum(goods.getId(), 1).getData();
        goodsVO.setSaleNum(integer);
        //商品评价
        GoodsEvaluate goodsEvaluate=goodsEvaluateMapper.getGoodsEvaluateOne(goods.getId());
        if (null != goodsEvaluate){
            AppUser appUserById = appUserClient.getAppUserById(goodsEvaluate.getAppUserId());
            goodsEvaluate.setAvatar(appUserById.getAvatar());
            goodsEvaluate.setUserName(appUserById.getName());
            goodsVO.setGoodsEvaluate(goodsEvaluate);
        }
        return goodsVO;
    }
@@ -229,13 +254,17 @@
    public List<GoodsVO> getGoodsListByShopId(PageInfo<GoodsVO> pageInfo, Integer shopId) {
        //查询该门店商品
        List<GoodsVO> goods = goodsMapper.selectListByShopId(pageInfo, shopId);
        if (goods == null) {
            return null;
        }
        for (GoodsVO good : goods) {
            //价格
            Price price = getPrice( good.getGoodsId(), 1);
            Price price = getPrice( good.getGoodsId());
            if(null != price){
                //秒杀活动
                good.setSellingPrice(price.getCash());
                good.setIntegral(price.getPoint());
                good.setPurchaseLimit(price.getPurchaseLimit());
                good.setStartTime(price.getStartTime());
                good.setEndTime(price.getEndTime());
            }
@@ -246,31 +275,33 @@
    }
    @Override
    public IPage<Goods> getManageGoodsList(Page<Goods> page, Goods goods) {
        IPage<Goods> goodsIPage = goodsMapper.selectManageGoodsList(page, goods);
        goodsIPage.getRecords().forEach(goods1 -> {
            Integer data = orderClient.getGoodsSaleNum(goods1.getId(), 1).getData();
            goods1.setSaleNum(data);
        });
        return goodsIPage;
    public R getManageGoodsList(Integer pageNum,Integer pageSize,  Goods goods) {
        PageInfo<Goods> pageInfo = new PageInfo<>(pageNum,pageSize);
        List<Goods> list = goodsMapper.selectManageGoodsList(pageInfo, goods);
        pageInfo.setRecords(list);
        return R.ok(pageInfo);
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void addGoods(Goods goods) {
        goods.setSaleNum(0);
        goods.setStatus(GoodsStatus.DOWN.getCode());
        goodsMapper.insert(goods);
        // 指定门店
        Integer appointStore = goods.getAppointStore();
        if (null != appointStore && appointStore == 1){
            List<GoodsShop> goodsShopList = goods.getGoodsShopList();
            if (CollectionUtils.isEmpty(goodsShopList)){
                throw new NullPointerException("请选择指定门店");
            }
            saveGoodsShopList(goodsShopList, goods.getId());
        }
        //保存商品门店关系
        GoodsShop goodsShop = new GoodsShop();
        goodsShop.setGoodsId(goods.getId());
        goodsShop.setShopId(goods.getShopId());
        Shop shop = shopMapper.selectById(goods.getShopId());
        goodsShop.setShopName(shop.getName());
        goodsShop.setOwnerName(shop.getShopManager());
        goodsShop.setPhone(shop.getPhone());
        goodsShop.setAddress(shop.getAddress());
        goodsShopService.save(goodsShop);
        //判断是否参加秒杀活动
    }
    @Override
@@ -279,9 +310,8 @@
        //修改个别字段
        this.update(new LambdaUpdateWrapper<Goods>().eq(Goods::getId, goods.getId()).set(Goods::getSellingPrice, goods.getSellingPrice())
                .set(Goods::getIntegral, goods.getIntegral()));
        // 指定门店
        List<GoodsShop> goodsShopList = goods.getGoodsShopList();
        saveGoodsShopList(goodsShopList, goods.getId());
        // 保存门店
        saveGoodsShop(goods.getShopId(),goods.getId());
    }
@@ -291,16 +321,16 @@
    private void saveGoodsShopList(List<GoodsShop> goodsShopList, Integer goodsId) {
    private void saveGoodsShop(Integer shopId, Integer goodsId) {
        goodsShopService.remove(new LambdaQueryWrapper<GoodsShop>()
                .eq(GoodsShop::getGoodsId, goodsId));
        if (!CollectionUtils.isEmpty(goodsShopList)){
            for (GoodsShop goodsShop : goodsShopList) {
                goodsShop.setGoodsId(goodsId);
                goodsShop.setId(null);
            }
        }
        goodsShopService.saveBatch(goodsShopList);
        GoodsShop goodsShop = new GoodsShop();
        goodsShop.setGoodsId(goodsId);
        goodsShop.setShopId(shopId);
        goodsShop.setId(null);
        goodsShopService.save(goodsShop);
    }
    @Override
@@ -309,32 +339,28 @@
        if (goods == null){
            return null;
        }
        // 指定门店
        List<GoodsShop> goodsShops = goodsShopService.list(new LambdaQueryWrapper<GoodsShop>()
        // 获取指定门店
        GoodsShop goodsShop = goodsShopService.getOne(new LambdaQueryWrapper<GoodsShop>()
                .eq(GoodsShop::getGoodsId, goodsId));
        for (GoodsShop goodsShop : goodsShops) {
            Shop shop = shopMapper.selectById(goodsShop.getShopId());
            if(null != shop){
                goodsShop.setShopName(shop.getName());
                goodsShop.setOwnerName(shop.getShopManager());
                goodsShop.setPhone(shop.getPhone());
                goodsShop.setAddress(shop.getAddress());
            }
        goods.setShopId(goodsShop.getShopId());
        Shop shop = shopService.getById(goodsShop.getShopId());
        if(null != shop){
            goodsShop.setShopName(shop.getName());
            goodsShop.setPhone(shop.getPhone());
            goodsShop.setAddress(shop.getAddress());
            goodsShop.setOwnerName(shop.getShopManager());
        }
        goods.setGoodsShopList(goodsShops);
        goods.setGoodsShop(goodsShop);
        return goods;
    }
    /**
     * 根据商品的价格配置体系获取商品当前的价格
     * @param goodsId
     * @param type          1普通商品,2秒杀商品
     * @return
     * 获取商品当前的价格,就是判断是否在秒杀活动中
     */
    public Price getPrice( Integer goodsId, Integer type){
    public Price getPrice( Integer goodsId ){
        //判断是否有在秒杀活动时间中
        Price price = new Price();
        SeckillActivityInfo one = seckillActivityInfoService.getOne(new LambdaQueryWrapper<SeckillActivityInfo>().eq(SeckillActivityInfo::getGoodId, goodsId)
@@ -346,7 +372,7 @@
            goodsSeckill = goodsSeckillService.getOne(new LambdaQueryWrapper<GoodsSeckill>().eq(GoodsSeckill::getSeckillActivityInfoId, one.getId()));
        }
        //没有秒杀活动或者添加的普通商品则使用秒杀活动价格
        if(null == goodsSeckill || type == 1){
        if(null == goodsSeckill ){
           return null;
        }
        //秒杀活动价格
@@ -355,6 +381,7 @@
        price.setPoint(getPoint(price.getCash()));
        price.setStartTime(one.getStartTime());
        price.setEndTime(one.getEndTime());
        price.setPurchaseLimit(one.getMaxNum());
        return price;
    }
@@ -366,7 +393,7 @@
            throw new IllegalArgumentException("金额不能为null或负数");
        }
        // 获取积分兑换比例配置
        R<SysConfig> info = sysConfigClient.getInfo("6");
        R<SysConfig> info = sysConfigClient.getInfo(6L);
        if (info == null || info.getData() == null) {
            throw new RuntimeException("获取积分兑换比例配置失败");
        }