高章伟
2022-02-18 8b5f4c6c281cfa548f92de52c8021e37aa81901e
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
global class EquipmentDraftOnceYearBatch  implements Database.Batchable<sObject>, Database.Stateful {
/**
20211015 you 创建
历史数据:草案中的备品申请超过一定时间给自动取消;
         每年的4月1日执行;
         比如2022-04-01 执行的是2021-04-01之前的数据
一年一次
**/
    private static final Integer MAXERRORCNT = 20; // 邮件表单位最大错误信息显示数量
    private static final Boolean ALLORNONE = false; // 全部保存
    private ErrorBean eb = new ErrorBean(); // 邮件发送ERRORBEAN
    id Rentalid;
    //获取当前时间
    Date dateToday = Date.today();
    //获取当前年
    Integer year = dateToday.year();
    Integer month = dateToday.month();
    String todayStr = String.valueOf(dateToday);
    String toyear = year +'-04-01';
    Boolean flago = todayStr==toyear ? true:false;//判断今天是否是4.1,如果是则执行此batch
 
    global EquipmentDraftOnceYearBatch(id Rentalid) {
        this.Rentalid = Rentalid;
    }
    global EquipmentDraftOnceYearBatch() {
        
    }
    global Database.QueryLocator start(Database.BatchableContext BC) {
        String query;
        if (month < 4) {
            year -= 2;
        }else{
            year -= 1;
        }  
        Date startDate = date.newInstance(year, 4, 1);
        query = 'select id,name from Rental_Apply__c where Status__c = \'草案中\'';
        if(!Test.isRunningTest()){
            query = query + ' and CreatedDate < :startDate'; 
        }
        if(Rentalid!=null){
            query = query + ' and id = \'' + Rentalid +'\'';
        }
            query = query + ' order by CreatedDate desc';
 
        //system.debug('==today=='+today+'==='+todayStr+'=='+flago);
        return Database.getQueryLocator(query);
    }
    global void execute(Database.BatchableContext BC, List<Rental_Apply__c> RaList) {
        for (Integer i = 0; i < RaList.size(); i ++) {
            Rental_Apply__c ra = RaList[i];
            ra.Cancel_Reason__c = '主动取消';
            ra.Loaner_cancel_reason__c  ='';
            ra.Loaner_cancel_request__c ='草案中备品申请取消';
            ra.Status__c = '取消';
        }
        if (!RaList.isEmpty()) {
            // update RaList;
            // 备品申请更新Error
            Database.SaveResult[] saveRes = Database.update(RaList, ALLORNONE);
            eb.setError(saveRes, MAXERRORCNT, Rental_Apply__c.sObjectType);
        }
 
    }
    global void finish(Database.BatchableContext BC) {
        Boolean haveError = false;
        String body = '';
        for (Id objId : eb.messageMap.keySet()) {
            haveError = true;
            body += eb.messageMap.get(objId) + '<br/>';
        }
        if (eb.overMax) {
            body += ':Over ' + MAXERRORCNT + 'Record<br/>';
        }
        if (haveError == true) {
            String batchUserId = System.Label.Batch_User_Id; //batch用户
            List<User> us = [Select Id,NAme,Email From User Where Id =: batchUserId];
            if (!us.isEmpty()) {
                User use = us[0];
                if (String.isNotBlank(use.Email)) {
                    List<String> MailCc;
                    if (System.Label.Batch_Error_Send_To_CC != 'null') {//精琢用户
                        MailCc = System.Label.Batch_Error_Send_To_CC.split(',');
                    }
                    FixtureUtil.sendMessage(batchUserId,
                                            MailCc,
                                            'EquipmentDraftOnceYearBatch Error',
                                             body
                                            );
                }
            }
        }
    }
    /************************* Inner Class ******************************/
    public class ErrorBean{
        public Map<Id, String> messageMap;
        public Boolean overMax;
        public ErrorBean() {
          messageMap = new Map<Id, String>();
          overMax = false;
        }
        public void setError (Database.SaveResult[] saveRes, Integer maxCut, Schema.sObjectType obj) {
            if (messageMap.keySet().size() <= maxCut && overMax == false) {
                String objectName = obj.getDescribe().getName();
                String objectLabel = obj.getDescribe().getLabel();
                for (Database.SaveResult saveRe : saveRes) {
                    if (!saveRe.isSuccess()) {
                        if (!messageMap.containsKey(saveRe.getId())) {
                            if (messageMap.keySet().size() >= maxCut) {
                                overMax = true;
                                break;
                            }
                            for (Database.Error err : saveRe.getErrors()) {
 
                                String message = objectName + ':'
                                               + objectLabel + ':'
                                               + err.getStatusCode() + ':'
                                               + err.getFields() + ':'
                                               + err.getMessage();
                                messageMap.put(saveRe.getId(), message);
                                // 数据里面有复数错误信息的话只获取第一条
                                break;
                            }
                        }
                    }
                }
            }
        }
    }  
    @TestVisible private static void test() {
        Integer i = 0;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
    } 
}