fangpengyuan пре 4 месеци
родитељ
комит
1d153108c0

+ 75 - 2
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/taskassigning/tado/ApsConstraintListProvider.java

@@ -6,6 +6,7 @@ import org.optaplanner.core.api.score.buildin.hardmediumsoft.HardMediumSoftScore
 import org.optaplanner.core.api.score.stream.*;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.time.Duration;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
 import java.time.format.DateTimeFormatter;
@@ -47,10 +48,12 @@ public class ApsConstraintListProvider implements ConstraintProvider {
 //
 //                preNextProcessSameWorkShop(constraintFactory),
                 // SOFT
-//                processNear(constraintFactory),
+                processNear(constraintFactory),
 //                lzbzSp(constraintFactory),
 //                eqTimeCrossMinTuihuoSoft(constraintFactory),
 //                preNextProcessSameEq(constraintFactory),
+
+                freeTimeEquipmentSoft(constraintFactory),
         };
     }
 
@@ -362,6 +365,15 @@ public class ApsConstraintListProvider implements ConstraintProvider {
                                 pta.setEndTime(eqlastTime);
                             }
                             tasks.add(pta);
+                        }else{
+                            if(equipment.getEquipmentRunTimes() != null && equipment.getEquipmentRunTimes().size()>0){
+                                for (EquipmentRunTime equipmentRunTime : equipment.getEquipmentRunTimes()) {
+                                    ProductionProcessesTa pta = new ProductionProcessesTa();
+                                    pta.setStartTime(equipmentRunTime.getStartRunTime());
+                                    pta.setEndTime(equipmentRunTime.getEndRunTime());
+                                    tasks.add(pta);
+                                }
+                            }
                         }
                         tasks.addAll(equipment.getTasks());
 
@@ -373,6 +385,11 @@ public class ApsConstraintListProvider implements ConstraintProvider {
                                 ProductionProcessesTa nextTask = tasks.get(i + 1);
                                 if(preTask.getEndTime().plusMinutes(60).compareTo(nextTask.getStartTime())<0){
                                     b = b + 100;
+                                    // 上道工序结束时间和下道开始时间的分钟差,再减去1小时
+//                                    long durationInMinutes = Duration.between(preTask.getEndTime(), nextTask.getStartTime()).toMinutes()-60;
+//                                    if(durationInMinutes>0){
+//                                        b = (int) (b + durationInMinutes);
+//                                    }
                                 }
                             }
                         }
@@ -383,6 +400,59 @@ public class ApsConstraintListProvider implements ConstraintProvider {
                 .asConstraint("freeTimeEquipment");
     }
 
+    /**
+     * 设备生产的任务都在可选设备范围内
+     * @param constraintFactory
+     * @return
+     */
+    private Constraint freeTimeEquipmentSoft(ConstraintFactory constraintFactory) {
+        return constraintFactory.forEach(EquipmentTa.class)
+                .filter((equipment) -> {
+                    return true;
+                })
+                .penalize(HardMediumSoftScore.ONE_SOFT,(equipment) -> {
+                    int b = 0;
+                    List<ProductionProcessesTa> tasks = new ArrayList<>();
+
+                    if(equipment.getTasks() != null && equipment.getTasks().size()>0){
+                        if(equipment.getLastProcessEndTime() != null){
+                            ProductionProcessesTa pta = new ProductionProcessesTa();
+                            LocalDateTime eqlastTime = equipment.getLastProcessEndTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
+                            LocalDateTime startTime = equipment.getTasks().get(0).getApsOverallConfig().getStartTime();
+                            if(startTime.compareTo(eqlastTime)>0){
+                                pta.setStartTime(startTime.plusMinutes(-10));
+                                pta.setEndTime(startTime);
+                            }else{
+                                pta.setStartTime(eqlastTime.plusMinutes(-10));
+                                pta.setEndTime(eqlastTime);
+                            }
+                            tasks.add(pta);
+                        }
+                        tasks.addAll(equipment.getTasks());
+
+                        // 根据开始时间排序
+                        if(tasks.size()>1){
+                            Collections.sort(tasks, Comparator.comparing(ProductionProcessesTa::getStartTime));
+                            for (int i = 0; i < tasks.size()-1; i++) {
+                                ProductionProcessesTa preTask = tasks.get(i);
+                                ProductionProcessesTa nextTask = tasks.get(i + 1);
+                                if(preTask.getEndTime().plusMinutes(60).compareTo(nextTask.getStartTime())<0){
+//                                    b = b + 100;
+                                    // 上道工序结束时间和下道开始时间的分钟差,再减去1小时
+                                    long durationInMinutes = Duration.between(preTask.getEndTime(), nextTask.getStartTime()).toMinutes()-60;
+                                    if(durationInMinutes>0){
+                                        b = (int) (b + durationInMinutes);
+                                    }
+                                }
+                            }
+                        }
+
+                    }
+                    return b;
+                })
+                .asConstraint("freeTimeEquipmentSoft");
+    }
+
     /**
      * 连续生产约束条件,同一设备的连续生产标识一样的工序、尽量排在一起
      * 铸轧考虑换辊和立板
@@ -728,7 +798,10 @@ public class ApsConstraintListProvider implements ConstraintProvider {
         return constraintFactory.forEach(ProductionProcessesTa.class)
                 .filter((process)->{
                     if(process.getPreviousProcesses() == null || process.getPreviousProcesses().size() == 0){
-                        if(process.getStartTime().compareTo(process.getApsOverallConfig().getStartTime())>0){
+                        if(process.getStartTime() == null || process.getApsOverallConfig().getStartTime() == null){
+                            int ma = 0;
+                        }
+                        if(process.getStartTime() != null && process.getStartTime().compareTo(process.getApsOverallConfig().getStartTime())>0){
                             return true;
                         }else{
                             return false;