/************************************************************************************************** @Author: Denny陈帮才 @Name: SummaryThreeYearsContractBatch @CreateDate: 24/08/2022 @Description: 汇总3年内合同历史 //每一年都要算(合同时间那一年维修金额 )//过去第三年、过去第二年、过去一年合同金额 @Version 1.0 *****************************************************************************************************/ global class SummaryThreeYearsContractBatch implements Database.Batchable,Database.Stateful { public String query; public List < String > accountIdList; private BatchIF_Log__c iflog; public Date nowDt =Date.today(); public String OCSM_Period_half; public String OCSM_Period; public Date sTime; public Date eTime; public Date firYEnd; public Date secYEnd; global SummaryThreeYearsContractBatch() { this.query = query; } global SummaryThreeYearsContractBatch(List < String > accountIdList) { this.accountIdList = accountIdList; } global Database.QueryLocator start(Database.BatchableContext bc) { system.debug('执行start'); iflog = new BatchIF_Log__c(); iflog.Type__c = 'PushNotification'; iflog.Log__c = 'SummaryThreeYearsContractBatch start\n'; iflog.ErrorLog__c = ''; insert iflog; if(nowDt.month() >= 4){ sTime = Date.newInstance(nowDt.year()-3,4,1); firYEnd = Date.newInstance(nowDt.year()-2,3,31); secYEnd = Date.newInstance(nowDt.year()-1,3,31); eTime = Date.newInstance(nowDt.year(),3,31); }else{ sTime = Date.newInstance(nowDt.year()-4,4,1); firYEnd = Date.newInstance(nowDt.year()-3,3,31); secYEnd = Date.newInstance(nowDt.year()-2,3,31); eTime = Date.newInstance(nowDt.year()-1,3,31); } //查询三个财年内是否有维修合同的医院 // query ='select Id, Hospital__c from Maintenance_Contract__c where ((Contract_End_Date__c>=:sTime and Contract_End_Date__c<=:eTime) or (Contract_Start_Date__c >=:sTime and Contract_Start_Date__c <=:eTime) or(Contract_Start_Date__c <:sTime and Contract_End_Date__c>:eTime)) and RecordType.Name!=\'多年保修合同\' '; query ='select Id from Account where Id IN( select Hospital__c from Maintenance_Contract__c where ((Contract_End_Date__c>=:sTime and Contract_End_Date__c<=:eTime) or (Contract_Start_Date__c >=:sTime and Contract_Start_Date__c <=:eTime) or(Contract_Start_Date__c <:sTime and Contract_End_Date__c>:eTime)) and RecordType.Name!=\'多年保修合同\' and (Status__c=\'契約\' or Status__c=\'契約満了\'))'; if (accountIdList != null && accountIdList.size() > 0) { query += ' AND Id IN :accountIdList '; } System.debug(LoggingLevel.INFO, '*** query: ' + query); return Database.getQueryLocator(query); } global void execute(Database.BatchableContext BC, list scope) { System.debug(LoggingLevel.INFO, '*** excute start: ' ); if (nowDt.month() >= 4 && nowDt.month() <= 9) { OCSM_Period_half = '1H'; }else{ OCSM_Period_half = '2H'; } if(nowDt.month() >= 1 && nowDt.month() <= 3){ OCSM_Period = 'FY'+(nowDt.year()); }else{ OCSM_Period = 'FY'+(nowDt.year()+1); } System.debug(LoggingLevel.INFO, '*** the OCSM_Period_half__c: ' + OCSM_Period_half); System.debug(LoggingLevel.INFO, '*** the OCSM_Period: ' + OCSM_Period); //获取维修合同Id、Hospital List hosId = new List(); List mainId = new List(); // for (Maintenance_Contract__c mcc : scope) { // hosId.add(mcc.Hospital__c); // mainId.add(mcc.Id); // } for (Account acco : scope) { hosId.add(acco.Id); } for (Maintenance_Contract__c mcc :[select Id, Hospital__c from Maintenance_Contract__c where ((Contract_End_Date__c>=:sTime and Contract_End_Date__c<=:eTime) or (Contract_Start_Date__c >=:sTime and Contract_Start_Date__c <=:eTime) or(Contract_Start_Date__c <:sTime and Contract_End_Date__c>:eTime)) and RecordType.Name!='多年保修合同' and(Status__c='契約' or Status__c='契約満了') and Hospital__c IN:hosId] ) { mainId.add(mcc.Id); } //服务客户目标对象里 医院在scope里以及年份等于查询年份的 List asotList = [select Id,Account_HP__c from Account_Service_Of_Target__c where Account_HP__c in: hosId and OCSM_Period_half__c = :OCSM_Period_half and OCSM_Period__c = :OCSM_Period]; Map oldMap = new Map(); for (Account_Service_Of_Target__c ast : asotList) { oldMap.put(ast.Account_HP__c,ast); } // //汇总医院维修合同数量 AggregateResult[] aggResult = [SELECT Hospital__c,COUNT(Id)countalias FROM Maintenance_Contract__c WHERE Id IN: mainId group by Hospital__c]; Map countMap = new Map(); for (AggregateResult ass : aggResult ) { Id assId= (Id)ass.get('Hospital__c'); Decimal Defir = (Decimal)ass.get('countalias'); countMap.put(assId, Defir); } //过去1、2、3年维修金额 Map LastYearMap = new Map(); Map Last2YearMap = new Map(); Map Last3YearMap = new Map(); //过去1、2、3年签约合同数量 Map Last1YearCountMap = new Map(); Map Last2YearCountMap = new Map(); Map Last3YearCountMap = new Map(); //过去一年维修合同金额、签约合同数量(去年) AggregateResult[] LastYear = [SELECT Hospital__c,SUM(Contract_Amount__c)sumprices,COUNT(Id)countalias FROM Maintenance_Contract__c WHERE Id IN: mainId AND Contract_Conclusion_Date__c>:secYEnd //3.31 AND Contract_Conclusion_Date__c<=:eTime //3.31 group by Hospital__c]; for (AggregateResult ass : LastYear ) { Id assId= (Id)ass.get('Hospital__c'); Decimal Defir = (Decimal)ass.get('sumprices'); Decimal MCount = (Decimal)ass.get('countalias'); LastYearMap.put(assId, Defir); Last1YearCountMap.put(assId,MCount); } //过去两年维修合同金额、签约合同数量(前年) AggregateResult[] BeforeLastYear = [SELECT Hospital__c,SUM(Contract_Amount__c)sumprices,COUNT(Id)countalias FROM Maintenance_Contract__c WHERE Id IN: mainId AND Contract_Conclusion_Date__c>:firYEnd //3.31 AND Contract_Conclusion_Date__c<=:secYEnd //3.31 group by Hospital__c]; for (AggregateResult ass : BeforeLastYear ) { Id assId= (Id)ass.get('Hospital__c'); Decimal Defir = (Decimal)ass.get('sumprices'); Decimal MCount = (Decimal)ass.get('countalias'); Last2YearMap.put(assId, Defir); Last2YearCountMap.put(assId,MCount); } //过去三年年维修合同金额、签约合同数量(大前年) AggregateResult[] ThreeYearago = [SELECT Hospital__c,SUM(Contract_Amount__c)sumprices,COUNT(Id)countalias FROM Maintenance_Contract__c WHERE Id IN: mainId AND Contract_Conclusion_Date__c>=:sTime //4.1 AND Contract_Conclusion_Date__c<=:firYEnd //3.31 group by Hospital__c]; for (AggregateResult ass : ThreeYearago ) { Id assId= (Id)ass.get('Hospital__c'); Decimal Defir = (Decimal)ass.get('sumprices'); Decimal MCount = (Decimal)ass.get('countalias'); Last3YearMap.put(assId, Defir); Last3YearCountMap.put(assId,MCount); } List asList = new List(); for (Id mapId : countMap.keySet()) { Account_Service_Of_Target__c asItem = new Account_Service_Of_Target__c(); asItem.Account_HP__c = mapId; //过去1、2、3年维修合同数量(按合同日计算) // asItem.Last_Years_Contract_Count__c = Last1YearCountMap.get(mapId); // asItem.Last_Two_Years_Contract_Count__c = Last2YearCountMap.get(mapId); // asItem.Last_Three_Year_Contract_Count__c = Last3YearCountMap.get(mapId); //过去第一年合同日是否有合同 if(Last1YearCountMap.get(mapId)!=0 && Last1YearCountMap.get(mapId)!=null){ asItem.IF_Last_Years_Contract__c = '1'; }else{ asItem.IF_Last_Years_Contract__c = '0'; } //过去第二年合同日是否有合同 if(Last2YearCountMap.get(mapId)!=0 && Last2YearCountMap.get(mapId)!=null){ asItem.IF_Last_Two_Years_Contract__c = '1'; }else{ asItem.IF_Last_Two_Years_Contract__c = '0'; } //过去第三年合同日是否有合同 if(Last3YearCountMap.get(mapId)!=0 && Last3YearCountMap.get(mapId)!=null){ asItem.IF_Last_Three_Years_Contract__c = '1'; }else{ asItem.IF_Last_Three_Years_Contract__c = '0'; } asItem.OCSM_Period_half__c = OCSM_Period_half; asItem.OCSM_Period__c = OCSM_Period; //过去三年是否有签约合同 asItem.Last_Three_Years_IF_Have_Contract__c = true; //过去三年维修合同数量(3个完整财年) asItem.Last_Three_Years_Contract_Count_del__c = countMap.get(mapId); //过去1、2、3年维修合同金额 asItem.Last_Years_Contract_Amount__c = LastYearMap.get(mapId); asItem.Last_Two_Years_Contract_Amount__c = Last2YearMap.get(mapId); asItem.Last_Three_Years_Contract_Amount__c = Last3YearMap.get(mapId); if(oldMap.containsKey(asItem.Account_HP__c)){ asItem.Id = oldMap.get(asItem.Account_HP__c).Id; } if(!asList.contains(asItem)){ asList.add(asItem); } } System.debug(LoggingLevel.INFO, '*** asList: ' + asList); upsert asList; } global void finish(Database.BatchableContext BC) { iflog.Log__c += '\n SummaryThreeYearsContractBatch end'; String tmp = iflog.ErrorLog__c; if (tmp.length() > 65000) { tmp = tmp.substring(0, 65000); tmp += ' ...have more lines...'; iflog.ErrorLog__c = tmp; } update iflog; } }