/**********************************************************************
 * 
 *
 * @url: /services/apexrest/NFM624Rest
 * @data:
 *  {
        
    }
*************************************************************************/

@RestResource(urlMapping = '/NFM624/*')
global with sharing class NFM624Rest {
    private static final String LOG_TYPE = 'NFM624';
    // global class GeDatasRest {
    //     public GeDatas GeDatas;
    // }

    global class GeDatas {
        public NFMUtil.Monitoring Monitoring;
        public GeData[] GeData;
    }

    global class GeData {
        public String ContactId; //统一平台ID
        public String ServiceUserId; //服务平台用户ID
        public String PersonManagementCode; //人员管理编码 
        public String HospitalManagementCode2; //医院平台编码  平台编码 PlatformCode__c
        public String DepartmentManagementCode2; //科室平台编码  平台编码 PlatformCode__c
        public String Name; //姓名
        public String Mobile; //手机号码
        public String State; //单位所在省份
        public String City; //市
        public String AccountName; //医院名
        public String RelatedHospital; //关联SFDC医院 客户管理编码(手写) AgentCode_Ext__c
        public String DepartmentClass; //战略科室
        public String DepartmentName; //所属科室
        public String RelatedDepartment; //关联SFDC科室 客户管理编码(手写) AgentCode_Ext__c
        public String Type; //职种
        public String ContactAddress; //联系地址
        public Boolean ForbiddenStatus; //平台用户禁用标识
        public String RegSource; //注册平台来源
        public Boolean AgentFlag; //经销商标识
        public String ApproverID; //审核人员员工编码
    }

    @HttpPost
    global static void execute() {

        // 取得接口传输内容
        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 = '{"status": "Success", "Message":""}';
        res.responseBody = blob.valueOf(jsonResponse);
        return;
    }


    @future
    global static void executefuture(String rowData_Id) {
        system.debug('进入executefuture方法' + rowData_Id);
        main(rowData_Id);
    }

    global static void main(String rowData_Id) {

        // Map<String,String> RecordTypeMap = new Map<String,String>();
        // RecordTypeMap.put('','')
        Map < string, string > RecordTypeMap = new Map < string, string > (); //存放记录类型Id 
        RecordTypeMap.put('呼吸科', '01210000000QfmR');
        RecordTypeMap.put('其他', '01210000000Qfmb');
        RecordTypeMap.put('妇科', '01210000000QfmM');
        RecordTypeMap.put('普外科', '01210000000QfmH');
        RecordTypeMap.put('泌尿科', '01210000000QfmC');
        RecordTypeMap.put('消化科', '01210000000Qfm7');
        RecordTypeMap.put('耳鼻喉科', '01210000000Qfm2');
        RecordTypeMap.put('ET', '01210000000QemQ');
        Integer batch_retry_max_cnt = Integer.valueOf(System.Label.batch_retry_max_cnt);
        BatchIF_Log__c rowData = [Select Id, Name, Log__c,Is_Error__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,NFM624_Secondary_processing__c  from BatchIF_Log__c where RowDataFlg__c = true and Id =: rowData_Id];
        String logstr = rowData.MessageGroupNumber__c + ' start\n';
        BatchIF_Log__c iflog = new BatchIF_Log__c();
        iflog.Type__c = LOG_TYPE;
        iflog.MessageGroupNumber__c = rowData.MessageGroupNumber__c;
        iflog.Log__c = logstr;
        iflog.ErrorLog__c = '';
        insert iflog;

        String rowDataStr = NFMUtil.getRowDataStr(rowData);
        List < GeData > GeDataList = (List < GeData > ) JSON.deserialize(rowDataStr, List < GeData > .class);
        if (GeDataList == null || GeDataList.size() == 0) {
            return;
        }
        //判空
        // for(GeData gda : GeDataList){
        //     string dataComplete = verify(gda);
        //     if(!String.isBlank(dataComplete)){
        //         logstr += dataComplete;
        //         continue;
        //     }
        // }

        Savepoint sp = Database.setSavepoint();
        List<string> ApproverIDList = new List <string>();//
        List < string > PersonManagementCodeList = new List < String > (); //人员管理编码List
        List < String > SFDCCodeList = new List < String > (); //关联SFDC医院、科室List
        List < String > ManagementList = new List < String > (); //医院、科室平台编码List
        List < String > StateList = new List < String > ();
        List < String > CityList = new List < String > ();
        try { //根据传过来的管理编码查询如果可以查询得到结果则更新，查询不到则新增
            List < Gedata > newGeDataList = new List < Gedata > ();
            for (Gedata gedata: GeDataList) {
                string dataComplete = verify(gedata);
                if (!String.isBlank(dataComplete)) {
                    logstr += dataComplete;
                    rowData.Is_Error__c = 1;
                    continue;
                }
                if (!gedata.AgentFlag) {
                    StateList.add(gedata.State);
                    CityList.add(gedata.City);
                    ApproverIDList.add(gedata.ApproverID);
                    ManagementList.add(gedata.HospitalManagementCode2);
                    ManagementList.add(gedata.DepartmentManagementCode2);
                    //system.debug('AccountCodeList'+AccountCodeList);
                    if (string.isnotblank(gedata.RelatedHospital)) {
                        SFDCCodeList.add(gedata.RelatedHospital);
                    }
                    if (string.isnotblank(gedata.RelatedDepartment)) {
                        SFDCCodeList.add(gedata.RelatedDepartment);
                    }
                }
                if (string.isnotblank(gedata.PersonManagementCode)) {
                    PersonManagementCodeList.add(gedata.PersonManagementCode);
                }
                newGeDataList.add(gedata);
                System.debug('ManagementList'+ManagementList);
                System.debug('SFDCCodeList'+SFDCCodeList);
                
            }
            if (newGeDataList.size() > 0) {
                //查询省份Id
                Map < String, String > StateMap = new Map < String, String > (); //省Map
                List < Address_Level__c > statetempList = [select Id, Name from Address_Level__c where Name IN: StateList];
                for (Address_Level__c temp: statetempList) {
                    StateMap.put(temp.Name, temp.Id);
                }
                //查询市区Id 
                Map < String, String > CityMap = new Map < String, String > (); //市Map
                List < Address_Level2__c > citytempList = [select Id, Name from Address_Level2__c where Name IN: CityList];
                for (Address_Level2__c temp: citytempList) {
                    CityMap.put(temp.Name, temp.Id);
                }

                //查询医院所有人
                Map<string,String> ownerMap = new Map<string,String>();
                List<User> ownerList = [select Id,Employee_No__c from User where Employee_No__c  IN:ApproverIDList];
                for(User temp : ownerList){
                    ownerMap.put(temp.Employee_No__c,temp.Id);
                }

                //查询OCSM营业窗口
                Map<string,Id> OCSMMap = new Map<string,Id>();
                List<OCM_Management_Province__c> OCSMList = [select Id,Name,Window1__c from OCM_Management_Province__c];
                for(OCM_Management_Province__c ocsm : OCSMList){
                    OCSMMap.put(ocsm.name,ocsm.Window1__c);
                }

                //查询联系人
                Map < String, Map < String, Contact >> nameMap = new Map < String, Map < String, Contact >> (); //外层战略科室，内层科室名+联系人名
                List < Contact > peopleList = [select Id, 
                                                      Account.Name, 
                                                      Department__c, 
                                                      Account.parent.Name, 
                                                      Account.PlatformCode__c, 
                                                      Account.Management_Code__c, 
                                                      Account.parent.Department_Class_Label__c, 
                                                      Name, 
                                                      Account.Parent_Management_Code__c, 
                                                      Account.Parent_PlatformCode__c, 
                                                      CManageCode__c, 
                                                      AccountId 
                                                      from Contact 
                                                      where CManageCode__c IN: PersonManagementCodeList 
                                                      OR Account.Parent_PlatformCode__c IN: ManagementList 
                                                      OR Account.Parent_Management_Code__c IN: SFDCCodeList]; //根据人员管理编码检索联系人
                Map < String, Contact > peopleMap = new Map < String, Contact > (); //联系人
                system.debug('peopleList  '+peopleList);
                for (Contact ct: peopleList) {
                    if (string.isnotblank(ct.Account.parent.Name)) {
                        Map < String, Contact > snameMap = new Map < String, Contact > ();
                        string Name = ct.Name.replaceAll(' ','');
                        string namekey = ct.Account.Name + ' ' + Name;
                        // snameMap.put(namekey,ct);
                        if (nameMap.containsKey(ct.Account.parent.Name)) {
                            snameMap = nameMap.get(ct.Account.parent.Name);
                        }
                        snameMap.put(namekey, ct);
                        snameMap.put(ct.Name, ct);
                        nameMap.put(ct.Account.parent.Name, snameMap);
                    }
                    peopleMap.put(ct.CManageCode__c, ct);
                    System.debug('peopleMap'+peopleMap);
                    // peopleMap.put(ct.Name, ct);
                    //string temp = ct.Name + ct.Account.parent.Department_Class_Label__c;
                    // peopleMap.put(temp, ct);
                }

                //查询医院科室
                //List<Account> AccountList = [select Id,PlatformCode__c,PlatformCode__c,Department_Class_Label__c,Name,Management_Code__c,Is_Active__c,AgentCode_Ext__c,ParentId,Parent.ParentId from Account where PlatformCode__c IN :HpCodeList OR parent.PlatformCode__c IN :HpCodeList OR PlatformCode__c IN :HpCodeList OR  Management_Code__c IN :RelatedHospitalList OR Parent_Management_Code__c IN :RelatedHospitalList];
                //List < Account > AccountList = [select Id, PlatformCode__c, Department_Class_Label__c, Name, Management_Code__c, Is_Active__c, AgentCode_Ext__c, ParentId, Parent.ParentId from Account where Management_Code__c IN :AccountCodeList OR Parent_Management_Code__c IN :AccountCodeList OR PlatformCode__c IN :AccountCodeList OR Parent.Parent.PlatformCode__c IN :AccountCodeList];
                List < Account > AccountList = [select Id, 
                                                       PlatformCode__c, 
                                                       Is_Active_Formula__c, 
                                                       Department_Class_Label__c,
                                                       OCM_man_province_HP__c, 
                                                       Name, Management_Code__c, 
                                                       Is_Active__c, AgentCode_Ext__c, 
                                                       ParentId, 
                                                       Parent.ParentId, 
                                                       OwnerId
                                                       from Account 
                                                       where Parent_PlatformCode__c IN: ManagementList 
                                                       OR Parent_Management_Code__c IN: SFDCCodeList];
                Map <String,Account> DepartmentClassMap = new Map <String,Account>();//战略科室Map
                Map < String, Account > AccountMap = new Map < String, Account > (); //医院科室
                for (Account ac: AccountList) {
                    AccountMap.put(ac.Management_Code__c, ac);
                    if(string.isNotBlank(ac.Department_Class_Label__c)){
                        DepartmentClassMap.put(ac.Department_Class_Label__c,ac);
                    }
                    if (string.isNotBlank(ac.PlatformCode__c)) {
                        AccountMap.put(ac.PlatformCode__c, ac);
                    }
                }
                system.debug('AccountMap       '+AccountMap);
                System.debug('DepartmentClassMap     '+DepartmentClassMap);


                //客户List（更新用）
                List < Account > upsertAccountList = new List < Account > ();
                //联系人List（更新用） 
                List < Contact > upsertContactList = new List < Contact > ();

                for (Gedata gedata: newGeDataList) {
                    logstr += gedata.Name;
                    logstr += gedata.AccountName;
                    logstr += gedata.DepartmentClass;
                    logstr += gedata.DepartmentName;


                    string comefrom = gedata.RegSource == '1' ? '智慧医疗' : '服务客户端'; //平台来源

                    //新建医院
                    Account hp = new Account();

                    //新建联系人
                    Contact ct = new Contact();
                    ct.LastName = gedata.Name;
                    ct.FirstName = '';
                    ct.Type__c = gedata.Type;
                    ct.MobilePhone = gedata.Mobile;
                    ct.RegSource__c = comefrom;
                    ct.UnifiedI_Contact_ID__c = gedata.ContactId; //统一平台Id
                    ct.ServicePlatformCode__c = gedata.ServiceUserId; //服务平台用户Id
                    ct.Contact_address__c = gedata.ContactAddress;//联系地址
                    ct.Platform_disabled_representation__c = gedata.ForbiddenStatus;//平台禁用标识
                    //ct.IsFromPlatform__c = true; //来自智慧医疗创建
                    ct.Ignore_Same_Name__c = true; //不是重复的客户名 
                    //ct.SendToComPlat__c = true;

                    String personCode = gedata.PersonManagementCode;

                    Map < String, Contact > contactMap = new Map < String, Contact > ();//用于暂存更新联系人
                    //1经销商true
                    if (gedata.AgentFlag == true) {
                        //更新经销商联系人
                        if (!peopleMap.containsKey(personCode)) {
                            logstr += 'error:人员管理编码 [PersonManagementCode] 对应的联系人不存在，此条数据跳过';
                            continue;
                        }
                        ct.id = peopleMap.get(personCode).id;
                        upsertContactList.add(ct);
                    } else { //经销商flase
                        string HospitalCode = string.isNotBlank(gedata.RelatedHospital) ? gedata.RelatedHospital : gedata.HospitalManagementCode2; //RelatedHospital有值用RelatedHospital，否则用HospitalManagementCode2
                        //医院存在
                        System.debug('AccountMap.containsKey(HospitalCode      )'+AccountMap.containsKey(HospitalCode));
                        if (AccountMap.containsKey(HospitalCode)) {
                            //新建科室
                            Account dpt = new Account(); 
                            Account hospital = AccountMap.get(HospitalCode);
                            dpt.PlatformCode__c = gedata.DepartmentManagementCode2;
                            dpt.Hospital__c = hospital.Id;
                            
                            //判断医院是否有效
                            if ('有效'.equals(hospital.Is_Active_Formula__c)) { 
                                string DepartmentCode = string.isNotBlank(gedata.RelatedDepartment) ? gedata.RelatedDepartment : gedata.DepartmentManagementCode2;
                                string DepartmentClasskey = gedata.AccountName + ' ' + gedata.DepartmentClass;
                                //科室存在
                                if (AccountMap.containsKey(DepartmentCode)) {
                                    //人员管理编码存在
                                    ct.AccountId = AccountMap.get(DepartmentCode).id;//科室确定，将联系人挂在该科室下
                                    ct.OwnerId = AccountMap.get(DepartmentCode).OwnerId;//可是确定，将将联系人所有人的值赋为科室所有人
                                    system.debug('personCode' + personCode);
                                    if (string.isnotblank(personCode)) {
                                        system.debug('人员管理编码存在');
                                        //联系人存在 1 完成
                                        if (peopleMap.containsKey(personCode)) {
                                            system.debug('1逻辑 有医院 有科室 有人员管理编码且查找有此人 动作：更新');
                                            ct.Id = peopleMap.get(personCode).Id;
                                            upsertContactList.add(ct);
                                        } else { //联系人不存在 2 完成
                                            system.debug('2逻辑 有医院 有科室 有人员管理编码但查找无此人 动作：报错');
                                            logstr += 'error:人员管理编码 [PersonManagementCode] 对应的联系人不存在，此条数据跳过';
                                            continue;
                                        }
                                    } else { //人员管理编码不存在
                                        //搜索人名/且在当前战略科室科室下
                                        System.debug('人员管理编码不存在');
                                        string namekey =  gedata.Name;
                                        system.debug('DepartmentClasskey     =    '+DepartmentClasskey);
                                        system.debug('nameMap22222222    '+nameMap);
                                        if (nameMap.containskey(DepartmentClasskey)) { // 6 完成 更新操作
                                            Map < String, Contact > sMap = nameMap.get(DepartmentClasskey);
                                            if (sMap.containsKey(namekey)) {
                                                system.debug('Id赋值'+sMap);
                                                ct.id = sMap.get(namekey).id;
                                            } else { // 7 完成
                                                system.debug('7逻辑 无人员管理编码 有医院 有科室 人名查找无 动作：新建联系人 ');
                                            }
                                        }
                                        upsertContactList.add(ct);
                                    }
                                    dpt.Id = AccountMap.get(DepartmentCode).Id;
                                    upsertAccountList.add(dpt);
                                } else { //科室不存在 
                                    //为科室赋值
                                    dpt.Name = gedata.DepartmentName;
                                    dpt.RecordTypeId = RecordTypeMap.get(gedata.DepartmentClass);
                                    dpt.Department_Class__c = DepartmentClassMap.get(gedata.DepartmentClass).Id;
                                    dpt.ParentId = DepartmentClassMap.get(gedata.DepartmentClass).Id;
                                    if (string.isnotblank(personCode)) { //人员管理编码存在
                                        if (peopleMap.containsKey(personCode)) { //人员管理编码查找有值 3 完成
                                            System.debug('3逻辑');
                                            //新建科室+新建联系人, 
                                            ct.id = peopleMap.get(personCode).id;
                                            contactMap.put(Gedata.DepartmentManagementCode2, ct);
                                            system.debug('contactMap        '  +  contactMap);
                                            dpt.Department_Name__c = gedata.DepartmentName;
                                            upsertAccountList.add(dpt);
                                            //upsertContactList.add(ct);
                                        } else { //人员管理编码查找无值 4 完成
                                            system.debug('4逻辑');
                                            logstr += 'error:人员管理编码 [PersonManagementCode] 对应的联系人不存在，此条数据跳过';
                                            continue;
                                        }
                                    } else { //人员管理编码不存在
                                        system.debug('人员管理编码不存在');
                                        string namekey = gedata.DepartmentName+ ' ' + gedata.Name;
                                        //string namekey = gedata.AccountName + ' ' + gedata.DepartmentName + ' ' + gedata.DepartmentClass + ' ' + gedata.Name;
                                        system.debug('DepartmentClasskey'+DepartmentClasskey);
                                        system.debug('351nameMap     '+nameMap);
                                        if (nameMap.containsKey(DepartmentClasskey)) { //查找是否存在该战略科室 
                                            System.debug('人员管理编码不存在的情况下战略科室存在');
                                            system.debug('战略科室存在' + nameMap.get(DepartmentClasskey));
                                            Map < String, Contact > sMap = nameMap.get(DepartmentClasskey);
                                            if (sMap.containsKey(namekey)) { //查找存在 8 完成
                                                system.debug('8逻辑');
                                                system.debug('该联系人存在');
                                                ct.id = sMap.get(namekey).id;
                                                upsertAccountList.add(dpt);
                                                upsertContactList.add(ct);
                                                // if(sMap.containsKey(gedata.Name)){
                                                //     ct.Id = sMap.get(gedata.Name).Id;
                                                // }
                                            }else if(sMap.containsKey(gedata.Name)){
                                                system.debug('1234567890');
                                                ct.Id = sMap.get(gedata.Name).Id;
                                                //upsertAccountList.add(dpt);
                                            }
                                            system.debug('contactMap        '  +  contactMap);
                                            System.debug('9逻辑');
                                            contactMap.put(Gedata.DepartmentManagementCode2, ct);
                                        }
                                        system.debug('创建联系人和科室');
                                        dpt.Department_Name__c = gedata.DepartmentName;
                                        upsertAccountList.add(dpt);
                                        contactMap.put(Gedata.DepartmentManagementCode2, ct);
                                    }
                                }
                            }else if('无效'.equals(hospital.Is_Active_Formula__c)){
                                logstr += 'error:该医院无效，此条数据跳过';
                                continue;
                            }else{
                                logstr += '该医院处于草案中，请等待审批完成';
                                rowData.NFM624_Secondary_processing__c = false;
                                continue;
                            }
                        } else { //医院不存在
                            system.debug('新建医院 逻辑5逻辑10 无论人员管理编码是否有值都需要新建医院');
                            hp.Name = gedata.AccountName; //医院名赋值  
                            if(ownerMap.containsKey(gedata.ApproverID)){
                                hp.OwnerId = ownerMap.get(gedata.ApproverID);//审核人员员工编码赋值给用户所有人
                            }
                            hp.RecordTypeId = '01210000000QemG';    
                            hp.OCM_Category__c = 'L';
                            hp.PlatformCode__c = gedata.HospitalManagementCode2;
                            hp.State_Master__c = StateMap.get(gedata.State); //  省
                            hp.City_Master__c = CityMap.get(gedata.City); //     市
                            hp.Hospital_Source__c = '智慧医疗';
                            upsertAccountList.add(hp);
                            System.debug('upsertAccountList'+upsertAccountList);
                            rowData.NFM624_Secondary_processing__c = false;//数据需要二次处理标记
                        }
                    }
                    system.debug('upsertContactList      ' + upsertContactList);
                    system.debug('upsertAccountList      ' + upsertAccountList);
                    if (upsertAccountList.size() > 0) {
                        ControllerUtil.EscapeNFM001Trigger = true;
                        StaticParameter.EscapeNFM001AgencyContractTrigger2 = true;
                        system.debug('upsertAccountList                           ' + upsertAccountList);
                        upsert upsertAccountList;
                        List < Account > List1 = [select Id,RecordTypeId,Is_Active__c,PlatformCode__c,OCM_man_province_HP__c,OwnerId from Account where PlatformCode__c In: SFDCCodeList OR PlatformCode__c IN: ManagementList];//客户所有人修改11.18 11.35 未完成
                        List<Account> updateHPList = new  List<Account>(); 
                        for (Account ac: List1) {
                            Contact c = new contact();
                            if(ContactMap.containsKey(ac.PlatformCode__c)){
                                c = contactMap.get(ac.PlatformCode__c);
                                if(string.isblank(c.Id)|| c.AccountId != ac.Id){
                                    c.Accountid = ac.id;
                                }
                                c.OwnerId = ac.OwnerId;
                                upsertContactList.add(c);
                                system.debug('OwnerId'+ac.OwnerId);
                                system.debug('upsertContactList'+upsertContactList);
                            }

                            if(ac.RecordTypeId == '01210000000QemGAAS' && ac.Is_Active__c == '草案中' && string.isNotBlank( OCSMMap.get(ac.OCM_man_province_HP__c))){
                                ac.OwnerId = OCSMMap.get(ac.OCM_man_province_HP__c);
                                updateHPList.add(ac);
                            }
                            if(updateHPList.size()>0){
                                update updateHPList;
                            }
                        }
                    }
                    
                    upsert upsertAccountList;
                    system.debug('upsertContactList11111111111      '+upsertContactList);
                    if(upsertContactList.size()>0){
                        upsert upsertContactList;
                        rowData.NFM624_Secondary_processing__c = true;//执行完之后修改为true，不需要再次执行
                        //2022/2/10 修改 在新建联系人之后手动执行NFM620RestBatch NFM623RestBatch
                        // Database.executeBatch(new NFM620RestBatch(), 1);
                        // Database.executeBatch(new NFM623RestBatch(), 1);
                        // supplement(gedata.ContactId);
                    }
                }
            }
            rowData.retry_cnt__c = 0;
            
            logstr += '\nend';
        } catch (Exception ex) {
            // エラーが発生した場合
            Database.rollback(sp);
            System.debug(Logginglevel.ERROR, LOG_TYPE + '_' + rowData.MessageGroupNumber__c + ':' + ex.getMessage());
            System.debug(Logginglevel.ERROR, LOG_TYPE + '_' + rowData.MessageGroupNumber__c + ':' + ex.getStackTraceString());
            logstr += '\n' + ex.getMessage();
            iflog.ErrorLog__c = ex.getMessage() + '\n' + ex.getStackTraceString() + '\n' + iflog.ErrorLog__c;
            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 + '错误次数已经超过自动收信设定的最大次数，请手动收信';
            }
        }
        update rowData;
        iflog.Log__c = logstr;
        if (iflog.Log__c.length() > 131072) {
            iflog.Log__c = iflog.Log__c.subString(0, 131065) + ' ...';
        }
        if (iflog.ErrorLog__c.length() > 32768) {
            iflog.ErrorLog__c = iflog.ErrorLog__c.subString(0, 32760) + ' ...';
        }
        update iflog;
    }

    private static String verify(GeData gda) {
        String result = '';
        if (string.isblank(gda.ContactId)) {
            result += 'DataError: ContactId 统一平台ID为空\n';
        }
        if (gda.AgentFlag == null) {
            result += 'DataError:经销商标识为空\n';
        }
        if (string.isblank(gda.Name)) {
            result += 'DataError：姓名为空\n';
        }
        if (string.isblank(gda.Mobile)) {
            result += 'DataError：手机号为空\n';
        }
        if (string.isblank(gda.RegSource)) {
            result += 'DataError：注册平台来源为空\n';
        }
        if (gda.AgentFlag) {
            if (string.isblank(gda.PersonManagementCode)) {
                result += 'DataError：PersonManagementCode 人员管理编码为空\n';
            }
        } else {
            // if (string.isnotblank(gda.PersonManagementCode) && string.isBlank(gda.RelatedHospital)) {
            //     result += 'DataError: 关联医院编码为空\n';
            // }
            if(string.isBlank(gda.RelatedDepartment) && String.isBlank(gda.ApproverID)){
                result += 'DataError: 在关联SFDC科室[RelatedDepartment]为空时，审核人员员工编码[ApproverID]必填\n';
            }
            if (string.isblank(gda.HospitalManagementCode2)) {
                result += 'DataError：医院平台编码为空\n';
            }
            if (string.isblank(gda.DepartmentManagementCode2)) {
                result += 'DataError：科室平台编码为空\n';
            }
            if (string.isblank(gda.State)) {
                result += 'DataError：省字段为空\n';
            }
            if (string.isblank(gda.City)) {
                result += 'DataError：市字段为空\n';
            }
            if (string.isblank(gda.AccountName)) {
                result += 'DataError：医院名为空\n';
            }
            if (string.isblank(gda.DepartmentName)) {
                result += 'DataError：所属科室为空\n';
            }
            if (string.isblank(gda.Type)) {
                result += 'DataError：职种分类为空\n';
            }
        }
        return result;
    }
    // global static String contactAllName(String contactName){
    //     // 中国 复姓大全
    //     String CompoundSurname = '濮阳、公冶、太叔、申屠、公孙、慕容、仲孙、钟离、长孙、宇文、司徒、鲜于、司空、闾丘、子车、亓官、司寇、巫马、公西、颛孙、壤驷、公良、漆雕、乐正、宰父、谷梁、拓跋、夹谷、轩辕、令狐、段干、百里、呼延、东郭、南门、羊舌、微生、公户、公玉、公仪、梁丘、公仲、公上、公门、公山、公坚、左丘、公伯、西门、公祖、第五、公乘、贯丘、公皙、南荣、东里、东宫、仲长、子书、子桑、即墨、达奚、褚师、吴铭';
    //     // string allname = '朱启贤';
    //     // contactName = '第五惆怅';
    //     String lastName = '';
    //     String firstName = '';
    //     String result = '';
    //     if (contactName.contains('·')) {
    //         lastName = contactName.split('·')[0];
    //         firstName = contactName.split('·')[1];
    //     } else {
    //         if (contactName.length() > 2) {

    //             system.debug('CompoundSurname--->01' + contactName.subString(0, 2));
    //             if (CompoundSurname.contains(contactName.subString(0, 2))) {
    //                 lastName = contactName.substring(0,2);
    //                 firstName = contactName.substring(2,contactName.length());
    //                 system.debug('lastName--->'+lastName);
    //                 system.debug('firstName--->'+firstName);
    //             } else {
    //                 lastName = contactName.substring(0,1);
    //                 firstName = contactName.substring(1,contactName.length());
    //                 system.debug('lastName--->'+lastName);
    //                 system.debug('firstName--->'+firstName);           
    //             }
    //         } else {
    //             if (contactName.length() == 2) {
    //                 lastName = contactName.substring(0,1);
    //                 firstName = contactName.substring(1,contactName.length());
    //                 system.debug('lastName--->'+lastName);
    //                 system.debug('firstName--->'+firstName);
    //             } else {
    //                 lastName = contactName;
    //                 firstName = contactName;
    //                 system.debug('lastName--->'+lastName);
    //                 system.debug('firstName--->'+firstName);
    //             }
    //         }
    //     }
    //     if (!contactName.equals(lastName+firstName)) {
    //         lastName = contactName;
    //         firstName = contactName;
    //     }
    //     result = lastName + '_' + firstName;
    //     //system.debug('CompoundSurname--->02' + CompoundSurname);
    //     return result;
    // }

    private static void supplement (String ContactId){
        //把620Batch 和 623Batch 搬过来
        //补充询问单部分 start
        //更新用
        List<Inquiry_form__c> inquiryFormList = new List<Inquiry_form__c>();
        //根据统一用户Id查询询问单
        List<Inquiry_form__c> InquiryList = [select Id,Inquiry_No__c,ContactId__c,Hospital_Name__c,Department_Class__c,Contact_Name__c from Inquiry_form__c where ContactId__c = :ContactId];
        system.debug('InquiryList'+InquiryList);
        //根据统一用户Id查询联系人
        List<Contact> contactList = [select Id,Name,UnifiedI_Contact_ID__c,Account.Id,Strategic_dept_Class__c,AccountId,Account.Name,Strategic_dept_Class__r.OwnerId from Contact where UnifiedI_Contact_ID__c = :ContactId];
        system.debug('contactList' + contactList);
        //统一用户ID存入List、询问单ID存Map
        Map<String, String> inquiryMap = new Map<String, String>();
        //List<String> contactIdList = new List<String>();
        for (Inquiry_form__c inquiryInfo : inquiryList) {
            //contactIdList.add(inquiryInfo.ContactId__c);
            inquiryMap.put(inquiryInfo.ContactId__c, inquiryInfo.Id);
        }
        if (contactList.size() >0 ) {
            for (Contact contactInfo : contactList) {
                Inquiry_form__c inquiry = new Inquiry_form__c();
                inquiry.Id = inquiryMap.get(contactInfo.UnifiedI_Contact_ID__c);      //ID
                inquiry.Hospital_Name__c = contactInfo.Account.Id;                    //科室名   
                inquiry.Department_Class__c = contactInfo.Strategic_dept_Class__c;    //战略科室分类
                inquiry.Contact_Name__c = contactInfo.Id;                             //客户姓名
                inquiry.OwnerId = contactInfo.Strategic_dept_Class__r.OwnerId;        //所有人
                inquiryFormList.add(inquiry);
            }
        }
        if(inquiryFormList.size()>0){
            update inquiryFormList;
        }
        //补充询问单部分 end
        
        //补充学会部分 start
        List<CampaignMember__c> campaignMemberList = new List<CampaignMember__c>();
        List<CampaignMember__c> capMemList = [select Id,Contact_ID__c,Campaign__c,Campaign__r.Num__c,ViewContactId__c from CampaignMember__c where Contact_ID__c = :ContactId];
        Map<String, String> capMemMap = new Map<String, String>(); 
        //统一用户ID存入List,参会人员记录ID存入MAP
        //List<String> contactIdList = new List<String>();
        for (CampaignMember__c capMemInfo : capMemList) {
            //contactIdList.add(capMemInfo.ViewContactId__c);
            capMemMap.put(capMemInfo.ViewContactId__c,capMemInfo.Id);
        }
        //List<Contact> contactList = [select Id,Name,UnifiedI_Contact_ID__c,Account.Id,Strategic_dept_Class__c,AccountId,Account.Name,Strategic_dept_Class__r.OwnerId,Id from Contact where UnifiedI_Contact_ID__c = ContactId];
        if (contactList.size() > 0) {
            for (Contact contactInfo : contactList) {
                CampaignMember__c camMemberInfo = new CampaignMember__c();
                camMemberInfo.Id = capMemMap.get(contactInfo.UnifiedI_Contact_ID__c);
                camMemberInfo.Contact_ID__c = contactInfo.ID;                   //参会人员ID
                camMemberInfo.Department_ID__c = contactInfo.AccountId;         //医院科室
                camMemberInfo.Department__c = contactInfo.Account.Name;         //医院科室（文本）
                camMemberInfo.Contact__c = contactInfo.Name;                    //客户人员姓名
                campaignMemberList.add(camMemberInfo);
            }
            
        }
        if (campaignMemberList.size() > 0) {
            update campaignMemberList;
        }
        //补充学会部分 end
    }
}