|
@@ -502,6 +502,14 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
|
|
|
// 当前工序最小开始时间、结束时间
|
|
|
LocalDateTime proStartTime = endTime.plusMinutes(lzTimes);
|
|
|
LocalDateTime proEndTime = proStartTime.plusMinutes(process.getProduceTime());
|
|
|
+ // 当前工序最大开始时间、结束时间
|
|
|
+ LocalDateTime proMaxStartTime = null;
|
|
|
+ LocalDateTime proMaxEndTime = null;
|
|
|
+ if(preProcess.getMaxWaitTime() != null && preProcess.getMaxWaitTime()>0){
|
|
|
+ proMaxStartTime = proStartTime.plusMinutes(preProcess.getMaxWaitTime());
|
|
|
+ proMaxEndTime = proEndTime.plusMinutes(preProcess.getMaxWaitTime());
|
|
|
+ }
|
|
|
+
|
|
|
// 随机延时时间处理
|
|
|
if(process.getProcessType().equals("成退") || process.getProcessType().equals("中退")
|
|
|
|| process.getProcessType().equals("铸轧") || process.getProcessType().equals("冷轧")){
|
|
@@ -547,7 +555,7 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
|
|
|
break;
|
|
|
}else{
|
|
|
// 未锁定的是排程中的作业占用时间段,可以合并更大的加工时间
|
|
|
- if(!equipmentRunTime.isLocked()){
|
|
|
+// if(!equipmentRunTime.isLocked()){
|
|
|
if(equipmentRunTime.getStartRunTime().compareTo(productionProcesses.getStartTime())>=0
|
|
|
&& equipmentRunTime.getEndRunTime().compareTo(productionProcesses.getEndTime())<=0){
|
|
|
// 合并退火作业总宽度、承重
|
|
@@ -558,7 +566,7 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
|
|
|
merged = true;
|
|
|
break;
|
|
|
}
|
|
|
- }
|
|
|
+// }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -575,49 +583,40 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
|
|
|
// 过滤
|
|
|
// 按照开始时间排序
|
|
|
equipmentRunTimes.sort(Comparator.comparing(EquipmentRunTime::getStartRunTime));
|
|
|
- // 有交叉的时间直接跳过
|
|
|
+ // 有交叉的时间直接跳过,退火工序特殊处理
|
|
|
if(equipmentRunTimes.size()>0){
|
|
|
for (EquipmentRunTime equipmentRunTime : equipmentRunTimes) {
|
|
|
- if(proStartTime.compareTo(equipmentRunTime.getEndRunTime())>0 || proEndTime.compareTo(equipmentRunTime.getStartRunTime())<0){
|
|
|
- continue;
|
|
|
- }else{
|
|
|
- boolean jumpMark = false;
|
|
|
- // 退火工序特殊处理
|
|
|
- if(process.getProcessType().equals("成退") || process.getProcessType().equals("中退")){
|
|
|
- if(equipmentRunTime.getStartRunTime().compareTo(proStartTime)<=0
|
|
|
- && equipmentRunTime.getEndRunTime().compareTo(proEndTime)>=0){
|
|
|
- // 宽度余量
|
|
|
- if (pe.getEquipmentParameter().getEquipmentWidth().subtract(equipmentRunTime.getTotalVolumeWidth()).compareTo(process.getVolumeWidth()) < 0) {
|
|
|
- jumpMark = true;
|
|
|
- }
|
|
|
- // 重量余量
|
|
|
- if (pe.getEquipmentParameter().getEquipmentBearing().subtract(equipmentRunTime.getTotalSinglerollweight()).compareTo(process.getSinglerollweight()) < 0) {
|
|
|
- jumpMark = true;
|
|
|
- }
|
|
|
- }else if(equipmentRunTime.getStartRunTime().compareTo(proStartTime)>=0 && equipmentRunTime.getEndRunTime().compareTo(proEndTime)<=0){
|
|
|
- // 未锁定的是排程中的作业占用时间段,可以合并更大的加工时间
|
|
|
- if(!equipmentRunTime.isLocked()){
|
|
|
- // 宽度余量
|
|
|
- if (pe.getEquipmentParameter().getEquipmentWidth().subtract(equipmentRunTime.getTotalVolumeWidth()).compareTo(process.getVolumeWidth()) < 0) {
|
|
|
- jumpMark = true;
|
|
|
- }
|
|
|
- // 重量余量
|
|
|
- if (pe.getEquipmentParameter().getEquipmentBearing().subtract(equipmentRunTime.getTotalSinglerollweight()).compareTo(process.getSinglerollweight()) < 0) {
|
|
|
- jumpMark = true;
|
|
|
+ // 退火工序
|
|
|
+ if(process.getProcessType().equals("成退") || process.getProcessType().equals("中退")){
|
|
|
+ if(equipmentRunTime.getEndRunTime().compareTo(proStartTime)<=0){
|
|
|
+ continue;
|
|
|
+ }else{
|
|
|
+ if(equipmentRunTime.getStartRunTime().compareTo(proStartTime)<0){
|
|
|
+ proStartTime = equipmentRunTime.getEndRunTime().plusMinutes(1);
|
|
|
+ }else{
|
|
|
+ if(equipmentRunTime.getStartRunTime().compareTo(proEndTime)<0){
|
|
|
+ boolean merge = isMerge(pe, equipmentRunTime, process);
|
|
|
+ if(merge){
|
|
|
+ proStartTime = equipmentRunTime.getStartRunTime();
|
|
|
+ }else{
|
|
|
+ proStartTime = equipmentRunTime.getEndRunTime().plusMinutes(1);
|
|
|
}
|
|
|
- equipmentRunTime.setStartRunTime(proStartTime);
|
|
|
- equipmentRunTime.setEndRunTime(proEndTime);
|
|
|
}else{
|
|
|
- jumpMark = true;
|
|
|
+ if(equipmentRunTime.getStartRunTime().compareTo(proMaxStartTime)<0){
|
|
|
+ boolean merge = isMerge(pe, equipmentRunTime, process);
|
|
|
+ if(merge){
|
|
|
+ proStartTime = equipmentRunTime.getStartRunTime();
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
- }else{
|
|
|
- jumpMark = true;
|
|
|
}
|
|
|
- }else{
|
|
|
- jumpMark = true;
|
|
|
}
|
|
|
- // 跳过当前占用时间
|
|
|
- if(jumpMark){
|
|
|
+ }
|
|
|
+ // 非退火工序
|
|
|
+ else{
|
|
|
+ if(proStartTime.compareTo(equipmentRunTime.getEndRunTime())>0 || proEndTime.compareTo(equipmentRunTime.getStartRunTime())<0){
|
|
|
+ continue;
|
|
|
+ }else{
|
|
|
proStartTime = equipmentRunTime.getEndRunTime().plusMinutes(1);
|
|
|
proEndTime = proStartTime.plusMinutes(process.getProduceTime());
|
|
|
}
|
|
@@ -630,6 +629,26 @@ public class TaskStartTimeListener implements VariableListener<ApsSolution, Prod
|
|
|
return toUpdateStartTime;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 判断当前设备时间段是否可以合并退火当前工序
|
|
|
+ * @param pe
|
|
|
+ * @param equipmentRunTime
|
|
|
+ * @param process
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private boolean isMerge(Equipment pe,EquipmentRunTime equipmentRunTime,ProductionProcesses process){
|
|
|
+ boolean jumpMark = true;
|
|
|
+ // 宽度余量
|
|
|
+ if (pe.getEquipmentParameter().getEquipmentWidth().subtract(equipmentRunTime.getTotalVolumeWidth()).compareTo(process.getVolumeWidth()) < 0) {
|
|
|
+ jumpMark = false;
|
|
|
+ }
|
|
|
+ // 重量余量
|
|
|
+ if (pe.getEquipmentParameter().getEquipmentBearing().subtract(equipmentRunTime.getTotalSinglerollweight()).compareTo(process.getSinglerollweight()) < 0) {
|
|
|
+ jumpMark = false;
|
|
|
+ }
|
|
|
+ return jumpMark;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 汇总所有下道工序的加工时间
|
|
|
* @param nextProcess
|