Przeglądaj źródła

团购重构,推荐页面店铺新功能

jyc 12 godzin temu
rodzic
commit
8688b4a17b

+ 3 - 0
alien-entity/src/main/java/shop/alien/entity/store/StoreInfo.java

@@ -188,4 +188,7 @@ public class StoreInfo {
     @ApiModelProperty(value = "图片模式")
     @TableField("img_mode")
     private Integer ImgMode;
+
+    @TableField(exist = false)
+    private String dist;
 }

+ 4 - 0
alien-entity/src/main/java/shop/alien/mapper/StoreInfoMapper.java

@@ -91,4 +91,8 @@ public interface StoreInfoMapper extends BaseMapper<StoreInfo> {
 
     @Select("select * from store_info ${ew.customSqlSegment}")
     List<StoreInfo> getList(@Param(Constants.WRAPPER) LambdaQueryWrapper<StoreInfo> queryWrapper);
+
+    @Select("select *," +
+            "            ROUND(ST_Distance_Sphere(ST_GeomFromText(CONCAT('POINT(', REPLACE(#{position}, ',', ' '), ')' )), ST_GeomFromText(CONCAT('POINT(', REPLACE(g.position, ',', ' '), ')' ))) / 1000, 2) AS dist from store_info ${ew.customSqlSegment}")
+    IPage<StoreInfo> getPageForDistance(@Param(Constants.WRAPPER) QueryWrapper<StoreInfo> queryWrapper, IPage<StoreInfo> page, @Param("position") String position);
 }

+ 44 - 0
alien-store/src/main/java/shop/alien/store/controller/StoreInfoController.java

@@ -479,6 +479,50 @@ public class StoreInfoController {
     }
 
     /**
+     * 新八大类用户端筛选
+     * 根据筛选条件获取门店信息列表
+     *
+     * @param screeningOfEightMajorCategoriesVO 筛选条件VO对象
+     * @return R<IPage < StoreInfo>> 分页的门店信息列表
+     */
+    @ApiOperation("新八大类用户端筛选")
+    @PostMapping(value = "getScreeningNew")
+    public R<IPage<StoreInfo>> getScreeningNew(@RequestBody ScreeningOfEightMajorCategoriesVO screeningOfEightMajorCategoriesVO) {
+        // 参数校验
+        if (screeningOfEightMajorCategoriesVO == null) {
+            return R.fail("筛选参数不能为空");
+        }
+
+        // 记录请求日志
+        log.info("新八大类用户端筛选请求 - 参数: screeningId={}, lon={}, lat={}, distance={}, flag={}, pageNum={}, pageSize={}",
+                screeningOfEightMajorCategoriesVO.getScreeningId(),
+                screeningOfEightMajorCategoriesVO.getLon(),
+                screeningOfEightMajorCategoriesVO.getLat(),
+                screeningOfEightMajorCategoriesVO.getDistance(),
+                screeningOfEightMajorCategoriesVO.getFlag(),
+                screeningOfEightMajorCategoriesVO.getPageNum(),
+                screeningOfEightMajorCategoriesVO.getPageSize());
+
+        try {
+            // 调用服务层获取筛选结果
+            IPage<StoreInfo> result = storeInfoService.getScreeningNew(screeningOfEightMajorCategoriesVO);
+
+            // 记录响应日志
+            log.info("新八大类用户端筛选响应 - 总记录数: {}, 当前页: {}, 页大小: {}",
+                    result.getTotal(), result.getCurrent(), result.getSize());
+
+            return R.data(result);
+        } catch (IllegalArgumentException e) {
+            log.warn("新八大类用户端筛选参数错误: {}", e.getMessage());
+            return R.fail(e.getMessage());
+        } catch (Exception e) {
+            log.error("新八大类用户端筛选异常", e);
+            return R.fail("筛选失败,请稍后重试");
+        }
+    }
+
+
+    /**
      * 八大类用户端经营类型筛选
      *
      * @param businessTypesNames 经营类型名称,多个类型用逗号分隔

+ 1 - 0
alien-store/src/main/java/shop/alien/store/service/StoreInfoService.java

@@ -189,6 +189,7 @@ public interface StoreInfoService extends IService<StoreInfo> {
      * 八大类用户端筛选
      */
     IPage<StoreInfo> getScreening(ScreeningOfEightMajorCategoriesVO screeningOfEightMajorCategoriesVO);
+    IPage<StoreInfo> getScreeningNew(ScreeningOfEightMajorCategoriesVO screeningOfEightMajorCategoriesVO);
 
     List<StoreInfo> getBusinessTypesName(String businessTypesNames);
 

+ 116 - 0
alien-store/src/main/java/shop/alien/store/service/impl/StoreInfoServiceImpl.java

@@ -1385,6 +1385,122 @@ public class StoreInfoServiceImpl extends ServiceImpl<StoreInfoMapper, StoreInfo
     }
 
     @Override
+    public IPage<StoreInfo> getScreeningNew(ScreeningOfEightMajorCategoriesVO vo) {
+        // 参数校验
+        if (vo == null) {
+            throw new IllegalArgumentException("筛选参数不能为空");
+        }
+
+        // 创建分页对象
+        IPage<StoreInfo> page = new Page<>(vo.getPageNum(), vo.getPageSize());
+
+        // 获取筛选条件
+        String screeningId = vo.getScreeningId();
+        Double lon = vo.getLon();
+        Double lat = vo.getLat();
+        Double distance = vo.getDistance();
+        Boolean flag = vo.getFlag();
+        String startTime = vo.getStartTime();
+        String endTime = vo.getEndTime();
+        Double priceStr = vo.getPriceStr();
+        Double priceEnd = vo.getPriceEnd();
+
+        String storeId = "";
+
+        /*// 验证经纬度和距离参数
+        if (flag != null && flag) {
+            if (lon == null || lat == null || distance == null) {
+                throw new IllegalArgumentException("启用距离筛选时,经纬度和距离参数不能为空");
+            }
+            if (distance <= 0) {
+                throw new IllegalArgumentException("距离参数必须大于0");
+            }
+        }
+
+        // 通过经纬度距离获取商家id
+        if (lat != null && lon != null && distance != null) {
+            List<NearMeDto> nearMeDtos = nearMeService.nearbyMerchants(lon, lat, distance, flag);
+            if (nearMeDtos != null && !nearMeDtos.isEmpty()) {
+                storeId = nearMeDtos.stream()
+                        .map(item -> String.valueOf(item.getConent()))
+                        .collect(Collectors.joining(","));
+            }
+        }*/
+
+        if (lon == null || lat == null) {
+            throw new IllegalArgumentException("经纬度参数不能为空");
+        }
+
+        // 通过筛选id获取商家id
+        if (StringUtils.isNotEmpty(screeningId)) {
+            String[] list = screeningId.split(",");
+            for (String id : list) {
+                if (StringUtils.isEmpty(storeId)) {
+                    storeId = baseRedisService.getString(id);
+                } else {
+                    String redisStoreId = baseRedisService.getString(id);
+                    if (redisStoreId != null) {
+                        storeId = findCommon(storeId, redisStoreId);
+                    }
+                }
+            }
+        }
+
+        // 通过商家id获取商家信息
+        IPage<StoreInfo> storeInfoIPage = new Page<>();
+
+        if (StringUtils.isNotEmpty(storeId)) {
+            List<String> storeIds = Arrays.asList(storeId.split(","));
+            if (StringUtils.isNotEmpty(startTime) && StringUtils.isNotEmpty(endTime)) {
+                List<StoreBusinessInfo> storeBusinessInfos = storeBusinessInfoMapper.selectList(new LambdaQueryWrapper<StoreBusinessInfo>().in(StoreBusinessInfo::getStoreId, storeIds));
+                DateTimeFormatter formatter = new DateTimeFormatterBuilder()
+                        .appendValue(ChronoField.HOUR_OF_DAY, 1, 2, java.time.format.SignStyle.NOT_NEGATIVE)
+                        .appendLiteral(':')
+                        .appendValue(ChronoField.MINUTE_OF_HOUR, 2)
+                        .toFormatter();
+                List<StoreBusinessInfo> list = storeBusinessInfos.stream()
+                        .filter(item -> {
+                            // 商家开门时间
+                            LocalTime timeStart = LocalTime.parse(item.getEndTime(), formatter);
+                            // 商家关门时间
+                            LocalTime timeEnd = LocalTime.parse(item.getEndTime(), formatter);
+                            // 开始时间
+                            LocalTime time1 = LocalTime.parse(startTime);
+                            // 结束时间
+                            LocalTime time2 = LocalTime.parse(endTime);
+                            return !time1.isBefore(timeStart) && !time2.isAfter(timeEnd);
+                        })
+                        .collect(Collectors.toList());
+
+                storeIds = list.stream()
+                        .map(item -> String.valueOf(item.getStoreId()))
+                        .collect(Collectors.toList());
+            }
+            storeIds.stream()
+                    .filter(Objects::nonNull) // 确保 storeId 不为 null
+                    .distinct() // 去重
+                    .map(String::valueOf)
+                    .collect(Collectors.toList());
+            if (priceStr != null && priceEnd != null) {
+                List<LifeCoupon> lifeCoupons = lifeCouponMapper.selectList(new LambdaQueryWrapper<LifeCoupon>().in(LifeCoupon::getStoreId, storeIds));
+                List<LifeCoupon> list = lifeCoupons.stream()
+                        .filter(item -> Double.parseDouble(item.getPrice()) >= priceStr && Double.parseDouble(item.getPrice()) < priceEnd)
+                        .collect(Collectors.toList());
+                storeIds = list.stream()
+                        .map(item -> String.valueOf(item.getStoreId()))
+                        .collect(Collectors.toList());
+            }
+            if (!CollectionUtils.isEmpty(storeIds)) {
+                QueryWrapper<StoreInfo> queryWrapper = new QueryWrapper<>();
+                queryWrapper.in("id", storeIds);
+                queryWrapper.orderByAsc("dist");
+                storeInfoIPage = storeInfoMapper.getPageForDistance(queryWrapper, page, lon + "," + lat);
+            }
+        }
+        return storeInfoIPage;
+    }
+
+    @Override
     public List<StoreInfo> getBusinessTypesName(String businessTypesNames) {
         String[] businessTypesName = businessTypesNames.split(",");
         List<StoreInfo> storeInfos = new ArrayList<>();