global class EquipmentSetDailyBatch implements Database.Batchable, Database.Stateful { private static final Integer MAXERRORCNT = 20; // 邮件表单位最大错误信息显示数量 private static final Boolean ALLORNONE = false; // 全部保存 private ErrorBean eb = new ErrorBean(); // 邮件发送ERRORBEAN private Integer maxCount = 3; private Integer nowCount = 0; /* 创建于20161126 by ZDF 目的1:询价的「20.最终发货日」is null and 最新预定归还日 = 今天 then 最新预定归还日 + 30天(循环) 目的2:IF 修理的「13.RC修理品返送日」 is null and 最新预定归还日 = 今天 then 最新预定归还日 + 30天。(循环) */ id Rentalid; global EquipmentSetDailyBatch(id Rentalid) { this.Rentalid = Rentalid; Integer i = 0; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; } global Database.QueryLocator start(Database.BatchableContext BC) { String query; query = 'select id,name from Rental_Apply__c'; if(Rentalid!=null){ query = query + ' where id = \'' + Rentalid +'\''; } else { query = query + ' where Status__c != \'取消\''; // 20230525 ljh DB202305485741 start query += ' and Rental_Apply_Equipment_Set_Cnt__c > 0 '; query += ' and Rental_Apply_Equipment_Set_Detail_Cnt__c > 0 '; query += ' and RA_Status__c != \'完了\' '; // 20230525 ljh DB202305485741 end } //query = ''; return Database.getQueryLocator(query); } global void execute(Database.BatchableContext BC, List RaList) { //************************************Create 20161126 黑名单设计 by ZDF************************************// // Start //************************************Create 20161126 黑名单设计 by ZDF************************************// List RaesList = new List(); List RaesListForUpdate = new List(); RaesList = [select id, name, Bollow_Date__c, Rental_Apply__c, Shippment_loaner_time2__c, Loaner_received_time__c, Received_Confirm__c, Asset_return_time__c, Rental_Apply__r.RC_Ordered_Date__c, Rental_Apply__r.Demo_purpose1__c, Rental_Apply__r.Demo_purpose2__c, Rental_Apply__r.Follow_UP_Opp__c, Rental_Apply__r.Follow_UP_Opp__r.Shipping_Finished_Day_Func__c, Rental_Apply__r.Repair__c, Rental_Apply__r.Repair__r.SAP_not_accept_repair_result__c, Rental_Apply__r.Repair__r.Repair_Shipped_Date__c, Rental_Apply__r.Repair__r.Status1__c, Rental_Apply__r.next_action_Text__c, Rental_Apply__r.QISRepair__c, Rental_Apply__r.QIS_Repair_Shipped_Date__c, Rental_Apply__r.QIS_ReplaceDeliveryDate__c, Rental_Apply__r.QIS_Reply_day__c, Rental_Apply__r.QIS_Cancel_Submit_day__c, Rental_Apply__r.QIS_cancel_date__c, Rental_Apply__r.Request_demo_day__c, Final_reply_day__c, Add_Day_For_RC__c from Rental_Apply_Equipment_Set__c where Rental_Apply__c in:RaList ]; for (Rental_Apply_Equipment_Set__c Raesc : RaesList) { if (Raesc.Rental_Apply__r.Follow_UP_Opp__c != null && Raesc.Rental_Apply__r.Demo_purpose2__c == '已购待货') { if (Raesc.Rental_Apply__r.Follow_UP_Opp__r.Shipping_Finished_Day_Func__c == null && Raesc.Final_reply_day__c == Date.today()) { Raesc.Add_Day_For_RC__c = Raesc.Final_reply_day__c.addDays(30); } else if (Raesc.Rental_Apply__r.Follow_UP_Opp__r.Shipping_Finished_Day_Func__c != null) { Raesc.Add_Day_For_RC__c = null; } RaesListForUpdate.Add(Raesc); } else if (Raesc.Rental_Apply__r.Repair__c != null && (Raesc.Rental_Apply__r.Demo_purpose2__c == '一般用户' || Raesc.Rental_Apply__r.Demo_purpose2__c == '故障排查' || Raesc.Rental_Apply__r.Demo_purpose2__c == '保修用户' || Raesc.Rental_Apply__r.Demo_purpose2__c == '市场多年保修' || Raesc.Rental_Apply__r.Demo_purpose2__c == '再修理') ) { if (Raesc.Rental_Apply__r.Repair__r.Status1__c == '0.删除') { //对于所有修理,如果修理状态变为删除时,申请单内最新预定归还日关联修理内‘不受理日(SAP)’+7天(自然日) //if(Raesc.Rental_Apply__r.Repair__r.SAP_not_accept_repair_result__c != null ) { // Raesc.Add_Day_For_RC__c = Raesc.Rental_Apply__r.Repair__r.SAP_not_accept_repair_result__c.addDays(7); // Raesc.Repair_Delete_Date__c = Raesc.Rental_Apply__r.Repair__r.SAP_not_accept_repair_result__c.addDays(7); //} } else if (Raesc.Rental_Apply__r.Repair__r.Repair_Shipped_Date__c == null && Raesc.Final_reply_day__c == Date.today()) { if (Raesc.Rental_Apply__r.RC_Ordered_Date__c != null && (Raesc.Rental_Apply__r.Demo_purpose2__c == '保修用户' || Raesc.Rental_Apply__r.Demo_purpose2__c == '市场多年保修') ) { //黑名单的1个月自动延期设置条件加一点:发货后7天后RC受理日不为空 Raesc.Add_Day_For_RC__c = Raesc.Final_reply_day__c.addDays(30); } else if (Raesc.Rental_Apply__r.Demo_purpose2__c == '一般用户') { Raesc.Add_Day_For_RC__c = Raesc.Final_reply_day__c.addDays(30); } else if (Raesc.Rental_Apply__r.Demo_purpose2__c == '故障排查') { // 到货NG一周内寄回 or 到货OK if((Raesc.Received_Confirm__c == 'OK' || Raesc.Received_Confirm__c == '默认签收-OK') || (Raesc.Received_Confirm__c == 'NG' && Raesc.Asset_return_time__c < Raesc.Loaner_received_time__c.addDays(7)) ) { Raesc.Add_Day_For_RC__c = Raesc.Final_reply_day__c.addDays(30); } } else if (Raesc.Rental_Apply__r.Demo_purpose2__c == '再修理') { Raesc.Add_Day_For_RC__c = Raesc.Final_reply_day__c.addDays(30); } //Raesc.Add_Day_For_RC__c = Raesc.Final_reply_day__c.addDays(30); } else if (Raesc.Rental_Apply__r.Repair__r.Repair_Shipped_Date__c != null) { Raesc.Add_Day_For_RC__c = null; } RaesListForUpdate.Add(Raesc); } else if (Raesc.Rental_Apply__r.Demo_purpose2__c == '索赔QIS') { if (Raesc.Final_reply_day__c == Date.today() && Raesc.Rental_Apply__r.Request_demo_day__c >= Date.newInstance(2019, 9, 1) && (((Raesc.Rental_Apply__r.next_action_Text__c == '无偿维修' || Raesc.Rental_Apply__r.next_action_Text__c == '无偿维修' || Raesc.Rental_Apply__r.next_action_Text__c == '有偿维修' || Raesc.Rental_Apply__r.next_action_Text__c == '有偿维修+无偿维修' ) && (String.isNotBlank(Raesc.Rental_Apply__r.QISRepair__c) && Raesc.Rental_Apply__r.QIS_Repair_Shipped_Date__c == null ) ) || (Raesc.Rental_Apply__r.next_action_Text__c == '无偿更换' && Raesc.Rental_Apply__r.QIS_ReplaceDeliveryDate__c == null ) || (Raesc.Rental_Apply__r.next_action_Text__c == '送回' && Raesc.Rental_Apply__r.QIS_Reply_day__c == null ) || (String.isBlank(Raesc.Rental_Apply__r.next_action_Text__c) && Raesc.Rental_Apply__r.QIS_Cancel_Submit_day__c == null && Raesc.Rental_Apply__r.QIS_cancel_date__c == null ) ) ) { Raesc.Add_Day_For_RC__c = Raesc.Final_reply_day__c.addDays(30); RaesListForUpdate.Add(Raesc); } } } if (RaesListForUpdate.size() > 0) { // update RaesListForUpdate; Database.SaveResult[] saveRes = Database.update(RaesListForUpdate, ALLORNONE); eb.setError(saveRes, MAXERRORCNT, Rental_Apply_Equipment_Set__c.sObjectType); } //************************************Create 20161126 黑名单设计 by ZDF************************************// // END //************************************Create 20161126 黑名单设计 by ZDF************************************// //************************************Create 20170822 备品:7天默认签收的设置******************************// // Start //************************************Create 20170822 备品:7天默认签收的设置******************************// RaesList = [select id, name, Shippment_loaner_time2__c, Loaner_received_time__c, RAES_Status__c, Received_Confirm__c from Rental_Apply_Equipment_Set__c where Rental_Apply__c in:RaList ]; List updateForDate = new List(); for (Rental_Apply_Equipment_Set__c Raesc : RaesList) { if (Raesc.Shippment_loaner_time2__c != null && Raesc.Loaner_received_time__c == null && Raesc.RAES_Status__c=='已出库') { if (Raesc.Shippment_loaner_time2__c <= system.now().addDays(-7)) { Raesc.Loaner_received_time__c = system.now(); Raesc.Received_Confirm__c = '默认签收-OK'; updateForDate.add(Raesc); } } } if (updateForDate.size() > 0) { // update updateForDate; Database.SaveResult[] saveRes = Database.update(updateForDate, ALLORNONE); // 备品申请一览更新Error eb.setError(saveRes, MAXERRORCNT, Rental_Apply_Equipment_Set__c.sObjectType); } //************************************Create 20170822 备品:7天默认签收的设置******************************// // End //************************************Create 20170822 备品:7天默认签收的设置******************************// //************************************Create 20170606 取消创建60天后未能分配的申请单***********************// // Start //************************************Create 20170606 取消创建60天后未能分配的申请单***********************// // Datetime todayMin60Days = system.now().addDays(-60) ; // List updateStatus = [ select id,isCanceled_TF__c,Status__c from Rental_Apply__c // where // Request_approval_time__c <: todayMin60Days // and // Status__c = '已批准' // and // isCanceled_TF__c = false]; // for(Rental_Apply__c ups : updateStatus){ // ups.Status__c = '取消'; // ups.isCanceled_TF__c = true; // ups.Loaner_cancel_request__c ='本申请60天内无库存,关闭申请单'; // } // IF(updateStatus.size()>0){ // update updateStatus; // } Datetime todayMin60Days = system.now().addDays(-60); List updateStatus = [select id, Loaner_name_F__c, Fixture_Set__c, Cancel_Reason__c, Loaner_cancel_Remarks__c FROM Rental_Apply_Equipment_Set__c WHERE Rental_Apply__c in:RaList //2020/11/11 songxiaoqi start 备品借出申请的OPD计划字段,如果是空,才可以自动取消 AND Rental_Apply__r.OPDPlan__c = null //2020/11/11 songxiaoqi end AND Request_approval_time__c <: todayMin60Days //已批准 AND (Rental_Apply__r.Status__c = :FixtureUtil.raStatusMap.get(FixtureUtil.RaStatus.Yi_Pi_Zhun.ordinal()) //已出库指示 OR Rental_Apply__r.Status__c = :FixtureUtil.raStatusMap.get(FixtureUtil.RaStatus.Yi_Chu_Ku_Zhi_Shi.ordinal())) AND Yi_Assigned_Cnt__c = 0 AND Cancel_Select__c = false]; Map raMap = new Map(); Map oldRaesIdMap = new Map(); for (Integer i = 0; i < updateStatus.size(); i ++) { Rental_Apply_Equipment_Set__c raes = updateStatus[i]; raes.Cancel_Select__c = true; raes.Cancel_Reason__c = '被动取消'; raes.Loaner_cancel_Remarks__c ='本一览60天内无库存,取消一览申请'; // 古い一覧明細手動更新 if (String.isBlank(raes.Fixture_Set__c)) { oldRaesIdMap.put(raes.Id, raes); } //关联地方 申请字段 isCanceled_TF_Set_Cnt if(!raMap.containsKey(raes.Rental_Apply__c)) { raMap.put(raes.Rental_Apply__c, ''); } String str = raMap.get(raes.Rental_Apply__c); raMap.put(raes.Rental_Apply__c,str + '备品配套' + (i + 1) + ':
' // + '' + '型号:' + raes.Loaner_name_F__c // + '' + '
'); } List raList2 = new List(); for (Id raId : raMap.keySet()) { raList2.add(new Rental_Apply__c(Id = raId, Email_Rental_Apply_Equipment_Set__c = raMap.get(raId))); } //先更新申请再更新一览,不然一览更新后发邮件时申请里面的字段会没有值 if (!raList2.isEmpty()) { // update raList2; // 备品申请更新Error Database.SaveResult[] saveRes = Database.update(raList2, ALLORNONE); eb.setError(saveRes, MAXERRORCNT, Rental_Apply__c.sObjectType); } if (!updateStatus.isEmpty()) { // update updateStatus; Database.SaveResult[] saveRes = Database.update(updateStatus, ALLORNONE); // 备品申请一览更新Error eb.setError(saveRes, MAXERRORCNT, Rental_Apply_Equipment_Set__c.sObjectType); } // 古い一覧明細手動更新,一覧先に更新 if (!oldRaesIdMap.isEmpty()) { Database.SaveResult[] saveRes = RentalApplyEquipmentSetHandler.recCancelNGDetailBatch(oldRaesIdMap, null); // 备品申请一览明细更新Error if (saveRes != null) { eb.setError(saveRes, MAXERRORCNT, Rental_Apply_Equipment_Set_Detail__c.sObjectType); } } //************************************Create 20170606 取消创建60天后未能分配的申请单***********************// // End //************************************Create 20170606 取消创建60天后未能分配的申请单***********************// } global void finish(Database.BatchableContext BC) { Boolean haveError = false; String body = ''; for (Id objId : eb.messageMap.keySet()) { haveError = true; body += eb.messageMap.get(objId) + '
'; } if (eb.overMax) { body += ':Over ' + MAXERRORCNT + 'Record
'; } if (haveError == true) { String batchUserId = System.Label.Batch_User_Id; List us = [Select Id,NAme,Email From User Where Id =: batchUserId]; if (!us.isEmpty()) { User use = us[0]; if (String.isNotBlank(use.Email)) { List MailCc; if (System.Label.Batch_Error_Send_To_CC != 'null') { MailCc = System.Label.Batch_Error_Send_To_CC.split(','); } FixtureUtil.sendMessage(batchUserId, MailCc, 'EquipmentSetDailyBatch Error', body ); } } if (nowCount < maxCount) { EquipmentSetDailyBatch b = new EquipmentSetDailyBatch(this.Rentalid); b.nowCount = this.nowCount + 1; Database.executeBatch(b, 20); } } } /************************* Inner Class ******************************/ public class ErrorBean{ // public String objectName; // public String objectLabel; public Map messageMap; public Boolean overMax; // public ErrorBean(Schema.sObjectType obj) { // objectName = obj.getDescribe().getName(); // objectLabel = obj.getDescribe().getLabel(); // messageMap = new Map(); // overMax = false; // } public ErrorBean() { messageMap = new Map(); overMax = false; } public void setError (Database.SaveResult[] saveRes, Integer maxCut, Schema.sObjectType obj) { if (messageMap.keySet().size() <= maxCut && overMax == false) { String objectName = obj.getDescribe().getName(); String objectLabel = obj.getDescribe().getLabel(); for (Database.SaveResult saveRe : saveRes) { if (!saveRe.isSuccess()) { if (!messageMap.containsKey(saveRe.getId())) { if (messageMap.keySet().size() >= maxCut) { overMax = true; break; } for (Database.Error err : saveRe.getErrors()) { String message = objectName + ':' + objectLabel + ':' + err.getStatusCode() + ':' + err.getFields() + ':' + err.getMessage(); messageMap.put(saveRe.getId(), message); // 数据里面有复数错误信息的话只获取第一条 break; } } } } } } } }