From 74b2581c8a9be309ca6454da3ff2c56501368771 Mon Sep 17 00:00:00 2001
From: Pu Zhibing <393733352@qq.com>
Date: 星期四, 09 一月 2025 09:30:21 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/GoodsServiceImpl.java |  251 +++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 209 insertions(+), 42 deletions(-)

diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/GoodsServiceImpl.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/GoodsServiceImpl.java
index d647b1d..80dc58a 100644
--- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/GoodsServiceImpl.java
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/GoodsServiceImpl.java
@@ -2,6 +2,7 @@
 
 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.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -15,15 +16,19 @@
 import com.ruoyi.common.core.web.page.PageInfo;
 import com.ruoyi.common.security.service.TokenService;
 import com.ruoyi.common.security.utils.SecurityUtils;
+import com.ruoyi.order.feignClient.OrderClient;
 import com.ruoyi.order.feignClient.RemoteOrderGoodsClient;
 import com.ruoyi.order.vo.Price;
 import com.ruoyi.other.api.domain.*;
+import com.ruoyi.other.api.vo.GetGoodsBargainPrice;
+import com.ruoyi.other.api.vo.GetSeckillActivityInfo;
 import com.ruoyi.other.enums.GoodsStatus;
 import com.ruoyi.other.mapper.GoodsAreaMapper;
 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.GoodsVO;
 import com.ruoyi.system.api.model.LoginUser;
 import org.jetbrains.annotations.NotNull;
@@ -71,60 +76,68 @@
     private GoodsAreaService goodsAreaService;
     @Resource
     private RemoteOrderGoodsClient remoteOrderGoodsClient;
+    @Resource
+    private SeckillActivityInfoService seckillActivityInfoService;
+    @Resource
+    private GoodsSeckillService goodsSeckillService;
+    @Resource
+    private GoodsBargainPriceService goodsBargainPriceService;
+    @Resource
+    private GoodsBargainPriceDetailService goodsBargainPriceDetailService;
+    @Resource
+    private OrderClient orderClient;
+
+
 
     @Override
     public PageInfo<GoodsVO> goodsList(Goods search) {
         PageInfo<GoodsVO> pageInfo = new PageInfo(search.getPageCurr(), search.getPageSize());
-        List<GoodsVO> list = this.baseMapper.goodsList(pageInfo, search.getGoodsCategoryId(), search.getName());
-        Long userId = null;
+        Integer vipId = 0;
+        String provinceCode = null;
+        String cityCode = null;
+        String districtCode = null;
         String token = SecurityUtils.getToken(ServletUtils.getRequest());
         if(StringUtils.isNotEmpty(token)){
-            userId = tokenService.getLoginUserApplet().getUserid();
+            Long userid = tokenService.getLoginUserApplet().getUserid();
+            AppUser appUser = appUserClient.getAppUserById(userid);
+            vipId = appUser.getVipId();
+            provinceCode = appUser.getProvinceCode();
+            cityCode = appUser.getCityCode();
+            districtCode = appUser.getDistrictCode();
         }
+        List<GoodsVO> list = this.baseMapper.goodsList(pageInfo, search.getGoodsCategoryId(), search.getName(), vipId);
         for (GoodsVO goods : list) {
-            //游客展示基础售价
-            if(null != userId){
-                R<Price> r = remoteOrderGoodsClient.getGoodsPrice(userId, goods.getGoodsId(), null);
-                if (null != r.getData()){
-                    Price price = r.getData();
-                    goods.setSellingPrice(price.getCash());
-                    goods.setIntegral(price.getPoint());
-                }
+            Price price = getPrice(vipId, goods.getGoodsId(), null, 1, provinceCode, cityCode, districtCode);
+            if(null != price){
+                goods.setCashPayment(price.getCashPayment() ? 1 : 0);
+                goods.setPointPayment(price.getPointPayment() ? 1 : 0);
+                goods.setSellingPrice(price.getCash());
+                goods.setIntegral(price.getPoint());
             }
+            Integer data = orderClient.getGoodsSaleNum(goods.getGoodsId(), 1).getData();
+            goods.setSaleNum(data);
         }
         return pageInfo.setRecords(list);
     }
 
     @Override
-    public GoodsVO goodsDetail(Long goodsId) {
+    public GoodsVO goodsDetail(Long goodsId, String longitude, String latitude) {
         if (goodsId == null || goodsId <= 0) {
             throw new NullPointerException("商品ID不能为空");
         }
 
-        LoginUser loginUserApplet = tokenService.getLoginUserApplet();
-        AppUser appUser = appUserClient.getAppUserById(loginUserApplet.getUserid());
-        BigDecimal sellingPrice = BigDecimal.ZERO;
-        Integer integral = 0;
-
-        GoodsArea goodsArea = goodsAreaMapper.selectOne(new LambdaQueryWrapper<GoodsArea>()
-                .eq(GoodsArea::getGoodsId, goodsId)
-                .eq(GoodsArea::getVip, appUser.getVipId())
-                .eq(GoodsArea::getProvinceCode, appUser.getProvinceCode())
-                .eq(StringUtils.isNotEmpty(appUser.getCityCode()), GoodsArea::getCityCode, appUser.getCityCode())
-                .eq(StringUtils.isNotEmpty(appUser.getDistrictCode()), GoodsArea::getDistrictsCode, appUser.getDistrictCode()));
-
-        if (Objects.nonNull(goodsArea)){
-            sellingPrice = goodsArea.getSellingPrice();
-            integral = goodsArea.getIntegral();
-        }else {
-            VipSetting vipSetting = vipSettingService.getVipSettingByUserId(loginUserApplet.getUserid());
-            GoodsVip goodsVip = goodsVipService.getOne(new LambdaQueryWrapper<GoodsVip>()
-                    .eq(GoodsVip::getVip, vipSetting.getId())
-                    .eq(GoodsVip::getGoodsId, goodsId));
-            if(null != goodsVip){
-                sellingPrice = goodsVip.getSellingPrice();
-                integral = goodsVip.getIntegral();
-            }
+        Integer vipId = 0;
+        String provinceCode = null;
+        String cityCode = null;
+        String districtCode = null;
+        String token = SecurityUtils.getToken(ServletUtils.getRequest());
+        if(StringUtils.isNotEmpty(token)){
+            Long userid = tokenService.getLoginUserApplet().getUserid();
+            AppUser appUser = appUserClient.getAppUserById(userid);
+            vipId = appUser.getVipId();
+            provinceCode = appUser.getProvinceCode();
+            cityCode = appUser.getCityCode();
+            districtCode = appUser.getDistrictCode();
         }
 
         Goods goods = this.getById(goodsId);
@@ -132,8 +145,13 @@
         BeanUtils.copyBeanProp(goodsVO, goods);
         goodsVO.setGoodsId(goods.getId());
         goodsVO.setGoodsName(goods.getName());
-        goodsVO.setSellingPrice(sellingPrice);
-        goodsVO.setIntegral(integral);
+        Price price = getPrice(vipId, goods.getId(), null, 1, provinceCode, cityCode, districtCode);
+        if(null != price){
+            goodsVO.setPointPayment(price.getPointPayment() ? 1 : 0);
+            goodsVO.setCashPayment(price.getCashPayment() ? 1 : 0);
+            goodsVO.setSellingPrice(price.getCash());
+            goodsVO.setIntegral(price.getPoint());
+        }
 
         if(goods.getType() == 1){
             if(goods.getAppointStore() == 2){
@@ -155,15 +173,52 @@
                     .in(Shop::getDelFlag, 0));
             goodsVO.setShopList(shopList);
         }
+        List<Shop> shopList = goodsVO.getShopList();
+        for (Shop shop : shopList) {
+            Double wgs84 = GeodesyUtil.getDistance(longitude + "," + latitude, shop.getLongitude() + "," + shop.getLatitude()).get("WGS84");
+            shop.setDistance(wgs84);
+        }
+        shopList.sort(new Comparator<Shop>() {
+            @Override
+            public int compare(Shop o1, Shop o2) {
+                return o1.getDistance().compareTo(o2.getDistance());
+            }
+        });
+        goodsVO.setShopList(shopList);
+        Integer integer = orderClient.getGoodsSaleNum(goods.getId(), 1).getData();
+        goodsVO.setSaleNum(integer);
         return goodsVO;
     }
 
 
     @Override
     public List<Goods> getGoodsListByShopId(PageInfo<Goods> pageInfo, Integer shopId) {
-        LoginUser loginUserApplet = tokenService.getLoginUserApplet();
-        VipSetting vipSetting = vipSettingService.getVipSettingByUserId(loginUserApplet.getUserid());
-        return goodsMapper.selectListByShopId(pageInfo, shopId, vipSetting.getId());
+        Integer vipId = 0;
+        String provinceCode = null;
+        String cityCode = null;
+        String districtCode = null;
+        String token = SecurityUtils.getToken(ServletUtils.getRequest());
+        if(StringUtils.isNotEmpty(token)){
+            Long userid = tokenService.getLoginUserApplet().getUserid();
+            AppUser appUser = appUserClient.getAppUserById(userid);
+            vipId = appUser.getVipId();
+            provinceCode = appUser.getProvinceCode();
+            cityCode = appUser.getCityCode();
+            districtCode = appUser.getDistrictCode();
+        }
+        List<Goods> goods = goodsMapper.selectListByShopId(pageInfo, shopId, vipId);
+        for (Goods good : goods) {
+            Price price = getPrice(vipId, good.getId(), shopId, 1, provinceCode, cityCode, districtCode);
+            if(null != price){
+                good.setCashPayment(price.getCashPayment() ? 1 : 0);
+                good.setPointPayment(price.getPointPayment() ? 1 : 0);
+                good.setSellingPrice(price.getCash());
+                good.setIntegral(price.getPoint());
+            }
+            Integer data = orderClient.getGoodsSaleNum(good.getId(), 1).getData();
+            good.setSaleNum(data);
+        }
+        return goods;
     }
 
     @Override
@@ -232,6 +287,7 @@
         if (!CollectionUtils.isEmpty(goodsAreaList)){
             for (GoodsArea goodsArea : goodsAreaList) {
                 List<GoodsArea> goodsAreaList1 = goodsArea.getGoodsAreaList();
+                List<GoodsArea> goodsAreaList2 = new ArrayList<>();
                 for (GoodsArea area : goodsAreaList1) {
                     area.setId(null);
                     area.setGoodsId(id);
@@ -241,8 +297,11 @@
                     area.setProvinceCode(goodsArea.getProvinceCode());
                     area.setCityCode(goodsArea.getCityCode());
                     area.setDistrictsCode(goodsArea.getDistrictsCode());
+                    if(null != area.getSellingPrice() && null != area.getIntegral()){
+                        goodsAreaList2.add(area);
+                    }
                 }
-                goodsAreaService.saveBatch(goodsAreaList1);
+                goodsAreaService.saveBatch(goodsAreaList2);
             }
         }
     }
@@ -376,4 +435,112 @@
         goodsArea1.setGoodsAreaList(goodsAreas);
         return goodsArea1;
     }
+
+
+    /**
+     * 根据商品的价格配置体系获取商品当前的价格
+     * @param vip
+     * @param goodsId
+     * @param type          1普通商品,2秒杀商品
+     * @param shopId
+     * @param provinceCode
+     * @param cityCode
+     * @param districtCode
+     * @return
+     */
+    public Price getPrice(Integer vip, Integer goodsId, Integer shopId, Integer type, String provinceCode, String cityCode, String districtCode){
+        //获取支付价格
+        //秒杀活动>门店特价>地区价格>会员价格
+        //判断是否有秒杀活动
+        Price price = new Price();
+        SeckillActivityInfo one = seckillActivityInfoService.getOne(new LambdaQueryWrapper<SeckillActivityInfo>().eq(SeckillActivityInfo::getGoodId, goodsId)
+                .eq(SeckillActivityInfo::getIsShelves, 1).eq(SeckillActivityInfo::getDelFlag, 0)
+                .last(" and now() between start_time and end_time and FIND_IN_SET(" + vip + ", vip_ids) order by create_time desc limit 0, 1"));
+        GoodsSeckill goodsSeckill = null;
+        if(null != one){
+            goodsSeckill = goodsSeckillService.getOne(new LambdaQueryWrapper<GoodsSeckill>().eq(GoodsSeckill::getSeckillActivityInfoId, one.getId()).eq(GoodsSeckill::getVip, vip));
+        }
+        //没有秒杀活动或者添加的普通商品则不使用秒杀活动价格
+        if(null == goodsSeckill || type == 1){
+            //没有秒杀价,则判断门店特价
+            GoodsBargainPriceDetail bargainPriceDetail = null;
+            if (shopId != null){
+                GoodsBargainPrice priceServiceOne = goodsBargainPriceService.getOne(new LambdaQueryWrapper<GoodsBargainPrice>().eq(GoodsBargainPrice::getGoodsId, goodsId).eq(GoodsBargainPrice::getShopId, shopId)
+                        .eq(GoodsBargainPrice::getDelFlag, 0).eq(GoodsBargainPrice::getAuditStatus, 1).last(" order by create_time desc limit 0, 1"));
+                if(null != priceServiceOne){
+                    bargainPriceDetail = goodsBargainPriceDetailService.getOne(new LambdaQueryWrapper<GoodsBargainPriceDetail>().eq(GoodsBargainPriceDetail::getGoodsBargainPriceId, priceServiceOne.getId()).eq(GoodsBargainPriceDetail::getVip, vip));
+                }
+            }
+            if(null == bargainPriceDetail){
+                //没有门店特价,判断地区价格配置
+                LambdaQueryWrapper<GoodsArea> queryWrapper = new LambdaQueryWrapper<GoodsArea>().eq(GoodsArea::getGoodsId, goodsId).eq(GoodsArea::getVip, vip);
+                if(StringUtils.isNotEmpty(districtCode)){
+                    queryWrapper.eq(GoodsArea::getDistrictsCode, districtCode);
+                }
+                if(StringUtils.isNotEmpty(cityCode)){
+                    queryWrapper.eq(GoodsArea::getCityCode, cityCode);
+                }
+                if(StringUtils.isNotEmpty(provinceCode)){
+                    queryWrapper.eq(GoodsArea::getProvinceCode, provinceCode);
+                }
+                GoodsArea goodsArea = goodsAreaService.getOne(queryWrapper);
+                if(null == goodsArea){
+                    //没有地区价格,则使用会员价格
+                    GoodsVip goodsVip = goodsVipService.getOne(new LambdaQueryWrapper<GoodsVip>().eq(GoodsVip::getGoodsId, goodsId).eq(GoodsVip::getVip, vip));
+                    if(null == goodsVip){
+                        //没有配置价格,直接使用原始基础价格
+                        return null;
+                    }else{
+                        //构建价格数据
+                        if(goodsVip.getCashPayment() == 1 && goodsVip.getPointPayment() == 1){
+                            price.setCash(goodsVip.getSellingPrice());
+                            price.setPoint(goodsVip.getIntegral());
+                        }
+                        if(goodsVip.getCashPayment() == 1 && goodsVip.getPointPayment() == 0){
+                            price.setCash(goodsVip.getSellingPrice());
+                        }
+                        if(goodsVip.getCashPayment() == 0 && goodsVip.getPointPayment() == 1){
+                            price.setPoint(goodsVip.getIntegral());
+                        }
+                        price.setCashPayment(goodsVip.getCashPayment() == 1);
+                        price.setPointPayment(goodsVip.getPointPayment() == 1);
+                    }
+                }else{
+                    //构建价格数据
+                    if(goodsArea.getCashPayment() == 1 && goodsArea.getPointPayment() == 1){
+                        price.setCash(goodsArea.getSellingPrice());
+                        price.setPoint(goodsArea.getIntegral());
+                    }
+                    if(goodsArea.getCashPayment() == 1 && goodsArea.getPointPayment() == 0){
+                        price.setCash(goodsArea.getSellingPrice());
+                    }
+                    if(goodsArea.getCashPayment() == 0 && goodsArea.getPointPayment() == 1){
+                        price.setPoint(goodsArea.getIntegral());
+                    }
+                    price.setCashPayment(goodsArea.getCashPayment() == 1);
+                    price.setPointPayment(goodsArea.getPointPayment() == 1);
+                }
+            }else{
+                price.setCash(bargainPriceDetail.getSellingPrice());
+                price.setPoint(bargainPriceDetail.getIntegral());
+                price.setCashPayment(bargainPriceDetail.getSellingPrice() != null);
+                price.setPointPayment(bargainPriceDetail.getIntegral() != null);
+            }
+        }else{
+            //构建价格数据
+            if(goodsSeckill.getCashPayment() == 1 && goodsSeckill.getPointPayment() == 1){
+                price.setCash(goodsSeckill.getSellingPrice());
+                price.setPoint(goodsSeckill.getIntegral());
+            }
+            if(goodsSeckill.getCashPayment() == 1 && goodsSeckill.getPointPayment() == 0){
+                price.setCash(goodsSeckill.getSellingPrice());
+            }
+            if(goodsSeckill.getCashPayment() == 0 && goodsSeckill.getPointPayment() == 1){
+                price.setPoint(goodsSeckill.getIntegral());
+            }
+            price.setCashPayment(goodsSeckill.getCashPayment() == 1);
+            price.setPointPayment(goodsSeckill.getPointPayment() == 1);
+        }
+        return price;
+    }
 }

--
Gitblit v1.7.1