liuyn
2024-03-11 a87f1c3df03078814ee97ad0c8ac200a232419e9
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
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
public with sharing class UserInProcessController {
    public List<ProcInfo> procRecords { get; set; }
    
    /*****************検索用******************/
    // メガネアイコンを出すため、Daily_Report__cのOwnerIdを利用する
    // Daily_Report__cは皆権限ありますから
    public Daily_Report__c dummyDr { get; set; }
    
    public String sobj { get; set; }
    public String proc { get; set; }
    public String actor { get; set; }
    public String stay { get; set; }
    public String limits { get; set; }
    
    public List<SelectOption> procOpts { get; private set; }      // プロセス一覧
    public List<SelectOption> sObjectOpts { get; private set; }   // SObject一覧
    public List<SelectOption> limitOpts { get; private set; }
    public List<SelectOption> stayNotOpts { get; private set; }
    
    private List<ProcessDefinition> pdList = new List<ProcessDefinition>();
    private Map<String, String> sobjNameMap = new Map<String, String>();
    
    private static Integer procLimit = 1000;
    
    public UserInProcessController() {
        //originActor = new Daily_Report__c();
        dummyDr = new Daily_Report__c();
        pdList = [select Id, TableEnumOrId, Name, DeveloperName from ProcessDefinition where State = 'Active'];
        
        procOpts = new List<SelectOption>();
        procOpts.add(new SelectOption('', '--无--'));
        Set<String> existSObjSet = new Set<String>();
        for (ProcessDefinition pd : pdList) {
            procOpts.add(new SelectOption(pd.DeveloperName, pd.Name));
            existSObjSet.add(pd.TableEnumOrId);
        }
        
        sObjectOpts = new List<SelectOption>();
        sObjectOpts.add(new SelectOption('', '--无--'));
        Map<String, Schema.SObjectType> smap = Schema.getGlobalDescribe();
        for (String objKey : smap.keySet()) {
            Schema.SObjectType sobj = smap.get(objKey);
            Schema.DescribeSObjectResult sr = sobj.getDescribe();
            if (existSObjSet.contains(sr.getName())) {
                sObjectOpts.add(new SelectOption(sr.getName(), sr.getLabel()));
                sobjNameMap.put(sr.getName(), sr.getLabel());
            }
        }
        
        limitOpts = new List<SelectOption>();
        limitOpts.add(new SelectOption('50','50'));
        limitOpts.add(new SelectOption('100','100'));
        limitOpts.add(new SelectOption('200','200'));
        limitOpts.add(new SelectOption('500','500'));
        limitOpts.add(new SelectOption('' + (procLimit + 1), '全部'));
        //limits = '50';
        
        stayNotOpts = new List<SelectOption>();
        stayNotOpts.add(new SelectOption('', '--无--'));
        stayNotOpts.add(new SelectOption('在职', '在职'));
        stayNotOpts.add(new SelectOption('已离职', '已离职'));
    }
    
    public void init() {
        sobj = ApexPages.currentPage().getParameters().get('s');
        proc = ApexPages.currentPage().getParameters().get('p');
        actor = ApexPages.currentPage().getParameters().get('a');
        stay = ApexPages.currentPage().getParameters().get('sn');
        limits = ApexPages.currentPage().getParameters().get('l');
        if (String.isBlank(limits) == true) {
            limits = '200';
        }
        if (String.isBlank(actor) == false) {
            dummyDr.Reporter__c = actor;
        }
        searchProcessInfo();
    }
    
    public void searchProcessInfo() {
        procRecords = new List<ProcInfo>();
        
        String soql = this.makeSoql(actor, sobj, proc);
        soql += ' order by CreatedDate desc limit ' + Integer.valueOf(limits);
        List<ProcessInstanceWorkitem> processList = Database.query(soql);
        
        // UserIdの配列、SOQLは直接Userの項目を取得できないので
        List<Id> usrIds = new List<Id>();
        for (ProcessInstanceWorkitem pi : processList) {
            usrIds.add(pi.ActorId);
        }
        
        Map<Id, User> userMap = new Map<Id, User>();
        for (User u : [select Id, post__c, Stay_or_not__c, Pregnant_Rest__c, IsActive from User where Id in :usrIds]) {
            // ユーザ指定なく、在职/离职条件がある場合、UserMapを絞り込む
            if (String.isBlank(actor) == true && String.isBlank(stay) == false) {
                if (u.Stay_or_not__c == stay) {
                    userMap.put(u.Id, u);
                }
            }
            // ユーザ指定すれば、在职/离职条件が意味ない
            else if (String.isBlank(actor) == false){
                if (u.Id == actor) {
                    userMap.put(u.Id, u);
                }
            }
            else {
                userMap.put(u.Id, u);
            }
        }
        
        // 画面上にだす配列を作成
        for (ProcessInstanceWorkitem pi : processList) {
            if (userMap.containsKey(pi.ActorId)) {
                procRecords.add(new ProcInfo(pi, userMap, sobjNameMap));
            }
        }
        
        if (procRecords.size() > procLimit) {
            ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO, '数据超过' + procLimit + '件,只显示前' + procLimit + '件'));
        } else {
            ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO, '取得 ' + procRecords.size()  + ' 条数据'));
        }
    }
    
    public void resetProcOpts() {
        procOpts = new List<SelectOption>();
        procOpts.add(new SelectOption('', '--无--'));
        Set<String> existSObjSet = new Set<String>();
        for (ProcessDefinition pd : pdList) {
            if (String.isBlank(sobj) == false && pd.TableEnumOrId == sobj) {
                procOpts.add(new SelectOption(pd.DeveloperName, pd.Name));
            }
            if (String.isBlank(sobj) == true) {
                procOpts.add(new SelectOption(pd.DeveloperName, pd.Name));
            }
        }
    }
    
    private String makeSoql(String aid, String sname, String pname) {
        String soql = 'select Id, ProcessInstanceId, ActorId, OriginalActorId,'
                    + ' ProcessInstance.ProcessDefinition.Name, ProcessInstance.ProcessDefinition.TableEnumOrId, Actor.Name, OriginalActor.Name,'
                    + ' ProcessInstance.TargetObjectId'
                    //+ ' Actor.Stay_or_not__c, Actor.Post__c, Actor.Pregnant_Rest__c'
                    + ' from ProcessInstanceWorkitem'
                    + ' where IsDeleted = false';
        if (String.isBlank(aid) == false) {
            soql += ' and ActorId = \'' + aid + '\'';
        }
        if (String.isBlank(sname) == false) {
            soql += ' and ProcessInstance.ProcessDefinition.TableEnumOrId = \'' + sname + '\'';
        }
        if (String.isBlank(pname) == false) {
            soql += ' and ProcessInstance.ProcessDefinition.DeveloperName = \'' + pname + '\'';
        }
        
        return soql;
    }
    
    class ProcInfo {
        public ProcessInstanceWorkitem rec { get; private set; }
        public String post { get; private set; }
        public String stayOrNot { get; private set; }
        public Boolean pregnantRest { get; private set; }
        public String sobjName { get; private set; }
        public String active { get; private set; }
        
        public ProcInfo(ProcessInstanceWorkitem record, Map<Id, User> userMap, Map<String, String> sobjNameMap) {
            rec = record;
            post = userMap.get(record.ActorId).Post__c;
            stayOrNot = userMap.get(record.ActorId).Stay_or_not__c;
            pregnantRest = userMap.get(record.ActorId).Pregnant_Rest__c;
            sobjName = sobjNameMap.get(record.ProcessInstance.ProcessDefinition.TableEnumOrId);
            if (userMap.get(record.ActorId).IsActive == true) {
                active = '有效';
            } else {
                active = '无效';
            }
        }
    }
}