From 10a28f8c62af555299084f93773bd5645e8de65e Mon Sep 17 00:00:00 2001 From: Joshi <3040996759@qq.com> Date: Mon, 16 Mar 2026 15:58:10 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat(analytics):=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E7=82=89=E7=81=AB=E5=AE=9E=E7=BB=A9=E5=8A=9F=E8=83=BD=E4=BB=A5?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E8=AF=A6=E7=BB=86=E7=9A=84=E9=92=A2=E5=8D=B7?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E4=BB=A5=E5=8F=8A=E5=B1=82=E7=BA=A7=E5=92=8C?= =?UTF-8?q?=E5=BA=93=E5=8C=BA=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 WmsAnnealPerformanceDetailVo 中新增逻辑库区ID、库区名称、炉火层级和钢卷列表字段 - 修改 WmsAnnealPerformanceMapper.xml 查询语句以优化性能并移除冗余字段 - 在 WmsAnnealPerformanceServiceImpl 中实现批量查询逻辑,包括钢卷关联、库区信息和钢卷详情 - 新增仓库映射器和服务依赖注入以支持数据获取 - 在 WmsMaterialCoilVo 中添加炉火层级字段以存储钢卷在炉内的层数信息 - 实现按计划ID分组处理钢卷数据并设置相应的库区和层级属性 --- .../com/klp/domain/vo/WmsMaterialCoilVo.java | 5 + .../anneal/WmsAnnealPerformanceDetailVo.java | 10 ++ .../impl/WmsAnnealPerformanceServiceImpl.java | 116 +++++++++++++++++- .../mapper/WmsAnnealPerformanceMapper.xml | 9 +- 4 files changed, 132 insertions(+), 8 deletions(-) diff --git a/klp-wms/src/main/java/com/klp/domain/vo/WmsMaterialCoilVo.java b/klp-wms/src/main/java/com/klp/domain/vo/WmsMaterialCoilVo.java index 5b6d58f6..f25a673b 100644 --- a/klp-wms/src/main/java/com/klp/domain/vo/WmsMaterialCoilVo.java +++ b/klp-wms/src/main/java/com/klp/domain/vo/WmsMaterialCoilVo.java @@ -346,6 +346,11 @@ public class WmsMaterialCoilVo extends BaseEntity { */ private Integer exclusiveStatus; + /** + * 炉火层级(1=一层,2=二层,3=三层) + */ + private Integer furnaceLevel; + // ========== 发货绑定信息(由发货单明细占用) ========== /** diff --git a/klp-wms/src/main/java/com/klp/domain/vo/anneal/WmsAnnealPerformanceDetailVo.java b/klp-wms/src/main/java/com/klp/domain/vo/anneal/WmsAnnealPerformanceDetailVo.java index 82f8e4d6..cc2ecd09 100644 --- a/klp-wms/src/main/java/com/klp/domain/vo/anneal/WmsAnnealPerformanceDetailVo.java +++ b/klp-wms/src/main/java/com/klp/domain/vo/anneal/WmsAnnealPerformanceDetailVo.java @@ -1,9 +1,11 @@ package com.klp.domain.vo.anneal; +import com.klp.domain.vo.WmsMaterialCoilVo; import lombok.Data; import java.math.BigDecimal; import java.util.Date; +import java.util.List; /** * 炉火实绩明细视图对象 @@ -33,4 +35,12 @@ public class WmsAnnealPerformanceDetailVo { private String currentCoilNo; private BigDecimal netWeight; + + private Long logicWarehouseId; + + private String logicWarehouseName; + + private Integer furnaceLevel; + + private List coils; } diff --git a/klp-wms/src/main/java/com/klp/service/impl/WmsAnnealPerformanceServiceImpl.java b/klp-wms/src/main/java/com/klp/service/impl/WmsAnnealPerformanceServiceImpl.java index 293c15c0..1fce3cd8 100644 --- a/klp-wms/src/main/java/com/klp/service/impl/WmsAnnealPerformanceServiceImpl.java +++ b/klp-wms/src/main/java/com/klp/service/impl/WmsAnnealPerformanceServiceImpl.java @@ -1,15 +1,28 @@ package com.klp.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.klp.common.core.domain.PageQuery; +import com.klp.common.core.page.TableDataInfo; import com.klp.domain.bo.WmsAnnealPerformanceBo; +import com.klp.domain.bo.WmsMaterialCoilBo; +import com.klp.domain.vo.WmsMaterialCoilVo; import com.klp.domain.vo.anneal.WmsAnnealPerformanceDetailVo; import com.klp.domain.vo.anneal.WmsAnnealPerformanceSummaryVo; import com.klp.domain.vo.anneal.WmsAnnealPerformanceVo; +import com.klp.domain.WmsFurnacePlanCoil; +import com.klp.domain.WmsWarehouse; import com.klp.mapper.WmsAnnealPerformanceMapper; +import com.klp.mapper.WmsFurnacePlanCoilMapper; +import com.klp.mapper.WmsWarehouseMapper; import com.klp.service.IWmsAnnealPerformanceService; +import com.klp.service.IWmsMaterialCoilService; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; import org.springframework.stereotype.Service; -import java.util.List; +import java.util.*; +import java.util.stream.Collectors; /** * 炉火实绩Service业务层处理 @@ -22,11 +35,112 @@ import java.util.List; public class WmsAnnealPerformanceServiceImpl implements IWmsAnnealPerformanceService { private final WmsAnnealPerformanceMapper performanceMapper; + private final WmsFurnacePlanCoilMapper planCoilMapper; + private final WmsWarehouseMapper warehouseMapper; + private final IWmsMaterialCoilService materialCoilService; @Override public WmsAnnealPerformanceVo queryPerformance(WmsAnnealPerformanceBo bo) { WmsAnnealPerformanceSummaryVo summary = performanceMapper.selectSummary(bo); List details = performanceMapper.selectDetails(bo); + + if (details != null && !details.isEmpty()) { + // 收集所有计划ID + List planIds = details.stream() + .map(WmsAnnealPerformanceDetailVo::getPlanId) + .filter(Objects::nonNull) + .distinct() + .collect(Collectors.toList()); + + if (!planIds.isEmpty()) { + // 批量查询所有计划的钢卷关联记录 + List allPlanCoils = planCoilMapper.selectList( + new LambdaQueryWrapper() + .in(WmsFurnacePlanCoil::getPlanId, planIds) + .eq(WmsFurnacePlanCoil::getDelFlag, 0) + ); + + // 按planId分组 + Map> planCoilsMap = allPlanCoils.stream() + .collect(Collectors.groupingBy(WmsFurnacePlanCoil::getPlanId)); + + // 收集所有逻辑库区ID + Set allLogicWarehouseIds = allPlanCoils.stream() + .map(WmsFurnacePlanCoil::getLogicWarehouseId) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + + // 批量查询逻辑库区名称 + Map logicWarehouseNameMap = new HashMap<>(); + if (!allLogicWarehouseIds.isEmpty()) { + List warehouses = warehouseMapper.selectBatchIds(allLogicWarehouseIds); + for (WmsWarehouse warehouse : warehouses) { + logicWarehouseNameMap.put(warehouse.getWarehouseId(), warehouse.getWarehouseName()); + } + } + + // 收集所有钢卷ID + Set allCoilIds = allPlanCoils.stream() + .map(WmsFurnacePlanCoil::getCoilId) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + + // 批量查询钢卷信息 + Map coilVoMap = new HashMap<>(); + if (!allCoilIds.isEmpty()) { + WmsMaterialCoilBo coilBo = new WmsMaterialCoilBo(); + coilBo.setCoilIds(allCoilIds.stream().map(String::valueOf).collect(Collectors.joining(","))); + PageQuery pageQuery = new PageQuery(); + pageQuery.setPageNum(1); + pageQuery.setPageSize(Integer.MAX_VALUE); + TableDataInfo coilPage = materialCoilService.queryPageList(coilBo, pageQuery); + if (coilPage != null && coilPage.getRows() != null) { + for (WmsMaterialCoilVo coilVo : coilPage.getRows()) { + if (coilVo.getCoilId() != null) { + coilVoMap.put(coilVo.getCoilId(), coilVo); + } + } + } + } + + // 处理每个计划 + for (WmsAnnealPerformanceDetailVo detail : details) { + Long planId = detail.getPlanId(); + List planCoils = planCoilsMap.get(planId); + + if (planCoils == null || planCoils.isEmpty()) { + continue; + } + + // 为每个钢卷设置逻辑库区ID、层级和钢卷信息 + List coilVos = new ArrayList<>(); + for (WmsFurnacePlanCoil planCoil : planCoils) { + Long coilId = planCoil.getCoilId(); + if (coilId == null) { + continue; + } + + WmsMaterialCoilVo coilVo = coilVoMap.get(coilId); + if (coilVo == null) { + coilVo = new WmsMaterialCoilVo(); + coilVo.setCoilId(coilId); + } + + // 设置逻辑库区ID和层级(每个钢卷可能不同) + if (planCoil.getLogicWarehouseId() != null) { + coilVo.setWarehouseId(planCoil.getLogicWarehouseId()); + coilVo.setWarehouseName(logicWarehouseNameMap.get(planCoil.getLogicWarehouseId())); + } + // 设置炉火层级 + coilVo.setFurnaceLevel(planCoil.getFurnaceLevel()); + + coilVos.add(coilVo); + } + detail.setCoils(coilVos); + } + } + } + WmsAnnealPerformanceVo vo = new WmsAnnealPerformanceVo(); vo.setSummary(summary); vo.setDetails(details); diff --git a/klp-wms/src/main/resources/mapper/WmsAnnealPerformanceMapper.xml b/klp-wms/src/main/resources/mapper/WmsAnnealPerformanceMapper.xml index 6e490b79..9a08eff7 100644 --- a/klp-wms/src/main/resources/mapper/WmsAnnealPerformanceMapper.xml +++ b/klp-wms/src/main/resources/mapper/WmsAnnealPerformanceMapper.xml @@ -39,16 +39,11 @@ p.target_furnace_id AS targetFurnaceId, f.furnace_name AS targetFurnaceName, p.actual_start_time AS actualStartTime, - p.end_time AS endTime, - mc.coil_id AS coilId, - mc.enter_coil_no AS enterCoilNo, - mc.current_coil_no AS currentCoilNo, - mc.net_weight AS netWeight + p.end_time AS endTime FROM wms_furnace_plan p - 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 LEFT JOIN wms_furnace f ON f.furnace_id = p.target_furnace_id + GROUP BY p.plan_id, p.plan_no, p.target_furnace_id, f.furnace_name, p.actual_start_time, p.end_time ORDER BY p.actual_start_time DESC, p.plan_no DESC From 95987d352cc5ef71a66b4df8eb8d8b2e2d628482 Mon Sep 17 00:00:00 2001 From: Joshi <3040996759@qq.com> Date: Mon, 16 Mar 2026 16:45:52 +0800 Subject: [PATCH 2/2] =?UTF-8?q?refactor(wms):=20=E5=AE=8C=E6=88=90?= =?UTF-8?q?=E9=80=80=E7=81=AB=E9=80=89=E9=80=BB=E8=BE=91=E5=BA=93=E4=BD=8D?= =?UTF-8?q?=E8=80=8C=E4=B8=8D=E6=98=AF=E5=AE=9E=E9=99=85=E5=BA=93=E4=BD=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修改 WmsFurnacePlanLocationItemBo 中的 actualWarehouseId 字段为 warehouseId - 更新验证注解消息从"实际库位"改为"逻辑库位" - 修改 occupyActualWarehouse 方法为 occupyWarehouse 并调整参数 - 替换 ActualWarehouse 相关操作为 Warehouse 操作 - 在占用库位时同步更新 wmsfurnace_plan_coil 表中的逻辑库区信息 - 更新服务实现中所有相关字段引用和方法调用 --- .../bo/WmsFurnacePlanLocationItemBo.java | 4 +- .../impl/WmsFurnacePlanServiceImpl.java | 42 ++++++++++++------- 2 files changed, 29 insertions(+), 17 deletions(-) diff --git a/klp-wms/src/main/java/com/klp/domain/bo/WmsFurnacePlanLocationItemBo.java b/klp-wms/src/main/java/com/klp/domain/bo/WmsFurnacePlanLocationItemBo.java index d060ff86..2498f498 100644 --- a/klp-wms/src/main/java/com/klp/domain/bo/WmsFurnacePlanLocationItemBo.java +++ b/klp-wms/src/main/java/com/klp/domain/bo/WmsFurnacePlanLocationItemBo.java @@ -16,6 +16,6 @@ public class WmsFurnacePlanLocationItemBo { @NotNull(message = "钢卷ID不能为空") private Long coilId; - @NotNull(message = "实际库位不能为空") - private Long actualWarehouseId; + @NotNull(message = "逻辑库位不能为空") + private Long warehouseId; } diff --git a/klp-wms/src/main/java/com/klp/service/impl/WmsFurnacePlanServiceImpl.java b/klp-wms/src/main/java/com/klp/service/impl/WmsFurnacePlanServiceImpl.java index fa9afaa7..6441c94c 100644 --- a/klp-wms/src/main/java/com/klp/service/impl/WmsFurnacePlanServiceImpl.java +++ b/klp-wms/src/main/java/com/klp/service/impl/WmsFurnacePlanServiceImpl.java @@ -220,6 +220,7 @@ public class WmsFurnacePlanServiceImpl implements IWmsFurnacePlanService { } // 设置逻辑库区名称 if (item.getLogicWarehouseId() != null) { + item.setLogicWarehouseId(item.getLogicWarehouseId()); item.setLogicWarehouseName(logicWarehouseMap.get(item.getLogicWarehouseId())); } }); @@ -317,17 +318,17 @@ public class WmsFurnacePlanServiceImpl implements IWmsFurnacePlanService { throw new ServiceException("计划未绑定钢卷"); } if (locations == null || locations.isEmpty()) { - throw new ServiceException("请先分配实际库位"); + throw new ServiceException("请先分配逻辑库位"); } java.util.Map locationMap = locations.stream() .collect(Collectors.toMap(com.klp.domain.bo.WmsFurnacePlanLocationItemBo::getCoilId, - com.klp.domain.bo.WmsFurnacePlanLocationItemBo::getActualWarehouseId, (a, b) -> a)); + com.klp.domain.bo.WmsFurnacePlanLocationItemBo::getWarehouseId, (a, b) -> a)); for (WmsFurnacePlanCoilVo coil : coils) { Long targetLocation = locationMap.get(coil.getCoilId()); if (targetLocation == null) { throw new ServiceException("钢卷" + coil.getEnterCoilNo() + "未分配库位"); } - occupyActualWarehouse(coil.getCoilId(), targetLocation); + occupyWarehouse(planId, coil.getCoilId(), targetLocation); } Date now = new Date(); WmsFurnacePlan update = new WmsFurnacePlan(); @@ -357,25 +358,36 @@ public class WmsFurnacePlanServiceImpl implements IWmsFurnacePlanService { .set(WmsMaterialCoil::getExclusiveStatus, 2)); } - private void occupyActualWarehouse(Long coilId, Long actualWarehouseId) { - if (actualWarehouseId == null) { - throw new ServiceException("实际库位不能为空"); + private void occupyWarehouse(Long planId, Long coilId, Long warehouseId) { + if (warehouseId == null) { + throw new ServiceException("逻辑库位不能为空"); } - WmsActualWarehouse warehouse = actualWarehouseMapper.selectById(actualWarehouseId); + WmsWarehouse warehouse = warehouseMapper.selectById(warehouseId); if (warehouse == null || warehouse.getDelFlag() != null && warehouse.getDelFlag() == 1) { - throw new ServiceException("实际库位不存在"); + throw new ServiceException("逻辑库位不存在"); } - if (warehouse.getIsEnabled() != null && warehouse.getIsEnabled() == 0) { - throw new ServiceException("实际库位已被占用"); - } - WmsActualWarehouse updateWarehouse = new WmsActualWarehouse(); - updateWarehouse.setActualWarehouseId(actualWarehouseId); + + WmsWarehouse updateWarehouse = new WmsWarehouse(); + updateWarehouse.setWarehouseId(warehouseId); updateWarehouse.setIsEnabled(0); - actualWarehouseMapper.updateById(updateWarehouse); + warehouseMapper.updateById(updateWarehouse); + + // wmsfurnace_plan_coil也要插入这个去向的逻辑库区 + WmsFurnacePlanCoil wmsFurnacePlanCoil = planCoilMapper.selectOne(Wrappers.lambdaQuery() + .eq(WmsFurnacePlanCoil::getPlanId, planId) + .eq(WmsFurnacePlanCoil::getCoilId, coilId) + //逻辑删除 + .eq(WmsFurnacePlanCoil::getDelFlag, 0)); + + if (wmsFurnacePlanCoil != null && wmsFurnacePlanCoil.getPlanCoilId() != null) { + planCoilMapper.update(null, Wrappers.lambdaUpdate() + .eq(WmsFurnacePlanCoil::getPlanCoilId, wmsFurnacePlanCoil.getPlanCoilId()) + .set(WmsFurnacePlanCoil::getLogicWarehouseId, warehouseId)); + } WmsMaterialCoil updateCoil = new WmsMaterialCoil(); updateCoil.setCoilId(coilId); - updateCoil.setActualWarehouseId(actualWarehouseId); + updateCoil.setWarehouseId(warehouseId); updateCoil.setExclusiveStatus(0); materialCoilMapper.updateById(updateCoil); }