Pārlūkot izejas kodu

fix 订单查询慢的问题

Liub 5 dienas atpakaļ
vecāks
revīzija
5122440766

+ 11 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/mapper/InsOrdersMapper.java

@@ -52,6 +52,17 @@ public interface InsOrdersMapper extends BaseMapper<InsOrders> {
 
     List<OrderListVo> queryOrderListAll(@Param("insOrdersParam") InsOrdersParamVO insOrdersParam);
 
+    /**
+     * 非 APP 手动分页版(两阶段延迟关联):先只按主表 ins_orders 过滤排序取本页 id(避免宽表全量 JOIN 后再 LIMIT),
+     * 再对 <=size 行联展示表补全展示字段。返回当前页数据,不依赖 MP 自动分页。
+     */
+    List<OrderListVo> queryOrderListPage(@Param("insOrdersParam") InsOrdersParamVO insOrdersParam, @Param("offset") long offset, @Param("size") long size);
+
+    /**
+     * 非 APP 手动分页版:轻量统计总条数(不联任何展示表,条件同 queryOrderListPage)
+     */
+    Long countOrderListPage(@Param("insOrdersParam") InsOrdersParamVO insOrdersParam);
+
     /**
      * 手动分页版:按车牌+状态分组去重(每组取最新一条),返回当前页数据
      */

+ 154 - 5
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersServiceImpl.java

@@ -84,6 +84,7 @@ import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.TimeUnit;
+import java.util.function.Supplier;
 import java.util.stream.Collectors;
 
 @RequiredArgsConstructor
@@ -168,6 +169,144 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
     @Value("${minio.bucket-name}")
     private String bucketName;
 
+    /**
+     * 业务员类型全量映射的本地缓存(进程内,60s 过期)。
+     * 该数据来自 organization 服务的全量查询,列表接口每次请求都会拉取一次,数据量较大且低频变更,
+     * 因此加一层本地缓存显著降低列表接口耗时。容忍多实例间短暂不一致(最长 60s)。
+     */
+    private static final long SALESMAN_TYPE_CACHE_TTL_MILLIS = 60_000L;
+    /**
+     * 订单列表 total 本地缓存:键为“全部列表过滤字段指纹 + 统计口径(APP按车牌+状态去重 / WEB主表单表)”,
+     * 60s TTL。缓解“无筛选/频繁翻页”场景下每次请求都重复执行全量大 count 的耗时。
+     */
+    private static final long ORDER_LIST_COUNT_TTL_MILLIS = 60_000L;
+    private static final int ORDER_LIST_COUNT_CACHE_LIMIT = 2000;
+    private static volatile Map<String, String> salesmanTypeCache;
+    private static volatile long salesmanTypeCacheExpireTime;
+    private static volatile Map<String, Long> orderListCountCache;
+    private static volatile Map<String, Long> orderListCountExpireMap;
+
+    private static void append(StringBuilder sb, Object value) {
+        sb.append(value == null ? "~" : value).append('#');
+    }
+
+    /**
+     * 获取业务员类型全量映射(带本地 60s 缓存)
+     */
+    private Map<String, String> getSalesmanTypeAttrMap() {
+        long now = System.currentTimeMillis();
+        if (salesmanTypeCache != null && now < salesmanTypeCacheExpireTime) {
+            return salesmanTypeCache;
+        }
+        synchronized (InsOrdersServiceImpl.class) {
+            if (salesmanTypeCache == null || now >= salesmanTypeCacheExpireTime) {
+                Map<String, String> result = orgClient.queryAllTypeAttrMap();
+                salesmanTypeCache = result != null ? result : Collections.emptyMap();
+                salesmanTypeCacheExpireTime = now + SALESMAN_TYPE_CACHE_TTL_MILLIS;
+            }
+        }
+        return salesmanTypeCache;
+    }
+
+    /**
+     * 获取订单列表总数(60s 本地缓存,键与分页页码无关,翻页不失效)
+     *
+     * @param countType APP/WEB 统计口径标识,两种口径结果不同不能共用缓存
+     */
+    private long getOrderListCount(InsOrdersParamVO insOrdersParam, String countType, Supplier<Long> countSupplier) {
+        if (insOrdersParam == null) {
+            return 0L;
+        }
+        String key = buildOrderListCountKey(insOrdersParam) + "|" + countType;
+        long now = System.currentTimeMillis();
+        Map<String, Long> cache = orderListCountCache;
+        if (cache != null) {
+            Long expireAt = orderListCountExpireMap.get(key);
+            Long hit = expireAt != null && now < expireAt ? cache.get(key) : null;
+            if (hit != null) {
+                return hit;
+            }
+        }
+        synchronized (InsOrdersServiceImpl.class) {
+            Long expireAt = orderListCountExpireMap != null ? orderListCountExpireMap.get(key) : null;
+            if (orderListCountCache != null && expireAt != null && now < expireAt) {
+                Long hit = orderListCountCache.get(key);
+                if (hit != null) {
+                    return hit;
+                }
+            }
+            Long count = countSupplier.get();
+            long total = count != null ? count : 0L;
+            if (orderListCountCache == null) {
+                orderListCountCache = new HashMap<>();
+                orderListCountExpireMap = new HashMap<>();
+            }
+            if (orderListCountCache.size() >= ORDER_LIST_COUNT_CACHE_LIMIT) {
+                // 先清过期项,仍超限则整体重建,防止内存膨胀
+                orderListCountExpireMap.entrySet().removeIf(e -> e.getValue() <= now);
+                if (orderListCountExpireMap.size() >= ORDER_LIST_COUNT_CACHE_LIMIT) {
+                    orderListCountCache.clear();
+                    orderListCountExpireMap.clear();
+                }
+            }
+            orderListCountCache.put(key, total);
+            orderListCountExpireMap.put(key, now + ORDER_LIST_COUNT_TTL_MILLIS);
+            return total;
+        }
+    }
+
+    /**
+     * 订单列表总数缓存 key:仅取列表 SQL 中使用到的过滤字段,不含页码/每页条数等分页字段
+     */
+    private String buildOrderListCountKey(InsOrdersParamVO p) {
+        StringBuilder sb = new StringBuilder(160);
+        append(sb, p.getJzgInfoId());
+        append(sb, p.getOrderNo());
+        append(sb, p.getParentId());
+        if (p.getParentIds() != null) {
+            sb.append("parentIds=").append(String.join(",", p.getParentIds())).append('#');
+        }
+        append(sb, p.getLicenseNo());
+        append(sb, p.getOrderStatus());
+        append(sb, p.getAdjustStatus());
+        append(sb, p.getSalesman());
+        append(sb, p.getStartDate());
+        append(sb, p.getEndDate());
+        append(sb, p.getCompanyName());
+        append(sb, p.getCompanyId());
+        append(sb, p.getProductCode());
+        append(sb, p.getProductName());
+        append(sb, p.getVinNo());
+        append(sb, p.getOwnerName());
+        append(sb, p.getOwnerMobile());
+        append(sb, p.getPolicyName());
+        append(sb, p.getPolicyMobile());
+        append(sb, p.getInsurName());
+        append(sb, p.getInsurMobile());
+        append(sb, p.getCiStartDate());
+        append(sb, p.getBiStartDate());
+        append(sb, p.getSumPremium());
+        append(sb, p.getCiPremium());
+        append(sb, p.getBiPremium());
+        append(sb, p.getNiPremium());
+        append(sb, p.getVvTax());
+        append(sb, p.getSalesmanInfo());
+        append(sb, p.getSalesmanType());
+        append(sb, p.getAgreementName());
+        append(sb, p.getDeptId());
+        append(sb, p.getDeptName());
+        append(sb, p.getPaymentLink());
+        append(sb, p.getAdjustId());
+        append(sb, p.getAdjustPremium());
+        append(sb, p.getStartSigningTime());
+        append(sb, p.getEndSigningTime());
+        append(sb, p.getStartPayTime());
+        append(sb, p.getEndPayTime());
+        append(sb, p.getIsLargeOrder());
+        append(sb, p.getSystemCode());
+        return sb.toString();
+    }
+
 
     /**
      * null-safe → BigDecimal.ZERO
@@ -1103,7 +1242,6 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
         return baseMapper.getBaseOrders(companyId, licenseNo, vinNo, productId);
     }
 
-
     /**
      * 查询车险报价订单
      *
@@ -1131,7 +1269,8 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
             long current = page.getCurrent();
             long size = page.getSize();
             long offset = (current - 1) * size;
-            long total = insOrdersMapper.countOrderListDistinct(insOrdersParam);
+            // 轻量统计(只扫主表+车牌联表做分组去重),带 60s 本地缓存,避免每次翻页重复执行大 count
+            long total = getOrderListCount(insOrdersParam, "APP", () -> insOrdersMapper.countOrderListDistinct(insOrdersParam));
             List<OrderListVo> records = insOrdersMapper.queryOrderListDistinct(insOrdersParam, offset, size);
             records.stream().forEach(record -> {
                 record.setCompanyLogo(record.getCompanyLogo() != null ? url + "/" + bucketName + "/" + record.getCompanyLogo() : null);
@@ -1149,13 +1288,23 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
             orderListVoPage = new Page<>(current, size, total);
             orderListVoPage.setRecords(records != null ? records : java.util.Collections.emptyList());
         } else {
-            // 非 APP 走原 MP 自动分页查询(queryOrderList 仅查询从订单 parent_id != '0',不查主订单)
-            orderListVoPage = insOrdersMapper.queryOrderList(insOrdersParam.getPage(), insOrdersParam);
+            // 非 APP 改手动分页(延迟关联):先只按主表 ins_orders 过滤排序取本页 id(不联展示表),再对本页数据联表补全,
+            // 规避原 MP 自动分页在 10万~100万行数据上对 ~13 张展示表 JOIN 重复执行 count + 数据查询的耗时;
+            // 同时 count 走轻量统计(不联展示表、无批改子查询)并带 60s 本地缓存。
+            Page<OrderListVo> page = insOrdersParam.getPage();
+            long current = page.getCurrent();
+            long size = page.getSize();
+            long offset = (current - 1) * size;
+            long total = getOrderListCount(insOrdersParam, "WEB", () -> insOrdersMapper.countOrderListPage(insOrdersParam));
+            List<OrderListVo> recordList = insOrdersMapper.queryOrderListPage(insOrdersParam, offset, size);
+            orderListVoPage = new Page<>(current, size, total);
+            orderListVoPage.setRecords(recordList != null ? recordList : java.util.Collections.emptyList());
         }
         // modify by lipf, 2026年4月29日11:06:02 解决业务员类型缺失的问题
         List<OrderListVo> records = orderListVoPage.getRecords();
         if (CollUtil.isNotEmpty(records)) {
-            Map<String, String> attrTypeMap = orgClient.queryAllTypeAttrMap();
+            // 全量类型映射走本地 60s 缓存,避免每个列表请求都向 organization 服务全量拉取
+            Map<String, String> attrTypeMap = getSalesmanTypeAttrMap();
             List<OrderListVo> list = records.stream().peek(action -> {
                 // 转换状态的值
                 String descByCode = InsOrderStatusEnum.getDescByCode(action.getOrderStatus());

+ 400 - 343
tenant/insurance/quotation-summary/src/main/resources/mapper/InsOrdersMapper.xml

@@ -935,24 +935,24 @@
         sys_dept sd on sd.id = suji.dept_id and sd.is_delete = 0
         left join
         ptl_agreement pa on pa.id = io.agreement_id and pa.is_delete = 0
-        left join
-        (
-        SELECT *
-        FROM (
-        SELECT t.*,
-        ROW_NUMBER() OVER(PARTITION BY t.order_no ORDER BY t.create_time DESC) AS rn
-        FROM ins_order_adjust t where t.is_delete = 0
-        ) x WHERE x.rn = 1
-        ) ioa ON io.id = ioa.order_no
-        left join
-        (
-        SELECT *
-        FROM (
-        SELECT t.*,
-        ROW_NUMBER() OVER(PARTITION BY t.order_no ORDER BY t.create_time DESC) AS rn
-        FROM ins_order_adjust t where t.status = 2 and t.is_delete = 0
-        ) x WHERE x.rn = 1
-        ) ioa1 ON io.id = ioa1.order_no
+        <!-- 优化1: 替代原 ROW_NUMBER() 获取最新一条 adjust 记录(避免每次查询对 ins_order_adjust 全表窗口扫描) -->
+        LEFT JOIN ins_order_adjust ioa
+        ON ioa.id = (
+        SELECT t.id
+        FROM ins_order_adjust t
+        WHERE t.order_no = io.id AND t.is_delete = 0
+        ORDER BY t.create_time DESC, t.id DESC
+        LIMIT 1
+        )
+        <!-- 优化2: 替代原 ROW_NUMBER() 获取 status=2 的最新一条 adjust 记录 -->
+        LEFT JOIN ins_order_adjust ioa1
+        ON ioa1.id = (
+        SELECT t.id
+        FROM ins_order_adjust t
+        WHERE t.order_no = io.id AND t.status = 2 AND t.is_delete = 0
+        ORDER BY t.create_time DESC, t.id DESC
+        LIMIT 1
+        )
         <where>
             and io.is_delete = 0 and io.parent_id != '0' and sujis.type_attr NOT IN (1,2,3,4)
             <if test="insOrdersParam.jzgInfoId != null and insOrdersParam.jzgInfoId != ''">
@@ -1075,6 +1075,336 @@
         order by io.create_time desc
     </select>
 
+    <!-- ====================================================================================================
+        手动分页性能优化(queryOrderListPage / countOrderListPage,非 APP 使用):
+        原 queryOrderList 走 MP 自动分页时,count 和数据查询都要把 ~13 张展示表 JOIN + 批改子查询在整个
+        ins_orders 集合上执行一遍(10万~100万行、无筛选翻页时尤其明显)。这里改为两阶段延迟关联:
+          1) 内层/统计:只扫主表 ins_orders(过滤条件全部改写为不依赖展示表别名的 EXISTS/IN 半连接,
+             成员链路 su-suji-sujis-sd 收敛为一个 IN 子查询),先按 create_time 索引拿到本页 id;
+          2) 外层:仅对本页 <=size 行联展示表补全展示字段,并在外层重复应用过滤条件保持与旧 SQL 相同的行语义。
+        语义说明:展示表若存在一单多行(异常数据)时新旧结果的分页边界可能略有差异,正常 1:1 数据完全一致。
+    ==================================================================================================== -->
+
+    <!-- 成员链路半连接:等价于原 LEFT JOIN sys_user/sys_user_jzg_info/sys_user_jzg_info_salesman/sys_dept
+         且 sujis.type_attr NOT IN (1,2,3,4) 的行保留语义(业务员姓名/类型、部门筛选也并入同一链路) -->
+    <sql id="orderMemberChainCond">
+        io.real_quote_user_id in (
+        select su.mobile
+        from sys_user su
+        inner join sys_user_jzg_info suji on suji.user_id = su.id and suji.system_code = #{insOrdersParam.systemCode}
+        and suji.is_delete = 0
+        inner join sys_user_jzg_info_salesman sujis on sujis.sys_user_jzg_info_id = suji.id and sujis.is_delete = 0
+        left join sys_dept sd on sd.id = suji.dept_id and sd.is_delete = 0
+        where su.is_delete = 0
+        and sujis.type_attr NOT IN (1,2,3,4)
+        <if test="insOrdersParam.salesmanInfo != null and insOrdersParam.salesmanInfo != ''">
+            and su.username = #{insOrdersParam.salesmanInfo}
+        </if>
+        <if test="insOrdersParam.salesmanType != null and insOrdersParam.salesmanType != ''">
+            and sujis.type_attr = #{insOrdersParam.salesmanType}
+        </if>
+        <if test="insOrdersParam.deptId != null and insOrdersParam.deptId != ''">
+            and sd.id = #{insOrdersParam.deptId}
+        </if>
+        <if test="insOrdersParam.deptName != null and insOrdersParam.deptName != ''">
+            and sd.name = #{insOrdersParam.deptName}
+        </if>
+        )
+    </sql>
+
+    <!-- 通用过滤条件(半连接/标量子查询形式,只依赖主表 io,不依赖任何展示表别名;
+         展示表过滤语义与原 LEFT JOIN + WHERE 相同,批改类过滤保持“取最新一条 adjust”口径) -->
+    <sql id="orderDetailFilterCond">
+        <if test="insOrdersParam.licenseNo != null and insOrdersParam.licenseNo != ''">
+            AND io.id IN (SELECT order_no FROM ins_orders_car_info WHERE license_no = #{insOrdersParam.licenseNo} AND
+            is_delete = 0)
+        </if>
+        <if test="insOrdersParam.orderStatus!= null and insOrdersParam.orderStatus!= ''">
+            AND io.order_status = #{insOrdersParam.orderStatus}
+        </if>
+        <if test="insOrdersParam.adjustStatus!= null and insOrdersParam.adjustStatus!= ''">
+            AND #{insOrdersParam.adjustStatus} = (SELECT t.status FROM ins_order_adjust t WHERE t.order_no = io.id AND
+            t.is_delete = 0 ORDER BY t.create_time DESC, t.id DESC LIMIT 1)
+        </if>
+        <if test="insOrdersParam.salesman!= null">
+            AND io.real_quote_user_id = #{insOrdersParam.salesman}
+        </if>
+        <if test="insOrdersParam.startDate != null and insOrdersParam.startDate != ''and insOrdersParam.endDate != null and insOrdersParam.endDate != ''">
+            AND io.create_time BETWEEN #{insOrdersParam.startDate} and #{insOrdersParam.endDate}
+        </if>
+        <if test="insOrdersParam.companyName != null and insOrdersParam.companyName != ''">
+            AND io.company_name = #{insOrdersParam.companyName}
+        </if>
+        <if test="insOrdersParam.companyId != null and insOrdersParam.companyId != ''">
+            AND io.company_id = #{insOrdersParam.companyId}
+        </if>
+        <if test="insOrdersParam.productCode != null and insOrdersParam.productCode != ''">
+            AND io.product_id = #{insOrdersParam.productCode}
+        </if>
+        <if test="insOrdersParam.productName != null and insOrdersParam.productName != ''">
+            AND io.product_name = #{insOrdersParam.productName}
+        </if>
+        <if test="insOrdersParam.vinNo != null and insOrdersParam.vinNo != ''">
+            AND io.id IN (SELECT order_no FROM ins_orders_car_info WHERE vin_no = #{insOrdersParam.vinNo} AND is_delete
+            = 0)
+        </if>
+        <if test="insOrdersParam.ownerName != null and insOrdersParam.ownerName != ''">
+            AND io.id IN (SELECT order_no FROM ins_orders_car_user_info WHERE policy_person_type = 1 AND name =
+            #{insOrdersParam.ownerName} AND is_delete = 0)
+        </if>
+        <if test="insOrdersParam.ownerMobile != null and insOrdersParam.ownerMobile != ''">
+            AND io.id IN (SELECT order_no FROM ins_orders_car_user_info WHERE policy_person_type = 1 AND mobile =
+            #{insOrdersParam.ownerMobile} AND is_delete = 0)
+        </if>
+        <if test="insOrdersParam.policyName != null and insOrdersParam.policyName != ''">
+            AND io.id IN (SELECT order_no FROM ins_orders_car_user_info WHERE policy_person_type = 2 AND name =
+            #{insOrdersParam.policyName} AND is_delete = 0)
+        </if>
+        <if test="insOrdersParam.policyMobile != null and insOrdersParam.policyMobile != ''">
+            AND io.id IN (SELECT order_no FROM ins_orders_car_user_info WHERE policy_person_type = 2 AND mobile =
+            #{insOrdersParam.policyMobile} AND is_delete = 0)
+        </if>
+        <if test="insOrdersParam.insurName != null and insOrdersParam.insurName != ''">
+            AND io.id IN (SELECT order_no FROM ins_orders_car_user_info WHERE policy_person_type = 3 AND name =
+            #{insOrdersParam.insurName} AND is_delete = 0)
+        </if>
+        <if test="insOrdersParam.insurMobile != null and insOrdersParam.insurMobile != ''">
+            AND io.id IN (SELECT order_no FROM ins_orders_car_user_info WHERE policy_person_type = 3 AND mobile =
+            #{insOrdersParam.insurMobile} AND is_delete = 0)
+        </if>
+        <if test="insOrdersParam.ciStartDate != null">
+            AND io.id IN (SELECT order_no FROM ins_orders_risk WHERE risk_code = '0507' AND start_date =
+            #{insOrdersParam.ciStartDate} AND is_delete = 0)
+        </if>
+        <if test="insOrdersParam.biStartDate != null">
+            AND io.id IN (SELECT order_no FROM ins_orders_risk WHERE risk_code = '0510' AND start_date =
+            #{insOrdersParam.biStartDate} AND is_delete = 0)
+        </if>
+        <if test="insOrdersParam.sumPremium != null">
+            AND io.id IN (SELECT order_no FROM ins_orders_costs WHERE sum_premium = #{insOrdersParam.sumPremium} AND
+            is_delete = 0)
+        </if>
+        <if test="insOrdersParam.ciPremium != null">
+            AND io.id IN (SELECT order_no FROM ins_orders_costs WHERE jq_premium = #{insOrdersParam.ciPremium} AND
+            is_delete = 0)
+        </if>
+        <if test="insOrdersParam.biPremium != null">
+            AND io.id IN (SELECT order_no FROM ins_orders_costs WHERE sy_premium = #{insOrdersParam.biPremium} AND
+            is_delete = 0)
+        </if>
+        <if test="insOrdersParam.niPremium != null">
+            AND io.id IN (SELECT order_no FROM ins_orders_costs WHERE jy_premium = #{insOrdersParam.niPremium} AND
+            is_delete = 0)
+        </if>
+        <if test="insOrdersParam.vvTax != null">
+            AND io.id IN (SELECT order_no FROM ins_orders_costs WHERE tax_premium = #{insOrdersParam.vvTax} AND
+            is_delete = 0)
+        </if>
+        <if test="insOrdersParam.agreementName != null and insOrdersParam.agreementName != ''">
+            AND io.agreement_id IN (SELECT id FROM ptl_agreement WHERE agreement_name = #{insOrdersParam.agreementName}
+            AND is_delete = 0)
+        </if>
+        <if test="insOrdersParam.paymentLink != null and insOrdersParam.paymentLink != ''">
+            AND io.pay_link = #{insOrdersParam.paymentLink}
+        </if>
+        <if test="insOrdersParam.adjustId != null">
+            AND #{insOrdersParam.adjustId} = (SELECT t.id FROM ins_order_adjust t WHERE t.order_no = io.id AND
+            t.is_delete = 0 ORDER BY t.create_time DESC, t.id DESC LIMIT 1)
+        </if>
+        <if test="insOrdersParam.adjustPremium != null">
+            AND #{insOrdersParam.adjustPremium} = (SELECT t.after_premium FROM ins_order_adjust t WHERE t.order_no =
+            io.id AND t.status = 2 AND t.is_delete = 0 ORDER BY t.create_time DESC, t.id DESC LIMIT 1)
+        </if>
+        <if test="insOrdersParam.startSigningTime != null and insOrdersParam.startSigningTime != ''and insOrdersParam.endSigningTime != null and insOrdersParam.endSigningTime != ''">
+            AND io.signing_time BETWEEN #{insOrdersParam.startSigningTime} and #{insOrdersParam.endSigningTime}
+        </if>
+        <if test="insOrdersParam.startPayTime != null and insOrdersParam.startPayTime != ''and insOrdersParam.endPayTime != null and insOrdersParam.endPayTime != ''">
+            AND io.pay_time BETWEEN #{insOrdersParam.startPayTime} and #{insOrdersParam.endPayTime}
+        </if>
+    </sql>
+
+    <!-- 非 APP 手工分页特有用:订单号 / 父单号(保持原 queryOrderList 过滤口径) -->
+    <sql id="orderNoParentFilterCond">
+        <if test="insOrdersParam.orderNo != null and insOrdersParam.orderNo != ''">
+            AND io.id = #{insOrdersParam.orderNo}
+        </if>
+        <if test="insOrdersParam.parentId != null and insOrdersParam.parentId != ''">
+            AND io.parent_id = #{insOrdersParam.parentId}
+        </if>
+        <if test="insOrdersParam.parentIds != null and insOrdersParam.parentIds.size() > 0">
+            AND io.parent_id IN
+            <foreach collection="insOrdersParam.parentIds" item="pid" open="(" separator="," close=")">
+                #{pid}
+            </foreach>
+        </if>
+    </sql>
+
+    <!-- 手动分页版(非 APP):两阶段延迟关联取当前页数据(先主表取 id,再联展示表) -->
+    <select id="queryOrderListPage" resultType="com.jzg.commons.entity.orders.vo.OrderListVo">
+        WITH RECURSIVE leader_tree AS (
+        SELECT ss.id, su.mobile, 1 AS depth
+        FROM sys_user_jzg_info ss
+        LEFT JOIN sys_user su ON su.id = ss.user_id AND su.is_delete = 0
+        WHERE ss.id = #{insOrdersParam.jzgInfoId}
+        AND ss.is_delete = 0
+        UNION ALL
+        SELECT t.id, su.mobile, lt.depth + 1
+        FROM sys_user_jzg_info t
+        INNER JOIN leader_tree lt ON t.leader_id = lt.id
+        LEFT JOIN sys_user su ON su.id = t.user_id AND su.is_delete = 0
+        WHERE t.is_delete = 0
+        AND lt.depth <![CDATA[ < ]]> 10
+        )
+        SELECT
+        io.id as order_no,
+        io.quote_no as no,
+        io.company_id,
+        io.company_name,
+        io.product_id as productCode,
+        io.product_name as productName,
+        io.order_status,
+        io.create_time,
+        io.create_by,
+        io.error_message,
+        io.parent_id,
+        ioci.license_no,
+        ioci.vin_no,
+        owner_u.name as owner_name,
+        owner_u.mobile as owner_mobile,
+        policy_u.name as policy_name,
+        policy_u.mobile as policy_mobile,
+        insur_u.name as insur_name,
+        insur_u.mobile as insur_mobile,
+        iorci.start_date as ci_start_date,
+        iorbi.start_date as bi_start_date,
+        iorco.sum_premium as sumPremium,
+        iorco.jq_premium as ciPremium,
+        iorco.sy_premium as biPremium,
+        iorco.jy_premium as niPremium,
+        iorco.tax_premium as vvTax,
+        su.username as recorder,
+        suji.name as salesmanInfo,
+        suji.id as jzgInfoId,
+        sujis.type_attr as salesmanType,
+        pa.agreement_name as agreementName,
+        sd.name as deptName,
+        io.pay_link as paymentLink,
+        ioa.status as adjustStatus,
+        ioa.id as adjustId,
+        ioa1.after_premium as adjustPremium
+        FROM
+        ins_orders io
+        INNER JOIN (
+        SELECT io.id AS order_id
+        FROM ins_orders io
+        <where>
+            io.is_delete = 0
+            AND io.parent_id != '0'
+            AND
+            <include refid="orderMemberChainCond"/>
+            <if test="insOrdersParam.jzgInfoId != null and insOrdersParam.jzgInfoId != ''">
+                and io.real_quote_user_id in (
+                select lt.mobile from leader_tree lt where lt.mobile is not null
+                )
+            </if>
+            <include refid="orderNoParentFilterCond"/>
+            <include refid="orderDetailFilterCond"/>
+        </where>
+        ORDER BY io.create_time DESC, io.id DESC
+        LIMIT #{offset}, #{size}
+        ) page ON page.order_id = io.id
+        LEFT JOIN ins_orders_car_info ioci ON ioci.order_no = io.id and ioci.is_delete = 0
+        LEFT JOIN
+        ins_orders_car_user_info owner_u on owner_u.order_no = io.id and owner_u.policy_person_type = 1 and
+        owner_u.is_delete = 0
+        left JOIN
+        ins_orders_car_user_info policy_u on policy_u.order_no = io.id and policy_u.policy_person_type = 2 and
+        policy_u.is_delete = 0
+        left JOIN
+        ins_orders_car_user_info insur_u on insur_u.order_no = io.id and insur_u.policy_person_type = 3 and
+        insur_u.is_delete = 0
+        left join
+        ins_orders_risk iorci on iorci.order_no = io.id and iorci.risk_code = '0507' and iorci.is_delete = 0
+        left join
+        ins_orders_risk iorbi on iorbi.order_no = io.id and iorbi.risk_code = '0510' and iorbi.is_delete = 0
+        LEFT JOIN
+        ins_orders_costs iorco on iorco.order_no = io.id and iorco.is_delete = 0
+        left join
+        sys_user su on su.mobile = io.real_quote_user_id and su.is_delete = 0
+        left join
+        sys_user_jzg_info suji on suji.user_id = su.id and suji.system_code = #{insOrdersParam.systemCode} and
+        suji.is_delete = 0
+        left join
+        sys_user_jzg_info_salesman sujis ON suji.id = sujis.sys_user_jzg_info_id AND sujis.is_delete = 0
+        left join
+        sys_dept sd on sd.id = suji.dept_id and sd.is_delete = 0
+        left join
+        ptl_agreement pa on pa.id = io.agreement_id and pa.is_delete = 0
+        LEFT JOIN ins_order_adjust ioa
+        ON ioa.id = (
+        SELECT t.id
+        FROM ins_order_adjust t
+        WHERE t.order_no = io.id AND t.is_delete = 0
+        ORDER BY t.create_time DESC, t.id DESC
+        LIMIT 1
+        )
+        LEFT JOIN ins_order_adjust ioa1
+        ON ioa1.id = (
+        SELECT t.id
+        FROM ins_order_adjust t
+        WHERE t.order_no = io.id AND t.status = 2 AND t.is_delete = 0
+        ORDER BY t.create_time DESC, t.id DESC
+        LIMIT 1
+        )
+        <where>
+            io.is_delete = 0
+            AND io.parent_id != '0'
+            AND
+            <include refid="orderMemberChainCond"/>
+            <if test="insOrdersParam.jzgInfoId != null and insOrdersParam.jzgInfoId != ''">
+                and io.real_quote_user_id in (
+                select lt.mobile from leader_tree lt where lt.mobile is not null
+                )
+            </if>
+            <include refid="orderNoParentFilterCond"/>
+            <include refid="orderDetailFilterCond"/>
+        </where>
+        ORDER BY io.create_time DESC, io.id DESC
+    </select>
+
+    <!-- 手动分页版(非 APP):轻量统计总条数(只扫主表,不联展示表、无批改窗口) -->
+    <select id="countOrderListPage" resultType="long">
+        WITH RECURSIVE leader_tree AS (
+        SELECT ss.id, su.mobile, 1 AS depth
+        FROM sys_user_jzg_info ss
+        LEFT JOIN sys_user su ON su.id = ss.user_id AND su.is_delete = 0
+        WHERE ss.id = #{insOrdersParam.jzgInfoId}
+        AND ss.is_delete = 0
+        UNION ALL
+        SELECT t.id, su.mobile, lt.depth + 1
+        FROM sys_user_jzg_info t
+        INNER JOIN leader_tree lt ON t.leader_id = lt.id
+        LEFT JOIN sys_user su ON su.id = t.user_id AND su.is_delete = 0
+        WHERE t.is_delete = 0
+        AND lt.depth <![CDATA[ < ]]> 10
+        )
+        SELECT COUNT(*)
+        FROM ins_orders io
+        <where>
+            io.is_delete = 0
+            AND io.parent_id != '0'
+            AND
+            <include refid="orderMemberChainCond"/>
+            <if test="insOrdersParam.jzgInfoId != null and insOrdersParam.jzgInfoId != ''">
+                and io.real_quote_user_id in (
+                select lt.mobile from leader_tree lt where lt.mobile is not null
+                )
+            </if>
+            <include refid="orderNoParentFilterCond"/>
+            <include refid="orderDetailFilterCond"/>
+        </where>
+    </select>
+
     <select id="queryOrderListAll" resultType="com.jzg.commons.entity.orders.vo.OrderListVo">
         SELECT
         io.id as order_no,
@@ -1419,51 +1749,9 @@
         io.create_time
         FROM
         ins_orders io
-        LEFT JOIN ins_orders_car_info ioci ON ioci.order_no = io.id and ioci.is_delete = 0
-        LEFT JOIN
-        ins_orders_car_user_info owner_u on owner_u.order_no = io.id and owner_u.policy_person_type = 1 and
-        owner_u.is_delete = 0
-        left JOIN
-        ins_orders_car_user_info policy_u on policy_u.order_no = io.id and policy_u.policy_person_type = 2 and
-        policy_u.is_delete = 0
-        left JOIN
-        ins_orders_car_user_info insur_u on insur_u.order_no = io.id and insur_u.policy_person_type = 3 and
-        insur_u.is_delete = 0
-        left join
-        ins_orders_risk iorci on iorci.order_no = io.id and iorci.risk_code = '0507' and iorci.is_delete = 0
-        left join
-        ins_orders_risk iorbi on iorbi.order_no = io.id and iorbi.risk_code = '0510' and iorbi.is_delete = 0
-        LEFT JOIN
-        ins_orders_costs iorco on iorco.order_no = io.id and iorco.is_delete = 0
-        left join
-        sys_user su on su.mobile = io.real_quote_user_id and su.is_delete = 0
-        left join
-        sys_user_jzg_info suji on suji.user_id = su.id and suji.system_code = #{insOrdersParam.systemCode} and
-        suji.is_delete = 0
-        left join
-        sys_user_jzg_info_salesman sujis ON suji.id = sujis.sys_user_jzg_info_id AND sujis.is_delete = 0
-        left join
-        sys_dept sd on sd.id = suji.dept_id and sd.is_delete = 0
-        left join
-        ptl_agreement pa on pa.id = io.agreement_id and pa.is_delete = 0
-        left join
-        (
-        SELECT *
-        FROM (
-        SELECT t.*,
-        ROW_NUMBER() OVER(PARTITION BY t.order_no ORDER BY t.create_time DESC) AS rn
-        FROM ins_order_adjust t where t.is_delete = 0
-        ) x WHERE x.rn = 1
-        ) ioa ON io.id = ioa.order_no
-        left join
-        (
-        SELECT *
-        FROM (
-        SELECT t.*,
-        ROW_NUMBER() OVER(PARTITION BY t.order_no ORDER BY t.create_time DESC) AS rn
-        FROM ins_order_adjust t where t.status = 2 and t.is_delete = 0
-        ) x WHERE x.rn = 1
-        ) ioa1 ON io.id = ioa1.order_no
+        <!-- 性能优化:dedup 内层不再联任何展示表(此前 ~13 张 LEFT JOIN + 批改相关子查询在全量集合上执行后才排序 LIMIT),
+             过滤条件改写为只依赖主表 io 的半连接/标量子查询(见 orderDetailFilterCond),
+             使“无筛选翻页”场景退化为 ins_orders 单表 create_time 索引有序扫描 -->
         <where>
             and io.is_delete = 0
             <choose>
@@ -1474,7 +1762,8 @@
                     and io.parent_id != '0'
                 </otherwise>
             </choose>
-            and sujis.type_attr NOT IN (1,2,3,4)
+            AND
+            <include refid="orderMemberChainCond"/>
             <if test="insOrdersParam.jzgInfoId != null and insOrdersParam.jzgInfoId != ''">
                 and io.real_quote_user_id in (select bbb.mobile from sys_user bbb where bbb.id in ( select ss.user_id
                 from sys_user_jzg_info ss where 1 =1 and (ss.leader_id = #{insOrdersParam.jzgInfoId} or ss.id
@@ -1483,105 +1772,7 @@
             <if test="insOrdersParam.orderNo != null and insOrdersParam.orderNo != ''">
                 AND io.id = #{insOrdersParam.orderNo}
             </if>
-            <if test="insOrdersParam.licenseNo != null and insOrdersParam.licenseNo != ''">
-                AND ioci.license_no = #{insOrdersParam.licenseNo}
-            </if>
-            <if test="insOrdersParam.orderStatus!= null and insOrdersParam.orderStatus!= ''">
-                AND io.order_status = #{insOrdersParam.orderStatus}
-            </if>
-            <if test="insOrdersParam.adjustStatus!= null and insOrdersParam.adjustStatus!= ''">
-                AND ioa.status = #{insOrdersParam.adjustStatus}
-            </if>
-            <if test="insOrdersParam.salesman!= null">
-                AND io.real_quote_user_id = #{insOrdersParam.salesman}
-            </if>
-            <if test="insOrdersParam.companyId != null and insOrdersParam.companyId != ''">
-                AND io.company_id = #{insOrdersParam.companyId}
-            </if>
-            <if test="insOrdersParam.startDate != null and insOrdersParam.startDate != ''and insOrdersParam.endDate != null and insOrdersParam.endDate != ''">
-                AND io.create_time BETWEEN #{insOrdersParam.startDate} and #{insOrdersParam.endDate}
-            </if>
-            <if test="insOrdersParam.companyName != null and insOrdersParam.companyName != ''">
-                AND io.company_name = #{insOrdersParam.companyName}
-            </if>
-            <if test="insOrdersParam.productCode != null and insOrdersParam.productCode != ''">
-                AND io.product_id = #{insOrdersParam.productCode}
-            </if>
-            <if test="insOrdersParam.productName != null and insOrdersParam.productName != ''">
-                AND io.product_name = #{insOrdersParam.productName}
-            </if>
-            <if test="insOrdersParam.vinNo != null and insOrdersParam.vinNo != ''">
-                AND ioci.vin_no = #{insOrdersParam.vinNo}
-            </if>
-            <if test="insOrdersParam.ownerName != null and insOrdersParam.ownerName != ''">
-                AND owner_u.name = #{insOrdersParam.ownerName}
-            </if>
-            <if test="insOrdersParam.ownerMobile != null and insOrdersParam.ownerMobile != ''">
-                AND owner_u.mobile = #{insOrdersParam.ownerMobile}
-            </if>
-            <if test="insOrdersParam.policyName != null and insOrdersParam.policyName != ''">
-                AND policy_u.name = #{insOrdersParam.policyName}
-            </if>
-            <if test="insOrdersParam.policyMobile != null and insOrdersParam.policyMobile != ''">
-                AND policy_u.mobile = #{insOrdersParam.policyMobile}
-            </if>
-            <if test="insOrdersParam.insurName != null and insOrdersParam.insurName != ''">
-                AND insur_u.name = #{insOrdersParam.insurName}
-            </if>
-            <if test="insOrdersParam.insurMobile != null and insOrdersParam.insurMobile != ''">
-                AND insur_u.mobile = #{insOrdersParam.insurMobile}
-            </if>
-            <if test="insOrdersParam.ciStartDate != null">
-                AND iorci.start_date = #{insOrdersParam.ciStartDate}
-            </if>
-            <if test="insOrdersParam.biStartDate != null">
-                AND iorbi.start_date = #{insOrdersParam.biStartDate}
-            </if>
-            <if test="insOrdersParam.sumPremium != null">
-                AND iorco.sum_premium = #{insOrdersParam.sumPremium}
-            </if>
-            <if test="insOrdersParam.ciPremium != null">
-                AND iorco.jq_premium = #{insOrdersParam.ciPremium}
-            </if>
-            <if test="insOrdersParam.biPremium != null">
-                AND iorco.sy_premium = #{insOrdersParam.biPremium}
-            </if>
-            <if test="insOrdersParam.niPremium != null">
-                AND iorco.jy_premium = #{insOrdersParam.niPremium}
-            </if>
-            <if test="insOrdersParam.vvTax != null">
-                AND iorco.tax_premium = #{insOrdersParam.vvTax}
-            </if>
-            <if test="insOrdersParam.salesmanInfo != null and insOrdersParam.salesmanInfo != ''">
-                AND su.username = #{insOrdersParam.salesmanInfo}
-            </if>
-            <if test="insOrdersParam.salesmanType != null and insOrdersParam.salesmanType != ''">
-                AND sujis.type_attr = #{insOrdersParam.salesmanType}
-            </if>
-            <if test="insOrdersParam.agreementName != null and insOrdersParam.agreementName != ''">
-                AND pa.agreement_name = #{insOrdersParam.agreementName}
-            </if>
-            <if test="insOrdersParam.deptId != null and insOrdersParam.deptId != ''">
-                AND sd.id = #{insOrdersParam.deptId}
-            </if>
-            <if test="insOrdersParam.deptName != null and insOrdersParam.deptName != ''">
-                AND sd.name = #{insOrdersParam.deptName}
-            </if>
-            <if test="insOrdersParam.paymentLink != null and insOrdersParam.paymentLink != ''">
-                AND io.pay_link = #{insOrdersParam.paymentLink}
-            </if>
-            <if test="insOrdersParam.adjustId != null">
-                AND ioa.id = #{insOrdersParam.adjustId}
-            </if>
-            <if test="insOrdersParam.adjustPremium != null">
-                AND ioa1.after_premium = #{insOrdersParam.adjustPremium}
-            </if>
-            <if test="insOrdersParam.startSigningTime != null and insOrdersParam.startSigningTime != ''and insOrdersParam.endSigningTime != null and insOrdersParam.endSigningTime != ''">
-                AND io.signing_time BETWEEN #{insOrdersParam.startSigningTime} and #{insOrdersParam.endSigningTime}
-            </if>
-            <if test="insOrdersParam.startPayTime != null and insOrdersParam.startPayTime != ''and insOrdersParam.endPayTime != null and insOrdersParam.endPayTime != ''">
-                AND io.pay_time BETWEEN #{insOrdersParam.startPayTime} and #{insOrdersParam.endPayTime}
-            </if>
+            <include refid="orderDetailFilterCond"/>
         </where>
         ) dedup
         ORDER BY dedup.create_time DESC
@@ -1617,77 +1808,40 @@
         sys_dept sd on sd.id = suji.dept_id and sd.is_delete = 0
         left join
         ptl_agreement pa on pa.id = io.agreement_id and pa.is_delete = 0
-        left join
-        (
-        SELECT *
-        FROM (
-        SELECT t.*,
-        ROW_NUMBER() OVER(PARTITION BY t.order_no ORDER BY t.create_time DESC) AS rn
-        FROM ins_order_adjust t where t.is_delete = 0
-        ) x WHERE x.rn = 1
-        ) ioa ON io.id = ioa.order_no
-        left join
-        (
-        SELECT *
-        FROM (
-        SELECT t.*,
-        ROW_NUMBER() OVER(PARTITION BY t.order_no ORDER BY t.create_time DESC) AS rn
-        FROM ins_order_adjust t where t.status = 2 and t.is_delete = 0
-        ) x WHERE x.rn = 1
-        ) ioa1 ON io.id = ioa1.order_no
+        <!-- 优化1: 替代原 ROW_NUMBER() 获取最新一条 adjust 记录(避免每次查询对 ins_order_adjust 全表窗口扫描) -->
+        LEFT JOIN ins_order_adjust ioa
+        ON ioa.id = (
+        SELECT t.id
+        FROM ins_order_adjust t
+        WHERE t.order_no = io.id AND t.is_delete = 0
+        ORDER BY t.create_time DESC, t.id DESC
+        LIMIT 1
+        )
+        <!-- 优化2: 替代原 ROW_NUMBER() 获取 status=2 的最新一条 adjust 记录 -->
+        LEFT JOIN ins_order_adjust ioa1
+        ON ioa1.id = (
+        SELECT t.id
+        FROM ins_order_adjust t
+        WHERE t.order_no = io.id AND t.status = 2 AND t.is_delete = 0
+        ORDER BY t.create_time DESC, t.id DESC
+        LIMIT 1
+        )
         order by io.create_time desc) tt
         where tt.rn = 1
     </select>
 
-    <!-- 手动分页版:统计按车牌+状态分组去重后的总条数 -->
+    <!-- 手动分页版:统计按车牌+状态分组去重后的总条数(性能优化版)
+         等价性:原实现 ROW_NUMBER() OVER(PARTITION BY COALESCE(license_no,id),order_status) + rn=1 的计数
+         == 按相同分组键去重后的分组数;展示表(人员/险种/费用/批改等)JOIN 引入的行重复不会改变分组数,
+         因此这里只保留车牌联表 ioci,其余展示表联接全部去掉,过滤条件收敛为只依赖主表的半连接 -->
     <select id="countOrderListDistinct" resultType="java.lang.Long">
         SELECT COUNT(*) FROM (
             SELECT
-                io.id AS order_id,
-                ROW_NUMBER() OVER(PARTITION BY COALESCE(ioci.license_no, io.id), io.order_status ORDER BY io.create_time DESC) AS rn
+        COALESCE(ioci.license_no, io.id) AS license_key,
+        io.order_status
             FROM
             ins_orders io
             LEFT JOIN ins_orders_car_info ioci ON ioci.order_no = io.id and ioci.is_delete = 0
-            LEFT JOIN
-            ins_orders_car_user_info owner_u on owner_u.order_no = io.id and owner_u.policy_person_type = 1 and owner_u.is_delete = 0
-            left JOIN
-            ins_orders_car_user_info policy_u on policy_u.order_no = io.id and policy_u.policy_person_type = 2 and policy_u.is_delete = 0
-            left JOIN
-            ins_orders_car_user_info insur_u on insur_u.order_no = io.id and insur_u.policy_person_type = 3 and insur_u.is_delete = 0
-            left join
-            ins_orders_risk iorci on iorci.order_no = io.id and iorci.risk_code = '0507' and iorci.is_delete = 0
-            left join
-            ins_orders_risk iorbi on iorbi.order_no = io.id and iorbi.risk_code = '0510' and iorbi.is_delete = 0
-            LEFT JOIN
-            ins_orders_costs iorco on iorco.order_no = io.id and iorco.is_delete = 0
-            left join
-            sys_user su on su.mobile = io.real_quote_user_id and su.is_delete = 0
-            left join
-            sys_user_jzg_info suji on suji.user_id = su.id and suji.system_code = #{insOrdersParam.systemCode} and suji.is_delete = 0
-        left join
-        sys_user_jzg_info_salesman sujis ON suji.id = sujis.sys_user_jzg_info_id AND sujis.is_delete = 0
-            left join
-            sys_dept sd on sd.id = suji.dept_id and sd.is_delete = 0
-            left join
-            ptl_agreement pa on pa.id = io.agreement_id and pa.is_delete = 0
-            left join
-            (
-            SELECT *
-            FROM (
-            SELECT t.*,
-            ROW_NUMBER() OVER(PARTITION BY t.order_no ORDER BY t.create_time DESC) AS rn
-            FROM ins_order_adjust t where t.is_delete = 0
-            ) x WHERE x.rn = 1
-            ) ioa ON io.id = ioa.order_no
-            left join
-            (
-            SELECT *
-            FROM (
-            SELECT t.*,
-            ROW_NUMBER() OVER(PARTITION BY t.order_no ORDER BY t.create_time DESC) AS rn
-            FROM ins_order_adjust t where t.status = 2 and t.is_delete = 0
-            ) x WHERE x.rn = 1
-            ) ioa1 ON io.id = ioa1.order_no
             <where>
                 and io.is_delete = 0
                 <choose>
@@ -1698,7 +1852,8 @@
                         and io.parent_id != '0'
                     </otherwise>
                 </choose>
-                and sujis.type_attr NOT IN (1,2,3,4)
+                AND
+                <include refid="orderMemberChainCond"/>
                 <if test="insOrdersParam.jzgInfoId != null and insOrdersParam.jzgInfoId != ''">
                     and io.real_quote_user_id in (select bbb.mobile from sys_user bbb where bbb.id in ( select ss.user_id
                     from sys_user_jzg_info ss where 1 =1 and (ss.leader_id = #{insOrdersParam.jzgInfoId} or ss.id
@@ -1707,108 +1862,10 @@
                 <if test="insOrdersParam.orderNo != null and insOrdersParam.orderNo != ''">
                     AND io.id = #{insOrdersParam.orderNo}
                 </if>
-                <if test="insOrdersParam.licenseNo != null and insOrdersParam.licenseNo != ''">
-                    AND ioci.license_no = #{insOrdersParam.licenseNo}
-                </if>
-                <if test="insOrdersParam.orderStatus!= null and insOrdersParam.orderStatus!= ''">
-                    AND io.order_status = #{insOrdersParam.orderStatus}
-                </if>
-                <if test="insOrdersParam.adjustStatus!= null and insOrdersParam.adjustStatus!= ''">
-                    AND ioa.status = #{insOrdersParam.adjustStatus}
-                </if>
-                <if test="insOrdersParam.salesman!= null">
-                    AND io.real_quote_user_id = #{insOrdersParam.salesman}
-                </if>
-                <if test="insOrdersParam.companyId != null and insOrdersParam.companyId != ''">
-                    AND io.company_id = #{insOrdersParam.companyId}
-                </if>
-                <if test="insOrdersParam.startDate != null and insOrdersParam.startDate != ''and insOrdersParam.endDate != null and insOrdersParam.endDate != ''">
-                    AND io.create_time BETWEEN #{insOrdersParam.startDate} and #{insOrdersParam.endDate}
-                </if>
-                <if test="insOrdersParam.companyName != null and insOrdersParam.companyName != ''">
-                    AND io.company_name = #{insOrdersParam.companyName}
-                </if>
-                <if test="insOrdersParam.productCode != null and insOrdersParam.productCode != ''">
-                    AND io.product_id = #{insOrdersParam.productCode}
-                </if>
-                <if test="insOrdersParam.productName != null and insOrdersParam.productName != ''">
-                    AND io.product_name = #{insOrdersParam.productName}
-                </if>
-                <if test="insOrdersParam.vinNo != null and insOrdersParam.vinNo != ''">
-                    AND ioci.vin_no = #{insOrdersParam.vinNo}
-                </if>
-                <if test="insOrdersParam.ownerName != null and insOrdersParam.ownerName != ''">
-                    AND owner_u.name = #{insOrdersParam.ownerName}
-                </if>
-                <if test="insOrdersParam.ownerMobile != null and insOrdersParam.ownerMobile != ''">
-                    AND owner_u.mobile = #{insOrdersParam.ownerMobile}
-                </if>
-                <if test="insOrdersParam.policyName != null and insOrdersParam.policyName != ''">
-                    AND policy_u.name = #{insOrdersParam.policyName}
-                </if>
-                <if test="insOrdersParam.policyMobile != null and insOrdersParam.policyMobile != ''">
-                    AND policy_u.mobile = #{insOrdersParam.policyMobile}
-                </if>
-                <if test="insOrdersParam.insurName != null and insOrdersParam.insurName != ''">
-                    AND insur_u.name = #{insOrdersParam.insurName}
-                </if>
-                <if test="insOrdersParam.insurMobile != null and insOrdersParam.insurMobile != ''">
-                    AND insur_u.mobile = #{insOrdersParam.insurMobile}
-                </if>
-                <if test="insOrdersParam.ciStartDate != null">
-                    AND iorci.start_date = #{insOrdersParam.ciStartDate}
-                </if>
-                <if test="insOrdersParam.biStartDate != null">
-                    AND iorbi.start_date = #{insOrdersParam.biStartDate}
-                </if>
-                <if test="insOrdersParam.sumPremium != null">
-                    AND iorco.sum_premium = #{insOrdersParam.sumPremium}
-                </if>
-                <if test="insOrdersParam.ciPremium != null">
-                    AND iorco.jq_premium = #{insOrdersParam.ciPremium}
-                </if>
-                <if test="insOrdersParam.biPremium != null">
-                    AND iorco.sy_premium = #{insOrdersParam.biPremium}
-                </if>
-                <if test="insOrdersParam.niPremium != null">
-                    AND iorco.jy_premium = #{insOrdersParam.niPremium}
-                </if>
-                <if test="insOrdersParam.vvTax != null">
-                    AND iorco.tax_premium = #{insOrdersParam.vvTax}
-                </if>
-                <if test="insOrdersParam.salesmanInfo != null and insOrdersParam.salesmanInfo != ''">
-                    AND su.username = #{insOrdersParam.salesmanInfo}
-                </if>
-                <if test="insOrdersParam.salesmanType != null and insOrdersParam.salesmanType != ''">
-                    AND sujis.type_attr = #{insOrdersParam.salesmanType}
-                </if>
-                <if test="insOrdersParam.agreementName != null and insOrdersParam.agreementName != ''">
-                    AND pa.agreement_name = #{insOrdersParam.agreementName}
-                </if>
-                <if test="insOrdersParam.deptId != null and insOrdersParam.deptId != ''">
-                    AND sd.id = #{insOrdersParam.deptId}
-                </if>
-                <if test="insOrdersParam.deptName != null and insOrdersParam.deptName != ''">
-                    AND sd.name = #{insOrdersParam.deptName}
-                </if>
-                <if test="insOrdersParam.paymentLink != null and insOrdersParam.paymentLink != ''">
-                    AND io.pay_link = #{insOrdersParam.paymentLink}
-                </if>
-                <if test="insOrdersParam.adjustId != null">
-                    AND ioa.id = #{insOrdersParam.adjustId}
-                </if>
-                <if test="insOrdersParam.adjustPremium != null">
-                    AND ioa1.after_premium = #{insOrdersParam.adjustPremium}
-                </if>
-                <if test="insOrdersParam.startSigningTime != null and insOrdersParam.startSigningTime != ''and insOrdersParam.endSigningTime != null and insOrdersParam.endSigningTime != ''">
-                    AND io.signing_time BETWEEN #{insOrdersParam.startSigningTime} and #{insOrdersParam.endSigningTime}
-                </if>
-                <if test="insOrdersParam.startPayTime != null and insOrdersParam.startPayTime != ''and insOrdersParam.endPayTime != null and insOrdersParam.endPayTime != ''">
-                    AND io.pay_time BETWEEN #{insOrdersParam.startPayTime} and #{insOrdersParam.endPayTime}
-                </if>
+                <include refid="orderDetailFilterCond"/>
             </where>
+        GROUP BY COALESCE(ioci.license_no, io.id), io.order_status
         ) dedup
-        WHERE dedup.rn = 1
     </select>
 
     <!-- 根据主订单id集合查询其下的从订单(联表,不分页) -->
@@ -1879,24 +1936,24 @@
         sys_dept sd on sd.id = suji.dept_id and sd.is_delete = 0
         left join
         ptl_agreement pa on pa.id = io.agreement_id and pa.is_delete = 0
-        left join
-        (
-        SELECT *
-        FROM (
-        SELECT t.*,
-        ROW_NUMBER() OVER(PARTITION BY t.order_no ORDER BY t.create_time DESC) AS rn
-        FROM ins_order_adjust t where t.is_delete = 0
-        ) x WHERE x.rn = 1
-        ) ioa ON io.id = ioa.order_no
-        left join
-        (
-        SELECT *
-        FROM (
-        SELECT t.*,
-        ROW_NUMBER() OVER(PARTITION BY t.order_no ORDER BY t.create_time DESC) AS rn
-        FROM ins_order_adjust t where t.status = 2 and t.is_delete = 0
-        ) x WHERE x.rn = 1
-        ) ioa1 ON io.id = ioa1.order_no
+        <!-- 优化1: 替代原 ROW_NUMBER() 获取最新一条 adjust 记录(避免每次查询对 ins_order_adjust 全表窗口扫描) -->
+        LEFT JOIN ins_order_adjust ioa
+        ON ioa.id = (
+        SELECT t.id
+        FROM ins_order_adjust t
+        WHERE t.order_no = io.id AND t.is_delete = 0
+        ORDER BY t.create_time DESC, t.id DESC
+        LIMIT 1
+        )
+        <!-- 优化2: 替代原 ROW_NUMBER() 获取 status=2 的最新一条 adjust 记录 -->
+        LEFT JOIN ins_order_adjust ioa1
+        ON ioa1.id = (
+        SELECT t.id
+        FROM ins_order_adjust t
+        WHERE t.order_no = io.id AND t.status = 2 AND t.is_delete = 0
+        ORDER BY t.create_time DESC, t.id DESC
+        LIMIT 1
+        )
         <where>
             and io.is_delete = 0 and io.parent_id in
             <foreach collection="parentIds" item="pid" open="(" separator="," close=")">