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
package foundation.state.approve;
 
import java.util.Iterator;
import java.util.List;
 
import foundation.action.ActionContext;
import foundation.data.entity.Entity;
import foundation.json.IJSONProvider;
import foundation.json.IJSONWriter;
import foundation.state.DetailState;
import foundation.token.IOnlineUser;
import foundation.util.MapList;
 
public class ApproveRuntime implements IJSONProvider, Iterable<Step> {
 
    private String id;
    private String name;
    private boolean simpleList;
    private MapList<String, Step> items;
    
    public ApproveRuntime() {
        items = new MapList<String, Step>();
    }
 
    public ApproveRuntime newEmptyInstance() {
        ApproveRuntime result = new ApproveRuntime();
        result.id = this.id;
        result.name = this.name;
        
        return result;
    }
    
    public static ApproveRuntime getInstance(String id) {
        ApproveRuntimeBucket bucket = ApproveRuntimeBucket.getInstance();
        
        ApproveRuntime result = bucket.get(id);
        
        return result;
    }
    
    public void load(Entity entity) {
        id = entity.getString("id");
        name = entity.getString("name");
    }
 
    public ApproveRuntime getRuntime(IOnlineUser user, ActionContext context) throws Exception {
        //1. 如果是简单列表,直接使用
        if (simpleList) {
            return this;
        }
        
        //2. 如果不是简单列表,需要根据RoleCode进行计算
        ApproveRuntime result = newEmptyInstance();
        
        for (Step step: items) {
            StepType type = step.getType();
            
            //2.1 如果是固定步骤,直接添加
            if (StepType.ListStep == type) {
                result.items.add(step.getId(), step);
                continue;
            }
            
            //2.2 如果动态步骤,实时创建
            List<Step> stepList = StepsCreator.createSalesHierarchySteps(type, user, context);
            
            if (stepList == null) {
                continue;
            }
            
            for (Step dynamic: stepList) {
                result.items.add(dynamic.getId(), dynamic);
            }
        }
        
        return result;
    }
 
    public String getId() {
        return id;
    }
 
    public String getName() {
        return name;
    }
 
    public void loadOneStep(Step step) {
        simpleList = simpleList && (StepType.ListStep == step.getType());
        items.add(step.getId(), step);
    }
 
    public boolean isSimpleList() {
        return simpleList;
    }
 
    public DetailState getFirstDetailState() {
        if (items.isEmpty()) {
            return null;
        }
        
        Step step = items.get(0);
        return step.getDetailState();
    }
    
    @Override
    public Iterator<Step> iterator() {
        return items.iterator();
    }
 
    @Override
    public void writeJSON(IJSONWriter writer) {
        writer.beginObject();
        
        writer.write("id", id);
        writer.write("name", name);
        
        writer.beginArray("steps");
        for (Step step: items) {
            step.writeJSON(writer);
        }
        writer.endArray();
        
        writer.endObject();
    }
}