liuyan
2022-11-17 3aaf6c0574e376b15ca88650460256e078ad16bd
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
/**
     * NFM001.triggerから呼び出す
     */
    public without sharing class NFM001Controller {
        //NFM001修改Rest start
        public static String status;
        public class NFM001 {
            public Endusers_element Endusers;
        }
 
        public class Endusers_element {
            public NFMUtil.Monitoring Monitoring;
            public Enduser_element[] Enduser;
        }
 
        public class Enduser_element {
            public String CompanyCode;          
            public String CompanyDescription;   
            public String DepartmentCode;       
            public String DepartmentDescription;
            public String CompanyDescription2;  
            public String CompanyAreaCode;     
            public String DepartmentPostalCode;
            public String DepartmentAddress;   
            public String CompanyCategory;     
            public String DepartmentTelephone;
            public String DepartmentFax;       
            public String DepartmentCategory;  
            public String DepartmentEffectiveDateTo;
            public String PurposeOfAdvice;
        }
        //NFM001修改Rest end
        public static boolean isRunning = false;
        public static String debug_msg = '';
 
        /**
         * NFM001の送信処理
         *
         * @param iflog_Id           ログテーブルのId
         * @param accIds             送信対象取引先
         * @param purposeOfAdviceMap 1:Delete 2:Add(Insert) 3:Change(Update)
         * @param needSendRectMap    送信対象のレコードタイプのmap
         */
        @future (callout=true)
        public static void callout(String iflog_Id, List<String> accIds, Map<String, String> purposeOfAdviceMap, Map<String, String> needSendRectMap) {
            calloutNotFuture(iflog_Id,accIds,purposeOfAdviceMap,needSendRectMap);
        }
 
        
        public static void calloutNotFuture(String iflog_Id, List<String> accIds, Map<String, String> purposeOfAdviceMap, Map<String, String> needSendRectMap) {
            if (accIds == null || accIds.size() == 0) {
                return;
            }
            /*Nfm001Sync.HTTPS_Port stub = new Nfm001Sync.HTTPS_Port();
            stub.timeout_x = 100000; // timeout in milliseconds
            stub.endpoint_x = NFMUtil.NFM001_ENDPOINT;
            stub.inputHttpHeaders_x = new Map<String, String>();
            stub.inputHttpHeaders_x.put('Authorization', NFMUtil.Authorization);*/
            
            /*if (NFMUtil.CLIENT_CERT_NAME != null) {
                stub.clientCertName_x = NFMUtil.CLIENT_CERT_NAME;
            }*/ 
 
            // MessageGroupNumber の取得
            List<BatchIF_Log__c> iflogList = [Select Id, Name, Log__c, ErrorLog__c from BatchIF_Log__c where Id = :iflog_Id];
            BatchIF_Log__c iflog = new BatchIF_Log__c();
            //BatchIF_Log__c iflog = null;
            if (iflogList.size() > 0) {
                iflog = iflogList.get(0);
                iflog.ErrorLog__c = '';
            } else {
                // データ取れってないとは、rollbackされていることです
                //return;
                iflog.Type__c = 'NFM001';
                iflog.ErrorLog__c = '';
                iflog.Log__c  = 'callout start\n';
            }
            String logstr = iflog.Log__c + ' ' + 'NumberOfRecord=' + accIds.size() + '\n';
 
            // Monitoringの設定
            Datetime nowDT = Datetime.now();
            String nowStr = nowDT.format('yyyyMMddHHmm');
            //NFM001修改Rest start
            //Nfm001Sync.Endusers_element endusers = new Nfm001Sync.Endusers_element();
            Endusers_element endusers = new Endusers_element();
            //NFM001修改Rest end
            endusers.Monitoring = new NFMUtil.Monitoring();
            endusers.Monitoring.Tag                  = 'MSGH';
            endusers.Monitoring.Sender               = '8402';
            endusers.Monitoring.Receiver             = '1330';
            endusers.Monitoring.MessageType          = 'NFM001';
            endusers.Monitoring.MessageGroupNumber   = iflog.Name;
            endusers.Monitoring.NumberOfRecord       = '' + accIds.size();
            endusers.Monitoring.TransmissionDateTime = nowStr;
            endusers.Monitoring.Text = '';
 
            BatchIF_Log__c rowData = null;
            // BatchIF転送表 から、コード変換のMapを作成
            Map<String, String> transferMap = new Map<String, String>();
            List<BatchIF_Transfer__c> transferList = [select Table__c,
                                                             Column__c,
                                                             External_value__c,
                                                             Internal_value__c
                                                        from BatchIF_Transfer__c
                                                       where Dropped_Flag__c = false
                                                         and Table__c = 'Account'];
            for (BatchIF_Transfer__c t : transferList) {
                transferMap.put(t.Column__c + t.Internal_value__c, t.External_value__c);
            }
 
            try {
                // 転送データを取得、参照先のデータがあるので、ここで検索必要です。
                List<Account> accList = [select Id, RecordTypeId, Management_Code__c,
                                                Name, Site, Department_Name__c,
                                                Phone, Fax,
                                                Is_Medical_F__c,
                                                Postal_Code__c, Address__c,
                                                OCM_Category__c,
                                                //NFM001修改Rest start
                                                Is_Active_Formula__c,
                                                //NFM001修改Rest end
                                                City_Master__r.Level2_Sys_No__c,
                                                Hospital__r.Name,
                                                Hospital__r.Management_Code__c,
                                                Hospital__r.Site,
                                                Hospital__r.City_Master__r.Level2_Sys_No__c,
                                                Hospital__r.Postal_Code__c,
                                                Hospital__r.Address__c,
                                                Hospital__r.OCM_Category__c,
                                                // HWAG-BBNBXK LHJ 20190429 Start
                                                Hospital__r.Is_Medical_F__c,
                                                // HWAG-BBNBXK LHJ 20190429 End
                                                // 契約の対応
                                                Parent.AgentCode_Ext__c,
                                                Parent.Name,
                                                Parent.Phone,
                                                Parent.Fax,
                                                Parent.Postal_Code__c,
                                                // 20190729 合同中的省,通过经销商抓取,传给SAP
                                                City_Master_TOSAP__c,
                                                Parent.Address_Together__c,
                                                AgencyContract_Management_Code__c,
                                                Parent.Ban_On_Use_Date__c
                                           from Account where Id IN :accIds All ROWS];
                System.debug(Logginglevel.DEBUG, 'NFM001_ accList.size()=' + accList.size());
 
 
                // Enduserのデータの設定
                //NFM001修改Rest start
                //endusers.Enduser = new List<Nfm001Sync.Enduser_element>();
                endusers.Enduser = new List<Enduser_element>();
                //NFM001修改Rest end
                for (Account acc : accList) {
                    System.debug('purposeOfAdviceMap='+purposeOfAdviceMap);
                    System.debug('needSendRectMap='+needSendRectMap);
                    System.debug('acc.RecordTypeId='+acc.RecordTypeId);
                    System.debug('needSendRectMap.get(acc.RecordTypeId)'+needSendRectMap.get(acc.RecordTypeId));
                    //NFM001修改Rest start
                    //Nfm001Sync.Enduser_element enduser = new Nfm001Sync.Enduser_element();
                    Enduser_element enduser = new Enduser_element();
                    endusers.Enduser.add(enduser);
                    //NFM001修改Rest end
                    if (needSendRectMap.get(acc.RecordTypeId) == '契約') {
                        System.debug('accList.size()=' + accList);
                        enduser.CompanyCode           = acc.AgencyContract_Management_Code__c;
                        enduser.CompanyDescription    = acc.Parent.Name + '(最终用户)';
                        enduser.DepartmentCode        = acc.AgencyContract_Management_Code__c;
                        enduser.DepartmentDescription = acc.Parent.Name;
                        enduser.CompanyDescription2   = acc.Parent.Name;
                        //enduser.CompanyAreaCode       = acc.City_Master__r.Level2_Sys_No__c;
                        enduser.CompanyAreaCode       = acc.City_Master_TOSAP__c;
                        enduser.DepartmentPostalCode  = null;
                        enduser.DepartmentAddress     = acc.Address__c;
                        enduser.CompanyCategory       = 'NORMAL(L)';
                        enduser.DepartmentTelephone   = acc.Parent.Phone;
                        enduser.DepartmentFax         = acc.Parent.Fax;
                        enduser.DepartmentCategory    = null;
                        enduser.DepartmentEffectiveDateTo = (acc.Parent.Ban_On_Use_Date__c == null) ? '99991231' : NFMUtil.formatDate2Str(acc.Parent.Ban_On_Use_Date__c);
                        enduser.PurposeOfAdvice       = purposeOfAdviceMap.get(acc.Id);
                    } else {
                        System.debug(acc.RecordTypeId);
                        if (needSendRectMap.get(acc.RecordTypeId) == '病院') {
                            enduser.CompanyCode           = acc.Management_Code__c;
                            enduser.CompanyDescription    = acc.Name;
                            enduser.DepartmentCode        = acc.Management_Code__c;
                            enduser.DepartmentDescription = acc.Name;
                            //--------CHAN-B3N9KB---------------AddStart------xinhonglu----------------------------------------
                            //wangweipeng   2021/10/08      如果是民营,那么传接口值为私立    start
                            enduser.CompanyDescription2   = acc.Site +','+ (acc.Is_Medical_F__c == '民营' ? '私立':acc.Is_Medical_F__c);
                            //wangweipeng   2021/10/08      如果是民营,那么传接口值为私立    end
                            //--------CHAN-B3N9KB---------------AddEnd------xinhonglu-----------------------------------------
                            enduser.CompanyAreaCode       = acc.City_Master__r.Level2_Sys_No__c;
                            enduser.DepartmentPostalCode  = acc.Postal_Code__c;
                            enduser.DepartmentAddress     = acc.Address__c;
                            enduser.CompanyCategory       = NFMUtil.getMapValue(transferMap, 'OCM_Category__c', acc.OCM_Category__c, iflog);
                        } else {
                            System.debug('accList.size()=' + accList);
                            enduser.CompanyCode           = acc.Hospital__r.Management_Code__c;
                            enduser.CompanyDescription    = acc.Hospital__r.Name;
                            enduser.DepartmentCode        = acc.Management_Code__c;
                            enduser.DepartmentDescription = acc.Department_Name__c;
                            // HWAG-BBNBXK LHJ 20190429 Start
                            //enduser.CompanyDescription2   = acc.Hospital__r.Site;
                            //wangweipeng   2021/10/08      如果是民营,那么传接口值为私立    start
                            enduser.CompanyDescription2   = acc.Hospital__r.Site +','+ (acc.Hospital__r.Is_Medical_F__c == '民营' ? '私立':acc.Hospital__r.Is_Medical_F__c);
                            //wangweipeng   2021/10/08      如果是民营,那么传接口值为私立    end
                            // HWAG-BBNBXK LHJ 20190429 End
                            enduser.CompanyAreaCode       = acc.Hospital__r.City_Master__r.Level2_Sys_No__c;
                            enduser.DepartmentPostalCode  = acc.Hospital__r.Postal_Code__c;
                            enduser.DepartmentAddress     = acc.Hospital__r.Address__c;
                            enduser.CompanyCategory       = NFMUtil.getMapValue(transferMap, 'OCM_Category__c', acc.Hospital__r.OCM_Category__c, iflog);
                        }
                        enduser.DepartmentTelephone = acc.Phone;
                        enduser.DepartmentFax       = acc.Fax;
                        enduser.DepartmentCategory = null;
                        // deleteがないので、有効終了 日に 99991231 をセットして更新
                        String purposeOfAdvice = purposeOfAdviceMap.get(acc.Id);
                        if (purposeOfAdvice == '1') {
                            enduser.DepartmentEffectiveDateTo = NFMUtil.formatDate2Str(System.today());
                            enduser.PurposeOfAdvice = '3';
                        } else {
                            enduser.DepartmentEffectiveDateTo = '99991231';
                            enduser.PurposeOfAdvice = purposeOfAdvice;
                        }
                    }
                    
                    logstr += enduser.DepartmentCode + '(' + enduser.PurposeOfAdvice + ')' + ' ';
                }
 
                if (EndUsers.Enduser.size() > 0) {
 
                    NFMUtil.Monitoring Monitoring   = new NFMUtil.Monitoring();
                    Monitoring.Tag                  = EndUsers.Monitoring.Tag;
                    Monitoring.Sender               = EndUsers.Monitoring.Sender;
                    Monitoring.Receiver             = EndUsers.Monitoring.Receiver;
                    Monitoring.MessageType          = EndUsers.Monitoring.MessageType;
                    Monitoring.MessageGroupNumber   = EndUsers.Monitoring.MessageGroupNumber;
                    Monitoring.NumberOfRecord       = EndUsers.Monitoring.NumberOfRecord;
                    Monitoring.TransmissionDateTime = EndUsers.Monitoring.TransmissionDateTime;
                    Monitoring.Text = '';
                    
                    // NFM001修改Rest 新增 start
                    NFM001 nfm001 = new NFM001();
                    nfm001.EndUsers = new EndUsers_element();
                    nfm001.EndUsers = EndUsers;
                    // NFM001修改Rest 新增 end
                      
                    //NFM001修改Rest start
                    rowData = NFMUtil.makeRowData(Monitoring, 'NFM001', nfm001);
                    //NFM001修改Rest end
                    execute(rowData, iflog);
 
 
                    if (System.Label.NFM001_IsOn == '1') {
                    //    Nfm001Sync.Endusers_element[] pEndusers = new Nfm001Sync.Endusers_element[] { endusers };
                        logstr += '\ncallout count=' + EndUsers.Enduser.size();
                    //    OlympusCoJpCommonMessage.LOG_element[] logs = stub.NFM001_Sync_BC2GPI(pEndusers);
                    } else {
                        iflog.ErrorLog__c += 'NFM001_IsOff';
                    }
                    // 原則非同期ですので、logsを確認する必要がないでしょう。
                }
                logstr += '\nend';
            } catch(Exception ex) {
                // エラーが発生した場合
                System.debug(Logginglevel.ERROR, 'NFM001_' + iflog.Name + ':' + ex.getMessage());
                System.debug(Logginglevel.ERROR, 'NFM001_' + iflog.Name + ':' + ex.getStackTraceString());
                logstr += ex.getMessage();
                iflog.ErrorLog__c += ex.getMessage() + '\n';
                iflog.ErrorLog__c += ex.getStackTraceString() + '\n';
            }
            if (rowData != null) {
                System.debug('+++++rowData+++++insert:' + rowData);
                insert rowData;
                System.debug('+++++rowData+++++afterinsert:' + rowData.Id);
            }
 
            System.debug(Logginglevel.DEBUG, 'NFM001_' + iflog.Name + ' end');
            iflog.Log__c = logstr;
            upsert iflog;
        }
 
        public static void execute(BatchIF_Log__c rowData, BatchIF_Log__c iflog) {
 
            Integer batch_retry_max_cnt = Integer.valueOf(System.Label.batch_retry_max_cnt);
            String rowDataStr = NFMUtil.getRowDataStr(rowData);
            // NFM001修改Rest start
            //Nfm001Sync.Endusers_element endusers = (Nfm001Sync.Endusers_element) JSON.deserialize(rowDataStr, Nfm001Sync.Endusers_element.class);
            NFM001 nfm001 = (NFM001) JSON.deserialize(rowDataStr, NFM001.class);
 
            //String logstr = endusers.Monitoring.MessageGroupNumber + ' start\n';
            String logstr = nfm001.endusers.Monitoring.MessageGroupNumber + ' start\n';
            // NFM001修改Rest start end
            Boolean needUpdateIflog = false;
            if  (iflog == null) {
                needUpdateIflog = true;
                iflog = new BatchIF_Log__c();
                iflog.Type__c = 'NFM001';
                // NFM001修改Rest start
                iflog.MessageGroupNumber__c = nfm001.endusers.Monitoring.MessageGroupNumber;
                // NFM001修改Rest end
                iflog.Log__c = logstr;
                iflog.ErrorLog__c = '';
                //insert iflog;
                //iflog = [Select Id, Name, Log__c, ErrorLog__c from BatchIF_Log__c where Id = :iflog.Id];
            } else {
                logstr = iflog.Log__c;
            }
 
            try{
                //gaozw
                // NFM001修改Rest start
                /*Nfm001Sync.HTTPS_Port stub = new Nfm001Sync.HTTPS_Port();
                stub.timeout_x = 100000; // timeout in milliseconds
                stub.endpoint_x = NFMUtil.NFM001_ENDPOINT;
                stub.inputHttpHeaders_x = new Map<String, String>();
                stub.inputHttpHeaders_x.put('Authorization', NFMUtil.Authorization);
                if (NFMUtil.CLIENT_CERT_NAME != null) {
                    stub.clientCertName_x = NFMUtil.CLIENT_CERT_NAME;
                }
                Nfm001Sync.Endusers_element[] pEndusers = new Nfm001Sync.Endusers_element[] { endusers };
                NFM001Controller.debug_msg += ', execute()';
                OlympusCoJpCommonMessage.LOG_element[] logs = stub.NFM001_Sync_BC2GPI(pEndusers);*/
                // NFM001修改Rest end
                // 原則非同期ですので、logsを確認する必要がないでしょう。
                // NFM001修改Rest start
                status =NFMUtil.sendToSapRet(rowDataStr, NFMUtil.NFM001_ENDPOINT);
                if (status == 'OK') {
                    rowData.retry_cnt__c = 0;
                } else {
                    if (rowData.retry_cnt__c == null) rowData.retry_cnt__c = 0;
                    if (rowData.retry_cnt__c < batch_retry_max_cnt) {
                        rowData.retry_cnt__c++;
                        LogAutoSendSchedule.assignOneMinute();
                    }
                    if (rowData.retry_cnt__c >= batch_retry_max_cnt) {
                        rowData.ErrorLog__c = 'status:' + status +
                                              '\n错误次数已经超过自动送信设定的最大次数,请手动送信';
                    }
                }
                // NFM001修改Rest end
            }catch(Exception ex) {
                // TODO IOException
                // エラーが発生した場合
                System.debug(Logginglevel.ERROR, 'NFM001_' + iflog.Name + ':' + ex.getMessage());
                System.debug(Logginglevel.ERROR, 'NFM001_' + iflog.Name + ':' + ex.getStackTraceString());
                //NFM624触发001和201接口 20221102 LY start
                // 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';
                }
                //NFM624触发001和201接口 20221102 LY end
 
                //---Gaozw---add
                if (rowData.retry_cnt__c == null) rowData.retry_cnt__c = 0;
                if (rowData.retry_cnt__c < batch_retry_max_cnt){
                    rowData.retry_cnt__c++;
                    LogAutoSendSchedule.assignOneMinute();
                }
                if (rowData.retry_cnt__c >= batch_retry_max_cnt){
                    rowData.ErrorLog__c = ex.getMessage() + '\n' + ex.getStackTraceString() + '\n' + rowData.ErrorLog__c+'错误次数已经超过自动送信设定的最大次数,请手动送信';
                }
            }
            iflog.Log__c = logstr;
            System.debug('logdate2' + rowData);
            if (needUpdateIflog) {
                upsert iflog;
                upsert rowData;
            }
        }
    }