buli
2023-05-23 07390e2fcb4adf27c928335bf27ae7939c5a80ad
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
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;
        
    } 
}