Browse Source

调度排程优化

fangpy 5 months ago
parent
commit
a7a55c2681

+ 3 - 87
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/controller/ApsSchedulingController.java

@@ -87,96 +87,12 @@ public class ApsSchedulingController {
      */
     @PostMapping("/test")
     public ProductionScheduleRetVo test(@RequestBody ProductionScheduleVo productionScheduleVo) throws Exception{
-        productionScheduleVo.setProcesses(processesInit());
-        ProductionScheduleRetVo productionScheduleRetVo = productionScheduleService.productionSchedule(productionScheduleVo);
-        return productionScheduleRetVo;
+        processesInit(productionScheduleVo);
+        return new ProductionScheduleRetVo();
     }
 
-    private List<ProductionProcesses> processesInit(){
-        List<ProductionProcesses> processes = new ArrayList<>();
-        for(int i=0;i<5;i++){
-            String id1 = (i*2+1)+"";
-            String id2 = (i*2+2)+"";
-            ProductionProcesses processes1 = new ProductionProcesses();
-            processes1.setId(id1);
-            processes1.setCutfinishmin(70);
-            processes1.setIfLock(false);
-            processes1.setSeriesProduceMark("1100^_^1100H14冷轧卷普料 厚6.8*宽1025mm 6吨^_^1025.00");
-            processes1.setProduceTime(720);
-            processes1.setPrepressworkmin(55);
-            processes1.setNextProcessesIds(Arrays.asList(new String[]{id2}));
-            ProduceOrder produceOrder1 = new ProduceOrder("34f200bcbac748fb8f817eea88fb9a5d","订单1", DateUtil.parseDateTime("2024-06-22 08:00:00"));
-            processes1.setProduceOrder(Arrays.asList(new ProduceOrder[]{produceOrder1}));
-            processes1.setMinWaitTime(600);
-            processes1.setVolumeMetal("1100");
-            processes1.setOptionalEquipments(Arrays.asList(new String[]{"0001be252874536843730b100018","0001be252874536843730b100017","0001be252874536843730b100016"}));
-            processes1.setUnitProduceTime(360);
-            processes1.setProcessType("铸轧");
-            processes1.setBsProcessesId(Arrays.asList(new String[]{"f29671831358404ab047848aade7e681"}));
-
-            ProductionProcesses processes2 = new ProductionProcesses();
-            processes2.setId(id2);
-            processes2.setIfLock(false);
-            processes2.setSeriesProduceMark("1100^_^1100H14冷轧卷普料 厚6.8*宽1025mm 6吨^_^1025.00");
-            processes2.setProduceTime(1440);
-            processes2.setPreviousProcessesIds(Arrays.asList(new String[]{id1}));
-            processes2.setProduceOrder(Arrays.asList(new ProduceOrder[]{produceOrder1}));
-            processes2.setMinWaitTime(310);
-            processes2.setMaxWaitTime(3000);
-            processes2.setVolumeMetal("1100");
-            processes2.setOptionalEquipments(Arrays.asList(new String[]{"0001be252874536843730b100158","0001be252874536843730b100162","0001be252874536843730b100160"}));
-            processes2.setUnitProduceTime(3100);
-            processes2.setVolumeWidth(new BigDecimal("1025"));
-            processes2.setSinglerollweight(new BigDecimal("5.8"));
-            processes2.setBottleneck(true);
-            processes2.setProcessType("成退");
-            processes2.setBsProcessesId(Arrays.asList(new String[]{"d8ac56ea9335401f871cd691d1ba9442"}));
-
-            processes.add(processes1);
-            processes.add(processes2);
-        }
-        for(int i=6;i<14;i++){
-            String id1 = (i*2+1)+"";
-            String id2 = (i*2+2)+"";
-            ProductionProcesses processes1 = new ProductionProcesses();
-            processes1.setId(id1);
-            processes1.setCutfinishmin(70);
-            processes1.setIfLock(false);
-            processes1.setSeriesProduceMark("1100^_^1100H14冷轧卷普料 厚6.8*宽1025mm 6吨^_^1025.00");
-            processes1.setProduceTime(600);
-            processes1.setPrepressworkmin(55);
-            processes1.setNextProcessesIds(Arrays.asList(new String[]{id2}));
-            ProduceOrder produceOrder1 = new ProduceOrder("34f200bcbac748fb8f817eea88fb9a5d","订单1", DateUtil.parseDateTime("2024-06-22 08:00:00"));
-            processes1.setProduceOrder(Arrays.asList(new ProduceOrder[]{produceOrder1}));
-            processes1.setMinWaitTime(600);
-            processes1.setVolumeMetal("1100");
-            processes1.setOptionalEquipments(Arrays.asList(new String[]{"0001be252874536843730b100018","0001be252874536843730b100017","0001be252874536843730b100016"}));
-            processes1.setUnitProduceTime(360);
-            processes1.setProcessType("铸轧");
-            processes1.setBsProcessesId(Arrays.asList(new String[]{"f29671831358404ab047848aade7e682"}));
-
-            ProductionProcesses processes2 = new ProductionProcesses();
-            processes2.setId(id2);
-            processes2.setIfLock(false);
-            processes2.setSeriesProduceMark("1100^_^1100H14冷轧卷普料 厚6.8*宽1025mm 6吨^_^1025.00");
-            processes2.setProduceTime(1680);
-            processes2.setPreviousProcessesIds(Arrays.asList(new String[]{id1}));
-            processes2.setProduceOrder(Arrays.asList(new ProduceOrder[]{produceOrder1}));
-            processes2.setMinWaitTime(310);
-            processes2.setMaxWaitTime(3000);
-            processes2.setVolumeMetal("1100");
-            processes2.setOptionalEquipments(Arrays.asList(new String[]{"0001be252874536843730b100158","0001be252874536843730b100162","0001be252874536843730b100160"}));
-            processes2.setUnitProduceTime(3100);
-            processes2.setBottleneck(true);
-            processes2.setVolumeWidth(new BigDecimal("1100"));
-            processes2.setSinglerollweight(new BigDecimal("7.2"));
-            processes2.setProcessType("成退");
-            processes2.setBsProcessesId(Arrays.asList(new String[]{"d8ac56ea9335401f871cd691d1ba9443"}));
+    private void processesInit(ProductionScheduleVo productionScheduleVo){
 
-            processes.add(processes1);
-            processes.add(processes2);
-        }
-        return processes;
     }
 
 }

+ 3 - 0
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/service/DdApsService.java

@@ -5,6 +5,9 @@ import com.rongwei.rwapsserver.aps.domain.ProductionProcesses;
 import java.util.List;
 
 public interface DdApsService {
+
+    List<ProductionProcesses> thOtherAllMerge(List<ProductionProcesses> mergeprocesses, List<ProductionProcesses> otherThproces);
+    
     List<ProductionProcesses> thOtherMerge(List<ProductionProcesses> mergeprocesses, List<ProductionProcesses> otherThproces);
 
     List<ProductionProcesses> seriesLzBzMerge(List<ProductionProcesses> mergeprocesses, List<ProductionProcesses> otherSerProces);

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

@@ -346,14 +346,14 @@ public class ApsServiceImpl implements ApsService {
             // 宽度
             BigDecimal prowidth1 = v1.getVolumeWidth();
             BigDecimal prowidth2 = v2.getVolumeWidth();
-            if(prowidth1.compareTo(prowidth2) == 0){
+//            if(prowidth1.compareTo(prowidth2) == 0){
                 // 合金
                 if(alloy1.compareTo(alloy2) == 0){
                     // 合金状态
                     if(alloystatus1 == null || alloystatus2 == null || alloystatus1.compareTo(alloystatus2) == 0){
                         if(v1.getApsOverallConfig().getStartTime().compareTo(v2.getApsOverallConfig().getStartTime()) == 0){
-//                            a = v2.getVolumeWidth().compareTo(v1.getVolumeWidth());
-                            a = 0;
+                            a = v2.getVolumeWidth().compareTo(v1.getVolumeWidth());
+//                            a = 0;
                         }else{
                             a = v2.getApsOverallConfig().getStartTime().compareTo(v1.getApsOverallConfig().getStartTime());
                         }
@@ -363,9 +363,9 @@ public class ApsServiceImpl implements ApsService {
                 }else{
                     a = alloy1.compareTo(alloy2);
                 }
-            }else{
+            /*}else{
                 a = prowidth2.compareTo(prowidth1);
-            }
+            }*/
             return a;
         });
         ApsSolution solvedBalance1 = solver1.solve(apsSolutionTh);

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

@@ -13,6 +13,157 @@ import java.util.stream.Collectors;
 @Service
 public class DdApsServiceImpl implements DdApsService {
 
+    /**
+     * 冷轧同一道工序分组提前合并
+     * @param mergeprocesses
+     * @param otherThproces
+     * @return
+     */
+    @Override
+    public List<ProductionProcesses> thOtherAllMerge(List<ProductionProcesses> mergeprocesses, List<ProductionProcesses> otherThproces){
+        List<ProductionProcesses> lzmergeprocesses = new ArrayList<>();
+        // 根据订单分组
+        Map<String, List<ProductionProcesses>> orderProcess = mergeprocesses.stream().collect(Collectors.groupingBy(ProductionProcesses::getOrderId));
+        orderProcess.forEach((k,processes)->{
+            // 所有单卷作业集合
+            Map<String,ProductionProcesses> allProMap = new HashMap<>();
+            // 按作业分组
+            Map<String,List<ProductionProcesses>> bsProceses = new HashMap<>();
+            // 根节点集合
+            List<ProductionProcesses> rootProces = new ArrayList<>();
+            // 缓存数据处理
+            for (ProductionProcesses mergeprocess : processes) {
+                // 根据作业ID缓存数据
+                if(bsProceses.containsKey(mergeprocess.getUniqueBsProcessesId())){
+                    bsProceses.get(mergeprocess.getUniqueBsProcessesId()).add(mergeprocess);
+                }else{
+                    List<ProductionProcesses> bsProcese = new ArrayList<>();
+                    bsProcese.add(mergeprocess);
+                    bsProceses.put(mergeprocess.getUniqueBsProcessesId(),bsProcese);
+                }
+                // 根据作业明细ID缓存数据
+                allProMap.put(mergeprocess.getId(),mergeprocess);
+                // 根节点缓存
+                if(mergeprocess.getPreviousProcesses() == null || mergeprocess.getPreviousProcesses().size() == 0){
+                    rootProces.add(mergeprocess);
+                }
+            }
+            if(rootProces != null && rootProces.size()>0){
+                thOtherAllMergeDg(rootProces,lzmergeprocesses,otherThproces,allProMap);
+            }
+        });
+
+        return lzmergeprocesses;
+    }
+
+    private void thOtherAllMergeDg(List<ProductionProcesses> rootProces,List<ProductionProcesses> lzmergeprocesses,List<ProductionProcesses> otherThproces,Map<String,ProductionProcesses> allProMap){
+        if(rootProces != null && rootProces.size()>0){
+            if(rootProces.get(0).getUniqueBsProcessesId().equals("e802cc0ae1154bd0b977b74a07c97b3e")){
+                int m = 1;
+            }
+
+            if((rootProces.get(0).getMaxWaitTime() != null && rootProces.get(0).getMaxWaitTime()>0)
+                    || "成退,中退,小卷成退".contains(rootProces.get(0).getProcessType())){
+                lzmergeprocesses.addAll(rootProces);
+            }else{
+                // 未锁定的作业
+                List<ProductionProcesses> notLocks = rootProces.stream().filter(v -> !v.getIfLock()).collect(Collectors.toList());
+                // 锁定的作业
+                List<ProductionProcesses> locks = rootProces.stream().filter(v -> v.getIfLock()).collect(Collectors.toList());
+                // 锁定的不做任何处理
+                if(locks != null && locks.size()>0){
+                    lzmergeprocesses.addAll(locks);
+                }
+                // 没锁定的合并一个作业
+                if(notLocks != null && notLocks.size()>0){
+                    if(notLocks.size()>1){
+                        boolean ifnull = false;
+                        for (ProductionProcesses notLock : notLocks) {
+                            if(notLock.getRooprocess() == null || notLock.getRooprocess().getStartTime() == null){
+                                ifnull = true;
+                            }
+                        }
+                        // 根据根节点开始时间排序
+                        if(!ifnull){
+                            Collections.sort(notLocks,Comparator.comparing(pro -> pro.getRooprocess().getStartTime()));
+                        }
+                        if(notLocks.size()>0){
+                            // 合并作业
+                            List<ProductionProcesses> mergePres = new ArrayList<>();
+                            mergePres.addAll(notLocks);
+                            Map<String,ProductionProcesses> mergeProNexts = new HashMap<>();
+                            ProductionProcesses mergePro = mergePres.get(0);
+                            List<String> mergeProOrders = new ArrayList<>();
+                            mergeProOrders.add(mergePro.getId());
+                            mergePro.setMergeProOrders(mergeProOrders);
+                            for (int i = 0; i < mergePres.size(); i++) {
+                                if(i>0){
+                                    // 设置待合并退火的主ID
+                                    mergePres.get(i).setMergeThMainId(mergePres.get(0).getId());
+                                    mergePro.getMergeProOrders().add(mergePres.get(i).getId());
+                                    otherThproces.add(mergePres.get(i));
+                                    if(mergePres.get(i).getNextProcesses() != null && mergePres.get(i).getNextProcesses().size()>0){
+                                        for (ProductionProcesses nextProcess : mergePres.get(i).getNextProcesses()) {
+                                            mergeProNexts.put(nextProcess.getId(),nextProcess);
+                                        }
+                                    }
+                                    if(mergePro.getPreviousProcesses() != null && mergePro.getPreviousProcesses().size()>0){
+                                        // 合并作业的上一道工序
+                                        mergePro.getPreviousProcesses().addAll(mergePres.get(i).getPreviousProcesses());
+                                        mergePro.getPreviousProcessesIds().addAll(mergePres.get(i).getPreviousProcessesIds());
+                                        // 合并作业上一道工序的下一道工序设置为当前合并作业
+                                        for (ProductionProcesses previousProcess : mergePres.get(i).getPreviousProcesses()) {
+                                            previousProcess.getNextProcesses().clear();
+                                            previousProcess.getNextProcesses().add(mergePro);
+                                            previousProcess.getNextProcessesIds().clear();
+                                            previousProcess.getNextProcessesIds().add(mergePro.getId());
+                                        }
+                                    }
+                                }
+                            }
+                            // 取第一个作业作为合并作业
+                            mergePro.setProduceTime(mergePro.getProduceTime()*mergePres.size());
+                            mergePro.setOpeProducePcNum(mergePres.size());
+                            // 合并作业的下一道工序
+                            if(mergeProNexts.size()>0){
+                                for (String proid:mergeProNexts.keySet()){
+                                    if(!mergePro.getNextProcessesIds().contains(proid)){
+                                        ProductionProcesses propro = mergeProNexts.get(proid);
+                                        mergePro.getNextProcessesIds().add(proid);
+                                        mergePro.getNextProcesses().add(propro);
+                                        // 合并作业下道工序的上道作业设置
+                                        List<ProductionProcesses> nextPrePros = new ArrayList<>();
+                                        nextPrePros.add(mergePro);
+                                        List<String> nextPreProIds = new ArrayList<>();
+                                        nextPreProIds.add(mergePro.getId());
+                                        propro.setPreviousProcessesIds(nextPreProIds);
+                                        propro.setPreviousProcesses(nextPrePros);
+                                    }
+                                }
+                            }
+                            lzmergeprocesses.add(mergePro);
+                        }
+                    }else{
+                        lzmergeprocesses.addAll(notLocks);
+                    }
+                }
+            }
+            // 递归合并
+            List<ProductionProcesses> nextrootProces = new ArrayList<>();
+            for (ProductionProcesses rootProce : rootProces) {
+                if(rootProce.getNextProcesses() != null && rootProce.getNextProcesses().size()>0){
+                    for (ProductionProcesses nextProcess : rootProce.getNextProcesses()) {
+                        List<ProductionProcesses> hasPro = nextrootProces.stream().filter(v -> v.getId().equals(nextProcess.getId())).collect(Collectors.toList());
+                        if(hasPro == null || hasPro.size() == 0){
+                            nextrootProces.addAll(rootProce.getNextProcesses());
+                        }
+                    }
+                }
+            }
+            thOtherAllMergeDg(nextrootProces,lzmergeprocesses,otherThproces,allProMap);
+        }
+    }
+
     /**
      * 冷轧同一道工序分组提前合并
      * @param mergeprocesses

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

@@ -50,8 +50,12 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
      */
     @Override
     public ProductionScheduleRetVo productionSchedule(ProductionScheduleVo productionScheduleVo) throws Exception{
-        /*List<ProductionProcesses> collect = productionScheduleVo.getProcesses().stream().filter(v -> "e4cbc5836d88414792a206d52faaf2b7".equals(v.getProduceOrder().get(0).getId())).collect(Collectors.toList());
-        productionScheduleVo.setProcesses(collect);*/
+        List<ProductionProcesses> collect = productionScheduleVo.getProcesses().stream().filter(v ->
+                "17ec0583bac645289edceba3dcd88782".equals(v.getProduceOrder().get(0).getId())
+                        || "7cc30ae6ddc442dbb544665e9372d43d".equals(v.getProduceOrder().get(0).getId())
+                        || "3e48a015dabe47468af18f59b9f3d567".equals(v.getProduceOrder().get(0).getId())
+                ).collect(Collectors.toList());
+        productionScheduleVo.setProcesses(collect);
 
         log.info("*************** 排程开始:"+productionScheduleVo.getProductionScheduleId()+" *******************");
         if(productionScheduleVo.getScheduleType().getScheduleType() == null){
@@ -139,8 +143,8 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
 
         List<ProductionProcesses> processesList = null;
         if("dd".equals(productionScheduleVo.getScheduleType().getScheduleType())){
-//            processesList = ddsService.thOtherMerge(thList, otherNotThproces);
-            processesList = thList;
+            processesList = ddsService.thOtherAllMerge(thList, otherNotThproces);
+//            processesList = thList;
         }else{
             processesList = apsService.thOtherMerge(thList, otherNotThproces);
         }

+ 2 - 2
rw-aps-server/src/test/java/com/rongwei/rwapsserver/RwApsServerApplicationTests.java

@@ -150,9 +150,9 @@ class RwApsServerApplicationTests {
         apsSolution.setProcessesList(pps);
         apsSolution.setEquipmentList(eqs);
 
-        constraintVerifier.verifyThat(ApsConstraintProvider::processNear)
+        constraintVerifier.verifyThat(ApsConstraintProvider::eqTimeCrossTuihuo)
                 .givenSolution(apsSolution)
-                .penalizesBy(2880);
+                .penalizesBy(100);
     }
 
 }