Предисловие: Поиск документов в Google + SO + не дал соответствующей информации.
Модель домена:
Моя модель домена пытается изобразить ProductionPlan, содержащий список машин. У каждой машины есть список связанных работ, то есть работа, у которой есть метод getNextEntry (): Job Job, создающий список работ.
Я пытался решить эту проблему с помощью цепочки PlanningVariables, но, видимо, не понимаю концепции chainedVariables / shadowVariables / anchorVariables. Насколько я понимаю, все задания объединяются в цепочку, и anchorShadowVariable указывает на начало списка, то есть на компьютер.
Для реализации связывания Job и Machine необходимо реализовать интерфейс или расширить суперкласс, поэтому я создал ChainSuperClass , Кроме того, я не знаю, нужно ли мне переписывать метод получения / установки для установки аннотаций в Machine-классе, я предположил, что, поскольку машина расширяет класс ChainSuperClass, эти аннотации переносятся.
Редактировать: Kotlin конкретизировать c также приветствуются улучшения.
Полный журнал ошибок выполнения моего кода теперь:
Exception in thread "main" java.lang.IllegalArgumentException: The entityClass (class optaplanner.productionPlan.domain.ChainSuperClass) has a InverseRelationShadowVariable annotated property (nextEntry) which does not return a Collection with sourceVariableName (machine) which is not chained. Only a chained variable supports a singleton inverse.
ChainSuperClass:
@PlanningEntity
abstract class ChainSuperClass {
@PlanningId
open val id = Random.nextInt().toString()
@InverseRelationShadowVariable(sourceVariableName = "machine")
abstract fun getNextEntry(): Job?
abstract fun setNextEntry(job: Job)
}
Задание:
@PlanningEntity
class Job(
val jobType: JobType,
val itemNumber: String,
val orderNumber: String,
val setupTime: Int,
val productionTime: Int
) : ChainSuperClass() {
@AnchorShadowVariable(sourceVariableName = "machine")
var machine: Machine? = null
private var nextEntry: Job? = null
@PlanningVariable(
valueRangeProviderRefs = ["jobList"],
graphType = PlanningVariableGraphType.CHAINED
)
override fun getNextEntry(): Job? {
return nextEntry
}
override fun setNextEntry(job: Job) {
this.nextEntry = nextEntry
}
}
Машина:
class Machine(override val id: String, val jobTypes: List<JobType>) : ChainSuperClass() {
private var nextEntry: Job? = null
override fun setNextEntry(job: Job) {
this.nextEntry = job
}
override fun getNextEntry(): Job? {
return nextEntry!!
}
}