global class ServiceMaintenanceHistoryBatch implements Database.Batchable { List idList = new List(); public ServiceMaintenanceHistoryBatch(){ } public ServiceMaintenanceHistoryBatch(List idList){ this.idList = idList; } global Database.QueryLocator start(Database.BatchableContext bc) { String query = 'SELECT Id,Status__c,Contract_Start_Date__c,Contract_print_completed__c,Contract_End_Date__c,Contract_Conclusion_Date__c,RecordType.DeveloperName ' +'FROM Maintenance_Contract__c ' +'WHERE RecordType.DeveloperName = \'NewMaintenance_Contract\' AND Contract_Start_Date__c != NULL AND Contract_End_Date__c != NULL ' +'AND (Status__c = \'契約\' OR Status__c = \'契約満了\') AND Contract_Conclusion_Date__c != NULL '; if (idList.size()>0) { query += 'AND Id in :idList'; } system.debug('Start:'+query); return Database.getQueryLocator(query); } global void execute(Database.BatchableContext BC, list newMainContract) { List NeedCreateNMC = new List(); List NeedCreateNMCId = new List(); List NMCReportTList= new List(); Map QuarterNumMap = new Map(); Date today = Date.today(); Date tempDate = Date.newInstance(2021, 8, 1); for(Maintenance_Contract__c tempNMC : newMainContract){ Decimal resultDecimal = 0; resultDecimal = Decimal.valueOf(tempNMC.Contract_Start_Date__c.monthsBetween(tempNMC.Contract_End_Date__c.addDays(1))) / 3; Integer resultUp = Integer.valueOf(resultDecimal.round(System.RoundingMode.DOWN)); if(tempNMC.Contract_Start_Date__c.monthsBetween(tempNMC.Contract_End_Date__c.addDays(1)) > 0&& !QuarterNumMap.containsKey(tempNMC.Id)){ QuarterNumMap.put(tempNMC.Id , resultUp); NeedCreateNMC.add(tempNMC); NeedCreateNMCId.add(tempNMC.Id); } } List existNMCReprot = [select Id,Name,NewMaintenance_Contract__c from NewMaintenanceReport_Task__c where NewMaintenance_Contract__c IN :NeedCreateNMCId ]; Map existNMCReportMap = new Map(); if(existNMCReprot.size()>0){ for(NewMaintenanceReport_Task__c NMrt :existNMCReprot){ existNMCReportMap.put(NMrt.NewMaintenance_Contract__c , NMrt); } } if(NeedCreateNMC.size()>0){ for(Integer i = 0; i0){ //遍历需要创建报告书的合同 for(Maintenance_Contract__c tempNMC : NeedCreateNMC){ //定义变量,判断是否需要顺延 Boolean isDelay = false; if(tempNMC.Contract_print_completed__c > tempNMC.Contract_Start_Date__c.addMonths(1)){ isDelay = true; } //获取当前遍历的合同的季度数 并遍历 生成报告书 for(Integer qnum = 1;qnum <= QuarterNumMap.get(tempNMC.Id);qnum++){ //如果 当合同生效日晚于【合同开始日+3个月】, 顺延为第二季度 if(isDelay){ isDelay = false; continue; } //计算开始日期 Date DistributionStartDate= tempNMC.Contract_Start_Date__c.addMonths((qnum-1) * 3); //计算结束日期 Date DistributionEndDate = tempNMC.Contract_Start_Date__c.addMonths((qnum) * 3).addDays(-1); //开始生成服务合同报告书 NewMaintenanceReport_Task__c tempNMCT = new NewMaintenanceReport_Task__c(); //报告书名字 if(qnum<10){ tempNMCT.Name = 'FWreport-0'+qnum; }else { tempNMCT.Name = 'FWreport-'+qnum; } //季度数 tempNMCT.QuartersNum__c = qnum; //发放季度 tempNMCT.Distribution_Quarter__c = '第'+qnum+'季度'; //发放期间开始日期 tempNMCT.Distribution_Start_Date__c = DistributionStartDate; //发放期间结束日期 tempNMCT.Distribution_End_Date__c = DistributionEndDate; //发放期限 tempNMCT.CorrespondingPeriod__c = DistributionEndDate; //发放人 tempNMCT.Distribution_Person__c = ''; //服务合同 tempNMCT.NewMaintenance_Contract__c = tempNMC.Id; if(DistributionStartDate < tempDate){ tempNMCT.ActualDistributionTimes_Quarter__c = 1; } NMCReportTList.add(tempNMCT); } } } if(NMCReportTList.size()>0){ insert NMCReportTList; } } global void finish(Database.BatchableContext BC) {} }