优化订单列表,多单号查询,支持几万单号查询

This commit is contained in:
luojiaquan
2026-10-16 09:22:13 +08:00
parent 0a7f639138
commit 02481b102c
10 changed files with 655 additions and 32 deletions
@@ -45,7 +45,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
) WHERE ROWNUM <= 1
</select>
<sql id="tabOrderMonitorWhere">
<!-- 除大批量单号外的所有过滤条件(大批量单号走分批收集 selectMatchedOrderKeys) -->
<sql id="tabOrderFilterWhere">
o.BL_PICKUP = 1
AND o.ORDER_STATUS IN (3, 4, 5, 6, 7, 8, 11)
<if test="query.customerCodes != null and query.customerCodes.size() > 0">
@@ -69,6 +70,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="query.transferOrderId != null and query.transferOrderId != ''">
AND o.TRANSFER_ORDER_ID = #{query.transferOrderId}
</if>
</sql>
<!--
小批量单号(产品检测等入口,调用方保证不超过 Oracle IN 列表上限 1000)。
列表主流程的大批量单号请用 selectMatchedOrderKeys 分批收集。
-->
<sql id="tabOrderIdentifierWhere">
<if test="query.orderIdentifiers != null and query.orderIdentifiers.size() > 0">
AND (
o.ORDER_ID IN
@@ -76,18 +84,24 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
#{oid}
</foreach>
OR o.ORG_ORDER_ID IN
<foreach collection="query.orderIdentifiers" item="oid" open="(" separator="," close=")">
#{oid}
<foreach collection="query.orderIdentifiers" item="oid2" open="(" separator="," close=")">
#{oid2}
</foreach>
OR o.TRANSFER_ORDER_ID IN
<foreach collection="query.orderIdentifiers" item="oid" open="(" separator="," close=")">
#{oid}
<foreach collection="query.orderIdentifiers" item="oid3" open="(" separator="," close=")">
#{oid3}
</foreach>
)
</if>
</sql>
<sql id="tabOrderMonitorWhere">
<include refid="tabOrderFilterWhere"/>
<include refid="tabOrderIdentifierWhere"/>
</sql>
<sql id="tabOrderMonitorColumns">
o.ID,
o.ORDER_ID,
o.ORG_ORDER_ID,
o.TRANSFER_ORDER_ID,
@@ -159,4 +173,51 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
ORDER BY o.PICKUP_DATE DESC, o.ORDER_ID DESC
</select>
<!--
大批量单号分批收集:每批最多 900 个(避开 Oracle IN 1000 上限)。
用 UNION ALL 三段分别匹配三列(比三列 OR 快约 2 倍:不依赖优化器 OR-expansion,
ORDER_ID/ORG_ORDER_ID/TRANSFER_ORDER_ID 各走自己的索引);重复 ID 由 Java 侧去重。
-->
<select id="selectMatchedOrderKeys" resultType="java.util.HashMap">
SELECT * FROM (
SELECT o.ID AS ID, o.PICKUP_DATE AS PICKUP_DATE
FROM ${orderTable} o
WHERE
<include refid="tabOrderFilterWhere"/>
AND o.ORDER_ID IN
<foreach collection="batch" item="bid1" open="(" separator="," close=")">
#{bid1}
</foreach>
UNION ALL
SELECT o.ID AS ID, o.PICKUP_DATE AS PICKUP_DATE
FROM ${orderTable} o
WHERE
<include refid="tabOrderFilterWhere"/>
AND o.ORG_ORDER_ID IN
<foreach collection="batch" item="bid2" open="(" separator="," close=")">
#{bid2}
</foreach>
UNION ALL
SELECT o.ID AS ID, o.PICKUP_DATE AS PICKUP_DATE
FROM ${orderTable} o
WHERE
<include refid="tabOrderFilterWhere"/>
AND o.TRANSFER_ORDER_ID IN
<foreach collection="batch" item="bid3" open="(" separator="," close=")">
#{bid3}
</foreach>
)
</select>
<!-- 内存分页切片后的主键回查(一批最多一个页大小,远低于 IN 上限) -->
<select id="selectTabOrderMonitorByIds" resultType="java.util.HashMap">
SELECT
<include refid="tabOrderMonitorColumns"/>
FROM ${orderTable} o
WHERE o.ID IN
<foreach collection="ids" item="mid" open="(" separator="," close=")">
#{mid}
</foreach>
</select>
</mapper>