Apex 专家挑战 1

问题描述 投票:0回答:4

我无法解决此错误。

关闭“日常维护”或“维修”类型的维护请求不会创建具有正确到期日期的新维护请求。挑战在于期望使用相关设备记录中定义的维护周期来计算到期日。如果维护请求中使用了多台设备,请选择最短的维护周期来定义服务日期。

我很难完成这项挑战。我想知道我的代码的哪一部分是错误的,而不仅仅是答案。

// TriggerHandler
public with sharing class MaintenanceRequestHelper {
    
    public static void updateWorkOrders(Map<Id, Case> oldCases) {
        // TODO: Complete the method to update workorders
        Map<Id, Integer> toGetDueDateMap = new Map<Id, Integer>();
        AggregateResult[] results = [SELECT Id, MIN(Maintenance_Cycle__c) minMC FROM Product2 GROUP BY Id];
        for (AggregateResult ar : results) {
            if (ar != null) {
                toGetDueDateMap.put(ar.Id, Integer.valueOf(ar.get('minMC')));
            }
        }
        List<Case> newCases = new List<Case>();
        for (Case c : oldCases.values()) {
            Case newCase = new Case();
            newCase.Status = 'New';
            newCase.Origin = 'web';
            newCase.Vehicle__c = c.Vehicle__c;
            newCase.ProductId = c.ProductId;
            newCase.Type = 'Routine Maintenance';
            newCase.Subject = 'Routine Maintenance';
            newCase.Date_Reported__c = Date.today();
            newCase.Date_Due__c = (toGetDueDateMap.get(c.Id) != null) ? Date.today().addDays(toGetDueDateMap.get(c.Id)) : Date.today();
            newCases.add(newCase);
        }
        insert newCases;
    }
}

// Trigger
trigger MaintenanceRequest on Case (after update) {
    // ToDo: Call MaintenanceRequestHelper.updateWorkOrders
    Map<Id, Case> caseToEvaluate = new Map<Id, Case>();
    if(Trigger.isAfter && Trigger.isUpdate) {
        for(Case c : Trigger.New) {
            if(c.Status == 'Closed' && (c.Type == 'Repair' || c.Type == 'Routine Maintenance')) {
                caseToEvaluate.put(c.Id, c);
            }
        }
    }
    MaintenanceRequestHelper.updateWorkOrders(caseToEvaluate);
}
salesforce apex salesforce-lightning
4个回答
1
投票

顶点触发器:

trigger MaintenanceRequest on Case (before update, after update) {
    // ToDo: Call MaintenanceRequestHelper.updateWorkOrders
    if(Trigger.isAfter && Trigger.isUpdate){
        MaintenanceRequestHelper.updateWorkOrders(Trigger.new); 
    }
}

Apex 处理程序:

public with sharing class MaintenanceRequestHelper {
    public static void updateWorkOrders(List<Case> existingMainReq) {
        // TODO: Complete the method to update workorders
        Integer count = 0;
        Map<Id, Integer> toGetDueDateMap = new Map<Id, Integer>();
        Map<Id,Case> newCasesToIdsMap = new Map<Id,Case>();
        List<Case> createNewMainReq = new List<Case>();
        List<Case> caseIdsList = new List<Case>();
        Map<Equipment_Maintenance_Item__c,Id> EquipMainItemsToProdIds = new Map<Equipment_Maintenance_Item__c,Id>();
        
        if(!existingMainReq.isEmpty()){
            for(Case cc : existingMainReq){
                if((cc.Type == 'Repair' || cc.Type == 'Routine Maintenance') && cc.Status == 'Closed'){
                    caseIdsList.add(cc);   
                }
            }    
        }
        List<Equipment_Maintenance_Item__c> equipMainList = [Select id,Equipment__c,Maintenance_Request__c from Equipment_Maintenance_Item__c where Maintenance_Request__c IN : caseIdsList];
        if(!equipMainList.isEmpty()){
            for(Equipment_Maintenance_Item__c equipMainn : equipMainList){
                EquipMainItemsToProdIds.put(equipMainn,equipMainn.Equipment__c);
                system.debug(EquipMainItemsToProdIds.size());
                if(EquipMainItemsToProdIds.size() > 1){
                    count = EquipMainItemsToProdIds.size();
                }
            }  
        }
      List<Equipment_Maintenance_Item__c> EMIList = [Select Equipment__r.Maintenance_Cycle__c,Equipment__c from Equipment_Maintenance_Item__c where Equipment__r.Id IN :EquipMainItemsToProdIds.values() AND Maintenance_Request__c IN:caseIdsList order By Equipment__r.Maintenance_Cycle__c ASC limit 1];
            for(Equipment_Maintenance_Item__c equip : EMIList){
                toGetDueDateMap.put(equip.Id,Integer.valueOf(equip.Equipment__r.Maintenance_Cycle__c));  
                for(Case c : caseIdsList){
                    Case mainRe = new Case();
                    mainRe.Vehicle__c = c.Vehicle__c;
                    mainRe.status = 'New';
                    mainRe.Type = 'Routine Maintenance';
                    mainRe.Subject = 'New Main Request For Vehicle for Apex Specialist';
                    mainRe.Date_Reported__c = date.today();
                    if(count > 1){
                        mainRe.Date_Due__c = Date.today().addDays(toGetDueDateMap.get(equip.Id));
                    }
                    else{
                        mainRe.Date_Due__c = Date.today();
                    }
                    createNewMainReq.add(mainRe);
                    newCasesToIdsMap.put(c.Id,mainRe);
                }  
               insert createNewMainReq; 
                if(caseIdsList.size()>0 && newCasesToIdsMap.size()>0){
                        cloneEquipItems(caseIdsList,newCasesToIdsMap);
                    }
            }
    }
    public static void cloneEquipItems(List<case> closedCaseRecords, Map<Id,case> newCreatedCasesMapp){
        List<Equipment_Maintenance_Item__c> newEquipItems = new List<Equipment_Maintenance_Item__c>();
        try{
            if(!closedCaseRecords.isEmpty() && newCreatedCasesMapp.size()>0){
                List<Equipment_Maintenance_Item__c> oldEquipItems = [SELECT Equipment__c, Maintenance_Request__c, Quantity__c,Maintenance_Request__r.Id
                                                                     FROM Equipment_Maintenance_Item__c
                                                                     WHERE  Maintenance_Request__c IN :closedCaseRecords];
                
                for(Equipment_Maintenance_Item__c equipItem : oldEquipItems) {
                    
                    Equipment_Maintenance_Item__c newItem = equipItem.clone(false, true, false, false);
                    newItem.Maintenance_Request__c = newCreatedCasesMapp.get(equipItem.Maintenance_Request__c).id;
                    newEquipItems.add(newItem);
                }
                insert newEquipItems;
            }
        }
        catch(Exception e){
            System.debug('Exception is'+ e);
        }
    }
}

1
投票

这个链接帮助了我,所以我修改了代码,如下所示:

public with sharing class MaintenanceRequestHelper {
public static void updateWorkOrders(List<Case> updWorkOrders, Map<Id,Case> nonUpdCaseMap) {
    Set<Id> validIds = new Set<Id>();
    
    
    For (Case c : updWorkOrders){
        if (nonUpdCaseMap.get(c.Id).Status != 'Closed' && c.Status == 'Closed'){
            if (c.Type == 'Repair' || c.Type == 'Routine Maintenance'){
                validIds.add(c.Id);
                
         
            }
        }
    }
    
    if (!validIds.isEmpty()){
        List<Case> newCases = new List<Case>();
        Map<Id,Case> closedCasesM = new Map<Id,Case>([SELECT Id, Vehicle__c, ProductId, Product.Maintenance_Cycle__c,(SELECT Id,Equipment__c,Quantity__c FROM Equipment_Maintenance_Items__r) 
                                                     FROM Case WHERE Id IN :validIds]);
        Map<Id,Decimal> maintenanceCycles = new Map<ID,Decimal>();
        AggregateResult[] results = [SELECT Maintenance_Request__c, MIN(Equipment__r.Maintenance_Cycle__c)cycle FROM Equipment_Maintenance_Item__c WHERE Maintenance_Request__c IN :ValidIds GROUP BY Maintenance_Request__c];
    
    for (AggregateResult ar : results){ 
        maintenanceCycles.put((Id) ar.get('Maintenance_Request__c'), (Decimal) ar.get('cycle'));
    }
        
        for(Case cc : closedCasesM.values()){
            Case nc = new Case (
                ParentId = cc.Id,
            Status = 'New',
                Subject = 'Routine Maintenance',
                Type = 'Routine Maintenance',
                Vehicle__c = cc.Vehicle__c,
                ProductId =cc.ProductId,
                Origin = 'Web',
                Date_Reported__c = Date.Today()
                
            );
            
            If (maintenanceCycles.containskey(cc.Id)){
                nc.Date_Due__c = Date.today().addDays((Integer) maintenanceCycles.get(cc.Id));
            } else {
                nc.Date_Due__c = Date.today().addDays((Integer) cc.Product.maintenance_Cycle__c);
            }
            
            newCases.add(nc);
        }
        
       insert newCases;
        
       List<Equipment_Maintenance_Item__c> clonedWPs = new List<Equipment_Maintenance_Item__c>();
       for (Case nc : newCases){
            for (Equipment_Maintenance_Item__c wp : closedCasesM.get(nc.ParentId).Equipment_Maintenance_Items__r){
                Equipment_Maintenance_Item__c wpClone = wp.clone();
                wpClone.Maintenance_Request__c = nc.Id;
                ClonedWPs.add(wpClone);
                
            }
        }
        insert ClonedWPs;
    }
}

}

触发器:

trigger MaintenanceRequest on Case (before update, after update) {

if(Trigger.isUpdate && Trigger.isAfter){

    MaintenanceRequestHelper.updateWorkOrders(Trigger.New, Trigger.OldMap);

}  }

0
投票

我创建了正确的算法来找到更少的维护周期天数。 尝试一下。

    newCase.Date_Due__c = Date.today() + suchEarlyDay(newMaintenanceRequest).get(cases.Id);
                newCases.add(newCase);
            }
        }
        if (newCases.size() > 0) {
            insert newCases;
    }
}

    private static Map<Id, Integer> suchEarlyDay(List<Case> cases) {
    Map<Id, Case> caseMap = new Map<Id, Case>(cases);
    Map<Id, Integer> lessDate = new Map<Id, Integer>();
    List<Equipment_Maintenance_Item__c> relatedList = [
            SELECT Maintenance_Request__c,
                    Equipment__r.Maintenance_Cycle__c
            FROM Equipment_Maintenance_Item__c
            WHERE Maintenance_Request__c = :caseMap.keySet()
    ];

    for (Id caseId : caseMap.keySet()) {
        for (Equipment_Maintenance_Item__c equip : relatedList) {
            if (!lessDate.containsKey(caseId) && caseId == equip.Maintenance_Request__c) {
                lessDate.put(caseId, (Integer) equip.Equipment__r.Maintenance_Cycle__c);
            } else if (lessDate.containsKey(caseId) && lessDate.get(caseId) > (Integer) equip.Equipment__r.Maintenance_Cycle__c) {
                lessDate.put(caseId, (Integer) equip.Equipment__r.Maintenance_Cycle__c);
            }
        }
    }
    return lessDate;
}

0
投票

这是我的解决方案,效果很好!

触发:

trigger MaintenanceRequest on Case (before update, after update) {
    if(Trigger.isAfter && Trigger.isUpdate){
        MaintenanceRequestHelper.updateWorkOrders(Trigger.New, Trigger.oldMap);
    }
}

常数:

public class Constants {
    public static final String REPAIR = 'Repair';
    public static final String ROUTINE_MAINTENANCE = 'Routine Maintenance';
    public static final Set<String> FUTURE_MAINTANENCE_TYPE_SET = new Set<String>{REPAIR, ROUTINE_MAINTENANCE};
    public static final String FUTURE_PURPOSE = 'Future Purpose';
}

DAO:

public class MaintenanceRequestDAO {
    public static List<Case> getMaintenanceRequestWithEquipmentMaintenanceItemsById(Set<Id> setOfMaintenanceRequestIds){
        return [
            SELECT Id, (SELECT Id, Equipment__c, Quantity__c, Maintenance_Request__c, Equipment__r.Maintenance_Cycle__c FROM Equipment_Maintenance_Items__r)
            FROM Case
            WHERE Id IN :setOfMaintenanceRequestIds
        ];
    }
}

触发处理程序:

public with sharing class MaintenanceRequestHelper {
    public static Map<Integer, List<Equipment_Maintenance_Item__c>> mapOfCounterWithEquipmentItems =
        new Map<Integer, List<Equipment_Maintenance_Item__c>>();
    public static Integer sequenceCounter = 0;
    
    public static void updateWorkOrders(List<Case> listOfNewMaintenanceRequests, Map<Id, Case> mapOfOldMaintenanceRequests){
        Map<Id, List<Equipment_Maintenance_Item__c>> mapOfMaintenanceIdWithEquipmentItems =
            new Map<Id, List<Equipment_Maintenance_Item__c>>();
        Set<Id> setOfMaintenanceRequestIds = new Set<Id>();
        Map<Integer, Case> mapOfCounterWithMaintenanceRequest = new Map<Integer, Case>();
        List<Equipment_Maintenance_Item__c> listOfEquipmentItemToInsert = new List<Equipment_Maintenance_Item__c>();
            
        for(Case newMaintenanceRequest : listOfNewMaintenanceRequests){
            setOfMaintenanceRequestIds.add(newMaintenanceRequest.Id);
        }
        
        for(Case newMaintenanceRequestWithEquipmentMaintenanceItem :
            MaintenanceRequestDAO.getMaintenanceRequestWithEquipmentMaintenanceItemsById(setOfMaintenanceRequestIds)){
            mapOfMaintenanceIdWithEquipmentItems.put(newMaintenanceRequestWithEquipmentMaintenanceItem.Id,
                newMaintenanceRequestWithEquipmentMaintenanceItem.Equipment_Maintenance_Items__r);
        }
        
        for(Case newMaintenanceRequest : listOfNewMaintenanceRequests){
            if(Constants.FUTURE_MAINTANENCE_TYPE_SET.contains(newMaintenanceRequest.Type) &&
                mapOfOldMaintenanceRequests.get(newMaintenanceRequest.Id).IsClosed == false &&
                newMaintenanceRequest.IsClosed == true){
                Case futureMaintenanceRequest = new Case(
                    Vehicle__c = newMaintenanceRequest.Vehicle__c,
                    Type = Constants.ROUTINE_MAINTENANCE,
                    Subject = Constants.FUTURE_PURPOSE,
                    Date_Reported__c = Date.today()
                );
                futureMaintenanceRequest.Date_Due__c =
                    calculateMaintenanceRequestDueDate(mapOfMaintenanceIdWithEquipmentItems.get(newMaintenanceRequest.Id));
                cloneEquipmentMaintenanceItems(sequenceCounter, mapOfMaintenanceIdWithEquipmentItems.get(newMaintenanceRequest.Id));
                mapOfCounterWithMaintenanceRequest.put(sequenceCounter, futureMaintenanceRequest);
                sequenceCounter ++;
            }
        }
        insert mapOfCounterWithMaintenanceRequest.values();
        for(Integer sequenceNumber : mapOfCounterWithMaintenanceRequest.keySet()){
            for(Equipment_Maintenance_Item__c equipmentMaintenanceItem : mapOfCounterWithEquipmentItems.get(sequenceNumber)){
                equipmentMaintenanceItem.Maintenance_Request__c = mapOfCounterWithMaintenanceRequest.get(sequenceNumber)?.Id;
                listOfEquipmentItemToInsert.add(equipmentMaintenanceItem);
            }
        }
        insert listOfEquipmentItemToInsert;
    }
    
    public static Date calculateMaintenanceRequestDueDate(List<Equipment_Maintenance_Item__c> listOfEquipmentMaintenanceItem){
        if(listOfEquipmentMaintenanceItem.isEmpty()){
            return null;
        }
        Decimal shortestMaintenanceCycle = listOfEquipmentMaintenanceItem[0]?.Equipment__r?.Maintenance_Cycle__c;
        for(Equipment_Maintenance_Item__c equipmentMaintenanceItem : listOfEquipmentMaintenanceItem){
            if(equipmentMaintenanceItem.Equipment__r?.Maintenance_Cycle__c < shortestMaintenanceCycle){
                shortestMaintenanceCycle = equipmentMaintenanceItem.Equipment__r?.Maintenance_Cycle__c;
            }
        }
        return System.today().addDays((Integer)shortestMaintenanceCycle);
    }
    
    public static void cloneEquipmentMaintenanceItems(Integer sequenceCounter,
        List<Equipment_Maintenance_Item__c> listOfEquipmentMaintenanceItem){
        List<Equipment_Maintenance_Item__c> listOfClonedEquipmentMaintenanceItem = new List<Equipment_Maintenance_Item__c>();
        for(Equipment_Maintenance_Item__c equipmentManitenanceItem : listOfEquipmentMaintenanceItem){
            Equipment_Maintenance_Item__c clonedEquipmentManitenanceItem = equipmentManitenanceItem.clone();
            listOfClonedEquipmentMaintenanceItem.add(clonedEquipmentManitenanceItem);
        }
        mapOfCounterWithEquipmentItems.put(sequenceCounter, listOfClonedEquipmentMaintenanceItem);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.