package com.rongwei.rwapsserver.aps.domain; import lombok.*; import org.optaplanner.core.api.domain.solution.PlanningEntityCollectionProperty; import org.optaplanner.core.api.domain.solution.PlanningScore; import org.optaplanner.core.api.domain.solution.PlanningSolution; import org.optaplanner.core.api.domain.solution.ProblemFactCollectionProperty; import org.optaplanner.core.api.domain.valuerange.CountableValueRange; import org.optaplanner.core.api.domain.valuerange.ValueRangeFactory; import org.optaplanner.core.api.domain.valuerange.ValueRangeProvider; import org.optaplanner.core.api.score.buildin.hardmediumsoft.HardMediumSoftScore; import org.optaplanner.core.api.score.buildin.hardsoft.HardSoftScore; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; import java.util.List; @EqualsAndHashCode(callSuper = true) @Data @NoArgsConstructor @PlanningSolution public class ApsSolution extends ApsAbstractPersistable{ @Getter(value = AccessLevel.NONE) private List processesList; @Getter(value = AccessLevel.NONE) private List equipmentList; @Getter(value = AccessLevel.NONE) private HardMediumSoftScore score; private Long incrementUnitAmount; public LocalDateTime startTime; // 每一步骤最优规划实体 private List stepBestProcessesList; // 是否初始结束 private boolean constructionHeuristicEnd; public ApsSolution(String id, List processesList, List equipmentList) { super(id); this.processesList = processesList; this.equipmentList = equipmentList; } @ValueRangeProvider(id="taskRange") @PlanningEntityCollectionProperty public List getProcessesList() { return processesList; } @ProblemFactCollectionProperty public List getEquipmentList() { return equipmentList; } @ValueRangeProvider(id="timeRange") public CountableValueRange getxRange(){ Long produceTimeTotal = 0L; for (ProductionProcesses productionProcesses : processesList) { produceTimeTotal = produceTimeTotal + productionProcesses.getProduceTime(); } LocalDateTime fromTime = LocalDateTime.now(); if(startTime != null){ fromTime = startTime; } Long incrementUnit = this.incrementUnitAmount; if(incrementUnit == null){ incrementUnit = 5L; } long sy = produceTimeTotal % incrementUnit; if(sy>0){ produceTimeTotal = produceTimeTotal - sy; } System.out.println("startTime:"+startTime); return ValueRangeFactory.createLocalDateTimeValueRange(fromTime,fromTime.plusMinutes(produceTimeTotal),incrementUnit, ChronoUnit.MINUTES); } @PlanningScore public HardMediumSoftScore getScore() { return score; } public Long getIncrementUnitAmount() { return incrementUnitAmount; } public void setIncrementUnitAmount(Long incrementUnitAmount) { this.incrementUnitAmount = incrementUnitAmount; } }