224 lines
8.4 KiB
XML
224 lines
8.4 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) -->
|
||
<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">
|
||
AND o.CUSTOMER_CODE IN
|
||
<foreach collection="query.customerCodes" item="code" open="(" separator="," close=")">
|
||
#{code}
|
||
</foreach>
|
||
</if>
|
||
<if test="query.beginTime != null and query.beginTime != ''">
|
||
AND o.PICKUP_DATE >= TO_TIMESTAMP(#{query.beginTime}, 'YYYY-MM-DD HH24:MI:SS')
|
||
</if>
|
||
<if test="query.endTime != null and query.endTime != ''">
|
||
AND o.PICKUP_DATE <= TO_TIMESTAMP(#{query.endTime}, 'YYYY-MM-DD HH24:MI:SS')
|
||
</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>
|
||
|
||
<select id="selectTabOrderMonitorPage" resultType="java.util.HashMap">
|
||
SELECT * FROM (
|
||
SELECT inner_q.*, ROWNUM AS rn FROM (
|
||
<!-- 同步计费需要全行数据(toBillRequest 读取数十列),故取 o.* 而非展示列 -->
|
||
SELECT o.*
|
||
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>
|
||
|
||
<!-- Distinct product codes under the same filters (no pagination). -->
|
||
<select id="selectTabOrderProductCodes" resultType="java.util.HashMap">
|
||
SELECT o.CUSTOMER_CODE AS CUSTOMER_CODE,
|
||
o.PRODUCT_CODE AS PRODUCT_CODE,
|
||
MAX(o.PRODUCT_NAME) AS PRODUCT_NAME,
|
||
COUNT(1) AS ORDER_COUNT
|
||
FROM ${orderTable} o
|
||
WHERE
|
||
<include refid="tabOrderMonitorWhere"/>
|
||
AND o.PRODUCT_CODE IS NOT NULL
|
||
GROUP BY o.CUSTOMER_CODE, o.PRODUCT_CODE
|
||
ORDER BY o.CUSTOMER_CODE, o.PRODUCT_CODE
|
||
</select>
|
||
|
||
<!-- Order numbers for one upstream product 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.PRODUCT_CODE AS PRODUCT_CODE,
|
||
o.PRODUCT_NAME AS PRODUCT_NAME,
|
||
o.PICKUP_DATE AS PICKUP_DATE
|
||
FROM ${orderTable} o
|
||
WHERE
|
||
<include refid="tabOrderMonitorWhere"/>
|
||
AND o.PRODUCT_CODE = #{query.productCode}
|
||
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">
|
||
<!-- 全行数据:同步计费时直接复用,不再按单号回查 Oracle -->
|
||
SELECT o.*
|
||
FROM ${orderTable} o
|
||
WHERE o.ID IN
|
||
<foreach collection="ids" item="mid" open="(" separator="," close=")">
|
||
#{mid}
|
||
</foreach>
|
||
</select>
|
||
|
||
</mapper>
|