Files
xgy-oa/klp-wms/src/main/resources/mapper/klp/WmsStockMapper.xml
Joshi aee5295ff1 feat(WmsStockMapper): 优化库存查询逻辑支持空库位筛选
- 添加条件判断只在传入正常库位ID时创建CTE查询
- 实现传入-1时的特殊处理逻辑,过滤actual_warehouse_id为空的记录
- 使用choose-when结构区分不同库区过滤场景
- 保留原有递归查询功能用于正常库位ID的情况
- 添加注释说明库区过滤的两种不同情况
2026-01-12 13:35:42 +08:00

165 lines
8.0 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.klp.mapper.WmsStockMapper">
<resultMap type="com.klp.domain.WmsStock" id="WmsStockResult">
<result property="stockId" column="stock_id"/>
<result property="itemType" column="item_type"/>
<result property="itemId" column="item_id"/>
<result property="batchNo" column="batch_no"/>
<result property="remark" column="remark"/>
<result property="delFlag" column="del_flag"/>
<result property="createTime" column="create_time"/>
<result property="createBy" column="create_by"/>
<result property="updateTime" column="update_time"/>
<result property="updateBy" column="update_by"/>
</resultMap>
<select id="getStockByItemId" resultType="java.math.BigDecimal">
select sum(quantity) as quantity from wms_stock
where item_id = #{rawMaterialId} and item_type = 'raw_material' and del_flag = 0
</select>
<!-- 查询物料库存统计基于物料钢卷表支持Wrapper动态条件包含group by返回Page<WmsStockVo> -->
<select id="selectVoPagePlus" resultType="com.klp.domain.vo.WmsStockVo">
SELECT
mc.warehouse_id AS warehouseId,
mc.item_type AS itemType,
mc.item_id AS itemId,
w.warehouse_name AS warehouseName,
CASE
WHEN mc.item_type = 'product' THEN p.product_name
WHEN mc.item_type = 'raw_material' THEN r.raw_material_name
ELSE NULL
END AS itemName,
CASE
WHEN mc.item_type = 'product' THEN p.product_code
WHEN mc.item_type = 'raw_material' THEN r.raw_material_code
ELSE NULL
END AS itemCode,
CASE
WHEN mc.item_type = 'product' THEN p.specification
WHEN mc.item_type = 'raw_material' THEN r.specification
ELSE NULL
END AS specification,
CASE
WHEN mc.item_type = 'product' THEN p.material
WHEN mc.item_type = 'raw_material' THEN r.material
ELSE NULL
END AS material,
CASE
WHEN mc.item_type = 'product' THEN p.surface_treatment_desc
WHEN mc.item_type = 'raw_material' THEN r.surface_treatment_desc
ELSE NULL
END AS surfaceTreatmentDesc,
CASE
WHEN mc.item_type = 'product' THEN p.zinc_layer
WHEN mc.item_type = 'raw_material' THEN r.zinc_layer
ELSE NULL
END AS zincLayer,
CASE
WHEN mc.item_type = 'product' THEN p.manufacturer
WHEN mc.item_type = 'raw_material' THEN r.manufacturer
ELSE NULL
END AS manufacturer,
COUNT(*) AS totalQuantity,
SUM(CASE WHEN mc.status = 1 THEN 1 ELSE 0 END) AS onTheWay
FROM wms_material_coil mc
LEFT JOIN wms_warehouse w ON mc.warehouse_id = w.warehouse_id AND w.del_flag = 0
LEFT JOIN wms_product p ON mc.item_type = 'product' AND mc.item_id = p.product_id AND p.del_flag = 0
LEFT JOIN wms_raw_material r ON mc.item_type = 'raw_material' AND mc.item_id = r.raw_material_id AND r.del_flag = 0
${ew.customSqlSegment}
</select>
<!-- 按仓库统计库存分布 -->
<select id="selectStockDistribution" resultType="com.klp.domain.vo.WmsStockVo">
SELECT
mc.warehouse_id AS warehouseId,
w.warehouse_name AS warehouseName,
COUNT(*) AS totalQuantity,
mc.item_type AS itemType,
mc.item_id AS itemId
FROM wms_material_coil mc
INNER JOIN wms_warehouse w ON mc.warehouse_id = w.warehouse_id AND w.del_flag = 0
WHERE mc.item_type = #{itemType}
AND mc.item_id = #{itemId}
AND mc.del_flag = 0
AND mc.data_type = 1
GROUP BY mc.warehouse_id, w.warehouse_name, mc.item_type, mc.item_id
ORDER BY totalQuantity DESC
</select>
<select id="selectVoPagePlusActual" resultType="com.klp.domain.vo.WmsStockVo">
<!-- 只在传入正常库位ID时创建CTE传入-1时不需要CTE -->
<if test="rootWarehouseId != null and rootWarehouseId != -1">
WITH RECURSIVE aw_tree AS (
SELECT aw.actual_warehouse_id
FROM wms_actual_warehouse aw
WHERE aw.actual_warehouse_id = #{rootWarehouseId} AND aw.del_flag = 0
UNION ALL
SELECT c.actual_warehouse_id
FROM wms_actual_warehouse c
INNER JOIN aw_tree p ON c.parent_id = p.actual_warehouse_id
WHERE c.del_flag = 0
)
</if>
SELECT
g.actual_warehouse_id AS actualWarehouseId,
g.item_type AS itemType,
g.item_id AS itemId,
w.actual_warehouse_name AS actualWarehouseName,
CASE WHEN g.item_type = 'product' THEN p.product_name
WHEN g.item_type = 'raw_material' THEN r.raw_material_name
ELSE NULL END AS itemName,
CASE WHEN g.item_type = 'product' THEN p.product_code
WHEN g.item_type = 'raw_material' THEN r.raw_material_code
ELSE NULL END AS itemCode,
CASE WHEN g.item_type = 'product' THEN p.specification
WHEN g.item_type = 'raw_material' THEN r.specification
ELSE NULL END AS specification,
CASE WHEN g.item_type = 'product' THEN p.material
WHEN g.item_type = 'raw_material' THEN r.material
ELSE NULL END AS material,
CASE WHEN g.item_type = 'product' THEN p.surface_treatment_desc
WHEN g.item_type = 'raw_material' THEN r.surface_treatment_desc
ELSE NULL END AS surfaceTreatmentDesc,
CASE WHEN g.item_type = 'product' THEN p.zinc_layer
WHEN g.item_type = 'raw_material' THEN r.zinc_layer
ELSE NULL END AS zincLayer,
CASE WHEN g.item_type = 'product' THEN p.manufacturer
WHEN g.item_type = 'raw_material' THEN r.manufacturer
ELSE NULL END AS manufacturer,
g.totalQuantity,
g.onTheWay
FROM (
SELECT mc.actual_warehouse_id,
mc.item_type,
mc.item_id,
COUNT(*) AS totalQuantity,
SUM(CASE WHEN mc.status = 1 THEN 1 ELSE 0 END) AS onTheWay
FROM wms_material_coil mc FORCE INDEX (idx_mc_fixed_group)
${ew.customSqlSegment}
<!-- 库区过滤条件:分两种情况 -->
<if test="rootWarehouseId != null">
<choose>
<!-- 情况1传入-1 → 过滤actual_warehouse_id为空的记录无库区 -->
<when test="rootWarehouseId == -1">
AND mc.actual_warehouse_id IS NULL
</when>
<!-- 情况2传入正常库位ID → 过滤为递归查询的库位列表 -->
<otherwise>
AND mc.actual_warehouse_id IN (SELECT actual_warehouse_id FROM aw_tree)
</otherwise>
</choose>
</if>
GROUP BY mc.actual_warehouse_id, mc.item_type, mc.item_id
) g
LEFT JOIN wms_actual_warehouse w ON g.actual_warehouse_id = w.actual_warehouse_id AND w.del_flag = 0
LEFT JOIN wms_product p ON g.item_type = 'product' AND g.item_id = p.product_id AND p.del_flag = 0
LEFT JOIN wms_raw_material r ON g.item_type = 'raw_material' AND g.item_id = r.raw_material_id AND r.del_flag = 0
ORDER BY g.actual_warehouse_id, g.item_type, g.item_id
</select>
</mapper>