Quellcode durchsuchen

新模型合并

fangpy vor 4 Monaten
Ursprung
Commit
8c589f1cac

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

@@ -52,9 +52,9 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
     @Override
     public ProductionScheduleRetVo productionSchedule(ProductionScheduleVo productionScheduleVo) throws Exception{
         List<String> blankids = new ArrayList<>();
+        blankids.add("85e8e1938b7445939713f70f00401333");
         blankids.add("9e8bbe425aa044a4af55d8daf7ebb4cb");
-//        blankids.add("2f3f48a1c3c74c0481ba06df521fe0d7");
-//        blankids.add("75736c469b1a42568af980260c0689a6");
+        blankids.add("7efe679a8e3c4942b88758617cdbc312");
 //        blankids.add("acf4460f9488459780c0dc7d8038f1f9");
 //        blankids.add("efeb1f8d01b04cdb9921c0d1711bb967");
 //        List<ProductionProcesses> collect = productionScheduleVo.getProcesses().stream().filter(v ->

+ 2 - 0
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/taskassigning/service/impl/ProductionScheduleTaServiceImpl.java

@@ -66,6 +66,8 @@ public class ProductionScheduleTaServiceImpl implements ProductionScheduleTaServ
         List<ProductionProcessesTa> otherThproces = new ArrayList<>();
         List<ProductionProcessesTa> otherNotThproces = new ArrayList<>();
         ApsSolutionTa apsSolution = getPreApsSolution(productionScheduleVo,otherThproces);
+        // 设置设备的排程开始时间
+        apsUtils.setEqStartDdTime(apsSolution.getEquipmentList(),apsSolution.getProcessesList().get(0).getApsOverallConfig().getStartTime());
 
         // 全量排程数据备份
         List<ProductionProcessesTa> allToApsProcess = new ArrayList<>();

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

@@ -341,7 +341,7 @@ public class ApsConstraintListProvider implements ConstraintProvider {
                 .filter((equipment) -> {
                     return true;
                 })
-                .penalize(HardMediumSoftScore.ONE_HARD,(equipment) -> {
+                .penalize(HardMediumSoftScore.ONE_MEDIUM,(equipment) -> {
                     int b = 0;
                     List<ProductionProcessesTa> tasks = new ArrayList<>();
                     tasks.addAll(equipment.getTasks());

+ 6 - 0
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/taskassigning/tado/EquipmentTa.java

@@ -9,6 +9,7 @@ import org.optaplanner.core.api.domain.lookup.PlanningId;
 import org.optaplanner.core.api.domain.variable.PlanningListVariable;
 import java.io.Serializable;
 import java.math.BigDecimal;
+import java.time.LocalDateTime;
 import java.util.Date;
 import java.util.List;
 
@@ -149,6 +150,11 @@ public class EquipmentTa implements Serializable {
      */
     private List<ProductionProcessesTa> processesList;
 
+    /**
+     * 当前设备开始调度时间
+     */
+    private LocalDateTime startDdTime;
+
     public EquipmentTa(String id, String equipmentType) {
         this.id = id;
         this.equipmentType = equipmentType;

+ 35 - 1
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/taskassigning/tado/TaskStartTimeListenerTa.java

@@ -1,5 +1,6 @@
 package com.rongwei.rwapsserver.aps.taskassigning.tado;
 
+import com.rongwei.rwapsserver.aps.domain.EquipmentRunTime;
 import com.rongwei.rwapsserver.aps.util.ObjectNull;
 import lombok.extern.slf4j.Slf4j;
 import org.optaplanner.core.api.domain.variable.ListVariableListener;
@@ -65,7 +66,12 @@ public class TaskStartTimeListenerTa implements ListVariableListener<ApsSolution
 
         index = 0;
         ProductionProcessesTa productionProcessesTa = tasks.get(index);
-        LocalDateTime previousEndTime = index == 0 ? productionProcessesTa.getApsOverallConfig().getStartTime() : tasks.get(index - 1).getEndTime();
+        // 排程开始时间
+        LocalDateTime apsStartTime = productionProcessesTa.getApsOverallConfig().getStartTime();
+        if(equipmentTa.getStartDdTime() != null && equipmentTa.getStartDdTime().compareTo(apsStartTime)>0){
+            apsStartTime = equipmentTa.getStartDdTime();
+        }
+        LocalDateTime previousEndTime = index == 0 ? apsStartTime : tasks.get(index - 1).getEndTime();
 
         for (int i = index; i < tasks.size(); i++) {
             ProductionProcessesTa t = tasks.get(i);
@@ -73,6 +79,8 @@ public class TaskStartTimeListenerTa implements ListVariableListener<ApsSolution
             if(previousLastEndTime != null && previousLastEndTime.compareTo(previousEndTime)>0){
                 previousEndTime = previousLastEndTime;
             }
+            // 过滤设备占用时间
+            previousEndTime = eqRunTimeDistinct(equipmentTa,t,previousEndTime);
             if (!Objects.equals(t.getStartTime(), previousEndTime)) {
                 scoreDirector.beforeVariableChanged(t, "startTime");
                 t.setStartTime(previousEndTime);
@@ -87,6 +95,32 @@ public class TaskStartTimeListenerTa implements ListVariableListener<ApsSolution
         }
     }
 
+    /**
+     * 根据设备占用时间判断是否有重叠,如果有则依次往后推
+     * @param equipmentTa
+     * @param previousEndTime
+     * @return
+     */
+    private LocalDateTime eqRunTimeDistinct(EquipmentTa equipmentTa,ProductionProcessesTa t,LocalDateTime previousEndTime){
+        // 开始时间、结束时间
+        LocalDateTime retStartTime = previousEndTime;
+        LocalDateTime retEndTime = retStartTime.plusMinutes(t.getProduceTime());
+        List<EquipmentRunTime> equipmentRunTimes = equipmentTa.getEquipmentRunTimes();
+        if(equipmentRunTimes != null && equipmentRunTimes.size()>0){
+            for (EquipmentRunTime equipmentRunTime : equipmentRunTimes) {
+                // 开始时间大于等于设备占用结束时间或者结束时间小于等于设备占用开始时间则跳过,
+                // 否则设置开始时间为设备占用结束时间
+                if(retStartTime.compareTo(equipmentRunTime.getEndRunTime())>=0
+                        || retEndTime.compareTo(equipmentRunTime.getStartRunTime())<=0){
+                    continue;
+                }
+                retStartTime = equipmentRunTime.getEndRunTime();
+                retEndTime = retStartTime.plusMinutes(t.getProduceTime());
+            }
+        }
+        return retStartTime;
+    }
+
     /**
      * 获取当前工序的最早开工时间
      * @param t

+ 21 - 0
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/util/ApsUtils.java

@@ -3,12 +3,15 @@ package com.rongwei.rwapsserver.aps.util;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;
 import com.rongwei.rwapsserver.aps.domain.ApsSolution;
+import com.rongwei.rwapsserver.aps.domain.EquipmentRunTime;
 import com.rongwei.rwapsserver.aps.domain.ProductionProcesses;
+import com.rongwei.rwapsserver.aps.taskassigning.tado.EquipmentTa;
 import com.rongwei.rwapsserver.aps.taskassigning.tado.ProductionProcessesTa;
 import org.optaplanner.core.api.score.ScoreExplanation;
 import org.optaplanner.core.api.score.buildin.hardsoft.HardSoftScore;
 import org.optaplanner.core.api.score.constraint.ConstraintMatch;
 
+import java.time.LocalDateTime;
 import java.util.*;
 
 public class ApsUtils {
@@ -144,4 +147,22 @@ public class ApsUtils {
             }
         }
     }
+
+    /**
+     * 设置设备的调度开始时间
+     * @param equipmentTas
+     */
+    public void setEqStartDdTime(List<EquipmentTa> equipmentTas, LocalDateTime overallStartTime){
+        if(equipmentTas != null && equipmentTas.size()>0){
+            for (EquipmentTa equipmentTa : equipmentTas) {
+                if(equipmentTa.getEquipmentRunTimes() != null && equipmentTa.getEquipmentRunTimes().size()>0){
+                    Collections.sort(equipmentTa.getEquipmentRunTimes(), Comparator.comparing(pro -> pro.getStartRunTime()));
+                    EquipmentRunTime equipmentRunTime = equipmentTa.getEquipmentRunTimes().get(equipmentTa.getEquipmentRunTimes().size() - 1);
+                    if(equipmentRunTime.getEndRunTime() != null && equipmentRunTime.getEndRunTime().compareTo(overallStartTime)>0){
+                        equipmentTa.setStartDdTime(equipmentRunTime.getEndRunTime());
+                    }
+                }
+            }
+        }
+    }
 }