P15GEN2\59518
2024-05-29 d4210c7c4b04abde20037ea8aa0f54ef8a2649aa
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
package foundation.state;
 
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
 
import foundation.data.entity.Entity;
import foundation.json.IJSONProvider;
import foundation.json.IJSONWriter;
import foundation.util.MapList;
 
public class StateMachine implements IJSONProvider, Iterable<StatePoint> {
    
    public static String State_Code_Open = "Open";
    public static String State_Name_Open = "生效";
    public static String State_Code_Close = "Close";
    public static String State_Name_Close = "关闭";
    public static MapList<String, StatePoint> allPoints;
    private String id;
    private String name;
    private boolean active;
    private StateField stateField;
    private States states;
    private List<String> targets;
    private StatePointBucket pointBucket;
 
    static {
        allPoints = new MapList<String, StatePoint>();
    }
    
    public StateMachine() {
        stateField = new StateField();
        targets = new ArrayList<String>();
        pointBucket = new StatePointBucket();
    }
 
    public void load(Entity entity) throws Exception {
        this.id = entity.getString("id");
        this.name = entity.getString("name");
        this.stateField.setCode(entity.getString("field_state_code", "state_code"));
        this.stateField.setName(entity.getString("field_state_name", "state_name"));
        this.stateField.setReasonCode(entity.getString("field_state_reason_code", "state_reason_code"));
        this.active = entity.getBoolean("is_active", true);
    }
 
    public void loadOnePoint(StatePoint point) {
        //1. 加载到当前状态机当中
        State fromState = states.get(point.getFromCode());
        point.setFromState(fromState);
        
        State toState = states.get(point.getToCode());
        point.setToState(toState);
        
        State endState = states.get(point.getEndCode());
        point.setEndState(endState);
        
        //2.
        point.setMachine(this);
        this.pointBucket.loadOne(point);
        
        //3. 
        allPoints.add(point.getId(), point);
    }
    
    public void setStates(States states) {
        this.states = states;
    }
 
    public void loadTarget(String dataName) {
        targets.add(dataName);
    }
 
    public String getId() {
        return this.id;
    }
 
    public String getName() {
        return this.name;
    }
 
    public State getFirst() {
        return states.getFirst();
    }
 
    public StateField getStateField() {
        return this.stateField;
    }
 
    public List<String> getTargets() {
        return targets;
    }
 
    public States getStates() {
        return states; 
    }
 
    public State getState(String code) {
        return states.get(code);
    }
    
    public List<StatePoint> getStatePoints() {
        return pointBucket.getList();
    }
 
    public static StatePoint getGlobalPoint(String pointId) {
        return allPoints.get(pointId);
    }
    
    public StatePoint getPoint(String pointId) {
        return pointBucket.get(pointId);
    }
    
    public StatePoint getPointByToState(String toState) {
        return pointBucket.getPointByToState(toState);
    }
    
    public boolean isActive() {
        return active;
    }
    
    @Override
    public Iterator<StatePoint> iterator() {
        return pointBucket.iterator();
    }
 
    @Override
    public String toString() {
        return name; 
    }
 
    @Override
    public void writeJSON(IJSONWriter writer) {
        writer.beginObject();
        
        writer.write("id", id);
        writer.write("name", name);
        
        writer.beginArray("detail");
        for (StatePoint point: pointBucket) {
            point.writeJSON(writer);
        }
        writer.endArray();
        
        writer.endObject();
    }
    
}