/** * zh 2020/12 * 多年保维修合同消费率预警创建维修合同任务 */ global class CreateMaintenanceTaskBatch implements Database.Batchable { String tempMainId; List ids; //Boolean isExecuteOpp; //20210203 zh SWAG-BXQDHZ 是否执行Oppo Boolean isExecuteOPD; //20210713 mzy SWAG-C4V6GU 询价任务派送时间更改 public CreateMaintenanceTaskBatch(){ isExecuteOPD = false; //20210203 zh SWAG-BXQDHZ 2021-07-13 mzy 询价任务派送时间更改 } public CreateMaintenanceTaskBatch(String id){ this.tempMainId = id; isExecuteOPD = false; //20210203 zh SWAG-BXQDHZ 2021-07-13 mzy 询价任务派送时间更改 } public CreateMaintenanceTaskBatch(List ids){ this.ids = ids; isExecuteOPD = false; //20210203 zh SWAG-BXQDHZ 2021-07-13 mzy 询价任务派送时间更改 } public CreateMaintenanceTaskBatch(Boolean opdFlag){ isExecuteOPD = opdFlag; //20210203 zh SWAG-BXQDHZ 2021-07-13 mzy 询价任务派送时间更改 } global Database.QueryLocator start(Database.BatchableContext BC) { String soql = 'SELECT CreatedDate__c,currentTotalRepairAmount__c,Consumption_rate_Gurante__c,endDateGurantee__c,startDateGurantee__c,RecordType.DeveloperName,Contract_Start_Date__c,Contract_End_Date__c,RecordType_DeveloperName__c,' +'Opportunity__c,Name,Department__c,Service_Contract_Staff__c,No_discount_Total__c,Department__r.Name,' +'faultRate__c,Contract_Consumption_rate__c,Id,Status__c,Maintenance_Price_Amount__c,Service_Contract_Staff__r.IsActive ' +'FROM Maintenance_Contract__c ' +'WHERE ((RecordType.DeveloperName = \'VM_Contract\' AND startDateGurantee__c != NULL AND endDateGurantee__c != NULL) ' +'OR (RecordType.DeveloperName != \'VM_Contract\' AND Contract_Start_Date__c != NULL AND Contract_End_Date__c != NULL)) ' +'AND Status__c = \'契約\' '; // +'AND startDateGurantee__c != NULL AND endDateGurantee__c != NULL '; //查询在合同中的合同 if (String.isNotBlank(this.tempMainId)) { soql += 'AND Id = :tempMainId'; } if (this.ids!=null) { soql += 'AND Id IN :ids'; } return Database.getQueryLocator(soql); } global void execute(Database.BatchableContext BC,List mainContract) { Date today = Date.today(); List mainTasks = new List(); Id maintenanceTaskId = Schema.SObjectType.task__c.getRecordTypeInfosByDeveloperName().get('VM_Contract_Task').getRecordTypeId(); List insertTasks = new List(); Map main2Nepr = new Map(); //市场多年保任务发送修改 20230505 start Map main3Nepr = new Map(); Map main4Nepr = new Map(); //市场多年保任务发送修改 20230505 end List mainIds = new List(); map mcIDmap = new map(); for(Maintenance_Contract__c tempMC : mainContract){ //计算一共有几期,38个月算做7期 Decimal resultDecimal = 0; if ('VM_Contract'.equals(tempMC.RecordType.DeveloperName)) { //市场多年保任务发送修改 20230505 start if (tempMC.Consumption_rate_Gurante__c > 50) { // 当合同消费率大于50%发送任务 main3Nepr.put(tempMC.Id, '50%'); } if (tempMC.Consumption_rate_Gurante__c > 100 || this.isExecuteOPD==true) { // 当合同消费率大于100%发送任务 main3Nepr.put(tempMC.Id, '100%'); } if (tempMC.Consumption_rate_Gurante__c > 140) { // 当合同消费率大于140%发送任务 main3Nepr.put(tempMC.Id, '140%'); } //市场多年保任务发送修改 20230505 end resultDecimal = Decimal.valueOf(tempMC.startDateGurantee__c.monthsBetween(tempMC.endDateGurantee__c)) / 6; }else { resultDecimal = Decimal.valueOf(tempMC.Contract_Start_Date__c.monthsBetween(tempMC.Contract_End_Date__c)) / 6; } Integer resultUp = Integer.valueOf(resultDecimal.round(System.RoundingMode.UP)); //计算现在处于第几期-1 Integer nper = 0; //市场多年保任务发送修改 20230505 start Integer nper1 = -1; //市场多年保任务发送修改 20230505 end for(Integer i = 1; i <= resultUp; i++){ if ('VM_Contract'.equals(tempMC.RecordType.DeveloperName)) { if (today >= tempMC.startDateGurantee__c.addMonths((i-1) * 6) && today < tempMC.startDateGurantee__c.addMonths(i*6)) { //市场多年保任务发送修改 20230505 start system.debug('是否小于20230401==='+(tempMC.CreatedDate__c= tempMC.Contract_Start_Date__c.addMonths((i-1) * 6) && today < tempMC.Contract_Start_Date__c.addMonths(i*6)) { nper = i-1; } } } //市场多年保任务发送修改 20230505 start system.debug('nper1=='+nper1); if (nper >= 0) { main4Nepr.put(tempMC.Id, nper1); } //市场多年保任务发送修改 20230505 end mcIDmap.put(tempMC.id,tempMC); mainIds.add(tempMC.id); if (nper > 0) { main2Nepr.put(tempMC.Id, nper); } } System.debug('main2Nepr 1----'+main2Nepr); List existMainTasks = [SELECT Id,Name,Nper__c,Maintenance_Contract__c,Taget_Gurante__c FROM Maintenance_Task__c WHERE Maintenance_Contract__c IN : mainIds]; for(Maintenance_Task__c tempMT : existMainTasks){ if (main2Nepr.containsKey(tempMT.Maintenance_Contract__c) && tempMT.Nper__c == main2Nepr.get(tempMT.Maintenance_Contract__c)) { main2Nepr.remove(tempMT.Maintenance_Contract__c); } //市场多年保任务发送修改 20230505 start if (tempMT.Taget_Gurante__c!=null&&main3Nepr.containsKey(tempMT.Maintenance_Contract__c) && tempMT.Taget_Gurante__c == main3Nepr.get(tempMT.Maintenance_Contract__c)) { main3Nepr.remove(tempMT.Maintenance_Contract__c); } //市场多年保任务发送修改 20230505 end } System.debug('main2Nepr 2----'+main2Nepr); // 检索本次batch涉及的维修合同对应的保有设备 list mcaList = [select Id, Asset__c, Maintenance_Contract__c, Estimate_Cost_formula__c, startDate_sum__c, endDate_sum__c, No_discount__c, GuaranteePrice_Amount_Text__c, Maintenance_Contract__r.Status__c, Maintenance_Contract__r.Name, Maintenance_Contract__r.Contract_End_Date__c, Maintenance_Contract__r.Contract_Start_Date__c, Maintenance_Contract__r.RecordType_DeveloperName__c, Maintenance_Contract__r.Estimation_Id__r.Submit_quotation_day__c, Maintenance_Contract__r.RecordType.DeveloperName , ifHaveleftInPrevious__c from Maintenance_Contract_Asset__c where Maintenance_Contract__c in: mainIds ]; // Set ALLMCIDset = mcIDmap.keySet().clone(); // 检索所有合同保有设备的修理 list newRepiarList = new list(); if (mainIds.size() > 0) { newRepiarList = [select Id, Usage_Ratio_Price_Contract__c, Usage_Ratio_Price_Guarantee__c,Usage_Ratio_Price_Service__c, Delivered_Product__c, Repair_cost__c, Maintenance_Contract__c, Maintenance_Contract__r.Contract_Start_Date__c, Maintenance_Contract__r.Contract_End_Date__c, Failure_Occurrence_Date__c, Repair_Quotation_Id__c, VM_Maintenance_Contract__c from Repair__c where (Maintenance_Contract__c != null or VM_Maintenance_Contract__c != null) and VM_Maintenance_Contract__c in: mainIds and Status2__c != '00.删除' and Status2__c != '00.取消' and Failure_Occurrence_Date__c <= : today order by Maintenance_Contract__c ]; } Map> ma2Repair = new Map>(); if (newRepiarList != null && newRepiarList.size() > 0) { for(String maId : mainIds){ List repairs = new List(); for (Repair__c rc : newRepiarList) { // system.debug('rc'+rc); if (maId == rc.VM_Maintenance_Contract__c) { repairs.add(rc); } // currentTotalRepairAmount += rc.Usage_Ratio_Price_Guarantee__c; } ma2Repair.put(maId, repairs); } } List updateMainIds = new List(); for(Maintenance_Contract__c main : mainContract){ // System.debug('----count---'+main.startDateGurantee__c); // System.debug('----count1---'+main.endDateGurantee__c); if ('VM_Contract'.equals(main.RecordType.DeveloperName)) { //多年保修合同 //市场多年保任务发送修改 20230505 start if (main.CreatedDate__c 0 && main2Nepr.containsKey(main.Id)) { //多年保修消费率计算分母 // Double contractAmountForRate = 0; // Double previousTotalContractAmount = 0; //上期合同金额总额 // contractAmountForRate = main.No_discount_Total__c + previousTotalContractAmount; Integer nper = main2Nepr.get(main.Id); // if (today == main.startDateGurantee__c.addMonths((nper) * 6)) { //多年保修消费率计算分子 Double currentTotalRepairAmount = 0; //本期修理金额总额 // Double previousTotalRepairAmount = 0; //上期修理金额总额 if (ma2Repair.containsKey(main.Id) && ma2Repair.get(main.Id).size() > 0) { for(Repair__c rc : ma2Repair.get(main.Id)){ currentTotalRepairAmount += rc.Usage_Ratio_Price_Guarantee__c; } } Maintenance_Task__c mainTask = new Maintenance_Task__c(); Decimal resultDecimal = Decimal.valueOf(main.startDateGurantee__c.monthsBetween(main.endDateGurantee__c)) / 6; Integer resultUp = Integer.valueOf(resultDecimal.round(System.RoundingMode.UP)); mainTask.Nper__c = nper; mainTask.Interval_Start_Date__c = main.startDateGurantee__c.addMonths((nper-1) * 6); mainTask.Interval_End_Date__c = main.startDateGurantee__c.addMonths((nper) * 6).addDays(-1); mainTask.Reference_Consumption_Rate__c = Decimal.valueOf(100) / resultUp * nper ; // mainTask.Maintenance_Consumption_rate__c = main.Contract_Consumption_rate__c; if (main.Maintenance_Price_Amount__c == 0) { mainTask.Maintenance_Consumption_rate__c = 0; }else{ mainTask.Maintenance_Consumption_rate__c = Decimal.valueOf(currentTotalRepairAmount) / main.Maintenance_Price_Amount__c * 100 ; } mainTask.Maintenance_Contract__c = main.Id; mainTask.Is_Generate_Task__c = false; if (nper < 10) { mainTask.Name = 'DNalert-0' + nper; }else{ mainTask.Name = 'DNalert-' + nper; } if (mainTask.Maintenance_Consumption_rate__c > mainTask.Reference_Consumption_Rate__c && (today == mainTask.Interval_End_Date__c.addDays(1)) || String.isNotBlank(this.tempMainId)) { //多年保修消费率>参考消费率,需要关联任务 mainTask.Is_Generate_Task__c = true; // updateMainIds.add(main.Id); } mainTasks.add(mainTask); if (today > main.endDateGurantee__c.addMonths(-6) && today < main.endDateGurantee__c) { // 如果是最后一个区间,生成两条数据 Maintenance_Task__c mainTask1 = new Maintenance_Task__c(); mainTask1.Interval_Start_Date__c = main.endDateGurantee__c.addMonths(-6); mainTask1.Interval_End_Date__c = main.endDateGurantee__c; mainTask1.Reference_Consumption_Rate__c = 100; mainTask1.Maintenance_Contract__c = main.Id; mainTask1.Is_Generate_Task__c = false; mainTask1.Nper__c = nper+1; if (mainTask1.Nper__c < 10) { mainTask1.Name = 'DNalert-0' + mainTask1.Nper__c; }else{ mainTask1.Name = 'DNalert-' + mainTask1.Nper__c; } // if (main.Maintenance_Price_Amount__c == 0) { // mainTask1.Maintenance_Consumption_rate__c = 0; // }else{ // mainTask1.Maintenance_Consumption_rate__c = Decimal.valueOf(currentTotalRepairAmount) / main.Maintenance_Price_Amount__c * 100; // } mainTasks.add(mainTask1); } } }else{ //市场多年保任务发送修改 20230505 start if (main.startDateGurantee__c.monthsBetween(main.endDateGurantee__c) > 0 && main3Nepr.containsKey(main.Id)) { Integer nper = main4Nepr.get(main.Id); system.debug('nper=='+nper); //多年保修消费率计算分子 Double currentTotalRepairAmount = 0; //本期修理金额总额 // Double previousTotalRepairAmount = 0; //上期修理金额总额 if (ma2Repair.containsKey(main.Id) && ma2Repair.get(main.Id).size() > 0) { for(Repair__c rc : ma2Repair.get(main.Id)){ currentTotalRepairAmount += rc.Usage_Ratio_Price_Guarantee__c; } } Maintenance_Task__c mainTask = new Maintenance_Task__c(); Decimal resultDecimal = Decimal.valueOf(main.startDateGurantee__c.monthsBetween(main.endDateGurantee__c)) / 6; Integer resultUp = Integer.valueOf(resultDecimal.round(System.RoundingMode.UP)); mainTask.Taget_Gurante__c = main3Nepr.get(main.Id); mainTask.Nper__c = nper; mainTask.Interval_Start_Date__c = today; mainTask.Interval_End_Date__c = today.addMonths(6); mainTask.Maintenance_Consumption_rate__c = main.Consumption_rate_Gurante__c; mainTask.Reference_Consumption_Rate__c = Decimal.valueOf(main3Nepr.get(main.Id).replace('%', '')); mainTask.Maintenance_Contract__c = main.Id; mainTask.Is_Generate_Task__c = false; mainTask.Name = 'DNalert---' + mainTask.Taget_Gurante__c; mainTask.Is_Generate_Task__c = true; if (mainTask.Taget_Gurante__c!=null) { mainTasks.add(mainTask); } } } //市场多年保任务发送修改 20230505 end }else{ // 服务合同或维修合同 if (main.Contract_Start_Date__c.monthsBetween(main.Contract_End_Date__c) > 0 && main2Nepr.containsKey(main.Id)) { Integer nper = main2Nepr.get(main.Id); Maintenance_Task__c mainTask = new Maintenance_Task__c(); Decimal resultDecimal = Decimal.valueOf(main.Contract_Start_Date__c.monthsBetween(main.Contract_End_Date__c)) / 6; Integer resultUp = Integer.valueOf(resultDecimal.round(System.RoundingMode.UP)); mainTask.Nper__c = nper;//期数 mainTask.Interval_Start_Date__c = main.Contract_Start_Date__c.addMonths((nper-1) * 6); //半年度区间开始日期 mainTask.Interval_End_Date__c = main.Contract_Start_Date__c.addMonths((nper) * 6).addDays(-1); //半年度区间结束日期 mainTask.Reference_Consumption_Rate__c = Decimal.valueOf(100) / resultUp * nper ; //参考消费率 mainTask.Maintenance_Consumption_rate__c = main.Contract_Consumption_rate__c; mainTask.Maintenance_Contract__c = main.Id; mainTask.Is_Generate_Task__c = true; if ('NewMaintenance_Contract'.equals(main.RecordType.DeveloperName)) { if (nper < 10) { mainTask.Name = 'FWalert-0' + nper; }else{ mainTask.Name = 'FWalert-' + nper; } }else if ('Maintenance_Contract'.equals(main.RecordType.DeveloperName)) { if (nper < 10) { mainTask.Name = 'WXalert-0' + nper; }else{ mainTask.Name = 'WXalert-' + nper; } } mainTasks.add(mainTask); if (today > main.Contract_End_Date__c.addMonths(-6) && today < main.Contract_End_Date__c) { // 如果是最后一个区间,生成两条数据 Maintenance_Task__c mainTask1 = new Maintenance_Task__c(); mainTask1.Interval_Start_Date__c = main.Contract_End_Date__c.addMonths(-6); mainTask1.Interval_End_Date__c = main.Contract_End_Date__c; mainTask1.Reference_Consumption_Rate__c = 100; mainTask1.Maintenance_Consumption_rate__c = main.Contract_Consumption_rate__c; mainTask1.Maintenance_Contract__c = main.Id; mainTask1.Is_Generate_Task__c = true; mainTask1.Nper__c = nper+1; if ('NewMaintenance_Contract'.equals(main.RecordType.DeveloperName)) { if (nper < 10) { mainTask1.Name = 'FWalert-0' + mainTask1.Nper__c; }else{ mainTask1.Name = 'FWalert-' + mainTask1.Nper__c; } }else if ('Maintenance_Contract'.equals(main.RecordType.DeveloperName)) { if (nper < 10) { mainTask1.Name = 'WXalert-0' + mainTask1.Nper__c; }else{ mainTask1.Name = 'WXalert-' + mainTask1.Nper__c; } } mainTasks.add(mainTask1); } updateMainIds.add(main.Id); } } } List tasks = [SELECT Id,Maintenance_Contract__c,Activity_Date__c,Maintenance_Task__c FROM task__c WHERE Maintenance_Contract__c = :updateMainIds AND RecordType.DeveloperName = 'MaintenanceTask' AND taskDifferent__c = '主动任务' ORDER BY Activity_Date__c DESC NULLS FIRST]; List updateMainTasks = new List(); Map main2Tasks = new Map(); if (mainTasks.size()>0) { insert mainTasks; //insert维修合同任务 for(Maintenance_Task__c mainta : mainTasks){ // Boolean isTask = false; if ((mainta.Is_Generate_Task__c && mcIDmap.get(mainta.Maintenance_Contract__c).RecordType_DeveloperName__c =='VM_Contract') || Test.isRunningTest()) { // if (mainta.Maintenance_Consumption_rate__c > mainta.Reference_Consumption_Rate__c ) { //多年保修消费率>参考消费率,需要关联任务 // if ((mainta.Maintenance_Consumption_rate__c > mainta.Reference_Consumption_Rate__c // && today == mainta.Interval_End_Date__c.addDays(1)) || Test.isRunningTest()) { //多年保修消费率>参考消费率,需要关联任务 // for(task__c ta : tasks){ // if (mainta.Maintenance_Contract__c == ta.Maintenance_Contract__c // && ta.Activity_Date__c >= mainta.Interval_End_Date__c // && ta.Activity_Date__c <= mainta.Interval_End_Date__c.addDays(30)) { // mainta.Task__c = ta.Id; // mainta.Is_Generate_Task__c = false; // updateMainTasks.add(mainta); // isTask = true; // break; // } // } // if (!isTask) { // 多年保创建被动任务并关联到维修合同任务 if(mcIDmap.get(mainta.Maintenance_Contract__c).Service_Contract_Staff__r.IsActive){//2021-08-30 yjk 判断用户是否启用 task__c task = new task__c(); task.RecordTypeId = maintenanceTaskId; task.taskDifferent__c = '被动任务'; task.taskStatus__c = '01 分配'; task.Maintenance_Contract__c = mainta.Maintenance_Contract__c; task.assignee__c = mcIDmap.get(mainta.Maintenance_Contract__c).Service_Contract_Staff__c; // task.OpportunityId__c = mcIDmap.get(mainta.Maintenance_Contract__c).Opportunity__c; task.account__c = mcIDmap.get(mainta.Maintenance_Contract__c).Department__c; task.Name = '多年保修消费率预警任务(' + mcIDmap.get(mainta.Maintenance_Contract__c).Department__r.Name + ')'; task.OwnerId = mcIDmap.get(mainta.Maintenance_Contract__c).Service_Contract_Staff__c; insertTasks.add(task); //市场多年保任务发送修改 20230505 start main2Tasks.put(task.Maintenance_Contract__c,mainta); //市场多年保任务发送修改 20230505 end } // } // } }else if(mainta.Is_Generate_Task__c && mcIDmap.get(mainta.Maintenance_Contract__c).RecordType_DeveloperName__c !='VM_Contract') { for(task__c ta : tasks){ if (mainta.Maintenance_Contract__c == ta.Maintenance_Contract__c && ta.Activity_Date__c >= mainta.Interval_Start_Date__c && ta.Activity_Date__c <= mainta.Interval_End_Date__c && mainta.Task__c == null) { mainta.Task__c = ta.Id; mainta.Is_Generate_Task__c = false; updateMainTasks.add(mainta); } } } } } if (insertTasks.size() > 0) { insert insertTasks; } for(task__c t : insertTasks){ if (main2Tasks.containsKey(t.Maintenance_Contract__c)) { Maintenance_Task__c mainta = main2Tasks.get(t.Maintenance_Contract__c); mainta.Task__c = t.Id; mainta.Is_Generate_Task__c = false; if (!updateMainTasks.contains(mainta)) { updateMainTasks.add(mainta); } } } if (updateMainTasks.size() > 0) { update updateMainTasks; } if (System.Test.isRunningTest()) { integer i = 0; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; } } global void finish(Database.BatchableContext BC) { //20210203 zh SWAG-BXQDHZ start //if(!Test.isRunningTest() && isExecuteOpp == true){ // Database.executebatch(new CreateOpportunityTaskBatch(true), 20); //} //20210203 zh SWAG-BXQDHZ end //2021-07-13 mzy SWAG-C4V6GU 询价任务派送时间更改 if(!System.Test.isRunningTest() && isExecuteOPD == true){ Database.executebatch(new CreatePassiveTaskBatch(true), 10); } //2021-07-13 mzy SWAG-C4V6GU 询价任务派送时间更改 } }