Browse Source

APS平台新模型优化

fangpy 1 year ago
parent
commit
4954d2959d

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

@@ -223,35 +223,6 @@ public class ProductionProcesses extends Step{
                 this.equipmentId = equipment.getId();
             }
         }
-        if(this.equipment != null){
-            // 设置设备的工序占用
-            if(this.equipment.getProcessesList() == null){
-                this.equipment.setProcessesList(new ArrayList<>());
-            }
-            boolean a = false;
-            for (ProductionProcesses productionProcesses : this.equipment.getProcessesList()) {
-                if(productionProcesses.getId().equals(this.getId())){
-                    productionProcesses.setEquipmentId(this.getEquipmentId());
-                    productionProcesses.setProduceTime(this.getProduceTime());
-                    productionProcesses.setStartTime(this.getStartTime());
-                    productionProcesses.setEndTime(this.getEndTime());
-                    productionProcesses.setVolumeMetal(this.getVolumeMetal());
-                    productionProcesses.setVolumeWidth(this.getVolumeWidth());
-                    a = true;
-                }
-            }
-            if(!a){
-                ProductionProcesses pp = new ProductionProcesses();
-                pp.setId(this.getId());
-                pp.setEquipmentId(this.getEquipmentId());
-                pp.setProduceTime(this.getProduceTime());
-                pp.setStartTime(this.getStartTime());
-                pp.setEndTime(this.getEndTime());
-                pp.setVolumeMetal(this.getVolumeMetal());
-                pp.setVolumeWidth(this.getVolumeWidth());
-                this.equipment.getProcessesList().add(pp);
-            }
-        }
     }
 
     public String getEquipmentId() {

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

@@ -1,14 +1,13 @@
 package com.rongwei.rwapsserver.aps.listener;
 
+import cn.hutool.core.collection.CollUtil;
 import com.rongwei.rwapsserver.aps.domain.ApsSolution;
 import com.rongwei.rwapsserver.aps.domain.EquipmentRunTime;
 import com.rongwei.rwapsserver.aps.domain.ProductionProcesses;
 import org.optaplanner.core.api.domain.variable.VariableListener;
 import org.optaplanner.core.api.score.director.ScoreDirector;
 import java.time.LocalDateTime;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 /**
  * 设备赋值后任务起止时间自动计算
@@ -75,6 +74,8 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
         LocalDateTime startDateTime = startTimeSet(process);
         scoreDirector.beforeVariableChanged(process, "startTime");
         process.setStartTime(startDateTime);
+        // 设备占用的任务设置
+        equipmentProListSet(process);
         scoreDirector.afterVariableChanged(process, "startTime");
         if(process.getNextProcesses() != null && process.getNextProcesses().size()>0){
             for (ProductionProcesses nextProcess : process.getNextProcesses()) {
@@ -83,6 +84,42 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
         }
     }
 
+    /**
+     * 设备占用的任务设置
+     * @param process
+     */
+    private void equipmentProListSet(ProductionProcesses process){
+        if(process.getEquipment() != null){
+            // 设置设备的工序占用
+            if(process.getEquipment().getProcessesList() == null){
+                process.getEquipment().setProcessesList(new ArrayList<>());
+            }
+            boolean a = false;
+            for (ProductionProcesses productionProcesses : process.getEquipment().getProcessesList()) {
+                if(productionProcesses.getId().equals(process.getId())){
+                    productionProcesses.setEquipmentId(process.getEquipmentId());
+                    productionProcesses.setProduceTime(process.getProduceTime());
+                    productionProcesses.setStartTime(process.getStartTime());
+                    productionProcesses.setEndTime(process.getEndTime());
+                    productionProcesses.setVolumeMetal(process.getVolumeMetal());
+                    productionProcesses.setVolumeWidth(process.getVolumeWidth());
+                    a = true;
+                }
+            }
+            if(!a){
+                ProductionProcesses pp = new ProductionProcesses();
+                pp.setId(process.getId());
+                pp.setEquipmentId(process.getEquipmentId());
+                pp.setProduceTime(process.getProduceTime());
+                pp.setStartTime(process.getStartTime());
+                pp.setEndTime(process.getEndTime());
+                pp.setVolumeMetal(process.getVolumeMetal());
+                pp.setVolumeWidth(process.getVolumeWidth());
+                process.getEquipment().getProcessesList().add(pp);
+            }
+        }
+    }
+
     /**
      * 设置开始时间
      * @param process
@@ -139,12 +176,6 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
                     }
                     // 开始时间不小于最大的最小等待时间、不大于最小的最大等待时间
                     toUpdateStartTime = lastMaxStartTime;
-
-                /*if(process.getStartTime().compareTo(lastMaxStartTime)<0){
-                    bln = true;
-                }else if(process.getStartTime().compareTo(lastMinMaxWaitTime)>0){
-                    bln = true;
-                }*/
                 }
                 // 非瓶颈工序,非瓶颈工序,默认前道工序只有一个
                 else{
@@ -196,15 +227,6 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
                         LocalDateTime lastStartTime = null;
                         if(process.getUnitProduceTime()>=maxUnitProduceTime){
                             lastStartTime = startTime.plusMinutes(preProcess.getUnitProduceTime()).plusMinutes(lzTimes);
-                    /*if(process.getStartTime().compareTo(startTime.plusMinutes(preProcess.getUnitProduceTime()).plusMinutes(lzTimes))<0){
-                        bln = true;
-                    }else{
-                        if(lastFirstMaxWaitTime != null){
-                            if(process.getStartTime().compareTo(lastFirstMaxWaitTime)>0){
-                                bln = true;
-                            }
-                        }
-                    }*/
                             process.setEndTime(lastStartTime.plusMinutes(process.getProduceTime()));
                         }
                         /**
@@ -214,33 +236,46 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
                         else{
                             // 开始时间:最后一批次结束时间加流转时间,再往前倒排批次数减一乘以单批次生产时间
                             lastStartTime = endTime.plusMinutes(lzTimes).minusMinutes(process.getUnitProduceTime() * (process.getProducePcNum() - 1));
-                    /*if(process.getStartTime().compareTo(startTime1)<0){
-                        bln = true;
-                    }
-                    // 存在最大等待时间时
-                    if(preProcess.getMaxWaitTime() != null){
-                        // 超过最大等待时间
-                        if(process.getStartTime().compareTo(startTime1.plusMinutes(preProcess.getMaxWaitTime()))>0){
-                            bln = true;
-                        }
-                    }*/
                             // 结束时间重新赋值
                             process.setEndTime(endTime.plusMinutes(lzTimes).plusMinutes(process.getUnitProduceTime()));
                         }
-                        // 对比设备已运行时间来修正时间
+                        // 对比设备已运行时间(包括排程中添加的作业)来修正时间
                         LocalDateTime proStartTime = lastStartTime;
                         LocalDateTime proEndTime = process.getEndTime();
                         List<EquipmentRunTime> equipmentRunTimes = process.getEquipment().getEquipmentRunTimes();
+                        List<EquipmentRunTime> allRunTimes = new ArrayList<>();
                         if(equipmentRunTimes != null && equipmentRunTimes.size()>0){
                             for (EquipmentRunTime equipmentRunTime : equipmentRunTimes) {
-                                if((proStartTime.compareTo(equipmentRunTime.getStartRunTime())>=0 && proStartTime.compareTo(equipmentRunTime.getEndRunTime())<=0)
-                                        || (proEndTime.compareTo(equipmentRunTime.getStartRunTime())>=0 && proEndTime.compareTo(equipmentRunTime.getEndRunTime())<=0)
-                                        || (proStartTime.compareTo(equipmentRunTime.getStartRunTime())<=0 && proEndTime.compareTo(equipmentRunTime.getEndRunTime())>=0)){
+                                EquipmentRunTime copy = new EquipmentRunTime();
+                                copy.setStartRunTime(equipmentRunTime.getStartRunTime());
+                                copy.setEndRunTime(equipmentRunTime.getEndRunTime());
+                                allRunTimes.add(copy);
+                            }
+                        }
+                        if(process.getEquipment().getProcessesList() != null && process.getEquipment().getProcessesList().size()>0){
+                            for (ProductionProcesses productionProcesses : process.getEquipment().getProcessesList()) {
+                                if(productionProcesses.getStartTime() != null && productionProcesses.getEndTime() != null){
+                                    EquipmentRunTime copy = new EquipmentRunTime();
+                                    copy.setStartRunTime(productionProcesses.getStartTime());
+                                    copy.setEndRunTime(productionProcesses.getEndTime());
+                                    allRunTimes.add(copy);
+                                }
+                            }
+                        }
+                        // 按照开始时间排序
+                        allRunTimes.sort(Comparator.comparing(EquipmentRunTime::getStartRunTime));
+
+                        if(allRunTimes.size()>0){
+                            for (EquipmentRunTime equipmentRunTime : allRunTimes) {
+                                if(proStartTime.compareTo(equipmentRunTime.getEndRunTime())>0 || proEndTime.compareTo(equipmentRunTime.getStartRunTime())<0){
+                                    continue;
+                                }else{
                                     proStartTime = equipmentRunTime.getEndRunTime().plusMinutes(1);
                                     proEndTime = proStartTime.plusMinutes(process.getProduceTime());
                                 }
                             }
                         }
+
                         toUpdateStartTime = proStartTime;
                     }
                 }
@@ -248,11 +283,32 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
                 LocalDateTime proStartTime = process.getApsOverallConfig().getStartTime();
                 LocalDateTime proEndTime = proStartTime.plusMinutes(process.getProduceTime());
                 List<EquipmentRunTime> equipmentRunTimes = process.getEquipment().getEquipmentRunTimes();
+                List<EquipmentRunTime> allRunTimes = new ArrayList<>();
                 if(equipmentRunTimes != null && equipmentRunTimes.size()>0){
                     for (EquipmentRunTime equipmentRunTime : equipmentRunTimes) {
-                        if((proStartTime.compareTo(equipmentRunTime.getStartRunTime())>=0 && proStartTime.compareTo(equipmentRunTime.getEndRunTime())<=0)
-                                || (proEndTime.compareTo(equipmentRunTime.getStartRunTime())>=0 && proEndTime.compareTo(equipmentRunTime.getEndRunTime())<=0)
-                                || (proStartTime.compareTo(equipmentRunTime.getStartRunTime())<=0 && proEndTime.compareTo(equipmentRunTime.getEndRunTime())>=0)){
+                        EquipmentRunTime copy = new EquipmentRunTime();
+                        copy.setStartRunTime(equipmentRunTime.getStartRunTime());
+                        copy.setEndRunTime(equipmentRunTime.getEndRunTime());
+                        allRunTimes.add(copy);
+                    }
+                }
+                if(process.getEquipment().getProcessesList() != null && process.getEquipment().getProcessesList().size()>0){
+                    for (ProductionProcesses productionProcesses : process.getEquipment().getProcessesList()) {
+                        if(productionProcesses.getStartTime() != null && productionProcesses.getEndTime() != null){
+                            EquipmentRunTime copy = new EquipmentRunTime();
+                            copy.setStartRunTime(productionProcesses.getStartTime());
+                            copy.setEndRunTime(productionProcesses.getEndTime());
+                            allRunTimes.add(copy);
+                        }
+                    }
+                }
+                allRunTimes.sort(Comparator.comparing(EquipmentRunTime::getStartRunTime));
+
+                if(allRunTimes.size()>0){
+                    for (EquipmentRunTime equipmentRunTime : allRunTimes) {
+                        if(proStartTime.compareTo(equipmentRunTime.getEndRunTime())>0 || proEndTime.compareTo(equipmentRunTime.getStartRunTime())<0){
+                            continue;
+                        }else{
                             proStartTime = equipmentRunTime.getEndRunTime().plusMinutes(1);
                             proEndTime = proStartTime.plusMinutes(process.getProduceTime());
                         }

+ 3 - 2
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/score/ApsConstraintProvider.java

@@ -403,8 +403,9 @@ public class ApsConstraintProvider implements ConstraintProvider {
                                         bol = false;
                                         break;
                                     }
-                                    if((productionProcesses.getStartTime().compareTo(startTime)>=0 && productionProcesses.getStartTime().compareTo(endRunTime)<=0)
-                                            || (productionProcesses.getEndTime().compareTo(startTime)>=0 && productionProcesses.getEndTime().compareTo(endRunTime)<=0)){
+                                    if(productionProcesses.getStartTime().compareTo(endRunTime)>0 || productionProcesses.getEndTime().compareTo(startTime)<0){
+                                        continue;
+                                    }else{
                                         bol = true;
                                     }
                                 }

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

@@ -72,6 +72,7 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
             productionProcesses.setPreviousProcesses(null);
             productionProcesses.setNextProcesses(null);
             productionProcesses.getEquipment().setProcessesList(null);
+            productionProcesses.setPreviousStep(null);
         }
         productionScheduleRetVo.setProcesses(solvedBalance.getProcessesList());
         return productionScheduleRetVo;