//拜访次数
//获取日报的拜访次数

global class ConsumableTargetManageBatch3 implements Database.Batchable<sObject> {
    public Date currentMonth;
    public Date endDate;
    public Date startDate;
    public String queryStr;
    public String year;
    public Boolean isIncrementOnly; //是否只跑增量
    global ConsumableTargetManageBatch3(Date startDate,Date endDate,Boolean isIncrementOnly) {
        //当年
        this.startDate=startDate;
        this.endDate=endDate;
        this.isIncrementOnly=isIncrementOnly;
        queryStr = 'SELECT id,Hospital_ID__c,etapp_third_category__c,etapp_third_category2__c,etapp_third_category3__c,etapp_forth_category__c,etapp_forth_category2__c,etapp_forth_category3__c,ActivityDate__c'
                  +' FROM Event__c ' 
                  +' WHERE (Status__c=\'申請中\' OR Status__c=\'承認\') AND Hospital_ID__c!=null '
                  +' AND ((etapp_third_category__c !=null AND etapp_forth_category__c!=null) '
                  +' OR (etapp_third_category2__c !=null AND etapp_forth_category2__c!=null)  '
                  +' OR (etapp_third_category3__c !=null AND etapp_forth_category3__c!=null) ) '
                  +' AND ActivityDate__c>=:startDate AND ActivityDate__c<=:endDate';
    }

    global Database.QueryLocator start(Database.BatchableContext bc) {
        //如果跑全量数据，需要重置
        //数据超过一万条会报错
        if(!isIncrementOnly){
            // Integer year = startDate.year();
            // Integer FYear = year;
            // if(startDate>=Date.newInstance(year, 4, 1)){
            //     FYear = FYear+1;
            // }
            // String  OCSMYear= 'FY'+FYear;
            // List<ConsumableTargetManage__c> ctmList= [SELECT  id FROM ConsumableTargetManage__c WHERE OCM_Year__c = :OCSMYear ];
            // for(ConsumableTargetManage__c ctm:ctmList){
            //     ctm.SpecialistVisitsNum1__c=0;
            //     ctm.SpecialistVisitsNum2__c=0;
            //     ctm.SpecialistVisitsNum3__c=0;
            //     ctm.SpecialistVisitsNum4__c=0;
            //     ctm.SpecialistVisitsNum5__c=0;
            //     ctm.SpecialistVisitsNum6__c=0;
            //     ctm.SpecialistVisitsNum7__c=0;
            //     ctm.SpecialistVisitsNum8__c=0;
            //     ctm.SpecialistVisitsNum9__c=0;
            //     ctm.SpecialistVisitsNum10__c=0;
            //     ctm.SpecialistVisitsNum11__c=0;
            //     ctm.SpecialistVisitsNum12__c=0;
            // }
            // update ctmList;
        }
        return Database.getQueryLocator(queryStr);
    }

    global void execute(Database.BatchableContext BC, list<Event__c> scope) {
        System.debug('获取到报告一览:');
        System.debug(scope);
        Integer year = startDate.year();
        Integer FYear = year;
        if(startDate>=Date.newInstance(year, 4, 1)){
            FYear = FYear+1;
        }

        String  OCSMYear= 'FY'+FYear;        
        Set<String> ctmKeySet=new Set<String>();
        Map<String,List<Event__c>> eventMap = new Map<String,List<Event__c>>();
        Map<String,String> hpIdMap=new Map<String,String>();
        List<String> hpIdList=new List<String>();
        for(Event__c event:scope){
            hpIdList.add(event.Hospital_ID__c);
        }
        List<Account> accList=[SELECT id from Account where id IN :hpIdList];
        for(Account acc:accList){
            String id=acc.Id;
            hpIdMap.put(id.substring(0,15),id);
        }
        for(Event__c event:scope){
            String key1=event.etapp_third_category__c+'-'+event.etapp_forth_category__c+'-'+event.Hospital_ID__c;
            String key2=event.etapp_third_category2__c+'-'+event.etapp_forth_category2__c+'-'+event.Hospital_ID__c;
            String key3=event.etapp_third_category3__c+'-'+event.etapp_forth_category3__c+'-'+event.Hospital_ID__c;
            String eventHpId=hpIdMap.get(event.Hospital_ID__c);
            ctmKeySet.add(eventHpId+'-'+event.etapp_third_category__c+'-'+event.etapp_forth_category__c+'-'+OCSMYear);
            ctmKeySet.add(eventHpId+'-'+event.etapp_third_category2__c+'-'+event.etapp_forth_category2__c+'-'+OCSMYear);
            ctmKeySet.add(eventHpId+'-'+event.etapp_third_category3__c+'-'+event.etapp_forth_category3__c+'-'+OCSMYear);
            
            if(eventMap.containsKey(key1)){
                eventMap.get(key1).add(event);
            }else{
                List<Event__c> eventList = new List<Event__c>();
                eventList.add(event);
                eventMap.put(key1,eventList);
            }

            if(eventMap.containsKey(key2)){
                eventMap.get(key2).add(event);
            }else{
                List<Event__c> eventList = new List<Event__c>();
                eventList.add(event);
                eventMap.put(key2,eventList);
            }

            if(eventMap.containsKey(key3)){
                eventMap.get(key3).add(event);
            }else{
                List<Event__c> eventList = new List<Event__c>();
                eventList.add(event);
                eventMap.put(key3,eventList);
            }
        }


        List<ConsumableTargetManage__c> ctmList= [SELECT  SpecialistVisitsNum1__c,SpecialistVisitsNum2__c,SpecialistVisitsNum3__c,
             SpecialistVisitsNum4__c,SpecialistVisitsNum5__c,SpecialistVisitsNum6__c,SpecialistVisitsNum7__c,SpecialistVisitsNum8__c,
             SpecialistVisitsNum9__c,SpecialistVisitsNum10__c,SpecialistVisitsNum11__c,SpecialistVisitsNum12__c,
             Hospital__c,OCM_Year__c,Category3__c,Category4__c FROM ConsumableTargetManage__c WHERE OCM_Year__c = :OCSMYear  AND ConsumableTargetManageKey__c in :ctmKeySet];

        for(ConsumableTargetManage__c ctm:ctmList){
            String hpId='';
            if(ctm.Hospital__c!=null){
                hpId=ctm.Hospital__c;
                hpId=hpId.substring(0,15);
            }
            String key=ctm.Category3__c+'-'+ctm.Category4__c+'-'+ hpId;
            if(ctm.SpecialistVisitsNum1__c==null){
                ctm.SpecialistVisitsNum1__c=0;
            }
            if(ctm.SpecialistVisitsNum2__c==null){
                ctm.SpecialistVisitsNum2__c=0;
            }
            if(ctm.SpecialistVisitsNum3__c==null){
                ctm.SpecialistVisitsNum3__c=0;
            }
            if(ctm.SpecialistVisitsNum4__c==null){
                ctm.SpecialistVisitsNum4__c=0;
            }
            if(ctm.SpecialistVisitsNum5__c==null){
                ctm.SpecialistVisitsNum5__c=0;
            }
            if(ctm.SpecialistVisitsNum6__c==null){
                ctm.SpecialistVisitsNum6__c=0;
            }
            if(ctm.SpecialistVisitsNum7__c==null){
                ctm.SpecialistVisitsNum7__c=0;
            }
            if(ctm.SpecialistVisitsNum8__c==null){
                ctm.SpecialistVisitsNum8__c=0;
            }
            if(ctm.SpecialistVisitsNum9__c==null){
                ctm.SpecialistVisitsNum9__c=0;
            }
            if(ctm.SpecialistVisitsNum10__c==null){
                ctm.SpecialistVisitsNum10__c=0;
            }
            if(ctm.SpecialistVisitsNum11__c==null){
                ctm.SpecialistVisitsNum11__c=0;
            }
            if(ctm.SpecialistVisitsNum12__c==null){
                ctm.SpecialistVisitsNum12__c=0;
            }
            if(eventMap.containsKey(key)){
                List<Event__c> eventList=eventMap.get(key);

                System.debug('修改前:'+ctm);
                System.debug('event:'+eventList);
                for(Event__c event:eventList){
                    if(event.ActivityDate__c >= Date.newInstance(FYear, 1, 1) && event.ActivityDate__c < Date.newInstance(FYear, 2, 1)){
                        ctm.SpecialistVisitsNum1__c++;
                    }else if(event.ActivityDate__c >= Date.newInstance(FYear, 2, 1) && event.ActivityDate__c < Date.newInstance(FYear, 3, 1)){
                        ctm.SpecialistVisitsNum2__c++;
                    }else if(event.ActivityDate__c >= Date.newInstance(FYear, 3, 1) && event.ActivityDate__c < Date.newInstance(FYear, 4, 1)){
                        ctm.SpecialistVisitsNum3__c++;
                    }else if(event.ActivityDate__c >= Date.newInstance(FYear-1, 4, 1) && event.ActivityDate__c < Date.newInstance(FYear-1, 5, 1)){
                        ctm.SpecialistVisitsNum4__c++;
                    }else if(event.ActivityDate__c >= Date.newInstance(FYear-1, 5, 1) && event.ActivityDate__c < Date.newInstance(FYear-1, 6, 1)){
                        ctm.SpecialistVisitsNum5__c++;
                    }else if(event.ActivityDate__c >= Date.newInstance(FYear-1, 6, 1) && event.ActivityDate__c < Date.newInstance(FYear-1, 7, 1)){
                        ctm.SpecialistVisitsNum6__c++;
                    }else if(event.ActivityDate__c >= Date.newInstance(FYear-1, 7, 1) && event.ActivityDate__c < Date.newInstance(FYear-1, 8, 1)){
                        ctm.SpecialistVisitsNum7__c++;
                    }else if(event.ActivityDate__c >= Date.newInstance(FYear-1, 8, 1) && event.ActivityDate__c < Date.newInstance(FYear-1, 9, 1)){
                        ctm.SpecialistVisitsNum8__c++;
                    }else if(event.ActivityDate__c >= Date.newInstance(FYear-1, 9, 1) && event.ActivityDate__c < Date.newInstance(FYear-1, 10, 1)){
                        ctm.SpecialistVisitsNum9__c++;
                    }else if(event.ActivityDate__c >= Date.newInstance(FYear-1, 10, 1) && event.ActivityDate__c < Date.newInstance(FYear-1, 11, 1)){
                        ctm.SpecialistVisitsNum10__c++;
                    }else if(event.ActivityDate__c >= Date.newInstance(FYear-1, 11, 1) && event.ActivityDate__c < Date.newInstance(FYear-1, 12, 1)){
                        ctm.SpecialistVisitsNum11__c++;
                    }else if(event.ActivityDate__c >= Date.newInstance(FYear-1, 12, 1) && event.ActivityDate__c < Date.newInstance(FYear, 1, 1)){
                        ctm.SpecialistVisitsNum12__c++;
                    }
                }
                System.debug('修改后:'+ctm);
            }
        }

        if(ctmList.size()>0){
            update ctmList;
        }
        
    }

    global void finish(Database.BatchableContext BC) {
        Id batjobId = Database.executeBatch(new ConsumableTargetManageBatch4(startDate,endDate), 200);

    }
}