Browse Source

单卷模型处理

fangpy 1 year ago
parent
commit
9f7fe67b54

+ 57 - 38
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/listener/TaskStartTimeListener.java

@@ -502,6 +502,14 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
             // 当前工序最小开始时间、结束时间
             LocalDateTime proStartTime = endTime.plusMinutes(lzTimes);
             LocalDateTime proEndTime = proStartTime.plusMinutes(process.getProduceTime());
+            // 当前工序最大开始时间、结束时间
+            LocalDateTime proMaxStartTime = null;
+            LocalDateTime proMaxEndTime = null;
+            if(preProcess.getMaxWaitTime() != null && preProcess.getMaxWaitTime()>0){
+                proMaxStartTime = proStartTime.plusMinutes(preProcess.getMaxWaitTime());
+                proMaxEndTime = proEndTime.plusMinutes(preProcess.getMaxWaitTime());
+            }
+
             // 随机延时时间处理
             if(process.getProcessType().equals("成退") || process.getProcessType().equals("中退")
                     || process.getProcessType().equals("铸轧") || process.getProcessType().equals("冷轧")){
@@ -547,7 +555,7 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
                                 break;
                             }else{
                                 // 未锁定的是排程中的作业占用时间段,可以合并更大的加工时间
-                                if(!equipmentRunTime.isLocked()){
+//                                if(!equipmentRunTime.isLocked()){
                                     if(equipmentRunTime.getStartRunTime().compareTo(productionProcesses.getStartTime())>=0
                                             && equipmentRunTime.getEndRunTime().compareTo(productionProcesses.getEndTime())<=0){
                                         // 合并退火作业总宽度、承重
@@ -558,7 +566,7 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
                                         merged = true;
                                         break;
                                     }
-                                }
+//                                }
                             }
                         }
                     }
@@ -575,49 +583,40 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
             // 过滤
             // 按照开始时间排序
             equipmentRunTimes.sort(Comparator.comparing(EquipmentRunTime::getStartRunTime));
-            // 有交叉的时间直接跳过
+            // 有交叉的时间直接跳过,退火工序特殊处理
             if(equipmentRunTimes.size()>0){
                 for (EquipmentRunTime equipmentRunTime : equipmentRunTimes) {
-                    if(proStartTime.compareTo(equipmentRunTime.getEndRunTime())>0 || proEndTime.compareTo(equipmentRunTime.getStartRunTime())<0){
-                        continue;
-                    }else{
-                        boolean jumpMark = false;
-                        // 退火工序特殊处理
-                        if(process.getProcessType().equals("成退") || process.getProcessType().equals("中退")){
-                            if(equipmentRunTime.getStartRunTime().compareTo(proStartTime)<=0
-                                    && equipmentRunTime.getEndRunTime().compareTo(proEndTime)>=0){
-                                // 宽度余量
-                                if (pe.getEquipmentParameter().getEquipmentWidth().subtract(equipmentRunTime.getTotalVolumeWidth()).compareTo(process.getVolumeWidth()) < 0) {
-                                    jumpMark = true;
-                                }
-                                // 重量余量
-                                if (pe.getEquipmentParameter().getEquipmentBearing().subtract(equipmentRunTime.getTotalSinglerollweight()).compareTo(process.getSinglerollweight()) < 0) {
-                                    jumpMark = true;
-                                }
-                            }else if(equipmentRunTime.getStartRunTime().compareTo(proStartTime)>=0 && equipmentRunTime.getEndRunTime().compareTo(proEndTime)<=0){
-                                // 未锁定的是排程中的作业占用时间段,可以合并更大的加工时间
-                                if(!equipmentRunTime.isLocked()){
-                                    // 宽度余量
-                                    if (pe.getEquipmentParameter().getEquipmentWidth().subtract(equipmentRunTime.getTotalVolumeWidth()).compareTo(process.getVolumeWidth()) < 0) {
-                                        jumpMark = true;
-                                    }
-                                    // 重量余量
-                                    if (pe.getEquipmentParameter().getEquipmentBearing().subtract(equipmentRunTime.getTotalSinglerollweight()).compareTo(process.getSinglerollweight()) < 0) {
-                                        jumpMark = true;
+                    // 退火工序
+                    if(process.getProcessType().equals("成退") || process.getProcessType().equals("中退")){
+                        if(equipmentRunTime.getEndRunTime().compareTo(proStartTime)<=0){
+                            continue;
+                        }else{
+                            if(equipmentRunTime.getStartRunTime().compareTo(proStartTime)<0){
+                                proStartTime = equipmentRunTime.getEndRunTime().plusMinutes(1);
+                            }else{
+                                if(equipmentRunTime.getStartRunTime().compareTo(proEndTime)<0){
+                                    boolean merge = isMerge(pe, equipmentRunTime, process);
+                                    if(merge){
+                                        proStartTime = equipmentRunTime.getStartRunTime();
+                                    }else{
+                                        proStartTime = equipmentRunTime.getEndRunTime().plusMinutes(1);
                                     }
-                                    equipmentRunTime.setStartRunTime(proStartTime);
-                                    equipmentRunTime.setEndRunTime(proEndTime);
                                 }else{
-                                    jumpMark = true;
+                                    if(equipmentRunTime.getStartRunTime().compareTo(proMaxStartTime)<0){
+                                        boolean merge = isMerge(pe, equipmentRunTime, process);
+                                        if(merge){
+                                            proStartTime = equipmentRunTime.getStartRunTime();
+                                        }
+                                    }
                                 }
-                            }else{
-                                jumpMark = true;
                             }
-                        }else{
-                            jumpMark = true;
                         }
-                        // 跳过当前占用时间
-                        if(jumpMark){
+                    }
+                    // 非退火工序
+                    else{
+                        if(proStartTime.compareTo(equipmentRunTime.getEndRunTime())>0 || proEndTime.compareTo(equipmentRunTime.getStartRunTime())<0){
+                            continue;
+                        }else{
                             proStartTime = equipmentRunTime.getEndRunTime().plusMinutes(1);
                             proEndTime = proStartTime.plusMinutes(process.getProduceTime());
                         }
@@ -630,6 +629,26 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
         return toUpdateStartTime;
     }
 
+    /**
+     * 判断当前设备时间段是否可以合并退火当前工序
+     * @param pe
+     * @param equipmentRunTime
+     * @param process
+     * @return
+     */
+    private boolean isMerge(Equipment pe,EquipmentRunTime equipmentRunTime,ProductionProcesses process){
+        boolean jumpMark = true;
+        // 宽度余量
+        if (pe.getEquipmentParameter().getEquipmentWidth().subtract(equipmentRunTime.getTotalVolumeWidth()).compareTo(process.getVolumeWidth()) < 0) {
+            jumpMark = false;
+        }
+        // 重量余量
+        if (pe.getEquipmentParameter().getEquipmentBearing().subtract(equipmentRunTime.getTotalSinglerollweight()).compareTo(process.getSinglerollweight()) < 0) {
+            jumpMark = false;
+        }
+        return jumpMark;
+    }
+
     /**
      * 汇总所有下道工序的加工时间
      * @param nextProcess