/* 备品智能化 add by dzk 备品申请根据OPD计划排序进行排序 测试类:OPDAutomaticSortBatchTest // 20231230 ljh */ global class RentalAutomaticSortBatch implements Database.Batchable,Database.Stateful { private final List sdcName = null; private BatchIF_Log__c iflog; public Boolean onlyMyselefy = true; public Boolean withoutDate = false; public Date myStartDate; public Date myEndDate; global RentalAutomaticSortBatch(){ iflog = new BatchIF_Log__c(); iflog.Type__c = 'RentalAutomaticSortBatch'; iflog.Log__c = 'RentalAutomaticSortBatch start\n'; iflog.ErrorLog__c = ''; insert iflog; } global RentalAutomaticSortBatch(List str){ sdcName = str; iflog = new BatchIF_Log__c(); iflog.Type__c = 'RentalAutomaticSortBatch'; iflog.Log__c = 'RentalAutomaticSortBatch start\n'; iflog.ErrorLog__c = ''; insert iflog; } global RentalAutomaticSortBatch(Boolean only, Boolean without){ this.onlyMyselefy = only; this.withoutDate = without; iflog = new BatchIF_Log__c(); iflog.Type__c = 'RentalAutomaticSortBatch'; iflog.Log__c = 'RentalAutomaticSortBatch start\n'; iflog.ErrorLog__c = ''; insert iflog; } // global RentalAutomaticSortBatch(Date startDate,Date endDate,Boolean only){ // this.myStartDate = startDate; // this.myEndDate = endDate; // this.onlyMyselefy = only; // } 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) { try{ 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计划排序完成后,备品申请再根据销售本部进行排序 List applyAgainSelectList = new List(); if (!withoutDate) { applyAgainSelectList = [SELECT Id, CreatedDate, // OPD_OrderNum__c,//OPD排序 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 = 1 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]; iflog.Log__c += '\nbenbu:'+opp2AuxiliarySortList[0].Name; System.debug('***benbu:'+opp2AuxiliarySortList[0].Name); }else{ // 历史数据 applyAgainSelectList = [SELECT Id, CreatedDate, // OPD_OrderNum__c,//OPD排序 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.If_AutoSort__c = 1 // 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]; iflog.Log__c += '\nbenbu:'+opp2AuxiliarySortList[0].Name; System.debug('***benbu:'+opp2AuxiliarySortList[0].Name); } List sortableList = new List(); iflog.Log__c += applyAgainSelectList.size(); 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){ renApplyAgainMap.put(renApplyBefore.User_Salesdept__c, 0); } 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); } } } iflog.Log__c += '更新数:'+opdAgainMap.size(); if (opdAgainMap != null && opdAgainMap.size() > 0) { update opdAgainMap.values(); } }catch(Exception ex){ iflog.ErrorLog__c = ex.getLineNumber()+' 行错误 : '+ex.getMessage(); return; } } global void finish(Database.BatchableContext BC) { iflog.Log__c += '\nRentalAutomaticSortBatch end'; String tmp = iflog.ErrorLog__c; if (tmp.length() > 65000) { tmp = tmp.substring(0, 65000); tmp += ' ...have more lines...'; iflog.ErrorLog__c = tmp; } update iflog; if(!onlyMyselefy && !Test.isRunningTest()){ Id execBTId = Database.executebatch(new OPDPlanMarkBatch(), 100); } } 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; } } }