global class BreachRecordBatch implements Database.Batchable,Database.Stateful { private List idList = null; public List outlaId = new List(); public List autolaId = new List(); global BreachRecordBatch() { } global BreachRecordBatch(List temp) { idList = temp; } global Database.QueryLocator start(Database.BatchableContext BC) { if(idList != null && idList.size() > 0){ return Database.getQueryLocator([select id,Receipt_Date__c,Loaner_Express__c,Equipment_Type__c,Automatic_Received_Date__c,loaner_application__c,loaner_application__r.Rental_End_Date__c, loaner_application__r.OwnerId,loaner_application__r.Owner.ProfileId,loaner_application__r.Is_Automatic_Received__c,loaner_application__r.Is_time_out__c from loaner_application_detail__c where (loaner_application__r.Rental_End_Date__c <= :Date.today() or Automatic_Received_Date__c <= :Date.today()) //and loaner_application__r.CreatorUserType__c = 'PowerPartner' and RAESD_Status__c in ('已出库','申请者已收货','申请者已装机确认') and id in :idList ]); }else{ return Database.getQueryLocator([select id,Receipt_Date__c,Loaner_Express__c,Equipment_Type__c,Automatic_Received_Date__c,loaner_application__c,loaner_application__r.Rental_End_Date__c, loaner_application__r.OwnerId,loaner_application__r.Owner.ProfileId,loaner_application__r.Is_Automatic_Received__c,loaner_application__r.Is_time_out__c from loaner_application_detail__c where ((loaner_application__r.Rental_End_Date__c <= :Date.today() and RAESD_Status__c in ('已出库','申请者已收货','申请者已装机确认')) or (Automatic_Received_Date__c <= :Date.today() and RAESD_Status__c = '已出库'))]); } } global void execute(Database.BatchableContext BC, List scope) { List passUserId = new List{ '00e0K000001z2Y8', '00e0K000001l1Dx', '00e0K000001l1E2', '00e0K000001l1E7', '00e28000000YMiL', '00e28000000YMif', '00e28000000eN61', '00e28000000eN64', '00e28000001wf2h' }; Map timeoutMap= new Map(); Map autoMap= new Map(); Set timeoutSet= new Set(); Set autoSet= new Set(); Set timeoutID = new Set(); Set autoID = new Set(); Set userIdSet = new Set(); List userList = new List(); Map userMap = new Map(); List ladList = new List(); Set leIdSet = new Set(); Set laIdSet = new Set(); Map usertypeMap = New Map(); system.debug(scope.size()); //获取符合条件的明细的借用单和借用物流单. for(sObject temp : scope){ loaner_application_detail__c lad = (loaner_application_detail__c) temp; if(lad.loaner_application__r.Owner.ProfileId != null){ if(passUserId.contains(String.valueOf(lad.loaner_application__r.Owner.ProfileId).subString(0,15))){ }else{ userIdSet.add(lad.loaner_application__r.OwnerId); usertypeMap.put(lad.loaner_application__r.OwnerId, lad.Equipment_Type__c); leIdSet.add(lad.Loaner_Express__c); } } } //userList = [select id,Automatic_Received_Number__c,Return_Timeout_Number__c from User where id in : userIdSet]; //明细 List leList = new List(); for(Loaner_Express__c le : [select id from Loaner_Express__c where id= :leIdSet]){ le.NotReceivingNum__c = 0; leList.add(le); } /*for(User temp : userList){ userMap.put(temp.id, temp); }*/ Map updatLa = new Map(); Map updatLa1 = new Map(); //判断明细是否超期 for(sObject temp : scope){ loaner_application_detail__c lad = (loaner_application_detail__c) temp; //如果自动收货日期是今天或者今天之前,并且借用单是否自动收货是false并且没有收货日期。 if(lad.Automatic_Received_Date__c <= Date.today() && lad.loaner_application__r.Is_Automatic_Received__c != true && lad.Receipt_Date__c == null ){ //借用单 loaner_application__c la = new loaner_application__c(); la.id = lad.loaner_application__c; la.OwnerId = lad.loaner_application__r.OwnerId; la.Is_Automatic_Received__c = true; if(lad.loaner_application__r.Owner.ProfileId != null){ if(passUserId.contains(String.valueOf(lad.loaner_application__r.Owner.ProfileId).subString(0,15))){ }else{ autoMap.put(la.id, la); } } lad.RAESD_Status__c = '申请者已收货'; lad.Receipt_Status__c= 'OK'; lad.Receipt_Date__c = Date.today(); ladList.add(lad); laIdSet.add(lad.loaner_application__c); if(!updatLa.keySet().contains(la.id)){ updatLa.put(la.Id, la); } //updatLa.add(la); } //如果借出结束日是今天或者今天之前,并且是否超期是false if(lad.loaner_application__r.Rental_End_Date__c <= Date.today() && lad.loaner_application__r.Is_time_out__c != true ){ loaner_application__c la = new loaner_application__c(); la.id = lad.loaner_application__c; la.OwnerId = lad.loaner_application__r.OwnerId; la.Is_time_out__c = true; if(!updatLa1.keySet().contains(la.id)){ updatLa1.put(la.Id, la); } //updatLa1.add(la); if(lad.loaner_application__r.Owner.ProfileId != null){ if(passUserId.contains(String.valueOf(lad.loaner_application__r.Owner.ProfileId).subString(0,15))){ }else{ timeoutMap.put(la.id, la); } } } } system.debug(timeoutSet); system.debug(autoSet); autoSet.addAll(autoMap.values()); timeoutSet.addAll(timeoutMap.values()); //自动收货 /*for(sObject temp : scope){ loaner_application_detail__c lad = (loaner_application_detail__c) temp; if(lad.Automatic_Received_Date__c <= Date.today() && lad.Receipt_Date__c == null){ lad.RAESD_Status__c = '申请者已收货'; lad.Receipt_Status__c= 'OK'; lad.Receipt_Date__c = Date.today(); ladList.add(lad); laIdSet.add(lad.loaner_application__c); } }*/ //List autoUser = new List(); List timeoutUser = new List(); List autoList = new List(); List timeoutList = new List(); List ulList = [select id,Violations_User__c,Violations_reason__c from User_Violations__c where Is_effective__c = true and Violations_User__c in : userIdSet]; Map uvMap = new Map(); Map uvMap2 = new Map(); //统计现在系统中已有的违规次数 for(User_Violations__c uv : ulList){ /*if(uv.Violations_reason__c == '系统自动收货'){ if(uvMap.containsKey(uv.Violations_User__c)){ uvMap.put(uv.Violations_User__c, uvMap.get(uv.Violations_User__c)+1); }else{ uvMap.put(uv.Violations_User__c, 1); } } if(uv.Violations_reason__c == '超期未归还'){ if(uvMap2.containsKey(uv.Violations_User__c)){ uvMap2.put(uv.Violations_User__c, uvMap2.get(uv.Violations_User__c)+1); }else{ uvMap2.put(uv.Violations_User__c, 1); } }*/ if(uvMap.containsKey(uv.Violations_User__c)){ uvMap.put(uv.Violations_User__c, uvMap.get(uv.Violations_User__c)+1); }else{ uvMap.put(uv.Violations_User__c, 1); } } Map> newMap = new Map>(); List laList = new List(); system.debug(autoSet); if(autoSet.size()>0){ laList = [select id,Approver__c,loaner_Manager__c,ApproveManager__c from loaner_application__c where id in :autoMap.keySet()]; for(loaner_application__c la : autoSet){ //User user = userMap.get(la.OwnerId); /*if(user == null){ break; }*/ //userMap.get(la.OwnerId).Automatic_Received_Number__c = (userMap.get(la.OwnerId).Automatic_Received_Number__c == null? 0 : userMap.get(la.OwnerId).Automatic_Received_Number__c ) + 1; if(autolaId.contains(la.Id)){ }else{ loaner_application__c la1 = new loaner_application__c(); for(loaner_application__c la2 : laList){ if(la2.Id == la.Id){ la1 = la2; } } User_Violations__c uv = new User_Violations__c(); uv.Violations_User__c = la.OwnerId; uv.Violations_Loaner__c = la.id; uv.Violations_reason__c = '系统自动收货'; uv.ApplyPerson__c = la1.Approver__c; uv.loaner_Manager__c = la1.loaner_Manager__c; uv.ApproveManager__c = la1.ApproveManager__c; if(newMap.containsKey(uv.Violations_User__c)){ newMap.get(uv.Violations_User__c).add(uv); }else{ List uvlist = new List(); uvlist.add(uv); newMap.put(uv.Violations_User__c,uvlist); } autolaId.add(la.Id); //autoUser.add(user); } } } Map> newMap2 = new Map>(); system.debug(timeoutSet); if(timeoutSet.size()>0){ laList = [select id,Approver__c,loaner_Manager__c,ApproveManager__c from loaner_application__c where id in :timeoutMap.keySet()]; for(loaner_application__c la : timeoutSet){ //User user = userMap.get(la.OwnerId); /* if(user == null){ break; }*/ // user.Return_Timeout_Number__c = (user.Return_Timeout_Number__c == null ? 0 : user.Return_Timeout_Number__c ) +1; //timeoutUser.add(user); //userMap.put(la.OwnerId,user); if(outlaId.contains(la.Id)){ }else{ loaner_application__c la1 = new loaner_application__c(); for(loaner_application__c la2 : laList){ if(la2.Id == la.Id){ la1 = la2; } } User_Violations__c uv = new User_Violations__c(); uv.Violations_User__c = la.OwnerId; uv.Violations_Loaner__c = la.id; uv.Violations_reason__c = '超期未归还'; uv.ApplyPerson__c = la1.Approver__c; uv.loaner_Manager__c = la1.loaner_Manager__c; uv.ApproveManager__c = la1.ApproveManager__c; /*if(newMap2.containsKey(uv.Violations_User__c)){ newMap2.get(uv.Violations_User__c).add(uv); }else{ List uvlist = new List(); uvlist.add(uv); newMap2.put(uv.Violations_User__c,uvlist); }*/ if(newMap.containsKey(uv.Violations_User__c)){ newMap.get(uv.Violations_User__c).add(uv); }else{ List uvlist = new List(); uvlist.add(uv); newMap.put(uv.Violations_User__c,uvlist); } outlaId.add(la.Id); } } } system.debug(newMap.values()); system.debug(newMap2.values()); List updateList = new List(); for(String str : newMap.keySet()){ if(usertypeMap.get(str) == 'NDT' ||usertypeMap.get(str) == 'ANI'){ if(uvMap.containsKey(str)){ if(newMap.containsKey(str)){ if((uvMap.get(str) + newMap.get(str).size()) >= 1 && uvMap.get(str) < 1){ newMap.get(str)[0].Is_locking__c = true; newMap.get(str)[0].Locking_Start_Date__c = Date.today(); } } }else{ if(newMap.containsKey(str)){ if(newMap.get(str).size() >= 1 ){ newMap.get(str)[0].Is_locking__c = true; newMap.get(str)[0].Locking_Start_Date__c = Date.today(); } } } }else{ if(uvMap.containsKey(str)){ if(newMap.containsKey(str)){ if((uvMap.get(str) + newMap.get(str).size()) >= 2 && uvMap.get(str) < 2){ newMap.get(str)[0].Is_locking__c = true; newMap.get(str)[0].Locking_Start_Date__c = Date.today(); } } }else{ if(newMap.containsKey(str)){ if(newMap.get(str).size() >= 2 ){ newMap.get(str)[0].Is_locking__c = true; newMap.get(str)[0].Locking_Start_Date__c = Date.today(); } } } } updateList.addAll(newMap.get(str)); } /*for(String str : newMap2.keySet()){ if(uvMap2.containsKey(str)){ if(newMap2.containsKey(str)){ if((uvMap2.get(str) + newMap2.get(str).size()) == 2 && uvMap2.get(str) != 2){ newMap2.get(str)[0].Is_locking__c = true; newMap2.get(str)[0].Locking_Start_Date__c = Date.today(); } } }else{ if(newMap2.containsKey(str)){ if(newMap2.get(str).size() >= 2 ){ newMap2.get(str)[0].Is_locking__c = true; newMap2.get(str)[0].Locking_Start_Date__c = Date.today(); } } } updateList.addAll(newMap2.get(str)); }*/ system.debug('updateList:' + updateList); insert updateList; //update userMap.values(); if(ladList.size()>0){ update ladList; } if(leList.size()>0){ update leList; } if(updatLa.size()>0){ update updatLa.values(); } if(updatLa1.size()>0){ update updatLa1.values(); } if(laIdSet.size()>0){ laList = [select id,Count_SendOut__c,Count_ApplicantReceived__c from loaner_application__c where id = :laIdSet and Status__c = '全部发货']; for(loaner_application__c la : laList){ if(la.Count_SendOut__c == la.Count_ApplicantReceived__c){ la.Status__c = '申请者已收货'; } } update laList; } } global void finish(Database.BatchableContext BC) { List uvList = [select id,Violations_User__c,Is_locking__c,Violations_reason__c from User_Violations__c where Is_effective__c = true order by Violations_User__c]; Map userMap = new Map(); Map userMap2 = new Map(); Map user_vMap = new Map(); for(User_Violations__c uv : uvList){ if(uv.Violations_reason__c == '超期未归还'){ if(userMap.containsKey(uv.Violations_User__c)){ userMap.put(uv.Violations_User__c, userMap.get(uv.Violations_User__c)+1); }else{ userMap.put(uv.Violations_User__c, 1); } }else if(uv.Violations_reason__c == '系统自动收货'){ if(userMap2.containsKey(uv.Violations_User__c)){ userMap2.put(uv.Violations_User__c, userMap2.get(uv.Violations_User__c)+1); }else{ userMap2.put(uv.Violations_User__c, 1); } } if(uv.Is_locking__c == true){ user_vMap.put(uv.Violations_User__c,uv.Id); } } system.debug(user_vMap); Map userList = new Map(); for(String userId : userMap.keySet()){ User user = new User(); user.Id = userId; user.Return_Timeout_Number__c = userMap.get(userId); if(user_vMap.containsKey(userId)){ user.ViolationsID__c = user_vMap.get(userId); } userList.put(user.Id, user); } for(String userId : userMap2.keySet()){ User user = new User(); if(userList.containsKey(userId)){ user = userList.get(userId); user.Automatic_Received_Number__c = userMap2.get(userId); }else{ user.Id = userId; user.Automatic_Received_Number__c = userMap2.get(userId); } if(user_vMap.containsKey(userId)){ user.ViolationsID__c = user_vMap.get(userId); } userList.put(user.Id, user); } system.debug(userList); List updateList = userList.values(); update updateList; } }