浏览代码

排程优化

fangpy 10 月之前
父节点
当前提交
021c6bac1f

+ 97 - 1
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/score/ApsConstraintProvider.java

@@ -26,14 +26,16 @@ public class ApsConstraintProvider implements ConstraintProvider {
     public Constraint[] defineConstraints(ConstraintFactory constraintFactory) {
         return new Constraint[]{
                 // HARD
+//                hasOnePreGbAfterNowNew(constraintFactory),
+//                nextLockProNew(constraintFactory),
                 hasOnePreGbAfterNow(constraintFactory),
+                nextLockPro(constraintFactory),
                 eqTimeCross(constraintFactory),
                 seriesProduceTimeWait(constraintFactory),
                 seriesProduceWashTimeWait(constraintFactory),
                 equipmentRunTime(constraintFactory),
                 eqTimeCrossTuihuo(constraintFactory),
                 eqTimeCrossMinTuihuo(constraintFactory),
-                nextLockPro(constraintFactory),
 //                twoLineZz(constraintFactory),
                 // MEDIUM
 //                deliveryDate(constraintFactory),
@@ -156,6 +158,50 @@ public class ApsConstraintProvider implements ConstraintProvider {
                 .asConstraint("hasOnePreGbAfterNow");
     }
 
+    /**
+     * 单卷模式下前后道工序时间约束(新的等待时间调整)
+     * @param constraintFactory
+     * @return
+     */
+    private Constraint hasOnePreGbAfterNowNew(ConstraintFactory constraintFactory) {
+        return constraintFactory.forEach(ProductionProcesses.class)
+                .filter(productionProcesses -> {
+                    boolean bln = false;
+                    if(productionProcesses.getPreviousProcesses() != null && productionProcesses.getPreviousProcesses().size()>0){
+                        // 此种情况简化为前道工序只有一个
+                        for (ProductionProcesses previousProcess : productionProcesses.getPreviousProcesses()) {
+                            ProductionProcesses preProcess = previousProcess;
+                            // 流转时间(最小等待时间)
+                            Integer lzTimes = 0;
+                            if(preProcess.getEquipment() != null){
+                                if(preProcess.getEquipment().getWorkshopid() != null && preProcess.getEquipment().getWorkshopid().equals(productionProcesses.getEquipment().getWorkshopid())){
+                                    lzTimes = productionProcesses.getApsOverallConfig().getRoamTime().get("WORKSHOP_IN");
+                                }else{
+                                    lzTimes = productionProcesses.getApsOverallConfig().getRoamTime().get("WORKSHOP_CROSS");
+                                }
+                                // 最小等待时间对比流转时间
+                                if(productionProcesses.getMinWaitTime() != null && lzTimes<productionProcesses.getMinWaitTime()){
+                                    lzTimes = productionProcesses.getMinWaitTime();
+                                }
+                                // 最大等待时间
+                                Integer maxWaitTime = productionProcesses.getMaxWaitTime();
+                                if(productionProcesses.getStartTime().compareTo(preProcess.getEndTime().plusMinutes(lzTimes))<0){
+                                    bln = true;
+                                }
+                                if(maxWaitTime != null && maxWaitTime>0){
+                                    if(productionProcesses.getStartTime().compareTo(preProcess.getEndTime().plusMinutes(maxWaitTime))>0){
+                                        bln = true;
+                                    }
+                                }
+                            }
+                        }
+                    }
+                    return bln;
+                })
+                .penalize(HardMediumSoftScore.ONE_HARD,(productionProcesses) -> 40)
+                .asConstraint("hasOnePreGbAfterNow");
+    }
+
     /**
      * 下道工序如果是锁定工序则判断是否下道工序时间在当前工序之后
      * @param constraintFactory
@@ -203,6 +249,53 @@ public class ApsConstraintProvider implements ConstraintProvider {
                 .asConstraint("nextLockPro");
     }
 
+    /**
+     * 下道工序如果是锁定工序则判断是否下道工序时间在当前工序之后(新的等待时间调整)
+     * @param constraintFactory
+     * @return
+     */
+    private Constraint nextLockProNew(ConstraintFactory constraintFactory) {
+        return constraintFactory.forEach(ProductionProcesses.class)
+                .filter(productionProcesses -> {
+                    boolean bln = false;
+                    List<ProductionProcesses> nextProcesses = productionProcesses.getNextProcesses();
+                    if(nextProcesses != null && nextProcesses.size()>0){
+                        // 当前工序结束时间
+                        LocalDateTime preEndTime = productionProcesses.getEndTime();
+                        // 获取下道工序最早开始时间
+                        LocalDateTime earlyStartTime = null;
+                        for (ProductionProcesses nextProcess : nextProcesses) {
+                            if(nextProcess.getIfLock()){
+                                // 下道工序开始时间
+                                LocalDateTime startTime = nextProcess.getStartTime();
+                                // 流转时间(最小等待时间)
+                                Integer lzTimes = 0;
+                                if(productionProcesses.getEquipment().getWorkshopid() != null && productionProcesses.getEquipment().getWorkshopid().equals(nextProcess.getEquipment().getWorkshopid())){
+                                    lzTimes = productionProcesses.getApsOverallConfig().getRoamTime().get("WORKSHOP_IN");
+                                }else{
+                                    lzTimes = productionProcesses.getApsOverallConfig().getRoamTime().get("WORKSHOP_CROSS");
+                                }
+                                // 最小等待时间对比流转时间
+                                if(nextProcess.getMinWaitTime() != null && lzTimes<nextProcess.getMinWaitTime()){
+                                    lzTimes = nextProcess.getMinWaitTime();
+                                }
+                                if(preEndTime.plusMinutes(lzTimes).compareTo(startTime)>0){
+                                    bln = true;
+                                }
+                                // 最大等待时间
+                                Integer maxWaitTime = nextProcess.getMaxWaitTime();
+                                if(maxWaitTime != null && maxWaitTime>0 && preEndTime.plusMinutes(maxWaitTime).compareTo(startTime)<0){
+                                    bln = true;
+                                }
+                            }
+                        }
+                    }
+                    return bln;
+                })
+                .penalize(HardMediumSoftScore.ONE_HARD,(productionProcesses) -> 30)
+                .asConstraint("nextLockPro");
+    }
+
     /**
      * 汇总所有下道工序的加工时间
      * @param nextProcess
@@ -2096,6 +2189,9 @@ public class ApsConstraintProvider implements ConstraintProvider {
                     }
                 })
                 .penalize(HardMediumSoftScore.ONE_MEDIUM,(equipmentId,processes)->{
+                    if("0001be252874536843730b100176".equals(equipmentId) && processes.get(0).getDelay() == 1){
+                        int a = 1;
+                    }
                     // 已占用的
                     List<EquipmentRunTime> equipmentRunTimes = processes.get(0).getEquipment().getEquipmentRunTimes();
                     // 同一工序的优先组炉

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

@@ -1218,7 +1218,7 @@ public class ApsServiceImpl implements ApsService {
         if(!hasMid.contains(rootPro.getId())){
             hasMid.add(rootPro.getId());
             List<ProductionProcesses> nextProcesses = rootPro.getNextProcesses();
-            if("否".equals(rootPro.getIssubsection()) && ("冷轧".equals(rootPro.getProcessType()) || "箔轧".equals(rootPro.getProcessType()))){
+            if("否".equals(rootPro.getIssubsection()) && ("冷轧".equals(rootPro.getProcessType()) || "箔轧".equals(rootPro.getProcessType())) && !rootPro.getIfLock()){
                 // 是否连续冷轧、箔轧
                 boolean hasSeries = false;
                 if(StrUtil.isNotBlank(seriesKey) && StrUtil.isNotBlank(protype) && protype.equals(rootPro.getProcessType())){