|
@@ -84,12 +84,38 @@ public class TaskStartTimeListenerTa implements ListVariableListener<ApsSolution
|
|
|
for (int i = index; i < tasks.size(); i++) {
|
|
|
ProductionProcessesTa t = tasks.get(i);
|
|
|
LocalDateTime previousLastEndTime = getEarlyStartTime(t, equipmentTa,allProcessesList);
|
|
|
+
|
|
|
+ boolean isMergePrePro = false;
|
|
|
if(i>0){
|
|
|
ProductionProcessesTa pret = tasks.get(i-1);
|
|
|
if(previousLastEndTime.compareTo(pret.getStartTime())<=0){
|
|
|
// 设置当前工序和上道工序开始时间一样(即合并为同一炉)
|
|
|
if(thMerge(tasks,i,equipmentTa)){
|
|
|
previousEndTime = pret.getStartTime();
|
|
|
+ isMergePrePro = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 最晚结束时间
|
|
|
+ LocalDateTime mergeMaxEndTime = previousEndTime.plusMinutes(t.getProduceTime());
|
|
|
+ if(isMergePrePro){
|
|
|
+ // 递归前道工序获取当前工序的前一炉退火工序
|
|
|
+ List<ProductionProcessesTa> mergePros = new ArrayList<>();
|
|
|
+ for (int j = i-1; j >= 0 ; j--) {
|
|
|
+ if(mergePros.size() == 0){
|
|
|
+ mergePros.add(tasks.get(j));
|
|
|
+ }else{
|
|
|
+ if(tasks.get(j).getStartTime().compareTo(mergePros.get(0).getStartTime()) == 0){
|
|
|
+ mergePros.add(tasks.get(j));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(mergePros != null && mergePros.size() > 0){
|
|
|
+ for (ProductionProcessesTa mergePro : mergePros) {
|
|
|
+ if(mergePro.getEndTime().compareTo(mergeMaxEndTime)>0){
|
|
|
+ mergeMaxEndTime = mergePro.getEndTime();
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -109,7 +135,11 @@ public class TaskStartTimeListenerTa implements ListVariableListener<ApsSolution
|
|
|
if(previousEndTime.compareTo(specificDateTime)>0){
|
|
|
int aa = 0;
|
|
|
}
|
|
|
- previousEndTime = t.getEndTime();
|
|
|
+ if(isMergePrePro && mergeMaxEndTime.compareTo(t.getEndTime())>0){
|
|
|
+ previousEndTime = mergeMaxEndTime;
|
|
|
+ }else{
|
|
|
+ previousEndTime = t.getEndTime();
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
// 非退火
|