Procházet zdrojové kódy

排程算法优化

fangpy před 1 rokem
rodič
revize
79f93fbb87

+ 105 - 3
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/listener/TaskStartTimeListener.java

@@ -477,10 +477,13 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
     }
 
     private LocalDateTime startTimeNewSet(ProductionProcesses process,ScoreDirector<ApsSolution> scoreDirector){
-        if(process.getBsProcessesId().get(0).equals("f47f18cac31045f8bb41a9d2c670bd6a")){
+        if(process.getBsProcessesId().get(0).equals("aade5e53bbee45a78cc8c3999aba8a39")){
 //            System.out.println(process);
             int a = 0;
         }
+        if(process.getId().equals("2bf2e11039234f608730ac417e53008f")){
+            int a = 0;
+        }
         // 获取所有规划实体对象数据
         ApsSolution workingSolution = scoreDirector.getWorkingSolution();
         // 时间设定
@@ -544,6 +547,9 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
                     copy.setTotalSinglerollweight(equipmentRunTime.getTotalSinglerollweight());
                     copy.setOccupyType(equipmentRunTime.getOccupyType());
                     copy.setLocked(true);
+                    copy.setSeriesProduceMark(equipmentRunTime.getSeriesProduceMark());
+                    copy.setCutfinishmin(equipmentRunTime.getCutfinishmin() == null ? 0 : equipmentRunTime.getCutfinishmin());
+                    copy.setPrepressworkmin(equipmentRunTime.getPrepressworkmin() == null ? 0 : equipmentRunTime.getPrepressworkmin());
                     equipmentRunTimes.add(copy);
                 }
             }
@@ -624,7 +630,8 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
             equipmentRunTimes.sort(Comparator.comparing(EquipmentRunTime::getStartRunTime));
             // 有交叉的时间直接跳过,退火工序特殊处理
             if(equipmentRunTimes.size()>0){
-                for (EquipmentRunTime equipmentRunTime : equipmentRunTimes) {
+                for(int i = 0; i < equipmentRunTimes.size(); i++){
+                    EquipmentRunTime equipmentRunTime = equipmentRunTimes.get(i);
                     // 退火工序
                     if(process.getProcessType().equals("成退") || process.getProcessType().equals("中退")){
                         // 没有交叉直接跳过
@@ -705,7 +712,66 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
                             }*/
                         }
                     }
-                    // 非退火工序
+                    // 冷轧工序
+                    else if (process.getProcessType().equals("冷轧")) {
+                        // 首个占用时间
+                        if(i == 0){
+                            if(proEndTime.compareTo(equipmentRunTime.getStartRunTime())<0){
+                                boolean preseries = seriesLz(equipmentRunTime, process, 1);
+                                // 连续
+                                if(preseries){
+                                    break;
+                                }
+                                // 不连续需要考虑上机准备时间和下机收尾时间
+                                else{
+                                    if(proEndTime.plusMinutes(process.getCutfinishmin()).plusMinutes(equipmentRunTime.getPrepressworkmin()).compareTo(equipmentRunTime.getStartRunTime())<0){
+                                        break;
+                                    }else{
+                                        continue;
+                                    }
+                                }
+                            }else{
+                                continue;
+                            }
+                        }
+                        // 最后一个占用时间
+                        else if (i == equipmentRunTimes.size()-1) {
+                            if(equipmentRunTime.getEndRunTime().compareTo(proStartTime)>0){
+                                proStartTime = equipmentRunTime.getEndRunTime().plusMinutes(1);
+                            }
+                            boolean preseries = seriesLz(equipmentRunTime, process, -1);
+                            if(!preseries){
+                                proStartTime = proStartTime.plusMinutes(equipmentRunTime.getCutfinishmin()).plusMinutes(process.getPrepressworkmin());
+                            }
+                            proEndTime = proStartTime.plusMinutes(process.getProduceTime());
+                        }
+                        // 其它情况
+                        else{
+                            EquipmentRunTime nextEquipmentRunTime = equipmentRunTimes.get(i+1);
+                            if(nextEquipmentRunTime.getStartRunTime().compareTo(proEndTime)>0){
+                                boolean preseries = seriesLz(equipmentRunTime, process, -1);
+                                boolean nextseries = seriesLz(nextEquipmentRunTime, process, 1);
+                                LocalDateTime preEndTime = equipmentRunTime.getEndRunTime().plusMinutes(1);
+                                if(!preseries){
+                                    preEndTime = preEndTime.plusMinutes(equipmentRunTime.getCutfinishmin()).plusMinutes(process.getPrepressworkmin());
+                                }
+                                LocalDateTime nextEndTime = preEndTime.plusMinutes(process.getProduceTime());
+                                if(!nextseries){
+                                    nextEndTime = nextEndTime.plusMinutes(process.getCutfinishmin()).plusMinutes(nextEquipmentRunTime.getPrepressworkmin());
+                                }
+                                if(nextEndTime.compareTo(nextEquipmentRunTime.getStartRunTime())<0){
+                                    proStartTime = preEndTime;
+                                    proEndTime = proStartTime.plusMinutes(process.getProduceTime());
+                                    break;
+                                }else{
+                                    continue;
+                                }
+                            }else{
+                                continue;
+                            }
+                        }
+                    }
+                    // 其它工序
                     else{
                         if(proStartTime.compareTo(equipmentRunTime.getEndRunTime())>0 || proEndTime.compareTo(equipmentRunTime.getStartRunTime())<0){
                             continue;
@@ -722,6 +788,42 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
         return toUpdateStartTime;
     }
 
+    /**
+     *
+     * @param equipmentRunTime
+     * @param process
+     * @param isBefore -1:equipmentRunTime在process之前,1:equipmentRunTime在process之后
+     */
+    private boolean seriesLz(EquipmentRunTime equipmentRunTime,ProductionProcesses process,Integer isBefore){
+        boolean isSeriesLz = true;
+        String[] serspre = null;String[] sersafter = null;
+        if(isBefore == -1){
+            serspre = equipmentRunTime.getSeriesProduceMark().split("\\^_\\^");
+            sersafter = process.getSeriesProduceMark().split("\\^_\\^");
+        }else {
+            serspre = process.getSeriesProduceMark().split("\\^_\\^");
+            sersafter = equipmentRunTime.getSeriesProduceMark().split("\\^_\\^");
+        }
+        if(serspre.length == 5 && sersafter.length == 5){
+            if(!serspre[0].equals(sersafter[0]) || !serspre[1].equals(sersafter[1])){
+                isSeriesLz = false;
+            }else{
+                String s1 = serspre[2];
+                String s2 = sersafter[2];
+                try{
+                    BigDecimal i1 = new BigDecimal(s1);
+                    BigDecimal i2 = new BigDecimal(s2);
+                    if(i1.compareTo(i2)<0){
+                        isSeriesLz = false;
+                    }
+                }catch (Exception e){
+                    e.printStackTrace();
+                }
+            }
+        }
+        return isSeriesLz;
+    }
+
     /**
      * 判断当前设备时间段是否可以合并退火当前工序
      * @param pe

+ 1 - 0
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/service/impl/ProductionScheduleServiceImpl.java

@@ -132,6 +132,7 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
             productionProcesses.setPreviousProcesses(null);
             productionProcesses.setNextProcesses(null);
             productionProcesses.getEquipment().setProcessesList(null);
+            productionProcesses.getEquipment().setEquipmentRunTimes(null);
             productionProcesses.setPreviousStep(null);
             productionProcesses.setOptionalProviderEquipments(null);
             // 冲突约束补充处理