黄千龙
2023-05-26 8b906287ba1b980028a9734b972f827686346752
合同任务派发修改
2个文件已修改
316 ■■■■ 已修改文件
force-app/main/default/classes/CreateMaintenanceTaskBatch.cls 303 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/classes/CreateMaintenanceTaskBatchTest.cls 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/classes/CreateMaintenanceTaskBatch.cls
@@ -4,6 +4,7 @@
 */
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   询价任务派送时间更改
@@ -15,13 +16,17 @@
        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 '
@@ -31,6 +36,9 @@
                        // +'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);
@@ -43,32 +51,69 @@
        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) {
@@ -77,11 +122,17 @@
            
        }
        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涉及的维修合同对应的保有设备
@@ -149,13 +200,83 @@
            // 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; //上期修理金额总额
@@ -164,61 +285,25 @@
                                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);
@@ -315,7 +400,9 @@
                            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
                        }
                //     }
                // }
@@ -353,6 +440,94 @@
        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) {
force-app/main/default/classes/CreateMaintenanceTaskBatchTest.cls
@@ -127,7 +127,7 @@
        asset.Guarantee_period_year__c = 3;
        insert asset;
        Maintenance_Contract__c mContract = createMaintenanceContract(hp, dc, dpt1);
        mContract.currentTotalRepairAmount__c = 3;
        mContract.currentTotalRepairAmount__c = 300000;
        mContract.previousTotalRepairAmount__c = 2;
        update mContract;
        Maintenance_Contract_Asset__c middleTable = new Maintenance_Contract_Asset__c();
@@ -150,6 +150,8 @@
        // insert mainTask;
        
        System.Test.StartTest();
        Maintenance_Contract__c mc1 = [select id,Maintenance_Price_Amount__c from Maintenance_Contract__c where currentTotalRepairAmount__c = 300000 limit 1];
        system.debug('mc1==****==========================================='+mc1.Maintenance_Price_Amount__c);
        Database.executeBatch(new CreateMaintenanceTaskBatch(mContract.Id));
        System.Test.StopTest();
    }
@@ -193,7 +195,7 @@
        asset.Guarantee_period_year__c = 3;
        insert asset;
        Maintenance_Contract__c mContract = createMaintenanceContract(hp, dc, dpt1);
        mContract.currentTotalRepairAmount__c = 3;
        mContract.currentTotalRepairAmount__c = 300;
        mContract.previousTotalRepairAmount__c = 2;
        update mContract;
@@ -225,6 +227,8 @@
        // insert task;
        
        System.Test.StartTest();
        Maintenance_Contract__c mc1 = [select id,Maintenance_Price_Amount__c from Maintenance_Contract__c where currentTotalRepairAmount__c = 300 limit 1];
        system.debug('mc1==****'+mc1.Maintenance_Price_Amount__c);
        Database.executeBatch(new CreateMaintenanceTaskBatch());
        System.Test.StopTest();
    }
@@ -285,6 +289,8 @@
        contract.Hospital__c = hp.Id;
        contract.Department_Class__c = dc.Id;
        contract.Department__c = dpt1.Id;
        contract.currentTotalRepairAmount__c = 300000;
        contract.previousTotalRepairAmount__c = 2;
        contract.Service_Contract_Staff__c = UserInfo.getUserId();
        contract.Payment_Plan_Sum_First__c = 1;
        contract.Status__c = '契約';
@@ -307,6 +313,8 @@
        contract2.Hospital__c = hp.Id;
        contract2.Department_Class__c = dc.Id;
        contract2.Department__c = dpt1.Id;
        contract2.currentTotalRepairAmount__c = 300000;
        contract2.previousTotalRepairAmount__c = 2;
        contract2.Contract_Start_Date__c = Date.newInstance(2020, 12, 31);
        contract2.Contract_End_Date__c = Date.newInstance(2023, 12, 31);
        contract2.SalesOfficeCode_selection__c = '北京RC';
@@ -321,6 +329,7 @@
        middleTable.startDateGurantee_changgeAcc__c = Date.newInstance(2020, 12,31);
        middleTable.Return_Flag__c = false;
        middleTable.ChangeAcc_flag__c = false;
        middleTable.Maintenance_Price_Amount_Text__c = 120000;
        middleTable.No_discount__c = 1;
        insert middleTable;