liuyn
2024-03-11 a87f1c3df03078814ee97ad0c8ac200a232419e9
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
/**
 * @url:/services/apexrest/NFM704/execute
 * 
 */
 
@RestResource(urlMapping='/NFM704/*')
global with sharing class NFM704Rest {
    /*迁移ali sushanhu 20231018
     //add Response to aws 20220421 add sushanhu start
   
     static Boolean SFStatus=true;
     static String SFMessage='';
    //add Response to aws 20220421 add sushanhu end
    */
    global class GeDatas {
        public NFMUtil.Monitoring Monitoring;
        public  GeData[] GeData;
    }
 
    public static final String LOG_TYPE = 'NFM704';
 
    global class GeData {
        public String StaffMCode;   //人员管理编码OBPM
        public String HospitalMCode;     //医院管理编码
        public String OfficeMCode;   //OBPM科室
        public String HcpNo;    //HPC编码
        public String HCPLevel; //HCP等级
        public String Name;    //姓名
        public String Mobile;   //电话
        public String State;    //省
        public String City;     //市
        public String WorkingSeniority; //临床工作年限
        public String TechnicalTitle; //技术职称
        public String Speciality;   //擅长的手术
        public String ProfessionalField;    //专业领域
        public String Society1;  //学会名称
        public String EventStatus; //学会职称 // 带有箭头 切割获取EventStatuslist pi改造之后 存***
        //add for pipl  by sushanhu 20220420 start
        // public String HCPLevelEncrypted; //HCP等级密文                //zhj新方案改造 2022-12-07
        // public String NameEncrypted;    //姓名                       //zhj新方案改造 2022-12-07
        // public String MobileEncrypted;   //电话                      //zhj新方案改造 2022-12-07
        // public String TechnicalTitleEncrypted; //技术职称            //zhj新方案改造 2022-12-07
        // public String SpecialityEncrypted;   //擅长的手术            //zhj新方案改造 2022-12-07
        // public String ProfessionalFieldEncrypted;    //专业领域      //zhj新方案改造 2022-12-07
        // public List<String> EventStatusEncryptedList; //学会职称 备注有逻辑 带有箭头 切割获取EventStatuslist 存hash      //zhj新方案改造 2022-12-07
        //public String DataId;//AWSDATAID /*迁移ali sushanhu 20231018
        //public String WorkingSeniorityEncrypted;//临床工作年限密文
        //add for pipl  by sushanhu 20220420 end                        //zhj新方案改造 2022-12-07
    }
 
    @HttpPost
    global static void doPost() {
        //取得接口传输内容
        String strData = RestContext.request.requestBody.toString();
        GeDatas ges = (GeDatas) JSON.deserializeStrict(strData, GeDatas.class);
        /*迁移ali sushanhu 20231018
        //add Response to aws 20220421 add sushanhu start
        NFMUtil.NFMResponse result = NFMUtil.getNFMResponse();
        //add Response to aws 20220421 add sushanhu end
        */
        if(ges == null) {
            return;
        }
 
        NFMUtil.Monitoring Monitoring = ges.Monitoring;
        if(Monitoring == null ) {
            return;
        }
 
        BatchIF_Log__c rowData = NFMUtil.saveRowData(Monitoring, LOG_TYPE, ges.GeData);
        system.debug('String.isBlank(rowData.Log__c) == false?');
        if(String.isBlank(rowData.Log__c) == false){
            System.debug('进入if方法,成功调用executefuture');
            executefuture(rowData.Id);
        }
 
        // JSONを戻す
        RestResponse res = RestContext.response;
        res.addHeader('Content-Type', 'application/json');
        res.statusCode = 200;
        String jsonResponse = '{"Result":{"Result": "00", "Message":""}}';
        res.responseBody = blob.valueOf(jsonResponse);
        /*迁移ali sushanhu 20231018
        //updata response toAWS sushanhu for pipl 20220421 start
        result.SFStatus=SFStatus;
        result.SFMessage=SFMessage;
        //String jsonResponse =JSON.serialize(result);
        String jsonResponse ='{"SFMessage":"","staticResponse":{"Result":{"Result":"00","Message":""}},"SFStatus":true}';
        system.debug('result---'+jsonResponse);
        res.responseBody = blob.valueOf(jsonResponse);
        //updata response toAWS sushanhu for pipl 20220421 end
        */
        return;
 
    }
 
    @future(callout = true)
    global static void executefuture(String rowData_Id){
        main(rowData_Id);
    }
 
    global static void main(String rowData_Id){
 
        String logstr = 'start\n';
        BatchIF_Log__c iflog = new BatchIF_Log__c();
        iflog.Type__c = LOG_TYPE;
        iflog.ErrorLog__c = '';
        iflog.Log__c = logstr;
        insert iflog;
 
        GeDatas gds = new GeDatas();
        gds.GeData = new List< GeData >();
 
        BatchIF_Log__c rowData = [Select Id, Name, Log__c, ErrorLog__c, Log2__c, Log3__c, Log4__c, Log5__c, Log6__c, Log7__c, Log8__c, Log9__c, Log10__c, Log11__c, Log12__c, MessageGroupNumber__c, retry_cnt__c from BatchIF_Log__c where RowDataFlg__c = true and Id =: rowData_Id];
 
        String rowDataStr = NFMUtil.getRowDataStr(rowData);
 
        List < GeData > itemMasterList = (List < GeData > ) JSON.deserialize(rowDataStr, List < GeData > .class);
        logstr += '数据总数为:' + itemMasterList.size() + '\n';
        if (itemMasterList == null || itemMasterList.size() == 0) {
            return;
        }
 
        Savepoint sp = Database.setSavepoint();
 
        try{
            //管理编码List
            List<String> DoctorNoList = new List<String>();
 
            //待更新的客户人员List
            List<Contact> upsertList = new List<Contact>();
 
            //医院编码List
            List<String> HospitalMCodeList = new List<String>();
 
 
            for(GeData ged : itemMasterList){
                String dataComplete = verify(ged);
                if (!String.isBlank(dataComplete)) {
                    logstr += dataComplete;
                    continue;
                }
                DoctorNoList.add(ged.StaffMCode);
                //officeMCodeList.add(ged.OfficeMCode);
                HospitalMCodeList.add(ged.HospitalMCode);
            }
            system.debug('HospitalMCodeList=============>'+HospitalMCodeList);
            system.debug('DoctorNoList=============>'+DoctorNoList);
            //Map<String, Map<String,Contact>> hospitalMap = new Map<String, Map<String,Contact>>();
            Map<String, Contact> conListMap = new Map<String, Contact>();
            List<Contact> conList = [select Id,
                                            Management_Code__c, //医院管理编码
                                            CManageCode__c     //人员管理编码
                                            from Contact WHERE CManageCode__c IN:DoctorNoList
                                            and CManageCode__c != null];
            system.debug('conList============>'+conList);
            
            for(Contact con : conList ){
                
                conListMap.put(con.CManageCode__c, con);
                //hospitalMap.put(con.Management_Code__c,conListMap);
            }
 
            List<Account> accList = [select Id, Name,GI_Main__c,Management_Code__c from Account where Management_Code__c in :HospitalMCodeList];
            system.debug('accList=============>'+accList);
            Map<String, Account> accMap = new Map<String, Account>();
 
            for(Account acc : accList){
               accMap.put(acc.Management_Code__c, acc);
            }
 
 
            for( GeData ged : itemMasterList ){
                //Map<String, Contact> tempMap = new Map<String, Contact>();
                if(accMap.containsKey(ged.HospitalMCode)){//医院编码是否存在 是
                    Contact con = new Contact();
                    if(conListMap.containsKey(ged.StaffMCode)){
                        //存在则更新
                        system.debug('更新联系人');
                        logstr += conListMap.get(ged.StaffMCode).Id + '\n';
                        logstr += '已存在客户人员\n';
                        con.Id = conListMap.get(ged.StaffMCode).Id;
                        system.debug('request'+conListMap.get(ged.StaffMCode).Management_Code__c.equals(ged.HospitalMCode));
                        if(conListMap.get(ged.StaffMCode).Management_Code__c.equals(ged.HospitalMCode)){//判断联系人上的管理编码和接口传输过来的管理编码是否一致
                            system.debug('request'+conListMap.get(ged.StaffMCode).Management_Code__c.equals(ged.HospitalMCode));
                        }else{
                            con.OBPMHospital__c = accMap.get(ged.HospitalMCode).Id;//接收的管理编码对应的医院写到OBPM医院上
                        }
                        con = assignment(ged,con);
                    }else{
                        //不存在则新建
                        system.debug('新建联系人');
                        //logstr += '不存在的客户人员\n';
                        con.OwnerId = accMap.get(ged.HospitalMCode).GI_Main__c;//所有人取医院上的消化科担当
                        con.AccountId = accMap.get(ged.HospitalMCode).Id;//新建联系人放到医院下
                        con.LastName = ged.Name;
                        // add by sushanhu for pipl 20220420 start
                        //con.LastName_Encrypted__c =ged.NameEncrypted;         //zhj新方案改造 2022-12-07
                        // add by sushanhu for pipl 20220420 end
                        con.FirstName = '';
                        con = assignment(ged,con);
                    }
                    upsertList.add(con);
                }else{//否
                    // continue;
                    logstr += '不存在的医院管理编码:['+accMap.get(ged.HospitalMCode)+']/n';
                    throw new ControllerUtil.myException('不存在的医院管理编码:['+accMap.get(ged.HospitalMCode)+']');
                }
 
                // //AccountId
                // if( accMap.get(ged.OfficeMCode) != null ){
                //     con.AccountId = accMap.get(ged.OfficeMCode).Id;
                // }else {
                //     logstr += '当前科室id有误或不存在';
                // }
 
                // con.HcpNo__c = ged.HcpNo;
                // con.HCPLevel__c = ged.HCPLevel;
                // con.LastName = ged.Name;
                // con.MobilePhone = ged.Mobile;
 
                // conListMap.put(ged.StaffMCode, con);
            }
            system.debug('upsertList==================>'+upsertList);
            if(upsertList.size() > 0 ){
                // Update updateList;
                Oly_TriggerHandler.bypass('ContactTriggerHandler');
                UpSert upsertList;
            }
 
            rowData.retry_cnt__c = 0;
            logstr += '\nend';
 
        }catch (Exception ex) {
            Integer batch_retry_max_cnt = Integer.valueOf(System.Label.batch_retry_max_cnt);
            // エラーが発生した場合
            Database.rollback(sp);
            logstr += '\n' + ex.getMessage();
            iflog.ErrorLog__c = ex.getMessage() + '\n' + ex.getStackTraceString() + '\n' + iflog.ErrorLog__c;
            // 异常重发
            rowData = NFMUtil.LogAutoSend(rowData, ex, null);
        }
        iflog.Log__c = logstr;
        upsert iflog;
        upsert rowData;
    }
 
    public static String verify(GeData ged){
        String result = '';
 
        if (ged.StaffMCode == null) {
            result += 'DataError: SFDC人员管理编码 [ StaffMCode ] is null!\n';
        }
        if (ged.HospitalMCode == null) {
            result += 'DataError: 医院管理编码 [ HospitalMCode ] is null!\n';
        }
        // if (ged.OfficeMCode == null) {
        //     result += 'DataError: 科室管理编码 [ OfficeMCode ] is null!\n';
        // }
        if (ged.HcpNo == null) {
            result += 'DataError: HCP编码 [ HcpNo ] is null!\n';
        }
        if (ged.HCPLevel == null) {
            result += 'DataError: HCP等级 [ HCPLevel ] is null!\n';
        }
        if (ged.Name == null) {
            result += 'DataError: 姓名 [ Name ] is null!\n';
        }
        if (ged.Mobile == null) {
            result += 'DataError: 电话 [ Mobile ] is null!\n';
        }
 
        return result;
    }
 
    public static Contact assignment(GeData ged,Contact con){//联系人数据赋值方法
        List<String> societyList = Breakup(ged.Society1);
        List<String> eventStatusList = Breakup(ged.EventStatus);
        con.NameOBPM__c             = ged.Name;//姓名
        con.MobileOBPM__c           = ged.Mobile;//电话
        con.stateOBPM__c            = ged.State;//省OBPM
        con.CityOBPM__c             = ged.City;//市OBPM
        con.HcpNo__c                = ged.HcpNo;//HPC编码
        con.HCPLevel__c             = ged.HCPLevel;//HCP等级
        con.OBPMDepartment__c       = ged.OfficeMCode;//OBPM科室
        con.WorkingSeniorityOBPM__c = ged.WorkingSeniority;  //临床工作年限
        con.TechnicalTitleOBPM__c   = ged.TechnicalTitle;//技术职称
        con.SpecialityOBPM__c       = ged.Speciality;//擅长的手术
        con.ProfessionalField__c    = ged.ProfessionalField;//专业领域
        //add by sushanhu 20220420 for pipl start 
        // con.HCPLevel_Encrypted__c   = ged.HCPLevelEncrypted;                     //zhj新方案改造 2022-12-07
        // con.NameOBPM_Encrypted__c   = ged.NameEncrypted;                         //zhj新方案改造 2022-12-07
        // con.MobileOBPM_Encrypted__c    = ged.MobileEncrypted;                    //zhj新方案改造 2022-12-07
        // con.WorkingSeniorityOBPM_Encrypted__c = ged.WorkingSeniorityEncrypted;   //zhj新方案改造 2022-12-07
        // con.TechnicalTitleOBPM_Encrypted__c = ged.TechnicalTitleEncrypted;       //zhj新方案改造 2022-12-07
        // con.ProfessionalField_Encrypted__c = ged.ProfessionalFieldEncrypted;     //zhj新方案改造 2022-12-07
        // con.SpecialityOBPM_Encrypted__c = ged.SpecialityEncrypted;               //zhj新方案改造 2022-12-07
        //con.AWS_Data_Id__c          = ged.DataId;/*迁移ali sushanhu 20231018
        //add by sushanhu 20220420 for pipl end
 
        if(societyList.size()>0){
            con.Learn_name1__c          = societyList[0];//学会名称1
        }
        if(societyList.size()>1){
            con.Learn_name2__c          = societyList[1];//学会名称2
        }
        if(societyList.size()>2){
            con.Learn_name3__c          = societyList[2];//学会名称3
        }
        if(eventStatusList.size()>0){
            con.Learn_serve1__c         = eventStatusList[0];//学会职称1
            // add by sushanhu for pipl 20220420 start
            //zhj新方案改造 2022-12-07 start
            // if(ged.EventStatusEncryptedList.size()>0){
            //      con.Learn_serve1_Encrypted__c =ged.EventStatusEncryptedList[0];
            // }
            //zhj新方案改造 2022-12-07 end
            // add by sushanhu for pipl 20220420 end
        }
        if(eventStatusList.size()>1){
            con.Learn_serve2__c         = eventStatusList[1];//学会职称2
            // add by sushanhu for pipl 20220420 start
            //con.Learn_serve2_Encrypted__c =ged.EventStatusEncryptedList[1];   //zhj新方案改造 2022-12-07
            // add by sushanhu for pipl 20220420 end
        }
        if(eventStatusList.size()>2){
            con.Learn_serve3__c         = eventStatusList[2];//学会职称3
            // add by sushanhu for pipl 20220420 start
            //con.Learn_serve3_Encrypted__c =ged.EventStatusEncryptedList[2];   //zhj新方案改造 2022-12-07
            // add by sushanhu for pipl 20220420 end
        }
        return con;
    }
 
    public static List<String> Breakup (String str){
        // List<string> over = new List<string>();
        // over = str.split('↑');
        List<string> over = str.split('↑');
        return over;
    }
 
                       
}