Bladeren bron

排程模式配置

fangpy 5 maanden geleden
bovenliggende
commit
ac601ccb2a

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

@@ -397,6 +397,8 @@ public class ProductionProcesses implements Serializable {
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime maxStartTime;
 
+    // 小卷成退工序所属组
+    private String groupname;
 
     public String getEquipmentType() {
         return equipmentType;
@@ -1080,6 +1082,14 @@ public class ProductionProcesses implements Serializable {
         this.proZg = proZg;
     }
 
+    public String getGroupname() {
+        return groupname;
+    }
+
+    public void setGroupname(String groupname) {
+        this.groupname = groupname;
+    }
+
     public String getSeriSort(){
         String sortStr = this.getId();
         if(this.getStartTime() != null){

+ 118 - 84
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);
@@ -501,97 +501,131 @@ public class ApsServiceImpl implements ApsService {
                 ProductionProcesses mainTh = thOrdersMerge(hbThPros, otherThproces, allProMap,apsSolution);
                 apsSolution.getProcessesList().sort(Comparator.comparing(ProductionProcesses::getOrderMark));
                 // 退火后一道工序如果是精整类别的则合并
-                List<ProductionProcesses> lastProMerge = new ArrayList<>();
-                if(mainTh.getNextProcesses() != null && mainTh.getNextProcesses().size()>0){
-                    for (ProductionProcesses productionProcesses : mainTh.getNextProcesses()) {
-                        if(productionProcesses.getProcessCategory() != null && "40".equals(productionProcesses.getProcessCategory())
-                                && (productionProcesses.getNextProcesses() == null || productionProcesses.getNextProcesses().size() == 0)
-                                && !productionProcesses.getIfLock()
-                        ){
-                            lastProMerge.add(productionProcesses);
-                        }
-                    }
+                jzMerge(mainTh,apsSolution);
+                // 退火前一道工序合并
+
+            }
+        });
+    }
+
+    /**
+     * 退火后一道工序如果是精整类别的则合并
+     * @param mainTh
+     * @param apsSolution
+     */
+    private void jzMerge(ProductionProcesses mainTh,ApsSolution apsSolution){
+        List<ProductionProcesses> lastProMerge = new ArrayList<>();
+        if(mainTh.getNextProcesses() != null && mainTh.getNextProcesses().size()>0){
+            for (ProductionProcesses productionProcesses : mainTh.getNextProcesses()) {
+                if(productionProcesses.getProcessCategory() != null && "40".equals(productionProcesses.getProcessCategory())
+                        && (productionProcesses.getNextProcesses() == null || productionProcesses.getNextProcesses().size() == 0)
+                        && !productionProcesses.getIfLock()
+                ){
+                    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(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(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());
+                            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{
-                                    mergeProOrders.add(mergePro.getId());
+                                    mergePro.getMergeProOrders().add(v1.get(i).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);
-                                    }
+                                // 设置待合并退火的主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);
                             }
                         }
-                    });
+                    }
                 }
-                // 退火前一道工序合并
+            });
+        }
+    }
+
+    /**
+     * 小卷成退分组按宽度从大到小手动合并
+     * @param otherThproces
+     * @param allProMap
+     * @param apsSolution
+     */
+    private void xjctOrdersMerge(List<ProductionProcesses> otherThproces,Map<String,ProductionProcesses> allProMap,ApsSolution apsSolution){
+        // 小卷成退作业集合
+        List<ProductionProcesses> processesList = apsSolution.getProcessesList().stream().filter(v->"小卷成退".equals(v.getProcessType())).collect(Collectors.toList());
+        if(processesList != null && processesList.size()>0){
+            // 小卷成退分组
+            Map<String, List<ProductionProcesses>> ppss = processesList.stream().filter(v->StrUtil.isNotBlank(v.getGroupname()))
+                    .collect(Collectors.groupingBy(ProductionProcesses::getGroupname));
+            if(ppss != null && ppss.size()>0){
+                // 每一组待合并的工序
+                for(Map.Entry<String, List<ProductionProcesses>> entry : ppss.entrySet()){
+                    List<ProductionProcesses> processess = entry.getValue();
+                    // 每一组按照宽度从大到小合并
+                    Collections.sort(processess, (pro1, pro2) -> {return pro2.getVolumeWidth().compareTo(pro1.getVolumeWidth());});
 
+                }
             }
-        });
+        }
     }
 
     private ProductionProcesses thOrdersMerge(List<ProductionProcesses> thps,List<ProductionProcesses> otherThproces

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

@@ -1323,6 +1323,10 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
             process.setOrderId(process.getProduceOrder().get(0).getId());
             process.setTotalSinglerollweight(process.getSinglerollweight());
             process.setTotalVolumeWidth(process.getVolumeWidth());
+            // 小卷成退设置组名称
+            if("小卷成退".equals(process.getProcessType())){
+                process.setGroupname(groupNameSet(process));
+            }
             // 前道工序
             if(process.getPreviousProcessesIds() != null && process.getPreviousProcessesIds().size()>0){
                 List<ProductionProcesses> pres = new ArrayList<>();
@@ -1447,6 +1451,39 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
         return unsolvedCloudBalance;
     }
 
+    private String groupNameSet(ProductionProcesses productionProcesses){
+        String groupname = null;
+        List<ApsFurnaceInstallationDo> furnaceInstallations = productionProcesses.getApsOverallConfig().getFurnaceInstallations();
+        for (ApsFurnaceInstallationDo furnaceInstallation : furnaceInstallations) {
+            if(productionProcesses.getVolumeMetal().equals(furnaceInstallation.getAlloy())){
+                boolean a = true;
+                if(furnaceInstallation.getAlloystatus() != null && (productionProcesses.getVolumeMetalstate() == null || !furnaceInstallation.getAlloystatus().contains(productionProcesses.getVolumeMetalstate()))){
+                    a = false;
+                }
+                if(furnaceInstallation.getStartthickness() != null && furnaceInstallation.getStartthickness().compareTo(productionProcesses.getVolumeThickness())>=0){
+                    a = false;
+                }
+                if(furnaceInstallation.getEndthickness() != null && furnaceInstallation.getEndthickness().compareTo(productionProcesses.getVolumeThickness())<0){
+                    a = false;
+                }
+                if(furnaceInstallation.getStartwidth() != null && new BigDecimal(furnaceInstallation.getStartwidth()).compareTo(productionProcesses.getVolumeWidth())>=0){
+                    a = false;
+                }
+                if(furnaceInstallation.getEndwidth() != null && new BigDecimal(furnaceInstallation.getEndwidth()).compareTo(productionProcesses.getVolumeWidth())<0){
+                    a = false;
+                }
+                if(a){
+                    groupname = furnaceInstallation.getId();
+                    break;
+                }
+            }
+        }
+        if(groupname == null){
+            groupname = "group-self-" + productionProcesses.getVolumeMetal() + productionProcesses.getVolumeMetalstate() + productionProcesses.getProducttype() + productionProcesses.getVolumeWidth() + productionProcesses.getVolumeThickness();
+        }
+        return groupname;
+    }
+
     private List<ProductionProcesses> sortProcess(List<ProductionProcesses> sources,int sortType){
         // 排序后的列表
         List<ProductionProcesses> processes = new ArrayList<>();