refactor(stock): 优化库存查询逻辑并调整分组策略
- 修改 XML 中的查询语句,将 CASE 表达式包裹在 MIN 函数内以适配 GROUP BY - 显式添加 GROUP BY 子句到 SQL 查询中 - 在 Java 代码中将模糊查询优化为前缀匹配,提高索引使用效率 - 移除 QueryWrapper 中冗余的 groupBy 字段,改由 SQL 层统一控制分组逻辑 - 简化 Java 层动态条件构造,提升可读性和维护性
This commit is contained in:
@@ -81,23 +81,10 @@ public class WmsStockServiceImpl implements IWmsStockService {
|
||||
}
|
||||
qw.eq(StringUtils.isNotBlank(bo.getItemType()), "mc.item_type", bo.getItemType());
|
||||
qw.eq(bo.getItemId() != null, "mc.item_id", bo.getItemId());
|
||||
qw.like(StringUtils.isNotBlank(bo.getBatchNo()), "mc.enter_coil_no", bo.getBatchNo());
|
||||
// 优化模糊查询为前缀匹配,便于走索引(若有)
|
||||
qw.likeRight(StringUtils.isNotBlank(bo.getBatchNo()), "mc.enter_coil_no", bo.getBatchNo());
|
||||
|
||||
|
||||
// 使用 groupBy 进行分组
|
||||
qw.groupBy(
|
||||
"mc.actual_warehouse_id",
|
||||
"mc.item_type",
|
||||
"mc.item_id",
|
||||
"w.actual_warehouse_name",
|
||||
"CASE WHEN mc.item_type = 'product' THEN p.product_name WHEN mc.item_type = 'raw_material' THEN r.raw_material_name ELSE NULL END",
|
||||
"CASE WHEN mc.item_type = 'product' THEN p.product_code WHEN mc.item_type = 'raw_material' THEN r.raw_material_code ELSE NULL END",
|
||||
"CASE WHEN mc.item_type = 'product' THEN p.specification WHEN mc.item_type = 'raw_material' THEN r.specification ELSE NULL END",
|
||||
"CASE WHEN mc.item_type = 'product' THEN p.material WHEN mc.item_type = 'raw_material' THEN r.material ELSE NULL END",
|
||||
"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",
|
||||
"CASE WHEN mc.item_type = 'product' THEN p.zinc_layer WHEN mc.item_type = 'raw_material' THEN r.zinc_layer ELSE NULL END",
|
||||
"CASE WHEN mc.item_type = 'product' THEN p.manufacturer WHEN mc.item_type = 'raw_material' THEN r.manufacturer ELSE NULL END"
|
||||
);
|
||||
// 分组改由 SQL 中显式控制,避免在 Wrapper 中拼装大量分组字段
|
||||
|
||||
return qw;
|
||||
}
|
||||
|
||||
@@ -91,53 +91,40 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
ORDER BY totalQuantity DESC
|
||||
</select>
|
||||
<select id="selectVoPagePlusActual" resultType="com.klp.domain.vo.WmsStockVo">
|
||||
SELECT mc.actual_warehouse_id AS actualWarehouseId,
|
||||
mc.item_type AS itemType,
|
||||
mc.item_id AS itemId,
|
||||
w.actual_warehouse_name AS actualWarehouseName,
|
||||
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
|
||||
SELECT
|
||||
mc.actual_warehouse_id AS actualWarehouseId,
|
||||
mc.item_type AS itemType,
|
||||
mc.item_id AS itemId,
|
||||
MIN(w.actual_warehouse_name) AS actualWarehouseName,
|
||||
MIN(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,
|
||||
MIN(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,
|
||||
MIN(CASE WHEN mc.item_type = 'product' THEN p.specification
|
||||
WHEN mc.item_type = 'raw_material' THEN r.specification
|
||||
ELSE NULL END) AS specification,
|
||||
MIN(CASE WHEN mc.item_type = 'product' THEN p.material
|
||||
WHEN mc.item_type = 'raw_material' THEN r.material
|
||||
ELSE NULL END) AS material,
|
||||
MIN(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,
|
||||
MIN(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,
|
||||
MIN(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_actual_warehouse w ON mc.actual_warehouse_id = w.actual_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}
|
||||
LEFT JOIN wms_actual_warehouse w ON mc.actual_warehouse_id = w.actual_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}
|
||||
GROUP BY mc.actual_warehouse_id, mc.item_type, mc.item_id
|
||||
</select>
|
||||
|
||||
</mapper>
|
||||
|
||||
Reference in New Issue
Block a user