wip在产大屏
This commit is contained in:
@@ -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个月),并返回散点+拟合线
|
||||
*/
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
33
klp-wms/src/main/java/com/klp/domain/vo/ProcessWipVo.java
Normal file
33
klp-wms/src/main/java/com/klp/domain/vo/ProcessWipVo.java
Normal 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;
|
||||
}
|
||||
36
klp-wms/src/main/java/com/klp/domain/vo/WipCoilVo.java
Normal file
36
klp-wms/src/main/java/com/klp/domain/vo/WipCoilVo.java
Normal 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;
|
||||
}
|
||||
27
klp-wms/src/main/java/com/klp/domain/vo/WipDashboardVo.java
Normal file
27
klp-wms/src/main/java/com/klp/domain/vo/WipDashboardVo.java
Normal 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;
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user