Selaa lähdekoodia

新模型合并

fangpy 4 kuukautta sitten
vanhempi
commit
d75572f6a2

+ 28 - 6
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/taskassigning/service/impl/DdApsTaServiceImpl.java

@@ -72,14 +72,36 @@ public class DdApsTaServiceImpl implements DdApsTaService {
             for (String bsid:orderProcess.keySet()){
                 List<ProductionProcessesTa> rootProces = orderProcess.get(bsid);
                 if(rootProces != null && rootProces.size()>0){
-                    if((rootProces.get(0).getMaxWaitTime() != null && rootProces.get(0).getMaxWaitTime()>0 && rootProces.get(0).getMaxWaitTime()<1440)
-                            || "成退,中退,小卷成退".contains(rootProces.get(0).getProcessType())){
+                    // 未锁定的作业
+                    List<ProductionProcessesTa> notLocks = rootProces.stream().filter(v -> !v.getIfLock()).collect(Collectors.toList());
+                    // 锁定的作业
+                    List<ProductionProcessesTa> locks = rootProces.stream().filter(v -> v.getIfLock()).collect(Collectors.toList());
+                    // 如果存在最大等待时间,并且所有未锁定工序的前道工序没有合并,则不合并处理
+                    boolean maxTimeMerge = true;
+                    if(rootProces.get(0).getMaxWaitTime() != null && rootProces.get(0).getMaxWaitTime()>0 && rootProces.get(0).getMaxWaitTime()<1440){
+                        List<ProductionProcessesTa> allnotLockPros = new ArrayList<>();
+                        for (ProductionProcessesTa notLock : notLocks) {
+                            if(notLock.getPreviousProcesses() != null && notLock.getPreviousProcesses().size()>0){
+                                for (ProductionProcessesTa previousProcess : notLock.getPreviousProcesses()) {
+                                    if(allnotLockPros.size() == 0){
+                                        allnotLockPros.add(previousProcess);
+                                    }else{
+                                        List<ProductionProcessesTa> hasPres = allnotLockPros.stream().filter(v -> v.getId().equals(previousProcess.getId())).collect(Collectors.toList());
+                                        if(hasPres == null || hasPres.size() == 0){
+                                            allnotLockPros.add(previousProcess);
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                        if(allnotLockPros.size()>1){
+                            maxTimeMerge = false;
+                        }
+                    }
+
+                    if((!maxTimeMerge) || "成退,中退,小卷成退".contains(rootProces.get(0).getProcessType())){
                         lzmergeprocesses.addAll(rootProces);
                     }else{
-                        // 未锁定的作业
-                        List<ProductionProcessesTa> notLocks = rootProces.stream().filter(v -> !v.getIfLock()).collect(Collectors.toList());
-                        // 锁定的作业
-                        List<ProductionProcessesTa> locks = rootProces.stream().filter(v -> v.getIfLock()).collect(Collectors.toList());
                         // 锁定的不做任何处理
                         if(locks != null && locks.size()>0){
                             lzmergeprocesses.addAll(locks);

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

@@ -28,6 +28,7 @@ import org.optaplanner.core.api.solver.event.BestSolutionChangedEvent;
 import org.optaplanner.core.api.solver.event.SolverEventListener;
 import org.optaplanner.core.config.solver.EnvironmentMode;
 import org.optaplanner.core.config.solver.SolverConfig;
+import org.optaplanner.core.config.solver.termination.TerminationConfig;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -55,10 +56,10 @@ public class ProductionScheduleTaServiceImpl implements ProductionScheduleTaServ
     public ProductionScheduleRetTaVo productionSchedule(ProductionScheduleTaVo productionScheduleVo) throws Exception{
         log.info("*************** 排程开始(productionLxSchedule):"+productionScheduleVo.getProductionScheduleId()+" *******************");
 
-        List<ProductionProcessesTa> pdps = productionScheduleVo.getProcesses().stream().filter(v ->
+        /*List<ProductionProcessesTa> pdps = productionScheduleVo.getProcesses().stream().filter(v ->
                 v.getProduceOrder().get(0).getId().equals("85e8e1938b7445939713f70f00401333"))
                 .collect(Collectors.toList());
-        productionScheduleVo.setProcesses(pdps);
+        productionScheduleVo.setProcesses(pdps);*/
         // 排程结果对象
         ApsUtils apsUtils = new ApsUtils();
         ProductionScheduleRetTaVo productionScheduleRetVo = new ProductionScheduleRetTaVo();
@@ -123,8 +124,8 @@ public class ProductionScheduleTaServiceImpl implements ProductionScheduleTaServ
                         .withSolutionClass(ApsSolutionTa.class)
                         .withEntityClasses(ProductionProcessesTa.class, EquipmentTa.class)
                         .withConstraintProviderClass(ApsConstraintListProvider.class)
-//                        .withTerminationConfig(new TerminationConfig().withUnimprovedSecondsSpentLimit(60L))
-                        .withTerminationSpentLimit(Duration.ofSeconds(180))
+                        .withTerminationConfig(new TerminationConfig().withUnimprovedSecondsSpentLimit(60L))
+//                        .withTerminationSpentLimit(Duration.ofSeconds(180))
                         .withMoveThreadCount(cores)
         );
         Solver<ApsSolutionTa> solver = solverFactory.buildSolver();
@@ -204,53 +205,64 @@ public class ProductionScheduleTaServiceImpl implements ProductionScheduleTaServ
             }
             midPros = nextSteps;
         }
-        for (ProductionProcessesTa productionProcessesTa : apsSolution.getProcessesList()) {
+        /*for (ProductionProcessesTa productionProcessesTa : apsSolution.getProcessesList()) {
             if(!hasids.contains(productionProcessesTa.getId())){
                 notaps.add(productionProcessesTa);
             }
-        }
+        }*/
 
-        ApsSolutionTa apsSolution1 = new ApsSolutionTa();
-        apsSolution1.setStartTime(apsSolution.getStartTime());
-        apsSolution1.setProcessesList(firstpros);
-        // 根据可选设备分组排程
-        Map<String,List<ProductionProcessesTa>> equPros = new HashMap<>();
-        apsUtils.groupProsByEqu(apsSolution1.getProcessesList(),equPros);
-        // 分批排程
+        // 分批执行、每一批执行完后回写设备占用时间
         ApsSolutionTa solvedBalance = new ApsSolutionTa();
         solvedBalance.setProcessesList(new ArrayList<>());
-        equPros.forEach((kk,vv)->{
-            List<EquipmentTa> equipments = new ArrayList<>();
-            for (ProductionProcessesTa productionProcesses : vv) {
-                for (EquipmentTa optionalProviderEquipment : productionProcesses.getOptionalProviderEquipments()) {
-                    List<EquipmentTa> esss = equipments.stream().filter(v -> v.getId().equals(optionalProviderEquipment.getId())).collect(Collectors.toList());
-                    if(esss == null || esss.size() == 0){
-                        optionalProviderEquipment.setTasks(new ArrayList<>());
-                        equipments.add(optionalProviderEquipment);
+        int a = 0;
+        for (List<ProductionProcessesTa> allSteppro : allSteppros) {
+            a++;
+            System.out.println("******************第"+a+"批开始排程******************");
+            log.info("******************第"+a+"批开始排程******************");
+            ApsSolutionTa apsSolution1 = new ApsSolutionTa();
+            apsSolution1.setStartTime(apsSolution.getStartTime());
+            apsSolution1.setProcessesList(allSteppro);
+            // 根据可选设备分组排程
+            Map<String,List<ProductionProcessesTa>> equPros = new HashMap<>();
+            apsUtils.groupProsByEqu(apsSolution1.getProcessesList(),equPros);
+            // 按设备分批排程
+            equPros.forEach((kk,vv)->{
+                List<EquipmentTa> equipments = new ArrayList<>();
+                for (ProductionProcessesTa productionProcesses : vv) {
+                    for (EquipmentTa optionalProviderEquipment : productionProcesses.getOptionalProviderEquipments()) {
+                        List<EquipmentTa> esss = equipments.stream().filter(v -> v.getId().equals(optionalProviderEquipment.getId())).collect(Collectors.toList());
+                        if(esss == null || esss.size() == 0){
+                            optionalProviderEquipment.setTasks(new ArrayList<>());
+                            equipments.add(optionalProviderEquipment);
+                        }
                     }
-                }
 
-            }
-            apsSolution1.setEquipmentList(equipments);
-            apsSolution1.setProcessesList(vv);
+                }
+                apsSolution1.setEquipmentList(equipments);
+                apsSolution1.setProcessesList(vv);
 
-            ApsSolutionTa solvedBalance1  = solver.solve(apsSolution1);
-            for (ProductionProcessesTa productionProcesses : solvedBalance1.getProcessesList()) {
-                if(productionProcesses.getOptionalEquipmentZg() != null && productionProcesses.getOptionalEquipmentZg().size()>0){
-                    productionProcesses.setProZg(productionProcesses.getOptionalEquipmentZg().get(productionProcesses.getEquipment().getId()));
+                ApsSolutionTa solvedBalance1  = solver.solve(apsSolution1);
+                for (ProductionProcessesTa productionProcesses : solvedBalance1.getProcessesList()) {
+                    if(productionProcesses.getOptionalEquipmentZg() != null && productionProcesses.getOptionalEquipmentZg().size()>0){
+                        productionProcesses.setProZg(productionProcesses.getOptionalEquipmentZg().get(productionProcesses.getEquipment().getId()));
+                    }
                 }
-            }
-            log.info("**************排程评分分析***************");
-            SolutionManager<ApsSolutionTa, HardSoftScore> scoreManager = SolutionManager.create(solverFactory);
-            ScoreExplanation<ApsSolutionTa, HardSoftScore> explain = scoreManager.explain(solvedBalance1);
-            log.info(explain.toString());
-            log.info("**************排程评分分析***************");
-            productionScheduleRetVo.setScoreResult(scoreManager.explain(solvedBalance1).toString());
-            // 得分分析
-            softExplain(explain,solvedBalance1.getProcessesList());
-            solvedBalance.getProcessesList().addAll(solvedBalance1.getProcessesList());
-        });
+                log.info("**************排程评分分析***************");
+                SolutionManager<ApsSolutionTa, HardSoftScore> scoreManager = SolutionManager.create(solverFactory);
+                ScoreExplanation<ApsSolutionTa, HardSoftScore> explain = scoreManager.explain(solvedBalance1);
+                log.info(explain.toString());
+                log.info("**************排程评分分析***************");
+                productionScheduleRetVo.setScoreResult(scoreManager.explain(solvedBalance1).toString());
+                // 得分分析
+                softExplain(explain,solvedBalance1.getProcessesList());
+                solvedBalance.getProcessesList().addAll(solvedBalance1.getProcessesList());
 
+                // 设置设备占用时间
+                setEqRunTimes(solvedBalance1.getProcessesList(),apsSolution);
+                // 回写时间和设备
+                timeAndEquSet(solvedBalance1.getProcessesList(),apsSolution);
+            });
+        }
 
         solvedBalance.getProcessesList().addAll(hasLocks);
         // 退火合并工序排程完拆分
@@ -415,11 +427,32 @@ public class ProductionScheduleTaServiceImpl implements ProductionScheduleTaServ
 
     }
 
+    /**
+     * 冷轧调度回写时间和设备
+     * @param pps
+     * @param apsSolutionTa
+     */
+    private void timeAndEquSet(List<ProductionProcessesTa> pps,ApsSolutionTa apsSolutionTa){
+        if(pps != null && pps.size()>0){
+            for (ProductionProcessesTa productionProcesses : pps) {
+                List<ProductionProcessesTa> hasPro = apsSolutionTa.getProcessesList().stream().filter(v -> v.getId().equals(productionProcesses.getId())).collect(Collectors.toList());
+                List<EquipmentTa> equipmentTas = apsSolutionTa.getEquipmentList().stream().filter(v -> v.getId().equals(productionProcesses.getEquipment().getId())).collect(Collectors.toList());
+                if(hasPro != null && hasPro.size() == 1 && equipmentTas != null && equipmentTas.size() == 1){
+                    ProductionProcessesTa productionProcessesTa = hasPro.get(0);
+                    productionProcessesTa.setStartTime(productionProcesses.getStartTime());
+                    productionProcessesTa.setEndTime(productionProcesses.getEndTime());
+                    productionProcessesTa.setEquipment(equipmentTas.get(0));
+                    productionProcessesTa.setEquipmentId(equipmentTas.get(0).getId());
+                }
+            }
+        }
+    }
+
     /**
      * 排程结束数据手动添加到设备占用列表中
      * @param pps
      */
-    private void setEqRunTimes(List<ProductionProcessesTa> pps){
+    private void setEqRunTimes(List<ProductionProcessesTa> pps,ApsSolutionTa apsSolutionTa){
         if(pps != null && pps.size()>0){
             for (ProductionProcessesTa productionProcesses : pps) {
                 // 添加锁定工序设备占用时间
@@ -451,10 +484,17 @@ public class ProductionScheduleTaServiceImpl implements ProductionScheduleTaServ
                 equipmentRunTimes.add(pper);
 
                 if(equipmentRunTimes.size()>0){
-                    if(productionProcesses.getEquipment().getEquipmentRunTimes() == null){
-                        productionProcesses.getEquipment().setEquipmentRunTimes(equipmentRunTimes);
-                    }else{
-                        productionProcesses.getEquipment().getEquipmentRunTimes().addAll(equipmentRunTimes);
+                    // 找到设备
+                    List<EquipmentTa> equipmentTas = apsSolutionTa.getEquipmentList().stream().filter(v -> v.getId().equals(productionProcesses.getEquipment().getId())).collect(Collectors.toList());
+                    if(equipmentTas != null && equipmentTas.size() == 1){
+                        EquipmentTa equipmentTa = equipmentTas.get(0);
+
+                        if(equipmentTa.getEquipmentRunTimes() == null){
+                            equipmentTa.setEquipmentRunTimes(equipmentRunTimes);
+                        }else{
+                            equipmentTa.getEquipmentRunTimes().addAll(equipmentRunTimes);
+                            Collections.sort(equipmentTa.getEquipmentRunTimes(),Comparator.comparing(EquipmentRunTime::getStartRunTime));
+                        }
                     }
 //                    apsService.equipmentRunTimeMerge(productionProcesses.getEquipment(),productionProcesses.getApsOverallConfig().getFurnaceInstallations());
                 }

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

@@ -135,6 +135,9 @@ public class TaskStartTimeListenerTa implements ListVariableListener<ApsSolution
                     continue;
                 }
                 int lzTimes = 0;
+                if(previousProcess.getEquipment() == null){
+                    int aa = 0;
+                }
                 if(previousProcess.getEquipment().getWorkshopid() != null && previousProcess.getEquipment().getWorkshopid().equals(equipmentTa.getWorkshopid())){
                     lzTimes = t.getApsOverallConfig().getRoamTime().get("WORKSHOP_IN");
                 }else if(!previousProcess.getEquipment().getId().equals(equipmentTa.getId())){