沙世明
2023-03-22 e4185f503d973b28f95725908e3fad155cfbf088
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
/**
     * [SetFrameNumManageBatch 进口单证上传后查找字段batch更新]
     * @Author   lijinhuan
     * @DateTime 2022-11-04T18:31:03+0800
     * 测试类:FrameNumUploadControllerTest
*/
global  without sharing  class SetFrameNumManageBatch implements Database.Batchable<sObject>, Database.Stateful{
    public String query;
    public String Id;
 
    //邮件信息
    List<String> emailMessages = new List<String>();
 
    //报错的进口单证Id
    String logStr = '进口单证 : ';
    //报错信息
    String errorStr = '';
    //总件数
    Integer totalCount = 0;
    // 失败件数
    Integer failedCount = 0;
 
    global SetFrameNumManageBatch() {
        this.query = query;
    }
 
    global SetFrameNumManageBatch(String Id) {
        this.query = query;
        this.Id = Id;
    }
 
    global Database.QueryLocator start(Database.BatchableContext bc) {
        query = 'select Id,ManagementCode__c,InspectionCard__c,InspectionCard_Select__c,ApplyList__c,ApplyList_Select__c,';
        // query += 'Statu_Achievements_DN_details__c,signInForm__c,Asset__c,ManagementCode__c,IsChange__c ';
        query += 'Asset__c,ScanDate__c,ScanDate_select__c,IsChange__c, DeliveryDate__c, DeliveryDate_select__c ';
        // query += 'IsChange__c ';
        query += ' from FrameNumManage__c where ';
        if(String.isNotBlank(Id)){
            query += ' id = :Id';
        }else{
            // query += ' signInForm__c = null  ';
            // query += ' OR Statu_Achievements_DN_details__c = null ';
             
            // query += '((signInForm__c = null OR Statu_Achievements_DN_details__c = null) AND AssertRecordType__c != \'Shipment\') ';
            // query += ' OR Asset__c = null ';
            // 
            query += ' Asset__c = null ';
            query += ' OR (InspectionCard_Select__c = null AND InspectionCard__c != null AND InspectionCard__c !=\'不要\')';
            // query += ' (InspectionCard_Select__c = null AND InspectionCard__c != null AND InspectionCard__c != \'\' AND InspectionCard__c !=\'不要\')';
            query += ' OR (InspectionCard_Select__c != null AND (InspectionCard__c =\'不要\' OR InspectionCard__c = null OR InspectionCard__c = \'\'))';// 清空
            query += ' OR (ApplyList_Select__c = null AND ApplyList__c != null AND ApplyList__c != \'\')';
            query += ' OR (ApplyList_Select__c != null AND (ApplyList__c = null OR ApplyList__c =\'\'))';// 清空
            query += ' OR (ScanDate__c !=  null AND ScanDate_select__c = null)';
            query += ' OR IsChange__c = true';
        }
        return Database.getQueryLocator(query);
    }
 
    global void execute(Database.BatchableContext BC, list<FrameNumManage__c> fnmList) {
        Map<String,String> InspectionCardMap = new Map<String,String>();
        Map<String,String> ApplyListMap = new Map<String,String>();
        Map<String,Id> InspectionCardIdMap = new Map<String,Id>();
        Map<String,Id> ApplyListIdMap = new Map<String,Id>();
        Set<String> TracingCodeSet = new Set<String>();
        Set<String> TracingCodeAssetSet = new Set<String>();
        Map<Id,String> clearMap = new Map<Id,String>();
        Set<Date> ScanDateSet = new Set<Date>();
        Map<Id,FrameNumManage__c> oldMap = new Map<Id,FrameNumManage__c>();
        try{
        for(FrameNumManage__c fnm:fnmList){
            // 清空
            // 0 all 1:ApplyList_Select__c 2:InspectionCard_Select__c 
            if(
                ((String.isBlank(fnm.ApplyList__c) ||(!String.isBlank(fnm.ApplyList__c) && fnm.ApplyList__c == '不要')) &&!String.isBlank(fnm.ApplyList_Select__c))
                && ((String.isBlank(fnm.InspectionCard__c) ||(!String.isBlank(fnm.InspectionCard__c) && fnm.InspectionCard__c == '不要')) &&!String.isBlank(fnm.InspectionCard_Select__c))
            ){
                clearMap.put(fnm.Id,'0');
            }else if((String.isBlank(fnm.ApplyList__c) ||(!String.isBlank(fnm.ApplyList__c) && fnm.ApplyList__c == '不要')) &&!String.isBlank(fnm.ApplyList_Select__c)){
                clearMap.put(fnm.Id,'1');
            }else if((String.isBlank(fnm.InspectionCard__c) ||(!String.isBlank(fnm.InspectionCard__c) && fnm.InspectionCard__c == '不要')) &&!String.isBlank(fnm.InspectionCard_Select__c)){
                clearMap.put(fnm.Id,'2');
            }                
            //赋值
            // if(String.isBlank(fnm.signInForm__c) || String.isBlank(fnm.Statu_Achievements_DN_details__c)){
            //     TracingCodeSet.add(fnm.ManagementCode__c); //签收单 发货DN明细用
            // }
            // System.debug('zheli03:'+String.isBlank(fnm.Asset__c));
            if(String.isBlank(fnm.Asset__c)){
                TracingCodeAssetSet.add(fnm.ManagementCode__c);// 保有设备用
            }
            
            // System.debug('zheli02:'+TracingCodeAssetSet);
            InspectionCardMap.put(fnm.ManagementCode__c,fnm.InspectionCard__c);
            ApplyListMap.put(fnm.ManagementCode__c,fnm.ApplyList__c);
            if(fnm.ScanDate__c != null){
                ScanDateSet.add(fnm.ScanDate__c);
            }
            oldMap.put(fnm.Id,fnm);
        }
        // 发货DN明细
        // Map<String,Id> DNdetailMap = new Map<String,Id>();
        // Map<String,String> DNMap  = new Map<String,String>();
        // Map<String,Id> AssetMap = new Map<String,Id>();
        // for(Statu_Achievements_DN_details__c dn:[SELECT Id,TracingCode_Raw__c,Statu_Achievements_DN__c,Statu_Achievements_DN__r.Name,asset__c FROM Statu_Achievements_DN_details__c WHERE TracingCode_Raw__c IN: TracingCodeSet]){
        //     DNdetailMap.put(dn.TracingCode_Raw__c,dn.Id);
        //     AssetMap.put(dn.TracingCode_Raw__c,dn.asset__c);
        //     DNMap.put(dn.TracingCode_Raw__c,dn.Statu_Achievements_DN__r.Name);
        // }
        // // 签收单
        // Map<String,Id> eSignFormMap = new Map<String,Id>();
        // for(eSignForm__c es:[SELECT Id,DNName__c FROM eSignForm__c WHERE DNName__c IN: DNMap.values()]){
        //     for(String key:DNMap.keySet()){
        //         if(DNMap.get(key) == es.DNName__c){
        //             eSignFormMap.put(key,es.Id);
        //         }
        //     } 
        // }
        // System.debug('zheli01:'+TracingCodeAssetSet);
        // 保有设备
        Map<String,Id> AssetMap = new Map<String,Id>();
        Map<String, Asset> AssetDatas = new Map<String, Asset>();
        // 进口单证 增加发货日设置 start
        for(Asset ass:[SELECT Id,TracingCode__c,Posting_Date__c FROM Asset WHERE TracingCode__c IN: TracingCodeAssetSet]){
            if(!AssetMap.containsKey(ass.TracingCode__c)){
                AssetMap.put(ass.TracingCode__c,ass.Id);
                AssetDatas.put(ass.TracingCode__c,ass);
            }
            if (ass.Posting_Date__c != null) {
                ScanDateSet.add(ass.Posting_Date__c);
            }
            // AssetMap.put(ass.TracingCode__c,ass.Id);
        }
        // 进口单证 增加发货日设置 end
        // System.debug('zheli00:'+AssetMap);
        // 商检证   InspectionCard_Select__c 报关单   ApplyList_Select__c
        Set<String> FilesNameSet = new Set<String>();
        FilesNameSet.addAll(InspectionCardMap.values());
        FilesNameSet.addAll(ApplyListMap.values());
        for(FileAddress__c fa:[SELECT Id,OnlyFileName__c FROM FileAddress__c WHERE ParentRecordId__c = 'FrameNumManage' AND OnlyFileName__c IN: FilesNameSet]){
            for(String key:InspectionCardMap.keySet()){
                if(InspectionCardMap.get(key) == fa.OnlyFileName__c){
                    InspectionCardIdMap.put(key,fa.Id);
                }
                if(ApplyListMap.get(key) == fa.OnlyFileName__c){
                    ApplyListIdMap.put(key,fa.Id);
                }
            }
        }
        // 扫描日期
        Map<Date,Id> ScanDateMap = new Map<Date,Id>();
        for(OlympusCalendar__c oc:[SELECT Id,Date__c FROM OlympusCalendar__c WHERE Date__c IN: ScanDateSet]){
            ScanDateMap.put(oc.Date__c,oc.Id);
        }
        // 最后整合
        List<FrameNumManage__c> upFnmList = new List<FrameNumManage__c>();
        for(FrameNumManage__c fnm:fnmList){
            FrameNumManage__c temp = new FrameNumManage__c();
            temp.Id = fnm.Id;
            // if(DNdetailMap.size() > 0 && DNdetailMap.containsKey(fnm.ManagementCode__c)){
            //     temp.Statu_Achievements_DN_details__c = DNdetailMap.get(fnm.ManagementCode__c);
            // }
            // if(eSignFormMap.size() > 0 && eSignFormMap.containsKey(fnm.ManagementCode__c)){
            //     temp.signInForm__c  = eSignFormMap.get(fnm.ManagementCode__c);
            // }
            if(AssetMap.size() > 0 && AssetMap.containsKey(fnm.ManagementCode__c)){
                temp.Asset__c = AssetMap.get(fnm.ManagementCode__c);
                // 进口单证 增加发货日设置 start
                if(String.isNotBlank(temp.Asset__c) && AssetDatas.get(fnm.ManagementCode__c) != null && AssetDatas.get(fnm.ManagementCode__c).Posting_Date__c != null){
                    temp.DeliveryDate__c = AssetDatas.get(fnm.ManagementCode__c).Posting_Date__c;
                    temp.DeliveryDate_select__c = ScanDateMap.get(AssetDatas.get(fnm.ManagementCode__c).Posting_Date__c);
                }
                // 进口单证 增加发货日设置 end
            }
            if(ScanDateMap.size() > 0 && ScanDateMap.containsKey(fnm.ScanDate__c)){
                temp.ScanDate_Select__c = ScanDateMap.get(fnm.ScanDate__c);
            }
            if(clearMap.containsKey(fnm.Id)){
                if(clearMap.get(fnm.Id) == '0'){
                    temp.ApplyList_Select__c = null;
                    temp.InspectionCard_Select__c = null;
                }else if(clearMap.get(fnm.Id) == '1'){
                    temp.ApplyList_Select__c = null;
                }else if(clearMap.get(fnm.Id) == '2'){
                    temp.InspectionCard_Select__c = null;
                }
            }else{
                temp.InspectionCard_Select__c = InspectionCardIdMap.get(fnm.ManagementCode__c);
                temp.ApplyList_Select__c = ApplyListIdMap.get(fnm.ManagementCode__c);
            }
            temp.IsChange__c = false;
            // 有变化才更新
            // if(!(temp.Statu_Achievements_DN_details__c == oldMap.get(temp.Id).Statu_Achievements_DN_details__c 
            // && temp.signInForm__c == oldMap.get(temp.Id).signInForm__c 
            // && temp.Asset__c == oldMap.get(temp.Id).Asset__c
            // && temp.ApplyList_Select__c == oldMap.get(temp.Id).ApplyList_Select__c
            // && temp.InspectionCard_Select__c == oldMap.get(temp.Id).InspectionCard_Select__c
            // && temp.IsChange__c == oldMap.get(temp.Id).IsChange__c
            // )){
            // if(!(temp.ApplyList_Select__c == oldMap.get(temp.Id).ApplyList_Select__c
            // && temp.InspectionCard_Select__c == oldMap.get(temp.Id).InspectionCard_Select__c
            // && temp.IsChange__c == oldMap.get(temp.Id).IsChange__c
            // )){
            if(!(temp.ApplyList_Select__c == oldMap.get(temp.Id).ApplyList_Select__c
            && temp.InspectionCard_Select__c == oldMap.get(temp.Id).InspectionCard_Select__c
            && temp.IsChange__c == oldMap.get(temp.Id).IsChange__c
            && temp.Asset__c == oldMap.get(temp.Id).Asset__c
            && temp.ScanDate_Select__c == oldMap.get(temp.Id).ScanDate_Select__c
            )){
                // System.debug('zheli99');
                upFnmList.add(temp);
            }            
        }
        // System.debug('zhelieupFnmList:'+upFnmList.size());
        if(upFnmList.size() > 0){
            // update upFnmList;
            List<Database.SaveResult> saveResults = Database.update(upFnmList,false);
            //总数
            totalCount += saveResults.size();
            for(Integer i = 0;i<saveResults.size();i++) {
                if(!saveResults.get(i).isSuccess() ){
                    logStr += upFnmList.get(i).id +' ,';
                    errorStr += '失败进口单证 :'+upFnmList.get(i).id+'  失败原因:'+ String.ValueOf(saveResults.get(i).getErrors()[0]).split(';')[2].split('=')[1] 
                    +' : '+String.ValueOf(saveResults.get(i).getErrors()[0]).split(';')[1].split('=')[1] + '\r\n';
                    failedCount++ ;
                }
            }
        }
        
        }catch(Exception ex){
            errorStr += 'Batch执行过程中出现错误: ' + ex.getStackTraceString();
        }
        
    }
 
    global void finish(Database.BatchableContext BC) {
        BatchIF_Log__c IfLog = new BatchIF_Log__c();
        IfLog.Type__c = 'SetFrameNumManageBatchErrorLog';
 
        if (logStr.length() > 60000) {
            logStr = logStr.substring(0, 60000);
        }
        IfLog.Log__c = logStr;
        IfLog.Log__c += '\n end';
        if (errorStr.length() > 60000) {
            IfLog.ErrorLog__c = errorStr.substring(0, 60000);
        } else {
            IfLog.ErrorLog__c = errorStr.substring(0, errorStr.length());
        }
 
        insert IfLog;
 
        emailMessages.add('失败日志ID为:' + IfLog.Id + '\r\n失败信息:\r\n'+errorStr);
 
        //发送邮件
        sendFieldEmail();
    }
    // 发送提醒邮件
    private void sendFieldEmail() {
        PretechBatchEmailUtil be = new PretechBatchEmailUtil();
        String[] toList = new String[] {UserInfo.getUserEmail()};
        String title = '进口单证数据关联更新失败';
        String[] ccList = new String[]{};
        String ccEmail = System.Label.EmailAlert;
        if(ccEmail.length() > 0){
            for(String email : ccEmail.split(',')){
                ccList.add(email);
            }
        }
        if (System.Test.isRunningTest()) {
            be.successMail('', 1);
        }
        if (emailMessages.size() > 0 && failedCount > 0) {
            be.failedMail(toList, ccList, title, this.emailMessages.get(0)+'\n',
                            totalCount, totalCount - failedCount, failedCount,'',false);
            if(!Test.isRunningTest()){
                be.send();
            }
        }      
    }
}