public without sharing class lexBatchApprovalRecordsController { //Wrapper class to store the column values of data table public class SubmittedRecordsWrapper{ @AuraEnabled public Id workItemId; @AuraEnabled public String recordId; @AuraEnabled public String relatedTo; @AuraEnabled public String recordName; @AuraEnabled public String nameUrl; @AuraEnabled public String submittedBy; @AuraEnabled public String submittercomment; @AuraEnabled public Date submittedDate; @AuraEnabled public String comments; @AuraEnabled public String proD; } @AuraEnabled (cacheable=true) public static integer gettotalcount() { Integer icount = 0; //Add By Li Jun 20231026 Start // List piwList = new List([SELECT ID,ProcessInstanceId FROM ProcessInstanceWorkitem WHERE (OriginalActorId = : UserInfo.getUserId() and ActorId = null) OR ActorId = : UserInfo.getUserId()]); // 20231202 ljh start // List piwList = new List([SELECT ID,ProcessInstanceId FROM ProcessInstanceWorkitem WHERE ActorId = : UserInfo.getUserId() ]); // Set piSet = new Set(); // for(ProcessInstanceWorkitem piwi:piwList){ // piSet.add(piwi.ProcessInstanceId); // } // if(piSet.isEmpty()){ // return 0; // } // for(ProcessInstance ps : [SELECT Id,TargetObjectId,TargetObject.Name,CreatedDate,ProcessDefinitionId, // (SELECT ID,CreatedBy.Name FROM WorkItems WHERE ActorId = : UserInfo.getUserId()), // (SELECT Id,OriginalActor.Name,Comments,CreatedById,CreatedBy.Name FROM Steps WHERE StepStatus = 'Started') FROM ProcessInstance WHERE id in:piSet]){ // if(!ps.WorkItems.isEmpty()&&!ps.steps.isEmpty()){ // icount++; // } // } List piwList = [SELECT Id FROM ProcessInstanceWorkitem where Actorid = : UserInfo.getUserId() and ProcessInstance.status = 'Pending']; icount = piwList.size(); // 20231202 ljh end return icount; } @AuraEnabled public static List getSubmittedRecords(Integer queryLimit, Integer queryOffset){ system.debug('queryLimit'+queryLimit); system.debug('queryOffset'+queryOffset); List lstSubmissionWrapper = new List(); //Process instance stores the info of records submitted for approval, // Process instance work item are the records an approver sees while approving/rejecting, Process instance step stores approved/rejected record including approva;/rejection comments //Add By Li Jun 20231026 Start //李文涛 修改 // List piwList = new List([SELECT ID,ProcessInstanceId FROM ProcessInstanceWorkitem WHERE (OriginalActorId = : UserInfo.getUserId() and ActorId = null) OR ActorId = : UserInfo.getUserId()]); // 20231202 ljh start // List piwList = new List([SELECT ID,ProcessInstanceId FROM ProcessInstanceWorkitem WHERE ActorId = : UserInfo.getUserId()]); List piwList = [SELECT Id,ProcessInstanceId FROM ProcessInstanceWorkitem where Actorid = : UserInfo.getUserId() and ProcessInstance.status = 'Pending']; // 20231202 ljh end Set piSet = new Set(); for(ProcessInstanceWorkitem piwi:piwList){ piSet.add(piwi.ProcessInstanceId); } //Add By Li Jun 20231026 Start for(ProcessInstance ps : [SELECT Id,TargetObjectId,TargetObject.Name,CreatedDate,ProcessDefinitionId, (SELECT ID,CreatedBy.Name FROM WorkItems WHERE ActorId = : UserInfo.getUserId()), (SELECT Id,OriginalActor.Name,Comments,CreatedById,CreatedBy.Name FROM Steps WHERE StepStatus = 'Started') FROM ProcessInstance WHERE id in:piSet ORDER BY CreatedDate DESC LIMIT :queryLimit OFFSET :queryOffset]){ if(!ps.WorkItems.isEmpty()){ SubmittedRecordsWrapper objSubmittedRecordsWrapper = getSubmitRecord(ps); if(!ps.steps.isEmpty()){ if(ps!=null && ps.WorkItems!=null && ps.WorkItems.size() > 0){ objSubmittedRecordsWrapper.submittedBy = ps.WorkItems[0].CreatedBy.Name; } if(ps.steps[0].Comments == '' || ps.steps[0].Comments == null) objSubmittedRecordsWrapper.submittercomment = 'No comments from submitter'; else objSubmittedRecordsWrapper.submittercomment = ps.steps[0].Comments; lstSubmissionWrapper.add(objSubmittedRecordsWrapper); } } } system.debug(JSON.serialize(lstSubmissionWrapper)); return lstSubmissionWrapper; } public static SubmittedRecordsWrapper getSubmitRecord(ProcessInstance ps){ SubmittedRecordsWrapper objSubmittedRecordsWrapper = new SubmittedRecordsWrapper(); if(ps!=null && ps.WorkItems!=null && ps.WorkItems.size() > 0){ objSubmittedRecordsWrapper.workItemId = ps.WorkItems[0].Id; } objSubmittedRecordsWrapper.recordId = ps!=null && ps.TargetObjectId!=null?ps.TargetObjectId:null; objSubmittedRecordsWrapper.recordName = ps!=null && ps.TargetObject!=null ?ps.TargetObject.Name:''; if(ps!=null && ps.WorkItems!=null && ps.WorkItems.size() > 0){ objSubmittedRecordsWrapper.nameUrl = '/lightning/r/'+ ps.WorkItems[0].Id+'/view'; } objSubmittedRecordsWrapper.comments = ''; objSubmittedRecordsWrapper.relatedTo =getObjectName(ps.TargetObjectId); objSubmittedRecordsWrapper.submittedDate = ps!=null && ps.CreatedDate!=null? Date.newInstance(ps.CreatedDate.year(),ps.CreatedDate.month(),ps.CreatedDate.day()):Date.today(); return objSubmittedRecordsWrapper; } public static String getObjectName(String recordId){ //To get the label of the object name using Schema methods String keyPrefix = recordId.subString(0,3); String objectName = ''; Map sobjectTypeMap = Schema.getGlobalDescribe(); for(String obj : sobjectTypeMap.keySet()){ Schema.DescribeSObjectResult sobjectResult = sobjectTypeMap.get(obj).getDescribe(); String getKeyPrefix = sobjectResult.getKeyPrefix(); if(keyPrefix.equals(getKeyPrefix)){ objectName = sobjectResult.getLabel(); break; } } return objectName; } @AuraEnabled public static String processRecords(String processType,String strwraprecs,String comment){ system.debug('processType'+processType); system.debug('wraprecs'+strwraprecs); List wraprecs = (List)System.JSON.deserialize(strwraprecs, List.class); Map mapSubmittedRecordsWrapper = new map(); List lstWorkItemIds = new List(); for(SubmittedRecordsWrapper iwrap: wraprecs) { mapSubmittedRecordsWrapper.put(iwrap.workItemId,iwrap); lstWorkItemIds.add(iwrap.workItemId); } //Approve,reject the record programmatically String message = ''; Integer recordsProcessed = 0; String comments = processType == 'Approve' ? 'Approved' : 'Rejected'; List lstWorkItemRequest = new List();//ProcessWorkitemRequest class has methods to programmatically process submitted records for(String workItemId : lstWorkItemIds){ Approval.ProcessWorkitemRequest objWorkItemRequest = new Approval.ProcessWorkitemRequest(); if(mapSubmittedRecordsWrapper.containsKey(workItemId)&&!String.isBlank(mapSubmittedRecordsWrapper.get(workItemId).comments)){ objWorkItemRequest.setComments(mapSubmittedRecordsWrapper.get(workItemId).comments); }else{ objWorkItemRequest.setComments(comment); } objWorkItemRequest.setAction(processType);//approve or reject objWorkItemRequest.setWorkitemId(workItemId); lstWorkItemRequest.add(objWorkItemRequest); } Approval.ProcessResult[] lstProcessResult = Approval.process(lstWorkItemRequest,FALSE);//process method is used for approving/rejecting records depending on setAction attribute for(Approval.ProcessResult processResult : lstProcessResult){ if(processResult.isSuccess()){ recordsProcessed++; } else{ for(Database.Error error : processResult.getErrors()){ message += error.getMessage(); } } } if(recordsProcessed == lstWorkItemIds.size()){ message = 'All records are '+comments+' successfully'; } return message; // return 'success'; } }