sucheng 2 месяцев назад
Родитель
Сommit
cb9798810e

+ 23 - 5
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsProcessOperationProcessEquServiceImpl.java

@@ -3317,10 +3317,10 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
                 query.setQuerySql(sysGeneralCRUDService.replaceSql(query));
             }
             CriteriaBuilder.initQuerySql(query);
-            query.setQuerySql(query.getQuerySql().replaceFirst("\\*", "SQL_CALC_FOUND_ROWS *"));
+
             IPage<Map<String, Object>> result = new Page<>();
-            //开始事务
-            apsProcessOperationProcessEquService.queryCard(result, query);
+
+            queryCard2(result, query);
 
             return R.ok(result);
         } catch (Exception e) {
@@ -3329,9 +3329,27 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
         }
     }
 
-    @Transactional
+    private void queryCard2(IPage<Map<String, Object>> result, CriteriaQuery query) {
+        //窗口函数 优化查询效率
+        query.setQuerySql(query.getQuerySql().replaceFirst("\\*", "*, COUNT(*) OVER() AS total_count"));
+        int offset = (query.getCurrent() - 1) * query.getSize();
+        List<Map<String, Object>> list = this.baseMapper.getCardListPage(offset, query.getSize(), query.getQuerySql());
+        if (list.isEmpty()) {
+            result.setTotal(0);
+        } else {
+            result.setTotal((Long) list.get(0).get("total_count"));
+        }
+        result.setCurrent(query.getCurrent());
+        result.setSize(query.getSize());
+        result.setRecords(list);
+    }
+
+    @Transactional//需要保持事务,还要注意防止数据库连接池不是同一个(仅限mysql使用,大数据量效率不高)
     public void queryCard(IPage<Map<String, Object>> result, CriteriaQuery query) {
-        int offset = (query.getCurrent()-1) * query.getSize();
+        //mysql专属优化,全表扫描,但只扫描一次
+        query.setQuerySql(query.getQuerySql().replaceFirst("\\*", "SQL_CALC_FOUND_ROWS *"));
+
+        int offset = (query.getCurrent() - 1) * query.getSize();
         List<Map<String, Object>> list = this.baseMapper.getCardListPage(offset, query.getSize(), query.getQuerySql());
         Integer total = this.baseMapper.getTotal();