高章伟
2022-03-10 1312ba82d4c880bdb5357d28e0d4af5b285f610f
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
/**
 * @url:/services/apexrest/NFM704/execute
 * 
 */
 
@RestResource(urlMapping='/NFM704/*')
global with sharing class NFM704Rest {
 
    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; //学会职称
    }
 
    @HttpPost
    global static void doPost() {
        //取得接口传输内容
        String strData = RestContext.request.requestBody.toString();
        GeDatas ges = (GeDatas) JSON.deserializeStrict(strData, GeDatas.class);
    
        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);
        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];
            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;
                        con.FirstName = '';
                        con = assignment(ged,con);
                    }
                    upsertList.add(con);
                }else{//否
                    continue;
                    logstr += '不存在的医院管理编码:['+accMap.get(ged.HospitalMCode)+']/n';
                }
 
                // //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('ConsumableOrderTrigger');
                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;
    }
 
    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;//专业领域
        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
        }
        if(eventStatusList.size()>1){
            con.Learn_serve2__c         = eventStatusList[1];//学会职称2
        }
        if(eventStatusList.size()>2){
            con.Learn_serve3__c         = eventStatusList[2];//学会职称3
        }
        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;
    }
}