插单修改

parent 9fab7eca
......@@ -1246,7 +1246,6 @@ if(targetOp.getSequence()>1) {
}
newEntry.setIsInterrupt(processExec.getCanInterrupt());
// 这里保留资源组ID(设备类型)
newEntry.setEquipTypeID(processExec.getMachineId());
if (processExec.getRuntime() != null) {
......@@ -1255,6 +1254,7 @@ if(targetOp.getSequence()>1) {
if (processExec.getSingleOut() != null) {
newEntry.setSingleOut(processExec.getSingleOut());
}
newEntry.setPriority(newLaunchOrder.getOrderPriority() != null ? newLaunchOrder.getOrderPriority() : 1);
if (processExec.getSetupTime() != null) {
......@@ -1268,12 +1268,12 @@ if(targetOp.getSequence()>1) {
newEntry.setEquipTypeName(processExec.getEquipTypeName());
newEntry.setEquipTypeCode(processExec.getEquipTypeCode());
// 与InitEntrys对齐:machineOptions来源于ProdEquipment(execId -> equipId
// 与 InitEntrys 对齐:设备来源于 prod_equipment(真实设备ID
List<MachineOption> machineOptions = newProdEquipments.stream()
.filter(pe -> pe.getExecId() != null && pe.getExecId().equals(processExec.getExecId()))
.map(pe -> {
MachineOption mo = new MachineOption();
mo.setMachineId(pe.getEquipId()); // 真实设备ID
mo.setMachineId(pe.getEquipId());
mo.setRuntime(pe.getRuntime() != null ? pe.getRuntime() : BigDecimal.ZERO);
mo.setSingleOut(pe.getSingleOut() != null ? pe.getSingleOut() : BigDecimal.ONE);
mo.setEquipCode(pe.getEquipCode());
......@@ -1289,11 +1289,12 @@ if(targetOp.getSequence()>1) {
}
newEntry.setMachineOptions(machineOptions);
newEntry.setSelectMachineID(null); // 后面按bestSeq回填
newEntry.setSelectMachineID(null); // 后面按最优序号回填
newEntrys.add(newEntry);
}
// 建工序链
for (int i = 0; i < newEntrys.size(); i++) {
Entry entry = newEntrys.get(i);
if (i == 0) {
......@@ -1382,13 +1383,13 @@ if(targetOp.getSequence()>1) {
boolean originalIsCheckSf = globalParam.isIsCheckSf();
globalParam.setIsCheckSf(false);
// 第一次解码
// 第一次解码:先拿到首工序所在设备
if (anchorTime != null && firstEntry != null) {
firstEntry.setDesignatedStartTime(anchorTime);
}
redecode(chromosome, chromosome.getBaseTime(), globalParam);
// 第二次调整:锚点占位后推 + 新工单前移
// 第二次调整:按冻结锚点插位
if (anchorTime != null && firstOperationId > 0) {
GAScheduleResult firstResult = chromosome.getResult().stream()
.filter(r -> r.getOperationId() == firstOperationId)
......@@ -1400,16 +1401,20 @@ if(targetOp.getSequence()>1) {
int anchorSeconds = (int) java.time.temporal.ChronoUnit.SECONDS.between(chromosome.getBaseTime(), anchorTime);
int firstDuration = Math.max(1, firstResult.getEndTime() - firstResult.getStartTime());
// 该设备老任务(不含新工单)
List<GAScheduleResult> machineOldResults = chromosome.getResult().stream()
.filter(r -> r.getMachineId() == machineId)
.filter(r -> r.getGroupId() != firstResult.getGroupId())
.sorted(Comparator.comparingInt(GAScheduleResult::getStartTime))
.collect(Collectors.toList());
// 锚点处占位任务(跨锚点)
GAScheduleResult pivot = machineOldResults.stream()
.filter(r -> r.getStartTime() <= anchorSeconds && r.getEndTime() > anchorSeconds)
.findFirst()
.orElse(null);
// 若锚点没被跨,则取锚点后第一任务
if (pivot == null) {
pivot = machineOldResults.stream()
.filter(r -> r.getStartTime() >= anchorSeconds)
......@@ -1417,6 +1422,7 @@ if(targetOp.getSequence()>1) {
.orElse(null);
}
// 锚点前最后一单
GAScheduleResult prev = machineOldResults.stream()
.filter(r -> r.getEndTime() <= anchorSeconds)
.reduce((a, b) -> b)
......@@ -1425,18 +1431,23 @@ if(targetOp.getSequence()>1) {
int newDesignatedStart;
if (pivot != null) {
if (pivot.getStartTime() <= anchorSeconds && pivot.getEndTime() > anchorSeconds) {
newDesignatedStart = pivot.getStartTime();
// 锚点被占:应从占位任务结束后开始
newDesignatedStart = pivot.getEndTime();
} else {
newDesignatedStart = prev != null ? prev.getEndTime() : 0;
// 锚点后有任务:插到该任务前
newDesignatedStart = pivot.getStartTime();
}
} else {
newDesignatedStart = prev != null ? prev.getEndTime() : 0;
// 锚点后无任务:从锚点或锚点前最后一单结束后开始
newDesignatedStart = prev != null ? Math.max(anchorSeconds, prev.getEndTime()) : anchorSeconds;
}
if (newDesignatedStart < 0) {
newDesignatedStart = 0;
// 不能早于冻结边界
if (newDesignatedStart < anchorSeconds) {
newDesignatedStart = anchorSeconds;
}
// 锁新工单首工序起点
Entry firstEntryRef = chromosome.getAllOperations().stream()
.filter(e -> e.getId() == firstOperationId)
.findFirst()
......@@ -1454,17 +1465,16 @@ if(targetOp.getSequence()>1) {
firstLock.setLockStartTime(1);
}
if (pivot != null) {
int pivotStart = pivot.getStartTime();
// 仅后移 newDesignatedStart 及其后的老任务
int finalNewDesignatedStart = newDesignatedStart;
List<GAScheduleResult> needShift = machineOldResults.stream()
.filter(r -> r.getStartTime() >= pivotStart)
.filter(r -> r.getStartTime() >= finalNewDesignatedStart)
.collect(Collectors.toList());
for (GAScheduleResult oldResult : needShift) {
oldResult.setDesignatedStartTime(oldResult.getStartTime() + firstDuration);
oldResult.setLockStartTime(1);
}
}
redecode(chromosome, chromosome.getBaseTime(), globalParam);
}
......@@ -1548,8 +1558,6 @@ if(targetOp.getSequence()>1) {
public void MergeOrder(Chromosome chromosome, String sourceorderId,String targetorderId, GlobalParam globalParam) {
List<Entry> allOperations = chromosome.getAllOperations();
List<GlobalOperationInfo> globalOpList= chromosome.getGlobalOpList();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment