Files
BMS/bms-back/bms-system/src/main/resources/mapper/price/OracleUpstreamOrderMapper.xml
T
2026-10-16 10:59:59 +08:00

224 lines
8.4 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) -->
<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 &gt;= TO_TIMESTAMP(#{query.beginTime}, 'YYYY-MM-DD HH24:MI:SS')
</if>
<if test="query.endTime != null and query.endTime != ''">
AND o.PICKUP_DATE &lt;= 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 &lt;= #{endRow}
)
WHERE rn &gt; #{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>