/** * 计划外OPD计划,根据OPD计划排序进行排序 * */ global class RentalAutomaticSortBeforeBatch implements Database.Batchable,Database.Stateful { private final List sdcName = null; public Date myStartDate; public Date myEndDate; // 2024-01-24 ssm 增加一个判断,在月末倒数第二个工作日的时候执行上月排序拷贝操作 start private Boolean executeCopyToBefore = false; // 2024-01-24 ssm 增加一个判断,在月末倒数第二个工作日的时候执行上月排序拷贝操作 end global RentalAutomaticSortBeforeBatch(){ } // 2024-01-24 ssm 增加一个判断,在月末倒数第二个工作日的时候执行上月排序拷贝操作 start global RentalAutomaticSortBeforeBatch(Boolean exe){ this.executeCopyToBefore = exe; } // 2024-01-24 ssm 增加一个判断,在月末倒数第二个工作日的时候执行上月排序拷贝操作 end global Database.QueryLocator start(Database.BatchableContext BC){ String sql = 'SELECT Id,Name,type__c FROM opp2AuxiliarySort__c '; sql += ' WHERE Id != null '; if(sdcName <> null){ sql += 'AND Name IN :sdcName '; } sql += ' AND (type__c = 2 OR type__c = 11)'; sql += ' ORDER BY type__c'; System.debug('=sql='+sql); return Database.getQueryLocator(sql); } global void execute(Database.BatchableContext BC, List opp2AuxiliarySortList) { Date today = Date.today(); // 获取从次月14日至再次月13日的日期 Date startDate = today.addMonths(1).toStartOfMonth().addDays(13); Date endDate = today.addMonths(2).toStartOfMonth().addDays(12); Map opdAgainMap = New Map(); // 先判断是否有计划外的OPD计划需要计算排队Num List existSelectList = [ SELECT Id FROM Rental_Apply__c WHERE OPDPlan__r.OPDLendSort__c != null AND User_Salesdept__c =: opp2AuxiliarySortList[0].Name AND OPDPlan__r.OPDPlan_ImplementDate__c >=: startDate AND OPDPlan__r.OPDPlan_ImplementDate__c <=: endDate AND OPDPlan__r.If_AutoSort__c = 0 AND OPDPlan__r.RentalApplyNum__c = null AND RA_Status__c IN ('草案中','申请中','已批准')]; if (!existSelectList.isEmpty()) { // 如果存在,则整个计划外的OPD顺序都需要重新计算 List applyAgainSelectList = [ SELECT Id, CreatedDate, User_Salesdept__c,//销售本部 demo_purpose2__c, OPDPlan__r.RentalApplyNum__c, OPDPlan__r.OPDLendSort__c, Request_approval_time__c, Request_shipping_day__c FROM Rental_Apply__c WHERE OPDPlan__r.OPDLendSort__c != null AND User_Salesdept__c =: opp2AuxiliarySortList[0].Name AND OPDPlan__r.OPDPlan_ImplementDate__c >=: startDate AND OPDPlan__r.OPDPlan_ImplementDate__c <=: endDate AND OPDPlan__r.If_AutoSort__c = 0 AND RA_Status__c IN ('草案中','申请中','已批准') ORDER BY demo_purpose2__c, OPDPlan__r.OPDLendSort__c ASC, Request_shipping_day__c ASC, Request_approval_time__c ASC]; // 取计划内OPD最大的排队Num List maxRentalApplyNum = [ SELECT OPDPlan__r.RentalApplyNum__c FROM Rental_Apply__c WHERE OPDPlan__r.OPDLendSort__c != null AND User_Salesdept__c =: opp2AuxiliarySortList[0].Name AND OPDPlan__r.OPDPlan_ImplementDate__c >=: startDate AND OPDPlan__r.OPDPlan_ImplementDate__c <=: endDate AND OPDPlan__r.If_AutoSort__c = 1 ORDER BY OPDPlan__r.RentalApplyNum__c DESC LIMIT 1]; Integer startNum = 0; if (!maxRentalApplyNum.isEmpty() && maxRentalApplyNum[0].OPDPlan__r.RentalApplyNum__c != null) { startNum = Integer.valueOf(maxRentalApplyNum[0].OPDPlan__r.RentalApplyNum__c); } List sortableList = new List(); if(applyAgainSelectList.size() > 0){ for (Rental_Apply__c obj : applyAgainSelectList) { sortableList.add(new RentalApplyComparator(obj)); } sortableList.sort(); List sortedList = new List(); for (RentalApplyComparator comparator : sortableList) { sortedList.add(comparator.customRen); } Map renApplyAgainMap = new Map(); for(Rental_Apply__c renApplyBefore : sortedList){ // 计划外的OPD排队Num,从计划内最大的OPD排序Num开始排序 renApplyAgainMap.put(renApplyBefore.User_Salesdept__c, startNum); } for (Rental_Apply__c renApplyAgain : sortedList) { String saleSdept = renApplyAgain.User_Salesdept__c; OPDPlan__c opd = new OPDPlan__c(); if(renApplyAgainMap.containsKey(saleSdept) && !opdAgainMap.containsKey(renApplyAgain.OPDPlan__c)){ opd.Id = renApplyAgain.OPDPlan__c; opd.RentalApplyNum__c = renApplyAgainMap.get(saleSdept) + 1; Integer numOPDPlan = Integer.valueOf(renApplyAgainMap.get(saleSdept) + 1); renApplyAgainMap.put(saleSdept, numOPDPlan); opdAgainMap.put(opd.Id, opd); } } } if (opdAgainMap != null && opdAgainMap.size() > 0) { update opdAgainMap.values(); } } } global void finish(Database.BatchableContext BC) { // 2024-01-24 ssm 增加一个判断,在月末倒数第二个工作日的时候执行上月排序拷贝操作 start if (this.executeCopyToBefore) { Id execBTId = Database.executebatch(new OPDLendSortCopyToSortBeforeBatch(), 100); } // 2024-01-24 ssm 增加一个判断,在月末倒数第二个工作日的时候执行上月排序拷贝操作 end } public class RentalApplyComparator implements Comparable { public Rental_Apply__c customRen; public RentalApplyComparator(Rental_Apply__c obj) { this.customRen = obj; } public Integer compareTo(Object renToCompare) { RentalApplyComparator compareToRen = (RentalApplyComparator)renToCompare; // 根据使用目的进行排序 Integer returnValue = comparePurposeOrder(compareToRen.customRen.demo_purpose2__c, customRen.demo_purpose2__c); if (returnValue != 0) { return returnValue; } // 如果使用目的相同,按照OPD排序 if (customRen.OPDPlan__r.OPDLendSort__c < compareToRen.customRen.OPDPlan__r.OPDLendSort__c) { returnValue = -1; } else if (customRen.OPDPlan__r.OPDLendSort__c > compareToRen.customRen.OPDPlan__r.OPDLendSort__c) { returnValue = 1; } if (returnValue != 0) { return returnValue; } if(customRen.demo_purpose2__c == '学会展会' && compareToRen.customRen.demo_purpose2__c == '学会展会'){ // 如果OPD相同,按照希望到货日排序 if (customRen.Request_shipping_day__c < compareToRen.customRen.Request_shipping_day__c) { returnValue = -1; } else if (customRen.Request_shipping_day__c > compareToRen.customRen.Request_shipping_day__c) { returnValue = 1; } if (returnValue != 0) { return returnValue; } } // 如果希望到货日相同,按照批准日期排序 if (customRen.Request_approval_time__c < compareToRen.customRen.Request_approval_time__c) { returnValue = -1; } else if (customRen.Request_approval_time__c > compareToRen.customRen.Request_approval_time__c){ returnValue = 1; } if (returnValue != 0) { return returnValue; } // 按照创建时间排序 if (customRen.CreatedDate < compareToRen.customRen.CreatedDate) { returnValue = -1; } else if (customRen.CreatedDate > compareToRen.customRen.CreatedDate) { returnValue = 1; } if (returnValue != 0) { return returnValue; } return returnValue; } private Integer comparePurposeOrder(String purpose1, String purpose2) { // 定义使用目的的排序顺序 Map purposeOrderMap = new Map{ '学会展会' => 1, '已购待货' => 2, '新产品评价' => 3, '试用(有询价)' => 4, '试用(无询价)' => 4 }; // 获取使用目的的排序顺序 Integer order1 = purposeOrderMap.containsKey(purpose1) ? purposeOrderMap.get(purpose1) : 5; Integer order2 = purposeOrderMap.containsKey(purpose2) ? purposeOrderMap.get(purpose2) : 5; // 如果使用目的不在定义的排序顺序内,默认按照字母顺序排序 Integer returnValue = 0; if (order1 < order2) { returnValue = 1; } else if (order2 > order1){ returnValue = -1; } return returnValue; } } }