feat(wms): 添加退火性能查询中的双重库区筛选功能

- 在 WmsAnnealPerformanceBo 中新增 coilWarehouseId 字段用于钢卷本身库区筛选
- 更新数据库查询映射,支持出炉时逻辑库区和钢卷本身库区的分别筛选
- 修改服务实现逻辑,区分出炉时逻辑库区和钢卷本身库区的数据处理
- 优化查询条件判断,支持多种筛选条件组合的统计信息重新计算
This commit is contained in:
2026-07-10 15:39:55 +08:00
parent d0b3c7e766
commit 8ee5ab0a8d
3 changed files with 32 additions and 14 deletions

View File

@@ -35,6 +35,9 @@ public class WmsAnnealPerformanceBo {
// 当前钢卷号 // 当前钢卷号
private String currentCoilNo; private String currentCoilNo;
// 逻辑库区id // 逻辑库区id出炉时的逻辑库区对应wms_furnace_plan_coil.logic_warehouse_id
private Long warehouseId; private Long warehouseId;
// 钢卷所在库区id钢卷本身的逻辑库区对应wms_material_coil.warehouse_id
private Long coilWarehouseId;
} }

View File

@@ -118,7 +118,16 @@ public class WmsAnnealPerformanceServiceImpl implements IWmsAnnealPerformanceSer
continue; continue;
} }
// 为每个钢卷设置逻辑库区ID、层级和钢卷信息 // 设置出炉时的逻辑库区到detail级别取第一个非空的logicWarehouseId
for (WmsFurnacePlanCoil planCoil : planCoils) {
if (planCoil.getLogicWarehouseId() != null) {
detail.setLogicWarehouseId(planCoil.getLogicWarehouseId());
detail.setLogicWarehouseName(logicWarehouseNameMap.get(planCoil.getLogicWarehouseId()));
break;
}
}
// 为每个钢卷设置炉火层级和钢卷信息(不覆盖钢卷本身的逻辑库区)
List<WmsMaterialCoilVo> coilVos = new ArrayList<>(); List<WmsMaterialCoilVo> coilVos = new ArrayList<>();
for (WmsFurnacePlanCoil planCoil : planCoils) { for (WmsFurnacePlanCoil planCoil : planCoils) {
Long coilId = planCoil.getCoilId(); Long coilId = planCoil.getCoilId();
@@ -132,11 +141,8 @@ public class WmsAnnealPerformanceServiceImpl implements IWmsAnnealPerformanceSer
coilVo.setCoilId(coilId); coilVo.setCoilId(coilId);
} }
// 设置逻辑库区ID和层级每个钢卷可能不同 // 保持钢卷本身的warehouseId/warehouseName不变不覆盖
if (planCoil.getLogicWarehouseId() != null) {
coilVo.setWarehouseId(planCoil.getLogicWarehouseId());
coilVo.setWarehouseName(logicWarehouseNameMap.get(planCoil.getLogicWarehouseId()));
}
// 设置炉火层级 // 设置炉火层级
coilVo.setFurnaceLevel(planCoil.getFurnaceLevel()); coilVo.setFurnaceLevel(planCoil.getFurnaceLevel());
@@ -153,9 +159,10 @@ public class WmsAnnealPerformanceServiceImpl implements IWmsAnnealPerformanceSer
continue; // 跳过不匹配的钢卷 continue; // 跳过不匹配的钢卷
} }
} }
if (bo.getWarehouseId() != null) { // 钢卷本身的逻辑库区筛选coilVo.warehouseId保持不变
if (bo.getCoilWarehouseId() != null) {
if (coilVo.getWarehouseId() == null || if (coilVo.getWarehouseId() == null ||
!coilVo.getWarehouseId().equals(bo.getWarehouseId())) { !coilVo.getWarehouseId().equals(bo.getCoilWarehouseId())) {
continue; // 跳过不匹配的钢卷 continue; // 跳过不匹配的钢卷
} }
} }
@@ -178,8 +185,11 @@ public class WmsAnnealPerformanceServiceImpl implements IWmsAnnealPerformanceSer
// 移除没有钢卷的计划 // 移除没有钢卷的计划
details.removeIf(detail -> detail.getCoils() == null || detail.getCoils().isEmpty()); details.removeIf(detail -> detail.getCoils() == null || detail.getCoils().isEmpty());
// 如果传入了enterCoilNo筛选条件,重新计算统计信息 // 如果传入了筛选条件,重新计算统计信息
if (bo.getEnterCoilNo() != null && !bo.getEnterCoilNo().isEmpty()) { if ((bo.getEnterCoilNo() != null && !bo.getEnterCoilNo().isEmpty())
|| (bo.getCurrentCoilNo() != null && !bo.getCurrentCoilNo().isEmpty())
|| bo.getWarehouseId() != null
|| bo.getCoilWarehouseId() != null) {
summary.setPlanCount(filteredPlanCount); summary.setPlanCount(filteredPlanCount);
summary.setCoilCount(filteredCoilCount); summary.setCoilCount(filteredCoilCount);
summary.setTotalWeight(filteredTotalWeight); summary.setTotalWeight(filteredTotalWeight);

View File

@@ -20,12 +20,17 @@
<if test="enterCoilNo != null and enterCoilNo != ''"> <if test="enterCoilNo != null and enterCoilNo != ''">
AND mc.enter_coil_no LIKE CONCAT('%', #{enterCoilNo}, '%') AND mc.enter_coil_no LIKE CONCAT('%', #{enterCoilNo}, '%')
</if> </if>
<!-- 当前钢卷号和逻辑库区id匹配 --> <!-- 当前钢卷号匹配 -->
<if test="currentCoilNo != null and currentCoilNo != ''"> <if test="currentCoilNo != null and currentCoilNo != ''">
AND mc.current_coil_no LIKE CONCAT('%', #{currentCoilNo}, '%') AND mc.current_coil_no LIKE CONCAT('%', #{currentCoilNo}, '%')
</if> </if>
<!-- 出炉时的逻辑库区筛选wms_furnace_plan_coil.logic_warehouse_id -->
<if test="warehouseId != null"> <if test="warehouseId != null">
AND mc.warehouse_id = #{warehouseId} AND pc.logic_warehouse_id = #{warehouseId}
</if>
<!-- 钢卷本身的逻辑库区筛选wms_material_coil.warehouse_id -->
<if test="coilWarehouseId != null">
AND mc.warehouse_id = #{coilWarehouseId}
</if> </if>
</where> </where>
</sql> </sql>
@@ -49,7 +54,7 @@
p.end_time AS endTime p.end_time AS endTime
FROM wms_furnace_plan p FROM wms_furnace_plan p
LEFT JOIN wms_furnace f ON f.furnace_id = p.target_furnace_id LEFT JOIN wms_furnace f ON f.furnace_id = p.target_furnace_id
<if test="enterCoilNo != null and enterCoilNo != '' or currentCoilNo != null and currentCoilNo != '' or warehouseId != null"> <if test="enterCoilNo != null and enterCoilNo != '' or currentCoilNo != null and currentCoilNo != '' or warehouseId != null or coilWarehouseId != null">
INNER JOIN wms_furnace_plan_coil pc ON pc.plan_id = p.plan_id AND pc.del_flag = 0 INNER JOIN wms_furnace_plan_coil pc ON pc.plan_id = p.plan_id AND pc.del_flag = 0
INNER JOIN wms_material_coil mc ON mc.coil_id = pc.coil_id AND mc.del_flag = 0 INNER JOIN wms_material_coil mc ON mc.coil_id = pc.coil_id AND mc.del_flag = 0
</if> </if>