高章伟
2022-02-24 2aa8da8af66aa8ae00f25831aed6bb0364176e7b
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
319
320
321
322
323
324
325
326
327
328
329
330
public with sharing class SSPowerBIBatch implements Database.Batchable<SObject> {
    public static Integer FIELDMAX = 200;
    private final List<Id> TEST_ID = null;
    private final Date createDate = null;
    private BatchIF_Log__c iflog;
 
 
    private static final Integer MAXERRORCNT = 20; // 邮件表单位最大错误信息显示数量
    private static final Boolean ALLORNONE = false; // 全部保存
    //--------------------------------------------------------------------------------------------------------------------------
    public SSPowerBIBatch() {
        iflog = new BatchIF_Log__c();
        iflog.Type__c = 'PushNotification';
        iflog.Log__c  = '备品备份:SSPowerBIBatch start\n';
        insert iflog;
 
    }
    public SSPowerBIBatch( Date createDate) {
        this.createDate = createDate;
        iflog = new BatchIF_Log__c();
        iflog.Type__c = 'PushNotification';
        iflog.Log__c  = '备品备份:SSPowerBIBatch start\n';
        insert iflog;
 
    }
    public SSPowerBIBatch(List<Id> testId) {
        TEST_ID = testId;
        iflog = new BatchIF_Log__c();
        iflog.Type__c = 'PushNotification';
        iflog.Log__c  = '备品备份:SSPowerBIBatch start\n';
        insert iflog;
    }
 
    public SSPowerBIBatch(List<Id> testId , Date createDate) {
        TEST_ID = testId;
        this.createDate = createDate;
        iflog = new BatchIF_Log__c();
        iflog.Type__c = 'PushNotification';
        iflog.Log__c  = '备品备份:SSPowerBIBatch start\n';
        insert iflog;
    }
    //---------------------------------------------------------------------------------------------------------------------------
    public static String makeSql(SS_Batch_Column_Mapping__c setting, Set<String> apiTempSet) {
        //apiTempSet.add('Id');
        for (Integer i = 1; i <= FIELDMAX; i++) {
            String fromColumn = 'From_Column_' + ('00' + i).right(3) + '__c';
            String apiStr = String.valueOf(setting.get(fromColumn));
            if (String.isBlank(apiStr) == false && apiTempSet.contains(apiStr) == false) {
                apiTempSet.add(apiStr);
            }
        }
        String soql = 'Select ' + String.join(new List<String>(apiTempSet), ',') + ' from ' + setting.Name;
        return soql;
    }
    //--------------------------------------------------------------------------------------------------------------------------
    public static Object getValue(SObject sobj, String field) {
        List<String> fieldPathList = field.split('\\.');
        Object rtn = null;
        for (Integer i = 0; i < fieldPathList.size(); i++) {
            String fieldPath = fieldPathList[i];
            if (i == fieldPathList.size() - 1) {
                rtn = sobj.get(fieldPath);
                if (rtn != null && String.valueOf(rtn).indexof('a href') >= 0 ) {
                    rtn = string.valueOf(rtn).replaceAll('<.*?>', '');
                }
            } else {
                sobj = sobj.getSObject(fieldPath);
                if (sobj == null) {
                    break;
                }
            }
        }
        return rtn;
    }
    //----------------------------------------------------------------------------------------------------------------------------
    public Database.QueryLocator start(Database.BatchableContext BC) {
        System.debug('-------------SSPower_BI_Batch start:');
        SS_Batch_Column_Mapping__c oppMapping = SS_Batch_Column_Mapping__c.getValues('Rental_Apply__c');
        Set<String> apiTempSet = new Set<String>();
        for (Integer i = 1; i <= FIELDMAX; i++) {
            String lpadI = ('00' + i).right(3);
            String fromColumn = 'From_Column_' + lpadI + '__c';
            String apiStr = String.valueOf(oppMapping.get(fromColumn));
            if (String.isBlank(apiStr) == false) {
                String ssColumn = 'SS_Column_' + lpadI + '__c';
                String ssApiStr = String.valueOf(oppMapping.get(ssColumn));
                //apiTempSet.add(ssApiStr);
            }
        }
        String soql = makeSql(oppMapping, apiTempSet);
 
        if (TEST_ID <> null) {
            soql += ' where Id IN: TEST_ID';
        }else{
            // 2020/07/08 taoqz add start
            // 取消理由:主动取消剔除
            soql += ' where Cancel_Reason__c != \'主动取消\'';
        }
            // 2020/07/08 taoqz add end
 
        return Database.getQueryLocator(soql);
    }
    //--------------------------------------------------------------------------------------------------------------------------
    public void execute(Database.BatchableContext BC, List<Rental_Apply__c> oppList) {
        try {
            Date today = Date.today();
            if (today.day() == 1) {
                today = Date.newInstance(today.year(), today.month(), 1).addDays(-1);
            } else {
                today = Date.newInstance(today.addDays(1).year(),
                                         today.addDays(1).month(), 1).addDays(-1);
            }
            list<BatchIF_Log__c> ifloglist = [select id , ErrorLog__c from BatchIF_Log__c where id = :  iflog.id];
            if (ifloglist.size() > 0 ) {
                iflog = ifloglist[0];
            }
            List<SObject> insRACList = new List<SObject>();
            List<Id> insSSOppId = new List<Id>();
            // 商談
            SS_Batch_Column_Mapping__c oppMapping = SS_Batch_Column_Mapping__c.getValues('Rental_Apply__c');
            Schema.SObjectType ssOppType = Schema.getGlobalDescribe().get(String.valueOf(oppMapping.get('SS_TableName__c')));
            for (Rental_Apply__c opp : oppList) {
                Boolean updSelfFlg = false;
                SObject racObj = ssOppType.newSObject();
                for (Integer i = 1; i <= FIELDMAX; i++) {
                    String lpadI = ('00' + i).right(3);
                    String fromColumn = 'From_Column_' + lpadI + '__c';//From_Column_001__c
                    String apiStr = String.valueOf(oppMapping.get(fromColumn));
                    if (String.isBlank(apiStr) == false) {
                        String ssColumn = 'SS_Column_' + lpadI + '__c';
                        String ssApiStr = String.valueOf(oppMapping.get(ssColumn));
                        racObj.put(ssApiStr, getValue(opp, apiStr));
                    }
                }
                racObj.put('createDate__c', today);
                if (createDate != null) {
                    racObj.put('createDate__c', createDate);
                }
                insRACList.add(racObj);
                insSSOppId.add(opp.Id);
            }
            //--------------------------------------------------------------------------------------------------------------------
            List<SObject> raescList = new List<SObject>();
            List<Id> raescId = new List<Id>();
            SS_Batch_Column_Mapping__c oliMapping = SS_Batch_Column_Mapping__c.getValues('Rental_Apply_Equipment_Set__c');
            Set<String> apiTempSet = new Set<String>();
            String oliSql = makeSql(oliMapping, apiTempSet);
            oliSql += ' where Rental_Apply__c IN :insSSOppId';
 
            // 2020/07/08 taoqz add start
            // 取消理由:主动取消剔除
            if (TEST_ID == null) {
                oliSql += ' and Cancel_Reason__c != \'主动取消\'';
            }
            // 2020/07/08 taoqz add end
 
            Schema.SObjectType ssOliType = Schema.getGlobalDescribe().get(String.valueOf(oliMapping.get('SS_TableName__c')));
            for (Rental_Apply_Equipment_Set__c oli : Database.query(oliSql)) {
                SObject rscObj = ssOliType.newSObject();
 
                for (Integer i = 1; i <= FIELDMAX; i++) {
                    String lpadI = ('00' + i).right(3);
                    String fromColumn = 'From_Column_' + lpadI + '__c';
                    String apiStr = String.valueOf(oliMapping.get(fromColumn));
                    if (String.isBlank(apiStr) == false) {
                        String ssColumn = 'SS_Column_' + lpadI + '__c';
                        String ssApiStr = String.valueOf(oliMapping.get(ssColumn));
                        rscObj.put(ssApiStr, getValue(oli, apiStr));
                    }
                }
                rscObj.put('createDate__c', today);
                if (createDate != null) {
                    rscObj.put('createDate__c', createDate);
                }
                raescList.add(rscObj);
                raescId.add(oli.Id);
            }
            //---------------------------------------------------------------------------------------------------------------------
            List<SObject> raesdcList = new List<SObject>();
            List<Id> raesdcId = new List<Id>();
            SS_Batch_Column_Mapping__c rentalMapping = SS_Batch_Column_Mapping__c.getValues('Rental_Apply_Equipment_Set_Detail__c');
            Set<String> rentalTempSet = new Set<String>();
            String rentalSql = makeSql(rentalMapping, rentalTempSet);
            rentalSql += ' where Rental_Apply_Equipment_Set__c IN :raescId';
 
            // 2020/07/08 taoqz add start
            // 取消理由:重新分配,分配替代品,主动取消剔除
            // 备品用途附属品F=false  AND 是第一条备品配套明细=true
            // 回库确认完毕日:在2019年4月1日以前的剔除
            if (TEST_ID == null){
                Date arrivalwhday = Date.newInstance(2019, 4, 1);
                rentalSql += ' and Cancel_Reason__c != \'重新分配\' and Cancel_Reason__c != \'分配代替品\' and Cancel_Reason__c != \'主动取消\'';
                rentalSql += ' and Loaner_accsessary_F__c = false and Is_First_RAESD_F__c = true';
                rentalSql += ' and     ( Arrival_wh_day__c >= :arrivalwhday or Arrival_wh_day__c = null) ';
            }
            // 2020/07/08 taoqz add end
 
            Schema.SObjectType rentalType = Schema.getGlobalDescribe().get(String.valueOf(rentalMapping.get('SS_TableName__c')));
            for (Rental_Apply_Equipment_Set_Detail__c oli : Database.query(rentalSql)) {
                SObject reaObj = rentalType.newSObject();
                //raesdcList.add(reaObj);
                for (Integer i = 1; i <= FIELDMAX; i++) {
                    String lpadI = ('00' + i).right(3);
                    String fromColumn = 'From_Column_' + lpadI + '__c';
                    String apiStr = String.valueOf(rentalMapping.get(fromColumn));
                    if (String.isBlank(apiStr) == false) {
                        String ssColumn = 'SS_Column_' + lpadI + '__c';
                        String ssApiStr = String.valueOf(rentalMapping.get(ssColumn));
                        reaObj.put(ssApiStr, getValue(oli, apiStr));
                    }
                }
                reaObj.put('createDate__c', today);
                if (createDate != null) {
                    reaObj.put('createDate__c', createDate);
                }
                raesdcList.add(reaObj);
                raesdcId.add(oli.Id);
            }
 
            String tmp = iflog.ErrorLog__c;
            if (iflog.ErrorLog__c == null) {
                tmp = '';
            }
 
            list<id> ErrorIDlist = new list<id>();
 
            //insert insRACList;
            Database.SaveResult[] lsr2 = Database.insert(insRACList, false);
            for (SObject temRental_Apply : insRACList) {
                if (temRental_Apply.get('id') == null) {
                    ErrorIDlist.add( (ID) temRental_Apply.get('Id__c'));
                }
            }
 
            for (Integer tIdx = 0; tIdx < lsr2.size(); tIdx++) {
                Database.SaveResult sr = lsr2[tIdx];
                if (!sr.isSuccess()) {
                    String message = '';
                    for (Database.Error err : sr.getErrors()) {
                        message = '\n\n 错误数据类型:Rental_Apply__c'
 
                                  + '\n 错误信息:'
                                  + err.getStatusCode() + ':'
                                  + err.getMessage();
                        break;
                    }
                    tmp += message;
                }
            }
 
            //insert raescList;
            Database.SaveResult[] lsr3 = Database.insert(raescList, false);
            for (SObject temRaes : raescList) {
                if (temRaes.get('id') == null) {
                    ErrorIDlist.add( (ID) temRaes.get('Id__c'));
                }
            }
 
            for (Integer tIdx = 0; tIdx < lsr3.size(); tIdx++) {
                Database.SaveResult sr = lsr3[tIdx];
                if (!sr.isSuccess()) {
                    String message = '';
                    for (Database.Error err : sr.getErrors()) {
                        message = '\n\n 错误数据类型:Rental_Apply_Equipment_Set_Detail__c'
                                  + '\n 错误信息:'
                                  + err.getStatusCode() + ':'
                                  + err.getMessage();
                        break;
                    }
                    tmp += message;
                }
            }
 
            //insert raesdcList;
            Database.SaveResult[] lsr4 = Database.insert(raesdcList, false);
            for (SObject temraesdc : raesdcList) {
                if (temraesdc.get('id') == null) {
                    ErrorIDlist.add( (ID) temraesdc.get('Id__c'));
                }
            }
            for (Integer tIdx = 0; tIdx < lsr4.size(); tIdx++) {
                Database.SaveResult sr = lsr4[tIdx];
                if (!sr.isSuccess()) {
                    String message = '';
                    for (Database.Error err : sr.getErrors()) {
                        message = '\n\n错误数据类型:Rental_Apply_Equipment_Set__c'
                                  + '\n 错误信息:'
                                  + err.getStatusCode() + ':'
                                  + err.getMessage();
                        break;
                    }
                    tmp += message;
                }
            }
            if (ErrorIDlist.size() > 0 ) {
                tmp += '\n 更新失败原数据ID:' + ErrorIDlist;
            }
            if (tmp != null && tmp.length() > 65000) {
                tmp = tmp.substring(0, 65000);
                tmp += ' ...have more lines...';
            }
            iflog.ErrorLog__c = tmp;
 
 
        } catch (Exception ex) {
            iflog.ErrorLog__c += ex;
 
        }
        update iflog;
 
    }
 
    //--------------------------------------------------------------------------------------------------------------------------
    public void finish(Database.BatchableContext BC) {
        list<BatchIF_Log__c> ifloglist = [select id , ErrorLog__c, Log__c from BatchIF_Log__c where id = :  iflog.id];
        if (ifloglist.size() > 0 ) {
            iflog = ifloglist[0];
        }
        iflog.Log__c += '\n SSPowerBIBatch end';
        String tmp = iflog.ErrorLog__c;
        if (tmp != null && tmp.length() > 65000) {
            tmp = tmp.substring(0, 65000);
            tmp += ' ...have more lines...';
            iflog.ErrorLog__c = tmp;
        }
        upsert iflog;
    }
 
 
}