У меня есть проблема с изменением факта, которое срабатывает, когда заканчивается фаза эвристики строительства.Это изменение факта проблемы изменяет некоторые свойства фактов проблемы «Задача», которые имеют отношение 1 к 1 с соответствующими объектами планирования «Резервирование».
Мой домен (усеченный, чтобы продемонстрировать только эту проблему):
[Booking] 1..1 [Task]
SolutionClass (также урезанный):
@PlanningEntityCollectionProperty
Collection<Booking> bookings;
@ProblemFactCollectionProperty
Collection<Task> tasks;
Пока мой ProblemFactChange:
scoreDirector -> {
certainBookings.forEach(booking -> {
BookingSolution workingSolution = scoreDirector.getWorkingSolution();
Booking workingBooking = scoreDirector.lookUpWorkingObject(booking);
Task task = workingBooking.getTask();
// clone task
Task taskClone = new Task(task);
// shallow-clone the tasks collection and assign it to the working solution
Collection<Task> tasksClone = new ArrayList<>(workingSolution.getTasks());
workingSolution.setTasks(tasksClone);
// remove the task from the working booking
scoreDirector.beforeProblemPropertyChanged(workingBooking);
workingBooking.setTask(null);
scoreDirector.afterProblemPropertyChanged(workingBooking);
// remove the task from the cloned list
scoreDirector.beforeProblemFactRemoved(task);
tasksClone.remove(task);
scoreDirector.afterProblemFactRemoved(task);
// add the cloned task to the cloned list
scoreDirector.beforeProblemFactAdded(taskClone);
tasksClone.add(taskClone);
scoreDirector.afterProblemFactAdded(taskClone);
// add the cloned task to the working booking
scoreDirector.beforeProblemPropertyChanged(workingBooking);
workingBooking.setTask(taskClone);
scoreDirector.afterProblemPropertyChanged(workingBooking);
// modify the cloned task's properties
scoreDirector.beforeProblemPropertyChanged(taskClone);
taskClone.setThis(newThis);
taskClone.setThat(newThat);
scoreDirector.afterProblemPropertyChanged(taskClone);
});
scoreDirector.triggerVariableListeners();
};
Я ожидаю, что оценка решения изменитсякогда свойства Задачи изменяются и слушатели переменных вызываются снова (потому что слушатель переменной использует эти свойства Задачи для вычисления соответствующих параметров Бронирования).В настоящее время я получаю следующее сообщение о повреждении:
VariableListener corruption after completedAction (Initial score calculated):
The entity (BookingABC)'s shadow variable (Booking.eventDateTime)'s corrupted value (2019-04-25T13:14) changed to uncorrupted value (2019-04-25T09:10) after all VariableListeners were triggered without changes to the genuine variables.
Maybe the VariableListener class (ListenerXYZ) for that shadow variable (Booking.eventDateTime) forgot to update it when one of its sources changed.
Должен ли мой прослушиватель переменных также прослушивать свойства задачи Booking, теперь, когда ProblemFactChanges обновляет их?Или моя логика ProblemFactChange сломана или отсутствует что-то еще?