fangpengyuan 4 hónapja
szülő
commit
d6a74df6c6

+ 64 - 14
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/score/ApsConstraintListProvider.java

@@ -42,7 +42,7 @@ public class ApsConstraintListProvider implements ConstraintProvider {
                 // MEDIUM
                 deliveryDate(constraintFactory),
 //                expecteddays(constraintFactory),
-//                seriesProduce(constraintFactory),
+                seriesProduce(constraintFactory),
 //                seriesProduceWashingFurnace(constraintFactory),
 //                mergeTuihuo(constraintFactory),
 //                tuihuoSp(constraintFactory),
@@ -120,7 +120,7 @@ public class ApsConstraintListProvider implements ConstraintProvider {
      * @param constraintFactory
      * @return
      */
-    private Constraint hasOnePreGbAfterNowNew(ConstraintFactory constraintFactory) {
+    /*private Constraint hasOnePreGbAfterNowNew(ConstraintFactory constraintFactory) {
         return constraintFactory.forEach(Equipment.class)
                 .filter(equipment -> {
                     return true;
@@ -170,6 +170,50 @@ public class ApsConstraintListProvider implements ConstraintProvider {
                     return b*40;
                 })
                 .asConstraint("hasOnePreGbAfterNow");
+    }*/
+
+    /**
+     * 单卷模式下前后道工序时间约束(新的等待时间调整)
+     * @param constraintFactory
+     * @return
+     */
+    private Constraint hasOnePreGbAfterNowNew(ConstraintFactory constraintFactory) {
+        return constraintFactory.forEach(ProductionProcesses.class)
+                .filter(productionProcesses -> {
+                    boolean bln = false;
+                    if(productionProcesses.getEquipment() != null && productionProcesses.getPreviousProcesses() != null && productionProcesses.getPreviousProcesses().size()>0){
+                        // 此种情况简化为前道工序只有一个
+                        for (ProductionProcesses previousProcess : productionProcesses.getPreviousProcesses()) {
+                            ProductionProcesses preProcess = previousProcess;
+                            // 流转时间(最小等待时间)
+                            Integer lzTimes = 0;
+                            if(preProcess.getEquipment() != null){
+                                if(preProcess.getEquipment().getWorkshopid() != null && preProcess.getEquipment().getWorkshopid().equals(productionProcesses.getEquipment().getWorkshopid())){
+                                    lzTimes = productionProcesses.getApsOverallConfig().getRoamTime().get("WORKSHOP_IN");
+                                }else{
+                                    lzTimes = productionProcesses.getApsOverallConfig().getRoamTime().get("WORKSHOP_CROSS");
+                                }
+                                // 最小等待时间对比流转时间
+                                if(productionProcesses.getMinWaitTime() != null && lzTimes<productionProcesses.getMinWaitTime()){
+                                    lzTimes = productionProcesses.getMinWaitTime();
+                                }
+                                // 最大等待时间
+                                Integer maxWaitTime = productionProcesses.getMaxWaitTime();
+                                if(productionProcesses.getStartTime().compareTo(preProcess.getEndTime().plusMinutes(lzTimes))<0){
+                                    bln = true;
+                                }
+                                if(maxWaitTime != null && maxWaitTime>0){
+                                    if(productionProcesses.getStartTime().compareTo(preProcess.getEndTime().plusMinutes(maxWaitTime))>0){
+                                        bln = true;
+                                    }
+                                }
+                            }
+                        }
+                    }
+                    return bln;
+                })
+                .penalize(HardMediumSoftScore.ONE_HARD,(productionProcesses) -> 40)
+                .asConstraint("hasOnePreGbAfterNow");
     }
 
     /**
@@ -1753,16 +1797,15 @@ public class ApsConstraintListProvider implements ConstraintProvider {
      * @return
      */
     private Constraint seriesProduce(ConstraintFactory constraintFactory){
-        return constraintFactory.forEach(ProductionProcesses.class)
-                .filter((processes) -> "铸轧".equals(processes.getProcessType()) || "冷轧".equals(processes.getProcessType()) || "箔轧".equals(processes.getProcessType()))
-                .groupBy(ProductionProcesses::getEquipmentId, ConstraintCollectors.toList())
-                .filter((equipmentId,processes) -> {
-                    if(processes != null && processes.size()>0){
-                        for (ProductionProcesses process : processes) {
-                            process.getConflictRoptions().remove("soft-seriesProduceZz");
-                            process.getConflictRoptions().remove("soft-seriesProduceLz");
+        return constraintFactory.forEach(Equipment.class)
+                .filter((equipment) -> {
+                    if(equipment.getTasks() != null && equipment.getTasks().size()>0){
+                        String processType = equipment.getTasks().get(0).getProcessType();
+                        if(processType.equals("冷轧") || processType.equals("箔轧")){
+                            return true;
+                        }else{
+                            return false;
                         }
-                        return true;
                     }else{
                         return false;
                     }
@@ -1772,9 +1815,9 @@ public class ApsConstraintListProvider implements ConstraintProvider {
                     }
                     return false;*/
                 })
-                .penalize(HardMediumSoftScore.ONE_MEDIUM,(equipmentId,processes)->{
-                    int countNum = seriesProduceCount(processes);
-                    return countNum*10;
+                .penalize(HardMediumSoftScore.ONE_MEDIUM,(equipment)->{
+                    int countNum = seriesProduceCount(equipment.getTasks());
+                    return countNum;
                 })
                 .asConstraint("seriesProduce");
 
@@ -1794,6 +1837,13 @@ public class ApsConstraintListProvider implements ConstraintProvider {
                 int abcd = 1;
             }
         }
+        // 设置作业辊
+        for (ProductionProcesses process : processes) {
+            if(process.getOptionalEquipmentZg() != null && process.getOptionalEquipmentZg().size()>0){
+                process.setProZg(process.getOptionalEquipmentZg().get(equipment.getId()));
+            }
+        }
+
         List<ProductionProcesses> hasStartTimeProcess = processes.stream().filter(v -> v.getStartTime() != null).collect(Collectors.toList());
         if(hasStartTimeProcess != null && hasStartTimeProcess.size()>0){
             /*if(hasStartTimeProcess.get(0).getApsStatus().equals("CH") && hasStartTimeProcess.get(0).getProcessType().equals("冷轧")){

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

@@ -11,6 +11,7 @@ import com.rongwei.rwapsserver.aps.service.DdApsService;
 import com.rongwei.rwapsserver.aps.service.ProductionScheduleService;
 import com.rongwei.rwapsserver.aps.util.ApsConstants;
 import com.rongwei.rwapsserver.aps.util.ApsException;
+import com.rongwei.rwapsserver.aps.util.ApsUtils;
 import com.rongwei.rwapsserver.aps.vo.ProductionScheduleRetVo;
 import com.rongwei.rwapsserver.aps.vo.ProductionScheduleVo;
 import lombok.extern.slf4j.Slf4j;
@@ -48,11 +49,12 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
     public ProductionScheduleRetVo productionLxSchedule(ProductionScheduleVo productionScheduleVo) throws Exception {
         log.info("*************** 排程开始(productionLxSchedule):"+productionScheduleVo.getProductionScheduleId()+" *******************");
 
-        List<ProductionProcesses> pdps = productionScheduleVo.getProcesses().stream().filter(v ->
+        /*List<ProductionProcesses> pdps = productionScheduleVo.getProcesses().stream().filter(v ->
                 !v.getProduceOrder().get(0).getId().equals("53bf294756e3457fac9a0e0e174314b3"))
                 .collect(Collectors.toList());
-        productionScheduleVo.setProcesses(pdps);
+        productionScheduleVo.setProcesses(pdps);*/
         // 排程结果对象
+        ApsUtils apsUtils = new ApsUtils();
         ProductionScheduleRetVo productionScheduleRetVo = new ProductionScheduleRetVo();
         // optaplanner 求解器数据装配
         List<ProductionProcesses> otherThproces = new ArrayList<>();
@@ -135,7 +137,7 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
                         .withEntityClasses(ProductionProcesses.class, Equipment.class)
                         .withConstraintProviderClass(ApsConstraintListProvider.class)
 //                        .withTerminationConfig(new TerminationConfig().withUnimprovedSecondsSpentLimit(60L))
-                    .withTerminationSpentLimit(Duration.ofSeconds(300))
+                    .withTerminationSpentLimit(Duration.ofSeconds(180))
                         .withMoveThreadCount(cores)
         );
         Solver<ApsSolution> solver = solverFactory.buildSolver();
@@ -173,65 +175,45 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
                 }
             }
         });
-        List<Equipment> equipments = new ArrayList<>();
-        for (ProductionProcesses productionProcesses : apsSolution.getProcessesList()) {
-            for (Equipment optionalProviderEquipment : productionProcesses.getOptionalProviderEquipments()) {
-                List<Equipment> 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);
-                }
-            }
 
-        }
-        apsSolution.setEquipmentList(equipments);
         // 根据可选设备分组排程
         Map<String,List<ProductionProcesses>> equPros = new HashMap<>();
-        for (ProductionProcesses productionProcesses : apsSolution.getProcessesList()) {
-            String equids = CollUtil.join(productionProcesses.getOptionalEquipments(), ",");
-            if(equPros.size() == 0){
-                List<ProductionProcesses> pps = new ArrayList<>();
-                pps.add(productionProcesses);
-                equPros.put(equids,pps);
-            }else {
-                boolean hasSameKeys = false;
-                String haskey = null;
-                Set<String> keys = equPros.keySet();
-                for (String key : keys) {
-                    for (String optionalEquipment : productionProcesses.getOptionalEquipments()) {
-                        if(key.contains(optionalEquipment)){
-                            hasSameKeys = true;
-                            haskey = key;
-                        }
+        apsUtils.groupProsByEqu(apsSolution.getProcessesList(),equPros);
+        // 分批排程
+        ApsSolution solvedBalance = new ApsSolution();
+        solvedBalance.setProcessesList(new ArrayList<>());
+        equPros.forEach((kk,vv)->{
+            List<Equipment> equipments = new ArrayList<>();
+            for (ProductionProcesses productionProcesses : vv) {
+                for (Equipment optionalProviderEquipment : productionProcesses.getOptionalProviderEquipments()) {
+                    List<Equipment> 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);
                     }
                 }
-                if(hasSameKeys){
-                    List<ProductionProcesses> processesList1 = equPros.get(haskey);
-                    processesList1.add(productionProcesses);
-                    equPros.remove(haskey);
-                    for (String optionalEquipment : productionProcesses.getOptionalEquipments()) {
-                        if(!haskey.contains(optionalEquipment)){
-                            haskey = haskey + "," + optionalEquipment;
-                        }
-                    }
-                    equPros.put(haskey,processesList1);
-                }else{
-                    List<ProductionProcesses> pps = new ArrayList<>();
-                    pps.add(productionProcesses);
-                    equPros.put(equids,pps);
+
+            }
+            apsSolution.setEquipmentList(equipments);
+            apsSolution.setProcessesList(vv);
+
+            ApsSolution solvedBalance1  = solver.solve(apsSolution);
+            for (ProductionProcesses productionProcesses : solvedBalance1.getProcessesList()) {
+                if(productionProcesses.getOptionalEquipmentZg() != null && productionProcesses.getOptionalEquipmentZg().size()>0){
+                    productionProcesses.setProZg(productionProcesses.getOptionalEquipmentZg().get(productionProcesses.getEquipment().getId()));
                 }
             }
-        }
+            log.info("**************排程评分分析***************");
+            SolutionManager<ApsSolution, HardSoftScore> scoreManager = SolutionManager.create(solverFactory);
+            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());
+        });
 
-        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());
 
         solvedBalance.getProcessesList().addAll(hasLocks);
         // 退火合并工序排程完拆分

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

@@ -55,6 +55,9 @@ public class TaskStartTimeListenerTa implements ListVariableListener<ApsSolution
     }
 
     protected void updateStartTime(ScoreDirector<ApsSolution> scoreDirector, Equipment equipmentTa, int index, int toIndex) {
+        if(equipmentTa.getId().equals("0001be252874536843730b100152")){
+            int aa = 0;
+        }
         List<ProductionProcesses> allProcessesList = scoreDirector.getWorkingSolution().getProcessesList();
         List<ProductionProcesses> tasks = equipmentTa.getTasks();
         if (ObjectNull.isNull(tasks) || tasks.size() - 1 < index) {
@@ -95,7 +98,7 @@ public class TaskStartTimeListenerTa implements ListVariableListener<ApsSolution
         LocalDateTime previousLastEndTime = null;
         if(t.getPreviousProcesses() != null && t.getPreviousProcesses().size()>0){
             for (ProductionProcesses previousProcess : t.getPreviousProcesses()) {
-                if(previousProcess.getEquipment() != null && previousProcess.getEquipment().getId().equals(equipmentTa.getId())){
+                if(previousProcess.getEquipment() != null && previousProcess.getEquipment().getId().equals(equipmentTa.getId()) && !previousProcess.getIfLock()){
                     continue;
                 }
                 int lzTimes = 0;
@@ -119,9 +122,9 @@ public class TaskStartTimeListenerTa implements ListVariableListener<ApsSolution
         }else{
             previousLastEndTime = t.getApsOverallConfig().getStartTime();
         }
-        if(t.getMinWaitTime() != null && t.getMinWaitTime()>0 && previousLastEndTime != null){
+        /*if(t.getMinWaitTime() != null && t.getMinWaitTime()>0 && previousLastEndTime != null){
             previousLastEndTime = previousLastEndTime.plusMinutes(t.getMinWaitTime());
-        }
+        }*/
         return previousLastEndTime;
     }
 

+ 65 - 2
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/util/ApsUtils.java

@@ -1,13 +1,14 @@
 package com.rongwei.rwapsserver.aps.util;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;
 import com.rongwei.rwapsserver.aps.domain.ApsSolution;
 import com.rongwei.rwapsserver.aps.domain.ProductionProcesses;
 import org.optaplanner.core.api.score.ScoreExplanation;
 import org.optaplanner.core.api.score.buildin.hardsoft.HardSoftScore;
 import org.optaplanner.core.api.score.constraint.ConstraintMatch;
-import java.util.ArrayList;
-import java.util.List;
+
+import java.util.*;
 
 public class ApsUtils {
 
@@ -80,4 +81,66 @@ public class ApsUtils {
         }
     }
 
+    /**
+     * 根据可选设备分组排程
+     * @param processes
+     * @param equPros
+     */
+    public void groupProsByEqu(List<ProductionProcesses> processes, Map<String,List<ProductionProcesses>> equPros){
+        // 根据可选设备分组排程
+        for (ProductionProcesses productionProcesses : processes) {
+            if(productionProcesses.getOptionalEquipments().size()>1){
+                int aaa = 0;
+            }
+            String equids = CollUtil.join(productionProcesses.getOptionalEquipments(), ",");
+            if(equPros.size() == 0){
+                List<ProductionProcesses> pps = new ArrayList<>();
+                pps.add(productionProcesses);
+                equPros.put(equids,pps);
+            }else {
+                boolean hasSameKeys = false;
+                List<String> haskey = new ArrayList<>();
+                Set<String> keys = equPros.keySet();
+                for (String key : keys) {
+                    for (String optionalEquipment : productionProcesses.getOptionalEquipments()) {
+                        if(key.contains(optionalEquipment)){
+                            hasSameKeys = true;
+                            haskey.add(key);
+                        }
+                    }
+                }
+                if(hasSameKeys){
+                    List<ProductionProcesses> mergePros = new ArrayList<>();
+                    Set<String> keyIds = new HashSet<>();
+
+                    for (String s : haskey) {
+                        List<ProductionProcesses> processesList1 = equPros.get(s);
+                        if(processesList1 != null && processesList1.size() > 0){
+                            mergePros.addAll(processesList1);
+                            equPros.remove(s);
+
+                            String[] keysps = s.split(",");
+                            for (String key : keysps) {
+                                keyIds.add(key);
+                            }
+                        }
+                    }
+                    mergePros.add(productionProcesses);
+                    String keyIdStrs = CollUtil.join(keyIds, ",");
+
+                    for (String optionalEquipment : productionProcesses.getOptionalEquipments()) {
+                        if(!keyIdStrs.contains(optionalEquipment)){
+                            keyIdStrs = keyIdStrs + "," + optionalEquipment;
+                        }
+                    }
+                    equPros.put(keyIdStrs,mergePros);
+                }else{
+                    List<ProductionProcesses> pps = new ArrayList<>();
+                    pps.add(productionProcesses);
+                    equPros.put(equids,pps);
+                }
+            }
+        }
+    }
+
 }