global class ConUpdateLastContractbatch implements Database.Batchable { // 设定运行的维修合同的list public list TestIDList; // 报错信息 public String errorstr = ''; global ConUpdateLastContractbatch() { } global ConUpdateLastContractbatch(List TestIDList) { this.TestIDList = TestIDList; } global Database.QueryLocator start(Database.BatchableContext bc) { string query = ' select id , previousTotalRepairAmount__c , currentTotalRepairAmount__c ,' + ' previousTotalContractAmount__c , currentTotalContractAmountVM__c , currentTotalGuaranteePrice__c '+ ' , RecordType_DeveloperName__c ,Contract_Start_Date__c ' + //tcm Contract_Start_Date__c ' from Maintenance_Contract__c ' + ' where '; if (TestIDList != null && TestIDList.size() > 0) { query += ' id in: TestIDList'; }else { query += ' Status__c in (\'契約\',\'契約満了\') '; } return Database.getQueryLocator(query); } global void execute(Database.BatchableContext BC, list scope) { List mCidList = new List(); Map IdMap=new Map(); for (Maintenance_Contract__c MC : scope) { mCidList.add(MC.Id); IdMap.put(MC.Id, MC.Id); } system.debug('scope等于'+scope); // 先取维修合同ID Map > lastMContractMap = new Map >(); Map > lastMContractMap1 = new Map >(); // 再取有上期合同的合同保有设备信息 //tcm 20211130 start 更换Maintenance_Contract_No_F__c为Management_Code__c List mCAList = [select Id,Maintenance_Contract__c,LastMContract__c,LastMContract__r.Contract_End_Date__c, LastMContract__r.Management_Code__c,/*LastMContract__r.Maintenance_Contract_No_F__c,*/ Maintenance_Contract__r.Contract_Start_Date__c,LastMContract__r.RecordType_DeveloperName__c from Maintenance_Contract_Asset__c where Maintenance_Contract__r.Status__c in ('契約','契約満了') and Maintenance_Contract__c in : mCidList and LastMContract__c != null order by Asset__c,Maintenance_Contract__r.Contract_End_Date__c]; for (Maintenance_Contract_Asset__c mca : mCAList) { //判断 如果上一期维修合同为 多年保修合同 的话 则不放入map进行更新 LJPH-BUU3E3 update by rentx 2020-11-03 start if (String.isNotBlank(mca.LastMContract__c) && mca.LastMContract__r.RecordType_DeveloperName__c!= 'VM_Contract'&&mca.LastMContract__r.Contract_End_Date__c!=null) { lastMContract lM = new lastMContract(mca.LastMContract__c,mca.LastMContract__r.Management_Code__c/*Maintenance_Contract_No_F__c*/,mca.LastMContract__r.Contract_End_Date__c,1); // 判断空白期 system.debug('合同开始日等于:'+mca.Maintenance_Contract__r.Contract_Start_Date__c+';合同结束日等于:'+mca.LastMContract__r.Contract_End_Date__c); if (mca.Maintenance_Contract__r.Contract_Start_Date__c.daysbetween(mca.LastMContract__r.Contract_End_Date__c) > -366 &&mca.Maintenance_Contract__r.Contract_Start_Date__c.daysbetween(mca.LastMContract__r.Contract_End_Date__c) < 366) { // 数量 if (lastMContractMap.containsKey(mca.Maintenance_Contract__c)) { if (lastMContractMap.get(mca.Maintenance_Contract__c).containsKey(mca.LastMContract__c)) { lastMContractMap.get(mca.Maintenance_Contract__c).get(mca.LastMContract__c).count++; }else { lastMContractMap.get(mca.Maintenance_Contract__c).put(mca.LastMContract__c, lM); } }else{ Map lastMContracttemp = new Map(); lastMContracttemp.put(mca.LastMContract__c, lM); lastMContractMap.put(mca.Maintenance_Contract__c, lastMContracttemp); } } else { // 数量 if (lastMContractMap1.containsKey(mca.Maintenance_Contract__c)) { if (lastMContractMap1.get(mca.Maintenance_Contract__c).containsKey(mca.LastMContract__c)) { lastMContractMap1.get(mca.Maintenance_Contract__c).get(mca.LastMContract__c).count++; }else { lastMContractMap1.get(mca.Maintenance_Contract__c).put(mca.LastMContract__c, lM); } }else{ Map lastMContracttemp1 = new Map(); lastMContracttemp1.put(mca.LastMContract__c, lM); lastMContractMap1.put(mca.Maintenance_Contract__c, lastMContracttemp1); } } }else { Map lastMContracttemp2 = new Map(); lastMContractMap.put(mca.Maintenance_Contract__c, lastMContracttemp2); } } system.debug('lastMContractMap等于+'+lastMContractMap); system.debug('lastMContractMap1等于+'+lastMContractMap1); Map > mapResult = new Map >(); for (String str : mCidList) { List listResulttemp = new List(); List listResulttemp1 = new List(); List listResult = new List(); List listResult1 = new List(); if (lastMContractMap.containsKey(str)) { // 空白期 listResulttemp = lastMContractMap.get(str).values(); listResulttemp.sort(); for (Integer i = 0; i < listResulttemp.size(); i++) { if (listResulttemp.size() >= i+1) { listResult.add(listResulttemp[i]); } } } if (lastMContractMap1.containsKey(str)&&listResult.size()<=5) { // 非空白期 listResulttemp1 = lastMContractMap1.get(str).values(); listResulttemp1.sort(); System.debug('listResulttemp1size等于'+listResulttemp1.size()); for (Integer i = 0; i < listResulttemp1.size(); i++) { // if (listResulttemp1.size() >= i+1) { listResult1.add(listResulttemp1[i]); // system.debug('iiiiiiiiiiii'+i); // }else { // listResult1.add(new lastMContract(null, null, null, null)); // } } } listResult.addAll(listResult1); system.debug('listResultsize1等于'+listResult.size()); system.debug('listResultsList等于'+listResult); // 如果不足5个合同,自动添加剩余的合同为null if (listResult.size()<5) { Integer num=5-listResult.size(); for (Integer i = 0; i < num; i++) { listResult.add(new lastMContract(null, null, null, null)); } mapResult.put(str, listResult); }else { mapResult.put(str, listResult); } system.debug('listResultsizeend等于'+listResult.size()); } system.debug('mapResult等于+'+mapResult); List upMCList = new List(); // 五个合同赋值 for (String str : mCidList) { if (mapResult.containsKey(str)) { Maintenance_Contract__c upMC = new Maintenance_Contract__c(); upMC.Id = str; upMC.LastMContract1__c = mapResult.get(str)[0].contractId; upMC.LastMContract1_NO__c = mapResult.get(str)[0].contractNo; upMC.LastMContract1_ConCount__c = mapResult.get(str)[0].count; upMC.LastMContract2__c = mapResult.get(str)[1].contractId; upMC.LastMContract2_NO__c = mapResult.get(str)[1].contractNo; upMC.LastMContract2_ConCount__c = mapResult.get(str)[1].count; upMC.LastMContract3__c = mapResult.get(str)[2].contractId; upMC.LastMContract3_NO__c = mapResult.get(str)[2].contractNo; upMC.LastMContract3_ConCount__c = mapResult.get(str)[2].count; upMC.LastMContract4__c = mapResult.get(str)[3].contractId; upMC.LastMContract4_NO__c = mapResult.get(str)[3].contractNo; upMC.LastMContract4_ConCount__c = mapResult.get(str)[3].count; upMC.LastMContract5__c = mapResult.get(str)[4].contractId; upMC.LastMContract5_NO__c = mapResult.get(str)[4].contractNo; upMC.LastMContract5_ConCount__c = mapResult.get(str)[4].count; upMCList.add(upMC); } // else { // Maintenance_Contract__c upMC = new Maintenance_Contract__c(); // upMC.Id = str; // upMC.LastMContract1__c = null; // upMC.LastMContract1_NO__c = null; // upMC.LastMContract1_ConCount__c = null; // upMC.LastMContract2__c = null; // upMC.LastMContract2_NO__c = null; // upMC.LastMContract2_ConCount__c = null; // upMC.LastMContract3__c = null; // upMC.LastMContract3_NO__c = null; // upMC.LastMContract3_ConCount__c = null; // upMC.LastMContract4__c = null; // upMC.LastMContract4_NO__c = null; // upMC.LastMContract4_ConCount__c = null; // upMC.LastMContract5__c = null; // upMC.LastMContract5_NO__c = null; // upMC.LastMContract5_ConCount__c = null; // upMCList.add(upMC); // } } system.debug('upMCList等于+'+upMCList); Database.SaveResult[] lsr = Database.update(upMCList, false); String errorMsg = ''; for (Integer sIdx = 0; sIdx < lsr.size(); sIdx++) { Database.SaveResult sr = lsr[sIdx]; if (!sr.isSuccess()) { Database.Error emsg = sr.getErrors()[0]; errorstr += 'ERROR ' + upMCList[sIdx].get('Id') + ' 维修合同:' + emsg + '\n'; } } } global void finish(Database.BatchableContext BC) { BatchIF_Log__c batchIfLog = new BatchIF_Log__c(); batchIfLog.Type__c = 'MCAssetUpdate'; batchIfLog.Log__c = '\nConUpdateLastContractbatchend'; if (errorstr.length() > 60000) { batchIfLog.ErrorLog__c = errorstr.substring(0, 60000); } else { batchIfLog.ErrorLog__c = errorstr.substring(0, errorstr.length()); } insert batchIfLog; } // 续签合同信息 class public class lastMContract implements Comparable { public Date endDate; public Integer count; public String contractId; public String contractNo; // tcm start public Boolean ayearcontract; // tcm end public lastMContract(String contractId,String contractNo,Date endDate, Integer count) { this.endDate = endDate; this.count = count; this.contractId = contractId; this.contractNo = contractNo; } // 排序 // tcm start public Integer compareTo(Object compareTo) { lastMContract compareToesd = (lastMContract)compareTo; Integer returnValue = 0; // 判断数量 if (count > compareToesd.count) { returnValue = -1; } else if (count < compareToesd.count) { returnValue = 1; } else { if (endDate > compareToesd.endDate ) { returnValue = 1; } else { returnValue = -1; } } return returnValue; } // tcm end } }