Invocablemethod Apex Class 汇总多个货币字段

Invocablemethod Apex Class Rollup Multiple Currency Fields

我正在编写一个可调用方法批处理顶点 class 以将“订单包”对象上的多个货币字段汇总到其“订单位置”的父对象。我以为我已正确添加所有内容,但它似乎将“Package_Monthly_Recurring_Fees__c”和“Package_One_Time_Fees__c”更新为 Package_Monthly_Recurring_Fees__c 字段中的相同价格。有人可以帮我确定为什么它对两个字段使用相同的价格吗?非常感谢任何帮助!

global class OrderLocationRollupSummary implements Database.Batchable<sObject>, Schedulable {
    
        //Invocable Method
        @InvocableMethod(label='Rollup All Order Packages to Locations')
        global static void rollupAllorderpackages(List<Order_Location_Package__c> orderpackages) {
            rollupOrderPackages(orderpackages);
        }
    
        //Batchable Methods
        global Database.QueryLocator start(Database.BatchableContext bc) {
            return Database.getQueryLocator([SELECT Id FROM Order_New_Location__c]);
        }
    
        global void execute(Database.BatchableContext context, List<sObject> batch){
            Set<Id> OrderLocationIds = new Set<Id>();
    
            for (sObject ordloc : batch) {
                OrderLocationIds.add(ordloc.Id);
            }
    
            summarizeOrderPackages(OrderLocationIds);
        }
    
        global void finish(Database.BatchableContext context) {}
    
        //Schedulable Methods
        global void execute(SchedulableContext context){
            OrderLocationRollupSummary batchJob = new OrderLocationRollupSummary();
            Database.executeBatch(batchJob);
        }
    
        //Static Methods
        public static void rollupOrderPackages(List<Order_Location_Package__c> orderpackages) {
            Set<Id> OrderLocationIds = new Set<Id>();
    
            //Get Order Location Ids from specified orderpackages
            for (Order_Location_Package__c ordpckg : orderpackages) {
                OrderLocationIds.add(ordpckg.New_Location_Name__c);
            }
    
            if (OrderLocationIds.isEmpty() == false) {
                /*Execute as a future call so that the user doesn't have to wait around for
                the rollup to finish. Unless, already in a future or batch call state then
                just perform the rollup.*/
                if (System.isFuture() == false && System.isBatch() == false) {
                    summarizeOrderPackagesAsync(OrderLocationIds);
                }
                else {
                    new OrderLocationRollupSummary().summarizeOrderPackages(OrderLocationIds);
                }
            }
        }
    
        @future
        public static void summarizeOrderPackagesAsync(Set<Id> OrderLocationIds) {
            new OrderLocationRollupSummary().summarizeOrderPackages(OrderLocationIds);
        }
    
        //Public Methods
        public void summarizeOrderPackages(Set<Id> OrderLocationIds) {
            //Get Order Locations to Update
            List<Order_New_Location__c> orderlocations = queryOrderLocationsById(OrderLocationIds);
    
            Map<Id, double> results = getOrderPackagesAmountsByLocationId(OrderLocationIds);
    
            //Loop Order Locations and set Amounts
            List<Order_New_Location__c> orderlocationsToUpdate = new List<Order_New_Location__c>();
            for (Order_New_Location__c ordloc : orderlocations) {
                double mrf = 0;
                double otf = 0;
    
                if (results.containsKey(ordloc.Id)) {
                    mrf = results.get(ordloc.Id);
                    otf = results.get(ordloc.Id);
                }
    
                //Determine if Amounts have Changed
                if (ordloc.Package_Monthly_Recurring_Fees__c != mrf || 
                    ordloc.Package_One_Time_Fees__c != otf) {
                    
                    ordloc.Package_Monthly_Recurring_Fees__c = mrf;
                    ordloc.Package_One_Time_Fees__c = otf;
                    orderlocationsToUpdate.add(ordloc); //Add location to collection to be updated
                }
            }
    
            if(orderlocationsToUpdate.isEmpty() == false) {
                Database.SaveResult[] saveResults = Database.update(orderlocationsToUpdate, false);
                System.debug(saveResults);
            }
        }
    
        //Private Methods
        public Map<Id, double> getOrderPackagesAmountsByLocationId(Set<Id> OrderLocationIds) {
            Map<Id, double> resultsByOrderLocationId = new Map<Id, double>();
    
            //Summarize Order Package Amounts by Order Location Id
            AggregateResult[] results = aggregateOrderPackageAmounts(OrderLocationIds);
            for (AggregateResult result : results) {
                Id orderlocationId = (Id) result.get('OrderLocation');
                double mrf = (double) result.get('MRFees');
                double otf = (double) result.get('OTFees');
    
                resultsByOrderLocationId.put(orderlocationId, mrf);
                resultsByOrderLocationId.put(orderlocationId, otf);
            }
            return resultsByOrderLocationId;
        }
    
        //Query Methods
        private List<Order_New_Location__c> queryOrderLocationsById(Set<Id> OrderLocationIds) {
            return [SELECT 
                    Id 
                    ,Package_Monthly_Recurring_Fees__c
                    ,Package_One_Time_Fees__c
                FROM 
                    Order_New_Location__c 
                WHERE 
                    Id IN :OrderLocationIds];
        }
    
        private AggregateResult[] aggregateOrderPackageAmounts(Set<Id> OrderLocationIds) {
            return [SELECT 
                     New_Location_Name__c OrderLocation
                    ,SUM(Monthly_Recurring_Fees__c) MRFees
                    ,SUM(One_Time_Fees__c) OTFees
                FROM 
                    Order_Location_Package__c
                WHERE
                    New_Location_Name__c IN :OrderLocationIds
                GROUP BY 
                    New_Location_Name__c];
        }
    
    }

在您的 summarizeOrderPackages 方法中,以下代码将 'mrf' 和 'oft' 变量设置为相同的值。

        if (results.containsKey(ordloc.Id)) {
            mrf = results.get(ordloc.Id);
            otf = results.get(ordloc.Id);
        }

之后,您将相关字段设置为 mrf 和 otf 变量(具有相同的值)。

        //Determine if Amounts have Changed
        if (ordloc.Package_Monthly_Recurring_Fees__c != mrf || 
            ordloc.Package_One_Time_Fees__c != otf) {
            
            ordloc.Package_Monthly_Recurring_Fees__c = mrf;
            ordloc.Package_One_Time_Fees__c = otf;
            orderlocationsToUpdate.add(ordloc); //Add location to collection to be updated
        }

考虑在您的 OrderLocationRollupSummary class 中添加包装器和内部 class 来解决此问题:

  public class Order_New_Location_Wrapper {
    Id orderlocationId = {get;set;}
    Double mrf = {get;set;}
    Double otf = {get;set;}
    public class Order_New_Location_Wrapper (Id arg1, Double arg2, Double arg3)
    orderlocationId = arg1;
    mrf = arg2;
    otf = arg3;
  }

然后在您的 getOrderPackagesAmountsByLocationId 方法中调用这个新的内部 class:

public Map<Id, Order_New_Location_Wrapper> getOrderPackagesAmountsByLocationId(Set<Id> OrderLocationIds) {

//create a list of orderlocations to represent the collection objects coming from the wrapper 
        
        resultsByOrderLocationId = new Map<Id, Order_New_Location_Wrapper>();

        //Summarize Order Package Amounts by Order Location Id
        AggregateResult[] results = aggregateOrderPackageAmounts(OrderLocationIds);
        for (AggregateResult result : results) {
            Id orderlocationId = (Id) result.get('OrderLocation');
            double mrf = (double) result.get('MRFees');
            double otf = (double) result.get('OTFees');

            resultsByOrderLocationId.add(orderlocationId, new OpportunityWrapper(orderlocationId, mrg, otf));
        }
        return resultsByOrderLocationId;
    }

您还需要将 summarizeOrderPackages 方法更新为如下所示:

public void summarizeOrderPackages(Set<Id> OrderLocationIds) {
    //Get Order Locations to Update
    List<Order_New_Location__c> orderlocations = queryOrderLocationsById(OrderLocationIds);

    Map<Id, Order_New_Location_Wrapper> results = getOrderPackagesAmountsByLocationId(OrderLocationIds);

    //Loop Order Locations and set Amounts
    List<Order_New_Location__c> orderlocationsToUpdate = new List<Order_New_Location__c>();
    for (Order_New_Location__c ordloc : orderlocations) {
        double mrf = 0;
        double otf = 0;

        if (results.containsKey(ordloc.Id)) {
            mrf = (Order_New_Location__c) results.get(ordloc.Id).mrf;
            otf = (Order_New_Location__c) results.get(ordloc.Id).otf;
        }

        //Determine if Amounts have Changed
        if (ordloc.Package_Monthly_Recurring_Fees__c != mrf || 
            ordloc.Package_One_Time_Fees__c != otf) {
            
            ordloc.Package_Monthly_Recurring_Fees__c = mrf;
            ordloc.Package_One_Time_Fees__c = otf;
            orderlocationsToUpdate.add(ordloc); //Add location to collection to be updated
        }
    }

    if(orderlocationsToUpdate.isEmpty() == false) {
        Database.SaveResult[] saveResults = Database.update(orderlocationsToUpdate, false);
        System.debug(saveResults);
    }
}

我只需更新一些方法就可以解决这个问题,请参见下文。再次感谢您的帮助罗伯特!

global class OrderLocationRollupSummary implements Database.Batchable<sObject>, Schedulable {

//Invocable Method
@InvocableMethod(label='Rollup All Order Packages to Locations')
global static void rollupAllorderpackages(List<Order_Location_Package__c> orderpackages) {
    rollupOrderPackages(orderpackages);
}

//Batchable Methods
global Database.QueryLocator start(Database.BatchableContext bc) {
    return Database.getQueryLocator([SELECT Id FROM Order_New_Location__c]);
}

global void execute(Database.BatchableContext context, List<sObject> batch){
    Set<Id> OrderLocationIds = new Set<Id>();

    for (sObject ordloc : batch) {
        OrderLocationIds.add(ordloc.Id);
    }

    summarizeOrderPackages(OrderLocationIds);
}

global void finish(Database.BatchableContext context) {}

//Schedulable Methods
global void execute(SchedulableContext context){
    OrderLocationRollupSummary batchJob = new OrderLocationRollupSummary();
    Database.executeBatch(batchJob);
}

//Static Methods
public static void rollupOrderPackages(List<Order_Location_Package__c> orderpackages) {
    Set<Id> OrderLocationIds = new Set<Id>();

    //Get Order Location Ids from specified orderpackages
    for (Order_Location_Package__c ordpckg : orderpackages) {
        OrderLocationIds.add(ordpckg.New_Location_Name__c);
    }

    if (OrderLocationIds.isEmpty() == false) {
        /*Execute as a future call so that the user doesn't have to wait around for
        the rollup to finish. Unless, already in a future or batch call state then
        just perform the rollup.*/
        if (System.isFuture() == false && System.isBatch() == false) {
            summarizeOrderPackagesAsync(OrderLocationIds);
        }
        else {
            new OrderLocationRollupSummary().summarizeOrderPackages(OrderLocationIds);
        }
    }
}

@future
public static void summarizeOrderPackagesAsync(Set<Id> OrderLocationIds) {
    new OrderLocationRollupSummary().summarizeOrderPackages(OrderLocationIds);
}

//Public Methods
public void summarizeOrderPackages(Set<Id> OrderLocationIds) {
    //Get Order Locations to Update
    List<Order_New_Location__c> orderlocations = queryOrderLocationsById(OrderLocationIds);

    Map<Id, AggregateResult> results = getOrderPackagesAmountsByLocationId(OrderLocationIds);

    //Loop Order Locations and set Amounts
    List<Order_New_Location__c> orderlocationsToUpdate = new List<Order_New_Location__c>();
    for (Order_New_Location__c ordloc : orderlocations) {
        double mrf = 0;
        double otf = 0;

        if (results.containsKey(ordloc.Id)) {
            AggregateResult ar = results.get(ordloc.Id);
            mrf = (double)ar.get('MRFees');
            otf = (double)ar.get('OTFees');
        }

        //Determine if Amounts have Changed
        if (ordloc.Package_Monthly_Recurring_Fees__c != mrf || 
            ordloc.Package_One_Time_Fees__c != otf) {
            
            ordloc.Package_Monthly_Recurring_Fees__c = mrf;
            ordloc.Package_One_Time_Fees__c = otf;
            orderlocationsToUpdate.add(ordloc); //Add location to collection to be updated
        }
    }

    if(orderlocationsToUpdate.isEmpty() == false) {
        Database.SaveResult[] saveResults = Database.update(orderlocationsToUpdate, false);
        System.debug(saveResults);
    }
}
//Private Methods
public Map<Id, AggregateResult> getOrderPackagesAmountsByLocationId(Set<Id> OrderLocationIds) {
    Map<id,AggregateResult> resultsByOrderLocationId= new Map<Id,AggregateResult>();

    //Summarize Order Package Amounts by Order Location Id
    AggregateResult[] results = aggregateOrderPackageAmounts(OrderLocationIds);
    for (AggregateResult result : results) {
        Id orderlocationId = (Id) result.get('OrderLocation');
        resultsByOrderLocationId.put(orderlocationId, result );
    }
    return resultsByOrderLocationId;
}

//Query Methods
private List<Order_New_Location__c> queryOrderLocationsById(Set<Id> OrderLocationIds) {
    return [SELECT 
            Id 
            ,Package_Monthly_Recurring_Fees__c
            ,Package_One_Time_Fees__c
        FROM 
            Order_New_Location__c 
        WHERE 
            Id IN :OrderLocationIds];
}

private AggregateResult[] aggregateOrderPackageAmounts(Set<Id> OrderLocationIds) {
    return [SELECT 
             New_Location_Name__c OrderLocation
            ,SUM(Monthly_Recurring_Fees__c) MRFees
            ,SUM(One_Time_Fees__c) OTFees
        FROM 
            Order_Location_Package__c
        WHERE
            New_Location_Name__c IN :OrderLocationIds
        GROUP BY 
            New_Location_Name__c];
}

}