fangpy 1 年間 前
コミット
9824531591

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

@@ -330,9 +330,9 @@ public class ProductionProcesses implements Serializable {
             }
         }*/
         Integer maxDelay = 1;
-        if(this.processType.equals("成退") || this.processType.equals("中退") || this.processType.equals("铸轧")){
-            maxDelay = 100;
-        }else if(this.processType.equals("冷轧")){
+        if(this.processType.equals("成退") || this.processType.equals("中退")){
+            maxDelay = 500;
+        }else if(this.processType.equals("冷轧") || this.processType.equals("铸轧")){
             maxDelay = 100;
         }else{
             maxDelay = 100;

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

@@ -96,7 +96,7 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
             // 随机延时时间处理
             if(process.getProcessType().equals("成退") || process.getProcessType().equals("中退")
                     || process.getProcessType().equals("铸轧")){
-                startDateTime = startDateTime.plusMinutes(process.getDelay() * 60);
+                startDateTime = startDateTime.plusMinutes(process.getDelay() * 10);
             } else if (process.getProcessType().equals("冷轧")) {
                 startDateTime = startDateTime.plusMinutes(process.getDelay() * 30);
             } else{
@@ -536,11 +536,11 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
                 allProcessesList = workingSolution.getStepBestProcessesList();
             }
             List<ProductionProcesses> filterProcess = null;
-            if(process.getProcessType().equals("成退") || process.getProcessType().equals("中退")){
+            /*if(process.getProcessType().equals("成退") || process.getProcessType().equals("中退")){
                 filterProcess = allProcessesList.stream().filter(v -> {
                     return v.getEquipment() != null && v.getEquipment().getId().equals(pe.getId()) && v.getStartTime() != null && !v.getId().equals(process.getId());
                 }).sorted(Comparator.comparing(ProductionProcesses::getProduceTime)).collect(Collectors.toList());
-            }
+            }*/
 
             /*if(process.getId().equals("066e031c712848bd8d40f5a3ae19d5f5")){
                 int i = workingSolution.getScore().initScore();
@@ -608,10 +608,72 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
                 for (EquipmentRunTime equipmentRunTime : equipmentRunTimes) {
                     // 退火工序
                     if(process.getProcessType().equals("成退") || process.getProcessType().equals("中退")){
+                        // 没有交叉直接跳过
                         if(equipmentRunTime.getEndRunTime().compareTo(proStartTime)<=0 || equipmentRunTime.getStartRunTime().compareTo(proEndTime)>=0){
                             continue;
                         }else{
-                            if((equipmentRunTime.getStartRunTime().compareTo(proStartTime)<=0 && equipmentRunTime.getEndRunTime().compareTo(proEndTime)>=0)
+                            /*boolean isJump = true;
+                            // 待排程工序开始时间大于当前占用工序开始时间
+                            if(equipmentRunTime.getStartRunTime().compareTo(proStartTime)<0){
+                                List<ProductionProcesses> runPro = filterProcess.stream().filter(v -> v.getStartTime().compareTo(equipmentRunTime.getStartRunTime()) == 0).collect(Collectors.toList());
+                                Boolean hasMerge = false;
+                                if(runPro != null && runPro.size()>0){
+                                    BigDecimal equipmentWidth = pe.getEquipmentParameter().getEquipmentWidth();
+                                    BigDecimal equipmentBearing = pe.getEquipmentParameter().getEquipmentBearing();
+
+                                    BigDecimal totalWidth = process.getVolumeWidth();
+                                    BigDecimal totalBearing = process.getSinglerollweight();
+                                    for (ProductionProcesses productionProcesses : runPro) {
+                                        if(productionProcesses.getPreviousProcesses() == null){
+                                            continue;
+                                        }
+                                        ProductionProcesses preRunPro = productionProcesses.getPreviousProcesses().get(0);
+                                        boolean a = true;
+                                        if(preRunPro.getMaxWaitTime() != null && preRunPro.getMaxWaitTime()>0){
+                                            if(preRunPro.getEndTime().plusMinutes(preRunPro.getMaxWaitTime()).compareTo(proStartTime)<=0){
+                                                a = false;
+                                            }
+                                        }
+                                        if(a){
+                                            if(totalWidth.add(productionProcesses.getVolumeWidth()).compareTo(equipmentWidth)<0
+                                                    && totalBearing.add(productionProcesses.getSinglerollweight()).compareTo(equipmentBearing)<0){
+                                                hasMerge = true;
+                                                scoreDirector.beforeVariableChanged(process, "startTime");
+                                                productionProcesses.setStartTime(proStartTime);
+                                                scoreDirector.afterVariableChanged(process, "startTime");
+                                                if(productionProcesses.getNextProcesses() != null && productionProcesses.getNextProcesses().size()>0){
+                                                    for (ProductionProcesses nextProcess : productionProcesses.getNextProcesses()) {
+                                                        setNextAllStartTime(scoreDirector,nextProcess);
+                                                    }
+                                                }
+                                                totalWidth = totalWidth.add(productionProcesses.getVolumeWidth());
+                                                totalBearing = totalBearing.add(productionProcesses.getSinglerollweight());
+                                            }
+                                        }
+                                    }
+                                }
+                                if(!hasMerge){
+                                    proStartTime = equipmentRunTime.getEndRunTime().plusMinutes(1);
+                                }
+                            }
+                            // 待排程工序开始时间小于当前占用工序开始时间
+                            else if (equipmentRunTime.getStartRunTime().compareTo(proStartTime)>0) {
+                                boolean merge = isMerge(pe, equipmentRunTime, process);
+                                if(merge){
+                                    proStartTime = equipmentRunTime.getStartRunTime();
+                                }else{
+                                    proStartTime = equipmentRunTime.getEndRunTime().plusMinutes(1);
+                                }
+                            }
+                            // 待排程工序开始时间等于当前占用工序开始时间
+                            else{
+                                boolean merge = isMerge(pe, equipmentRunTime, process);
+                                if(!merge){
+                                    proStartTime = equipmentRunTime.getEndRunTime().plusMinutes(1);
+                                }
+                            }*/
+
+                            /*if((equipmentRunTime.getStartRunTime().compareTo(proStartTime)<=0 && equipmentRunTime.getEndRunTime().compareTo(proEndTime)>=0)
                                     || (equipmentRunTime.getStartRunTime().compareTo(proStartTime)>=0 && equipmentRunTime.getEndRunTime().compareTo(proEndTime)<=0)){
                                 boolean merge = isMerge(pe, equipmentRunTime, process);
                                 if(merge){
@@ -621,7 +683,7 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
                                 }
                             }else{
                                 proStartTime = equipmentRunTime.getEndRunTime().plusMinutes(1);
-                            }
+                            }*/
                         }
                     }
                     // 非退火工序

+ 38 - 10
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/score/ApsConstraintProvider.java

@@ -37,7 +37,7 @@ public class ApsConstraintProvider implements ConstraintProvider {
                 deliveryDate(constraintFactory),
                 seriesProduce(constraintFactory),
                 seriesProduceWashingFurnace(constraintFactory),
-                mergeTuihuo(constraintFactory),
+//                mergeTuihuo(constraintFactory),
                 sameEquipment(constraintFactory),
 
                 sameProcessSeries(constraintFactory),
@@ -574,6 +574,7 @@ public class ApsConstraintProvider implements ConstraintProvider {
                             }
                             pp.setProcessType(equipmentRunTime.getProcessType());
                             pp.setApsOverallConfig(hasStartTimeProcess.get(0).getApsOverallConfig());
+                            pp.setConflictRoptions(new HashMap<>());
                             hasStartTimeProcess.add(pp);
                         }
                     }
@@ -618,6 +619,11 @@ public class ApsConstraintProvider implements ConstraintProvider {
                         if(!processes.get(0).getProcessType().equals("铸轧") && !processes.get(0).getProcessType().equals("冷轧")){
                             return false;
                         }
+                        for (ProductionProcesses process : processes) {
+                            if(process.getConflictRoptions().containsKey("hard-seriesProduceTimeWait")){
+                                process.getConflictRoptions().remove("hard-seriesProduceTimeWait");
+                            }
+                        }
                     }
                     int counNum = seriesProduceTimeWaitCount(processes);
                     if(counNum>0){
@@ -655,6 +661,7 @@ public class ApsConstraintProvider implements ConstraintProvider {
                 pp.setPrepressworkmin(equipmentRunTime.getPrepressworkmin() == null ? 0 : equipmentRunTime.getPrepressworkmin());
                 pp.setCutfinishmin(equipmentRunTime.getCutfinishmin() == null ? 0 : equipmentRunTime.getCutfinishmin());
                 pp.setApsOverallConfig(hasStartTimeProcess.get(0).getApsOverallConfig());
+                pp.setConflictRoptions(new HashMap<>());
                 hasStartTimeProcess.add(pp);
             }
         }
@@ -668,9 +675,17 @@ public class ApsConstraintProvider implements ConstraintProvider {
             pp.setCutfinishmin(equipment.getLastProcessCutfinishmin() == null ? 0 : equipment.getLastProcessCutfinishmin());
             pp.setEndTime(equipment.getLastProcessEndTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime());
             pp.setApsOverallConfig(hasStartTimeProcess.get(0).getApsOverallConfig());
+            pp.setConflictRoptions(new HashMap<>());
             hasStartTimeProcess.add(0,pp);
         }
         for(int i=0;i<hasStartTimeProcess.size()-1;i++){
+            if(hasStartTimeProcess.get(i).getId() == null && hasStartTimeProcess.get(i).getId() == null){
+                continue;
+            }
+            ProductionProcesses prePro = hasStartTimeProcess.get(i);
+            ProductionProcesses nextPro = hasStartTimeProcess.get(i+1);
+            Map<String, String> conflictRoptions1 = prePro.getConflictRoptions();
+            Map<String, String> conflictRoptions2 = nextPro.getConflictRoptions();
             if(hasStartTimeProcess.get(i).getSeriesProduceMark() != null && hasStartTimeProcess.get(i+1).getSeriesProduceMark() != null){
                 if("铸轧".equals(hasStartTimeProcess.get(i).getProcessType())){
                     if(!hasStartTimeProcess.get(i).getSeriesProduceMark().equals(hasStartTimeProcess.get(i+1).getSeriesProduceMark())){
@@ -690,6 +705,8 @@ public class ApsConstraintProvider implements ConstraintProvider {
                             if(!serspre[0].equals(sersafter[0]) || !serspre[1].equals(sersafter[1])){
                                 if(hasStartTimeProcess.get(i).getEndTime().plusMinutes(maxTime).compareTo(hasStartTimeProcess.get(i+1).getStartTime())>0){
                                     b++;
+                                    conflictRoptions1.put("hard-seriesProduceTimeWait","和下道工序没有预留足够的换辊和立板时间");
+                                    conflictRoptions2.put("hard-seriesProduceTimeWait","和上道工序没有预留足够的换辊和立板时间");
                                 }
                             }else{
                                 // 合金相同情况下后面的宽度大于前面的宽度需要换辊和立板
@@ -703,10 +720,14 @@ public class ApsConstraintProvider implements ConstraintProvider {
                                     if(i1.compareTo(i2)<0){
                                         if(hasStartTimeProcess.get(i).getEndTime().plusMinutes(maxTime).compareTo(hasStartTimeProcess.get(i+1).getStartTime())>0){
                                             b++;
+                                            conflictRoptions1.put("hard-seriesProduceTimeWait","和下道工序没有预留足够的换辊和立板时间");
+                                            conflictRoptions2.put("hard-seriesProduceTimeWait","和上道工序没有预留足够的换辊和立板时间");
                                         }
                                     }else if(i1.compareTo(i2)>0){
                                         if(hasStartTimeProcess.get(i).getEndTime().plusMinutes(standingtime).compareTo(hasStartTimeProcess.get(i+1).getStartTime())>0){
                                             b++;
+                                            conflictRoptions1.put("hard-seriesProduceTimeWait","和下道工序没有预留足够的立板时间");
+                                            conflictRoptions2.put("hard-seriesProduceTimeWait","和上道工序没有预留足够的立板时间");
                                         }
                                     }
                                 }catch (Exception e){
@@ -723,6 +744,8 @@ public class ApsConstraintProvider implements ConstraintProvider {
                             if(hasStartTimeProcess.get(i).getEndTime().plusMinutes(hasStartTimeProcess.get(i).getCutfinishmin())
                                     .plusMinutes(hasStartTimeProcess.get(i+1).getPrepressworkmin()).compareTo(hasStartTimeProcess.get(i+1).getStartTime())>0){
                                 b++;
+                                conflictRoptions1.put("hard-seriesProduceTimeWait","和下道工序没有预留足够的上机准备时间和下机收尾时间");
+                                conflictRoptions2.put("hard-seriesProduceTimeWait","和上道工序没有预留足够的上机准备时间和下机收尾时间");
                             }
                         }else{
                             String s1 = serspre[2];
@@ -734,6 +757,8 @@ public class ApsConstraintProvider implements ConstraintProvider {
                                     if(hasStartTimeProcess.get(i).getEndTime().plusMinutes(hasStartTimeProcess.get(i).getCutfinishmin())
                                             .plusMinutes(hasStartTimeProcess.get(i+1).getPrepressworkmin()).compareTo(hasStartTimeProcess.get(i+1).getStartTime())>0){
                                         b++;
+                                        conflictRoptions1.put("hard-seriesProduceTimeWait","和下道工序没有预留足够的上机准备时间和下机收尾时间");
+                                        conflictRoptions2.put("hard-seriesProduceTimeWait","和上道工序没有预留足够的上机准备时间和下机收尾时间");
                                     }
                                 }
                             }catch (Exception e){
@@ -789,8 +814,13 @@ public class ApsConstraintProvider implements ConstraintProvider {
                     return pro.getProcessType().equals("成退") || pro.getProcessType().equals("中退");
                 })
                 .groupBy(ProductionProcesses::getEquipmentId,ConstraintCollectors.toList())
-                .filter((equipmentEquassociated,processes) -> {
+                .filter((equipmentId,processes) -> {
                     if(processes != null && processes.size()>0){
+                        for (ProductionProcesses process : processes) {
+                            if(process.getConflictRoptions().containsKey("hard-eqTimeCrossTuihuo")){
+                                process.getConflictRoptions().remove("hard-eqTimeCrossTuihuo");
+                            }
+                        }
                         Integer num = eqTimeCrossTuihuoCount(processes,"1");
                         if(num>0){
                             return true;
@@ -800,7 +830,7 @@ public class ApsConstraintProvider implements ConstraintProvider {
                         return false;
                     }
                 })
-                .penalize(HardMediumSoftScore.ONE_HARD,(equipmentEquassociated,processes)->{
+                .penalize(HardMediumSoftScore.ONE_HARD,(equipmentId,processes)->{
                     Integer num = eqTimeCrossTuihuoCount(processes,"2");
                     return num*100;
                 })
@@ -830,6 +860,7 @@ public class ApsConstraintProvider implements ConstraintProvider {
                 pp.setBsProcessesId(Arrays.asList(new String[]{"haspcprocess"}));
                 pp.setVolumeWidth(equipmentRunTime.getTotalVolumeWidth());
                 pp.setSinglerollweight(equipmentRunTime.getTotalSinglerollweight());
+                pp.setConflictRoptions(new HashMap<>());
                 if(equipmentRunTime.getOccupyType().equals("process")){
                     pp.setTaskType("processes");
                 }else {
@@ -847,12 +878,6 @@ public class ApsConstraintProvider implements ConstraintProvider {
             ProductionProcesses nextPro = hasStartTimeProcess.get(i+1);
             Map<String, String> conflictRoptions1 = prePro.getConflictRoptions();
             Map<String, String> conflictRoptions2 = nextPro.getConflictRoptions();
-            if(conflictRoptions1.containsKey("hard-eqTimeCrossTuihuo")){
-                conflictRoptions1.remove("hard-eqTimeCrossTuihuo");
-            }
-            if(conflictRoptions2.containsKey("hard-eqTimeCrossTuihuo")){
-                conflictRoptions2.remove("hard-eqTimeCrossTuihuo");
-            }
             // 开始时间相等为合并工序
             if (prePro.getStartTime().compareTo(nextPro.getStartTime()) == 0){
                 if(prePro.getTaskType().equals("maintenance") || nextPro.getTaskType().equals("maintenance")){
@@ -1088,6 +1113,7 @@ public class ApsConstraintProvider implements ConstraintProvider {
                     pp.setSeriesProduceMark(equipmentRunTime.getSeriesProduceMark());
                     pp.setProcessType(equipmentRunTime.getProcessType());
                     pp.setBsProcessesId(Arrays.asList(new String[]{"haspcprocess"}));
+                    pp.setConflictRoptions(new HashMap<>());
                     hasStartTimeProcess.add(pp);
                 }
             }
@@ -1100,6 +1126,7 @@ public class ApsConstraintProvider implements ConstraintProvider {
             pp.setSeriesProduceMark(equipment.getLastSeriesProduceMark());
             pp.setProcessType(equipment.getLastProcessType());
             pp.setBsProcessesId(Arrays.asList(new String[]{"lastprocess"}));
+            pp.setConflictRoptions(new HashMap<>());
             hasStartTimeProcess.add(0,pp);
         }
         for(int i=0;i<hasStartTimeProcess.size()-1;i++){
@@ -1281,6 +1308,7 @@ public class ApsConstraintProvider implements ConstraintProvider {
                             }
                             pp.setProcessType(equipmentRunTime.getProcessType());
                             pp.setApsOverallConfig(hasStartTimeProcess.get(0).getApsOverallConfig());
+                            pp.setConflictRoptions(new HashMap<>());
                             hasStartTimeProcess.add(pp);
                         }
                     }
@@ -1483,7 +1511,7 @@ public class ApsConstraintProvider implements ConstraintProvider {
                         System.out.println("*********************************");
                     }*/
                     Map<String, List<ProductionProcesses>> listMap = processes.stream().collect(Collectors.groupingBy(ProductionProcesses::getEquipmentId));
-                    return listMap.size()*1000;
+                    return listMap.size()*100;
                 })
                 .asConstraint("sameEquipment");
     }

+ 1 - 1
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/util/ApsConstants.java

@@ -20,7 +20,7 @@ public class ApsConstants {
         constraintDesc.put("equipmentRunTime","加工设备该加工时间段不可用");
         constraintDesc.put("lzTimeLessMaxWait","作业流转时间超出上道工序作业最大等待时间限制");
         constraintDesc.put("eqTimeCross","与加工设备其他作业加工时间重叠");
-        constraintDesc.put("seriesProduceTimeWait","没有预留足够的上机准备时间和下机收尾时间");
+//        constraintDesc.put("seriesProduceTimeWait","没有预留足够的上机准备时间和下机收尾时间");
         constraintDesc.put("deliveryDate","不满足订单交货期");
 //        constraintDesc.put("seriesProduce","与上道工序作业不能连续生产");