296 lines
11 KiB
XML
296 lines
11 KiB
XML
<?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 <= 1
|
||
</select>
|
||
|
||
<select id="selectByOrderId" resultType="java.util.HashMap">
|
||
SELECT * FROM (
|
||
SELECT * FROM ${orderTable} WHERE ORDER_ID = #{orderNo}
|
||
) WHERE ROWNUM <= 1
|
||
</select>
|
||
|
||
<select id="selectByOrgOrderId" resultType="java.util.HashMap">
|
||
SELECT * FROM (
|
||
SELECT * FROM ${orderTable} WHERE ORG_ORDER_ID = #{orderNo}
|
||
) WHERE ROWNUM <= 1
|
||
</select>
|
||
|
||
<select id="selectByTrackId" resultType="java.util.HashMap">
|
||
SELECT * FROM (
|
||
SELECT * FROM ${orderTable} WHERE TRACK_ID = #{trackingNo}
|
||
) WHERE ROWNUM <= 1
|
||
</select>
|
||
|
||
<select id="selectByBarcode" resultType="java.util.HashMap">
|
||
SELECT * FROM (
|
||
SELECT * FROM ${orderTable} WHERE BARCODE_NUMBER = #{trackingNo}
|
||
) WHERE ROWNUM <= 1
|
||
</select>
|
||
|
||
<select id="selectByCustomerTrackId" resultType="java.util.HashMap">
|
||
SELECT * FROM (
|
||
SELECT * FROM ${orderTable} WHERE CUSTOMER_TRACK_ID = #{trackingNo}
|
||
) WHERE ROWNUM <= 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 >= TO_DATE(#{query.beginTime}, 'YYYY-MM-DD HH24:MI:SS')
|
||
</if>
|
||
<if test="query.endTime != null and query.endTime != ''">
|
||
AND o.PICKUP_DATE <= 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 <= #{endRow}
|
||
)
|
||
WHERE rn > #{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 <= #{endRow}
|
||
)
|
||
WHERE rn > #{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>
|