|
@@ -1,14 +1,13 @@
|
|
|
package com.rongwei.rwapsserver.aps.listener;
|
|
|
|
|
|
+import cn.hutool.core.collection.CollUtil;
|
|
|
import com.rongwei.rwapsserver.aps.domain.ApsSolution;
|
|
|
import com.rongwei.rwapsserver.aps.domain.EquipmentRunTime;
|
|
|
import com.rongwei.rwapsserver.aps.domain.ProductionProcesses;
|
|
|
import org.optaplanner.core.api.domain.variable.VariableListener;
|
|
|
import org.optaplanner.core.api.score.director.ScoreDirector;
|
|
|
import java.time.LocalDateTime;
|
|
|
-import java.util.HashMap;
|
|
|
-import java.util.List;
|
|
|
-import java.util.Map;
|
|
|
+import java.util.*;
|
|
|
|
|
|
/**
|
|
|
* 设备赋值后任务起止时间自动计算
|
|
@@ -75,6 +74,8 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
|
|
|
LocalDateTime startDateTime = startTimeSet(process);
|
|
|
scoreDirector.beforeVariableChanged(process, "startTime");
|
|
|
process.setStartTime(startDateTime);
|
|
|
+ // 设备占用的任务设置
|
|
|
+ equipmentProListSet(process);
|
|
|
scoreDirector.afterVariableChanged(process, "startTime");
|
|
|
if(process.getNextProcesses() != null && process.getNextProcesses().size()>0){
|
|
|
for (ProductionProcesses nextProcess : process.getNextProcesses()) {
|
|
@@ -83,6 +84,42 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 设备占用的任务设置
|
|
|
+ * @param process
|
|
|
+ */
|
|
|
+ private void equipmentProListSet(ProductionProcesses process){
|
|
|
+ if(process.getEquipment() != null){
|
|
|
+ // 设置设备的工序占用
|
|
|
+ if(process.getEquipment().getProcessesList() == null){
|
|
|
+ process.getEquipment().setProcessesList(new ArrayList<>());
|
|
|
+ }
|
|
|
+ boolean a = false;
|
|
|
+ for (ProductionProcesses productionProcesses : process.getEquipment().getProcessesList()) {
|
|
|
+ if(productionProcesses.getId().equals(process.getId())){
|
|
|
+ productionProcesses.setEquipmentId(process.getEquipmentId());
|
|
|
+ productionProcesses.setProduceTime(process.getProduceTime());
|
|
|
+ productionProcesses.setStartTime(process.getStartTime());
|
|
|
+ productionProcesses.setEndTime(process.getEndTime());
|
|
|
+ productionProcesses.setVolumeMetal(process.getVolumeMetal());
|
|
|
+ productionProcesses.setVolumeWidth(process.getVolumeWidth());
|
|
|
+ a = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(!a){
|
|
|
+ ProductionProcesses pp = new ProductionProcesses();
|
|
|
+ pp.setId(process.getId());
|
|
|
+ pp.setEquipmentId(process.getEquipmentId());
|
|
|
+ pp.setProduceTime(process.getProduceTime());
|
|
|
+ pp.setStartTime(process.getStartTime());
|
|
|
+ pp.setEndTime(process.getEndTime());
|
|
|
+ pp.setVolumeMetal(process.getVolumeMetal());
|
|
|
+ pp.setVolumeWidth(process.getVolumeWidth());
|
|
|
+ process.getEquipment().getProcessesList().add(pp);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 设置开始时间
|
|
|
* @param process
|
|
@@ -139,12 +176,6 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
|
|
|
}
|
|
|
// 开始时间不小于最大的最小等待时间、不大于最小的最大等待时间
|
|
|
toUpdateStartTime = lastMaxStartTime;
|
|
|
-
|
|
|
- /*if(process.getStartTime().compareTo(lastMaxStartTime)<0){
|
|
|
- bln = true;
|
|
|
- }else if(process.getStartTime().compareTo(lastMinMaxWaitTime)>0){
|
|
|
- bln = true;
|
|
|
- }*/
|
|
|
}
|
|
|
// 非瓶颈工序,非瓶颈工序,默认前道工序只有一个
|
|
|
else{
|
|
@@ -196,15 +227,6 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
|
|
|
LocalDateTime lastStartTime = null;
|
|
|
if(process.getUnitProduceTime()>=maxUnitProduceTime){
|
|
|
lastStartTime = startTime.plusMinutes(preProcess.getUnitProduceTime()).plusMinutes(lzTimes);
|
|
|
- /*if(process.getStartTime().compareTo(startTime.plusMinutes(preProcess.getUnitProduceTime()).plusMinutes(lzTimes))<0){
|
|
|
- bln = true;
|
|
|
- }else{
|
|
|
- if(lastFirstMaxWaitTime != null){
|
|
|
- if(process.getStartTime().compareTo(lastFirstMaxWaitTime)>0){
|
|
|
- bln = true;
|
|
|
- }
|
|
|
- }
|
|
|
- }*/
|
|
|
process.setEndTime(lastStartTime.plusMinutes(process.getProduceTime()));
|
|
|
}
|
|
|
/**
|
|
@@ -214,33 +236,46 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
|
|
|
else{
|
|
|
// 开始时间:最后一批次结束时间加流转时间,再往前倒排批次数减一乘以单批次生产时间
|
|
|
lastStartTime = endTime.plusMinutes(lzTimes).minusMinutes(process.getUnitProduceTime() * (process.getProducePcNum() - 1));
|
|
|
- /*if(process.getStartTime().compareTo(startTime1)<0){
|
|
|
- bln = true;
|
|
|
- }
|
|
|
- // 存在最大等待时间时
|
|
|
- if(preProcess.getMaxWaitTime() != null){
|
|
|
- // 超过最大等待时间
|
|
|
- if(process.getStartTime().compareTo(startTime1.plusMinutes(preProcess.getMaxWaitTime()))>0){
|
|
|
- bln = true;
|
|
|
- }
|
|
|
- }*/
|
|
|
// 结束时间重新赋值
|
|
|
process.setEndTime(endTime.plusMinutes(lzTimes).plusMinutes(process.getUnitProduceTime()));
|
|
|
}
|
|
|
- // 对比设备已运行时间段来修正时间
|
|
|
+ // 对比设备已运行时间(包括排程中添加的作业)来修正时间
|
|
|
LocalDateTime proStartTime = lastStartTime;
|
|
|
LocalDateTime proEndTime = process.getEndTime();
|
|
|
List<EquipmentRunTime> equipmentRunTimes = process.getEquipment().getEquipmentRunTimes();
|
|
|
+ List<EquipmentRunTime> allRunTimes = new ArrayList<>();
|
|
|
if(equipmentRunTimes != null && equipmentRunTimes.size()>0){
|
|
|
for (EquipmentRunTime equipmentRunTime : equipmentRunTimes) {
|
|
|
- if((proStartTime.compareTo(equipmentRunTime.getStartRunTime())>=0 && proStartTime.compareTo(equipmentRunTime.getEndRunTime())<=0)
|
|
|
- || (proEndTime.compareTo(equipmentRunTime.getStartRunTime())>=0 && proEndTime.compareTo(equipmentRunTime.getEndRunTime())<=0)
|
|
|
- || (proStartTime.compareTo(equipmentRunTime.getStartRunTime())<=0 && proEndTime.compareTo(equipmentRunTime.getEndRunTime())>=0)){
|
|
|
+ EquipmentRunTime copy = new EquipmentRunTime();
|
|
|
+ copy.setStartRunTime(equipmentRunTime.getStartRunTime());
|
|
|
+ copy.setEndRunTime(equipmentRunTime.getEndRunTime());
|
|
|
+ allRunTimes.add(copy);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(process.getEquipment().getProcessesList() != null && process.getEquipment().getProcessesList().size()>0){
|
|
|
+ for (ProductionProcesses productionProcesses : process.getEquipment().getProcessesList()) {
|
|
|
+ if(productionProcesses.getStartTime() != null && productionProcesses.getEndTime() != null){
|
|
|
+ EquipmentRunTime copy = new EquipmentRunTime();
|
|
|
+ copy.setStartRunTime(productionProcesses.getStartTime());
|
|
|
+ copy.setEndRunTime(productionProcesses.getEndTime());
|
|
|
+ allRunTimes.add(copy);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 按照开始时间排序
|
|
|
+ allRunTimes.sort(Comparator.comparing(EquipmentRunTime::getStartRunTime));
|
|
|
+
|
|
|
+ if(allRunTimes.size()>0){
|
|
|
+ for (EquipmentRunTime equipmentRunTime : allRunTimes) {
|
|
|
+ if(proStartTime.compareTo(equipmentRunTime.getEndRunTime())>0 || proEndTime.compareTo(equipmentRunTime.getStartRunTime())<0){
|
|
|
+ continue;
|
|
|
+ }else{
|
|
|
proStartTime = equipmentRunTime.getEndRunTime().plusMinutes(1);
|
|
|
proEndTime = proStartTime.plusMinutes(process.getProduceTime());
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
toUpdateStartTime = proStartTime;
|
|
|
}
|
|
|
}
|
|
@@ -248,11 +283,32 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
|
|
|
LocalDateTime proStartTime = process.getApsOverallConfig().getStartTime();
|
|
|
LocalDateTime proEndTime = proStartTime.plusMinutes(process.getProduceTime());
|
|
|
List<EquipmentRunTime> equipmentRunTimes = process.getEquipment().getEquipmentRunTimes();
|
|
|
+ List<EquipmentRunTime> allRunTimes = new ArrayList<>();
|
|
|
if(equipmentRunTimes != null && equipmentRunTimes.size()>0){
|
|
|
for (EquipmentRunTime equipmentRunTime : equipmentRunTimes) {
|
|
|
- if((proStartTime.compareTo(equipmentRunTime.getStartRunTime())>=0 && proStartTime.compareTo(equipmentRunTime.getEndRunTime())<=0)
|
|
|
- || (proEndTime.compareTo(equipmentRunTime.getStartRunTime())>=0 && proEndTime.compareTo(equipmentRunTime.getEndRunTime())<=0)
|
|
|
- || (proStartTime.compareTo(equipmentRunTime.getStartRunTime())<=0 && proEndTime.compareTo(equipmentRunTime.getEndRunTime())>=0)){
|
|
|
+ EquipmentRunTime copy = new EquipmentRunTime();
|
|
|
+ copy.setStartRunTime(equipmentRunTime.getStartRunTime());
|
|
|
+ copy.setEndRunTime(equipmentRunTime.getEndRunTime());
|
|
|
+ allRunTimes.add(copy);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(process.getEquipment().getProcessesList() != null && process.getEquipment().getProcessesList().size()>0){
|
|
|
+ for (ProductionProcesses productionProcesses : process.getEquipment().getProcessesList()) {
|
|
|
+ if(productionProcesses.getStartTime() != null && productionProcesses.getEndTime() != null){
|
|
|
+ EquipmentRunTime copy = new EquipmentRunTime();
|
|
|
+ copy.setStartRunTime(productionProcesses.getStartTime());
|
|
|
+ copy.setEndRunTime(productionProcesses.getEndTime());
|
|
|
+ allRunTimes.add(copy);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ allRunTimes.sort(Comparator.comparing(EquipmentRunTime::getStartRunTime));
|
|
|
+
|
|
|
+ if(allRunTimes.size()>0){
|
|
|
+ for (EquipmentRunTime equipmentRunTime : allRunTimes) {
|
|
|
+ if(proStartTime.compareTo(equipmentRunTime.getEndRunTime())>0 || proEndTime.compareTo(equipmentRunTime.getStartRunTime())<0){
|
|
|
+ continue;
|
|
|
+ }else{
|
|
|
proStartTime = equipmentRunTime.getEndRunTime().plusMinutes(1);
|
|
|
proEndTime = proStartTime.plusMinutes(process.getProduceTime());
|
|
|
}
|