插单修改

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