wip在产大屏

This commit is contained in:
jhd
2026-05-29 15:53:26 +08:00
parent 82a54e3200
commit 5a16a9d2b1
9 changed files with 266 additions and 0 deletions

View File

@@ -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<WipDashboardVo> wipDashboard() {
return R.ok(iWmsCoilPendingActionService.getWipDashboard());
}
/**
* 计算理论节拍回归默认近6个月并返回散点+拟合线
*/

View File

@@ -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;
}

View File

@@ -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<WipCoilVo> wipCoils;
/** 今日完成卷数 */
private int todayCompletedCount;
/** 今日完成重量(吨) */
private BigDecimal todayCompletedWeight;
}

View File

@@ -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;
}

View File

@@ -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<ProcessWipVo> processes;
/** 全局在产总数 */
private int totalWipCount;
/** 全局今日完成总卷数 */
private int totalTodayCompletedCount;
/** 全局今日完成总重量(吨) */
private BigDecimal totalTodayCompletedWeight;
}

View File

@@ -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<WmsCoilPendin
*/
List<WmsCoilPendingAction> selectPendingByActionTypes(
@Param("actionTypes") java.util.Collection<Integer> actionTypes);
/**
* WIP 大屏查询在产actionStatus=1钢卷列表关联物料表取净重
*/
List<WipCoilVo> selectWipCoils();
/**
* WIP 大屏查询今日已完成actionStatus=2聚合统计
* @param todayStart 今日 00:00:00
*/
List<ProcessTodayAggVo> selectTodayCompletedAgg(@Param("todayStart") Date todayStart);
}

View File

@@ -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();
}

View File

@@ -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<Integer, String> 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<WipCoilVo> wipCoils = baseMapper.selectWipCoils();
// 3. 查询今日已完成聚合统计
List<ProcessTodayAggVo> todayAggList = baseMapper.selectTodayCompletedAgg(todayStartDate);
// 4. 按 actionType 分组在产钢卷
Map<Integer, List<WipCoilVo>> wipMap = wipCoils.stream()
.collect(Collectors.groupingBy(WipCoilVo::getActionType));
// 5. 按 actionType 分组今日完成统计
Map<Integer, ProcessTodayAggVo> aggMap = todayAggList.stream()
.collect(Collectors.toMap(ProcessTodayAggVo::getActionType, a -> a));
// 6. 按固定工序顺序构建返回结果
List<ProcessWipVo> processes = new ArrayList<>();
int totalWipCount = 0;
int totalTodayCompletedCount = 0;
BigDecimal totalTodayCompletedWeight = BigDecimal.ZERO;
for (Map.Entry<Integer, String> entry : PROCESS_NAME_MAP.entrySet()) {
Integer actionType = entry.getKey();
String processName = entry.getValue();
List<WipCoilVo> 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;