/* 2021-03-31 mzy sla报告书任务开发 创建服务合同报告书任务 */ global class CreateNewMaintenanceTaskBatch implements Database.Batchable { String tempMainId = '';//a0H1s000003ziv9 Boolean IsNeedExecute = false; List idList = new List(); BatchIF_log__c log1 = new BatchIF_Log__c(); public CreateNewMaintenanceTaskBatch() { } public CreateNewMaintenanceTaskBatch(String id){ this.tempMainId = id; } public CreateNewMaintenanceTaskBatch(Boolean NeedExecute){ this.IsNeedExecute = NeedExecute; } public CreateNewMaintenanceTaskBatch(List idList,Boolean NeedExecute){ this.IsNeedExecute = NeedExecute; } public CreateNewMaintenanceTaskBatch(String id ,Boolean NeedExecute){ this.tempMainId = id; this.IsNeedExecute = NeedExecute; } global Database.QueryLocator start(Database.BatchableContext bc) { System.debug('Start方法进来没?'); 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 = \'契約\' AND Contract_Conclusion_Date__c != NULL '; if (String.isNotBlank(this.tempMainId)) { query += 'AND Id = :tempMainId'; } 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) { log1.Type__c='SLA_Report'; log1.Log__c = 'Batch execute start\r\n'; log1.Log__c += 'List :'+newMainContract.size() +'\r\n'; log1.Log__c += 'List 内容:'+newMainContract +'\r\n'; //定义变量-----start //定义list 存放需要生成服务合同报告书的合同 List NeedCreateNMC = new List(); //定义list 存放需要生成服务合同报告书的合同Id List NeedCreateNMCId = new List(); //定义list 存放生成的服务合同报告书 List NMCReportTList= new List(); //定义map 存放季度数 k:合同Id v:季度数 Map QuarterNumMap = new Map(); //定义map 存放是否需要合并日期 //Map NeedMergeDateMap = new Map(); //定义变量-----end //0.获取今天的日期 Date today = Date.today(); //1.获取需要生成服务合同报告书的合同 for(Maintenance_Contract__c tempNMC : newMainContract){ //判断是否生成服务合同报告书 // if(tempNMC.Contract_Conclusion_Date__c.addDays(1) == today){ //计算合同一共有几个季度 //实际季度 Decimal resultDecimal = 0; resultDecimal = Decimal.valueOf(tempNMC.Contract_Start_Date__c.monthsBetween(tempNMC.Contract_End_Date__c.addDays(1))) / 3; log1.Log__c +='正常:'+resultDecimal+'\r\n'; //UP //Integer resultUp = Integer.valueOf(resultDecimal.round(System.RoundingMode.UP)); //DOWN Integer resultUp = Integer.valueOf(resultDecimal.round(System.RoundingMode.DOWN)); log1.Log__c += '日期 :实际季度: '+resultDecimal +' 向下取整:'+resultUp+' 是否合并日期:'+(resultDecimal >resultUp?true:false); //默认都是不需要合并日期 //NeedMergeDateMap.put(tempNMC.Id , false); //实际大于向下取整 //if(resultDecimal >resultUp){ //说明需要合并日期 // NeedMergeDateMap.put(tempNMC.Id , true); //} 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); } // } } //4.已经生成报告书的合同将不再去生成 List existNMCReprot = [select Id,Name,NewMaintenance_Contract__c from NewMaintenanceReport_Task__c where NewMaintenance_Contract__c IN :NeedCreateNMCId ]; log1.Log__c += '\r\n已经创建的长度 :'+existNMCReprot.size(); 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; // //第一版:当合同生效日晚于【合同开始日+3个月】,第一次发放计划顺延为4/1~6/30 (下一季度)。 // //第二版:合同盖章完毕日晚于【合同开始日+3个月】,不生成第一个区间(即 顺延为下一季度)。 // //第三版:盖章完毕日晚于合同开始日1个月以上,自动从第二季度开始 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; } //2022-03-01 mzy SLA报告书上线后问题 start //合同日 Date ContractConclusionDate = tempNMC.Contract_Conclusion_Date__c; //2022-03-01 mzy SLA报告书上线后问题 end //计算开始日期 Date DistributionStartDate= tempNMC.Contract_Start_Date__c.addMonths((qnum-1) * 3); //计算结束日期 Date DistributionEndDate = tempNMC.Contract_Start_Date__c.addMonths((qnum) * 3).addDays(-1); //2022-03-01 mzy SLA报告书上线后问题 start //合同日到满一个季度的期间大于2个月则需要生成发放计划,小于2个月则不需要生成计划 //为了防止出现 55485 的那种情况(合同日所在区间之前的季度不再生成) if ((ContractConclusionDate.addMonths(2)>DistributionEndDate) || (ContractConclusionDate > DistributionEndDate)) { continue; } //2022-03-01 mzy SLA报告书上线后问题 end //开始生成服务合同报告书 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; /* //如果为最后一个季度,则判断是否需要合并日期 if(qnum == QuarterNumMap.get(tempNMC.Id)){ //如果需要合并日期,则结束日期赋值为 合同结束日期+1个月 //发放期间结束日期 + 1个月 tempNMCT.Distribution_End_Date__c = DistributionEndDate; //发放期限 tempNMCT.CorrespondingPeriod__c = Date.valueOf(tempNMC.Contract_End_Date__c ).addMonths(2).toStartOfMonth().addDays(-1); //及时率的统计区间范围 start //及时率开始统计日 tempNMCT.TimelyRateStartDate__c = DistributionStartDate.addMonths(2); //及时率结束统计日 tempNMCT.TimelyRateEndDate__c = Date.valueOf(tempNMC.Contract_End_Date__c ).addMonths(2).toStartOfMonth().addDays(-1); //及时率的统计区间范围 end }else { //如果不用合并日期,这正常赋值 //发放期间结束日期 tempNMCT.Distribution_End_Date__c = DistributionEndDate; //发放期限 tempNMCT.CorrespondingPeriod__c = DistributionEndDate.addMonths(1); //及时率的统计区间范围 start //及时率开始统计日 tempNMCT.TimelyRateStartDate__c = DistributionStartDate.addMonths(2); //及时率结束统计日 tempNMCT.TimelyRateEndDate__c = DistributionEndDate.addMonths(1); //及时率的统计区间范围 end } */ /*//如果为最后一个季度,则判断是否需要合并日期 if(NeedMergeDateMap.get(tempNMC.id)&&qnum == QuarterNumMap.get(tempNMC.Id)){ //如果需要合并日期,则结束日期赋值为 合同结束日期 //发放期间结束日期 tempNMCT.Distribution_End_Date__c = tempNMC.Contract_End_Date__c; //对应期限 tempNMCT.CorrespondingPeriod__c = tempNMC.Contract_End_Date__c; }else { //如果不用合并日期,这正常赋值 } */ //发放期间结束日期 tempNMCT.Distribution_End_Date__c = DistributionEndDate; //发放期限 tempNMCT.CorrespondingPeriod__c = DistributionEndDate; //发放人 tempNMCT.Distribution_Person__c = ''; //服务合同 tempNMCT.NewMaintenance_Contract__c = tempNMC.Id; //2021-07-27 mzy update start //如果季度的计划开始日 是 8月1日之前的,则需要将实际发放次数 = 1 Date riqi = Date.newInstance(2021,08,01); if(DistributionStartDate 0){ insert NMCReportTList; /*Set nmcid = new Set(); for(NewMaintenanceReport_Task__c m : NMCReportTList){ nmcid.add(m.NewMaintenance_Contract__c); } List taskList = [SELECT Id , Activity_Date__c ,Maintenance_Contract__c FROM TASK__c WHERE Maintenance_Contract__c in : nmcid AND taskStatus__c = '03 完成' AND RecordType.DeveloperName = 'SLAReport_Task']; for(NewMaintenanceReport_Task__c m :NMCReportTList){ //及时率 integer timelylv = 0; //发放次数 integer grantCount = 0; if(taskList.size()>0){ for (Task__c t :taskList){ //判断本季度内有没有已经完成的任务,如果>=1,计划发放次数为1,发放及时率为100%;本季度目前没有已完成的任务,都为0 if(m.Distribution_Start_Date__c <= t.Activity_Date__c && t.Activity_Date__c <= m.Distribution_End_Date__c && t.Maintenance_Contract__c == m.NewMaintenance_Contract__c){ timelylv = 100; grantCount = 1; } } } m.ActualDistributionTimes_Quarter__c = grantCount; } update NMCReportTList;*/ } system.debug('execute 执行完了'); /* if(!''.equals(log1.Log__c)){ insert log1; }*/ } global void finish(Database.BatchableContext BC) { //2021-07-12 mzy update start SLA定期任务开发 if(!System.Test.isRunningTest() && IsNeedExecute == true){ Database.executebatch(new CreateSLAReportTaskBatch(true)); } //2021-07-12 mzy update end SLA定期任务开发 } }