Ver código fonte

APS平台新模型调优

fangpy 1 ano atrás
pai
commit
5104946043

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

@@ -80,7 +80,7 @@ public class ApsBalancingApplication {
         System.out.println(allRunTimes);
         allRunTimes.sort(Comparator.comparing(EquipmentRunTime::getStartRunTime));
         System.out.println(allRunTimes);*/
-        System.out.println((int)Math.ceil((double)1280/100));
+        System.out.println(1280/100);
     }
 
     public static void testAps(){

+ 10 - 0
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/domain/Equipment.java

@@ -82,6 +82,16 @@ public class Equipment extends Step{
      */
     private Integer eqPartRunTime;
 
+    /**
+     * 当前设备最后连续生产标识
+     */
+    private String lastSeriesProduceMark;
+
+    /**
+     * 当前设备最后工序类型
+     */
+    private String lastProcessType;
+
     /**
      * 设备上排产的工序
      */

+ 10 - 0
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/domain/EquipmentRunTime.java

@@ -23,4 +23,14 @@ public class EquipmentRunTime {
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime endRunTime;
 
+    /**
+     * 连续生产标识
+     */
+    private String seriesProduceMark;
+
+    /**
+     * 工序
+     */
+    private String processType;
+
 }

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

@@ -211,6 +211,18 @@ public class ProductionProcesses extends Step{
      */
     private String hasConflict;
 
+    /**
+     * 冲突等级
+     * hard:强制冲突
+     * soft:非强制冲突
+     */
+    private String conflictLevel;
+
+    /**
+     * 非强制冲突描述
+     */
+    private String softconflictdes;
+
     /**
      * 冲突描述
      */
@@ -248,6 +260,24 @@ public class ProductionProcesses extends Step{
     @ValueRangeProvider
     @JsonIgnore
     public CountableValueRange<Integer> getDelayRange() {
+        if(this.getPreviousProcesses() != null && this.getPreviousProcesses().size()>0){
+            Integer maxWaitTime = null;
+            for (ProductionProcesses previousProcess : this.getPreviousProcesses()) {
+                if(previousProcess.getMaxWaitTime() != null && previousProcess.getMaxWaitTime()>0){
+                    if(maxWaitTime == null){
+                        maxWaitTime = previousProcess.getMaxWaitTime();
+                    }else{
+                        if(previousProcess.getMaxWaitTime() > maxWaitTime){
+                            maxWaitTime = previousProcess.getMaxWaitTime();
+                        }
+                    }
+                }
+            }
+            if(maxWaitTime != null && maxWaitTime>0){
+                int maxrange = (maxWaitTime / 20) + 1;
+                return ValueRangeFactory.createIntValueRange(0, maxrange);
+            }
+        }
         return ValueRangeFactory.createIntValueRange(0, 200);
     }
 
@@ -554,4 +584,20 @@ public class ProductionProcesses extends Step{
     public void setIfLock(boolean ifLock) {
         this.ifLock = ifLock;
     }
+
+    public String getConflictLevel() {
+        return conflictLevel;
+    }
+
+    public void setConflictLevel(String conflictLevel) {
+        this.conflictLevel = conflictLevel;
+    }
+
+    public String getSoftconflictdes() {
+        return softconflictdes;
+    }
+
+    public void setSoftconflictdes(String softconflictdes) {
+        this.softconflictdes = softconflictdes;
+    }
 }

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

@@ -80,7 +80,7 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
      */
     private void setNextAllStartTime(ScoreDirector<ApsSolution> scoreDirector,ProductionProcesses process){
         if(process.getEquipment() != null){
-            /*if("5ba50382a57648aebbcfce233160e4c5".equals(process.getId()) && "0001be252874536843730b100016".equals(process.getEquipment().getId())){
+            /*if(process.getId().equals("abdcff89d0164cd5a2b57e1bfaf3bc1d")){
                 process.getId();
             }*/
             LocalDateTime startDateTime = startTimeSet(process);
@@ -91,7 +91,6 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
                 }else{
                     startDateTime = startDateTime.plusMinutes(process.getDelay() * 20);
                 }
-
             }
             scoreDirector.beforeVariableChanged(process, "startTime");
             process.setStartTime(startDateTime);
@@ -266,7 +265,7 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
                     }
                     // 对比设备已运行时间(包括排程中添加的作业)来修正时间
                     LocalDateTime proStartTime = lastMaxStartTime;
-                    /*LocalDateTime proEndTime = proStartTime.plusMinutes(process.getProduceTime());
+                    LocalDateTime proEndTime = proStartTime.plusMinutes(process.getProduceTime());
                     List<EquipmentRunTime> equipmentRunTimes = process.getEquipment().getEquipmentRunTimes();
                     List<EquipmentRunTime> allRunTimes = new ArrayList<>();
                     if(equipmentRunTimes != null && equipmentRunTimes.size()>0){
@@ -277,8 +276,7 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
                             allRunTimes.add(copy);
                         }
                     }
-                    if(process.getEquipment().getProcessesList() != null && process.getEquipment().getProcessesList().size()>0){
-//                            System.out.println("process.getEquipment().getProcessesList():"+process.getEquipment().getProcessesList().size());
+                    /*if(process.getEquipment().getProcessesList() != null && process.getEquipment().getProcessesList().size()>0){
                         for (ProductionProcesses productionProcesses : process.getEquipment().getProcessesList()) {
                             if(productionProcesses.getStartTime() != null && productionProcesses.getEndTime() != null && !productionProcesses.getId().equals(process.getId())){
                                 EquipmentRunTime copy = new EquipmentRunTime();
@@ -287,7 +285,7 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
                                 allRunTimes.add(copy);
                             }
                         }
-                    }
+                    }*/
                     // 按照开始时间排序
                     allRunTimes.sort(Comparator.comparing(EquipmentRunTime::getStartRunTime));
 
@@ -300,7 +298,7 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
                                 proEndTime = proStartTime.plusMinutes(process.getProduceTime());
                             }
                         }
-                    }*/
+                    }
 
                     toUpdateStartTime = proStartTime;
                 }

+ 51 - 11
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/score/ApsConstraintProvider.java

@@ -607,8 +607,9 @@ public class ApsConstraintProvider implements ConstraintProvider {
         return constraintFactory.forEach(ProductionProcesses.class)
                 .groupBy(ProductionProcesses::getEquipmentId, ConstraintCollectors.toList())
                 .filter((equipmentId,processes) -> {
+                    Equipment equipment = null;
                     if(processes != null && processes.size()>0){
-                        Equipment equipment = processes.get(0).getEquipment();
+                        equipment = processes.get(0).getEquipment();
                         List<ProductionProcesses> plist = new ArrayList<>();
                         for (ProductionProcesses process : processes) {
                             ProductionProcesses pro = new ProductionProcesses();
@@ -621,12 +622,28 @@ public class ApsConstraintProvider implements ConstraintProvider {
                         }
                         equipment.setProcessesList(plist);
                     }
-
                     List<ProductionProcesses> hasStartTimeProcess = processes.stream().filter(v -> v.getStartTime() != null).collect(Collectors.toList());
+                    // 设备占用时间参与连续生产排程
+                    if(equipment != null && equipment.getEquipmentRunTimes() != null && equipment.getEquipmentRunTimes().size()>0){
+                        for (EquipmentRunTime equipmentRunTime : equipment.getEquipmentRunTimes()) {
+                            ProductionProcesses pp = new ProductionProcesses();
+                            pp.setStartTime(equipmentRunTime.getStartRunTime());
+                            pp.setSeriesProduceMark(equipmentRunTime.getSeriesProduceMark());
+                            pp.setProcessType(equipmentRunTime.getProcessType());
+                            hasStartTimeProcess.add(pp);
+                        }
+                    }
 
                     if(hasStartTimeProcess != null && hasStartTimeProcess.size()>1){
                         // 安装开始时间排序
                         Collections.sort(hasStartTimeProcess, Comparator.comparing(ProductionProcesses::getStartTime));
+                        // 获取设备已排程好的最后一个作业,计算连续加工
+                        if(equipment.getLastProcessType() != null && equipment.getLastSeriesProduceMark() != null){
+                            ProductionProcesses pp = new ProductionProcesses();
+                            pp.setSeriesProduceMark(equipment.getLastSeriesProduceMark());
+                            pp.setProcessType(equipment.getLastProcessType());
+                            hasStartTimeProcess.add(0,pp);
+                        }
                         // 临时标记
                         Boolean a = false;
                         for(int i=0;i<hasStartTimeProcess.size()-1;i++){
@@ -668,15 +685,39 @@ public class ApsConstraintProvider implements ConstraintProvider {
                 })
                 .penalize(HardSoftScore.ONE_SOFT,(equipmentId,processes)->{
                     int b = 0;
-                    /*for(int i=0;i<processes.size()-1;i++){
-                        if(processes.get(i).getSeriesProduceMark() != null && processes.get(i+1).getSeriesProduceMark() != null){
-                            if("铸轧".equals(processes.get(i).getProcessType())){
-                                if(!processes.get(i).getSeriesProduceMark().equals(processes.get(i+1).getSeriesProduceMark())){
+                    Equipment equipment = null;
+                    if(processes != null && processes.size()>0){
+                        equipment = processes.get(0).getEquipment();
+                    }
+                    List<ProductionProcesses> hasStartTimeProcess = processes.stream().filter(v -> v.getStartTime() != null).collect(Collectors.toList());
+                    // 设备占用时间参与连续生产排程
+                    if(equipment != null && equipment.getEquipmentRunTimes() != null && equipment.getEquipmentRunTimes().size()>0){
+                        for (EquipmentRunTime equipmentRunTime : equipment.getEquipmentRunTimes()) {
+                            ProductionProcesses pp = new ProductionProcesses();
+                            pp.setStartTime(equipmentRunTime.getStartRunTime());
+                            pp.setSeriesProduceMark(equipmentRunTime.getSeriesProduceMark());
+                            pp.setProcessType(equipmentRunTime.getProcessType());
+                            hasStartTimeProcess.add(pp);
+                        }
+                    }
+                    // 按照开始时间排序
+                    Collections.sort(hasStartTimeProcess, Comparator.comparing(ProductionProcesses::getStartTime));
+                    // 获取设备已排程好的最后一个作业,计算连续加工
+                    if(equipment.getLastProcessType() != null && equipment.getLastSeriesProduceMark() != null){
+                        ProductionProcesses pp = new ProductionProcesses();
+                        pp.setSeriesProduceMark(equipment.getLastSeriesProduceMark());
+                        pp.setProcessType(equipment.getLastProcessType());
+                        hasStartTimeProcess.add(0,pp);
+                    }
+                    for(int i=0;i<hasStartTimeProcess.size()-1;i++){
+                        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())){
                                     b++;
                                 }
-                            } else if ("冷轧".equals(processes.get(i).getProcessType())) {
-                                String[] serspre = processes.get(i).getSeriesProduceMark().split("^_^");
-                                String[] sersafter = processes.get(i+1).getSeriesProduceMark().split("^_^");
+                            } else if ("冷轧".equals(hasStartTimeProcess.get(i).getProcessType())) {
+                                String[] serspre = hasStartTimeProcess.get(i).getSeriesProduceMark().split("^_^");
+                                String[] sersafter = hasStartTimeProcess.get(i+1).getSeriesProduceMark().split("^_^");
                                 if(serspre.length == 3 && sersafter.length == 3){
                                     if(!serspre[0].equals(sersafter[0]) || !serspre[1].equals(sersafter[1])){
                                         b++;
@@ -698,9 +739,8 @@ public class ApsConstraintProvider implements ConstraintProvider {
                         }
                     }
                     if(b>0){
-//                        System.out.println("扣分:"+b);
                         return b;
-                    }*/
+                    }
                     return 1;
                 })
                 .asConstraint("seriesProduce");

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

@@ -1,5 +1,6 @@
 package com.rongwei.rwapsserver.aps.service.impl;
 
+import cn.hutool.core.util.StrUtil;
 import com.rongwei.rwapsserver.aps.domain.ApsOverallConfig;
 import com.rongwei.rwapsserver.aps.domain.ApsSolution;
 import com.rongwei.rwapsserver.aps.domain.Equipment;
@@ -111,19 +112,18 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
                 String constraintName = v.getConstraintName();
                 if(constraintName != null){
                     String desc = ApsConstants.constraintDesc.get(constraintName);
+                    String consLevel = ApsConstants.hardConstraint.contains(constraintName) ? "hard" : "soft";
                     if(desc != null && v.getConstraintMatchSet() != null && v.getConstraintMatchSet().size()>0){
                         for (ConstraintMatch<HardSoftScore> hardSoftScoreConstraintMatch : v.getConstraintMatchSet()) {
                             if(hardSoftScoreConstraintMatch.getIndictedObjectList() != null && hardSoftScoreConstraintMatch.getIndictedObjectList().size() > 0){
                                 for (Object o : hardSoftScoreConstraintMatch.getIndictedObjectList()) {
                                     if(o instanceof ProductionProcesses){
                                         ProductionProcesses productionProcesses = (ProductionProcesses)o;
-                                        productionProcesses.setHasConflict("y");
-                                        productionProcesses.setConflictDes(desc);
+                                        constraintDescInit(productionProcesses,desc,consLevel);
                                     } else if (o instanceof ArrayList) {
                                         List<ProductionProcesses> processesList = (ArrayList)o;
                                         for (ProductionProcesses productionProcesses : processesList) {
-                                            productionProcesses.setHasConflict("y");
-                                            productionProcesses.setConflictDes(desc);
+                                            constraintDescInit(productionProcesses,desc,consLevel);
                                         }
                                     }
                                 }
@@ -135,6 +135,37 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
         }
     }
 
+    /**
+     * 冲突描述
+     * @param productionProcesses
+     * @param desc
+     * @param consLevel
+     */
+    private void constraintDescInit(ProductionProcesses productionProcesses,String desc,String consLevel){
+        if("y".equals(productionProcesses.getHasConflict())){
+            if("hard".equals(consLevel)){
+                if(StrUtil.isBlank(productionProcesses.getConflictDes())){
+                    productionProcesses.setConflictDes(desc);
+                }else{
+                    productionProcesses.setConflictDes(productionProcesses.getConflictDes()+";"+desc);
+                }
+            }else{
+                if(StrUtil.isBlank(productionProcesses.getSoftconflictdes())){
+                    productionProcesses.setSoftconflictdes(desc);
+                }else{
+                    productionProcesses.setSoftconflictdes(productionProcesses.getSoftconflictdes()+";"+desc);
+                }
+            }
+        }else{
+            productionProcesses.setHasConflict("y");
+            if("hard".equals(consLevel)){
+                productionProcesses.setConflictDes(desc);
+            }else{
+                productionProcesses.setSoftconflictdes(desc);
+            }
+        }
+    }
+
     /**
      * 业务数据模型转换前置处理
      * @param productionScheduleVo

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

@@ -1,6 +1,8 @@
 package com.rongwei.rwapsserver.aps.util;
 
+import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 public class ApsConstants {
@@ -9,6 +11,8 @@ public class ApsConstants {
 
     public final static Map<String,String> constraintDesc = new HashMap<>();
 
+    public final static List<String> hardConstraint = new ArrayList<>();
+
     static {
         constraintDesc.put("eqTypeSame","工序作业所需的设备必须在工序的可选设备之内");
         constraintDesc.put("noPreGbAfterNow","第一步工序作业要小于开始排程时间");
@@ -18,6 +22,13 @@ public class ApsConstants {
         constraintDesc.put("eqTimeCross","排程过程中出现相同设备排产时间段有交叉");
         constraintDesc.put("deliveryDate","订单交货期不满足");
         constraintDesc.put("seriesProduce","订单的连续生产要求不满足");
+
+        hardConstraint.add("eqTypeSame");
+        hardConstraint.add("noPreGbAfterNow");
+        hardConstraint.add("hasOnePreGbAfterNow");
+        hardConstraint.add("equipmentRunTime");
+        hardConstraint.add("lzTimeLessMaxWait");
+        hardConstraint.add("eqTimeCross");
     }
 
 }