浏览代码

修复门店列表分页total误用当前页行数导致客户端提前停止翻页(改为count真实总数)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
qmj 1 天之前
父节点
当前提交
ad33e1319c

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

@@ -230,7 +230,11 @@ public class PosStoreController extends BaseController {
 
         posStoreEnrichService.enrichStoreList(list);
 
-        Page<StoreOutput> result = posStoreEnrichService.buildStoreOutputPage(list, language, page, list.size());
+        // total 必须是符合条件总数,不能用当前页行数充当,否则客户端按 total 判断会误判"已加载完"导致翻页失效
+        long total = sort == null
+                ? posStoreMapper.getmdlistCount("%" + area + "%")
+                : posStoreMapper.getdaidiqCount("%" + area + "%", sort);
+        Page<StoreOutput> result = posStoreEnrichService.buildStoreOutputPage(list, language, page, total);
         return success(result);
 
     }

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

@@ -25,6 +25,13 @@ public interface PosStoreMapper extends BaseMapper<PosStore>
     @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")  //查询语句
     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);
+
+    /** 分类门店列表总数(条件与 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);
 
     //按照服务类型距离查询分类商家
     @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 ")  //查询语句