From 5a16a9d2b14601d9e4ca7ccdf12d286ef4211e9c Mon Sep 17 00:00:00 2001 From: jhd <1684074631@qq.com> Date: Fri, 29 May 2026 15:53:26 +0800 Subject: [PATCH] =?UTF-8?q?wip=E5=9C=A8=E4=BA=A7=E5=A4=A7=E5=B1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../WmsCoilPendingActionController.java | 9 ++ .../com/klp/domain/vo/ProcessTodayAggVo.java | 23 +++++ .../java/com/klp/domain/vo/ProcessWipVo.java | 33 +++++++ .../java/com/klp/domain/vo/WipCoilVo.java | 36 ++++++++ .../com/klp/domain/vo/WipDashboardVo.java | 27 ++++++ .../mapper/WmsCoilPendingActionMapper.java | 14 +++ .../service/IWmsCoilPendingActionService.java | 6 ++ .../impl/WmsCoilPendingActionServiceImpl.java | 87 +++++++++++++++++++ .../mapper/klp/WmsCoilPendingActionMapper.xml | 31 +++++++ 9 files changed, 266 insertions(+) create mode 100644 klp-wms/src/main/java/com/klp/domain/vo/ProcessTodayAggVo.java create mode 100644 klp-wms/src/main/java/com/klp/domain/vo/ProcessWipVo.java create mode 100644 klp-wms/src/main/java/com/klp/domain/vo/WipCoilVo.java create mode 100644 klp-wms/src/main/java/com/klp/domain/vo/WipDashboardVo.java diff --git a/klp-wms/src/main/java/com/klp/controller/WmsCoilPendingActionController.java b/klp-wms/src/main/java/com/klp/controller/WmsCoilPendingActionController.java index 785ac40c..1d240fba 100644 --- a/klp-wms/src/main/java/com/klp/controller/WmsCoilPendingActionController.java +++ b/klp-wms/src/main/java/com/klp/controller/WmsCoilPendingActionController.java @@ -17,6 +17,7 @@ import com.klp.common.core.validate.AddGroup; import com.klp.common.core.validate.EditGroup; import com.klp.common.enums.BusinessType; import com.klp.common.utils.poi.ExcelUtil; +import com.klp.domain.vo.WipDashboardVo; import com.klp.domain.vo.WmsCoilPendingActionVo; import com.klp.domain.vo.WmsCoilPendingActionIdCoilVo; import com.klp.domain.vo.TheoryCycleRegressionResultVo; @@ -165,6 +166,14 @@ public class WmsCoilPendingActionController extends BaseController { return iWmsCoilPendingActionService.queryStaleActionPageList(pageQuery); } + /** + * WIP 在产大屏:获取各工序在产列表及今日完成统计 + */ + @GetMapping("/wip/dashboard") + public R wipDashboard() { + return R.ok(iWmsCoilPendingActionService.getWipDashboard()); + } + /** * 计算理论节拍回归(默认近6个月),并返回散点+拟合线 */ diff --git a/klp-wms/src/main/java/com/klp/domain/vo/ProcessTodayAggVo.java b/klp-wms/src/main/java/com/klp/domain/vo/ProcessTodayAggVo.java new file mode 100644 index 00000000..91398cd5 --- /dev/null +++ b/klp-wms/src/main/java/com/klp/domain/vo/ProcessTodayAggVo.java @@ -0,0 +1,23 @@ +package com.klp.domain.vo; + +import lombok.Data; +import java.math.BigDecimal; + +/** + * 工序今日完成统计(数据库聚合结果) + * + * @author Joshi + * @date 2026-05-29 + */ +@Data +public class ProcessTodayAggVo { + + /** 操作类型编码 */ + private Integer actionType; + + /** 完成卷数 */ + private Integer completedCount; + + /** 总重量(kg) */ + private BigDecimal totalWeight; +} diff --git a/klp-wms/src/main/java/com/klp/domain/vo/ProcessWipVo.java b/klp-wms/src/main/java/com/klp/domain/vo/ProcessWipVo.java new file mode 100644 index 00000000..aa1e6f4a --- /dev/null +++ b/klp-wms/src/main/java/com/klp/domain/vo/ProcessWipVo.java @@ -0,0 +1,33 @@ +package com.klp.domain.vo; + +import lombok.Data; +import java.math.BigDecimal; +import java.util.List; + +/** + * 单个工序的 WIP 统计 + * + * @author Joshi + * @date 2026-05-29 + */ +@Data +public class ProcessWipVo { + + /** 操作类型编码(501=酸连轧工序) */ + private Integer actionType; + + /** 工序名称 */ + private String processName; + + /** 在产数量 */ + private int wipCount; + + /** 在产钢卷列表 */ + private List wipCoils; + + /** 今日完成卷数 */ + private int todayCompletedCount; + + /** 今日完成重量(吨) */ + private BigDecimal todayCompletedWeight; +} diff --git a/klp-wms/src/main/java/com/klp/domain/vo/WipCoilVo.java b/klp-wms/src/main/java/com/klp/domain/vo/WipCoilVo.java new file mode 100644 index 00000000..fe9c5e17 --- /dev/null +++ b/klp-wms/src/main/java/com/klp/domain/vo/WipCoilVo.java @@ -0,0 +1,36 @@ +package com.klp.domain.vo; + +import lombok.Data; +import java.math.BigDecimal; +import java.util.Date; + +/** + * WIP 在产钢卷 + * + * @author Joshi + * @date 2026-05-29 + */ +@Data +public class WipCoilVo { + + /** 操作类型 */ + private Integer actionType; + + /** 操作ID */ + private Long actionId; + + /** 钢卷ID */ + private Long coilId; + + /** 当前钢卷号 */ + private String currentCoilNo; + + /** 净重(kg) */ + private BigDecimal netWeight; + + /** 创建时间(领料时间) */ + private Date createTime; + + /** 创建人 */ + private String createBy; +} diff --git a/klp-wms/src/main/java/com/klp/domain/vo/WipDashboardVo.java b/klp-wms/src/main/java/com/klp/domain/vo/WipDashboardVo.java new file mode 100644 index 00000000..46fe7a35 --- /dev/null +++ b/klp-wms/src/main/java/com/klp/domain/vo/WipDashboardVo.java @@ -0,0 +1,27 @@ +package com.klp.domain.vo; + +import lombok.Data; +import java.math.BigDecimal; +import java.util.List; + +/** + * WIP 在产大屏 仪表盘视图对象 + * + * @author Joshi + * @date 2026-05-29 + */ +@Data +public class WipDashboardVo { + + /** 各工序汇总 */ + private List processes; + + /** 全局在产总数 */ + private int totalWipCount; + + /** 全局今日完成总卷数 */ + private int totalTodayCompletedCount; + + /** 全局今日完成总重量(吨) */ + private BigDecimal totalTodayCompletedWeight; +} diff --git a/klp-wms/src/main/java/com/klp/mapper/WmsCoilPendingActionMapper.java b/klp-wms/src/main/java/com/klp/mapper/WmsCoilPendingActionMapper.java index 9c3af748..190b7181 100644 --- a/klp-wms/src/main/java/com/klp/mapper/WmsCoilPendingActionMapper.java +++ b/klp-wms/src/main/java/com/klp/mapper/WmsCoilPendingActionMapper.java @@ -4,9 +4,12 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.klp.common.core.mapper.BaseMapperPlus; import com.klp.domain.WmsCoilPendingAction; +import com.klp.domain.vo.ProcessTodayAggVo; +import com.klp.domain.vo.WipCoilVo; import com.klp.domain.vo.WmsCoilPendingActionVo; import com.klp.domain.vo.WmsCoilPendingActionIdCoilVo; import org.apache.ibatis.annotations.Param; +import java.util.Date; import java.util.List; /** @@ -69,5 +72,16 @@ public interface WmsCoilPendingActionMapper extends BaseMapperPlus selectPendingByActionTypes( @Param("actionTypes") java.util.Collection actionTypes); + + /** + * WIP 大屏:查询在产(actionStatus=1)钢卷列表,关联物料表取净重 + */ + List selectWipCoils(); + + /** + * WIP 大屏:查询今日已完成(actionStatus=2)聚合统计 + * @param todayStart 今日 00:00:00 + */ + List selectTodayCompletedAgg(@Param("todayStart") Date todayStart); } diff --git a/klp-wms/src/main/java/com/klp/service/IWmsCoilPendingActionService.java b/klp-wms/src/main/java/com/klp/service/IWmsCoilPendingActionService.java index 90eeecd2..20aec44b 100644 --- a/klp-wms/src/main/java/com/klp/service/IWmsCoilPendingActionService.java +++ b/klp-wms/src/main/java/com/klp/service/IWmsCoilPendingActionService.java @@ -10,6 +10,7 @@ import java.util.Collection; import java.util.List; import java.util.Date; import com.klp.domain.vo.TheoryCycleRegressionResultVo; +import com.klp.domain.vo.WipDashboardVo; /** * 钢卷待操作Service接口 @@ -97,5 +98,10 @@ public interface IWmsCoilPendingActionService { * @param maxPoints 最大散点数(includePoints=true 时生效) */ TheoryCycleRegressionResultVo calcTheoryCycleRegression(Date startTime, Date endTime, Boolean includePoints, Integer maxPoints); + + /** + * WIP 在产大屏:获取各工序在产列表及今日完成统计 + */ + WipDashboardVo getWipDashboard(); } diff --git a/klp-wms/src/main/java/com/klp/service/impl/WmsCoilPendingActionServiceImpl.java b/klp-wms/src/main/java/com/klp/service/impl/WmsCoilPendingActionServiceImpl.java index b948adfd..7353e3fe 100644 --- a/klp-wms/src/main/java/com/klp/service/impl/WmsCoilPendingActionServiceImpl.java +++ b/klp-wms/src/main/java/com/klp/service/impl/WmsCoilPendingActionServiceImpl.java @@ -14,9 +14,13 @@ import com.klp.common.utils.StringUtils; import com.klp.domain.WmsCoilPendingAction; import com.klp.domain.WmsMaterialCoil; import com.klp.domain.bo.WmsCoilPendingActionBo; +import com.klp.domain.vo.ProcessTodayAggVo; +import com.klp.domain.vo.ProcessWipVo; import com.klp.domain.vo.TheoryCyclePointVo; import com.klp.domain.vo.TheoryCycleRegressionResultVo; import com.klp.domain.vo.TheoryCycleRegressionVo; +import com.klp.domain.vo.WipCoilVo; +import com.klp.domain.vo.WipDashboardVo; import com.klp.domain.vo.WmsCoilPendingActionVo; import com.klp.domain.vo.WmsCoilPendingActionIdCoilVo; import com.klp.domain.DrMillProductionPlan; @@ -64,6 +68,26 @@ public class WmsCoilPendingActionServiceImpl implements IWmsCoilPendingActionSer private static final int ACTION_TYPE_DR_NORMAL = 504; private static final int ACTION_TYPE_DR_REPAIR = 524; + /** actionType → 工序名称映射 */ + private static final Map PROCESS_NAME_MAP = new LinkedHashMap<>(); + static { + PROCESS_NAME_MAP.put(501, "酸连轧工序"); + PROCESS_NAME_MAP.put(502, "镀锌工序"); + PROCESS_NAME_MAP.put(503, "脱脂工序"); + // 504=拉矫平整工序 (but 504 is also DR_NORMAL, use a more specific name) + PROCESS_NAME_MAP.put(504, "拉矫平整工序"); + PROCESS_NAME_MAP.put(505, "双机架工序"); + PROCESS_NAME_MAP.put(506, "镀铬工序"); + // 520-525 修复工序 + PROCESS_NAME_MAP.put(520, "酸轧修复工序"); + PROCESS_NAME_MAP.put(521, "镀锌修复工序"); + PROCESS_NAME_MAP.put(522, "脱脂修复工序"); + PROCESS_NAME_MAP.put(523, "拉矫修复工序"); + PROCESS_NAME_MAP.put(524, "双机架修复工序"); + PROCESS_NAME_MAP.put(525, "镀铬修复工序"); + // 纵剪分条无明确编码,暂不纳入 + } + private static final String REDIS_KEY_IDEAL_CYCLE = "oee:ideal-cycle-time"; /** @@ -744,6 +768,69 @@ public class WmsCoilPendingActionServiceImpl implements IWmsCoilPendingActionSer return LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault()); } + /** + * WIP 在产大屏:获取各工序在产列表及今日完成统计 + */ + @Override + public WipDashboardVo getWipDashboard() { + // 1. 查询今日 00:00:00 + LocalDateTime todayStart = LocalDateTime.now().toLocalDate().atStartOfDay(); + Date todayStartDate = Date.from(todayStart.atZone(ZoneId.systemDefault()).toInstant()); + + // 2. 查询在产钢卷列表 + List wipCoils = baseMapper.selectWipCoils(); + + // 3. 查询今日已完成聚合统计 + List todayAggList = baseMapper.selectTodayCompletedAgg(todayStartDate); + + // 4. 按 actionType 分组在产钢卷 + Map> wipMap = wipCoils.stream() + .collect(Collectors.groupingBy(WipCoilVo::getActionType)); + + // 5. 按 actionType 分组今日完成统计 + Map aggMap = todayAggList.stream() + .collect(Collectors.toMap(ProcessTodayAggVo::getActionType, a -> a)); + + // 6. 按固定工序顺序构建返回结果 + List processes = new ArrayList<>(); + int totalWipCount = 0; + int totalTodayCompletedCount = 0; + BigDecimal totalTodayCompletedWeight = BigDecimal.ZERO; + + for (Map.Entry entry : PROCESS_NAME_MAP.entrySet()) { + Integer actionType = entry.getKey(); + String processName = entry.getValue(); + + List coils = wipMap.getOrDefault(actionType, Collections.emptyList()); + ProcessTodayAggVo agg = aggMap.get(actionType); + + ProcessWipVo p = new ProcessWipVo(); + p.setActionType(actionType); + p.setProcessName(processName); + p.setWipCount(coils.size()); + p.setWipCoils(coils); + p.setTodayCompletedCount(agg != null ? agg.getCompletedCount() : 0); + // 数据库存储为 kg,转为吨(保留 1 位小数) + BigDecimal weightKg = agg != null ? agg.getTotalWeight() : BigDecimal.ZERO; + BigDecimal weightTon = weightKg.divide(BigDecimal.valueOf(1000), 1, RoundingMode.HALF_UP); + p.setTodayCompletedWeight(weightTon); + + totalWipCount += p.getWipCount(); + totalTodayCompletedCount += p.getTodayCompletedCount(); + totalTodayCompletedWeight = totalTodayCompletedWeight.add(weightTon); + + processes.add(p); + } + + // 7. 组装响应 + WipDashboardVo vo = new WipDashboardVo(); + vo.setProcesses(processes); + vo.setTotalWipCount(totalWipCount); + vo.setTotalTodayCompletedCount(totalTodayCompletedCount); + vo.setTotalTodayCompletedWeight(totalTodayCompletedWeight); + return vo; + } + private static class RegressionStat { Double slope; Double intercept; diff --git a/klp-wms/src/main/resources/mapper/klp/WmsCoilPendingActionMapper.xml b/klp-wms/src/main/resources/mapper/klp/WmsCoilPendingActionMapper.xml index 8d62ec34..69945d25 100644 --- a/klp-wms/src/main/resources/mapper/klp/WmsCoilPendingActionMapper.xml +++ b/klp-wms/src/main/resources/mapper/klp/WmsCoilPendingActionMapper.xml @@ -54,6 +54,7 @@ wmc.supplier_coil_no as supplierCoilNo, wmc.item_id as itemId, wmc.item_type as itemType, + wmc.net_weight as weight, w.warehouse_name AS warehouseName, aw.actual_warehouse_name AS actualWarehouseName, CASE WHEN wmc.item_type = 'raw_material' THEN rm.specification @@ -118,6 +119,7 @@ wmc.supplier_coil_no as supplierCoilNo, wmc.item_id as itemId, wmc.item_type as itemType, + wmc.net_weight as weight, w.warehouse_name AS warehouseName, aw.actual_warehouse_name AS actualWarehouseName, CASE WHEN wmc.item_type = 'raw_material' THEN rm.specification @@ -224,5 +226,34 @@ ) + + + + + +