소스 검색

排程优化

fangpy 10 달 전
부모
커밋
e39a8d97f3

+ 89 - 266
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/listener/TaskStartTimeListener.java

@@ -214,265 +214,6 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
         }
     }
 
-    /**
-     * 设置开始时间
-     * @param process
-     */
-    /*private LocalDateTime startTimeSet(ProductionProcesses process,ScoreDirector<ApsSolution> scoreDirector){
-        // 时间设定
-        LocalDateTime toUpdateStartTime = null;
-        if(process.getEquipment() != null){
-           *//* if("ec0e36791ac845f4bd7aa21dc5ad45ba".equals(process.getId()) && "0001be252874536843730b100020".equals(process.getEquipment().getId())){
-                System.out.println("process.getId():"+process.getId()+";process.getEquipment().getId():"+process.getEquipment().getId()+";process.getDelay():"+process.getDelay());
-                process.getId();
-            }*//*
-            // 获取所有规划实体对象数据
-            ApsSolution workingSolution = scoreDirector.getWorkingSolution();
-            // 最大单批次生产时间
-            Integer maxUnitProduceTime = 0;
-            // 最大流转时间
-            Integer lzMaxTimes = 0;
-            // 前道工序最小首批加工最大等待时间
-            LocalDateTime lastFirstMaxWaitTime = null;
-            if(process.getPreviousProcesses() != null && process.getPreviousProcesses().size()>0){
-                // 瓶颈工序,简化为等待前道工序全部完成才加工后道工序
-                if((process.getBottleneck() != null && process.getBottleneck())
-                        || (process.getPreviousProcesses().get(0).getBottleneck() != null && process.getPreviousProcesses().get(0).getBottleneck())){
-                    LocalDateTime lastMaxStartTime = null;
-                    LocalDateTime lastMinMaxWaitTime = null;
-                    for (ProductionProcesses previousProcess : process.getPreviousProcesses()) {
-                        if(previousProcess.getEquipment() == null){
-                            System.out.println("previousProcess.getEquipment() == null:"+process.getId());
-                            continue;
-                        }
-                        // 流转时间
-                        Integer lzTimes = 0;
-                        if(previousProcess.getEquipment().getWorkshopid() != null && previousProcess.getEquipment().getWorkshopid().equals(process.getEquipment().getWorkshopid())){
-                            lzTimes = process.getApsOverallConfig().getRoamTime().get("WORKSHOP_IN");
-                        }else{
-                            lzTimes = process.getApsOverallConfig().getRoamTime().get("WORKSHOP_CROSS");
-                        }
-                        if(lzMaxTimes<lzTimes){
-                            lzMaxTimes = lzTimes;
-                        }
-                        // 最小等待时间
-                        Integer minWaitTime = previousProcess.getMinWaitTime() == null ? 0 : previousProcess.getMinWaitTime();
-                        if(lzTimes>minWaitTime){
-                            minWaitTime = lzTimes;
-                        }
-                        if(lastMaxStartTime == null){
-                            lastMaxStartTime = previousProcess.getEndTime().plusMinutes(minWaitTime);
-                        }else {
-                            if(lastMaxStartTime.compareTo(previousProcess.getEndTime().plusMinutes(minWaitTime))<0){
-                                lastMaxStartTime = previousProcess.getEndTime().plusMinutes(minWaitTime);
-                            }
-                        }
-                        // 如有最大等待时间,计算首批次加工等待时间不能超过最大等待时间
-                        if(previousProcess.getMaxWaitTime() != null){
-                            if(lastMinMaxWaitTime == null){
-                                lastMinMaxWaitTime = previousProcess.getEndTime().plusMinutes(previousProcess.getMaxWaitTime());
-                            }else{
-                                if(previousProcess.getEndTime().plusMinutes(previousProcess.getMaxWaitTime()).compareTo(lastMinMaxWaitTime)<0){
-                                    lastMinMaxWaitTime = previousProcess.getEndTime().plusMinutes(previousProcess.getMaxWaitTime());
-                                }
-                            }
-                        }
-                    }
-                    // 对比设备已运行时间(包括排程中添加的作业)来修正时间
-                    LocalDateTime proStartTime = seriesWaitTime(workingSolution,process,lastMaxStartTime);
-
-                    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) {
-                            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 && !productionProcesses.getId().equals(process.getId())){
-                                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;
-                }
-                // 非瓶颈工序,非瓶颈工序,默认前道工序只有一个
-                else{
-                    // 此种情况简化为前道工序只有一个
-                    ProductionProcesses preProcess = process.getPreviousProcesses().get(0);
-                    if(preProcess.getStartTime() != null){
-                        maxUnitProduceTime = preProcess.getUnitProduceTime();
-                        // 前道工序的所有下道工序
-                        List<ProductionProcesses> nextProcesses = new ArrayList<>();
-                        if(preProcess.getNextProcesses() != null && preProcess.getNextProcesses().size()>0){
-                            for (ProductionProcesses nextProcess : preProcess.getNextProcesses()) {
-                                nextProcesses.add(nextProcess);
-                            }
-                        }
-                        Map<String,Integer> map = new HashMap<>();
-                        for (ProductionProcesses nextProcess : nextProcesses) {
-                            map.put(nextProcess.getId(),0);
-                            allNextProduceTime(nextProcess,map,nextProcess.getId());
-                            nextProcess.setNextAllProduceTime(map.get(nextProcess.getId()));
-                        }
-                        nextProcesses.sort((o1, o2) -> o1.getNextAllProduceTime().compareTo(o2.getNextAllProduceTime()));
-                        // 前道工序
-                        LocalDateTime startTime = preProcess.getStartTime();
-                        LocalDateTime endTime = preProcess.getStartTime();
-                        for (ProductionProcesses nextProcess : nextProcesses) {
-                            int i = preProcess.getUnitProduceTime() * nextProcess.getProducePcNum();
-                            if(!nextProcess.getId().equals(process.getId())){
-                                startTime = startTime.plusMinutes(i);
-                            }else{
-                                endTime = startTime.plusMinutes(i);
-                            }
-                        }
-
-                        // 流转时间
-                        Integer lzTimes = 0;
-                        if(preProcess.getEquipment().getWorkshopid() != null && preProcess.getEquipment().getWorkshopid().equals(process.getEquipment().getWorkshopid())){
-                            lzTimes = process.getApsOverallConfig().getRoamTime().get("WORKSHOP_IN");
-                        }else{
-                            lzTimes = process.getApsOverallConfig().getRoamTime().get("WORKSHOP_CROSS");
-                        }
-                        // 最小等待时间对比流转时间
-                        if(preProcess.getMinWaitTime() != null && lzTimes<preProcess.getMinWaitTime()){
-                            lzTimes = preProcess.getMinWaitTime();
-                        }
-
-                        *//**
-                         * 后道工序批次生产时间大于等于前道工序批次生产时间
-                         * 从第一批次开始往后排程
-                         *//*
-
-                        if(preProcess.getMaxWaitTime() != null){
-                            lastFirstMaxWaitTime = startTime.plusMinutes(preProcess.getUnitProduceTime()).plusMinutes(preProcess.getMaxWaitTime());
-                        }
-                        LocalDateTime lastStartTime = null;
-                        if(process.getUnitProduceTime()>=maxUnitProduceTime){
-                            lastStartTime = startTime.plusMinutes(preProcess.getUnitProduceTime()).plusMinutes(lzTimes);
-                            process.setEndTime(lastStartTime.plusMinutes(process.getProduceTime()));
-                        }
-                        *//**
-                         * 后道工序批次生产时间小于前道工序批次生产时间
-                         * 从最后批次开始往前排程
-                         *//*
-                        else{
-                            // 开始时间:最后一批次结束时间加流转时间,再往前倒排批次数减一乘以单批次生产时间
-                            lastStartTime = endTime.plusMinutes(lzTimes).minusMinutes(process.getUnitProduceTime() * (process.getProducePcNum() - 1));
-                            // 结束时间重新赋值
-                            process.setEndTime(endTime.plusMinutes(lzTimes).plusMinutes(process.getUnitProduceTime()));
-                        }
-                        // 对比设备已运行时间(包括排程中添加的作业)来修正时间
-                        LocalDateTime proStartTime = seriesWaitTime(workingSolution,process,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) {
-                                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 && !productionProcesses.getId().equals(process.getId())){
-                                    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;
-                    }
-                }
-            }else{
-                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) {
-                        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 && !productionProcesses.getId().equals(process.getId())){
-                            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;
-            }
-
-            *//*if("6473acca9af24b95956a891520b21357".equals(process.getId())){
-                log.info("前道工序开始时间:"+process.getPreviousProcesses().get(0).getStartTime());
-                log.info("前道工序结束时间:"+process.getPreviousProcesses().get(0).getEndTime());
-
-                log.info("当前工序开始时间:"+toUpdateStartTime);
-            }*//*
-        }
-        return toUpdateStartTime;
-    }*/
-
     private LocalDateTime startTimeNewSet(ProductionProcesses process,ScoreDirector<ApsSolution> scoreDirector){
         if(process.getId().equals("39224859c48946c8a8984380120caa65")){
             int a = 0;
@@ -563,6 +304,14 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
                     copy.setCutfinishmin(equipmentRunTime.getCutfinishmin() == null ? 0 : equipmentRunTime.getCutfinishmin());
                     copy.setPrepressworkmin(equipmentRunTime.getPrepressworkmin() == null ? 0 : equipmentRunTime.getPrepressworkmin());
                     copy.setMinThGroupNames(equipmentRunTime.getMinThGroupNames());
+                    copy.setVolumeMetal(equipmentRunTime.getVolumeMetal());
+                    copy.setVolumeMetalstate(equipmentRunTime.getVolumeMetalstate());
+                    copy.setMaxVolumeWidth(equipmentRunTime.getMaxVolumeWidth());
+                    copy.setMaxThickness(equipmentRunTime.getMaxThickness());
+                    copy.setMaxSinglerollweight(equipmentRunTime.getMaxSinglerollweight());
+                    copy.setMinVolumeWidth(equipmentRunTime.getMinVolumeWidth());
+                    copy.setMinThickness(equipmentRunTime.getMinThickness());
+                    copy.setMinSinglerollweight(equipmentRunTime.getMinSinglerollweight());
                     equipmentRunTimes.add(copy);
                 }
             }
@@ -642,7 +391,7 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
             // 按照开始时间排序
             equipmentRunTimes.sort(Comparator.comparing(EquipmentRunTime::getStartRunTime));
 
-            if(process.getEquipmentId().equals("ea69835012de4f2cb9c52496df8be111")){
+            if(process.getEquipmentId().equals("0001be252874536843730b100163")){
                 int a = 0;
             }
             Integer delay = process.getDelay();
@@ -779,23 +528,97 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
                 if(process.getProcessType().equals(equipmentRunTime.getProcessType())
                         && process.getVolumeMetal().equals(equipmentRunTime.getVolumeMetal())
                         && process.getVolumeMetalstate().equals(equipmentRunTime.getVolumeMetalstate())){
+                    // 最大、最小宽度
+                    BigDecimal maxVolumeWidth = equipmentRunTime.getMaxVolumeWidth();
+                    BigDecimal minVolumeWidth = equipmentRunTime.getMinVolumeWidth();
+                    if(process.getVolumeWidth().compareTo(maxVolumeWidth)>0){
+                        maxVolumeWidth = process.getVolumeWidth();
+                    }
+                    if(process.getVolumeWidth().compareTo(minVolumeWidth)<0){
+                        minVolumeWidth = process.getVolumeWidth();
+                    }
+                    // 最大、最小厚度
+                    BigDecimal maxVolumeThickness = equipmentRunTime.getMaxThickness();
+                    BigDecimal minVolumeThickness = equipmentRunTime.getMinThickness();
+                    if(process.getVolumeThickness().compareTo(maxVolumeThickness)>0){
+                        maxVolumeThickness = process.getVolumeThickness();
+                    }
+                    if(process.getVolumeThickness().compareTo(minVolumeThickness)<0){
+                        minVolumeThickness = process.getVolumeThickness();
+                    }
+                    // 最大、最小重量
+                    BigDecimal maxSinglerollweight = equipmentRunTime.getMaxSinglerollweight();
+                    BigDecimal minSinglerollweight = equipmentRunTime.getMinSinglerollweight();
+                    if(process.getSinglerollweight().compareTo(maxSinglerollweight)>0){
+                        maxSinglerollweight = process.getSinglerollweight();
+                    }
+                    if(process.getSinglerollweight().compareTo(minSinglerollweight)<0){
+                        minSinglerollweight = process.getSinglerollweight();
+                    }
+                    // 根据最小厚度查询厚差
+                    BigDecimal ztkc = new BigDecimal("250");
+                    BigDecimal ctkc = new BigDecimal("200");
+                    if(process.getApsOverallConfig().getMiddifference() != null && process.getApsOverallConfig().getMiddifference()>0){
+                        ztkc = new BigDecimal(process.getApsOverallConfig().getMiddifference());
+                    }
+                    if(process.getApsOverallConfig().getFurnacedifference() != null && process.getApsOverallConfig().getFurnacedifference()>0){
+                        ctkc = new BigDecimal(process.getApsOverallConfig().getFurnacedifference());
+                    }
+                    BigDecimal zthc = new BigDecimal("0.05");
+                    BigDecimal cthc = new BigDecimal("0.05");
+                    List<ApsAnnealingDifferenceDo> apsAnnealingDifferences = process.getApsOverallConfig().getApsAnnealingDifferences();
+                    if(apsAnnealingDifferences != null && apsAnnealingDifferences.size()>0){
+                        for (ApsAnnealingDifferenceDo apsAnnealingDifference : apsAnnealingDifferences) {
+                            BigDecimal startthickness = apsAnnealingDifference.getStartthickness();
+                            BigDecimal endthickness = apsAnnealingDifference.getEndthickness();
+                            if(startthickness == null && endthickness == null){
+                                continue;
+                            }
+                            boolean fl = true;
+                            if(startthickness != null){
+                                if(minVolumeThickness.compareTo(startthickness)<0){
+                                    fl = false;
+                                }
+                            }
+                            if(endthickness != null){
+                                if(minVolumeThickness.compareTo(endthickness)>0){
+                                    fl = false;
+                                }
+                            }
+                            if(fl){
+                                BigDecimal declinedifference = apsAnnealingDifference.getDeclinedifference();
+                                BigDecimal moderatedifference = apsAnnealingDifference.getModeratedifference();
+                                if(declinedifference != null){
+                                    cthc = declinedifference;
+                                }
+                                if(moderatedifference != null){
+                                    zthc = moderatedifference;
+                                }
+                            }
+                        }
+                    }
+
                     BigDecimal btVolumeWidth = null;
                     BigDecimal btVolumeThickness = null;
                     BigDecimal btSinglerollweight = null;
                     if("成退".equals(process.getProcessType())){
-                        btVolumeWidth = new BigDecimal("50");
-                        btVolumeThickness = new BigDecimal("0.05");
+                        btVolumeWidth = ctkc;
+                        btVolumeThickness = cthc;
                         btSinglerollweight = new BigDecimal("1");
                     }else if ("中退".equals(process.getProcessType())){
-                        btVolumeWidth = new BigDecimal("100");
-                        btVolumeThickness = new BigDecimal("0.08");
+                        btVolumeWidth = ztkc;
+                        btVolumeThickness = zthc;
                         btSinglerollweight = new BigDecimal("1");
                     }
-                    if(equipmentRunTime.getMaxVolumeWidth().subtract(equipmentRunTime.getMinVolumeWidth()).compareTo(btVolumeWidth)<=0
+                    if(maxVolumeWidth.subtract(minVolumeWidth).compareTo(btVolumeWidth)<=0 && maxVolumeThickness.subtract(minVolumeThickness).compareTo(btVolumeThickness)<=0
+                            && maxSinglerollweight.subtract(minSinglerollweight).compareTo(btSinglerollweight)<=0){
+                        hasMergeTh = true;
+                    }
+                    /*if(equipmentRunTime.getMaxVolumeWidth().subtract(equipmentRunTime.getMinVolumeWidth()).compareTo(btVolumeWidth)<=0
                             && equipmentRunTime.getMaxThickness().subtract(equipmentRunTime.getMinThickness()).compareTo(btVolumeThickness)<=0
                             && equipmentRunTime.getMaxSinglerollweight().subtract(equipmentRunTime.getMinSinglerollweight()).compareTo(btSinglerollweight)<=0){
                         hasMergeTh = true;
-                    }
+                    }*/
                 }
             }else{
                 // 小卷成退合并工序

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

@@ -366,6 +366,13 @@ public class ApsServiceImpl implements ApsService {
         return mergeprocesses;
     }
 
+    /**
+     * 不同坯料计划之间的退火合并
+     */
+    private void mergeBlanksTh(List<ProductionProcesses> mergeprocesses){
+
+    }
+
     /**
      * 退火外合并工序:
      * 根据退火工序合并冷轧、箔轧工序,同一个退火炉的冷轧、箔轧