Parcourir la source

排程优化-退火合并优化

fangpy il y a 6 mois
Parent
commit
5985a38f4d

+ 6 - 0
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/domain/ProduceOrder.java

@@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 
 import java.io.Serializable;
+import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
 
@@ -65,4 +66,9 @@ public class ProduceOrder implements Serializable {
      */
     private Integer expecteddays;
 
+    /**
+     * 坯料计划宽度
+     */
+    private BigDecimal prowidth;
+
 }

+ 5 - 6
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/score/ApsConstraintProvider.java

@@ -1181,7 +1181,7 @@ public class ApsConstraintProvider implements ConstraintProvider {
                 pp.setVolumeMetalstate(equipmentRunTime.getVolumeMetalstate());
                 pp.setBsProcessesId(Arrays.asList(new String[]{"haspcprocess"}));
                 pp.setVolumeWidth(equipmentRunTime.getTotalVolumeWidth());
-                pp.setSinglerollweight(equipmentRunTime.getTotalSinglerollweight());
+                pp.setTotalSinglerollweight(equipmentRunTime.getTotalSinglerollweight());
                 pp.setVolumeThickness(equipmentRunTime.getTotalThickness());
                 pp.setConflictRoptions(new HashMap<>());
                 pp.setOpeProducePcNum(equipmentRunTime.getPcNum());
@@ -1257,21 +1257,20 @@ public class ApsConstraintProvider implements ConstraintProvider {
         List<ApsFurnaceInstallationDo> furnaceInstallations = processes.get(0).getApsOverallConfig().getFurnaceInstallations();
         List<ApsMergeFurnaceDo> mergeFurnaces = processes.get(0).getApsOverallConfig().getMergeFurnaces();
 
-        if(ppMap.size()>1){
-            int a = 1;
-        }
         //  检查合并工序是否超过容量
         for (Map.Entry<String,List<ProductionProcesses>> entry: ppMap.entrySet()) {
             List<ProductionProcesses> v = entry.getValue();
             Set<String> groupnames = new HashSet<>();
             BigDecimal totalWeight = new BigDecimal(0);
-
+            if(v.size()>3){
+                int a = 1;
+            }
             boolean mergeRule = true;
             for (ProductionProcesses productionProcesses : v) {
                 if(productionProcesses.getVolumeMetalstate() == null){
                     int a = 1;
                 }
-                totalWeight = totalWeight.add(productionProcesses.getSinglerollweight());
+                totalWeight = totalWeight.add(productionProcesses.getTotalSinglerollweight());
                 // 检查小卷退火在哪个组
                 String groupname = null;
                 for (ApsFurnaceInstallationDo furnaceInstallation : furnaceInstallations) {

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

@@ -346,20 +346,24 @@ public class ApsServiceImpl implements ApsService {
             // 宽度
             BigDecimal prowidth1 = v1.getVolumeWidth();
             BigDecimal prowidth2 = v2.getVolumeWidth();
-            // 合金
-            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());
+            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());
+                        }else{
+                            a = v2.getApsOverallConfig().getStartTime().compareTo(v1.getApsOverallConfig().getStartTime());
+                        }
                     }else{
-                        a = v2.getApsOverallConfig().getStartTime().compareTo(v1.getApsOverallConfig().getStartTime());
+                        a = alloystatus1.compareTo(alloystatus2);
                     }
                 }else{
-                    a = alloystatus1.compareTo(alloystatus2);
+                    a = alloy1.compareTo(alloy2);
                 }
             }else{
-                a = alloy1.compareTo(alloy2);
+                a = prowidth2.compareTo(prowidth1);
             }
             return a;
         });
@@ -885,6 +889,7 @@ public class ApsServiceImpl implements ApsService {
     private void setPreOrderMark(List<ProductionProcesses> pres,Map<String,Integer> sortMap){
         List<ProductionProcesses> prepres = new ArrayList<>();
         if(pres != null && pres.size()>0){
+            Collections.sort(pres, Comparator.comparing(pro -> pro.getVolumeWidth()));
             for (ProductionProcesses pre : pres) {
                 sortMap.put("sortInt",sortMap.get("sortInt")-1);
                 if(pre.getOrderMark() != null && pre.getOrderMark()>sortMap.get("sortInt")){
@@ -1147,6 +1152,9 @@ public class ApsServiceImpl implements ApsService {
                                                 ProductionProcesses nextpro = allProMap.get(nextProcessesId);
                                                 // 历史关联关系备份
                                                 List<String> oldpreids = new ArrayList<>();
+                                                if(nextpro == null){
+                                                    int aaa = 11;
+                                                }
                                                 oldpreids.addAll(nextpro.getPreviousProcessesIds());
 //                                                nextpro.setOldPreviousProcessesIds(oldpreids);
                                                 // 合并后关联关系重置
@@ -2030,6 +2038,9 @@ public class ApsServiceImpl implements ApsService {
                                                 // 合并后关联关系重置
                                                 List<String> preids = new ArrayList<>();
                                                 preids.add(thps.get(0).getId());
+                                                if(nextpro == null){
+                                                    int ab = 11;
+                                                }
                                                 nextpro.setPreviousProcessesIds(preids);
 
                                                 List<ProductionProcesses> nextprepros = new ArrayList<>();

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

@@ -77,52 +77,7 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
 //        runPlanSeconds = 20;
         // CPU核数
         String cores = Runtime.getRuntime().availableProcessors() + "";
-        // optaplanner 求解器配置实例化
-        /*SolverFactory<ApsSolution> solverFactory = SolverFactory.create(new SolverConfig()
-                .withEnvironmentMode(mode)
-                .withSolutionClass(ApsSolution.class)
-                .withEntityClasses(ProductionProcesses.class)
-                .withConstraintProviderClass(ApsConstraintProvider.class)
-//                .withTerminationConfig(new TerminationConfig().withUnimprovedSecondsSpentLimit(180L))
-                .withTerminationSpentLimit(Duration.ofSeconds(runPlanSeconds))
-                .withMoveThreadCount(cores)
-        );
-        Solver<ApsSolution> solver = solverFactory.buildSolver();
-        solver.addEventListener(new SolverEventListener<ApsSolution>() {
-            public void bestSolutionChanged(BestSolutionChangedEvent<ApsSolution> event) {
-                if(solver.isEveryProblemChangeProcessed()) {
-                    event.getNewBestSolution().setConstructionHeuristicEnd(true);
-                    if(event.getNewBestSolution().getStepBestProcessesList() == null){
-                        List<ProductionProcesses> processesList = new ArrayList<>();
-//                        List<ProductionProcesses> processesList = ObjectUtil.cloneByStream(event.getNewBestSolution().getProcessesList());
-                        for (ProductionProcesses productionProcesses : event.getNewBestSolution().getProcessesList()) {
-                            ProductionProcesses newPro = new ProductionProcesses();
-                            newPro.setId(productionProcesses.getId());
-                            newPro.setEquipmentId(productionProcesses.getEquipmentId());
-                            Equipment eq = new Equipment();
-                            if(productionProcesses.getEquipment() != null){
-                                eq.setId(productionProcesses.getEquipment().getId());
-                            }
-                            newPro.setEquipment(eq);
-                            newPro.setProduceTime(productionProcesses.getProduceTime());
-                            newPro.setStartTime(productionProcesses.getStartTime());
-                            newPro.setEndTime(productionProcesses.getEndTime());
-                            newPro.setVolumeWidth(productionProcesses.getVolumeWidth());
-                            newPro.setSinglerollweight(productionProcesses.getSinglerollweight());
-                            processesList.add(newPro);
-
-                            productionProcesses.setApsStatus("LS");
-                        }
-                        event.getNewBestSolution().setStepBestProcessesList(processesList);
-                    }
-                    System.out.println("************"+event.getNewBestScore()+"************");
-                    log.info("************"+event.getNewBestScore()+"************");
 
-                    // 终止排程
-//                    solver.terminateEarly();
-                }
-            }
-        });*/
         // optaplanner 求解器数据装配
         List<ProductionProcesses> otherThproces = new ArrayList<>();
         List<ProductionProcesses> otherNotThproces = new ArrayList<>();
@@ -232,131 +187,90 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
 //        }
         apsSolution.setProcessesList(notLocks);
 
+        ApsSolution solvedBalance = null;
+        // 异常坯料计划ID
         List<String> exOrderIds = new ArrayList<>();
-        // 按照退火组炉分批排程
-        List<CommonJavaBean> orderMerges = produceOrderMerge(ordergrous,apsSolution);
-        log.info("退火组炉分批排程:"+ JSONUtil.toJsonStr(orderMerges));
-        Collections.sort(orderMerges, (pro1, pro2) -> {return pro2.getMaxVolumeWidth().compareTo(pro1.getMaxVolumeWidth());});
-        ApsSolution solvedBalance = new ApsSolution();
-        solvedBalance.setProcessesList(new ArrayList<>());
-        List<String> thOrderids = new ArrayList<>();
-        if(ordergrous != null && ordergrous.size()>0){
-            for (CommonJavaBean cjb : orderMerges) {
-                List<String> v = new ArrayList<>();
-                for (String orderid : cjb.getOrderids()) {
-                    if(!thOrderids.contains(orderid)){
-                        v.add(orderid);
-                    }
-                }
-                if(v.size() == 0){
-                    continue;
-                }
-                try{
-                    log.info("分批排程开始,当前批次坯料计划ID:"+v);
-                    ApsSolution apsSolution1 = new ApsSolution();
-                    apsSolution1.setStartTime(apsSolution.getStartTime());
-                    List<ProductionProcesses> processesList1 = apsSolution.getProcessesList().stream().filter(m -> v.contains(m.getProduceOrder().get(0).getId())).collect(Collectors.toList());
-                    apsSolution1.setProcessesList(processesList1);
-                    apsSolution1.setEquipmentList(apsSolution.getEquipmentList());
-
-                    runPlanSeconds = (apsSolution1.getProcessesList().size()/prospeed + 1)*60;
-                    SolverFactory<ApsSolution> solverFactory = SolverFactory.create(new SolverConfig()
-                                    .withEnvironmentMode(mode)
-                                    .withSolutionClass(ApsSolution.class)
-                                    .withEntityClasses(ProductionProcesses.class)
-                                    .withConstraintProviderClass(ApsConstraintProvider.class)
-                                    .withTerminationConfig(new TerminationConfig().withUnimprovedSecondsSpentLimit(60L))
-//                                .withTerminationSpentLimit(Duration.ofSeconds(runPlanSeconds))
-                                    .withMoveThreadCount(cores)
-                    );
-                    Solver<ApsSolution> solver = solverFactory.buildSolver();
-                    solver.addEventListener(new SolverEventListener<ApsSolution>() {
-                        public void bestSolutionChanged(BestSolutionChangedEvent<ApsSolution> event) {
-                            if(solver.isEveryProblemChangeProcessed()) {
-                                event.getNewBestSolution().setConstructionHeuristicEnd(true);
-                                if(event.getNewBestSolution().getStepBestProcessesList() == null){
-                                    List<ProductionProcesses> processesList = new ArrayList<>();
-//                        List<ProductionProcesses> processesList = ObjectUtil.cloneByStream(event.getNewBestSolution().getProcessesList());
-                                    for (ProductionProcesses productionProcesses : event.getNewBestSolution().getProcessesList()) {
-                                        ProductionProcesses newPro = new ProductionProcesses();
-                                        newPro.setId(productionProcesses.getId());
-                                        newPro.setEquipmentId(productionProcesses.getEquipmentId());
-                                        Equipment eq = new Equipment();
-                                        if(productionProcesses.getEquipment() != null){
-                                            eq.setId(productionProcesses.getEquipment().getId());
-                                        }
-                                        newPro.setEquipment(eq);
-                                        newPro.setProduceTime(productionProcesses.getProduceTime());
-                                        newPro.setStartTime(productionProcesses.getStartTime());
-                                        newPro.setEndTime(productionProcesses.getEndTime());
-                                        newPro.setVolumeWidth(productionProcesses.getVolumeWidth());
-                                        newPro.setSinglerollweight(productionProcesses.getSinglerollweight());
-                                        processesList.add(newPro);
-
-                                        productionProcesses.setApsStatus("LS");
-                                    }
-                                    event.getNewBestSolution().setStepBestProcessesList(processesList);
+        // 混合排程
+        if("2".equals(productionScheduleVo.getScheduleType())){
+            // optaplanner 求解器配置实例化
+            SolverFactory<ApsSolution> solverFactory = SolverFactory.create(new SolverConfig()
+                    .withEnvironmentMode(mode)
+                    .withSolutionClass(ApsSolution.class)
+                    .withEntityClasses(ProductionProcesses.class)
+                    .withConstraintProviderClass(ApsConstraintProvider.class)
+                    .withTerminationConfig(new TerminationConfig().withUnimprovedSecondsSpentLimit(180L))
+//                    .withTerminationSpentLimit(Duration.ofSeconds(runPlanSeconds))
+                    .withMoveThreadCount(cores)
+            );
+            Solver<ApsSolution> solver = solverFactory.buildSolver();
+            solver.addEventListener(new SolverEventListener<ApsSolution>() {
+                public void bestSolutionChanged(BestSolutionChangedEvent<ApsSolution> event) {
+                    if(solver.isEveryProblemChangeProcessed()) {
+                        event.getNewBestSolution().setConstructionHeuristicEnd(true);
+                        if(event.getNewBestSolution().getStepBestProcessesList() == null){
+                            List<ProductionProcesses> processesList = new ArrayList<>();
+                            for (ProductionProcesses productionProcesses : event.getNewBestSolution().getProcessesList()) {
+                                ProductionProcesses newPro = new ProductionProcesses();
+                                newPro.setId(productionProcesses.getId());
+                                newPro.setEquipmentId(productionProcesses.getEquipmentId());
+                                Equipment eq = new Equipment();
+                                if(productionProcesses.getEquipment() != null){
+                                    eq.setId(productionProcesses.getEquipment().getId());
                                 }
-                                System.out.println("************"+event.getNewBestScore()+"************");
-                                log.info("************"+event.getNewBestScore()+"************");
-
-                                // 终止排程
-//                    solver.terminateEarly();
+                                newPro.setEquipment(eq);
+                                newPro.setProduceTime(productionProcesses.getProduceTime());
+                                newPro.setStartTime(productionProcesses.getStartTime());
+                                newPro.setEndTime(productionProcesses.getEndTime());
+                                newPro.setVolumeWidth(productionProcesses.getVolumeWidth());
+                                newPro.setSinglerollweight(productionProcesses.getSinglerollweight());
+                                processesList.add(newPro);
+
+                                productionProcesses.setApsStatus("LS");
                             }
+                            event.getNewBestSolution().setStepBestProcessesList(processesList);
                         }
-                    });
-                    SolutionManager<ApsSolution, HardSoftScore> scoreManager = SolutionManager.create(solverFactory);
-
-                    ApsSolution solvedBalance1 = solver.solve(apsSolution1);
-                    log.info("**************排程评分分析***************");
-                    ScoreExplanation<ApsSolution, 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());
-                    thOrderids.addAll(v);
-
-                    // 排程结束的数据手动添加到设备占用列表中
-                    setEqRunTimes(solvedBalance1.getProcessesList());
-                }catch (Exception e){
-                    exOrderIds.addAll(v);
-                    if(productionScheduleRetVo.getMsg() == null){
-                        productionScheduleRetVo.setMsg("排程异常,");
+                        System.out.println("************"+event.getNewBestScore()+"************");
+                        log.info("************"+event.getNewBestScore()+"************");
+
+                        // 终止排程
+    //                    solver.terminateEarly();
                     }
-                    productionScheduleRetVo.setMsg(productionScheduleRetVo.getMsg()+"坯料计划ID:"+v);
-                    e.printStackTrace();
-                    log.error("分批排程异常,当前批次坯料计划ID:"+v,e);
                 }
-            }
-        }
-        // 剩余数据按照坯料计划分组排程
-        List<ProductionProcesses> otherPros = apsSolution.getProcessesList().stream().filter(n -> !thOrderids.contains(n.getProduceOrder().get(0).getId())).collect(Collectors.toList());
-        if(otherPros != null && otherPros.size()>0){
-            Map<String, List<ProductionProcesses>> equass = new HashMap<>();
-            for (ProductionProcesses otherPro : otherPros) {
-                if(equass.containsKey(otherPro.getProduceOrder().get(0).getId())){
-                    equass.get(otherPro.getProduceOrder().get(0).getId()).add(otherPro);
-                }else {
-                    List<ProductionProcesses> p1 = new ArrayList<>();
-                    p1.add(otherPro);
-                    equass.put(otherPro.getProduceOrder().get(0).getId(),p1);
-                }
-            }
-            if(equass != null && equass.size()>0){
-                for(Map.Entry<String, List<ProductionProcesses>> entry : equass.entrySet()){
-                    String k = entry.getKey();
-                    if(exOrderIds.contains(k)){
+            });
+
+            solvedBalance = solver.solve(apsSolution);
+            log.info("**************排程评分分析***************");
+            SolutionManager<ApsSolution, HardSoftScore> scoreManager = SolutionManager.create(solverFactory);
+            ScoreExplanation<ApsSolution, HardSoftScore> explain = scoreManager.explain(solvedBalance);
+            log.info(explain.toString());
+            log.info("**************排程评分分析***************");
+            productionScheduleRetVo.setScoreResult(scoreManager.explain(solvedBalance).toString());
+            // 得分分析
+            softExplain(explain,solvedBalance.getProcessesList());
+        }else{
+            // 按照退火组炉分批排程
+            List<CommonJavaBean> orderMerges = produceOrderMerge(ordergrous,apsSolution);
+            log.info("退火组炉分批排程:"+ JSONUtil.toJsonStr(orderMerges));
+            Collections.sort(orderMerges, (pro1, pro2) -> {return pro2.getMaxVolumeWidth().compareTo(pro1.getMaxVolumeWidth());});
+            solvedBalance = new ApsSolution();
+            solvedBalance.setProcessesList(new ArrayList<>());
+            List<String> thOrderids = new ArrayList<>();
+            if(ordergrous != null && ordergrous.size()>0){
+                for (CommonJavaBean cjb : orderMerges) {
+                    List<String> v = new ArrayList<>();
+                    for (String orderid : cjb.getOrderids()) {
+                        if(!thOrderids.contains(orderid)){
+                            v.add(orderid);
+                        }
+                    }
+                    if(v.size() == 0){
                         continue;
                     }
                     try{
-                        log.info("剩余分批排程开始,当前批次坯料计划ID:"+k);
-                        List<ProductionProcesses> processesList1 = entry.getValue();
-
+                        log.info("分批排程开始,当前批次坯料计划ID:"+v);
                         ApsSolution apsSolution1 = new ApsSolution();
                         apsSolution1.setStartTime(apsSolution.getStartTime());
+                        List<ProductionProcesses> processesList1 = apsSolution.getProcessesList().stream().filter(m -> v.contains(m.getProduceOrder().get(0).getId())).collect(Collectors.toList());
                         apsSolution1.setProcessesList(processesList1);
                         apsSolution1.setEquipmentList(apsSolution.getEquipmentList());
 
@@ -367,7 +281,7 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
                                         .withEntityClasses(ProductionProcesses.class)
                                         .withConstraintProviderClass(ApsConstraintProvider.class)
                                         .withTerminationConfig(new TerminationConfig().withUnimprovedSecondsSpentLimit(60L))
-//                                    .withTerminationSpentLimit(Duration.ofSeconds(runPlanSeconds))
+//                                .withTerminationSpentLimit(Duration.ofSeconds(runPlanSeconds))
                                         .withMoveThreadCount(cores)
                         );
                         Solver<ApsSolution> solver = solverFactory.buildSolver();
@@ -418,32 +332,123 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
                         softExplain(explain,solvedBalance1.getProcessesList());
 
                         solvedBalance.getProcessesList().addAll(solvedBalance1.getProcessesList());
+                        thOrderids.addAll(v);
 
                         // 排程结束的数据手动添加到设备占用列表中
                         setEqRunTimes(solvedBalance1.getProcessesList());
                     }catch (Exception e){
-                        exOrderIds.add(k);
+                        exOrderIds.addAll(v);
                         if(productionScheduleRetVo.getMsg() == null){
                             productionScheduleRetVo.setMsg("排程异常,");
                         }
-                        productionScheduleRetVo.setMsg(productionScheduleRetVo.getMsg()+"坯料计划ID:"+k);
+                        productionScheduleRetVo.setMsg(productionScheduleRetVo.getMsg()+"坯料计划ID:"+v);
                         e.printStackTrace();
-                        log.error("剩余分批排程开始,当前批次坯料计划ID:"+k,e);
+                        log.error("分批排程异常,当前批次坯料计划ID:"+v,e);
                     }
                 }
             }
-        }
-
+            // 剩余数据按照坯料计划分组排程
+            List<ProductionProcesses> otherPros = apsSolution.getProcessesList().stream().filter(n -> !thOrderids.contains(n.getProduceOrder().get(0).getId())).collect(Collectors.toList());
+            if(otherPros != null && otherPros.size()>0){
+                Map<String, List<ProductionProcesses>> equass = new HashMap<>();
+                for (ProductionProcesses otherPro : otherPros) {
+                    if(equass.containsKey(otherPro.getProduceOrder().get(0).getId())){
+                        equass.get(otherPro.getProduceOrder().get(0).getId()).add(otherPro);
+                    }else {
+                        List<ProductionProcesses> p1 = new ArrayList<>();
+                        p1.add(otherPro);
+                        equass.put(otherPro.getProduceOrder().get(0).getId(),p1);
+                    }
+                }
+                if(equass != null && equass.size()>0){
+                    for(Map.Entry<String, List<ProductionProcesses>> entry : equass.entrySet()){
+                        String k = entry.getKey();
+                        if(exOrderIds.contains(k)){
+                            continue;
+                        }
+                        try{
+                            log.info("剩余分批排程开始,当前批次坯料计划ID:"+k);
+                            List<ProductionProcesses> processesList1 = entry.getValue();
+
+                            ApsSolution apsSolution1 = new ApsSolution();
+                            apsSolution1.setStartTime(apsSolution.getStartTime());
+                            apsSolution1.setProcessesList(processesList1);
+                            apsSolution1.setEquipmentList(apsSolution.getEquipmentList());
+
+                            runPlanSeconds = (apsSolution1.getProcessesList().size()/prospeed + 1)*60;
+                            SolverFactory<ApsSolution> solverFactory = SolverFactory.create(new SolverConfig()
+                                            .withEnvironmentMode(mode)
+                                            .withSolutionClass(ApsSolution.class)
+                                            .withEntityClasses(ProductionProcesses.class)
+                                            .withConstraintProviderClass(ApsConstraintProvider.class)
+                                            .withTerminationConfig(new TerminationConfig().withUnimprovedSecondsSpentLimit(60L))
+//                                    .withTerminationSpentLimit(Duration.ofSeconds(runPlanSeconds))
+                                            .withMoveThreadCount(cores)
+                            );
+                            Solver<ApsSolution> solver = solverFactory.buildSolver();
+                            solver.addEventListener(new SolverEventListener<ApsSolution>() {
+                                public void bestSolutionChanged(BestSolutionChangedEvent<ApsSolution> event) {
+                                    if(solver.isEveryProblemChangeProcessed()) {
+                                        event.getNewBestSolution().setConstructionHeuristicEnd(true);
+                                        if(event.getNewBestSolution().getStepBestProcessesList() == null){
+                                            List<ProductionProcesses> processesList = new ArrayList<>();
+//                        List<ProductionProcesses> processesList = ObjectUtil.cloneByStream(event.getNewBestSolution().getProcessesList());
+                                            for (ProductionProcesses productionProcesses : event.getNewBestSolution().getProcessesList()) {
+                                                ProductionProcesses newPro = new ProductionProcesses();
+                                                newPro.setId(productionProcesses.getId());
+                                                newPro.setEquipmentId(productionProcesses.getEquipmentId());
+                                                Equipment eq = new Equipment();
+                                                if(productionProcesses.getEquipment() != null){
+                                                    eq.setId(productionProcesses.getEquipment().getId());
+                                                }
+                                                newPro.setEquipment(eq);
+                                                newPro.setProduceTime(productionProcesses.getProduceTime());
+                                                newPro.setStartTime(productionProcesses.getStartTime());
+                                                newPro.setEndTime(productionProcesses.getEndTime());
+                                                newPro.setVolumeWidth(productionProcesses.getVolumeWidth());
+                                                newPro.setSinglerollweight(productionProcesses.getSinglerollweight());
+                                                processesList.add(newPro);
+
+                                                productionProcesses.setApsStatus("LS");
+                                            }
+                                            event.getNewBestSolution().setStepBestProcessesList(processesList);
+                                        }
+                                        System.out.println("************"+event.getNewBestScore()+"************");
+                                        log.info("************"+event.getNewBestScore()+"************");
 
-        /*ApsSolution solvedBalance = solver.solve(apsSolution);
-        log.info("**************排程评分分析***************");
-        SolutionManager<ApsSolution, HardSoftScore> scoreManager = SolutionManager.create(solverFactory);
-        ScoreExplanation<ApsSolution, HardSoftScore> explain = scoreManager.explain(solvedBalance);
-        log.info(explain.toString());
-        log.info("**************排程评分分析***************");
-        productionScheduleRetVo.setScoreResult(scoreManager.explain(solvedBalance).toString());
-        // 得分分析
-        softExplain(explain,solvedBalance.getProcessesList());*/
+                                        // 终止排程
+//                    solver.terminateEarly();
+                                    }
+                                }
+                            });
+                            SolutionManager<ApsSolution, HardSoftScore> scoreManager = SolutionManager.create(solverFactory);
+
+                            ApsSolution solvedBalance1 = solver.solve(apsSolution1);
+                            log.info("**************排程评分分析***************");
+                            ScoreExplanation<ApsSolution, 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());
+                        }catch (Exception e){
+                            exOrderIds.add(k);
+                            if(productionScheduleRetVo.getMsg() == null){
+                                productionScheduleRetVo.setMsg("排程异常,");
+                            }
+                            productionScheduleRetVo.setMsg(productionScheduleRetVo.getMsg()+"坯料计划ID:"+k);
+                            e.printStackTrace();
+                            log.error("剩余分批排程开始,当前批次坯料计划ID:"+k,e);
+                        }
+                    }
+                }
+            }
+        }
 
         // 最大等待时间冲突手动解决
         /*List<ProductionProcesses> maxSetPros = new ArrayList<>();

+ 7 - 0
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/vo/ProductionScheduleVo.java

@@ -25,6 +25,13 @@ public class ProductionScheduleVo {
      */
     private Integer planSeconds;
 
+    /**
+     * 排程模式:
+     * default:分批排程(默认排程)
+     * mix:混合排程
+     */
+    private String scheduleType;
+
     /**
      * 生产工序集合
      */