소스 검색

预排程最大等待时间冲突问题处理

fangpengyuan 3 달 전
부모
커밋
885e114819

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

@@ -10,6 +10,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;
@@ -66,6 +67,8 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
         if(productionScheduleVo.getScheduleType().getScheduleType() == null){
             productionScheduleVo.getScheduleType().setScheduleType("default");
         }
+
+        ApsUtils apsUtils = new ApsUtils();
         // 排程结果对象
         ProductionScheduleRetVo productionScheduleRetVo = new ProductionScheduleRetVo();
         // 排程校验
@@ -367,29 +370,20 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
                         ScoreExplanation<ApsSolution, HardSoftScore> explain = scoreManager.explain(solvedBalance1);
                         log.info(explain.toString());
                         log.info("**************排程评分分析***************");
-
-                        /*log.info("**************调整测试排程评分分析***************");
-                        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
-                        for (ProductionProcesses productionProcesses : solvedBalance1.getProcessesList()) {
-                            if(productionProcesses.getId().equals("72b556a4ba2a4594bfc003b67a5e3e3b")){
-                                productionProcesses.setDelay(34);
-                                LocalDateTime parsedDateTime = LocalDateTime.parse("2025-03-25 19:00:00", formatter);
-                                productionProcesses.setStartTime(parsedDateTime);
-                                for (Equipment optionalProviderEquipment : productionProcesses.getOptionalProviderEquipments()) {
-                                    if(optionalProviderEquipment.getId().equals("0001be252874536843730b100163")){
-                                        productionProcesses.setEquipment(optionalProviderEquipment);
-                                    }
-                                }
-                            }
-                        }
-                        ScoreExplanation<ApsSolution, HardSoftScore> explain2 = scoreManager.explain(solvedBalance1);
-                        log.info(explain2.toString());
-                        log.info("**************调整测试排程评分分析***************");*/
-
                         productionScheduleRetVo.setScoreResult(scoreManager.explain(solvedBalance1).toString());
                         // 得分分析
                         softExplain(explain,solvedBalance1.getProcessesList());
 
+                        apsUtils.maxTimeXz(solvedBalance1);
+                        log.info("**************最终排程评分分析***************");
+                        ScoreExplanation<ApsSolution, HardSoftScore> explain1 = scoreManager.explain(solvedBalance1);
+                        log.info(explain1.toString());
+                        log.info("**************最终排程评分分析***************");
+                        productionScheduleRetVo.setScoreResult(scoreManager.explain(solvedBalance1).toString());
+                        // 得分分析
+                        softExplain(explain1,solvedBalance1.getProcessesList());
+
+
                         solvedBalance.getProcessesList().addAll(solvedBalance1.getProcessesList());
                         thOrderids.addAll(v);
 
@@ -563,10 +557,10 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
                         }
                     }
 
-                    *//*productionProcesses.getPreviousProcesses().get(0).setConflictDes(productionProcesses.getConflictDes().replaceAll("开工时间超出上道工序作业最大等待时间限制",""));
+                    productionProcesses.getPreviousProcesses().get(0).setConflictDes(productionProcesses.getConflictDes().replaceAll("开工时间超出上道工序作业最大等待时间限制",""));
                     if(StrUtil.isBlank(productionProcesses.getPreviousProcesses().get(0).getConflictDes()) && StrUtil.isBlank(productionProcesses.getPreviousProcesses().get(0).getSoftconflictdes())){
                         productionProcesses.getPreviousProcesses().get(0).setHasConflict(null);
-                    }*//*
+                    }
                 }
             }
             productionProcesses.setIfLock(true);
@@ -580,9 +574,9 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
                     }
                 }
             }
-        }*/
+        }
 
-        /*log.info("**************排程最终评分分析***************");
+        log.info("**************排程最终评分分析***************");
         if(notLocks != null && notLocks.size()>0){
             for (ProductionProcesses notLock : notLocks) {
                 for (ProductionProcesses productionProcesses : solvedBalance.getProcessesList()) {
@@ -607,6 +601,11 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
                 }
             }
         }
+
+        solvedBalance.setEquipmentList(apsSolution.getEquipmentList());
+        ApsUtils apsUtils = new ApsUtils();
+        SolverFactory<ApsSolution> solveFactory = apsUtils.getSolveFactory();
+        SolutionManager<ApsSolution, HardSoftScore> scoreManager = SolutionManager.create(solveFactory);
         ScoreExplanation<ApsSolution, HardSoftScore> explain2 = scoreManager.explain(solvedBalance);
         log.info(explain2.toString());
         log.info("**************排程最终评分分析***************");

+ 370 - 0
rw-aps-server/src/main/java/com/rongwei/rwapsserver/aps/util/ApsUtils.java

@@ -3,14 +3,21 @@ 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.Equipment;
 import com.rongwei.rwapsserver.aps.domain.EquipmentRunTime;
 import com.rongwei.rwapsserver.aps.domain.ProductionProcesses;
+import com.rongwei.rwapsserver.aps.score.ApsConstraintProvider;
 import com.rongwei.rwapsserver.aps.taskassigning.tado.EquipmentTa;
 import com.rongwei.rwapsserver.aps.taskassigning.tado.ProductionProcessesTa;
 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 org.optaplanner.core.api.solver.SolverFactory;
+import org.optaplanner.core.config.solver.EnvironmentMode;
+import org.optaplanner.core.config.solver.SolverConfig;
+import org.optaplanner.core.config.solver.termination.TerminationConfig;
 
+import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.util.*;
 
@@ -165,4 +172,367 @@ public class ApsUtils {
             }
         }
     }
+
+    public SolverFactory<ApsSolution> getSolveFactory(){
+        SolverFactory<ApsSolution> solverFactory = SolverFactory.create(new SolverConfig()
+                        .withEnvironmentMode(EnvironmentMode.REPRODUCIBLE)
+                        .withSolutionClass(ApsSolution.class)
+                        .withEntityClasses(ProductionProcesses.class)
+                        .withConstraintProviderClass(ApsConstraintProvider.class)
+                        .withTerminationConfig(new TerminationConfig().withUnimprovedSecondsSpentLimit(60L))
+//                                    .withTerminationSpentLimit(Duration.ofSeconds(runPlanSeconds))
+                        .withMoveThreadCount(Runtime.getRuntime().availableProcessors() + "")
+        );
+        return solverFactory;
+    }
+
+    public void maxTimeXz(ApsSolution solvedBalance){
+        // 最大等待时间冲突手动解决
+        List<ProductionProcesses> maxSetPros = new ArrayList<>();
+        for (ProductionProcesses productionProcesses : solvedBalance.getProcessesList()) {
+            if(productionProcesses.getConflictDes() != null && "开工时间超出上道工序作业最大等待时间限制".equals(productionProcesses.getConflictDes())){
+                ProductionProcesses newPre = maxWaitTimeCheck(productionProcesses, maxSetPros,solvedBalance.getProcessesList(),solvedBalance.getEquipmentList());
+                if(newPre != null){
+                    // 冲突信息处理
+                    productionProcesses.setConflictDes(productionProcesses.getConflictDes().replaceAll("开工时间超出上道工序作业最大等待时间限制",""));
+                    if(StrUtil.isBlank(productionProcesses.getConflictDes()) && StrUtil.isBlank(productionProcesses.getSoftconflictdes())){
+                        productionProcesses.setHasConflict(null);
+                    }
+                    if(productionProcesses.getPreviousProcesses() != null && productionProcesses.getPreviousProcesses().size()>0){
+                        for (ProductionProcesses previousProcess : productionProcesses.getPreviousProcesses()) {
+                            if(previousProcess.getConflictDes() != null && previousProcess.getConflictDes().contains("与下道工序开始时间不符合规则")){
+                                previousProcess.getConflictDes().replaceAll("与下道工序开始时间不符合规则","");
+                                if(StrUtil.isBlank(previousProcess.getConflictDes()) && StrUtil.isBlank(previousProcess.getSoftconflictdes())){
+                                    previousProcess.setHasConflict(null);
+                                }
+                            }
+                        }
+                    }
+
+                    productionProcesses.getPreviousProcesses().get(0).setConflictDes(productionProcesses.getConflictDes().replaceAll("开工时间超出上道工序作业最大等待时间限制",""));
+                    if(StrUtil.isBlank(productionProcesses.getPreviousProcesses().get(0).getConflictDes()) && StrUtil.isBlank(productionProcesses.getPreviousProcesses().get(0).getSoftconflictdes())){
+                        productionProcesses.getPreviousProcesses().get(0).setHasConflict(null);
+                    }
+                }
+            }
+            productionProcesses.setIfLock(true);
+        }
+        if(maxSetPros != null && maxSetPros.size()>0){
+            for (ProductionProcesses maxSetPro : maxSetPros) {
+                for (ProductionProcesses productionProcesses : solvedBalance.getProcessesList()) {
+                    if(productionProcesses.getId().equals(maxSetPro.getId())){
+                        productionProcesses.setStartTime(maxSetPro.getStartTime());
+                        productionProcesses.setEquipment(maxSetPro.getEquipment());
+                    }
+                }
+            }
+        }
+    }
+
+    private ProductionProcesses maxWaitTimeCheck(ProductionProcesses process,List<ProductionProcesses> maxSetPros,List<ProductionProcesses> processes,List<Equipment> equipments){
+        ProductionProcesses newPre = null;
+        List<ProductionProcesses> previousProcesses = process.getPreviousProcesses();
+        if(previousProcesses != null){
+            for (ProductionProcesses previousProcess : previousProcesses) {
+                /*if(previousProcess.getEndTime().plusMinutes(previousProcess.getMaxWaitTime()).compareTo(process.getStartTime())>0){
+                    continue;
+                }*/
+                if(previousProcess.getEndTime().plusMinutes(process.getMaxWaitTime()).compareTo(process.getStartTime())>0){
+                    continue;
+                }
+                ProductionProcesses preProcess = previousProcess;
+                if(!preProcess.getProcessType().equals("成退") && !preProcess.getProcessType().equals("中退") && !preProcess.getProcessType().equals("小卷成退")){
+                    Equipment equipment = preProcess.getEquipment();
+                    newPre = maxWaitSet(equipment, process, processes, preProcess);
+                    if(newPre == null){
+                        for (Equipment equipment1 : equipments) {
+                            if(preProcess.getOptionalEquipments().contains(equipment1.getId()) && !equipment1.getId().equals(equipment.getId())){
+                                newPre = maxWaitSet(equipment1, process, processes, preProcess);
+                                if(newPre != null){
+                                    break;
+                                }
+                            }
+                        }
+                    }
+                    if(newPre != null){
+                        preProcess.setStartTime(newPre.getStartTime());
+                        preProcess.setIfLock(false);
+                        preProcess.setEquipment(newPre.getEquipment());
+                        preProcess.setIfLock(true);
+                        maxSetPros.add(newPre);
+                    }
+                }
+            }
+        }
+        return newPre;
+    }
+
+    private ProductionProcesses maxWaitSet(Equipment equipment,ProductionProcesses process,List<ProductionProcesses> processes,ProductionProcesses preProcess){
+        ProductionProcesses newPre = null;
+        Boolean hasSet = false;
+        // 最小等待时间
+        Integer lzTimes = 0;
+        if(equipment.getWorkshopid() != null && equipment.getWorkshopid().equals(process.getEquipment().getWorkshopid())){
+            lzTimes = process.getApsOverallConfig().getRoamTime().get("WORKSHOP_IN");
+        }else{
+            lzTimes = process.getApsOverallConfig().getRoamTime().get("WORKSHOP_CROSS");
+        }
+        // 最小等待时间对比流转时间
+        if(preProcess.getMinWaitTime() != null && lzTimes<preProcess.getMinWaitTime()){
+            lzTimes = preProcess.getMinWaitTime();
+        }
+        LocalDateTime proStartTime = preProcess.getStartTime();
+        LocalDateTime proEndTime = preProcess.getEndTime();
+        List<EquipmentRunTime> equipmentRunTimesSource = equipment.getEquipmentRunTimes();
+        // 当前工序设备已占用时间
+        List<EquipmentRunTime> equipmentRunTimes = new ArrayList<>();
+        List<EquipmentRunTime> equipmentRunTimesAll = new ArrayList<>();
+        if(equipmentRunTimesSource != null && equipmentRunTimesSource.size()>0){
+            // 过滤最大等待时间范围内的占用时间段
+            for (int i = 0;i<equipmentRunTimesSource.size();i++) {
+                EquipmentRunTime equipmentRunTime = equipmentRunTimesSource.get(i);
+                EquipmentRunTime copy = new EquipmentRunTime();
+                copy.setStartRunTime(equipmentRunTime.getStartRunTime());
+                copy.setEndRunTime(equipmentRunTime.getEndRunTime());
+                copy.setTotalVolumeWidth(equipmentRunTime.getTotalVolumeWidth());
+                copy.setTotalSinglerollweight(equipmentRunTime.getTotalSinglerollweight());
+                copy.setOccupyType("temporaryProcess");
+                copy.setLocked(true);
+                copy.setSeriesProduceMark(equipmentRunTime.getSeriesProduceMark());
+                copy.setCutfinishmin(equipmentRunTime.getCutfinishmin() == null ? 0 : equipmentRunTime.getCutfinishmin());
+                copy.setPrepressworkmin(equipmentRunTime.getPrepressworkmin() == null ? 0 : equipmentRunTime.getPrepressworkmin());
+                equipmentRunTimesAll.add(copy);
+            }
+        }
+        // 过滤当前排序的作业占用时间段
+        if(processes != null && processes.size()>0){
+            for (int i = 0;i<processes.size();i++) {
+                ProductionProcesses productionProcesses = processes.get(i);
+                if(productionProcesses.getEquipmentId().equals(equipment.getId())){
+                    EquipmentRunTime copy = new EquipmentRunTime();
+                    copy.setStartRunTime(productionProcesses.getStartTime());
+                    copy.setEndRunTime(productionProcesses.getEndTime());
+                    copy.setTotalVolumeWidth(productionProcesses.getVolumeWidth());
+                    copy.setTotalSinglerollweight(productionProcesses.getSinglerollweight());
+                    copy.setOccupyType("temporaryProcess");
+                    copy.setLocked(true);
+                    copy.setSeriesProduceMark(productionProcesses.getSeriesProduceMark());
+                    copy.setCutfinishmin(productionProcesses.getCutfinishmin() == null ? 0 : productionProcesses.getCutfinishmin());
+                    copy.setPrepressworkmin(productionProcesses.getPrepressworkmin() == null ? 0 : productionProcesses.getPrepressworkmin());
+                    equipmentRunTimesAll.add(copy);
+                }
+            }
+        }
+        // 按照开始时间排序
+        equipmentRunTimesAll.sort(Comparator.comparing(EquipmentRunTime::getStartRunTime));
+        EquipmentRunTime minRunTime = null;
+        EquipmentRunTime maxRunTime = null;
+        for (EquipmentRunTime equipmentRunTime : equipmentRunTimesAll) {
+            if(equipmentRunTime.getEndRunTime().compareTo(process.getStartTime().plusMinutes(-lzTimes))<=0
+                    && equipmentRunTime.getStartRunTime().compareTo(process.getStartTime().plusMinutes(-process.getMaxWaitTime()))>=0){
+                equipmentRunTimes.add(equipmentRunTime);
+            }else{
+                if(equipmentRunTime.getStartRunTime().compareTo(process.getStartTime().plusMinutes(-process.getMaxWaitTime()))<0){
+                    if(minRunTime == null){
+                        minRunTime = equipmentRunTime;
+                    }else{
+                        if(equipmentRunTime.getStartRunTime().compareTo(minRunTime.getStartRunTime())>0){
+                            minRunTime = equipmentRunTime;
+                        }
+                    }
+                }else{
+                    if(maxRunTime == null){
+                        maxRunTime = equipmentRunTime;
+                    }else{
+                        if(equipmentRunTime.getStartRunTime().compareTo(maxRunTime.getStartRunTime())<0){
+                            maxRunTime = equipmentRunTime;
+                        }
+                    }
+                }
+            }
+        }
+        // 按照开始时间排序
+        equipmentRunTimes.sort(Comparator.comparing(EquipmentRunTime::getStartRunTime));
+        equipmentRunTimes.add(0,minRunTime);
+
+        // 前一道工序尝试往后挪
+        for(int i = 0; i < equipmentRunTimes.size(); i++){
+            EquipmentRunTime equipmentRunTime = equipmentRunTimes.get(i);
+            if (preProcess.getProcessType().equals("冷轧")) {
+                // 首个占用时间
+                if(i == 0){
+                    if(equipmentRunTimes.size() == 1){
+                        proStartTime = process.getStartTime().plusMinutes(-process.getMaxWaitTime()/2);
+                        proEndTime = proStartTime.plusMinutes(preProcess.getProduceTime());
+                        hasSet = true;
+                    }else{
+                        EquipmentRunTime nextEquipmentRunTime = equipmentRunTimes.get(i+1);
+                        boolean preseries = seriesLz(nextEquipmentRunTime, preProcess, 1);
+                        LocalDateTime proEndTime1 = nextEquipmentRunTime.getStartRunTime().plusMinutes(-1);
+                        // 连续
+                        if(!preseries){
+                            proEndTime1 = proEndTime1.plusMinutes(-preProcess.getCutfinishmin()).plusMinutes(-nextEquipmentRunTime.getPrepressworkmin());
+                        }
+                        LocalDateTime proStartTime1 = proEndTime1.plusMinutes(-preProcess.getProduceTime());
+                        if(proStartTime1.compareTo(process.getStartTime().plusMinutes(-process.getMaxWaitTime()))>0){
+                            LocalDateTime minproStartTime = proStartTime1;
+                            boolean nextseries = seriesLz(equipmentRunTime, preProcess, -1);
+                            if(!nextseries){
+                                minproStartTime = minproStartTime.plusMinutes(-equipmentRunTime.getCutfinishmin()).plusMinutes(-preProcess.getPrepressworkmin());
+                            }
+                            if(minproStartTime.compareTo(equipmentRunTime.getEndRunTime())>0){
+                                proStartTime = proStartTime1;
+                                proEndTime = proEndTime1;
+                                hasSet = true;
+                                break;
+                            }
+                        }
+                    }
+                }
+                // 最后一个占用时间
+                else if (i == equipmentRunTimes.size()-1) {
+                    LocalDateTime a = proStartTime;
+                    if(equipmentRunTime.getEndRunTime().compareTo(a)>0){
+                        a = equipmentRunTime.getEndRunTime().plusMinutes(1);
+                    }
+                    boolean preseries = seriesLz(equipmentRunTime, preProcess, -1);
+                    if(!preseries){
+                        a = a.plusMinutes(equipmentRunTime.getCutfinishmin()).plusMinutes(preProcess.getPrepressworkmin());
+                    }
+                    LocalDateTime b = a.plusMinutes(preProcess.getProduceTime());
+                    if(b.compareTo(process.getStartTime().plusMinutes(-lzTimes))<0){
+                        proStartTime = a;
+                        proEndTime = proStartTime.plusMinutes(preProcess.getProduceTime());
+                        hasSet = true;
+                    }
+                }
+                // 其它情况
+                else{
+                    EquipmentRunTime nextEquipmentRunTime = equipmentRunTimes.get(i+1);
+                    if(nextEquipmentRunTime.getStartRunTime().compareTo(proEndTime)>0){
+                        boolean preseries = seriesLz(equipmentRunTime, preProcess, -1);
+                        boolean nextseries = seriesLz(nextEquipmentRunTime, preProcess, 1);
+                        LocalDateTime preEndTime = equipmentRunTime.getEndRunTime().plusMinutes(1);
+                        if(!preseries){
+                            preEndTime = preEndTime.plusMinutes(equipmentRunTime.getCutfinishmin()).plusMinutes(preProcess.getPrepressworkmin());
+                        }
+                        LocalDateTime nextEndTime = preEndTime.plusMinutes(preProcess.getProduceTime());
+                        if(!nextseries){
+                            nextEndTime = nextEndTime.plusMinutes(preProcess.getCutfinishmin()).plusMinutes(nextEquipmentRunTime.getPrepressworkmin());
+                        }
+                        if(nextEndTime.compareTo(nextEquipmentRunTime.getStartRunTime())<0){
+                            proStartTime = preEndTime;
+                            proEndTime = proStartTime.plusMinutes(preProcess.getProduceTime());
+                            hasSet = true;
+                            break;
+                        }else{
+                            continue;
+                        }
+                    }else{
+                        continue;
+                    }
+                }
+            }
+            // 其它工序
+            else{
+                // 首个占用时间
+                if(i == 0){
+                    if(equipmentRunTimes.size() == 1){
+                        proStartTime = process.getStartTime().plusMinutes(-process.getMaxWaitTime()/2);
+                        proEndTime = proStartTime.plusMinutes(preProcess.getProduceTime());
+                        hasSet = true;
+                    }else{
+                        EquipmentRunTime nextEquipmentRunTime = equipmentRunTimes.get(i+1);
+                        LocalDateTime proEndTime1 = nextEquipmentRunTime.getStartRunTime().plusMinutes(-1);
+                        LocalDateTime proStartTime1 = proEndTime1.plusMinutes(-preProcess.getProduceTime());
+                        if(proStartTime1.compareTo(process.getStartTime().plusMinutes(-process.getMaxWaitTime()))>0){
+                            LocalDateTime minproStartTime = proStartTime1;
+                            if(equipmentRunTime.getEndRunTime() != null && minproStartTime.compareTo(equipmentRunTime.getEndRunTime())>0){
+                                proStartTime = proStartTime1;
+                                proEndTime = proEndTime1;
+                                hasSet = true;
+                                break;
+                            }
+                        }
+                    }
+                }
+                // 最后一个占用时间
+                else if (i == equipmentRunTimes.size()-1) {
+                    LocalDateTime a = proStartTime;
+                    if(equipmentRunTime.getEndRunTime().compareTo(a)>0){
+                        a = equipmentRunTime.getEndRunTime().plusMinutes(1);
+                    }
+                    LocalDateTime b = a.plusMinutes(preProcess.getProduceTime());
+                    if(b.compareTo(process.getStartTime().plusMinutes(-lzTimes))<0){
+                        proStartTime = a;
+                        proEndTime = proStartTime.plusMinutes(preProcess.getProduceTime());
+                        hasSet = true;
+                    }
+                }
+                // 其它情况
+                else{
+                    EquipmentRunTime nextEquipmentRunTime = equipmentRunTimes.get(i+1);
+                    if(nextEquipmentRunTime.getStartRunTime().compareTo(proEndTime)>0){
+                        LocalDateTime preEndTime = equipmentRunTime.getEndRunTime().plusMinutes(1);
+                        LocalDateTime nextEndTime = preEndTime.plusMinutes(preProcess.getProduceTime());
+                        if(nextEndTime.compareTo(nextEquipmentRunTime.getStartRunTime())<0){
+                            proStartTime = preEndTime;
+                            proEndTime = proStartTime.plusMinutes(preProcess.getProduceTime());
+                            hasSet = true;
+                            break;
+                        }else{
+                            continue;
+                        }
+                    }else{
+                        continue;
+                    }
+                }
+            }
+        }
+        if(hasSet){
+            newPre = new ProductionProcesses();
+            newPre.setId(preProcess.getId());
+            newPre.setStartTime(proStartTime);
+            newPre.setEndTime(proEndTime);
+            newPre.setEquipment(equipment);
+        }
+        return newPre;
+    }
+
+    /**
+     *
+     * @param equipmentRunTime
+     * @param process
+     * @param isBefore -1:equipmentRunTime在process之前,1:equipmentRunTime在process之后
+     * @return
+     */
+    private boolean seriesLz(EquipmentRunTime equipmentRunTime,ProductionProcesses process,Integer isBefore){
+        boolean isSeriesLz = true;
+        String[] serspre = null;String[] sersafter = null;
+        if(isBefore == -1){
+            serspre = equipmentRunTime.getSeriesProduceMark().split("\\^_\\^");
+            sersafter = process.getSeriesProduceMark().split("\\^_\\^");
+        }else {
+            serspre = process.getSeriesProduceMark().split("\\^_\\^");
+            sersafter = equipmentRunTime.getSeriesProduceMark().split("\\^_\\^");
+        }
+        if(serspre.length == 5 && sersafter.length == 5){
+            if(!serspre[0].equals(sersafter[0]) || !serspre[1].equals(sersafter[1])){
+                isSeriesLz = false;
+            }else{
+                String s1 = serspre[2];
+                String s2 = sersafter[2];
+                try{
+                    BigDecimal i1 = new BigDecimal(s1);
+                    BigDecimal i2 = new BigDecimal(s2);
+                    if(i1.compareTo(i2)<0){
+                        isSeriesLz = false;
+                    }
+                }catch (Exception e){
+                    e.printStackTrace();
+                }
+            }
+        }
+        return isSeriesLz;
+    }
 }