Files
BMS/bms-back/bms-system/src/main/resources/mapper/price/OracleUpstreamOrderMapper.xml
T
2026-10-23 13:47:41 +08:00

296 lines
11 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bms.price.mapper.OracleUpstreamOrderMapper">
<!--
Exact-match lookups only (no multi-column OR).
Nested ROWNUM form helps Oracle use indexes on large TAB_ORDER.
-->
<select id="selectByTransferNo" resultType="java.util.HashMap">
SELECT * FROM (
SELECT * FROM ${orderTable} WHERE TRANSFER_ORDER_ID = #{transferNo}
) WHERE ROWNUM &lt;= 1
</select>
<select id="selectByOrderId" resultType="java.util.HashMap">
SELECT * FROM (
SELECT * FROM ${orderTable} WHERE ORDER_ID = #{orderNo}
) WHERE ROWNUM &lt;= 1
</select>
<select id="selectByOrgOrderId" resultType="java.util.HashMap">
SELECT * FROM (
SELECT * FROM ${orderTable} WHERE ORG_ORDER_ID = #{orderNo}
) WHERE ROWNUM &lt;= 1
</select>
<select id="selectByTrackId" resultType="java.util.HashMap">
SELECT * FROM (
SELECT * FROM ${orderTable} WHERE TRACK_ID = #{trackingNo}
) WHERE ROWNUM &lt;= 1
</select>
<select id="selectByBarcode" resultType="java.util.HashMap">
SELECT * FROM (
SELECT * FROM ${orderTable} WHERE BARCODE_NUMBER = #{trackingNo}
) WHERE ROWNUM &lt;= 1
</select>
<select id="selectByCustomerTrackId" resultType="java.util.HashMap">
SELECT * FROM (
SELECT * FROM ${orderTable} WHERE CUSTOMER_TRACK_ID = #{trackingNo}
) WHERE ROWNUM &lt;= 1
</select>
<!-- 除大批量单号外的所有过滤条件(大批量单号走分批收集 selectMatchedOrderKeys) -->
<!-- Customer + pickup first so CBO can use those indexes on month-range queries. -->
<sql id="tabOrderFilterWhere">
<if test="query.customerCodes != null and query.customerCodes.size() > 0">
o.CUSTOMER_CODE IN
<foreach collection="query.customerCodes" item="code" open="(" separator="," close=")">
#{code}
</foreach>
</if>
<if test="query.customerCodes == null or query.customerCodes.size() == 0">
1 = 1
</if>
<if test="query.beginTime != null and query.beginTime != ''">
<!-- PICKUP_DATE 是 DATE 列:必须用 TO_DATE 比较;TO_TIMESTAMP 会触发
INTERNAL_FUNCTION(列) 使 (CUSTOMER_CODE, PICKUP_DATE) 复合索引失效,
客户+提货时间查询从 1s 恶化到 200s+ -->
AND o.PICKUP_DATE &gt;= TO_DATE(#{query.beginTime}, 'YYYY-MM-DD HH24:MI:SS')
</if>
<if test="query.endTime != null and query.endTime != ''">
AND o.PICKUP_DATE &lt;= TO_DATE(#{query.endTime}, 'YYYY-MM-DD HH24:MI:SS')
</if>
AND o.BL_PICKUP = 1
<if test="query.orderStatuses != null and query.orderStatuses.size() > 0">
AND o.ORDER_STATUS IN
<foreach collection="query.orderStatuses" item="st" open="(" separator="," close=")">
#{st}
</foreach>
</if>
<if test="query.orderStatuses == null or query.orderStatuses.size() == 0">
AND o.ORDER_STATUS IN (3, 4, 5, 6, 7, 8, 11)
</if>
<if test="query.orderId != null and query.orderId != ''">
AND o.ORDER_ID = #{query.orderId}
</if>
<if test="query.orgOrderId != null and query.orgOrderId != ''">
AND o.ORG_ORDER_ID = #{query.orgOrderId}
</if>
<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
<foreach collection="query.orderIdentifiers" item="oid" open="(" separator="," close=")">
#{oid}
</foreach>
OR o.ORG_ORDER_ID IN
<foreach collection="query.orderIdentifiers" item="oid2" open="(" separator="," close=")">
#{oid2}
</foreach>
OR o.TRANSFER_ORDER_ID IN
<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,
o.TRACK_ID,
o.CUSTOMER_CODE,
o.CUSTOMER_NAME,
o.PRODUCT_CODE,
o.PRODUCT_NAME,
o.PRODUCT_FLOOR_CODE,
o.COUNTRY,
o.COUNTRY_NAME,
o.CONSIGNEE_POSTCODE,
o.DIMENSIONAL_WEIGHT_FACTOR,
o.VOLUME_WEIGHT,
o.WEIGHT,
o.ORDER_STATUS,
o.PICKUP_DATE
</sql>
<select id="countTabOrderMonitor" resultType="long">
SELECT COUNT(1)
FROM ${orderTable} o
WHERE
<include refid="tabOrderMonitorWhere"/>
</select>
<!--
Month-range list: sort only narrow keys, then Java loads display/full rows by ID.
Avoids ORDER BY on o.* which gets very slow when pickup window is ~1 month.
TO_DATE 比较(勿改回 TO_TIMESTAMP):索引可 sargable 走 (CUSTOMER_CODE, PICKUP_DATE) 复合索引。
-->
<select id="selectTabOrderMonitorKeyPage" resultType="java.util.HashMap">
SELECT ID FROM (
SELECT inner_q.ID AS ID, ROWNUM AS rn FROM (
SELECT o.ID, o.PICKUP_DATE, o.ORDER_ID
FROM ${orderTable} o
WHERE
<include refid="tabOrderMonitorWhere"/>
ORDER BY o.PICKUP_DATE DESC, o.ORDER_ID DESC
) inner_q
WHERE ROWNUM &lt;= #{endRow}
)
WHERE rn &gt; #{startRow}
</select>
<!--
订单比对专用 SQL(异步分页):仅返回转单号,
筛选与列表相同;排除空转单号。
-->
<select id="selectTabOrderCompareKeyPage" resultType="java.util.HashMap">
SELECT TRANSFER_ORDER_ID FROM (
SELECT inner_q.TRANSFER_ORDER_ID AS TRANSFER_ORDER_ID, ROWNUM AS rn
FROM (
SELECT o.TRANSFER_ORDER_ID, o.PICKUP_DATE, o.ORDER_ID
FROM ${orderTable} o
WHERE
<include refid="tabOrderMonitorWhere"/>
AND o.TRANSFER_ORDER_ID IS NOT NULL
ORDER BY o.PICKUP_DATE DESC, o.ORDER_ID DESC
) inner_q
WHERE ROWNUM &lt;= #{endRow}
)
WHERE rn &gt; #{startRow}
</select>
<!-- List detail by primary keys (display columns only). -->
<select id="selectTabOrderMonitorListByIds" 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>
<!-- Distinct LINE_CODE under the same filters (product check; alias keeps Java keys stable). -->
<select id="selectTabOrderProductCodes" resultType="java.util.HashMap">
SELECT o.CUSTOMER_CODE AS CUSTOMER_CODE,
o.LINE_CODE AS PRODUCT_CODE,
MAX(o.LINE_NAME) AS PRODUCT_NAME,
COUNT(1) AS ORDER_COUNT
FROM ${orderTable} o
WHERE
<include refid="tabOrderMonitorWhere"/>
AND o.LINE_CODE IS NOT NULL
GROUP BY o.CUSTOMER_CODE, o.LINE_CODE
ORDER BY o.CUSTOMER_CODE, o.LINE_CODE
</select>
<!-- Order numbers for one upstream LINE_CODE under the same filters. -->
<select id="selectTabOrderIdsByProduct" resultType="java.util.HashMap">
SELECT o.ORDER_ID AS ORDER_ID,
o.ORG_ORDER_ID AS ORG_ORDER_ID,
o.TRANSFER_ORDER_ID AS TRANSFER_ORDER_ID,
o.CUSTOMER_CODE AS CUSTOMER_CODE,
o.LINE_CODE AS PRODUCT_CODE,
o.LINE_NAME AS PRODUCT_NAME,
o.PICKUP_DATE AS PICKUP_DATE
FROM ${orderTable} o
WHERE
<include refid="tabOrderMonitorWhere"/>
AND o.LINE_CODE = #{query.productCode}
ORDER BY o.PICKUP_DATE DESC, o.ORDER_ID DESC
</select>
<!--
大批量单号分批收集:每批最多 900 个。
三列 UNION ALL(订单号/运单号/转单号),叠加 tabOrderFilterWhere。
比对回填搜索请用 selectMatchedTransferOrderKeys,不走本 SQL。
-->
<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>
<!--
比对缺失转单号回填搜索专用:仅 TRANSFER_ORDER_ID IN,
不带提货时间,不影响列表/同步/比对共用 SQL。
-->
<select id="selectMatchedTransferOrderKeys" resultType="java.util.HashMap">
SELECT o.ID AS ID, o.PICKUP_DATE AS PICKUP_DATE
FROM ${orderTable} o
WHERE o.TRANSFER_ORDER_ID IN
<foreach collection="batch" item="bid" open="(" separator="," close=")">
#{bid}
</foreach>
AND o.BL_PICKUP = 1
AND o.ORDER_STATUS IN (3, 4, 5, 6, 7, 8, 11)
<if test="customerCodes != null and customerCodes.size() > 0">
AND o.CUSTOMER_CODE IN
<foreach collection="customerCodes" item="code" open="(" separator="," close=")">
#{code}
</foreach>
</if>
</select>
<!-- 内存分页切片后的主键回查(一批最多一个页大小,远低于 IN 上限) -->
<select id="selectTabOrderMonitorByIds" resultType="java.util.HashMap">
<!-- 全行数据:同步计费时直接复用,不再按单号回查 Oracle -->
SELECT o.*
FROM ${orderTable} o
WHERE o.ID IN
<foreach collection="ids" item="mid" open="(" separator="," close=")">
#{mid}
</foreach>
</select>
</mapper>