Просмотр исходного кода

排程优化-退火合并优化

fangpy 7 месяцев назад
Родитель
Сommit
a1d0c97f48

+ 13 - 0
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/domain/ProductionProcesses.java

@@ -128,6 +128,11 @@ public class ProductionProcesses implements Serializable {
      */
     private String processName;
 
+    /**
+     * 工序类别
+     */
+    private String processCategory;
+
     /**
      * 所属的生产订单
      */
@@ -1037,6 +1042,14 @@ public class ProductionProcesses implements Serializable {
         this.maxStartTime = maxStartTime;
     }
 
+    public String getProcessCategory() {
+        return processCategory;
+    }
+
+    public void setProcessCategory(String processCategory) {
+        this.processCategory = processCategory;
+    }
+
     public String getSeriSort(){
         String sortStr = this.getId();
         if(this.getStartTime() != null){

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

@@ -361,6 +361,11 @@ public class ApsServiceImpl implements ApsService {
             return a;
         });
         ApsSolution solvedBalance1 = solver1.solve(apsSolutionTh);
+        /*for (ProductionProcesses productionProcesses : solvedBalance1.getProcessesList()) {
+            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+            LocalDateTime parsedDateTime = LocalDateTime.parse("2025-01-02 07:00:00", formatter);
+            productionProcesses.setStartTime(parsedDateTime);
+        }*/
         log.info("**************退火排程评分分析***************");
         SolutionManager<ApsSolution, HardSoftScore> scoreManager1 = SolutionManager.create(solverFactory1);
         ScoreExplanation<ApsSolution, HardSoftScore> explain1 = scoreManager1.explain(solvedBalance1);
@@ -461,6 +466,100 @@ public class ApsServiceImpl implements ApsService {
                 List<ProductionProcesses> hbThPros = apsSolution.getProcessesList().stream().filter(vp -> hbThIds.contains(vp.getId())).collect(Collectors.toList());
                 ProductionProcesses mainTh = thOrdersMerge(hbThPros, otherThproces, allProMap,apsSolution);
                 apsSolution.getProcessesList().sort(Comparator.comparing(ProductionProcesses::getOrderMark));
+                // 退火后一道工序如果是精整类别的则合并
+                List<ProductionProcesses> lastProMerge = new ArrayList<>();
+                /*for (ProductionProcesses hbThPro : hbThPros) {
+                    if(hbThPro.getNextProcesses() != null && hbThPro.getNextProcesses().size() == 1){
+                        ProductionProcesses productionProcesses = hbThPro.getNextProcesses().get(0);
+                        if(productionProcesses.getProcessCategory() != null && "40".equals(productionProcesses.getProcessCategory())
+                                && (productionProcesses.getNextProcesses() == null || productionProcesses.getNextProcesses().size() == 0)){
+                            lastProMerge.add(productionProcesses);
+                        }
+                    }
+                }*/
+                for (ProductionProcesses productionProcesses : mainTh.getNextProcesses()) {
+                    if(productionProcesses.getProcessCategory() != null && "40".equals(productionProcesses.getProcessCategory())
+                            && (productionProcesses.getNextProcesses() == null || productionProcesses.getNextProcesses().size() == 0)){
+                        lastProMerge.add(productionProcesses);
+                    }
+                }
+                if(lastProMerge.size()>0){
+                    Map<String, List<ProductionProcesses>> orderProcess = lastProMerge.stream().collect(Collectors.groupingBy(ProductionProcesses::getProcessType));
+                    orderProcess.forEach((k1,v1)->{
+                        if(v1.size()>1){
+                            List<String> sameEqs = new ArrayList<>();
+                            boolean issameeq = true;
+                            for (ProductionProcesses productionProcesses : v1) {
+                                if(sameEqs.size() == 0){
+                                    sameEqs.addAll(productionProcesses.getOptionalEquipments());
+                                }else{
+                                    List<String> a = new ArrayList<>();
+                                    for (String sameEq : sameEqs) {
+                                        for (String optionalEquipment : productionProcesses.getOptionalEquipments()) {
+                                            if(sameEq.equals(optionalEquipment)){
+                                                a.add(sameEq);
+                                            }
+                                        }
+                                    }
+                                    if(a.size()>0){
+                                        sameEqs = a;
+                                    }else{
+                                        issameeq = false;
+                                        break;
+                                    }
+                                }
+                            }
+                            if(issameeq && sameEqs.size()>0){
+                                ProductionProcesses mergePro = v1.get(0);
+                                List<String> mergeProOrders = new ArrayList<>();
+                                if(mergePro.getMergeProOrders() != null && mergePro.getMergeProOrders().size()>0){
+                                    mergeProOrders.addAll(mergePro.getMergeProOrders());
+                                }else{
+                                    mergeProOrders.add(mergePro.getId());
+                                }
+                                mergePro.setMergeProOrders(mergeProOrders);
+                                mergePro.setOptionalEquipments(sameEqs);
+                                for (int i = 0; i < v1.size(); i++) {
+                                    if(i>0){
+                                        if(v1.get(i).getMergeProOrders() != null && v1.get(i).getMergeProOrders().size()>0){
+                                            mergePro.getMergeProOrders().addAll(v1.get(i).getMergeProOrders());
+                                        }else{
+                                            mergePro.getMergeProOrders().add(v1.get(i).getId());
+                                        }
+                                        // 设置待合并退火的主ID
+                                        v1.get(i).setMergeThMainId(v1.get(0).getId());
+                                        mergePro.setOpeProducePcNum(mergePro.getOpeProducePcNum()+v1.get(i).getOpeProducePcNum());
+                                        mergePro.setProduceTime(mergePro.getProduceTime()+v1.get(i).getProduceTime());
+                                        if(mergePro.getOrderMark()<v1.get(i).getOrderMark()){
+                                            mergePro.setOrderMark(v1.get(i).getOrderMark());
+                                        }
+                                        // 前后道工序关联关系设置
+                                        List<String> preids = new ArrayList<>();
+                                        preids.add(mainTh.getId());
+                                        List<ProductionProcesses> prepros = new ArrayList<>();
+                                        prepros.add(mainTh);
+                                        mergePro.setPreviousProcessesIds(preids);
+                                        mergePro.setPreviousProcesses(prepros);
+                                        String vid1 = v1.get(i).getId();
+                                        if(mainTh.getNextProcessesIds().contains(v1.get(i).getId())){
+                                            mainTh.getNextProcessesIds().remove(v1.get(i).getId());
+                                            List<ProductionProcesses> vidpros1 = mainTh.getNextProcesses().stream().filter(v2 -> !v2.getId().equals(vid1)).collect(Collectors.toList());
+                                            mainTh.setNextProcesses(vidpros1);
+                                        }
+                                        // 小卷退火卷数合并
+                                        if(v1.get(i).getProcessType().equals("小卷成退")){
+                                            v1.get(0).setMinThPcNum(v1.get(0).getMinThPcNum()+v1.get(i).getMinThPcNum());
+                                        }
+
+                                        List<ProductionProcesses> collect = apsSolution.getProcessesList().stream().filter(va -> !va.getId().equals(vid1)).collect(Collectors.toList());
+                                        apsSolution.setProcessesList(collect);
+                                    }
+                                }
+                            }
+                        }
+                    });
+                }
+
             }else{
                 for (ProductionProcesses process : v) {
                     List<ProductionProcesses> collect = apsSolution.getProcessesList().stream().filter(vp -> vp.getId().equals(process.getId())).collect(Collectors.toList());
@@ -1250,6 +1349,11 @@ public class ApsServiceImpl implements ApsService {
                                 }
                                 // 合并退火作业
                                 for (List<ProductionProcesses> thps : chunks) {
+                                    // 按照铸轧时间排序
+                                    if(thps.get(0).getRooprocess() != null && thps.get(0).getRooprocess().getStartTime() != null){
+                                        Collections.sort(thps,Comparator.comparing(pro -> pro.getRooprocess().getStartTime()));
+                                    }
+
                                     ProductionProcesses mergePro = thps.get(0);
                                     List<String> mergeProOrders = new ArrayList<>();
                                     mergeProOrders.add(mergePro.getId());
@@ -1423,6 +1527,10 @@ public class ApsServiceImpl implements ApsService {
                 }else{
                     List<ProductionProcesses> mergePres = new ArrayList<>();
                     mergePres.addAll(nextProcesses);
+                    // 按照铸轧时间排序
+                    if(mergePres.get(0).getRooprocess() != null && mergePres.get(0).getRooprocess().getStartTime() != null){
+                        Collections.sort(mergePres,Comparator.comparing(pro -> pro.getRooprocess().getStartTime()));
+                    }
                     if(!hasMerge.contains(mergePres.get(0).getId())){
                         ProductionProcesses mergePro = mergePres.get(0);
                         Map<String,ProductionProcesses> mergeProNexts = new HashMap<>();
@@ -1535,6 +1643,10 @@ public class ApsServiceImpl implements ApsService {
                 }else{
                     List<ProductionProcesses> mergePres = new ArrayList<>();
                     mergePres.addAll(previousProcesses);
+                    // 按照铸轧时间排序
+                    if(mergePres.get(0).getRooprocess() != null && mergePres.get(0).getRooprocess().getStartTime() != null){
+                        Collections.sort(mergePres,Comparator.comparing(pro -> pro.getRooprocess().getStartTime()));
+                    }
                     if(!hasMerge.contains(mergePres.get(0).getId())){
                         ProductionProcesses mergePro = mergePres.get(0);
                         Map<String,ProductionProcesses> mergeProPres = new HashMap<>();