涂煌豪
2022-03-21 9de418edd671c958f5375b2f035a5980bc385aa2
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
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
/**
 * 调用地址
 * UpdateContractAimAmountHandler.SetAwaitToSendAWS
 */
public without sharing class NFM601Controller {
    public static String logstr = '';
    public static String status;
    private static final String LOG_TYPE = 'NFM601';
    public class NFM601 {
        public GeDatas GeDatas;
    }
    public class GeDatas {
        public NFMUtil.MonitoringToComPlat Monitoring;
        public GeData[] GeData;
    }
    public class GeData {
        public String ManageCode; //管理编码 SFDC的管理编码(医院/科室/经销商
        public String ManageCode2; //智慧医疗编码 标识为经销商时,本字段不需要传输;SFDC新建医院或科室时本字段值为空;
        public String Name; //名称
        public String Identification; //标识 1:医院;2:科室;3:经销商
        public String SalesBusinessDivision; //销售本部
        public String State; //省(文本)
        public String City; //市
        public Boolean Status; //状态
        // 医院
        public String Alias1; //别名1
        public String Alias2; //别名2
        public String Abbreviation; //简称 (SFDC需新加字段)
        public String Phone; //电话
        public String ZIPCode; //邮编
        public String Address; //地址
        public String OCSMCategory; //OCSM分类
        public String HospitalLevel; //政府等级
        // 科室
        public String DepartmentClass; //科室类别
        public String HospitalCode; //关联医院
        // 经销商
        public String QuolifiedValidityDate; //三证资质最早有效期
        public String ContractEndDate; //最晚合同有效期
    }
 
 
 
    //正常调用
    @future(callout = true)
    public static void callout(String iflog_Id, List < String > accountIdList) {
        executefuture(iflog_Id, accountIdList);
    }
    //Batch调用
    public static void executefuture(String iflog_Id, List < String > accountIdList) {
        BatchIF_Log__c iflog = null;
        Datetime nowDT = Datetime.now();
        String nowStr = nowDT.format('yyyyMMddHHmmss');
 
        if (String.isNotBlank(iflog_Id)) {
            List < BatchIF_Log__c > iflogList = [Select Id, Name, Log__c, ErrorLog__c from BatchIF_Log__c where Id =: iflog_Id];
            if (iflogList.size() > 0) {
                iflog = iflogList.get(0);
                iflog.ErrorLog__c = '';
            } else {
                iflog = new BatchIF_Log__c();
                iflog.MessageGroupNumber__c = nowStr;
            }
        } else {
            iflog = new BatchIF_Log__c();
            iflog.MessageGroupNumber__c = nowStr;
        }
 
 
        NFMUtil.MonitoringToComPlat me = new NFMUtil.MonitoringToComPlat();
        me.Tag = 'MSGH';
        me.Sender = 'SFDC';
        me.Receiver = '智慧医疗/服务新系统';
        me.MessageType = LOG_TYPE;
        me.MessageGroupNumber = nowStr; //iflog.Name;
        if (String.isNotBlank(iflog.Name)) {
            me.MessageGroupNumber = iflog.Name;
        }
        // me.NumberOfRecord       = '' + qisIds.size();
        me.TransmissionDateTime = nowStr;
        me.Text = '';
        String randomstr = NFMUtil.randomUUID(16);
        Long timestamp = DateTime.now().getTime();
        String timestampStr = String.valueOf(timestamp);
        String getToken = NFMUtil.getToken(randomstr, timestamp);
        me.API_RANDOM_STR = randomstr;
        me.API_TIME = timestampStr;
        me.API_TOKEN = getToken;
        me.sign = NFMUtil.getSignMD5();
        me.timestamp = timestampStr;
        me.appKey = NFMUtil.appKeyLMS;
 
 
 
        BatchIF_Log__c rowData = null;
 
        //省
        List < Address_Level__c > address_LevelList = [select Id, Name, Level1_Code__c from Address_Level__c];
        Map < String, Address_Level__c > regionNameMap = new Map < String, Address_Level__c > ();
        for (Address_Level__c level1: address_LevelList) {
            regionNameMap.put(level1.Id, level1);
        }
        //市
        List < Address_Level2__c > address_Level2List = [select Id, Name, Level2_Code__c from Address_Level2__c];
        Map < String, Address_Level2__c > cityMap = new Map < String, Address_Level2__c > ();
        for (Address_Level2__c level2: address_Level2List) {
            cityMap.put(level2.Id, level2);
        }
        List < Account > accountList =
            [
                SELECT Id,
                Name, //名称
                Department_Name__c,
                Parent.Name, 
                Management_Code__c, //管理编码
                Salesdepartment_HP__c, //销售本部(医院)
                Salesdepartment_Dept__c, //销售本部(科室)
                Salesdepartment_DeptClass__c, //销售本部(科室分类)
                State_Master__c, //省
                State_Master__r.Name, //
                State_Master__r.Level1_Code__c, //
                City_Master__c, //市
                City_Master__r.Name, //
                City_Master__r.Level2_Code__c, //
                Is_Active_Formula__c, //有效/无效(公式)
                Address__c, //地址
                OCM_Category__c, //OCSM分类(医院)
                Phone, //电话
                RecordType_DeveloperName__c, //客户记录类型_DeveloperName
                Site, //别名1
                Alias_Name2__c, //别名2
                Ban_On_Use_Date__c, //禁用日期
                Ban_On_Use_DateDD__c, //DD有效期至
                Postal_Code__c, //邮政编码
                RecordType.Name, //记录类型名称
                RecordTypeId, //记录类型Id
                Department_RecordType_Name__c, //科室分类名   
                Parent.Parent.Management_Code__c, //医院的 管理编码
                Grade__c, //政府等级
                PlatformCode__c, //智慧医疗编码
                Abbreviation__c, //简称
                Parent.Parent.State_Master__r.Level1_Code__c,
                Parent.Parent.City_Master__r.Level2_Code__c,
                Parent.ParentId, //医院Id
                Parent.Parent.RecordTypeId //记录类型
                FROM Account
                WHERE(Id IN: accountIdList OR Parent.ParentId IN: accountIdList)
                AND RecordTypeId != '01210000000QjCNAA0'
                AND(Is_Active_Formula__c = '有效'
                    OR Is_Active_Formula__c = '无效')
                ORDER BY Parent.ParentId, ParentId, Id
            ];
        //数据拼装
        GeDatas gds = new GeDatas();
        gds.GeData = new List < GeData > ();
        iflog.Log__c= iflog.Log__c == null? '':iflog.Log__c;
        try {
            // 获取经销商Id
            Set < Id > agencySet = new Set < Id > ();
            Map < Id, String > getLicenceEarliestMap = new Map < Id, String > ();
            Map < Id, String > getAgencyContractLatestMap = new Map < Id, String > ();
            for (Account acc: accountList) {
                if ('01210000000Qem1AAC'.equals(acc.RecordTypeId)) {
                    agencySet.add(acc.Id);
                }
            }
            if (agencySet.size() > 0) {
                //查找 三证资质最早有效期(经销商)
                getLicenceEarliestMap = getLicenceEarliestDate(agencySet);
                //查找 最晚合同有效期(契约)(经销商)
                getAgencyContractLatestMap = getAgencyContractLatestDate(agencySet);
            }
            for (Account acc: accountList) {
                String level1_Code = acc.State_Master__r.Level1_Code__c;
                String level2_Code = acc.City_Master__r.Level2_Code__c;
                if (String.isNotBlank(acc.Parent.ParentId)) {
                    level1_Code = acc.Parent.Parent.State_Master__r.Level1_Code__c;
                    level2_Code = acc.Parent.Parent.City_Master__r.Level2_Code__c;
                }
 
 
                GeData gd = new GeData();
 
                gd.ManageCode = acc.Management_Code__c; //管理编码 SFDC的管理编码(医院/科室/经销商)
                gd.ManageCode2 = ''; //智慧医疗编码 标识为经销商时,本字段不需要传输;SFDC新建医院或科室时本字段值为空;
 
                gd.Name = acc.Name; //名称
                gd.Identification = ''; //标识 1:医院;2:科室;3:经销商
                gd.SalesBusinessDivision = ''; //销售本部(经销商没有)
                gd.State = String.isBlank(level1_Code) ? '' : level1_Code; //省(文本)
                gd.City = String.isBlank(level2_Code) ? '' : level2_Code; //市
                gd.Status = '有效'.equals(acc.Is_Active_Formula__c) ? true : false; //状态
 
                // 医院
                gd.Alias1 = ''; //别名1
                gd.Alias2 = ''; //别名2
                gd.Abbreviation = ''; //简称 (SFDC需新加字段)
                gd.Phone = ''; //电话
                gd.ZIPCode = ''; //邮编
                gd.Address = ''; //地址
                gd.OCSMCategory = ''; //OCSM分类
                gd.HospitalLevel = ''; //政府等级
                // 科室
                gd.DepartmentClass = ''; //科室类别
                gd.HospitalCode = ''; //关联医院
 
                // 经销商
                gd.QuolifiedValidityDate = ''; //三证资质最早有效期
                gd.ContractEndDate = ''; //最晚合同有效期
 
 
                String manageCode2 = String.isBlank(acc.PlatformCode__c) ? '' : acc.PlatformCode__c; //智慧医疗编码
                // 医院
                if ('01210000000QemGAAS'.equals(acc.RecordTypeId)) {
                    iflog.Log__c += '医院 ManageCode [ ' +gd.ManageCode + ' ]\n';
                    
                    gd.Identification = '1';
                    gd.SalesBusinessDivision = acc.Salesdepartment_HP__c; //销售本部(医院)
                    gd.Alias1 = String.isBlank(acc.Site) ? '' : acc.Site; //别名1
                    gd.Alias2 = String.isBlank(acc.Alias_Name2__c) ? '' : acc.Alias_Name2__c; //别名2
                    gd.Abbreviation = String.isBlank(acc.Abbreviation__c) ? '' : acc.Abbreviation__c; //简称
                    gd.Phone = String.isBlank(acc.Phone) ? '' : acc.Phone; //电话
                    gd.ZIPCode = String.isBlank(acc.Postal_Code__c) ? '000000' : acc.Postal_Code__c; //邮编
                    gd.Address = String.isBlank(acc.Address__c) ? '' : acc.Address__c; //地址
                    gd.ManageCode2 = manageCode2; //智慧医疗编码
                    gd.OCSMCategory = acc.OCM_Category__c; //OCSM分类(医院)
                    gd.HospitalLevel = acc.Grade__c; //政府等级
                }
 
                // 经销商
                if ('01210000000Qem1AAC'.equals(acc.RecordTypeId)) {
                    iflog.Log__c += '经销商 ManageCode [ ' +gd.ManageCode + ' ]\n';
 
                    gd.Identification = '3';
                    String quolifiedValidityDate = getLicenceEarliestMap.get(acc.Id) == null ? '00000000' : getLicenceEarliestMap.get(acc.Id);
                    gd.QuolifiedValidityDate = quolifiedValidityDate; //三证资质最早有效期
                    String contractEndDate = getAgencyContractLatestMap.get(acc.Id) == null ? '00000000' : getAgencyContractLatestMap.get(acc.Id);
                    gd.ContractEndDate = contractEndDate; //最晚合同有效期
                }
                // 科室
                if ('01210000000QemGAAS'.equals(acc.Parent.Parent.RecordTypeId)) {
                    iflog.Log__c += '科室 ManageCode [ ' +gd.ManageCode + ' ]\n';
                    
                    gd.Name = acc.Parent.Name +' ' +acc.Department_Name__c;
 
                    gd.DepartmentClass = ''; //科室类别
                    String departmentClass = acc.Department_RecordType_Name__c;
                    if (String.isNotBlank(departmentClass) && departmentClass.contains('.')) {
                        gd.DepartmentClass = departmentClass.substring(2, departmentClass.length());
                    }
                    gd.Identification = '2';
                    gd.SalesBusinessDivision = acc.Salesdepartment_Dept__c; //销售本部(科室)
                    gd.HospitalCode = acc.Parent.Parent.Management_Code__c; //关联医院
                    gd.ManageCode2 = manageCode2; //智慧医疗编码
                }
 
                if (String.isNotBlank(gd.Identification)) {
                    gds.GeData.add(gd);
                }
            }
 
            if (gds.GeData.size() > 0) {
                me.NumberOfRecord = '' + gds.GeData.size();
                gds.Monitoring = me;
                iflog.Log__c += '\nNumberOfRecord=' + gds.GeData.size() + ' ';
 
 
                NFMUtil.Monitoring Monitoring = new NFMUtil.Monitoring();
                Monitoring.Tag = gds.Monitoring.Tag;
                Monitoring.Sender = gds.Monitoring.Sender;
                Monitoring.Receiver = gds.Monitoring.Receiver;
                Monitoring.MessageType = gds.Monitoring.MessageType;
                Monitoring.MessageGroupNumber = gds.Monitoring.MessageGroupNumber;
                Monitoring.NumberOfRecord = gds.Monitoring.NumberOfRecord;
                Monitoring.TransmissionDateTime = gds.Monitoring.TransmissionDateTime;
                Monitoring.Text = '';
 
                NFM601 nfm601 = new NFM601();
                NFM601.GeDatas = new GeDatas();
                NFM601.GeDatas = gds;
 
                rowData = NFMUtil.makeRowData(Monitoring, LOG_TYPE, nfm601);
                execute(rowData, iflog);
            }
 
        } catch (Exception ex) {
            // エラーが発生した場合
            logstr += ex.getMessage();
            iflog.ErrorLog__c += ex.getMessage() + '\n';
            iflog.ErrorLog__c += ex.getStackTraceString() + '\n';
        }
        if (rowData != null) {
            upsert rowData;
        }
        iflog.Log__c = logstr;
        upsert iflog;
 
    }
 
    /**
     * 接口发送失败 根据BatchLogId进行手动发送
     * @Author   XHL
     * @DateTime 2021-07-22
     * @param    rowDataId  [BatchLogId]
     */
    public static void ManualExecute(String rowDataId) {
        List < BatchIF_Log__c > row = [select id, name, MessageGroupNumber__c, retry_cnt__c,
            RowDataFlg__c, ErrorLog__c, Type__c,
            Log__c, Log2__c, Log3__c, Log4__c, Log5__c, Log6__c,
            Log7__c, Log8__c, Log9__c, Log10__c, Log11__c, Log12__c
            from BatchIF_Log__c
            where id =: rowDataId
        ];
        if (row.size() > 0) NFM601Controller.execute(row[0], null);
    }
    /**
     * 逻辑正常执行发送
     * @Author   XHL
     * @DateTime 2021-07-22
     * @param    rowDataSFDC [BatchLogId]
     * @param    iflog       [执行情况记录]
     */
    public static void execute(BatchIF_Log__c rowDataSFDC, BatchIF_Log__c iflog) {
        Integer batch_retry_max_cnt = Integer.valueOf(System.Label.batch_retry_max_cnt);
        
        logstr += rowDataSFDC.MessageGroupNumber__c + ' start\n';
        Boolean needUpdateIflog = false;
        if (iflog == null) {
            needUpdateIflog = true;
            iflog = new BatchIF_Log__c();
            iflog.Type__c = LOG_TYPE;
            iflog.MessageGroupNumber__c = rowDataSFDC.MessageGroupNumber__c;
            iflog.Log__c = logstr;
            iflog.ErrorLog__c = '';
 
        } else {
            needUpdateIflog = true;
            iflog.Type__c = LOG_TYPE;
            iflog.MessageGroupNumber__c = rowDataSFDC.MessageGroupNumber__c;
            logstr = iflog.Log__c;
        }
 
        try {
            String data = NFMUtil.getRowDataStr(rowDataSFDC);
            System.debug('data--------0>'+data);
 
            String jsonReplace =  JsonReplace(data);
            if (String.isNotBlank(jsonReplace)) {
                data = jsonReplace;
            }
            System.debug('data--------1>'+data);
            status = NFMUtil.sendToSapRet(data, NFMUtil.NFM601_ENDPOINT);
            if ('Accepted'.equals(status)) {
                logstr += status + '\n';
                rowDataSFDC.retry_cnt__c = 0;
                logstr += 'end';
            } else {
                // 异常重发
                rowDataSFDC = NFMUtil.LogAutoSend(rowDataSFDC, null, status);
            }
            System.debug('NFM601Log--status->' + status);
        } catch (Exception ex) {
            // TODO IOException
 
            // 异常重发
            // Callout from triggers are currently not supported.
            if (!String.valueOf(ex.getMessage()).contains('Callout from triggers')) {
                logstr += ex.getMessage();
                iflog.ErrorLog__c += ex.getMessage() + '\n';
                iflog.ErrorLog__c += ex.getStackTraceString() + '\n';
            }
            rowDataSFDC = NFMUtil.LogAutoSend(rowDataSFDC, ex, null);
        }
        iflog.Log__c = logstr;
        if (needUpdateIflog) {
            upsert iflog;
            upsert rowDataSFDC;
        }
 
 
    }
 
    //查找 三证资质最早有效期(经销商)
    public static Map < Id, String > getLicenceEarliestDate(Set < Id > agencySet) {
        Map < Id, String > result = new Map < Id, String > ();
 
        List < License_Information__c > getLicenceList = [
            SELECT Id, ValidFrom__c, LicenseAndAccount__c
            FROM License_Information__c
            WHERE LicenseAndAccount__c In: agencySet AND ValidFrom__c != null
            ORDER BY LicenseAndAccount__c, ValidFrom__c desc
        ];
        if (getLicenceList.size() > 0) {
            for (License_Information__c li: getLicenceList) {
                Id accountId = li.LicenseAndAccount__c;
                String validFromStr = NFMUtil.formatDate2Str(li.ValidFrom__c);
                result.put(accountId, validFromStr);
            }
        }
 
        return result;
    }
    //查找 最晚合同有效期(契约)
    public static Map < Id, String > getAgencyContractLatestDate(Set < Id > agencySet) {
        Map < Id, String > result = new Map < Id, String > ();
 
        List < Account > getAgencyContractList = [
            SELECT Id, Name, Contract_End_Date__c, Agent_Ref__c
            FROM Account
            WHERE Agent_Ref__c IN: agencySet AND Contract_End_Date__c != null AND RecordTypeId = '01210000000QjCNAA0'
            ORDER BY Agent_Ref__c, Contract_End_Date__c
        ];
        if (getAgencyContractList.size() > 0) {
            for (Account acc: getAgencyContractList) {
                Id accountId = acc.Agent_Ref__c;
                String contractEndDateStr = NFMUtil.formatDate2Str(acc.Contract_End_Date__c);
                result.put(accountId, contractEndDateStr);
            }
        }
        return result;
    }
    /**
     * [因LMS系统timestamp有6分钟时效性,为了可以在系统宕机后,批量发送,用当前时间替换BatchLog日志里的timestamp的值]
     * @param  data [json字符串]
     * @return      [json字符串]
     */
    public static String JsonReplace(String data){
        
        List<String> jsonList = data.split(',');
        System.debug('jsonList---->'+jsonList);
        String jsonStr00 = '';
        Integer num = 1;
        String timestamp = String.valueOf(DateTime.now().getTime());
        for(String str:data.split(',')){
            if (str.contains('timestamp')) {
                system.debug('str--->'+str);
                str = '\"timestamp\"'+':'+'\"'+ timestamp +'\"';      
            }
            jsonStr00 += str;
            if (num++ != data.length()) {
               jsonStr00 += ','; 
            }
            
        }
        String result = jsonStr00.substring(0,jsonStr00.length()-1);
        System.debug('jsonStr00--->'+jsonStr00.substring(0,jsonStr00.length()-1));
        return result;
    }
}