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

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