优化订单列表,多单号查询,支持几万单号查询
This commit is contained in:
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user