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
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
public with sharing class ConsumableTargetManageHandler extends Oly_TriggerHandler  {
    private Map<Id, ConsumableTargetManage__c> newMap;
    private Map<Id, ConsumableTargetManage__c> oldMap;
    private List<ConsumableTargetManage__c> newList;
    private List<ConsumableTargetManage__c> oldList;
    public ConsumableTargetManageHandler() {
        this.newMap = (Map<Id, ConsumableTargetManage__c>) Trigger.newMap;
        this.oldMap = (Map<Id, ConsumableTargetManage__c>) Trigger.oldMap;
        this.newList = (List<ConsumableTargetManage__c>) Trigger.new;
        this.oldList = (List<ConsumableTargetManage__c>) Trigger.old;
    }
    protected override void beforeInsert(){
        createdConsumableTargetManage();
    }
    protected override void afterInsert(){
        HospitalToIMSUser();
        OCSMToTMSUser(); // you 20240307 为IMS添加办事处中ET,ENG担当的查看权限
    }
    protected override void afterUpdate(){
        OCSMToTMSUser();
    }
    //DB202312611748 【IMS/TMS】IMS管理表--耗材管理工具 start
    protected override void beforeUpdate(){
        createdConsumableTargetManage();
        HospitalToIMSUser();
    }
    //DB202312611748 【IMS/TMS】IMS管理表--耗材管理工具 end
    private void createdConsumableTargetManage(){
        //DB202312611748 【IMS/TMS】IMS管理表--耗材管理工具 start
        // if(trigger.isInsert){
        if(trigger.isInsert||trigger.isUpdate){
        //DB202312611748 【IMS/TMS】IMS管理表--耗材管理工具 end
            List<Id> hospit = new List<Id>();
            for(ConsumableTargetManage__c ctm : newList){
                hospit.add(ctm.Hospital__c);
            }
            List<Account> hospital = [select Id,ET_owner__c,ET_Product_Leader__c from Account where Id in:hospit];
            Map<Id,Account> hospitalMap = new Map<Id,Account>();
            if(hospital.size()>0){
                for(Account account : hospital){
                    hospitalMap.put(account.Id,account);
                }
            }
            for(ConsumableTargetManage__c ctm : newList){
                //将ET主担当赋给所有人,并给担当添加共享,只有ET修改所有人
                if(hospitalMap.containsKey(ctm.Hospital__c) && hospitalMap.get(ctm.Hospital__c) != null){
                    //DB202312611748 【IMS/TMS】IMS管理表--耗材管理工具 start
                    if(ctm.OwnerId != hospitalMap.get(ctm.Hospital__c).ET_owner__c){
                        if(ctm.productType__c == 'ET耗材'){
                    //DB202312611748 【IMS/TMS】IMS管理表--耗材管理工具 end
                            ctm.OwnerId = hospitalMap.get(ctm.Hospital__c).ET_owner__c;
                    //DB202312611748 【IMS/TMS】IMS管理表--耗材管理工具 start
                        }
                    }
                    //DB202312611748 【IMS/TMS】IMS管理表--耗材管理工具 end
                }
            }
        }
    }
    private void HospitalToIMSUser(){
        //DB202312611748 【IMS/TMS】IMS管理表--耗材管理工具 start
        // if(trigger.isInsert){
        System.debug('test>>');
        if(trigger.isInsert||trigger.isUpdate){
        //DB202312611748 【IMS/TMS】IMS管理表--耗材管理工具 end
            List<Id> hospit = new List<Id>();
            List<Id> cbtmit = new List<Id>();
            for(ConsumableTargetManage__c ctm : newList){
                hospit.add(ctm.Hospital__c);
                cbtmit.add(ctm.Id);
            }
            //DB202312611748 【IMS/TMS】IMS管理表--耗材管理工具 start
            // List<Account> hospital = [select Id,ET_owner__c,ET_Product_Leader__c from Account where Id in:hospit];
            List<Account> hospital = [select Id,ET_owner__c,ET_Product_Leader__c,Energy_LeaderStr__c from Account where Id in:hospit];
            //DB202312611748 【IMS/TMS】IMS管理表--耗材管理工具 end
            Map<Id,Account> hospitalMap = new Map<Id,Account>();
            Map<String, String> product_leaders = new Map<String, String>();
            if(hospital.size()>0){
                for(Account account : hospital){
                    hospitalMap.put(account.Id,account);
                    if (String.isNotBlank(account.ET_Product_Leader__c)) {
                        String[] names = account.ET_Product_Leader__c.split(',');
                        for(String name : names) {
                            if (String.isNotBlank(name)) {
                                product_leaders.put(name, null);
                            }
                        }
                    }
                    //DB202312611748 【IMS/TMS】IMS管理表--耗材管理工具 start
                    if (String.isNotBlank(account.Energy_LeaderStr__c)) {
                        String[] names = account.Energy_LeaderStr__c.split(',');
                        for(String name : names) {
                            if (String.isNotBlank(name)) {
                                product_leaders.put(name, null);
                            }
                        }
                    }
                    //DB202312611748 【IMS/TMS】IMS管理表--耗材管理工具 end
                    System.debug('Energy_LeaderStr__c>>'+account.Energy_LeaderStr__c);
                    System.debug('ET_Product_Leader__c>>'+account.ET_Product_Leader__c);
                }
            }
            // 获得担当
            //DB202312611748 【IMS/TMS】IMS管理表--耗材管理工具 start
            Map<Id,User> product_leaderMap = new Map<Id,User>();
            //DB202312611748 【IMS/TMS】IMS管理表--耗材管理工具 end
            if (product_leaders.size() > 0) {
                List<User> lstUsers = [select Id, Alias from User where Alias in :product_leaders.keySet() and IsActive = true];
                for (User user : lstUsers) {
                    product_leaders.put(user.Alias, user.Id);
                    //DB202312611748 【IMS/TMS】IMS管理表--耗材管理工具 start
                    product_leaderMap.put(user.Id,user);
                    //DB202312611748 【IMS/TMS】IMS管理表--耗材管理工具 end
                }
            }
            System.debug('product_leaders>>'+product_leaders);
            // 权限类型
            List<String> rowCauseList = new List<String>();
            String rowCauseEdit = Schema.ConsumableTargetManage__Share.RowCause.HospitalToIMSUser__c;
            rowCauseList.add(rowCauseEdit);
            // 清理共享
            //DB202312611748 【IMS/TMS】IMS管理表--耗材管理工具 start
            // List<ConsumableTargetManage__Share> delShares = [select Id from ConsumableTargetManage__Share where ParentId in :cbtmit and RowCause in :rowCauseList];
            List<ConsumableTargetManage__Share> delShares = [select Id,UserOrGroup.Name,ParentId,Parent.productType__c from ConsumableTargetManage__Share where ParentId in :cbtmit and RowCause in :rowCauseList];
            Set<Id> notdelShares = new Set<Id>();
            //DB202312611748 【IMS/TMS】IMS管理表--耗材管理工具 end
            if (delShares != null && delShares.size() > 0) {
                System.debug('delShares>>'+delShares);
                //DB202312611748 【IMS/TMS】IMS管理表--耗材管理工具 start
                Set<Id> shareId= new Set<Id>();
                List<ConsumableTargetManage__Share> delShares2 = new List<ConsumableTargetManage__Share>();
                for (ConsumableTargetManage__Share sharevalue : delShares) {
                    if(sharevalue.Parent.productType__c == '外科耗材'){
                        String Energy_LeaderStr = hospitalMap.get(newMap.get(sharevalue.ParentId).Hospital__c).Energy_LeaderStr__c;
                        if(String.isBlank(Energy_LeaderStr) ||(String.isNotBlank(Energy_LeaderStr) && !(Energy_LeaderStr.contains(sharevalue.UserOrGroup.Name)))){
                            shareId.add(sharevalue.ParentId);
                        }
                    }else{
                        String ET_Product_Leader = hospitalMap.get(newMap.get(sharevalue.ParentId).Hospital__c).ET_Product_Leader__c;
                        if(String.isBlank(ET_Product_Leader) ||(String.isNotBlank(ET_Product_Leader) && !(ET_Product_Leader.contains(sharevalue.UserOrGroup.Name)))){
                            shareId.add(sharevalue.ParentId);
                        }
                    }
                    
                }
                for (ConsumableTargetManage__Share sharevalue2 : delShares) {
                    if(shareId.contains(sharevalue2.ParentId)){
                        delShares2.add(sharevalue2);
                    }else{
                        notdelShares.add(sharevalue2.ParentId);
                    }
                }
                System.debug('delShares2>>'+delShares2);
                if(delShares2 != null && delShares2.size() > 0){
                    delete delShares2;
                }
                // delete delShares;
                //DB202312611748 【IMS/TMS】IMS管理表--耗材管理工具 end
            }
            List<ConsumableTargetManage__Share> addShares = new List<ConsumableTargetManage__Share>();
            for(ConsumableTargetManage__c ctm : newList){
                //将ET主担当赋给所有人,并给担当添加共享
                //DB202312611748 【IMS/TMS】IMS管理表--耗材管理工具 start
                if(!notdelShares.contains(ctm.Id)){
                //DB202312611748 【IMS/TMS】IMS管理表--耗材管理工具 end
                    if(hospitalMap.containsKey(ctm.Hospital__c) && hospitalMap.get(ctm.Hospital__c) != null){
                        Account hospitalvalue = hospitalMap.get(ctm.Hospital__c);
                        System.debug('hospitalvalue>>'+hospitalvalue);
                        //DB202312611748 【IMS/TMS】IMS管理表--耗材管理工具 start
                        if(ctm.productType__c == '外科耗材'){
                            if (String.isNotBlank(hospitalvalue.Energy_LeaderStr__c)) {
                                String[] users = hospitalvalue.Energy_LeaderStr__c.split(',');
                                for (String user : users) {
                                    if (product_leaders.get(user) != null) {
                                        addShares.add(new ConsumableTargetManage__Share(ParentId = ctm.Id, RowCause = rowCauseEdit, UserOrGroupId = product_leaders.get(user), AccessLevel = 'Edit'));
                                    }
                                }
                            }
                        }else{
                        //DB202312611748 【IMS/TMS】IMS管理表--耗材管理工具 end
                            if (String.isNotBlank(hospitalvalue.ET_Product_Leader__c)) {
                                String[] users = hospitalvalue.ET_Product_Leader__c.split(',');
                                System.debug('users>>'+users);
                                for (String user : users) {
                                    if (product_leaders.get(user) != null) {
                                        addShares.add(new ConsumableTargetManage__Share(ParentId = ctm.Id, RowCause = rowCauseEdit, UserOrGroupId = product_leaders.get(user), AccessLevel = 'Edit'));
                                    }
                                }
                            }
                        //DB202312611748 【IMS/TMS】IMS管理表--耗材管理工具 start
                        }
                        System.debug('ctm>>'+ctm);
                        System.debug('addShares>>'+addShares);
                        //DB202312611748 【IMS/TMS】IMS管理表--耗材管理工具 end
                    }
                //DB202312611748 【IMS/TMS】IMS管理表--耗材管理工具 start
                }
                //DB202312611748 【IMS/TMS】IMS管理表--耗材管理工具 end
            }
            if (addShares.size() > 0) {
                insert addShares;
            }
        }
    }
    private void OCSMToTMSUser(){
        Set<String> IMSPros = new Set<String>();
                String rowCause = Schema.ConsumableTargetManage__Share.RowCause.OCSMToIMSUser__c;
                List<OCM_Management_Province__c> mpList = new List<OCM_Management_Province__c>();
                Map<String, OCM_Management_Province__c> mpMap = new Map<String, OCM_Management_Province__c>();
        
                List<ConsumableTargetManage__Share> imssharlist =new List<ConsumableTargetManage__Share>();
                List<Id> deletetemsharlist = new List<Id>();
        
                for (ConsumableTargetManage__c newims : newList) {
                    if (Trigger.isInsert || (Trigger.isUpdate && newims.productType__c != oldMap.get(newims.Id).productType__c)) {
                        IMSPros.add(newims.H_OCM_man_province_HP__c); 
                    }            
                }
                
                if(null !=IMSPros && IMSPros.size()>0){
                    mpList = [select id,Name,ET_DataWindow__c,ET_BusinessWindow__c,ET_Assistant1__c,ET_Assistant2__c,ENG_DataWindow__c,ENG_BusinessWindow__c,ENG_Assistant1__c,ENG_Assistant2__c from OCM_Management_Province__c where Name in: IMSPros];
                    for (OCM_Management_Province__c mp: mpList){
                        mpMap.put(mp.Name, mp);
                    }          
                }
                if(null!=mpMap){      
                    for (ConsumableTargetManage__c nObj : newList) {
                        if (mpMap.containsKey(nObj.H_OCM_man_province_HP__c)) {
                           if(null!=nObj.productType__c && ''!= nObj.productType__c && null!=mpMap.get(nObj.H_OCM_man_province_HP__c)){
                              if(nObj.productType__c=='ET耗材'){
                                if(null!=mpMap.get(nObj.H_OCM_man_province_HP__c).ET_DataWindow__c && !''.equals(mpMap.get(nObj.H_OCM_man_province_HP__c).ET_DataWindow__c) && nObj.Ownerid !=mpMap.get(nObj.H_OCM_man_province_HP__c).ET_DataWindow__c){
                                    ConsumableTargetManage__Share tmsshare = new ConsumableTargetManage__Share(
                                    ParentId = nObj.Id,
                                    RowCause = rowCause,
                                    UserOrGroupId = mpMap.get(nObj.H_OCM_man_province_HP__c).ET_DataWindow__c,
                                    AccessLevel = 'read');
                                    imssharlist.add(tmsshare);
                                }
                                if(null!=mpMap.get(nObj.H_OCM_man_province_HP__c).ET_BusinessWindow__c && !''.equals(mpMap.get(nObj.H_OCM_man_province_HP__c).ET_BusinessWindow__c) && nObj.Ownerid !=mpMap.get(nObj.H_OCM_man_province_HP__c).ET_BusinessWindow__c){
                                    ConsumableTargetManage__Share tmsshare = new ConsumableTargetManage__Share(
                                    ParentId = nObj.Id,
                                    RowCause = rowCause,
                                    UserOrGroupId = mpMap.get(nObj.H_OCM_man_province_HP__c).ET_BusinessWindow__c,
                                    AccessLevel = 'read');
                                    imssharlist.add(tmsshare);
                                } 
                                if(null!=mpMap.get(nObj.H_OCM_man_province_HP__c).ET_Assistant1__c && !''.equals(mpMap.get(nObj.H_OCM_man_province_HP__c).ET_Assistant1__c) && nObj.Ownerid !=mpMap.get(nObj.H_OCM_man_province_HP__c).ET_Assistant1__c){
                                    ConsumableTargetManage__Share tmsshare = new ConsumableTargetManage__Share(
                                    ParentId = nObj.Id,
                                    RowCause = rowCause,
                                    UserOrGroupId = mpMap.get(nObj.H_OCM_man_province_HP__c).ET_Assistant1__c,
                                    AccessLevel = 'read');
                                    imssharlist.add(tmsshare);
                                }
                                if(null!=mpMap.get(nObj.H_OCM_man_province_HP__c).ET_Assistant2__c && !''.equals(mpMap.get(nObj.H_OCM_man_province_HP__c).ET_Assistant2__c) && nObj.Ownerid !=mpMap.get(nObj.H_OCM_man_province_HP__c).ET_Assistant2__c){
                                    ConsumableTargetManage__Share tmsshare = new ConsumableTargetManage__Share(
                                    ParentId = nObj.Id,
                                    RowCause = rowCause,
                                    UserOrGroupId = mpMap.get(nObj.H_OCM_man_province_HP__c).ET_Assistant2__c,
                                    AccessLevel = 'read');
                                    imssharlist.add(tmsshare);
                                }
                              }else{//ENG 
                                if(null!=mpMap.get(nObj.H_OCM_man_province_HP__c).ENG_DataWindow__c && !''.equals(mpMap.get(nObj.H_OCM_man_province_HP__c).ENG_DataWindow__c) && nObj.Ownerid !=mpMap.get(nObj.H_OCM_man_province_HP__c).ENG_DataWindow__c){
                                    ConsumableTargetManage__Share tmsshare = new ConsumableTargetManage__Share(
                                    ParentId = nObj.Id,
                                    RowCause = rowCause,
                                    UserOrGroupId = mpMap.get(nObj.H_OCM_man_province_HP__c).ENG_DataWindow__c,
                                    AccessLevel = 'read');
                                    imssharlist.add(tmsshare);
                                }
                                if(null!=mpMap.get(nObj.H_OCM_man_province_HP__c).ENG_BusinessWindow__c && !''.equals(mpMap.get(nObj.H_OCM_man_province_HP__c).ENG_BusinessWindow__c) && nObj.Ownerid !=mpMap.get(nObj.H_OCM_man_province_HP__c).ENG_BusinessWindow__c){
                                    ConsumableTargetManage__Share tmsshare = new ConsumableTargetManage__Share(
                                    ParentId = nObj.Id,
                                    RowCause = rowCause,
                                    UserOrGroupId = mpMap.get(nObj.H_OCM_man_province_HP__c).ENG_BusinessWindow__c,
                                    AccessLevel = 'read');
                                    imssharlist.add(tmsshare);
                                }
                                if(null!=mpMap.get(nObj.H_OCM_man_province_HP__c).ENG_Assistant1__c && !''.equals(mpMap.get(nObj.H_OCM_man_province_HP__c).ENG_Assistant1__c) && nObj.Ownerid !=mpMap.get(nObj.H_OCM_man_province_HP__c).ENG_Assistant1__c){
                                    ConsumableTargetManage__Share tmsshare = new ConsumableTargetManage__Share(
                                    ParentId = nObj.Id,
                                    RowCause = rowCause,
                                    UserOrGroupId = mpMap.get(nObj.H_OCM_man_province_HP__c).ENG_Assistant1__c,
                                    AccessLevel = 'read');
                                    imssharlist.add(tmsshare);
                                }
                                if(null!=mpMap.get(nObj.H_OCM_man_province_HP__c).ENG_Assistant2__c && !''.equals(mpMap.get(nObj.H_OCM_man_province_HP__c).ENG_Assistant2__c) && nObj.Ownerid !=mpMap.get(nObj.H_OCM_man_province_HP__c).ENG_Assistant2__c){
                                    ConsumableTargetManage__Share tmsshare = new ConsumableTargetManage__Share(
                                    ParentId = nObj.Id,
                                    RowCause = rowCause,
                                    UserOrGroupId = mpMap.get(nObj.H_OCM_man_province_HP__c).ENG_Assistant2__c,
                                    AccessLevel = 'read');
                                    imssharlist.add(tmsshare);
                                }
                                
                              }
                              deletetemsharlist.add(nObj.Id);
                           }
                         
                       }
                    }    
                    
                }
                  // 先 Delete 后 Insert
                if (deletetemsharlist.size() > 0) {
                    List<ConsumableTargetManage__Share> deleteList = [SELECT Id
                        FROM ConsumableTargetManage__Share
                        WHERE RowCause = :rowCause
                          AND ParentId IN :deletetemsharlist
                    ];
                    delete deleteList;
                }
                if(null!=imssharlist){
                    insert imssharlist;
                }
        }        
}