8b906287ba1b980028a9734b972f827686346752..dec96e2f8b84ea04d773c0c520c39b0822912ee3
2023-05-26 D C
Merge branch 'master' of http://47.92.229.245:8089/r/OlyMEBG
dec96e 对比 | 目录
2023-05-26 D C
维修合同 多年保修消费率逻辑更改
9a0ef8 对比 | 目录
6个文件已添加
1个文件已修改
463 ■■■■■ 已修改文件
force-app/main/default/classes/ConsumAutoSelectBatchSchedule.cls 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/classes/ConsumAutoSelectBatchScheduleTest.cls 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/classes/ConsumAutoSelectBatchScheduleTest.cls-meta.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/classes/SummaryConsumptionRateBatch.cls 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/classes/SummaryConsumptionRateBatch.cls-meta.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/classes/SummaryConsumptionRateBatchTest.cls 360 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/classes/SummaryConsumptionRateBatchTest.cls-meta.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
force-app/main/default/classes/ConsumAutoSelectBatchSchedule.cls
@@ -1,5 +1,9 @@
global class ConsumAutoSelectBatchSchedule implements Schedulable {
    global void execute(SchedulableContext sc) {
        ConsumAutoSelectBatch.run();
        // 2023/04/19  add SummaryContractFMBatch
        Id execBTId = Database.executeBatch(new SummaryContractFMBatch(),100);
        //2023/05/11 add SummaryConsumptionRateBatch
        Id execConsumptionRateId = Database.executeBatch(new SummaryConsumptionRateBatch(),100);
    }
}
force-app/main/default/classes/ConsumAutoSelectBatchScheduleTest.cls
New file
@@ -0,0 +1,22 @@
@isTest
private class ConsumAutoSelectBatchScheduleTest {
    @isTest static void test_method() {
        // Implement test code
        String CRON_EXP = '0 0 0 3 9 ? 2024';
         System.Test.startTest();
        // Schedule the test job
        String jobId = system.schedule('ConsumAutoSelectBatchScheduleTest', CRON_EXP, new ConsumAutoSelectBatchSchedule());
        // Get the information from the CronTrigger API object
        CronTrigger ct = [SELECT Id, CronExpression, TimesTriggered, NextFireTime FROM CronTrigger WHERE id = :jobId];
        // Verify the expressions are the same
        System.assertEquals(CRON_EXP, ct.CronExpression);
        // Verify the job has not run
        // System.assertEquals(0, ct.TimesTriggered);
        // Verify the next time the job will run
        System.assertEquals('2024-09-03 00:00:00', String.valueOf(ct.NextFireTime));
        System.Test.StopTest();
    }
}
force-app/main/default/classes/ConsumAutoSelectBatchScheduleTest.cls-meta.xml
New file
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata">
    <apiVersion>44.0</apiVersion>
    <status>Active</status>
</ApexClass>
force-app/main/default/classes/SummaryConsumptionRateBatch.cls
New file
@@ -0,0 +1,62 @@
/**************************************************************************************************
@Author: Denny陈帮才
@Name: SummaryConsumptionRateBatch
@CreateDate: 2023/05/08
@Description: 多年保修合同  合同消费率分子分母赋值
@Version 1.0
*****************************************************************************************************/
global class SummaryConsumptionRateBatch implements Database.Batchable<sObject>,Database.Stateful {
    global SummaryConsumptionRateBatch() {
    }
    global List<Maintenance_Contract__c> start(Database.BatchableContext bc) {
        List<Maintenance_Contract__c> mcUpdateList =  [SELECT Id,VM_Consumption_Rate_Molecular__c,VM_Consumption_Rate_Denominator__c FROM
                                    Maintenance_Contract__c WHERE RecordType_Name__c = '多年保修合同' AND RecordType_DeveloperName__c = 'VM_Contract' AND (Status__c = '契約' OR Status__c = '契約満了')];
        return mcUpdateList;
    }
    global void execute(Database.BatchableContext BC, list<Maintenance_Contract__c> mcUpdateList) {
        List<String> mcIds = new List<String>();
        for (Maintenance_Contract__c mcObj : mcUpdateList) {
            mcIds.add(mcObj.Id);
        }
        List<Maintenance_Contract_Asset__c> scope = [SELECT Id,Summary_FZ__c,Summary_FM_Year__c,Maintenance_Contract__c FROM Maintenance_Contract_Asset__c WHERE Maintenance_Contract__c IN :mcIds
                                                AND Maintenance_Contract__r.RecordType_DeveloperName__c ='VM_Contract' AND Asset__r.RecordType.Name!='备品' AND
                                                (Maintenance_Contract__r.Status__c='契約' OR Maintenance_Contract__r.Status__c='契約満了')];
        //2023/05/08  多年保修合同  合同消费率分子分母赋值 start
        List<String>  mcIdList= new List<String>();
        Map<Id,Decimal>  vmMolecularMap = new Map<Id,Decimal>();
        Map<Id,Decimal>  vmDenominatorMap = new Map<Id,Decimal>();
        for ( Maintenance_Contract_Asset__c mc : scope) {
            Decimal vmMolecular = 0;
            Decimal vmDenominator = 0;
            if (vmMolecularMap.containsKey(mc.Maintenance_Contract__c)) {
                vmMolecular = vmMolecularMap.get(mc.Maintenance_Contract__c);
                vmDenominator = vmDenominatorMap.get(mc.Maintenance_Contract__c);
            }
            //Summary_FM_Year__c  分母   Summary_FZ__c  分子
            vmMolecular += (mc.Summary_FZ__c == null ? 0 : mc.Summary_FZ__c);
            vmDenominator += (mc.Summary_FM_Year__c == null ? 0 : mc.Summary_FM_Year__c);
            mcIdList.add(mc.Maintenance_Contract__c);
            vmMolecularMap.put(mc.Maintenance_Contract__c,vmMolecular);
            vmDenominatorMap.put(mc.Maintenance_Contract__c,vmDenominator);
        }
        for (Maintenance_Contract__c mcObj : mcUpdateList) {
            if (vmMolecularMap.containsKey(mcObj.Id)) {
                mcObj.VM_Consumption_Rate_Molecular__c = vmMolecularMap.get(mcObj.Id);
                mcObj.VM_Consumption_Rate_Denominator__c = vmDenominatorMap.get(mcObj.Id)*3;
            }
        }
        update mcUpdateList;
        //2023/05/08  多年保修合同  合同消费率分子分母赋值 end
    }
    global void finish(Database.BatchableContext BC) {
    }
}
force-app/main/default/classes/SummaryConsumptionRateBatch.cls-meta.xml
New file
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata">
    <apiVersion>56.0</apiVersion>
    <status>Active</status>
</ApexClass>
force-app/main/default/classes/SummaryConsumptionRateBatchTest.cls
New file
@@ -0,0 +1,360 @@
// 2023/05/11 多年保修合同  合同消费率分子分母赋值 Batch测试类
@isTest
private class SummaryConsumptionRateBatchTest {
    static testMethod void testBatch() {
        System.Test.startTest();
        database.executeBatch(new SummaryConsumptionRateBatch(),200);
        List<Maintenance_Contract__c> mcUpdateList =  [SELECT Id,Name,VM_Consumption_Rate_Molecular__c,VM_Consumption_Rate_Denominator__c FROM
                                    Maintenance_Contract__c WHERE RecordType_Name__c = '多年保修合同' AND RecordType_DeveloperName__c = 'VM_Contract'
                                    AND (Status__c = '契約' OR Status__c = '契約満了') And Name = '::tect contract'
                                    ];
        System.assert(mcUpdateList.size() > 0);
        System.Test.stopTest();
    }
    @testSetup
    private static void setUpDate(){
        //2023/03/30  跳过RepairAgainAnTrigger
        // StaticParameter.RepairAgainAnStaTrigger = false;
        // 病院を作る
        Date toDayTime = Date.today();
        Account hospital = new Account();
        hospital.recordtypeId = [Select Id FROM RecordType WHERE IsActive = true and SobjectType = 'Account' and DeveloperName = 'HP'].id;
        hospital.Name = 'hospitalabc';
        hospital.Is_Active__c = '有効';
        hospital.Attribute_Type__c = '卫生部';
        hospital.Speciality_Type__c = '综合医院';
        hospital.Grade__c = '一级';
        hospital.IF_Coverage_Target_HP__c = '1';
        hospital.OCM_Category__c = 'SLTV';
        hospital.Is_Medical__c = '医疗机构';
        hospital.Town__c = '东京';
        Oly_TriggerHandler.bypass('NFM701ControllerHandler');
        Oly_TriggerHandler.bypass('UpdateContractAimAmountHandler');
        insert hospital;
        // 戦略科室を得る
        Account[] strategicDep = [SELECT ID, Name FROM Account WHERE parentId = :hospital.Id AND recordType.DeveloperName = 'Department_Class_OTH'];
        // 診療科を作る
        Account dep = new Account();
        dep.recordtypeId = [Select Id FROM RecordType WHERE IsActive = true and SobjectType = 'Account' and DeveloperName = 'Department_OTH'].id;
        dep.Name = 'test dep';
        dep.AgentCode_Ext__c = System.Label.Account_Asset_FJZ;
        dep.ParentId = strategicDep[0].Id;
        dep.Department_Class__c = strategicDep[0].Id;
        dep.Hospital__c = hospital.Id;
        Oly_TriggerHandler.bypass('NFM701ControllerHandler');
        Oly_TriggerHandler.bypass('UpdateContractAimAmountHandler');
        insert dep;
        // 产品
        Product2 pro1 = new Product2(Name='name01',IsActive=true,Family='GI',
                Category5__c = '11',
                Service_Category3__c ='软性镜',
                Fixture_Model_No__c='n01',Serial_Lot_No__c='S/N tracing',
                Fixture_Model_No_T__c = 'n01',
                Maintenance_Price_Year__c = 999,
                Extend_Gurantee_Start_MD__c = Date.newInstance(toDayTime.year(),3,2),
                Extend_Gurantee_End_MD__c = Date.newInstance(3999,12,31),
                Extend_new_product_gurantee_MD__c = true,
                PartSupplyFinishDate__c  = Date.newInstance(toDayTime.year()+2,3,2),
                ProductCode_Ext__c='pc01',Manual_Entry__c=false,Brand_Name__c='奥林巴斯',
                Category2__c='本体',
                Category3__c='电子镜');
        Product2 pro2 = new Product2(Name='name02',IsActive=true,Family='GI',
                Service_Category3__c ='软性镜',
                Fixture_Model_No__c='n02',Serial_Lot_No__c='Lot tracing',
                ProductCode_Ext__c='pc02',Manual_Entry__c=false,Brand_Name__c='奥林巴斯',
                Category2__c='本体',
                Extend_Gurantee_Start_MD__c = Date.newInstance(toDayTime.year(),3,2),
                Extend_Gurantee_End_MD__c = Date.newInstance(3999,12,31),
                Extend_new_product_gurantee_MD__c = true,
                PartSupplyFinishDate__c  = Date.newInstance(toDayTime.year()+2,3,2),
                Maintenance_Price_Year__c = 999,
                Category3__c='纤维镜');
        Product2 pro3 = new Product2(Name='name03',IsActive=true,Family='GI',
                Service_Category3__c ='软性镜',
                Fixture_Model_No__c='n03',Serial_Lot_No__c='Lot tracing',
                PartSupplyFinishDate__c  = Date.newInstance(toDayTime.year()+2,3,2),
                ProductCode_Ext__c='pc03',Manual_Entry__c=false,Brand_Name__c='奥林巴斯',
                Category2__c='本体',
                Extend_Gurantee_Start_MD__c = Date.newInstance(toDayTime.year(),3,2),
                Extend_Gurantee_End_MD__c = Date.newInstance(3999,12,31),
                Extend_new_product_gurantee_MD__c = true,
                Maintenance_Price_Year__c = 999,
                Category3__c='电子镜');
        Product2 pro4 = new Product2(Name='name04',IsActive=true,Family='GI',
                Service_Category3__c ='软性镜',
                Fixture_Model_No__c='n04',Serial_Lot_No__c='Lot tracing',
                ProductCode_Ext__c='pc04',Manual_Entry__c=false,Brand_Name__c='奥林巴斯',
                Category4__c='SD EndoEYE',
                Extend_Gurantee_Start_MD__c = Date.newInstance(toDayTime.year(),3,2),
                Extend_Gurantee_End_MD__c = Date.newInstance(3999,12,31),
                Extend_new_product_gurantee_MD__c = true,
                PartSupplyFinishDate__c  = Date.newInstance(toDayTime.year()+2,3,2),
                Maintenance_Price_Year__c = 999);
        Product2 pro5 = new Product2(Name='name05',IsActive=true,Family='GI',
                Service_Category3__c ='软性镜',
                Fixture_Model_No__c='n05',Serial_Lot_No__c='Lot tracing',Brand_Name__c='奥林巴斯',
                // Category2__c='本体',
                Extend_Gurantee_Start_MD__c = Date.newInstance(toDayTime.year(),3,2),
                Extend_Gurantee_End_MD__c = Date.newInstance(3999,12,31),
                Extend_new_product_gurantee_MD__c = true,
                Maintenance_Price_Year__c = 999,
                PartSupplyFinishDate__c  = Date.newInstance(toDayTime.year()+2,3,2),
                ProductCode_Ext__c='pc05',Manual_Entry__c=false,
                Category3__c = 'EUS主机');
        insert new Product2[] {pro1, pro2, pro3,pro4,pro5};
        Maintenance_Contract__c contract = new Maintenance_Contract__c();
        contract.Name = 'tect contract';
        contract.status__c ='契約';
        contract.Maintenance_Contract_No__c = 'Kami_Contract_No';
        contract.Contract_Conclusion_Date__c = Date.today();
        contract.Hospital__c = hospital.Id;
        contract.Department_Class__c = strategicDep[0].Id;
        contract.Department__c = dep.Id;
        contract.Contract_Start_Date__c=Date.newInstance(toDayTime.year()-2,5,2);
        contract.Contract_End_Date__c = Date.newInstance(toDayTime.year(),5,20);
        contract.SalesOfficeCode_selection__c = '北京RC';
        contract.RecordTypeId = Schema.SObjectType.Maintenance_Contract__c.getRecordTypeInfosByDeveloperName().get('VM_Contract').getRecordTypeId();
        insert contract;
        System.assert(contract.Id != null);
        List<Maintenance_Contract__c> MaintenanceContract=[select id,Name from Maintenance_Contract__c];
        //---------------------------主体 两个附属品(个体管理 数量管理)
        // 保有设备A (主体)
        Asset assetA1 = new Asset(Asset_Owner__c = 'Olympus');
        // assetA1.RecordTypeId = System.Label.Asset_RecordType;
        // 2023/03/30  医院保有设备
        assetA1.RecordTypeId = Schema.SObjectType.Asset.getRecordTypeInfosByDeveloperName().get('HPAsset').getRecordTypeId();
        assetA1.SerialNumber = 'ass01';
        assetA1.Name = 'ass01';
        assetA1.AccountId = dep.Id;
        assetA1.Guarantee_period_for_products__c = toDayTime.addMonths(6);
        assetA1.Department_Class__c = strategicDep[0].Id;
        assetA1.Hospital__c = hospital.Id;
        assetA1.Product2Id = pro1.Id;
        assetA1.Quantity = 1;
        // assetA1.Asset_Year__c = Date.today().addYears(-1);
        assetA1.Status = '使用中';
        assetA1.Manage_type__c = '个体管理';
        assetA1.Loaner_accsessary__c = false;
        assetA1.Product_category__c = 'GI';
        assetA1.Delete_Flag__c = false;
        assetA1.Freeze_sign__c = false;
        assetA1.Out_of_wh__c = 0;
        assetA1.Salesdepartment__c = '1.华北营业本部';
        assetA1.Internal_asset_location__c = '北京 备品中心';
        assetA1.Product_category__c = 'GI';
        assetA1.Equipment_Type__c = '产品试用';
        assetA1.SalesProvince__c = '北京';
        assetA1.WH_location__c = '货架号1';
        assetA1.Asset_loaner_category__c = '固定资产';
        assetA1.CompanyOfEquipment__c = '123';
        assetA1.Internal_Asset_number__c = '123';
        assetA1.CurrentContract__c=MaintenanceContract[0].Id;
        assetA1.InstallDate =Date.newInstance(2021, 5, 1);
        // assetA1.AssetManageConfirm__c = true;
        // 保有设备A (附属品 数量管理)
        Asset assetA2 = new Asset(Asset_Owner__c = 'Olympus');
        assetA2.RecordTypeId = System.Label.Asset_RecordType;
        assetA2.SerialNumber = 'ass02';
        assetA2.Name = 'ass02';
        assetA2.AccountId = dep.Id;
        assetA2.Department_Class__c = strategicDep[0].Id;
        assetA2.Hospital__c = hospital.Id;
        assetA2.Product2Id = pro2.Id;
        assetA2.Quantity = 10;
        assetA2.Status = '使用中';
        // assetA1.Asset_Year__c = Date.today().addYears(-1);
        assetA2.Manage_type__c = '数量管理';
        assetA2.Loaner_accsessary__c = true;
        assetA2.Product_category__c = 'GI';
        assetA2.Delete_Flag__c = false;
        assetA2.Guarantee_period_for_products__c = toDayTime;
        assetA2.Freeze_sign__c = false;
        assetA2.Out_of_wh__c = 3;
        assetA2.Frozen_Quantity__c = 2;
        assetA2.Salesdepartment__c = '1.华北营业本部';
        assetA2.Internal_asset_location__c = '北京 备品中心';
        assetA2.Product_category__c = 'GI';
        assetA2.Equipment_Type__c = '产品试用';
        assetA2.SalesProvince__c = '北京';
        assetA2.WH_location__c = '货架号2';
        assetA2.Asset_loaner_category__c = '固定资产';
        assetA2.CompanyOfEquipment__c = '123';
        assetA2.Internal_Asset_number__c = '123';
        assetA2.CurrentContract__c=MaintenanceContract[0].Id;
        assetA2.InstallDate =Date.newInstance(2016, 5, 1);
        // assetA2.AssetManageConfirm__c = true;
        // 保有设备A (附属品 个体管理)
        Asset assetA3 = new Asset(Asset_Owner__c = 'Olympus');
        assetA3.RecordTypeId = System.Label.Asset_RecordType;
        assetA3.SerialNumber = 'ass03';
        assetA3.Name = 'ass03';
        assetA3.AccountId = dep.Id;
        assetA3.Department_Class__c = strategicDep[0].Id;
        assetA3.Hospital__c = hospital.Id;
        assetA3.Product2Id = pro3.Id;
        assetA3.Quantity = 10;
        assetA3.Status = '使用中';
        assetA3.Manage_type__c = '数量管理';
        assetA3.Loaner_accsessary__c = true;
        assetA3.Product_category__c = 'GI';
        assetA3.Delete_Flag__c = false;
        assetA3.Guarantee_period_for_products__c = toDayTime;
        assetA3.Freeze_sign__c = false;
        assetA3.Out_of_wh__c = 3;
        assetA3.Salesdepartment__c = '1.华北营业本部';
        assetA3.Internal_asset_location__c = '北京 备品中心';
        assetA3.Product_category__c = 'GI';
        assetA3.Equipment_Type__c = '产品试用';
        assetA3.SalesProvince__c = '北京';
        assetA3.WH_location__c = '货架号3';
        assetA3.Abandoned_Inventory__c = 1;
        assetA3.Asset_loaner_category__c = '固定资产';
        assetA3.CompanyOfEquipment__c = '123';
        assetA3.Internal_Asset_number__c = '123';
        assetA3.CurrentContract__c=MaintenanceContract[0].Id;
    // 保有设备A (附属品 数量管理)
        Asset assetA4 = new Asset(Asset_Owner__c = 'Olympus');
        assetA4.RecordTypeId = System.Label.Asset_RecordType;
        assetA4.SerialNumber = 'ass04';
        assetA4.Name = 'ass04';
        assetA4.AccountId = dep.Id;
        assetA4.Department_Class__c = strategicDep[0].Id;
        assetA4.Hospital__c = hospital.Id;
        assetA4.Product2Id = pro4.Id;
        assetA4.Quantity = 10;
        assetA4.Guarantee_period_for_products__c = toDayTime;
        assetA4.Status = '使用中';
        assetA4.Manage_type__c = '数量管理';
        assetA4.Loaner_accsessary__c = true;
        assetA4.Product_category__c = 'GI';
        assetA4.Delete_Flag__c = false;
        assetA4.Freeze_sign__c = false;
        assetA4.Out_of_wh__c = 3;
        assetA4.Frozen_Quantity__c = 2;
        assetA4.Salesdepartment__c = '1.华北营业本部';
        assetA4.Internal_asset_location__c = '北京 备品中心';
        assetA4.Product_category__c = 'GI';
        assetA4.Equipment_Type__c = '产品试用';
        assetA4.SalesProvince__c = '北京';
        assetA4.WH_location__c = '货架号2';
        assetA4.Asset_loaner_category__c = '固定资产';
        assetA4.CompanyOfEquipment__c = '123';
        assetA4.Internal_Asset_number__c = '123';
        assetA4.CurrentContract__c=MaintenanceContract[0].Id;
        // assetA2.AssetManageConfirm__c = true;
        // 保有设备A (附属品 数量管理)
        Asset assetA5 = new Asset(Asset_Owner__c = 'Olympus');
        assetA5.RecordTypeId = System.Label.Asset_RecordType;
        assetA5.SerialNumber = 'ass05';
        assetA5.Name = 'ass05';
        assetA5.AccountId = dep.Id;
        assetA5.Department_Class__c = strategicDep[0].Id;
        assetA5.Hospital__c = hospital.Id;
        assetA5.Product2Id = pro5.Id;
        assetA5.Quantity = 10;
        assetA5.Status = '使用中';
        assetA5.Manage_type__c = '数量管理';
        assetA5.Loaner_accsessary__c = true;
        assetA5.Product_category__c = 'GI';
        assetA5.Delete_Flag__c = false;
        assetA5.Guarantee_period_for_products__c = toDayTime;
        assetA5.Freeze_sign__c = false;
        assetA5.Out_of_wh__c = 3;
        assetA5.Frozen_Quantity__c = 2;
        assetA5.Salesdepartment__c = '1.华北营业本部';
        assetA5.Internal_asset_location__c = '北京 备品中心';
        assetA5.Product_category__c = 'GI';
        assetA5.Equipment_Type__c = '产品试用';
        assetA5.SalesProvince__c = '北京';
        assetA5.WH_location__c = '货架号2';
        assetA5.Asset_loaner_category__c = '固定资产';
        assetA5.CompanyOfEquipment__c = '123';
        assetA5.Internal_Asset_number__c = '123';
        assetA5.CurrentContract__c=MaintenanceContract[0].Id;
        // assetA2.AssetManageConfirm__c = true;
        Oly_TriggerHandler.bypass('AssetHandlerCheck');
        insert new Asset[] {assetA1, assetA2, assetA3,assetA4,assetA5};
        List<Asset> Assetss = new Asset[] {assetA1, assetA2, assetA3,assetA4,assetA5};
        Maintenance_Contract_Asset__c mca = new Maintenance_Contract_Asset__c();
        // mca.Asset__c = Assetss[0].Id;
        mca.Asset__c = assetA1.Id;
        mca.Maintenance_Contract__c = MaintenanceContract[0].Id;
        mca.endDateGurantee_Text__c = Date.today().addDays(1);
        mca.Summary_FZ__c = 200;
        insert mca;
        System.assert(mca.Id != null);
        //维修表创建(包含在维修表的保有设备)
        Repair__c repairObj1 = new Repair__c();
        repairObj1.Delivered_Product__c = Assetss[0].Id;
        repairObj1.Discount_Price__c = 1000;
        repairObj1.Hospital__c = hospital.Id;
        repairObj1.Department_Class__c = strategicDep[0].Id;
        repairObj1.Account__c = hospital.Id;
        repairObj1.SalesOfficeCode_selection__c = '北京石景山';
        repairObj1.On_site_repair__c = 'RC修理';
        repairObj1.Failure_Occurrence_Date__c = Date.today();
        repairObj1.Agreed_Date__c = Date.today().addYears(-1);
        repairObj1.Repair_List_Price__c = 2000;
        // insert repairObj1;
        Repair__c repairObj2 = new Repair__c();
        repairObj2.Discount_Price__c = 2000;
        repairObj2.Delivered_Product__c = Assetss[1].Id;
        repairObj2.Hospital__c = hospital.Id;
        repairObj2.Department_Class__c = strategicDep[0].Id;
        repairObj2.Account__c = hospital.Id;
        repairObj2.SalesOfficeCode_selection__c = '北京石景山';
        repairObj2.On_site_repair__c = 'RC修理';
        repairObj2.Failure_Occurrence_Date__c = Date.today();
        repairObj2.Agreed_Date__c = Date.today().addYears(-1);
        repairObj2.Repair_List_Price__c = 1000;
        Repair__c repairObj3 = new Repair__c();
        repairObj3.Discount_Price__c = 2000;
        repairObj3.Delivered_Product__c = Assetss[2].Id;
        repairObj3.Hospital__c = hospital.Id;
        repairObj3.Department_Class__c = strategicDep[0].Id;
        repairObj3.Account__c = hospital.Id;
        repairObj3.SalesOfficeCode_selection__c = '北京石景山';
        repairObj3.On_site_repair__c = 'RC修理';
        repairObj3.Failure_Occurrence_Date__c = Date.today();
        repairObj3.Agreed_Date__c = Date.today().addYears(-1);
        repairObj3.Repair_List_Price__c = 2000;
        insert new Repair__c[] {repairObj1, repairObj2, repairObj3};
        Repair_Quotation__c rq = new Repair_Quotation__c();
        rq.Name                  = 'testNFM104';
        rq.Repair__c             = repairObj1.Id;
        rq.MessageGroupNumber__c = '1';
        rq.ListPrice__c =2000;
        insert rq;
        // StaticParameter.RepairAgainAnStaTrigger = true;
    }
}
force-app/main/default/classes/SummaryConsumptionRateBatchTest.cls-meta.xml
New file
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata">
    <apiVersion>46.0</apiVersion>
    <status>Active</status>
</ApexClass>