|
@@ -1,5 +1,6 @@
|
|
|
package com.rongwei.rwapsserver.aps.taskassigning.tado;
|
|
|
|
|
|
+import com.rongwei.rwapsserver.aps.domain.EquipmentRunTime;
|
|
|
import com.rongwei.rwapsserver.aps.util.ObjectNull;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.optaplanner.core.api.domain.variable.ListVariableListener;
|
|
@@ -65,7 +66,12 @@ public class TaskStartTimeListenerTa implements ListVariableListener<ApsSolution
|
|
|
|
|
|
index = 0;
|
|
|
ProductionProcessesTa productionProcessesTa = tasks.get(index);
|
|
|
- LocalDateTime previousEndTime = index == 0 ? productionProcessesTa.getApsOverallConfig().getStartTime() : tasks.get(index - 1).getEndTime();
|
|
|
+ // 排程开始时间
|
|
|
+ LocalDateTime apsStartTime = productionProcessesTa.getApsOverallConfig().getStartTime();
|
|
|
+ if(equipmentTa.getStartDdTime() != null && equipmentTa.getStartDdTime().compareTo(apsStartTime)>0){
|
|
|
+ apsStartTime = equipmentTa.getStartDdTime();
|
|
|
+ }
|
|
|
+ LocalDateTime previousEndTime = index == 0 ? apsStartTime : tasks.get(index - 1).getEndTime();
|
|
|
|
|
|
for (int i = index; i < tasks.size(); i++) {
|
|
|
ProductionProcessesTa t = tasks.get(i);
|
|
@@ -73,6 +79,8 @@ public class TaskStartTimeListenerTa implements ListVariableListener<ApsSolution
|
|
|
if(previousLastEndTime != null && previousLastEndTime.compareTo(previousEndTime)>0){
|
|
|
previousEndTime = previousLastEndTime;
|
|
|
}
|
|
|
+ // 过滤设备占用时间
|
|
|
+ previousEndTime = eqRunTimeDistinct(equipmentTa,t,previousEndTime);
|
|
|
if (!Objects.equals(t.getStartTime(), previousEndTime)) {
|
|
|
scoreDirector.beforeVariableChanged(t, "startTime");
|
|
|
t.setStartTime(previousEndTime);
|
|
@@ -87,6 +95,32 @@ public class TaskStartTimeListenerTa implements ListVariableListener<ApsSolution
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 根据设备占用时间判断是否有重叠,如果有则依次往后推
|
|
|
+ * @param equipmentTa
|
|
|
+ * @param previousEndTime
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private LocalDateTime eqRunTimeDistinct(EquipmentTa equipmentTa,ProductionProcessesTa t,LocalDateTime previousEndTime){
|
|
|
+ // 开始时间、结束时间
|
|
|
+ LocalDateTime retStartTime = previousEndTime;
|
|
|
+ LocalDateTime retEndTime = retStartTime.plusMinutes(t.getProduceTime());
|
|
|
+ List<EquipmentRunTime> equipmentRunTimes = equipmentTa.getEquipmentRunTimes();
|
|
|
+ if(equipmentRunTimes != null && equipmentRunTimes.size()>0){
|
|
|
+ for (EquipmentRunTime equipmentRunTime : equipmentRunTimes) {
|
|
|
+ // 开始时间大于等于设备占用结束时间或者结束时间小于等于设备占用开始时间则跳过,
|
|
|
+ // 否则设置开始时间为设备占用结束时间
|
|
|
+ if(retStartTime.compareTo(equipmentRunTime.getEndRunTime())>=0
|
|
|
+ || retEndTime.compareTo(equipmentRunTime.getStartRunTime())<=0){
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ retStartTime = equipmentRunTime.getEndRunTime();
|
|
|
+ retEndTime = retStartTime.plusMinutes(t.getProduceTime());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return retStartTime;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 获取当前工序的最早开工时间
|
|
|
* @param t
|