global class updateESignBatchAttachment implements Database.Batchable < sObject > , Database.Stateful { //电子签收单-签收单录入表更新签收单 精琢技术 wql 2020-09-25 start /* ①正常执行 Database.executeBatch(new updateESignBatchAttachment(), 20); ②处理某一个签收单 Database.executeBatch(new updateESignBatchAttachment(''), 1); ③批量处理某些签收单(不是最终状态的) Database.executeBatch(new updateESignBatchAttachment(['','','']), 20); ④处理某一个最终状态的签收单 Database.executeBatch(new updateESignBatchAttachment('',true), 1); ⑤批量处理某些最终状态的签收单 Database.executeBatch(new updateESignBatchAttachment('['','','']',true), 20); ⑥处理某一天的所有签收单 Database.executeBatch(new updateESignBatchAttachment(2020-09-27), 20); ⑦处理某一时间段的所有签收单 Database.executeBatch(new updateESignBatchAttachment(2020-09-27,2020-09-28), 20); */ private static final Integer MAXERRORCNT = 20; // 邮件表单位最大错误信息显示数量 private ScBean scB; private ErrorBean eb = new ErrorBean(); // 邮件发送ERRORBEAN private String scErrorMessage = ''; // 添加计划错误信息 //手动执行标识 // private Boolean ManualExecution_Identification; //存放检索的soql语句 private String query; //存放需要更新的日期 private Date toDate; //存放一段时间的开始日期 private Date startDate; //存放一段时间的结束日期 private Date endDate; //存放需要更新的签收单id private String id; //存放需要更新的一些签收单 private List < String > ids; //存放已经最终状态的flag private Boolean flag; //用于执行batch同时记录日志信息 private BatchIF_Log__c iflog; global List < String > emailMessages = new List < String > (); global Integer totalCount = 0; // 总件数 global Integer failedCount = 0; //失败件数 global Boolean ManualExecution_Identification = false; //默认跑所有签收单 global updateESignBatchAttachment() { iflog = new BatchIF_Log__c(); iflog.Type__c = 'ESignBatch'; iflog.Is_Error__c = 0; iflog.Log__c = 'updateESignBatchAttachment start1\n'; iflog.ErrorLog__c = ''; // insert iflog; } //更新某一天的签收单 global updateESignBatchAttachment(Date toDate) { //手动标识置成true this.ManualExecution_Identification = true; this.toDate = toDate; iflog = new BatchIF_Log__c(); iflog.Type__c = 'ESignBatch'; iflog.Is_Error__c = 0; iflog.Log__c = 'updateESignBatchAttachment start2\n'; iflog.ErrorLog__c = ''; // insert iflog; } //更新某一时间段的 签收单 global updateESignBatchAttachment(Date startDate, Date endDate) { //手动标识置成true this.ManualExecution_Identification = true; this.startDate = startDate; this.endDate = endDate; iflog = new BatchIF_Log__c(); iflog.Type__c = 'ESignBatch'; iflog.Is_Error__c = 0; iflog.Log__c = 'updateESignBatchAttachment start3\n'; iflog.ErrorLog__c = ''; // insert iflog; } //批量更新签收单 global updateESignBatchAttachment(List < String > ids) { //手动标识置成true this.ManualExecution_Identification = true; this.ids = ids; iflog = new BatchIF_Log__c(); iflog.Type__c = 'ESignBatch'; iflog.Is_Error__c = 0; iflog.Log__c = 'updateESignBatchAttachment start4\n'; iflog.ErrorLog__c = ''; // insert iflog; } //更新某一条的签收单 global updateESignBatchAttachment(String id) { //手动标识置成true this.ManualExecution_Identification = true; system.debug('手动传参1:' + ManualExecution_Identification); this.id = id; iflog = new BatchIF_Log__c(); iflog.Type__c = 'ESignBatch'; iflog.Is_Error__c = 0; iflog.Log__c = 'updateESignBatchAttachment start5\n'; iflog.ErrorLog__c = ''; // insert iflog; } //更新某一条的已处理的签收单 global updateESignBatchAttachment(String id, boolean flag) { //手动标识置成true this.ManualExecution_Identification = true; this.id = id; this.flag = flag; iflog = new BatchIF_Log__c(); iflog.Type__c = 'ESignBatch'; iflog.Is_Error__c = 0; iflog.Log__c = 'updateESignBatchAttachment start6\n'; iflog.ErrorLog__c = ''; // insert iflog; } //批量更新已处理的签收单 global updateESignBatchAttachment(List < String > ids, boolean flag) { //手动标识置成true this.ManualExecution_Identification = true; this.ids = ids; this.flag = flag; iflog = new BatchIF_Log__c(); iflog.Type__c = 'ESignBatch'; iflog.Is_Error__c = 0; iflog.Log__c = 'updateESignBatchAttachment start7\n'; iflog.ErrorLog__c = ''; // insert iflog; } global Database.QueryLocator start(Database.BatchableContext bc) { scB = updateESignBatchAttachment.setSc('updateESignFormSchedule', 9, 23, 0, '0 30 2', null); if (System.Test.isRunningTest() == false) { Boolean haveError = false; try { system.schedule(scB.scName, scB.scTime, new updateESignFormSchedule()); } catch (Exception e) { haveError = true; } // 如果哟同名的Batch计划删除已存在的计划重新设置 if (haveError) { haveError = false; for (CronTrigger ct : [SELECT Id, CronJobDetailId, CronExpression, CronJobDetail.Name FROM CronTrigger WHERE CronJobDetail.Name = :scB.scName]) { System.abortJob(ct.Id); } try { system.schedule(scB.scName, scB.scTime, new updateESignFormSchedule()); } catch (Exception e) { scErrorMessage = e.getMessage() + e.getStackTraceString() + '
'; } } } //签收单 sql //检索 id,名字,DN签收状态(经销商),DN签收状态(医院),无前导零DN号,经销商验收结果,医院验收结果 //销售渠道,营业助理,营业管理部担当,是否处理完毕签收单,ocsm管理省 query = 'select id,Name,agencyDNSignUpStatus__c,HPDNSignUpStatus__c,DNNameNo0__c,agencyAcceptResult__c,HPAcceptResult__c'; query += ',Sales_Root_Formula__c,Sales_assistant_name_text__c,RC_Manager__c,agencyConfirmDate__c,salesHPManageConfirmDate__c'; query += ',isProcessed__c,OCM_man_province_cus__c,agencyReject__c,agencyRejectDate__c,HPReject__c,HPRejectDate__c,Statu_Achievements__r.Opportunity__r.Group_purchase_PCL__c '; query += ' from eSignForm__c '; //检索不是最终状态的签收单 if (flag != true) { query += ' where isProcessed__c = false '; } else { if (!string.isblank(id)) { query += 'where id = :id'; } else if (ids != null) { query += 'where id in: ids'; } } //如果传入的是一段时间 if (startDate != null && endDate != null) { query += ' and createdDate >= : startDate and createdDate <= : endDate'; } //如果传入的是某一天的日期 else if (toDate != null) { query += ' and createdDate = :toDate '; } //如果传入的是一批签收单id else if (ids != null) { query += ' and id in: ids '; } //如果传入的是记录类型或者签收单id else if (!string.isblank(id)) { query += ' and id = :id '; } //最后需要排序 query += ' order by createdDate asc '; System.debug('sql语句:' + query); return Database.getQueryLocator(query); } //15分钟batch bug 23:45 ~ 2:30 之间只运行 头尾各一次 public static ScBean setSc(String baseName, Integer minhour, Integer maxhour, Integer minMin, String spbefore, String spafter) { Datetime dt = Datetime.now(); Integer year = Integer.valueOf(dt.format('yyyy')); Integer month = Integer.valueOf(dt.format('MM')); Integer day = Integer.valueOf(dt.format('dd')); Integer hour = Integer.valueOf(dt.format('HH')); Integer min = Integer.valueOf(dt.format('mm')); ScBean b = new ScBean(); if (hour == maxhour && min >= (minMin + 45)) { b.scName = baseName + '001'; if (spafter != null && String.isNotBlank(spafter)) { b.scName = baseName + '005'; b.scTime = spafter + ' ' + day + ' ' + month + ' ? ' + year; // system.schedule(sJobame,spafter + ' ' + day + ' ' + month + ' ? ' + year, new AgencyShareUpdateBatchSchedule()); return b; } else { dt = Datetime.now().addDays(1); year = Integer.valueOf(dt.format('yyyy')); month = Integer.valueOf(dt.format('MM')); day = Integer.valueOf(dt.format('dd')); hour = Integer.valueOf(dt.format('HH')); min = Integer.valueOf(dt.format('mm')); if (spbefore != null && String.isNotBlank(spbefore)) { b.scName = baseName + '006'; // '0 20 8 b.scTime = spbefore + ' ' + day + ' ' + month + ' ? ' + year; // system.schedule(sJobame,spbefore + ' ' + day + ' ' + month + ' ? ' + year, new AgencyShareUpdateBatchSchedule()); } else { b.scTime = '0 ' + minMin + ' ' + minhour + ' ' + day + ' ' + month + ' ? ' + year; // system.schedule(sJobame,'0 ' + minMin + ' ' + minhour + ' ' + day + ' ' + month + ' ? ' + year, new AgencyShareUpdateBatchSchedule()); } } } else if (min < minMin) { b.scName = baseName + '001'; b.scTime = '0 ' + minMin + ' ' + hour + ' ' + day + ' ' + month + ' ? ' + year; // system.schedule(sJobame,'0 ' + minMin + ' ' + hour + ' ' + day + ' ' + month + ' ? ' + year, new AgencyShareUpdateBatchSchedule()); } else if (min < minMin + 15) { b.scName = baseName + '002'; b.scTime = '0 ' + (minMin + 15) + ' ' + hour + ' ' + day + ' ' + month + ' ? ' + year; // system.schedule(sJobame,'0 ' + (minMin + 15) + ' ' + hour + ' ' + day + ' ' + month + ' ? ' + year, new AgencyShareUpdateBatchSchedule()); } else if (min < minMin + 30) { b.scName = baseName + '003'; b.scTime = '0 ' + (minMin + 30) + ' ' + hour + ' ' + day + ' ' + month + ' ? ' + year; // system.schedule(sJobame,'0 ' + (minMin + 30) + ' ' + hour + ' ' + day + ' ' + month + ' ? ' + year, new AgencyShareUpdateBatchSchedule()); } else if (min < minMin + 45) { b.scName = baseName + '004'; b.scTime = '0 ' + (minMin + 45) + ' ' + hour + ' ' + day + ' ' + month + ' ? ' + year; // system.schedule(sJobame,'0 ' + (minMin + 45) + ' ' + hour + ' ' + day + ' ' + month + ' ? ' + year, new AgencyShareUpdateBatchSchedule()); } else { b.scName = baseName + '001'; b.scTime = '0 ' + minMin + ' ' + (hour + 1) + ' ' + day + ' ' + month + ' ? ' + year; // system.schedule(sJobame,'0 ' + minMin + ' ' + (hour + 1) +' ' + day + ' ' + month + ' ? ' + year, new AgencyShareUpdateBatchSchedule()); } return b; } public static void removeOtherSc(String likeName, String needName) { String likeStr = likeName + '00%'; for (CronTrigger ct : [SELECT Id, CronJobDetailId, CronExpression, CronJobDetail.Name FROM CronTrigger WHERE CronJobDetail.Name Like :likeStr AND CronJobDetail.Name != :needName]) { System.abortJob(ct.Id); } } global void execute(Database.BatchableContext BC, list < eSignForm__c > eSignList) { //用作录入表的检索条件 List < String > esFormidList = new List < String > (); //存放签收单录入表明细 List < eSignFormLineItemEntry__c > eSignFormLineItemEntryList = new List < eSignFormLineItemEntry__c > (); //用作签收单明细的检索条件 List < String > eSignFormLineIdList = new List < String > (); //更新的签收单明细 List < eSignFormLineItem__c > eSignFormLuRUList = new List < eSignFormLineItem__c > (); //存放最后更新的 录入表id List < Id > fileIdList = new List < Id > (); //存放最新的 签收单id,签收单录入id Map < Id, Id > eSignIdMap = new Map < Id, Id > (); //存放最新的 签收单id,签收单录入id 用于最后一条签收单录入表不删除 Map < Id, Id > eSignFormLastIdMap = new Map < Id, Id > (); //存放最新的 签收单id,签收单录入id 用于文件更新 Map < Id, Id > eSignFlieIdMap = new Map < Id, Id > (); //存放录入表id,录入表 Map < String, eSignFormEntry__c > lasteSignFormEntryMap = new Map < String, eSignFormEntry__c > (); //存放最新的 签收单明细id,签收单明细录入id Map < Id, Id > eSignFormLineItemEntryIdMap = new Map < Id, Id > (); //签收单录入表明细id,签收单录入表明细 Map < String, eSignFormLineItemEntry__c > lasteSignFormLineItemEntryMap = new Map < String, eSignFormLineItemEntry__c > (); //存放 签收单id,文件数量 Map < String, Integer > fileMap = new Map < String, Integer > (); //驳回后删除文件 后 排序问题 精琢技术 wql 2020/12/24 start List esignAttachAgencyList = new List(); List esignAttachHPList = new List(); Map fileAgencyMap = new Map(); Map fileHPMap = new Map(); //驳回后删除文件 后 排序问题 精琢技术 wql 2020/12/24 end //存放ocsm管理省 List < String > provinceList = new List < String > (); //存放15位签收单id,ocsm管理省 Map < Id, String > provinceMap = new Map < Id, String > (); //存放用于更新的签收单数组 List < eSignForm__c > eSignFormList = new List < eSignForm__c > (); //存放签收单录入表id,name Map < Id, String > eSignNameMap = new Map < Id, String > (); //存放签收单录入表id,type Map < Id, String > eSignTypeMap = new Map < Id, String > (); //删除中间表数据用 Map < String, eSignFormEntry__c > eSignStringMap = new Map < String, eSignFormEntry__c > (); //存放所有签收单录入表id List < String > luruIsSubmitList = new List < String > (); //存放所有签收单录入表id List < String > luruIsLastSubmitList = new List < String > (); //判断是否有未处理的录入表 Map < Id, eSignFormEntry__c > unprocessedESignEneryMap = new Map < Id, eSignFormEntry__c > (); //用于判断删除驳回的附件的筛选条件 Map < Id, eSignForm__c > rejectESignEneryMap = new Map < Id, eSignForm__c > (); //驳回后 删除之前上传的文件id List deleteLastFileList = new List(); //存放未更新前的经销商审批状态 Map < String, String > oldESignAgencyStatusMap = new Map < String, String > (); //存放未更新前的医院审批状态 Map < String, String > oldESignHPStatusMap = new Map < String, String > (); try { //循环存放签收单id 用作检索签收单录入表的条件 system.debug('eSignList:' + eSignList); if (eSignList.size() > 0) { for (eSignForm__c esForm : eSignList) { //存放签收单id,ocsm管理省 如果询价是集采 则取ocsm管理省为集采课的担当 if(esForm.Statu_Achievements__r.Opportunity__r.Group_purchase_PCL__c){ provinceMap.put(esForm.Id, '集采课'); //检索条件 provinceList.add('集采课'); }else{ provinceMap.put(esForm.Id, esForm.OCM_man_province_cus__c); //检索条件 provinceList.add(esForm.OCM_man_province_cus__c); } esFormidList.add(esForm.Id); //有经销商驳回或者医院驳回时删除之前附件 if (esForm.agencyRejectDate__c != null || esForm.HPRejectDate__c != null) { rejectESignEneryMap.put(esForm.Id, esForm); } } } system.debug('rejectESignEneryMap:' + rejectESignEneryMap); //如果map不为空 则作为筛选条件 if (rejectESignEneryMap.size()>0) { List deleteFileList = [SELECT parentId, createdDate, Name,Description FROM Attachment WHERE parentId IN: rejectESignEneryMap.keySet() order by createdDate]; system.debug('deleteFileList:' + deleteFileList); if (deleteFileList.size() > 0) { for (eSignForm__c esFile : rejectESignEneryMap.values()) { for (Attachment att : deleteFileList) { if (esFile.agencyRejectDate__c != null || esFile.HPRejectDate__c != null) { if (att.parentId == esFile.Id ) { //①经销商驳回后需要删除的附件 if (esFile.agencyRejectDate__c != null) { if (att.Name.substring(0, 1) == 'A' && att.createdDate < esFile.agencyRejectDate__c) { deleteLastFileList.add(att); } } //②医院驳回后需要删除的附件 if (esFile.HPRejectDate__c != null) { if (att.Name.substring(0, 1) == 'H' && att.createdDate < esFile.HPRejectDate__c) { deleteLastFileList.add(att); } } } } } } } } system.debug('驳回后删除的文件:' + deleteLastFileList); //先删后增 if (deleteLastFileList.size() > 0) { delete deleteLastFileList; } //检索所有录入表 List < eSignFormEntry__c > eSignFormEntryList = [select id, Name, entryType__c, eSignForm__c, eSignForm__r.OCM_man_province_cus__c, salesManageConfirmDate__c, salesHPManageConfirmDate__c, agencyScanDayBack__c, agencySignUpDateBack__c, agencyConfirmDateBack__c, HPScanDayBack__c, HPSignUpDateBack__c, HPConfirmDateBack__c, eSignForm__r.Name, IsSubmit__c, IsHPSubmit__c, IsAgencyConfirmSubmit__c, agencyAutoSignUpStatus__c, HPSignUpStatus__c, Sales_Root_Formula__c, Sales_assistant_ID__c, IsHandled__c, IsHPHandled__c, createdDate, AgencyWorkflowEmailBack__c, HPWorkflowEmailBack__c, AgencyWorkflowEmail__c, HPWorkflowEmail__c, eSignForm__r.Id, agencyDNSignUpStatus__c, HPDNSignUpStatus__c, agencyReject__c, HPReject__c, IsAgencyScan__c, IsHPScan__c from eSignFormEntry__c where eSignForm__c IN: esFormidList order by eSignForm__c, createdDate asc ]; if (eSignFormEntryList.size() > 0) { for (Id eid : esFormidList) { //遍历所有签收单 for (eSignFormEntry__c eSignFormEntryWhole : eSignFormEntryList) { //删除用 eSignStringMap.put(eSignFormEntryWhole.Id, eSignFormEntryWhole); //②所有的 用于更新文件(包含已处理未处理的数据 ) fileIdList.add(eSignFormEntryWhole.Id); if (eSignFormEntryWhole.IsHandled__c == false) { //未处理的 unprocessedESignEneryMap.put(eid, eSignFormEntryWhole); } if (eSignFormEntryWhole.eSignForm__r.Id == eid) { //存放 签收单id,录入表id 文件用 eSignFlieIdMap.put(eSignFormEntryWhole.Id, eid); //存放签收单录入表,id,name 文件用 eSignNameMap.put(eid, eSignFormEntryWhole.eSignForm__r.Name); } //存放录入表id,记录类型 id,type 文件用 eSignTypeMap.put(eSignFormEntryWhole.Id, eSignFormEntryWhole.entryType__c); } } system.debug('eSignFlieIdMap:' + eSignFlieIdMap); //外层是签收单 for (Id esFormid : esFormidList) { //内层是签收单录入表 for (eSignFormEntry__c eSignFormEntry : eSignFormEntryList) { //①取最新的 录入表 + 未处理的 if (esFormid.equals(eSignFormEntry.eSignForm__c)) { if (!eSignFormEntry.IsHandled__c) { //存放 签收单id,录入表id eSignIdMap.put(esFormid, eSignFormEntry.Id); lasteSignFormEntryMap.put(esFormid, eSignFormEntry); //因为按签收单倒序排,所以第一条就是最新的,直接跳出 // break; } eSignFormLastIdMap.put(esFormid, eSignFormEntry.Id); } } } //最后更新的录入表id for (Id eSignId : eSignIdMap.values()) { luruIsSubmitList.add(eSignId); } //最后更新的录入表id for (Id eSignId : eSignFormLastIdMap.values()) { luruIsLastSubmitList.add(eSignId); } //重新对附件排序 规则变为根据签收单现有附件序号进行排序 精琢技术 wql start //暂时存放一下签收单名称 Map tempMap = new Map(); List tempAttList = [SELECT parentId, createdDate, Name,Description FROM Attachment WHERE parentId IN: esFormidList order by createdDate]; if (tempAttList.size() > 0) { //外层循环签收单 for (String es : esFormidList) { //内层循环附件 for (Attachment att : tempAttList) { //如果id相等 if (es.equals(att.parentId)) { //根据名称拆分 存入不同list String name = att.Name; if (name.substring(0, 1).equals('A')) { esignAttachAgencyList.add(att); } else if (name.substring(0, 1).equals('H')) { esignAttachHPList.add(att); } } } //分别存入到经销商or医院的附件map 用于后期命名 if (esignAttachAgencyList.size() > 0) { fileAgencyMap.put(es, esignAttachAgencyList.size()); } if (esignAttachHPList.size() > 0) { fileHPMap.put(es, esignAttachHPList.size()); } //清空list 供下一个签收单使用 esignAttachAgencyList.clear(); esignAttachHPList.clear(); } } system.debug('fileAgencyMap:' + fileAgencyMap); system.debug('fileHPMap:' + fileHPMap); //重新对附件排序 规则变为根据签收单现有附件序号进行排序 精琢技术 wql end //根据所有的签收单录入表id检索所有的签收单明细录入 List < eSignFormLineItemEntry__c > eSignFormLineItemEntryLists = [select id, eSignFormEntry__r.entryType__c, eSignFormEntry__r.IsHandled__c, eSignFormLineItem__c, eSignFormEntry__c, agencyConfirmResult__c, HPConfirmResult__c, HPGoodStatus__c, agencyGoodStatus__c from eSignFormLineItemEntry__c where eSignFormEntry__c in : luruIsSubmitList and eSignFormEntry__r.IsHandled__c = false order by createdDate asc ]; if (eSignFormLineItemEntryLists.size() > 0) { for (eSignFormLineItemEntry__c eSignFormLineItemEntry : eSignFormLineItemEntryLists) { eSignFormLineIdList.add(eSignFormLineItemEntry.eSignFormLineItem__c); } } system.debug('eSignFormLineIdList:' + eSignFormLineIdList); if (eSignFormLineIdList.size() > 0) { //根据签收单明细录入表 去检索签收单明细 List < eSignFormLineItem__c > eSignFormLineItemList = [select id, agencyGoodStatus__c, HPGoodStatus__c from eSignFormLineItem__c where id IN: eSignFormLineIdList]; if (eSignFormLineItemList.size() > 0) { //外层签收单明细 for (eSignFormLineItem__c eSignFormLineItem : eSignFormLineItemList) { //内层签收单明细录入 for (eSignFormLineItemEntry__c eSignFormLineItemEntry : eSignFormLineItemEntryLists) { //明细id相等存放一个map if (eSignFormLineItem.Id.equals(eSignFormLineItemEntry.eSignFormLineItem__c)) { eSignFormLineItemEntryIdMap.put(eSignFormLineItem.Id, eSignFormLineItemEntry.Id); lasteSignFormLineItemEntryMap.put(eSignFormLineItem.Id, eSignFormLineItemEntry); } } } } } system.debug('lasteSignFormLineItemEntryMap:' + lasteSignFormLineItemEntryMap); if (eSignFormLineIdList.size() > 0) { //循环 更新签收单 for (Id esefId : eSignFormLineIdList) { if (lasteSignFormLineItemEntryMap.containsKey(esefId)) { eSignFormLineItemEntry__c luru = lasteSignFormLineItemEntryMap.get(esefId); //new 一个签收单明细对象 eSignFormLineItem__c eSignLuRu = new eSignFormLineItem__c(); //签收单id eSignLuRu.id = esefId; //货物情况(经销商收货) eSignLuRu.agencyGoodStatus__c = luru.agencyGoodStatus__c; // //经销商确认结果 // eSignLuRu.agencyConfirmResult__c = luru.agencyConfirmResult__c; //货物情况(医院收货) eSignLuRu.HPGoodStatus__c = luru.HPGoodStatus__c; // //经销商确认结果 // eSignLuRu.HPConfirmResult__c = luru.HPConfirmResult__c; //同一个签收单循环遍历签收单录入表 最后一个录入表会add到更新数组中 if (eSignLuRu != null) { system.debug('签收单明细象-----:' + eSignLuRu); eSignFormLuRuList.add(eSignLuRu); } } } } System.debug('更新的签收单明细list:' + eSignFormLuRUList); system.debug('esFormidList:' + esFormidList); if (unprocessedESignEneryMap.size() > 0) { for (Id eSignFormid : unprocessedESignEneryMap.keySet()) { //new 一个签收单对象 eSignForm__c eSignForm = new eSignForm__c(); String name = ''; String idlast = ''; boolean IsSubmit = false; boolean IsHPSubmit = false; //销售渠道 String Sales_Root_Formula; //录入类型 String type; System.debug('lasteSignFormEntryMap:' + lasteSignFormEntryMap); if (lasteSignFormEntryMap.containsKey(eSignFormid)) { eSignForm.id = eSignFormid; //签收单id eSignFormEntry__c eSignFormEntry = lasteSignFormEntryMap.get(eSignFormid); //如果经销商确认日为空的话 进去判断更新经销商审批状态 if (eSignFormEntry.agencyDNSignUpStatus__c != '签收已完成') { if (eSignFormEntry.agencyConfirmDateBack__c == null) { if (eSignFormEntry.IsSubmit__c == true) { eSignForm.agencyAutoSignUpStatus__c = '申请中'; eSignForm.agencyReject__c = false; } else { if (eSignFormEntry.agencyScanDayBack__c != null && eSignFormEntry.IsAgencyScan__c) { eSignForm.agencyAutoSignUpStatus__c = '草案中'; eSignForm.agencyReject__c = false; } } } //未更新前的经销商审批状态 用于文件累计汇总 if(eSignFormEntry.agencyAutoSignUpStatus__c!=null &&eSignFormEntry.agencyAutoSignUpStatus__c!=''){ oldESignAgencyStatusMap.put('A' + eSignForm.id, eSignFormEntry.agencyAutoSignUpStatus__c); }else{ oldESignAgencyStatusMap.put('A' + eSignForm.id, '无'); } } if (eSignFormEntry.HPDNSignUpStatus__c != '签收已完成') { //如果医院确认日为空的话 进去判断更新医院审批状态 if (eSignFormEntry.salesHPManageConfirmDate__c == null) { if (eSignFormEntry.IsHPSubmit__c == true) { eSignForm.HPSignUpStatus__c = '申请中'; eSignForm.HPReject__c = false; } else { if (eSignFormEntry.HPScanDayBack__c != null && eSignFormEntry.IsHPScan__c) { eSignForm.HPSignUpStatus__c = '草案中'; eSignForm.HPReject__c = false; } } } //未更新前的医院审批状态 用于文件累计汇总 if(eSignFormEntry.HPSignUpStatus__c!=null &&eSignFormEntry.HPSignUpStatus__c!=''){ oldESignHPStatusMap.put('H' + eSignForm.id, eSignFormEntry.HPSignUpStatus__c); }else{ oldESignHPStatusMap.put('H' + eSignForm.id, '无'); } } //如果没变化则不更新 if (eSignFormEntry.AgencyWorkflowEmailBack__c != eSignFormEntry.AgencyWorkflowEmail__c) { //经销商邮件 eSignForm.AgencyWorkflowEmail__c = eSignFormEntry.AgencyWorkflowEmailBack__c; } //如果没变化则不更新 if (eSignFormEntry.HPWorkflowEmailBack__c != eSignFormEntry.HPWorkflowEmail__c) { //医院邮件 eSignForm.HPWorkflowEmail__c = eSignFormEntry.HPWorkflowEmailBack__c; } if (eSignFormEntry.agencyDNSignUpStatus__c != '签收已完成') { //经销商扫描日 if (eSignFormEntry.agencyScanDayBack__c != null) { eSignForm.agencyScanDay__c = eSignFormEntry.agencyScanDayBack__c; } //经销商签收日 if (eSignFormEntry.agencySignUpDateBack__c != null) { eSignForm.agencySignUpDate__c = eSignFormEntry.agencySignUpDateBack__c; } //经销商确认日 if (eSignFormEntry.agencyConfirmDateBack__c != null) { eSignForm.agencyConfirmDate__c = eSignFormEntry.agencyConfirmDateBack__c; } } if (eSignFormEntry.HPDNSignUpStatus__c != '签收已完成') { //医院扫描日 if (eSignFormEntry.HPScanDayBack__c != null) { eSignForm.HPScanDay__c = eSignFormEntry.HPScanDayBack__c; } //医院签收日 if (eSignFormEntry.HPSignUpDateBack__c != null) { eSignForm.HPSignUpDate__c = eSignFormEntry.HPSignUpDateBack__c; } //医院确认日 if (eSignFormEntry.HPConfirmDateBack__c != null) { eSignForm.HPConfirmDate__c = eSignFormEntry.HPConfirmDateBack__c; } } //给营业助理赋值 eSignForm.Sales_assistant_name_text__c = eSignFormEntry.Sales_assistant_ID__c; //存一个id idlast = eSignFormEntry.Id; //签收单name用作文件命名 name = eSignFormEntry.eSignForm__r.Name; //是否经销商提交 IsSubmit = eSignFormEntry.IsSubmit__c; //是否医院提交 IsHPSubmit = eSignFormEntry.IsHPSubmit__c; //最后录入表 eSignForm.finalUpadteFrom__c = eSignFormEntry.Id; //销售渠道 区分直销还是分销 Sales_Root_Formula = eSignFormEntry.Sales_Root_Formula__c; //录入类型 type = eSignFormEntry.entryType__c; } system.debug('签收单对象-----:' + eSignForm); if (eSignForm != null) { system.debug('eSignFormid:' + eSignFormid); if (eSignForm.id != null) { eSignFormList.add(eSignForm); } } system.debug('eSignFormList111:' + eSignFormList); if (eSignFormList.size() > 0) { //更新OCSM管理省 担当 eSignFormList = updateOwner(provinceList, provinceMap, eSignFormList, false); } } } } if (eSignFormList.size() <= 0) { system.debug('我走到这里了!'); eSignFormList = updateOwner(provinceList, provinceMap, eSignList, true); } List fileList = new List (); if (fileIdList.size() > 0) { for (Id fileId : fileIdList) { if (!fileList.contains(fileId)) { fileList.add(fileId); } } } System.debug('fileIdList:' + fileIdList); System.debug('fileList:' + fileList); //用于最后insert 附件 List insertAttactment = new List(); //附件 start List attachMentList = [SELECT id, parentId, Body, Name, ContentType,Description from Attachment where parentId IN :fileList and Description!='电子签收单:已处理']; //修复已处理数据 附件没更新 即没有附件能提交的bug 精琢技术 wql 2021/01/19 start List eSignEntryAttachMentList = new List(); //文件数量 用于文件命名 Integer agencyCount = 0; Integer hpCount = 0; String name; String type ; Integer agencyFileCountNum = 0; Integer hpFileCountNum = 0; Integer i = 0; Integer j = 0; //记录该签收单的最新经销商附件数量 Map eSignAgencyAttSum = new Map (); //记录该签收单的最新医院附件数量 Map eSignHpAttSum = new Map (); //同一条录入表多个附件标识 Boolean agencyNumFlag = false; Boolean hpNumFlag = false; //存1条数据内多个附件 一个固定值 Integer agencySumCount = 0; Integer hpSumCount = 0; if (fileList.size() > 0) { system.debug('attachMentList:' + attachMentList); system.debug('eSignFlieIdMap:' + eSignFlieIdMap); system.debug('eSignNameMap:' + eSignNameMap); for (Id eSignFormEntryId : fileList) { for (Attachment attach : attachMentList) { if (attach.parentId == eSignFormEntryId) { Id eid = eSignFlieIdMap.get(attach.parentId); system.debug('eid:' + eid); name = eSignNameMap.get(eid); system.debug('name:' + name); type = eSignTypeMap.get(attach.parentId); //因为外层循环是中间表 如果2条以上录入表都有经销商附件 则使用最新构建的经销商附件数量来命名 //否则取未更新之前有的经销商附件数量 并且 不是1个录入表多个附件 也就是false的时候 取模拟的最新数量 if(eSignAgencyAttSum.size()>0&&!agencyNumFlag){ agencyCount = eSignAgencyAttSum.get(eid); //记录一个最新的附件数 agencySumCount =agencyCount; }else if(agencySumCount>0){ //本次循环内 第一次取附件数最新值 后续都在此基础上i++ agencyCount =agencySumCount; } else if(fileAgencyMap.size() > 0){ //只有一条数据时,使用此附件数即可 后续在此基础上i++ agencyCount = fileAgencyMap.get(eid); } //同一个内部循环里置成true agencyNumFlag = true; //经销商附件命名 start // if (fileAgencyMap.size() > 0) { // agencyCount = fileAgencyMap.get(eid); // } system.debug(name + 'agencyCount:' + agencyCount); if (agencyCount == null || agencyCount == 0) { agencyFileCountNum = 1 + i; } else { agencyFileCountNum = agencyCount + 1 + i; } //经销商附件命名 end //因为外层循环是中间表 如果2条以上录入表都有医院附件 则使用最新构建的医院附件数量来命名 //否则取未更新之前有的医院附件数量 并且 不是1个录入表多个附件 也就是false的时候 取模拟的最新数量 if(eSignHpAttSum.size()>0&&!hpNumFlag){ hpCount = eSignHpAttSum.get(eid); //记录一个最新的附件数 hpSumCount = hpCount; }else if(hpSumCount >0 ){ //本次循环内 第一次取附件数最新值 后续都在此基础上j++ hpCount =hpSumCount; } else if(fileHPMap.size() > 0){ //只有一条数据时,使用此附件数即可 后续在此基础上j++ hpCount = fileHPMap.get(eid); } //同一个内部循环里置成true hpNumFlag =true; //医院附件命名 start // if (fileHPMap.size() > 0) { // hpCount = fileHPMap.get(eid); // } system.debug(name + 'hpCount:' + hpCount); if (hpCount == null || hpCount == 0) { hpFileCountNum = 1 + j; } else { hpFileCountNum = hpCount + 1 + j; } //构建最新的签收单经销商附件数量 if(agencyFileCountNum>0){ eSignAgencyAttSum.put(eid,agencyFileCountNum); } //构建最新的签收单医院附件数量 if(hpFileCountNum>0){ eSignHpAttSum.put(eid,hpFileCountNum); } //医院附件命名 end //用于拆分经销商/医院 区别文件名 String finalName = ''; String title = ''; //文件命名 if (type == '经销商收货' || type == '经销商确认') { finalName = 'A-' + name; //用于判断多次上传文件命名 i++; title = finalName + '--' + agencyFileCountNum; } else if (type == '医院收货' || type == '医院确认') { finalName = 'H-' + name; //用于判断多次上传文件命名 j++; title = finalName + '--' + hpFileCountNum; } else { finalName = name; } system.debug('文件名:' + title); //判断一下格式,不然下载下来是类型是所有文件 // if(attach.ContentType == 'application/pdf'){ // title = title +'.pdf'; // }else if(attach.ContentType == 'image/jpeg'){ // title = title +'.jpg'; // } //判断一下格式,不然下载下来是类型是所有文件 无法打开 if (attach.Name.lastIndexOf('.') > -1) { title = title + attach.Name.substring(attach.Name.lastIndexOf('.')); } Attachment newAttachment = attach.clone(); newAttachment.parentId = eid; newAttachment.name = title; // newAttachment.ContentType =attach.ContentType; //要更新的签收单附件 insertAttactment.add(newAttachment); //反更新录入表的附件 用来判断附件是否被更新 Attachment oldAttachment = new Attachment(); oldAttachment.Id = attach.Id; oldAttachment.Description = '电子签收单:已处理'; eSignEntryAttachMentList.add(oldAttachment); } } //整单循环后 清空值 i = 0; j = 0; agencyNumFlag= false; hpNumFlag =false; agencySumCount =0; hpSumCount=0; } } //电子签收单 增加本次更新附件数量 2020/01/07 精琢技术 wql start //没有附件则根本不会进入 if (insertAttactment.size() > 0) { insert insertAttactment; //反向更新录入表附件 if(eSignEntryAttachMentList.size()>0){ update eSignEntryAttachMentList; } //更新已提交的签收单的附件数 if (eSignFormList.size() > 0) { //外层所有签收单 for (eSignForm__c es : eSignFormList) { //a为经销商附件的数量 h为医院附件的数量 Integer a = 0; Integer h = 0; //内层所有需要更新的附件 for (Attachment att : insertAttactment) { if (es.Id != null) { if (es.Id.equals(att.parentId)) { if (es.agencyAutoSignUpStatus__c != null) { if (es.agencyAutoSignUpStatus__c.equals('申请中') && oldESignAgencyStatusMap.size()>0) { if(!oldESignAgencyStatusMap.get('A' + es.Id).equals('申请中')){ if (att.Name.substring(0, 1).equals('A')) { a ++; } } } } if (es.HPSignUpStatus__c != null) { if (es.HPSignUpStatus__c.equals('申请中') && oldESignHPStatusMap.size()>0) { if(!oldESignHPStatusMap.get('H' + es.Id).equals('申请中')){ if (att.Name.substring(0, 1).equals('H')) { h ++; } } } } } } } //只有真正扫码提交的 并且没有附件才会被更新 if (es.agencyAutoSignUpStatus__c != null) { if (es.agencyAutoSignUpStatus__c.equals('申请中') && oldESignAgencyStatusMap.size()>0) { if(!oldESignAgencyStatusMap.get('A' + es.Id).equals('申请中')){ es.agencyAttachNum__c = a; } } } //只有真正扫码提交的 并且没有附件才会被更新 if (es.HPSignUpStatus__c != null) { if (es.HPSignUpStatus__c.equals('申请中') &&oldESignHPStatusMap.size()>0 ) { if(!oldESignHPStatusMap.get('H' + es.Id).equals('申请中')){ es.HPAttachNum__c = h; } } } a = 0; h = 0; } } //电子签收单 增加本次更新附件数量 2020/01/07 精琢技术 wql end //文件 end } system.debug('更新的签收单:' + eSignFormList); //更新签收单明细并添加日志 if (eSignFormLuRUList.size() > 0) { Database.SaveResult[] lsr = Database.update(eSignFormLuRUList, false); eb.setError(lsr, MAXERRORCNT, eSignFormLineItem__c.sObjectType); for (Integer tIdx = 0; tIdx < lsr.size(); tIdx++) { Database.SaveResult sr = lsr[tIdx]; System.debug('sr.isSuccess:' + sr.isSuccess()); if (!sr.isSuccess()) { Database.Error emsg = sr.getErrors()[0]; iflog.ErrorLog__c += 'ERROR ' + eSignFormList[tIdx].Id + ' eSignFormLineItem__c:' + emsg + '\n'; } } } //更新签收单并添加日志 if (eSignFormList.size() > 0) { Database.SaveResult[] lsr = Database.update(eSignFormList, false); eb.setError(lsr, MAXERRORCNT, eSignForm__c.sObjectType); for (Integer tIdx = 0; tIdx < lsr.size(); tIdx++) { Database.SaveResult sr = lsr[tIdx]; System.debug('sr.isSuccess:' + sr.isSuccess()); if (!sr.isSuccess()) { Database.Error emsg = sr.getErrors()[0]; iflog.ErrorLog__c += 'ERROR ' + eSignFormList[tIdx].Id + ' eSignForm__c:' + emsg + '\n'; } } } }catch(NullPointerException npe){ iflog.ErrorLog__c += 'ERROR : eSignForm__c:空指针错误-行号:'+ npe.getLineNumber()+ '\n'; } catch (Exception e) { // Database.rollback(sp); iflog.ErrorLog__c += 'ERROR : eSignForm__c:'+ e.getMessage() + '\n'; } try{ System.debug('luruIsLastSubmitList:'+luruIsLastSubmitList); if (luruIsLastSubmitList.size() > 0) { //删除中间表数据(因为住主详关系,删除录入表即可) deleteMiddleData(eSignStringMap, luruIsLastSubmitList); } }catch(Exception e){ iflog.ErrorLog__c += 'ERROR : eSignForm__c:'+ e.getMessage() + '\n'; } //文件 end } //删除中间表数据(因为住主详关系,删除录入表即可) private static void deleteMiddleData(Map < String, eSignFormEntry__c > eSignStringMap, List < String > luruIsSubmitList) { system.debug('检索的所有录入表:' + eSignStringMap); system.debug('最后录入的id :' + luruIsSubmitList + '----数量:' + luruIsSubmitList.size()); list < eSignFormEntry__c > eSignFormDeleteList = new list < eSignFormEntry__c > (); for (String essm : eSignStringMap.keySet()) { for (String lisl : luruIsSubmitList) { if (essm.equals(lisl)) { eSignStringMap.remove(lisl); } } } for (eSignFormEntry__c esfe : eSignStringMap.values()) { eSignFormDeleteList.add(esfe); } system.debug('删除的数据id:' + eSignFormDeleteList + '----数量:' + eSignFormDeleteList.size()); //删除签收单录入表其他数据 if (eSignFormDeleteList.size() > 0) { //循环遍历id 删除文件 List fileDeleteIdList = new List (); List deleteAttachmentList = new List(); for (eSignFormEntry__c eSigf : eSignFormDeleteList) { fileDeleteIdList.add(eSigf.Id); } //循环找到文件id if (fileDeleteIdList.size() > 0) { // 2022-02-28 shashiming Apex heap size too large // 去掉Body字段 List attachMentList = [SELECT id, parentId, Name, ContentType,Description from Attachment where parentId = :fileDeleteIdList]; if (attachMentList.size() > 0) { for (Attachment att : attachMentList) { Attachment am = new Attachment(); am.Id = att.Id; deleteAttachmentList.add(am); } //删除文件 if (deleteAttachmentList.size() > 0) { delete deleteAttachmentList; } } } //删除录入表 delete eSignFormDeleteList; } } @TestVisible //更新营业部担当 private static List < eSignForm__c > updateOwner(List < String > provinceList, Map < Id, String > provinceMap, List < eSignForm__c > eSignFormList, boolean ocsmFlag) { //营业担当 map Map < String, String > provinceOwnerMap = new Map < String, String > (); //营业助理 map Map < String, String > provinceGIMap = new Map < String, String > (); List < eSignForm__c > eSignFormLastList = new List < eSignForm__c >(); //检索OCSM管理省对象 List < OCM_Management_Province__c > ompList = [select id, Name, SalesManage__c,GI_assistant__c from OCM_Management_Province__c where Name IN: provinceList]; //存放map<省,担当> for (OCM_Management_Province__c omp : ompList) { //不用map的 原因是 想 ocsm管理省 和签收单 营业担当的顺序保持一致 //String salesManage = omp.SalesManage__c+','+omp.SalesManage2__c+','+omp.SalesManage3__c; //provinceOwnerMap.put(omp.Name, salesManage); provinceOwnerMap.put(omp.Name, omp.SalesManage__c); provinceGIMap.put(omp.Name, omp.GI_assistant__c); } //①为true的时候 是其他没发生变化只有ocsm省上营业担当改变 //②为false的时候,有中间表正常更新的情况 //营业担当123 可能以后不用 20201225 start // if(ocsmFlag){ // //给最后要更新的签收单的审批者(营业部担当)赋值 // for (Integer cnt=0;cnt0&&result!=null){ // if(result.contains(eSignFormList[cnt].RC_Manager__c)&&result.contains(eSignFormList[cnt].RC_Manager2__c)&&result.contains(eSignFormList[cnt].RC_Manager3__c)){ // //则不用更新,返回null // eSignFormList.remove(cnt); // eSignFormLastList =eSignFormList; // }else{ // eSignForm__c eSignForm = new eSignForm__c(); // eSignForm.Id = eSignFormList[cnt].Id; // if(result.size()>0){ // if(String.isNotBlank(result[0])&&result[0]!=null&&result[0]!=''&&result[0]!='null'){ // eSignForm.RC_Manager__c = result[0]; // }else{ // eSignForm.RC_Manager__c = null; // } // if(String.isNotBlank(result[1])&&result[1]!=null&&result[1]!=''&&result[1]!='null'){ // eSignForm.RC_Manager2__c = result[1]; // }else{ // eSignForm.RC_Manager2__c = null; // } // if(String.isNotBlank(result[2])&&result[2]!=null&&result[2]!=''&&result[2]!='null'){ // eSignForm.RC_Manager3__c = result[2]; // }else{ // eSignForm.RC_Manager3__c = null; // } // } // //eSignForm.RC_Manager__c = provinceOwnerMap.get(provinceMap.get(eSignFormList[cnt].Id)); // eSignFormLastList.add(eSignForm); // } // } // } // return eSignFormLastList; // }else{ // //给最后要更新的签收单的审批者(营业部担当)赋值 // for (eSignForm__c esf: eSignFormList) { // //将逗号分隔的字符串转为数组 // //因为其中有逗号,所以肯定不为空 // String rcManager = provinceOwnerMap.get(provinceMap.get(esf.Id)); // String[] result; // if(rcManager!=null&&String.isNotBlank(rcManager)){ // result = rcManager.split(','); // } // if(result.size()>0){ // if(String.isNotBlank(result[0])&&result[0]!=null&&result[0]!=''&&result[0]!='null'){ // esf.RC_Manager__c = result[0]; // } // if(String.isNotBlank(result[1])&&result[1]!=null&&result[1]!=''&&result[1]!='null'){ // esf.RC_Manager2__c = result[1]; // } // if(String.isNotBlank(result[2])&&result[2]!=null&&result[2]!=''&&result[2]!='null'){ // esf.RC_Manager3__c = result[2]; // } // } // //esf.RC_Manager__c = provinceOwnerMap.get(provinceMap.get(esf.Id)); // } // return eSignFormList; // } //营业担当123 可能以后不用 20201225 end if (ocsmFlag) { //给最后要更新的签收单的审批者(营业部担当)赋值 for (Integer cnt = 0; cnt < eSignFormList.size(); cnt++) { if (provinceOwnerMap.get(provinceMap.get(eSignFormList[cnt].Id)) != eSignFormList[cnt].RC_Manager__c ||provinceMap.get(eSignFormList[cnt].Id).equals('集采课')) { eSignForm__c eSignForm = new eSignForm__c(); eSignForm.Id = eSignFormList[cnt].Id; eSignForm.RC_Manager__c = provinceOwnerMap.get(provinceMap.get(eSignFormList[cnt].Id)); //集采询价 营业助理需要维护成 集采课的SP、GI助理 精琢技术 wql 2021/01/08 start if(provinceMap.get(eSignFormList[cnt].Id).equals('集采课')){ eSignForm.Sales_assistant_name_text__c = provinceGIMap.get(provinceMap.get(eSignFormList[cnt].Id)); } //集采询价 营业助理需要维护成 集采课的SP、GI助理 精琢技术 wql 2021/01/08 end eSignFormLastList.add(eSignForm); } } return eSignFormLastList; } else { //给最后要更新的签收单的审批者(营业部担当)赋值 for (eSignForm__c esf : eSignFormList) { if (provinceOwnerMap.get(provinceMap.get(esf.Id)) != null) { esf.RC_Manager__c = provinceOwnerMap.get(provinceMap.get(esf.Id)); //集采询价 营业助理需要维护成 集采课的SP、GI助理 精琢技术 wql 2021/01/08 start if(provinceMap.get(esf.Id).equals('集采课')){ esf.Sales_assistant_name_text__c = provinceGIMap.get(provinceMap.get(esf.Id)); } //集采询价 营业助理需要维护成 集采课的SP、GI助理 精琢技术 wql 2021/01/08 end } } return eSignFormList; } } global void finish(Database.BatchableContext BC) { //更新该日志的数据信息 iflog.Log__c += '\nupdateESignBatchAttachment end'; String tmp = iflog.ErrorLog__c; if (iflog.Log__c.length() > 131072) { iflog.Log__c = iflog.Log__c.subString(0, 131065) + ' ...'; } if (iflog.ErrorLog__c.length() > 32768) { iflog.ErrorLog__c = iflog.ErrorLog__c.subString(0, 32760) + ' ...'; } if (tmp.length() > 65000) { tmp = tmp.substring(0, 65000); tmp += ' ...have more lines...'; iflog.ErrorLog__c = tmp; } //有错误才添加日志,不然每天每15分钟生成日志太多 if (tmp.length() > 0) { insert iflog; } system.debug('手动传参:' + ManualExecution_Identification); //手动传参执行则不进入创建计划的作业 if (!ManualExecution_Identification) { Boolean haveError = false; String body = scErrorMessage; for (Id objId : eb.messageMap.keySet()) { haveError = true; body += eb.messageMap.get(objId) + '
'; } if (eb.overMax) { body += ':Over ' + MAXERRORCNT + 'Record
'; } updateESignBatchAttachment.removeOtherSc('updateESignFormSchedule', scB.scName); if (haveError == true || String.isNotBlank(scErrorMessage)) { // BatchユーザId //写死精琢用户 上线后应该会修改成自定义标签 // String batchUserId = '00510000005sEEM'; 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.ESign_Error_Send_To_CC != 'null') { MailCc = System.Label.ESign_Error_Send_To_CC.split(','); } FixtureUtil.sendMessage(batchUserId, MailCc, 'updateESignBatchAttachment Error', body ); } } } } } 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; } } } } } } } //定时跑任务 public Class ScBean { public String scName; public String scTime; } }