李林
2023-10-07 658d4927d468c47208fd012d9128b09249c07eff
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package com.chinaztt.mes.aps.core.solver;
 
import com.chinaztt.mes.aps.core.domain.Task;
import org.optaplanner.core.impl.domain.variable.listener.VariableListener;
import org.optaplanner.core.impl.score.director.ScoreDirector;
 
import java.time.LocalDateTime;
import java.util.*;
 
/**
 * @Author: zhangxy
 * @Date: 2020-10-19 20:36
 */
public class StartTimeUpdatingVariableListener implements VariableListener<Task> {
    private Set<Long> idSet = new HashSet<>();
 
    @Override
    public void beforeEntityAdded(ScoreDirector scoreDirector, Task task) {
 
    }
 
    @Override
    public void afterEntityAdded(ScoreDirector scoreDirector, Task task) {
        updatePlanStartTime(scoreDirector, task);
    }
 
    @Override
    public void beforeVariableChanged(ScoreDirector scoreDirector, Task task) {
 
    }
 
    @Override
    public void afterVariableChanged(ScoreDirector scoreDirector, Task task) {
        this.updatePlanStartTime(scoreDirector, task);
    }
 
    @Override
    public void beforeEntityRemoved(ScoreDirector scoreDirector, Task task) {
 
    }
 
    @Override
    public void afterEntityRemoved(ScoreDirector scoreDirector, Task task) {
 
    }
 
 
    protected void updatePlanStartTime(ScoreDirector scoreDirector, Task sourceTask) {
        idSet.clear();
        Queue<Task> uncheckedSuccessorQueue = new ArrayDeque<>();
        uncheckedSuccessorQueue.add(sourceTask);
        while (!uncheckedSuccessorQueue.isEmpty()) {
            Task task = uncheckedSuccessorQueue.remove();
            if (idSet.contains(task.getId())) {
                continue;
            }
            boolean updated = doUpdate(scoreDirector, task);
            if (updated) {
                idSet.add(task.getId());
                if (task.getNextTask() != null) {
                    uncheckedSuccessorQueue.add(task.getNextTask());
                }
                if (task.getSuccessorOfRouting() != null) {
                    uncheckedSuccessorQueue.add(task.getSuccessorOfRouting());
                }
            }
        }
    }
 
 
    protected boolean doUpdate(ScoreDirector scoreDirector, Task task) {
        LocalDateTime now = LocalDateTime.now();
        LocalDateTime time1 = task.getPreviousTaskOrResource() == null ? now : task.getPreviousTaskOrResource().getPlanEndTime();
        LocalDateTime time2 = task.getPredecessorOfRouting() == null ? now : task.getPredecessorOfRouting().getPlanEndTime();
 
        LocalDateTime maxTime = time1.compareTo(time2) >= 0 ? time1 : time2;
        if (Objects.equals(maxTime, task.getPlanStartTime())) {
            return false;
        }
        scoreDirector.beforeVariableChanged(task, "planStartTime");
        task.setPlanStartTime(maxTime);
        scoreDirector.afterVariableChanged(task, "planStartTime");
        return true;
    }
 
 
}