Ver Fonte

排程算法优化

fangpy há 1 ano atrás
pai
commit
6579a55b9d

+ 10 - 6
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/domain/ProductionProcesses.java

@@ -337,12 +337,16 @@ public class ProductionProcesses implements Serializable {
             }
         }*/
         Integer maxDelay = 1;
-        if(this.processType.equals("成退") || this.processType.equals("中退")){
-            maxDelay = 2000;
-        }else if(this.processType.equals("冷轧") || this.processType.equals("铸轧")){
-            maxDelay = 500;
-        }else{
-            maxDelay = 500;
+        if(!this.ifLock){
+            if(this.processType.equals("成退") || this.processType.equals("中退")){
+                maxDelay = 2000;
+            }else if(this.processType.equals("铸轧")){
+                maxDelay = 500;
+            } else if (this.processType.equals("冷轧")) {
+                maxDelay = 2000;
+            } else{
+                maxDelay = 500;
+            }
         }
         return ValueRangeFactory.createIntValueRange(0, maxDelay);
     }

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

@@ -89,9 +89,6 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
      */
     private void setNextAllStartTime(ScoreDirector<ApsSolution> scoreDirector,ProductionProcesses process){
         if(process.getEquipment() != null){
-            /*if(process.getId().equals("abdcff89d0164cd5a2b57e1bfaf3bc1d")){
-                process.getId();
-            }*/
             LocalDateTime startDateTime = startTimeNewSet(process,scoreDirector);
 
             // 随机延时时间处理
@@ -100,7 +97,7 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
             } else if (process.getProcessType().equals("铸轧")) {
                 startDateTime = startDateTime.plusMinutes(process.getDelay() * 10);
             } else if (process.getProcessType().equals("冷轧")) {
-                startDateTime = startDateTime.plusMinutes(process.getDelay() * 10);
+                startDateTime = startDateTime.plusMinutes(process.getDelay() * 11);
             } else{
                 startDateTime = startDateTime.plusMinutes(process.getDelay() * 10);
             }
@@ -760,6 +757,9 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
                                     nextEndTime = nextEndTime.plusMinutes(process.getCutfinishmin()).plusMinutes(nextEquipmentRunTime.getPrepressworkmin());
                                 }
                                 if(nextEndTime.compareTo(nextEquipmentRunTime.getStartRunTime())<0){
+                                    if(process.getId().equals("e97b957aba5342a880abf697683b2380")){
+                                        process.getId();
+                                    }
                                     proStartTime = preEndTime;
                                     proEndTime = proStartTime.plusMinutes(process.getProduceTime());
                                     break;

+ 29 - 0
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/score/ApsConstraintProvider.java

@@ -414,6 +414,35 @@ public class ApsConstraintProvider implements ConstraintProvider {
                             }
                         }
                     }
+                    /*if(productionProcesses.getMaxWaitTime() != null && productionProcesses.getMaxWaitTime()>0){
+                        if(productionProcesses.getNextProcesses() != null && productionProcesses.getNextProcesses().size()>0){
+                            for (ProductionProcesses nextProcess : productionProcesses.getNextProcesses()) {
+                                if(nextProcess.getEquipment() != null && nextProcess.getStartTime() != null){
+                                    // 流转时间(最小等待时间)
+                                    Integer lzTimes = 0;
+                                    if(productionProcesses.getEquipment().getWorkshopid() != null && productionProcesses.getEquipment().getWorkshopid().equals(nextProcess.getEquipment().getWorkshopid())){
+                                        lzTimes = nextProcess.getApsOverallConfig().getRoamTime().get("WORKSHOP_IN");
+                                    }else{
+                                        lzTimes = nextProcess.getApsOverallConfig().getRoamTime().get("WORKSHOP_CROSS");
+                                    }
+                                    // 最小等待时间对比流转时间
+                                    if(productionProcesses.getMinWaitTime() != null && lzTimes<productionProcesses.getMinWaitTime()){
+                                        lzTimes = productionProcesses.getMinWaitTime();
+                                    }
+                                    // 最大等待时间
+                                    Integer maxWaitTime = productionProcesses.getMaxWaitTime();
+                                    if(nextProcess.getStartTime().compareTo(productionProcesses.getEndTime().plusMinutes(lzTimes))<0){
+                                        bln = true;
+                                    }
+                                    if(maxWaitTime != null && maxWaitTime>0){
+                                        if(nextProcess.getStartTime().compareTo(productionProcesses.getEndTime().plusMinutes(maxWaitTime))>0){
+                                            bln = true;
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }*/
                     return bln;
                 })
                 .penalize(HardMediumSoftScore.ONE_HARD,(productionProcesses) -> 40)

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

@@ -130,23 +130,12 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
         productionScheduleRetVo.setScoreResult(scoreManager.explain(solvedBalance).toString());
         // 得分分析
         softExplain(explain,solvedBalance.getProcessesList());
-        productionScheduleRetVo.setProcesses(solvedBalance.getProcessesList());
         // 最大等待时间冲突手动解决
         List<ProductionProcesses> maxSetPros = new ArrayList<>();
         for (ProductionProcesses productionProcesses : solvedBalance.getProcessesList()) {
             if(productionProcesses.getConflictDes() != null && "开工时间超出上道工序作业最大等待时间限制".equals(productionProcesses.getConflictDes())){
-                ProductionProcesses newPre = maxWaitTimeCheck(productionProcesses, maxSetPros,solvedBalance.getProcessesList());
+                ProductionProcesses newPre = maxWaitTimeCheck(productionProcesses, maxSetPros,solvedBalance.getProcessesList(),solvedBalance.getEquipmentList());
                 if(newPre != null){
-                    /*ProductionProcesses preProcess = productionProcesses.getPreviousProcesses().get(0);
-                    EquipmentRunTime copy = new EquipmentRunTime();
-                    copy.setStartRunTime(preProcess.getStartTime());
-                    copy.setEndRunTime(preProcess.getEndTime());
-                    copy.setOccupyType("temporaryProcess");
-                    copy.setLocked(true);
-                    copy.setSeriesProduceMark(preProcess.getSeriesProduceMark());
-                    copy.setCutfinishmin(preProcess.getCutfinishmin() == null ? 0 : preProcess.getCutfinishmin());
-                    copy.setPrepressworkmin(preProcess.getPrepressworkmin() == null ? 0 : preProcess.getPrepressworkmin());
-                    productionProcesses.getPreviousProcesses().get(0).getEquipment().getEquipmentRunTimes().add(copy);*/
                     // 冲突信息处理
                     productionProcesses.setConflictDes(productionProcesses.getConflictDes().replaceAll("开工时间超出上道工序作业最大等待时间限制",""));
                     if(StrUtil.isBlank(productionProcesses.getConflictDes()) && StrUtil.isBlank(productionProcesses.getSoftconflictdes())){
@@ -161,15 +150,30 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
                 for (ProductionProcesses productionProcesses : solvedBalance.getProcessesList()) {
                     if(productionProcesses.getId().equals(maxSetPro.getId())){
                         productionProcesses.setStartTime(maxSetPro.getStartTime());
+                        productionProcesses.setEquipment(maxSetPro.getEquipment());
                     }
                 }
             }
         }
+
+        /*SolverFactory<ApsSolution> solverFactory1 = SolverFactory.create(new SolverConfig()
+                        .withEnvironmentMode(mode)
+                        .withSolutionClass(ApsSolution.class)
+                        .withEntityClasses(ProductionProcesses.class)
+                        .withConstraintProviderClass(ApsConstraintProvider.class)
+                        .withTerminationSpentLimit(Duration.ofSeconds(120))
+                        .withMoveThreadCount(cores)
+        );
+        Solver<ApsSolution> solver1 = solverFactory1.buildSolver();
+        apsSolution.setProcessesList(solvedBalance.getProcessesList());
+        solvedBalance = solver1.solve(apsSolution);*/
         log.info("**************排程最终评分分析***************");
         ScoreExplanation<ApsSolution, HardSoftScore> explain1 = scoreManager.explain(solvedBalance);
         log.info(explain1.toString());
         log.info("**************排程最终评分分析***************");
+        softExplain(explain1,solvedBalance.getProcessesList());
 
+        productionScheduleRetVo.setProcesses(solvedBalance.getProcessesList());
         // 循环引用ProductionProcesses置空
         for (ProductionProcesses productionProcesses : solvedBalance.getProcessesList()) {
             productionProcesses.setPreviousProcesses(null);
@@ -206,91 +210,138 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
         return productionScheduleRetVo;
     }
 
-    private ProductionProcesses maxWaitTimeCheck(ProductionProcesses process,List<ProductionProcesses> maxSetPros,List<ProductionProcesses> processes){
+    private ProductionProcesses maxWaitTimeCheck(ProductionProcesses process,List<ProductionProcesses> maxSetPros,List<ProductionProcesses> processes,List<Equipment> equipments){
         ProductionProcesses newPre = null;
         List<ProductionProcesses> previousProcesses = process.getPreviousProcesses();
         if(previousProcesses != null){
             ProductionProcesses preProcess = previousProcesses.get(0);
-            // 当前工序设备已占用时间
-            List<EquipmentRunTime> equipmentRunTimes = new ArrayList<>();
-            List<EquipmentRunTime> equipmentRunTimesAll = new ArrayList<>();
-            if(preProcess.getEquipment().getEquipmentRunTimes() != null && preProcess.getEquipment().getEquipmentRunTimes().size()>0){
-                // 过滤最大等待时间范围内的占用时间段
-                List<EquipmentRunTime> maxWaitRunTimes = new ArrayList<>();
-                for (int i = 0;i<preProcess.getEquipment().getEquipmentRunTimes().size();i++) {
-                    EquipmentRunTime equipmentRunTime = preProcess.getEquipment().getEquipmentRunTimes().get(i);
+            if(!preProcess.getProcessType().equals("成退") && !preProcess.getProcessType().equals("中退")){
+                if(process.getId().equals("2294c17bb20549d28cbe9af149669988") || process.getId().equals("e23ea38146fb4f7bbb4a042c9a84dcba")){
+                    int a = 0;
+                }
+                Equipment equipment = preProcess.getEquipment();
+                newPre = maxWaitSet(equipment, process, processes, preProcess);
+                if(newPre == null){
+                    for (Equipment equipment1 : equipments) {
+                        if(preProcess.getOptionalEquipments().contains(equipment1.getId()) && !equipment1.getId().equals(equipment.getId())){
+                            newPre = maxWaitSet(equipment1, process, processes, preProcess);
+                            if(newPre != null){
+                                break;
+                            }
+                        }
+                    }
+                }
+                if(newPre != null){
+                    preProcess.setStartTime(newPre.getStartTime());
+                    preProcess.setIfLock(false);
+                    preProcess.setEquipment(newPre.getEquipment());
+                    preProcess.setIfLock(true);
+                    maxSetPros.add(newPre);
+                }
+            }
+        }
+        return newPre;
+    }
+
+    private ProductionProcesses maxWaitSet(Equipment equipment,ProductionProcesses process,List<ProductionProcesses> processes,ProductionProcesses preProcess){
+        ProductionProcesses newPre = null;
+        Boolean hasSet = false;
+        // 最小等待时间
+        Integer lzTimes = 0;
+        if(equipment.getWorkshopid() != null && equipment.getWorkshopid().equals(process.getEquipment().getWorkshopid())){
+            lzTimes = process.getApsOverallConfig().getRoamTime().get("WORKSHOP_IN");
+        }else{
+            lzTimes = process.getApsOverallConfig().getRoamTime().get("WORKSHOP_CROSS");
+        }
+        // 最小等待时间对比流转时间
+        if(preProcess.getMinWaitTime() != null && lzTimes<preProcess.getMinWaitTime()){
+            lzTimes = preProcess.getMinWaitTime();
+        }
+        LocalDateTime proStartTime = preProcess.getStartTime();
+        LocalDateTime proEndTime = preProcess.getEndTime();
+        List<EquipmentRunTime> equipmentRunTimesSource = equipment.getEquipmentRunTimes();
+        // 当前工序设备已占用时间
+        List<EquipmentRunTime> equipmentRunTimes = new ArrayList<>();
+        List<EquipmentRunTime> equipmentRunTimesAll = new ArrayList<>();
+        if(equipmentRunTimesSource != null && equipmentRunTimesSource.size()>0){
+            // 过滤最大等待时间范围内的占用时间段
+            for (int i = 0;i<equipmentRunTimesSource.size();i++) {
+                EquipmentRunTime equipmentRunTime = equipmentRunTimesSource.get(i);
+                EquipmentRunTime copy = new EquipmentRunTime();
+                copy.setStartRunTime(equipmentRunTime.getStartRunTime());
+                copy.setEndRunTime(equipmentRunTime.getEndRunTime());
+                copy.setTotalVolumeWidth(equipmentRunTime.getTotalVolumeWidth());
+                copy.setTotalSinglerollweight(equipmentRunTime.getTotalSinglerollweight());
+                copy.setOccupyType("temporaryProcess");
+                copy.setLocked(true);
+                copy.setSeriesProduceMark(equipmentRunTime.getSeriesProduceMark());
+                copy.setCutfinishmin(equipmentRunTime.getCutfinishmin() == null ? 0 : equipmentRunTime.getCutfinishmin());
+                copy.setPrepressworkmin(equipmentRunTime.getPrepressworkmin() == null ? 0 : equipmentRunTime.getPrepressworkmin());
+                equipmentRunTimesAll.add(copy);
+            }
+        }
+        // 过滤当前排序的作业占用时间段
+        if(processes != null && processes.size()>0){
+            for (int i = 0;i<processes.size();i++) {
+                ProductionProcesses productionProcesses = processes.get(i);
+                if(productionProcesses.getEquipmentId().equals(equipment.getId())){
                     EquipmentRunTime copy = new EquipmentRunTime();
-                    copy.setStartRunTime(equipmentRunTime.getStartRunTime());
-                    copy.setEndRunTime(equipmentRunTime.getEndRunTime());
-                    copy.setTotalVolumeWidth(equipmentRunTime.getTotalVolumeWidth());
-                    copy.setTotalSinglerollweight(equipmentRunTime.getTotalSinglerollweight());
+                    copy.setStartRunTime(productionProcesses.getStartTime());
+                    copy.setEndRunTime(productionProcesses.getEndTime());
+                    copy.setTotalVolumeWidth(productionProcesses.getVolumeWidth());
+                    copy.setTotalSinglerollweight(productionProcesses.getSinglerollweight());
                     copy.setOccupyType("temporaryProcess");
                     copy.setLocked(true);
-                    copy.setSeriesProduceMark(equipmentRunTime.getSeriesProduceMark());
-                    copy.setCutfinishmin(equipmentRunTime.getCutfinishmin() == null ? 0 : equipmentRunTime.getCutfinishmin());
-                    copy.setPrepressworkmin(equipmentRunTime.getPrepressworkmin() == null ? 0 : equipmentRunTime.getPrepressworkmin());
+                    copy.setSeriesProduceMark(productionProcesses.getSeriesProduceMark());
+                    copy.setCutfinishmin(productionProcesses.getCutfinishmin() == null ? 0 : productionProcesses.getCutfinishmin());
+                    copy.setPrepressworkmin(productionProcesses.getPrepressworkmin() == null ? 0 : productionProcesses.getPrepressworkmin());
                     equipmentRunTimesAll.add(copy);
                 }
             }
-            // 过滤当前排序的作业占用时间段
-            if(processes != null && processes.size()>0){
-                for (int i = 0;i<processes.size();i++) {
-                    ProductionProcesses productionProcesses = processes.get(i);
-                    if(productionProcesses.getEquipmentId().equals(preProcess.getEquipmentId())){
-                        EquipmentRunTime copy = new EquipmentRunTime();
-                        copy.setStartRunTime(productionProcesses.getStartTime());
-                        copy.setEndRunTime(productionProcesses.getEndTime());
-                        copy.setTotalVolumeWidth(productionProcesses.getVolumeWidth());
-                        copy.setTotalSinglerollweight(productionProcesses.getSinglerollweight());
-                        copy.setOccupyType("temporaryProcess");
-                        copy.setLocked(true);
-                        copy.setSeriesProduceMark(productionProcesses.getSeriesProduceMark());
-                        copy.setCutfinishmin(productionProcesses.getCutfinishmin() == null ? 0 : productionProcesses.getCutfinishmin());
-                        copy.setPrepressworkmin(productionProcesses.getPrepressworkmin() == null ? 0 : productionProcesses.getPrepressworkmin());
-                        equipmentRunTimesAll.add(copy);
-                    }
-                }
-            }
-            // 按照开始时间排序
-            equipmentRunTimesAll.sort(Comparator.comparing(EquipmentRunTime::getStartRunTime));
-            EquipmentRunTime minRunTime = null;
-            EquipmentRunTime maxRunTime = null;
-            for (EquipmentRunTime equipmentRunTime : equipmentRunTimesAll) {
-                if(equipmentRunTime.getEndRunTime().compareTo(process.getStartTime())<=0
-                        && equipmentRunTime.getStartRunTime().compareTo(process.getStartTime().plusMinutes(-preProcess.getMaxWaitTime()))>=0){
-                    equipmentRunTimes.add(equipmentRunTime);
-                }else{
-                    if(equipmentRunTime.getStartRunTime().compareTo(process.getStartTime().plusMinutes(-preProcess.getMaxWaitTime()))<0){
-                        if(minRunTime == null){
+        }
+        // 按照开始时间排序
+        equipmentRunTimesAll.sort(Comparator.comparing(EquipmentRunTime::getStartRunTime));
+        EquipmentRunTime minRunTime = null;
+        EquipmentRunTime maxRunTime = null;
+        for (EquipmentRunTime equipmentRunTime : equipmentRunTimesAll) {
+            if(equipmentRunTime.getEndRunTime().compareTo(process.getStartTime().plusMinutes(-lzTimes))<=0
+                    && equipmentRunTime.getStartRunTime().compareTo(process.getStartTime().plusMinutes(-preProcess.getMaxWaitTime()))>=0){
+                equipmentRunTimes.add(equipmentRunTime);
+            }else{
+                if(equipmentRunTime.getStartRunTime().compareTo(process.getStartTime().plusMinutes(-preProcess.getMaxWaitTime()))<0){
+                    if(minRunTime == null){
+                        minRunTime = equipmentRunTime;
+                    }else{
+                        if(equipmentRunTime.getStartRunTime().compareTo(minRunTime.getStartRunTime())>0){
                             minRunTime = equipmentRunTime;
-                        }else{
-                            if(equipmentRunTime.getStartRunTime().compareTo(minRunTime.getStartRunTime())>0){
-                                minRunTime = equipmentRunTime;
-                            }
                         }
+                    }
+                }else{
+                    if(maxRunTime == null){
+                        maxRunTime = equipmentRunTime;
                     }else{
-                        if(maxRunTime == null){
+                        if(equipmentRunTime.getStartRunTime().compareTo(maxRunTime.getStartRunTime())<0){
                             maxRunTime = equipmentRunTime;
-                        }else{
-                            if(equipmentRunTime.getStartRunTime().compareTo(maxRunTime.getStartRunTime())<0){
-                                maxRunTime = equipmentRunTime;
-                            }
                         }
                     }
                 }
             }
-            // 按照开始时间排序
-            equipmentRunTimes.sort(Comparator.comparing(EquipmentRunTime::getStartRunTime));
-            equipmentRunTimes.add(0,minRunTime);
-            // 当前工序最小开始时间、结束时间
-            LocalDateTime proStartTime = preProcess.getStartTime();
-            LocalDateTime proEndTime = preProcess.getEndTime();
-            // 前一道工序尝试往后挪
-            for(int i = 0; i < equipmentRunTimes.size(); i++){
-                EquipmentRunTime equipmentRunTime = equipmentRunTimes.get(i);
-                if (preProcess.getProcessType().equals("冷轧")) {
-                    // 首个占用时间
-                    if(i == 0){
+        }
+        // 按照开始时间排序
+        equipmentRunTimes.sort(Comparator.comparing(EquipmentRunTime::getStartRunTime));
+        equipmentRunTimes.add(0,minRunTime);
+
+        // 前一道工序尝试往后挪
+        for(int i = 0; i < equipmentRunTimes.size(); i++){
+            EquipmentRunTime equipmentRunTime = equipmentRunTimes.get(i);
+            if (preProcess.getProcessType().equals("冷轧")) {
+                // 首个占用时间
+                if(i == 0){
+                    if(equipmentRunTimes.size() == 1){
+                        proStartTime = process.getStartTime().plusMinutes(-preProcess.getMaxWaitTime()/2);
+                        proEndTime = proStartTime.plusMinutes(preProcess.getProduceTime());
+                        hasSet = true;
+                    }else{
                         EquipmentRunTime nextEquipmentRunTime = equipmentRunTimes.get(i+1);
                         boolean preseries = seriesLz(nextEquipmentRunTime, preProcess, 1);
                         LocalDateTime proEndTime1 = nextEquipmentRunTime.getStartRunTime().plusMinutes(-1);
@@ -299,7 +350,7 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
                             proEndTime1 = proEndTime1.plusMinutes(-preProcess.getCutfinishmin()).plusMinutes(-nextEquipmentRunTime.getPrepressworkmin());
                         }
                         LocalDateTime proStartTime1 = proEndTime1.plusMinutes(-preProcess.getProduceTime());
-                        if(proStartTime1.compareTo(process.getStartTime().plusMinutes(preProcess.getMaxWaitTime()))>0){
+                        if(proStartTime1.compareTo(process.getStartTime().plusMinutes(-preProcess.getMaxWaitTime()))>0){
                             LocalDateTime minproStartTime = proStartTime1;
                             boolean nextseries = seriesLz(equipmentRunTime, preProcess, -1);
                             if(!nextseries){
@@ -308,80 +359,118 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
                             if(minproStartTime.compareTo(equipmentRunTime.getEndRunTime())>0){
                                 proStartTime = proStartTime1;
                                 proEndTime = proEndTime1;
+                                hasSet = true;
                                 break;
                             }
                         }
                     }
-                    // 最后一个占用时间
-                    else if (i == equipmentRunTimes.size()-1) {
-                        LocalDateTime a = proStartTime;
-                        if(equipmentRunTime.getEndRunTime().compareTo(a)>0){
-                            a = equipmentRunTime.getEndRunTime().plusMinutes(1);
-                        }
+                }
+                // 最后一个占用时间
+                else if (i == equipmentRunTimes.size()-1) {
+                    LocalDateTime a = proStartTime;
+                    if(equipmentRunTime.getEndRunTime().compareTo(a)>0){
+                        a = equipmentRunTime.getEndRunTime().plusMinutes(1);
+                    }
+                    boolean preseries = seriesLz(equipmentRunTime, preProcess, -1);
+                    if(!preseries){
+                        a = a.plusMinutes(equipmentRunTime.getCutfinishmin()).plusMinutes(preProcess.getPrepressworkmin());
+                    }
+                    LocalDateTime b = a.plusMinutes(preProcess.getProduceTime());
+                    if(b.compareTo(process.getStartTime().plusMinutes(-lzTimes))<0){
+                        proStartTime = a;
+                        proEndTime = proStartTime.plusMinutes(preProcess.getProduceTime());
+                        hasSet = true;
+                    }
+                }
+                // 其它情况
+                else{
+                    EquipmentRunTime nextEquipmentRunTime = equipmentRunTimes.get(i+1);
+                    if(nextEquipmentRunTime.getStartRunTime().compareTo(proEndTime)>0){
                         boolean preseries = seriesLz(equipmentRunTime, preProcess, -1);
+                        boolean nextseries = seriesLz(nextEquipmentRunTime, preProcess, 1);
+                        LocalDateTime preEndTime = equipmentRunTime.getEndRunTime().plusMinutes(1);
                         if(!preseries){
-                            a = a.plusMinutes(equipmentRunTime.getCutfinishmin()).plusMinutes(preProcess.getPrepressworkmin());
-//                            preProcess.getConflictRoptions().put("soft-seriesProduceLz","和前一道工序违反换辊的连续约束");
-                        }else{
-//                            preProcess.getConflictRoptions().remove("soft-seriesProduceLz");
+                            preEndTime = preEndTime.plusMinutes(equipmentRunTime.getCutfinishmin()).plusMinutes(preProcess.getPrepressworkmin());
                         }
-                        LocalDateTime b = a.plusMinutes(preProcess.getProduceTime());
-                        if(b.compareTo(process.getStartTime())<0){
-                            proStartTime = a;
+                        LocalDateTime nextEndTime = preEndTime.plusMinutes(preProcess.getProduceTime());
+                        if(!nextseries){
+                            nextEndTime = nextEndTime.plusMinutes(preProcess.getCutfinishmin()).plusMinutes(nextEquipmentRunTime.getPrepressworkmin());
+                        }
+                        if(nextEndTime.compareTo(nextEquipmentRunTime.getStartRunTime())<0){
+                            proStartTime = preEndTime;
                             proEndTime = proStartTime.plusMinutes(preProcess.getProduceTime());
+                            hasSet = true;
+                            break;
+                        }else{
+                            continue;
                         }
+                    }else{
+                        continue;
                     }
-                    // 其它情况
-                    else{
+                }
+            }
+            // 其它工序
+            else{
+                // 首个占用时间
+                if(i == 0){
+                    if(equipmentRunTimes.size() == 1){
+                        proStartTime = process.getStartTime().plusMinutes(-preProcess.getMaxWaitTime()/2);
+                        proEndTime = proStartTime.plusMinutes(preProcess.getProduceTime());
+                        hasSet = true;
+                    }else{
                         EquipmentRunTime nextEquipmentRunTime = equipmentRunTimes.get(i+1);
-                        if(nextEquipmentRunTime.getStartRunTime().compareTo(proEndTime)>0){
-                            boolean preseries = seriesLz(equipmentRunTime, preProcess, -1);
-                            boolean nextseries = seriesLz(nextEquipmentRunTime, preProcess, 1);
-                            LocalDateTime preEndTime = equipmentRunTime.getEndRunTime().plusMinutes(1);
-                            if(!preseries){
-                                preEndTime = preEndTime.plusMinutes(equipmentRunTime.getCutfinishmin()).plusMinutes(preProcess.getPrepressworkmin());
-//                                preProcess.getConflictRoptions().put("soft-seriesProduceLz","和前一道工序违反换辊的连续约束");
-                            }else{
-//                                preProcess.getConflictRoptions().remove("soft-seriesProduceLz");
-                            }
-                            LocalDateTime nextEndTime = preEndTime.plusMinutes(preProcess.getProduceTime());
-                            if(!nextseries){
-                                nextEndTime = nextEndTime.plusMinutes(preProcess.getCutfinishmin()).plusMinutes(nextEquipmentRunTime.getPrepressworkmin());
-//                                preProcess.getConflictRoptions().put("soft-seriesProduceLz","和后一道工序违反换辊的连续约束");
-                            }else{
-//                                preProcess.getConflictRoptions().remove("soft-seriesProduceLz");
-                            }
-                            if(nextEndTime.compareTo(nextEquipmentRunTime.getStartRunTime())<0){
-                                proStartTime = preEndTime;
-                                proEndTime = proStartTime.plusMinutes(preProcess.getProduceTime());
+                        LocalDateTime proEndTime1 = nextEquipmentRunTime.getStartRunTime().plusMinutes(-1);
+                        LocalDateTime proStartTime1 = proEndTime1.plusMinutes(-preProcess.getProduceTime());
+                        if(proStartTime1.compareTo(process.getStartTime().plusMinutes(-preProcess.getMaxWaitTime()))>0){
+                            LocalDateTime minproStartTime = proStartTime1;
+                            if(minproStartTime.compareTo(equipmentRunTime.getEndRunTime())>0){
+                                proStartTime = proStartTime1;
+                                proEndTime = proEndTime1;
+                                hasSet = true;
                                 break;
-                            }else{
-                                continue;
                             }
-                        }else{
-                            continue;
                         }
                     }
                 }
-                // 其它工序
+                // 最后一个占用时间
+                else if (i == equipmentRunTimes.size()-1) {
+                    LocalDateTime a = proStartTime;
+                    if(equipmentRunTime.getEndRunTime().compareTo(a)>0){
+                        a = equipmentRunTime.getEndRunTime().plusMinutes(1);
+                    }
+                    LocalDateTime b = a.plusMinutes(preProcess.getProduceTime());
+                    if(b.compareTo(process.getStartTime().plusMinutes(-lzTimes))<0){
+                        proStartTime = a;
+                        proEndTime = proStartTime.plusMinutes(preProcess.getProduceTime());
+                        hasSet = true;
+                    }
+                }
+                // 其它情况
                 else{
-                    if(proStartTime.compareTo(equipmentRunTime.getEndRunTime())>0 || proEndTime.compareTo(equipmentRunTime.getStartRunTime())<0){
-                        continue;
+                    EquipmentRunTime nextEquipmentRunTime = equipmentRunTimes.get(i+1);
+                    if(nextEquipmentRunTime.getStartRunTime().compareTo(proEndTime)>0){
+                        LocalDateTime preEndTime = equipmentRunTime.getEndRunTime().plusMinutes(1);
+                        LocalDateTime nextEndTime = preEndTime.plusMinutes(preProcess.getProduceTime());
+                        if(nextEndTime.compareTo(nextEquipmentRunTime.getStartRunTime())<0){
+                            proStartTime = preEndTime;
+                            proEndTime = proStartTime.plusMinutes(preProcess.getProduceTime());
+                            hasSet = true;
+                            break;
+                        }else{
+                            continue;
+                        }
                     }else{
-                        proStartTime = equipmentRunTime.getEndRunTime().plusMinutes(1);
-                        proEndTime = proStartTime.plusMinutes(preProcess.getProduceTime());
+                        continue;
                     }
                 }
             }
-            if(proStartTime.compareTo(preProcess.getStartTime()) > 0){
-                preProcess.setStartTime(proStartTime);
-                newPre = new ProductionProcesses();
-                newPre.setId(preProcess.getId());
-                newPre.setStartTime(proStartTime);
-                newPre.setEndTime(proEndTime);
-                maxSetPros.add(newPre);
-                System.out.println(preProcess.getId() + ":" + proStartTime);
-            }
+        }
+        if(hasSet){
+            newPre = new ProductionProcesses();
+            newPre.setId(preProcess.getId());
+            newPre.setStartTime(proStartTime);
+            newPre.setEndTime(proEndTime);
+            newPre.setEquipment(equipment);
         }
         return newPre;
     }