Browse Source

APS平台生产排程平台规划算法

fangpy 1 year ago
parent
commit
6f6e86079e

+ 2 - 0
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/domain/AluminumCoil.java

@@ -8,6 +8,8 @@ public class AluminumCoil {
 
     // 业务作业ID
     private String bsId;
+    // 业务坯料计划ID
+    private String blankid;
     // 单卷宽
     private BigDecimal volumeWidth;
     // 单卷厚度

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

@@ -75,6 +75,11 @@ public class Equipment extends ApsAbstractPersistable{
      */
     private EquipmentParameter equipmentParameter;
 
+    /**
+     * 设备零件已运行时长
+     */
+    private Integer eqPartRunTime;
+
     /**
      * 设备上排产的工序
      */

+ 78 - 12
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/domain/ProductionProcesses.java

@@ -8,6 +8,7 @@ import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * 工步,工艺路线里的工步
@@ -164,6 +165,21 @@ public class ProductionProcesses extends ApsAbstractPersistable{
      */
     private Boolean ifLock;
 
+    /**
+     * 单卷宽度
+     */
+    private BigDecimal volumeWidth;
+
+    /**
+     * 合金
+     */
+    private String volumeMetal;
+
+    /**
+     * 输入物料
+     */
+    private String inputMaterials;
+
     public String getEquipmentType() {
         return equipmentType;
     }
@@ -184,20 +200,35 @@ public class ProductionProcesses extends ApsAbstractPersistable{
                 this.equipmentId = equipment.getId();
             }
         }
-        /*if(this.equipment != null){
+        if(this.equipment != null){
             // 设置设备的工序占用
             if(this.equipment.getProcessesList() == null){
                 this.equipment.setProcessesList(new ArrayList<>());
             }
-            ProductionProcesses pp = new ProductionProcesses();
-            pp.setId(this.getId());
-            pp.setEquipmentId(this.getEquipmentId());
-//            pp.setEquipment(this.getEquipment());
-            pp.setProduceTime(this.getProduceTime());
-            pp.setStartTime(this.getStartTime());
-            pp.setEndTime(this.getEndTime());
-            this.equipment.getProcessesList().add(pp);
-        }*/
+            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() {
@@ -227,6 +258,17 @@ public class ProductionProcesses extends ApsAbstractPersistable{
             if(startTime != null){
                 this.endTime = startTime.plusMinutes(produceTime);
             }
+            // 零件更换时间,查询设备已运行时间,以及最后一道工序的参数
+            /*if(this.equipment != null && equipment.getProcessesList() != null && equipment.getProcessesList().size()>0){
+                // 最后一道工序
+                ProductionProcesses lastProcesses = equipment.getProcessesList().get(equipment.getProcessesList().size() - 1);
+                String volumeMetal1 = lastProcesses.getVolumeMetal();
+                BigDecimal volumeWidth1 = lastProcesses.getVolumeWidth();
+                
+                if(this.volumeMetal != null && this.volumeMetal.equals(volumeMetal1) && this.volumeWidth.equals(volumeWidth1)){
+
+                }
+            }*/
         }
     }
 
@@ -259,13 +301,13 @@ public class ProductionProcesses extends ApsAbstractPersistable{
 
     public void setNextProcesses(List<ProductionProcesses> nextProcesses) {
         this.nextProcesses = nextProcesses;
-        if(nextProcesses != null){
+        /*if(nextProcesses != null){
             List<String> ids = new ArrayList<>();
             for (ProductionProcesses nextProcesse : nextProcesses) {
                 ids.add(nextProcesse.getId());
             }
             this.nextProcessesIds = ids;
-        }
+        }*/
     }
 
     public List<ProduceOrder> getProduceOrder() {
@@ -411,4 +453,28 @@ public class ProductionProcesses extends ApsAbstractPersistable{
     public void setProcessType(String processType) {
         this.processType = processType;
     }
+
+    public BigDecimal getVolumeWidth() {
+        return volumeWidth;
+    }
+
+    public void setVolumeWidth(BigDecimal volumeWidth) {
+        this.volumeWidth = volumeWidth;
+    }
+
+    public String getVolumeMetal() {
+        return volumeMetal;
+    }
+
+    public void setVolumeMetal(String volumeMetal) {
+        this.volumeMetal = volumeMetal;
+    }
+
+    public String getInputMaterials() {
+        return inputMaterials;
+    }
+
+    public void setInputMaterials(String inputMaterials) {
+        this.inputMaterials = inputMaterials;
+    }
 }

+ 65 - 8
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/score/ApsConstraintProvider.java

@@ -462,6 +462,14 @@ public class ApsConstraintProvider implements ConstraintProvider {
                     if(productionProcesses.getPreviousProcesses() != null && productionProcesses.getPreviousProcesses().size()>0){
                         for (ProductionProcesses previousProcess : productionProcesses.getPreviousProcesses()) {
                             Integer lzTimes = 0;
+                            if(previousProcess.getEquipment() == null){
+                                System.out.println("previousProcess.getEquipment() == null");
+                                System.out.println(previousProcess.getBsProcessesId());
+                                System.out.println(previousProcess.getId());
+                            }
+                            if(productionProcesses.getEquipment() == null){
+                                System.out.println("productionProcesses.getEquipment() == null");
+                            }
                             if(previousProcess.getEquipment().getWorkshopid() != null && previousProcess.getEquipment().getWorkshopid().equals(productionProcesses.getEquipment().getWorkshopid())){
                                 lzTimes = productionProcesses.getApsOverallConfig().getRoamTime().get("WORKSHOP_IN");
                             }else{
@@ -594,9 +602,35 @@ public class ApsConstraintProvider implements ConstraintProvider {
                         // 临时标记
                         Boolean a = false;
                         for(int i=0;i<processes.size()-1;i++){
-                            if(processes.get(i).getSeriesProduceMark() != null && processes.get(i+1).getSeriesProduceMark() != null
-                                    && !processes.get(i).getSeriesProduceMark().equals(processes.get(i+1).getSeriesProduceMark())){
-                                a = true;
+                            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())){
+                                        a = true;
+                                        break;
+                                    }
+                                } else if ("冷轧".equals(processes.get(i).getProcessType())) {
+                                    String[] serspre = processes.get(i).getSeriesProduceMark().split("^_^");
+                                    String[] sersafter = processes.get(i+1).getSeriesProduceMark().split("^_^");
+                                    if(serspre.length == 3 && sersafter.length == 3){
+                                        if(!serspre[0].equals(sersafter[0]) || !serspre[1].equals(sersafter[1])){
+                                            a = true;
+                                            break;
+                                        }else{
+                                            String s1 = serspre[2];
+                                            String s2 = sersafter[2];
+                                            try{
+                                                Integer i1 = Integer.parseInt(s1);
+                                                Integer i2 = Integer.parseInt(s2);
+                                                if(i1<i2 || (i1-i2)>30){
+                                                    a = true;
+                                                    break;
+                                                }
+                                            }catch (Exception e){
+                                                e.printStackTrace();
+                                            }
+                                        }
+                                    }
+                                }
                             }
                         }
                         return a;
@@ -604,12 +638,35 @@ public class ApsConstraintProvider implements ConstraintProvider {
                         return false;
                     }
                 })
-                .penalize(HardSoftScore.ONE_SOFT,(proc1,proc2)->{
+                .penalize(HardSoftScore.ONE_SOFT,(equipmentId,processes)->{
                     int b = 0;
-                    for(int i=0;i<proc2.size()-1;i++){
-                        if(proc2.get(i).getSeriesProduceMark() != null && proc2.get(i+1).getSeriesProduceMark() != null
-                                && !proc2.get(i).getSeriesProduceMark().equals(proc2.get(i+1).getSeriesProduceMark())){
-                            b++;
+                    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())){
+                                    b++;
+                                }
+                            } else if ("冷轧".equals(processes.get(i).getProcessType())) {
+                                String[] serspre = processes.get(i).getSeriesProduceMark().split("^_^");
+                                String[] sersafter = processes.get(i+1).getSeriesProduceMark().split("^_^");
+                                if(serspre.length == 3 && sersafter.length == 3){
+                                    if(!serspre[0].equals(sersafter[0]) || !serspre[1].equals(sersafter[1])){
+                                        b++;
+                                    }else{
+                                        String s1 = serspre[2];
+                                        String s2 = sersafter[2];
+                                        try{
+                                            Integer i1 = Integer.parseInt(s1);
+                                            Integer i2 = Integer.parseInt(s2);
+                                            if(i1<i2 || (i1-i2)>30){
+                                                b++;
+                                            }
+                                        }catch (Exception e){
+                                            e.printStackTrace();
+                                        }
+                                    }
+                                }
+                            }
                         }
                     }
                     if(b>0){

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

@@ -202,7 +202,16 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
                                 List<Integer> repeatPro,List<ProductionProcesses> processes,Map<Integer,Integer> repeatProMap){
         if(proces.getNextProcesses() != null && proces.getNextProcesses().size()>0){
             for (ProductionProcesses nextProcess : proces.getNextProcesses()) {
-                subprocesses.add(nextProcess);
+                int existprocess = -1;
+                for (int i = 0; i < subprocesses.size(); i++) {
+                    if(subprocesses.get(i).getId().equals(nextProcess.getId())){
+                        existprocess = i;
+                        break;
+                    }
+                }
+                if(existprocess==-1){
+                    subprocesses.add(nextProcess);
+                }
                 // 重复的工序
                 if(processes != null && processes.size()>0){
                     for (int i=0;i<processes.size();i++) {