P15GEN2\59518
2025-10-10 9f6890646993d16260d4201d613c092132856127
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
package foundation.state.approve;
 
import java.util.Iterator;
import java.util.List;
 
import foundation.data.entity.Entity;
import foundation.json.IJSONProvider;
import foundation.json.IJSONWriter;
import foundation.token.IOnlineUser;
import foundation.util.MapList;
import foundation.workflow.WorkStep;
 
public class ApproveRuntime implements IJSONProvider, Iterable<Step> {
 
    private String id;
    private String name;
    private SkipType skipType;
    private boolean simpleList;
    private MapList<String, Step> items;
    
    public ApproveRuntime() {
        items = new MapList<String, Step>();
    }
 
    public ApproveRuntime(String id, String name, SkipType skipType) {
        this.id = id;
        this.name = name;
        this.skipType = skipType;
        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");
        skipType = SkipType.parse(entity.getString("skip_type_code"));
    }
 
    public ApproveRuntime getRuntime(IOnlineUser user, WorkStep step) throws Exception {
        //1. 如果是简单列表,直接使用
        if (simpleList) {
            return this;
        }
        
        //2. 如果不是简单列表,需要根据RoleCode进行计算
        ApproveRuntime result = newEmptyInstance();
        
        for (Step oneStep: items) {
            StepType type = oneStep.getType();
            
            //2.1 如果是固定步骤,直接添加
            if (StepType.ListStep == type) {
                result.items.add(oneStep.getId(), oneStep);
                continue;
            }
            
            //2.2 如果动态步骤,实时创建
            List<Step> stepList = StepsCreator.createSalesHierarchySteps(type, oneStep, user, step);
            
            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 SkipType getSkipType() {
        return skipType;
    }
 
    public void loadOneStep(Step step) {
        simpleList = simpleList && (StepType.ListStep == step.getType());
        items.add(step.getId(), step);
    }
 
    public boolean isSimpleList() {
        return simpleList;
    }
    
    @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.write("skip_type_code", skipType.name());
        writer.write("skip_type_name", skipType.getName());
 
        
        writer.beginArray("steps");
        for (Step step: items) {
            step.writeJSON(writer);
        }
        writer.endArray();
        
        writer.endObject();
    }
}