| | |
| | | */ |
| | | global class CreateMaintenanceTaskBatch implements Database.Batchable<sObject> { |
| | | String tempMainId; |
| | | List<String> ids; |
| | | //Boolean isExecuteOpp; //20210203 zh SWAG-BXQDHZ 是否执行Oppo |
| | | Boolean isExecuteOPD; //20210713 mzy SWAG-C4V6GU 询价任务派送时间更改 |
| | | |
| | |
| | | this.tempMainId = id; |
| | | isExecuteOPD = false; //20210203 zh SWAG-BXQDHZ 2021-07-13 mzy 询价任务派送时间更改 |
| | | } |
| | | public CreateMaintenanceTaskBatch(List<String> 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 endDateGurantee__c,startDateGurantee__c,RecordType.DeveloperName,Contract_Start_Date__c,Contract_End_Date__c,RecordType_DeveloperName__c,' |
| | | 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 ' |
| | |
| | | // +'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); |
| | |
| | | Id maintenanceTaskId = Schema.SObjectType.task__c.getRecordTypeInfosByDeveloperName().get('VM_Contract_Task').getRecordTypeId(); |
| | | List<task__c> insertTasks = new List<task__c>(); |
| | | Map<String,Integer> main2Nepr = new Map<String,Integer>(); |
| | | //市场多年保任务发送修改 20230505 start |
| | | Map<String,String> main3Nepr = new Map<String,String>(); |
| | | Map<String,Integer> main4Nepr = new Map<String,Integer>(); |
| | | //市场多年保任务发送修改 20230505 end |
| | | List<String> mainIds = new List<String>(); |
| | | map<string,Maintenance_Contract__c> mcIDmap = new map<string,Maintenance_Contract__c>(); |
| | | |
| | | 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)) { |
| | | nper = i-1; |
| | | //市场多年保任务发送修改 20230505 start |
| | | system.debug('是否小于20230401==='+(tempMC.CreatedDate__c<Date.newInstance(2023, 4, 1))); |
| | | |
| | | if (tempMC.CreatedDate__c<Date.newInstance(2023, 4, 1)) { |
| | | nper = i-1; |
| | | }else{ |
| | | nper1 = i-1; |
| | | } |
| | | //市场多年保任务发送修改 20230505 end |
| | | } |
| | | |
| | | }else { |
| | | if (today >= 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) { |
| | |
| | | |
| | | } |
| | | System.debug('main2Nepr 1----'+main2Nepr); |
| | | List<Maintenance_Task__c> existMainTasks = [SELECT Id,Name,Nper__c,Maintenance_Contract__c FROM Maintenance_Task__c WHERE Maintenance_Contract__c IN : mainIds]; |
| | | List<Maintenance_Task__c> 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涉及的维修合同对应的保有设备 |
| | |
| | | // System.debug('----count---'+main.startDateGurantee__c); |
| | | // System.debug('----count1---'+main.endDateGurantee__c); |
| | | if ('VM_Contract'.equals(main.RecordType.DeveloperName)) { //多年保修合同 |
| | | if (main.startDateGurantee__c.monthsBetween(main.endDateGurantee__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)) { |
| | | //市场多年保任务发送修改 20230505 start |
| | | if (main.CreatedDate__c<Date.newInstance(2023, 4, 1)) { |
| | | //市场多年保任务发送修改 20230505 end |
| | | if (main.startDateGurantee__c.monthsBetween(main.endDateGurantee__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; //上期修理金额总额 |
| | |
| | | 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)) { //多年保修消费率>参考消费率,需要关联任务 |
| | | 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; |
| | | // 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 (mainTask.Taget_Gurante__c!=null) { |
| | | mainTasks.add(mainTask); |
| | | } |
| | | // 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); |
| | | } |
| | | // } |
| | | } |
| | | } |
| | | } |
| | | //市场多年保任务发送修改 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); |
| | |
| | | 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 |
| | | } |
| | | // } |
| | | // } |
| | |
| | | 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) { |