فهرست منبع

feat(store): 门店列表按距离筛选,juli(千米)非空才过滤

- getmdlist/getdaidiq 改为 <script> 动态 SQL,HAVING 追加 juli 条件
- getmdlistCount/getdaidiqCount 同步距离过滤并补坐标参数,保证 total 与列表一致
- getstorelist 的 juli 改为可不传,不传则不过滤
qmj 1 هفته پیش
والد
کامیت
9e4e5f370e

+ 3 - 3
ruoyi-admin/src/main/java/com/ruoyi/app/mendian/PosStoreController.java

@@ -295,7 +295,7 @@ public class PosStoreController extends BaseController {
                                    @RequestParam BigDecimal latitude,
                                    @RequestParam Integer page,
                                    @RequestParam String area,
-                                   @RequestParam Integer juli,
+                                   @RequestParam(required = false) Integer juli,  //距离筛选(千米),可不传;不传则不过滤
                                    @RequestParam(defaultValue = "") Integer sort,
                                    @RequestParam(defaultValue = "zh-TW", required = false) String language) {
         List<PosStore> list;
@@ -309,8 +309,8 @@ public class PosStoreController extends BaseController {
 
         // total 必须是符合条件总数,不能用当前页行数充当,否则客户端按 total 判断会误判"已加载完"导致翻页失效
         long total = sort == null
-                ? posStoreMapper.getmdlistCount("%" + area + "%")
-                : posStoreMapper.getdaidiqCount("%" + area + "%", sort);
+                ? posStoreMapper.getmdlistCount(longitude, latitude, "%" + area + "%", juli)
+                : posStoreMapper.getdaidiqCount(longitude, latitude, "%" + area + "%", sort, juli);
         Page<StoreOutput> result = posStoreEnrichService.buildStoreOutputPage(list, language, page, total);
         return success(result);
 

+ 8 - 8
ruoyi-system/src/main/java/com/ruoyi/system/mapper/PosStoreMapper.java

@@ -18,20 +18,20 @@ import java.util.List;
 public interface PosStoreMapper extends BaseMapper<PosStore>
 {
     //按照距离查询推荐商家(dayang=打烊标记:state=1 或当前不在营业时段;打烊门店全局沉底,同组内按距离升序)
-    @Select("SELECT *,(st_distance(point(longitude,latitude),point(#{longitude},#{latitude}))*111195/1000 ) as juli,(SELECT del_flag FROM info_user WHERE info_user.user_id = pos_store.user_id) as xxzt,(CASE WHEN pos_store.state = 1 THEN 1 WHEN EXISTS (SELECT 1 FROM operating_hours oh WHERE oh.md_id = pos_store.id AND oh.day_of_week = WEEKDAY(CURDATE()) + 1 AND oh.is_open = 1 AND TIME(oh.start_time) <= CURTIME() AND CURTIME() <= TIME(oh.end_time)) THEN 0 ELSE 1 END) as dayang FROM pos_store WHERE del_flag='0' and off_shelf='0' and area like #{area}  HAVING xxzt=0 ORDER BY dayang ASC, juli ASC limit #{page},20")  //查询语句
+    @Select("<script>SELECT *,(st_distance(point(longitude,latitude),point(#{longitude},#{latitude}))*111195/1000 ) as juli,(SELECT del_flag FROM info_user WHERE info_user.user_id = pos_store.user_id) as xxzt,(CASE WHEN pos_store.state = 1 THEN 1 WHEN EXISTS (SELECT 1 FROM operating_hours oh WHERE oh.md_id = pos_store.id AND oh.day_of_week = WEEKDAY(CURDATE()) + 1 AND oh.is_open = 1 AND TIME(oh.start_time) &lt;= CURTIME() AND CURTIME() &lt;= TIME(oh.end_time)) THEN 0 ELSE 1 END) as dayang FROM pos_store WHERE del_flag='0' and off_shelf='0' and area like #{area}  HAVING xxzt=0<if test='juli != null'> AND juli &lt;= #{juli}</if> ORDER BY dayang ASC, juli ASC limit #{page},20</script>")  //查询语句;juli(千米)非空时只保留该距离内的门店,为空则不过滤
     List<PosStore> getmdlist(@Param("longitude")BigDecimal longitude, @Param("latitude")BigDecimal latitude,@Param("page")Integer page,@Param("area")String area,@Param("juli")Integer juli);  //反回结果
 
     //按照分类距离查询分类商家
-    @Select("SELECT *,(st_distance(point(longitude,latitude),point(#{longitude},#{latitude}))*111195/1000 ) as juli,(SELECT del_flag FROM info_user WHERE info_user.user_id = pos_store.user_id) as xxzt,(CASE WHEN pos_store.state = 1 THEN 1 WHEN EXISTS (SELECT 1 FROM operating_hours oh WHERE oh.md_id = pos_store.id AND oh.day_of_week = WEEKDAY(CURDATE()) + 1 AND oh.is_open = 1 AND TIME(oh.start_time) <= CURTIME() AND CURTIME() <= TIME(oh.end_time)) THEN 0 ELSE 1 END) as dayang FROM pos_store WHERE del_flag='0' and off_shelf='0' and area like #{area} and FIND_IN_SET(#{sort},sort) > 0  HAVING xxzt=0 ORDER BY dayang ASC, juli ASC limit #{page},20")  //查询语句
+    @Select("<script>SELECT *,(st_distance(point(longitude,latitude),point(#{longitude},#{latitude}))*111195/1000 ) as juli,(SELECT del_flag FROM info_user WHERE info_user.user_id = pos_store.user_id) as xxzt,(CASE WHEN pos_store.state = 1 THEN 1 WHEN EXISTS (SELECT 1 FROM operating_hours oh WHERE oh.md_id = pos_store.id AND oh.day_of_week = WEEKDAY(CURDATE()) + 1 AND oh.is_open = 1 AND TIME(oh.start_time) &lt;= CURTIME() AND CURTIME() &lt;= TIME(oh.end_time)) THEN 0 ELSE 1 END) as dayang FROM pos_store WHERE del_flag='0' and off_shelf='0' and area like #{area} and FIND_IN_SET(#{sort},sort) > 0  HAVING xxzt=0<if test='juli != null'> AND juli &lt;= #{juli}</if> ORDER BY dayang ASC, juli ASC limit #{page},20</script>")  //查询语句;juli(千米)非空时只保留该距离内的门店,为空则不过滤
     List<PosStore> getdaidiq(@Param("longitude")BigDecimal longitude, @Param("latitude")BigDecimal latitude,@Param("page")Integer page,@Param("area")String area,@Param("juli")Integer juli,@Param("sort")Integer sort);  //反回结果
 
-    /** 门店列表总数(条件与 getmdlist 一致,只返回条数;total 用于分页元数据,勿用当前页行数充当) */
-    @Select("SELECT COUNT(*) FROM pos_store WHERE del_flag='0' and off_shelf='0' and area like #{area} AND (SELECT del_flag FROM info_user WHERE info_user.user_id = pos_store.user_id) = 0")
-    long getmdlistCount(@Param("area")String area);
+    /** 门店列表总数(条件与 getmdlist 一致,只返回条数;total 用于分页元数据,勿用当前页行数充当);juli(千米)非空时同样按距离过滤 */
+    @Select("<script>SELECT COUNT(*) FROM pos_store WHERE del_flag='0' and off_shelf='0' and area like #{area} AND (SELECT del_flag FROM info_user WHERE info_user.user_id = pos_store.user_id) = 0<if test='juli != null'> AND (st_distance(point(longitude,latitude),point(#{longitude},#{latitude}))*111195/1000) &lt;= #{juli}</if></script>")
+    long getmdlistCount(@Param("longitude")BigDecimal longitude, @Param("latitude")BigDecimal latitude, @Param("area")String area, @Param("juli")Integer juli);
 
-    /** 分类门店列表总数(条件与 getdaidiq 一致) */
-    @Select("SELECT COUNT(*) FROM pos_store WHERE del_flag='0' and off_shelf='0' and area like #{area} and FIND_IN_SET(#{sort},sort) > 0 AND (SELECT del_flag FROM info_user WHERE info_user.user_id = pos_store.user_id) = 0")
-    long getdaidiqCount(@Param("area")String area,@Param("sort")Integer sort);
+    /** 分类门店列表总数(条件与 getdaidiq 一致);juli(千米)非空时同样按距离过滤 */
+    @Select("<script>SELECT COUNT(*) FROM pos_store WHERE del_flag='0' and off_shelf='0' and area like #{area} and FIND_IN_SET(#{sort},sort) > 0 AND (SELECT del_flag FROM info_user WHERE info_user.user_id = pos_store.user_id) = 0<if test='juli != null'> AND (st_distance(point(longitude,latitude),point(#{longitude},#{latitude}))*111195/1000) &lt;= #{juli}</if></script>")
+    long getdaidiqCount(@Param("longitude")BigDecimal longitude, @Param("latitude")BigDecimal latitude, @Param("area")String area, @Param("sort")Integer sort, @Param("juli")Integer juli);
 
     //按照服务类型距离查询分类商家
     @Select("SELECT *,(st_distance(point(longitude,latitude),point(#{longitude},#{latitude}))*111195/1000 ) as juli,(SELECT del_flag FROM info_user WHERE info_user.user_id = pos_store.user_id) as xxzt FROM pos_store WHERE del_flag='0' and off_shelf='0' and area like #{area} and server_type like #{server_type} HAVING xxzt=0 ORDER BY juli ASC limit #{page},20 ")  //查询语句