|
@@ -130,23 +130,12 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
|
|
|
productionScheduleRetVo.setScoreResult(scoreManager.explain(solvedBalance).toString());
|
|
|
// 得分分析
|
|
|
softExplain(explain,solvedBalance.getProcessesList());
|
|
|
- productionScheduleRetVo.setProcesses(solvedBalance.getProcessesList());
|
|
|
// 最大等待时间冲突手动解决
|
|
|
List<ProductionProcesses> maxSetPros = new ArrayList<>();
|
|
|
for (ProductionProcesses productionProcesses : solvedBalance.getProcessesList()) {
|
|
|
if(productionProcesses.getConflictDes() != null && "开工时间超出上道工序作业最大等待时间限制".equals(productionProcesses.getConflictDes())){
|
|
|
- ProductionProcesses newPre = maxWaitTimeCheck(productionProcesses, maxSetPros,solvedBalance.getProcessesList());
|
|
|
+ ProductionProcesses newPre = maxWaitTimeCheck(productionProcesses, maxSetPros,solvedBalance.getProcessesList(),solvedBalance.getEquipmentList());
|
|
|
if(newPre != null){
|
|
|
- /*ProductionProcesses preProcess = productionProcesses.getPreviousProcesses().get(0);
|
|
|
- EquipmentRunTime copy = new EquipmentRunTime();
|
|
|
- copy.setStartRunTime(preProcess.getStartTime());
|
|
|
- copy.setEndRunTime(preProcess.getEndTime());
|
|
|
- copy.setOccupyType("temporaryProcess");
|
|
|
- copy.setLocked(true);
|
|
|
- copy.setSeriesProduceMark(preProcess.getSeriesProduceMark());
|
|
|
- copy.setCutfinishmin(preProcess.getCutfinishmin() == null ? 0 : preProcess.getCutfinishmin());
|
|
|
- copy.setPrepressworkmin(preProcess.getPrepressworkmin() == null ? 0 : preProcess.getPrepressworkmin());
|
|
|
- productionProcesses.getPreviousProcesses().get(0).getEquipment().getEquipmentRunTimes().add(copy);*/
|
|
|
// 冲突信息处理
|
|
|
productionProcesses.setConflictDes(productionProcesses.getConflictDes().replaceAll("开工时间超出上道工序作业最大等待时间限制",""));
|
|
|
if(StrUtil.isBlank(productionProcesses.getConflictDes()) && StrUtil.isBlank(productionProcesses.getSoftconflictdes())){
|
|
@@ -161,15 +150,30 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
|
|
|
for (ProductionProcesses productionProcesses : solvedBalance.getProcessesList()) {
|
|
|
if(productionProcesses.getId().equals(maxSetPro.getId())){
|
|
|
productionProcesses.setStartTime(maxSetPro.getStartTime());
|
|
|
+ productionProcesses.setEquipment(maxSetPro.getEquipment());
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ /*SolverFactory<ApsSolution> solverFactory1 = SolverFactory.create(new SolverConfig()
|
|
|
+ .withEnvironmentMode(mode)
|
|
|
+ .withSolutionClass(ApsSolution.class)
|
|
|
+ .withEntityClasses(ProductionProcesses.class)
|
|
|
+ .withConstraintProviderClass(ApsConstraintProvider.class)
|
|
|
+ .withTerminationSpentLimit(Duration.ofSeconds(120))
|
|
|
+ .withMoveThreadCount(cores)
|
|
|
+ );
|
|
|
+ Solver<ApsSolution> solver1 = solverFactory1.buildSolver();
|
|
|
+ apsSolution.setProcessesList(solvedBalance.getProcessesList());
|
|
|
+ solvedBalance = solver1.solve(apsSolution);*/
|
|
|
log.info("**************排程最终评分分析***************");
|
|
|
ScoreExplanation<ApsSolution, HardSoftScore> explain1 = scoreManager.explain(solvedBalance);
|
|
|
log.info(explain1.toString());
|
|
|
log.info("**************排程最终评分分析***************");
|
|
|
+ softExplain(explain1,solvedBalance.getProcessesList());
|
|
|
|
|
|
+ productionScheduleRetVo.setProcesses(solvedBalance.getProcessesList());
|
|
|
// 循环引用ProductionProcesses置空
|
|
|
for (ProductionProcesses productionProcesses : solvedBalance.getProcessesList()) {
|
|
|
productionProcesses.setPreviousProcesses(null);
|
|
@@ -206,91 +210,138 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
|
|
|
return productionScheduleRetVo;
|
|
|
}
|
|
|
|
|
|
- private ProductionProcesses maxWaitTimeCheck(ProductionProcesses process,List<ProductionProcesses> maxSetPros,List<ProductionProcesses> processes){
|
|
|
+ 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){
|
|
|
ProductionProcesses preProcess = previousProcesses.get(0);
|
|
|
- // 当前工序设备已占用时间
|
|
|
- List<EquipmentRunTime> equipmentRunTimes = new ArrayList<>();
|
|
|
- List<EquipmentRunTime> equipmentRunTimesAll = new ArrayList<>();
|
|
|
- if(preProcess.getEquipment().getEquipmentRunTimes() != null && preProcess.getEquipment().getEquipmentRunTimes().size()>0){
|
|
|
- // 过滤最大等待时间范围内的占用时间段
|
|
|
- List<EquipmentRunTime> maxWaitRunTimes = new ArrayList<>();
|
|
|
- for (int i = 0;i<preProcess.getEquipment().getEquipmentRunTimes().size();i++) {
|
|
|
- EquipmentRunTime equipmentRunTime = preProcess.getEquipment().getEquipmentRunTimes().get(i);
|
|
|
+ if(!preProcess.getProcessType().equals("成退") && !preProcess.getProcessType().equals("中退")){
|
|
|
+ if(process.getId().equals("2294c17bb20549d28cbe9af149669988") || process.getId().equals("e23ea38146fb4f7bbb4a042c9a84dcba")){
|
|
|
+ int a = 0;
|
|
|
+ }
|
|
|
+ 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(equipmentRunTime.getStartRunTime());
|
|
|
- copy.setEndRunTime(equipmentRunTime.getEndRunTime());
|
|
|
- copy.setTotalVolumeWidth(equipmentRunTime.getTotalVolumeWidth());
|
|
|
- copy.setTotalSinglerollweight(equipmentRunTime.getTotalSinglerollweight());
|
|
|
+ copy.setStartRunTime(productionProcesses.getStartTime());
|
|
|
+ copy.setEndRunTime(productionProcesses.getEndTime());
|
|
|
+ copy.setTotalVolumeWidth(productionProcesses.getVolumeWidth());
|
|
|
+ copy.setTotalSinglerollweight(productionProcesses.getSinglerollweight());
|
|
|
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());
|
|
|
+ copy.setSeriesProduceMark(productionProcesses.getSeriesProduceMark());
|
|
|
+ copy.setCutfinishmin(productionProcesses.getCutfinishmin() == null ? 0 : productionProcesses.getCutfinishmin());
|
|
|
+ copy.setPrepressworkmin(productionProcesses.getPrepressworkmin() == null ? 0 : productionProcesses.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(preProcess.getEquipmentId())){
|
|
|
- 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())<=0
|
|
|
- && equipmentRunTime.getStartRunTime().compareTo(process.getStartTime().plusMinutes(-preProcess.getMaxWaitTime()))>=0){
|
|
|
- equipmentRunTimes.add(equipmentRunTime);
|
|
|
- }else{
|
|
|
- if(equipmentRunTime.getStartRunTime().compareTo(process.getStartTime().plusMinutes(-preProcess.getMaxWaitTime()))<0){
|
|
|
- if(minRunTime == null){
|
|
|
+ }
|
|
|
+ // 按照开始时间排序
|
|
|
+ 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(-preProcess.getMaxWaitTime()))>=0){
|
|
|
+ equipmentRunTimes.add(equipmentRunTime);
|
|
|
+ }else{
|
|
|
+ if(equipmentRunTime.getStartRunTime().compareTo(process.getStartTime().plusMinutes(-preProcess.getMaxWaitTime()))<0){
|
|
|
+ if(minRunTime == null){
|
|
|
+ minRunTime = equipmentRunTime;
|
|
|
+ }else{
|
|
|
+ if(equipmentRunTime.getStartRunTime().compareTo(minRunTime.getStartRunTime())>0){
|
|
|
minRunTime = equipmentRunTime;
|
|
|
- }else{
|
|
|
- if(equipmentRunTime.getStartRunTime().compareTo(minRunTime.getStartRunTime())>0){
|
|
|
- minRunTime = equipmentRunTime;
|
|
|
- }
|
|
|
}
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ if(maxRunTime == null){
|
|
|
+ maxRunTime = equipmentRunTime;
|
|
|
}else{
|
|
|
- if(maxRunTime == null){
|
|
|
+ if(equipmentRunTime.getStartRunTime().compareTo(maxRunTime.getStartRunTime())<0){
|
|
|
maxRunTime = equipmentRunTime;
|
|
|
- }else{
|
|
|
- if(equipmentRunTime.getStartRunTime().compareTo(maxRunTime.getStartRunTime())<0){
|
|
|
- maxRunTime = equipmentRunTime;
|
|
|
- }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- // 按照开始时间排序
|
|
|
- equipmentRunTimes.sort(Comparator.comparing(EquipmentRunTime::getStartRunTime));
|
|
|
- equipmentRunTimes.add(0,minRunTime);
|
|
|
- // 当前工序最小开始时间、结束时间
|
|
|
- LocalDateTime proStartTime = preProcess.getStartTime();
|
|
|
- LocalDateTime proEndTime = preProcess.getEndTime();
|
|
|
- // 前一道工序尝试往后挪
|
|
|
- for(int i = 0; i < equipmentRunTimes.size(); i++){
|
|
|
- EquipmentRunTime equipmentRunTime = equipmentRunTimes.get(i);
|
|
|
- if (preProcess.getProcessType().equals("冷轧")) {
|
|
|
- // 首个占用时间
|
|
|
- if(i == 0){
|
|
|
+ }
|
|
|
+ // 按照开始时间排序
|
|
|
+ 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(-preProcess.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);
|
|
@@ -299,7 +350,7 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
|
|
|
proEndTime1 = proEndTime1.plusMinutes(-preProcess.getCutfinishmin()).plusMinutes(-nextEquipmentRunTime.getPrepressworkmin());
|
|
|
}
|
|
|
LocalDateTime proStartTime1 = proEndTime1.plusMinutes(-preProcess.getProduceTime());
|
|
|
- if(proStartTime1.compareTo(process.getStartTime().plusMinutes(preProcess.getMaxWaitTime()))>0){
|
|
|
+ if(proStartTime1.compareTo(process.getStartTime().plusMinutes(-preProcess.getMaxWaitTime()))>0){
|
|
|
LocalDateTime minproStartTime = proStartTime1;
|
|
|
boolean nextseries = seriesLz(equipmentRunTime, preProcess, -1);
|
|
|
if(!nextseries){
|
|
@@ -308,80 +359,118 @@ public class ProductionScheduleServiceImpl implements ProductionScheduleService
|
|
|
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);
|
|
|
- }
|
|
|
+ }
|
|
|
+ // 最后一个占用时间
|
|
|
+ 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){
|
|
|
- a = a.plusMinutes(equipmentRunTime.getCutfinishmin()).plusMinutes(preProcess.getPrepressworkmin());
|
|
|
-// preProcess.getConflictRoptions().put("soft-seriesProduceLz","和前一道工序违反换辊的连续约束");
|
|
|
- }else{
|
|
|
-// preProcess.getConflictRoptions().remove("soft-seriesProduceLz");
|
|
|
+ preEndTime = preEndTime.plusMinutes(equipmentRunTime.getCutfinishmin()).plusMinutes(preProcess.getPrepressworkmin());
|
|
|
}
|
|
|
- LocalDateTime b = a.plusMinutes(preProcess.getProduceTime());
|
|
|
- if(b.compareTo(process.getStartTime())<0){
|
|
|
- proStartTime = a;
|
|
|
+ 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{
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 其它工序
|
|
|
+ else{
|
|
|
+ // 首个占用时间
|
|
|
+ if(i == 0){
|
|
|
+ if(equipmentRunTimes.size() == 1){
|
|
|
+ proStartTime = process.getStartTime().plusMinutes(-preProcess.getMaxWaitTime()/2);
|
|
|
+ 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());
|
|
|
-// preProcess.getConflictRoptions().put("soft-seriesProduceLz","和前一道工序违反换辊的连续约束");
|
|
|
- }else{
|
|
|
-// preProcess.getConflictRoptions().remove("soft-seriesProduceLz");
|
|
|
- }
|
|
|
- LocalDateTime nextEndTime = preEndTime.plusMinutes(preProcess.getProduceTime());
|
|
|
- if(!nextseries){
|
|
|
- nextEndTime = nextEndTime.plusMinutes(preProcess.getCutfinishmin()).plusMinutes(nextEquipmentRunTime.getPrepressworkmin());
|
|
|
-// preProcess.getConflictRoptions().put("soft-seriesProduceLz","和后一道工序违反换辊的连续约束");
|
|
|
- }else{
|
|
|
-// preProcess.getConflictRoptions().remove("soft-seriesProduceLz");
|
|
|
- }
|
|
|
- if(nextEndTime.compareTo(nextEquipmentRunTime.getStartRunTime())<0){
|
|
|
- proStartTime = preEndTime;
|
|
|
- proEndTime = proStartTime.plusMinutes(preProcess.getProduceTime());
|
|
|
+ LocalDateTime proEndTime1 = nextEquipmentRunTime.getStartRunTime().plusMinutes(-1);
|
|
|
+ LocalDateTime proStartTime1 = proEndTime1.plusMinutes(-preProcess.getProduceTime());
|
|
|
+ if(proStartTime1.compareTo(process.getStartTime().plusMinutes(-preProcess.getMaxWaitTime()))>0){
|
|
|
+ LocalDateTime minproStartTime = proStartTime1;
|
|
|
+ if(minproStartTime.compareTo(equipmentRunTime.getEndRunTime())>0){
|
|
|
+ proStartTime = proStartTime1;
|
|
|
+ proEndTime = proEndTime1;
|
|
|
+ hasSet = true;
|
|
|
break;
|
|
|
- }else{
|
|
|
- continue;
|
|
|
}
|
|
|
- }else{
|
|
|
- continue;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- // 其它工序
|
|
|
+ // 最后一个占用时间
|
|
|
+ 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{
|
|
|
- if(proStartTime.compareTo(equipmentRunTime.getEndRunTime())>0 || proEndTime.compareTo(equipmentRunTime.getStartRunTime())<0){
|
|
|
- continue;
|
|
|
+ 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{
|
|
|
- proStartTime = equipmentRunTime.getEndRunTime().plusMinutes(1);
|
|
|
- proEndTime = proStartTime.plusMinutes(preProcess.getProduceTime());
|
|
|
+ continue;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- if(proStartTime.compareTo(preProcess.getStartTime()) > 0){
|
|
|
- preProcess.setStartTime(proStartTime);
|
|
|
- newPre = new ProductionProcesses();
|
|
|
- newPre.setId(preProcess.getId());
|
|
|
- newPre.setStartTime(proStartTime);
|
|
|
- newPre.setEndTime(proEndTime);
|
|
|
- maxSetPros.add(newPre);
|
|
|
- System.out.println(preProcess.getId() + ":" + proStartTime);
|
|
|
- }
|
|
|
+ }
|
|
|
+ if(hasSet){
|
|
|
+ newPre = new ProductionProcesses();
|
|
|
+ newPre.setId(preProcess.getId());
|
|
|
+ newPre.setStartTime(proStartTime);
|
|
|
+ newPre.setEndTime(proEndTime);
|
|
|
+ newPre.setEquipment(equipment);
|
|
|
}
|
|
|
return newPre;
|
|
|
}
|