/*2021-05-08 mzy * 更新招标信息的询价状态和询价的数量 * 更新招标信息的5个医院 * 当医院发生变化/招投标项目OCSM省发生变化时,空更新一下招投标 */ global class UpdateTenderInformationBatch implements Database.Batchable, Database.Stateful { Boolean IsNeedExecute = false; String tempTenderId =''; Boolean IsOnlyTrue = true; List tempTenderList = new List(); //邮件信息 List emailMessages = new List(); //招投标: 报错的招投标Id String TenderlogStr = '招标项目 : '; //招投标: 报错信息 String TendererrorStr = ''; //招投标: 总件数 Integer TendertotalCount = 0; //招投标: 失败件数 Integer TenderfailedCount = 0; //执行符合条件的指定招投标项目 global UpdateTenderInformationBatch(String tempTenderId) { this.tempTenderId = tempTenderId; } //执行指定招标项目里符合条件的招投标项目 global UpdateTenderInformationBatch(List tempTenderList) { this.tempTenderList = tempTenderList; } //处理历史数据 IsOnlyTrue = false 执行所有的招标项目 global UpdateTenderInformationBatch(String tempOppId, Boolean IsOnlyTrue) { this.IsOnlyTrue = IsOnlyTrue; } // IsOnlyTrue = false 可以手动 无条件执行多条招投标项目 global UpdateTenderInformationBatch(String tempOppId, Boolean IsOnlyTrue,List tempTenderList) { this.IsOnlyTrue = IsOnlyTrue; this.tempTenderList = tempTenderList; } //Batch 链 时使用 global UpdateTenderInformationBatch(Boolean IsNeedExecute) { this.IsNeedExecute = IsNeedExecute; } global UpdateTenderInformationBatch() { } global Database.QueryLocator start(Database.BatchableContext bc) { String query = 'SELECT Id,IsBid__c,NotBidApprovalStatus__c,IsReactionOpp__c,Hospital__c,Hospital1__c,Hospital2__c,Hospital3__c,Hospital4__c, '; query += 'Hospital__r.Assume_Change__c,Hospital1__r.Assume_Change__c,Hospital2__r.Assume_Change__c,Hospital3__r.Assume_Change__c,Hospital4__r.Assume_Change__c '; query += 'FROM Tender_information__c '; if(IsOnlyTrue){ query += 'WHERE ((IsReactionOpp__c = true ) '; //2021-07-29 mzy update 当医院发生变化/招投标项目OCSM省发生变化时,空更新一下招投标 start // 2022-04-08 ssm SWAG-CC58ME 增加所有人无效的判断 start query += 'OR (Owner.IsActive = false) '; // 2022-04-08 ssm SWAG-CC58ME end query += 'OR (BiddingOCSMAdministration__c = true) OR (Hospital__r.Assume_Change__c = true) '; query += 'OR (Hospital1__r.Assume_Change__c = true) OR (Hospital2__r.Assume_Change__c = true) '; query += 'OR (Hospital3__r.Assume_Change__c = true) OR (Hospital4__r.Assume_Change__c = true) )'; //2021-07-29 mzy update 当医院发生变化/招投标项目OCSM省发生变化时,空更新一下招投标 end // DepartmentChanges__c 全部换成 Assume_Change__c } if(String.isNotBlank(this.tempTenderId)){ if(IsOnlyTrue){ query += ' AND '; }else { query += ' Where '; } query += 'Id = :tempTenderId '; } if(tempTenderList.size()>0){ if(IsOnlyTrue){ query += ' AND '; }else { query += ' Where '; } query += ' Id In :tempTenderList '; } System.debug('sql语句:'+query); return Database.getQueryLocator(query); } global void execute(Database.BatchableContext BC, list TenderList) { //定义List封装需要空更新的招投标项目 List EmptyUpdateTenderList = new List(); Map EmptyUpdateTenderMap = new Map(); //定义List封装需要更新的招标项目 List updateTenderList = new List(); //定义Map保存招投标信息 Map tenderMap = new Map(); //定义List封装所有询价的招标项目Id Set BiddingProjectID = new Set(); for(Tender_information__c tempTender : TenderList){ //2021-07-29 mzy update 当医院发生变化/招投标项目OCSM省发生变化时,空更新一下招投标 start if(tempTender.IsReactionOpp__c){ //如果是 是否反应询价 为 true 则需要进行 反应询价 ,否则就空更新一下 BiddingProjectID.add(tempTender.Id); tenderMap.put( String.valueOf( tempTender.Id ).substring(0,15) ,tempTender); }else { //需要空更新的招投标 EmptyUpdateTenderList.add(tempTender); EmptyUpdateTenderMap.put(String.valueOf( tempTender.Id ).substring(0,15) ,tempTender); } //2021-07-29 mzy update 当医院发生变化/招投标项目OCSM省发生变化时,空更新一下招投标 end } //2021-07-29 mzy update 空更新失败的话不清空医院的标识 start // System.debug('EmptyUpdateTenderList: ' + EmptyUpdateTenderList); if(EmptyUpdateTenderList.size()>0){ //空更新招投标 // fxk 2021/9/28 Star StaticParameter.EscapeOtherUpdateTenOwner = false; Database.SaveResult[] EmptySaveTenderResult = Database.update(EmptyUpdateTenderList,false); StaticParameter.EscapeOtherUpdateTenOwner = true; // fxk 2021/9/28 End //更新成功的招投标需要将医院的标识清空 //保存更新失败的医院 Set faildHospIdSet = new Set(); //查看失败的医院 for(Integer i = 0;i HospitalId = new Set(); //需要清空标识的医院i List needUpdateHPList = new List(); for(Integer i = 0;i HospitalIds = HospitalId.iterator(); while(HospitalIds.hasNext()){ Account acc = new Account(); acc.id = HospitalIds.next(); acc.Assume_Change__c = false; needUpdateHPList.add(acc); } if(needUpdateHPList.size()>0){ update needUpdateHPList; } } //2021-07-29 mzy update 空更新失败的话不清空医院的标识 end //2021-07-29 mzy update 如果有需要反应询价的在走下面逻辑 start if(BiddingProjectID.size()> 0){ //查询招标项目下的所有询价 Map> BiddingProjectOppMap = findTenderRelativeOpp(BiddingProjectID); //计算询价数量 List updateTenderNumList = updateOpportunityNum(BiddingProjectOppMap); //计算询价状态 List updateTenderNumStatusList = updateOpportunityStatus(BiddingProjectOppMap,updateTenderNumList,tenderMap); updateTenderList.addAll(updateTenderNumStatusList); } //更新招投标 询价数量和状态 if(updateTenderList.size()>0){ //一个招投标项目更新失败 List failedTenderList = new List(); Database.SaveResult[] saveTenderResults = Database.update(updateTenderList,false); //招投标项目的总数 TendertotalCount += saveTenderResults.size(); for(Integer i = 0;i successTenderList = new List(); for(Tender_information__c tempTender:TenderList){ if(failedTenderList.contains( String.valueOf( tempTender.id ).substring(0,15) )){ //更新失败,则不清除标识 }else { //更新成功,清除标识 tempTender.IsReactionOpp__c = false; successTenderList.add(tempTender); } } //清除标识 if(successTenderList.size()>0){ update successTenderList; } } // 2021-07-29 mzy update 如果有需要反应询价的在走下面逻辑 end } global void finish(Database.BatchableContext BC) { UpdateTenderInformationSchedule.assignOneHours(); BatchIF_Log__c TenderIfLog = new BatchIF_Log__c(); TenderIfLog.Type__c = 'UpdateTenderInformationBatchByTenderErrorLog'; if (TenderlogStr.length() > 60000) { TenderlogStr = TenderlogStr.substring(0, 60000); } TenderIfLog.Log__c = TenderlogStr; TenderIfLog.Log__c += '\n end'; if (TendererrorStr.length() > 60000) { TenderIfLog.ErrorLog__c = TendererrorStr.substring(0, 60000); } else { TenderIfLog.ErrorLog__c = TendererrorStr.substring(0, TendererrorStr.length()); } insert TenderIfLog; emailMessages.add('失败日志ID为:' + TenderIfLog.Id + '\r\n失败信息:\r\n'+TendererrorStr); //发送邮件 sendFieldEmail(); } //批量更新招投标的询价信息 WebService static String updateOpportunityInformation(List TenderIdList){ //存储错误信息 String errorMessage = ''; //目的 : 如果Batch执行失败,则整体rollback,标识不进行清除 //定义List封装需要更新的招标项目 List updateTenderList = new List(); try{ Set BiddingProjectID = new Set(); for(String TenderId:TenderIdList){ BiddingProjectID.add(TenderId); } //查询招投标信息 List tenderList = [SELECT Id,IsBid__c,NotBidApprovalStatus__c FROM Tender_information__c where id in :BiddingProjectID]; Map tenderMap = new Map(); for(Tender_information__c tempTender :tenderList){ tenderMap.put( String.valueOf( tempTender.Id ).substring(0,15) ,tempTender); } //查询招标项目下的所有询价 Map> BiddingProjectOppMap = findTenderRelativeOpp(BiddingProjectID); //计算询价数量 List updateTenderNumList = updateOpportunityNum(BiddingProjectOppMap); //计算询价状态 List updateTenderNumStatusList = updateOpportunityStatus(BiddingProjectOppMap,updateTenderNumList,tenderMap); updateTenderList.addAll(updateTenderNumStatusList); //更新 if(updateTenderList.size()>0){ List failedTenderList = new List(); // add 只有空更新招投标的时候走招投标触发器 fxk 2021/9/28 Star StaticParameter.EscapeOtherUpdateTenOwner = false; Database.SaveResult[] saveTenderResults = Database.update(updateTenderList,false); StaticParameter.EscapeOtherUpdateTenOwner = true; // add 只有空更新招投标的时候走招投标触发器 fxk 2021/9/28 End for(Integer i = 0;i successTenderList = new List(); for(String tempTenderId:TenderIdList){ if(failedTenderList.contains( String.valueOf( tempTenderId ).substring(0,15) )){ //更新失败,则不清除标识 }else { //更新成功,清除标识 Tender_information__c tempTender = new Tender_information__c(); tempTender.Id = String.valueOf( tempTenderId ).substring(0,15); tempTender.IsReactionOpp__c = false; successTenderList.add(tempTender); } } //清除标识 if(successTenderList.size()>0){ update successTenderList; } } //询价流程改善 fy start System.debug('batch2开始'); Id execBTId = Database.executeBatch(new UpdateTenderInformationBatch2(TenderIdList),100); System.debug('batch2结束'); //询价流程改善 fy end }catch(NullPointerException ex){ system.debug('aa1:'+ex.getMessage()); return '空指针 :'+ex.getLineNumber(); }catch(Exception ex2){ system.debug('aa2:'+ex2.getMessage()); return '出错了!'+ex2.getMessage(); } if(String.isNotBlank(errorMessage)){ return errorMessage; } system.debug('aa'); return 'OK'; } //0.计算询价数量 public static List updateOpportunityNum(Map> tempMap){ // 招标-询价关联修改 获取招标信息修改 20210817 start // List updateTenderNumList = new List(); // //遍历Map的key // for(String k : tempMap.keySet()){ // Tender_information__c tempTender = new Tender_information__c(); // tempTender.id = k; // String fifteenId = String.valueOf(tempTender.Id).subString(0,15); // tempTender.OpportunityNum__c = tempMap.get(fifteenId).size(); // updateTenderNumList.add(tempTender); // } List tenders = new List(); //遍历Map的key for(String k : tempMap.keySet()){ tenders.add(k); } // 获得招标数据 把从询价里查询的招标字段挪到这里 List updateTenderNumList = [SELECT Id, Hospital__c, Hospital1__c, Hospital2__c, Hospital3__c, Hospital4__c, OwnerId, IsRelateProject__c, IsBid__c, department__c, subDepartment1__c, subDepartment2__c, subDepartment3__c, subDepartment4__c, NotBidApprovalStatus__c, OpportunityNum__c, OpportunityStatus__c //20221010 lt SWAG-CHL5XA【FY23询价改善】-统计主机台数 start ,OlyNumberHosts__c, RivalHostsNumber__c, TotalNumberHosts__c //20221010 lt SWAG-CHL5XA【FY23询价改善】-统计主机台数 end FROM Tender_information__c WHERE Id IN :tenders]; // 招标-询价关联修改 20210817 end return updateTenderNumList; } //1.计算询价状态 //2.赋值医院 //3.赋值战略科室 // 1) 如果招投标项目的关联医院为空,那么就更新为询价的医院; // 2) 如果招投标项目的关联主战略科室为空,那么就更新为询价创建时间最早的询价的战略科室; // 3) 如果招投标项目的关联副战略科室为空,那么就更新为排名优先级高的战略科室之外的其他询价的战略科室,也是以创建时间更早为先后顺序; // 4) 如果更新满了,多的战略科室就不更新; public static List updateOpportunityStatus(Map> BiddingProjectOppMap,List updateTenderNumList,Map tenderMap){ //询价状态 //定义List封装需要更新的招标项目 List updateTenderList = new List(); //遍历Map的key for(Tender_information__c tempTender : updateTenderNumList){ String fifteenId = String.valueOf(tempTender.Id).subString(0,15); //获取当前招投标下的询价 List BiddingDownOppList= BiddingProjectOppMap.get(fifteenId) == null ? new List() : BiddingProjectOppMap.get(fifteenId); //获取当前招投标下的询价的医院 List OppHospitalList = new List(); //判断状态 if(BiddingDownOppList.size() > 0){ // //2021-08-09 mzy 如果招标的ownerid是奥林巴斯系统用户 就把询价的所有人写上去 // 20210817 是不是应该直接判断tender上的? // if(BiddingDownOppList.get(0).Bidding_Project_Name_Bid__r.OwnerId == '00510000000gmxH'){ if(tempTender.OwnerId == '00510000000gmxH'){ tempTender.OwnerId = BiddingDownOppList.get(0).ownerId; } //2021-08-09 mzy 如果招标的ownerid是奥林巴斯系统用户 就把询价的所有人写上去 // // // //WIN num Integer WinNum = 0; //失单 num Integer SHDNum = 0; //XLIU-CG98L5【委托】【评估】新需求-招标项目/询价对应流标、废标改善 fy start //取消 num Integer QuxNum = 0; //XLIU-CG98L5【委托】【评估】新需求-招标项目/询价对应流标、废标改善 fy end //中标 2022-6-29 yjk Integer bidNum = 0; //对手中标 2022-6-29 yjk Integer loseNum = 0; //20221010 lt SWAG-CHL5XA【FY23询价改善】-统计主机台数 start tempTender.OlyNumberHosts__c = 0; tempTender.RivalHostsNumber__c = 0; tempTender.TotalNumberHosts__c = 0; Decimal OlyNum = 0; Decimal RivalNum = 0; Decimal TotalNum = 0; //20221010 lt SWAG-CHL5XA【FY23询价改善】-统计主机台数 end //获取当前key的List for(Opportunity tempOp :BiddingDownOppList){ //20221010 lt SWAG-CHL5XA【FY23询价改善】-统计主机台数 start System.debug('lt123---------------------------------------'); if(tempOp.OlyNumberHosts__c == null){ tempOp.OlyNumberHosts__c = 0; } if(tempOp.RivalHostsNumber__c == null){ tempOp.RivalHostsNumber__c = 0; } OlyNum += tempOp.OlyNumberHosts__c; RivalNum += tempOp.RivalHostsNumber__c; TotalNum += tempOp.InquireNumberHosts__c; //20221010 lt SWAG-CHL5XA【FY23询价改善】-统计主机台数 end // 李慧娟备注 : 这里请替换成标识判断 // if(tempOp.SAP_Send_OK__c || '完毕'.equals(tempOp.StageName__c)){ // 2022-6-2 yjk SWAG-CEP9G8 //win WinNum += 1; } //XLIU-CG98L5【委托】【评估】新需求-招标项目/询价对应流标、废标改善 fy start // else if(tempOp.StageName__c.equals('失单') || tempOp.StageName__c.equals('取消')){ //2022-5-23 yjk SWAG-CEP9G8 // //失单 // SHDNum += 1; // } else if(tempOp.StageName__c.equals('失单')){ //2022-5-23 yjk SWAG-CEP9G8 //失单 SHDNum += 1; } else if(tempOp.StageName__c.equals('取消')){ //2022-5-23 yjk SWAG-CEP9G8 //失单 QuxNum += 1; } //XLIU-CG98L5【委托】【评估】新需求-招标项目/询价对应流标、废标改善 fy end //获取询价的医院(相关性时用) if(!OppHospitalList.contains(tempOp.Hospital__c)&&tempOp.Hospital__c!=null){ OppHospitalList.add(tempOp.Hospital__c); } //2022-6-29 yjk 中标确认赋值 start if('OLY中标'.equals(tempOp.ConfirmationofAward__c)){ bidNum++; }else if('竞争对手中标'.equals(tempOp.ConfirmationofAward__c)){ loseNum++; } //2022-6-29 yjk 中标确认赋值 end } //20221010 lt SWAG-CHL5XA【FY23询价改善】-统计主机台数 start tempTender.OlyNumberHosts__c = OlyNum; tempTender.RivalHostsNumber__c = RivalNum; tempTender.TotalNumberHosts__c = TotalNum; //20221010 lt SWAG-CHL5XA【FY23询价改善】-统计主机台数 end // if(WinNum == BiddingDownOppList.size()){ //全部为Win,OLY确认状态 为 成交 tempTender.OpportunityStatus__c = '成交'; }else if(SHDNum == BiddingDownOppList.size()){ //全部为失单.状态为 失单 tempTender.OpportunityStatus__c = '失单'; }else if(WinNum>0&&SHDNum>0&&(WinNum + SHDNum) == BiddingDownOppList.size() ){ //部分Win,部分失单时, 状态为 部分成交 tempTender.OpportunityStatus__c = '部分成交'; } //XLIU-CG98L5【委托】【评估】新需求-招标项目/询价对应流标、废标改善 fy start else if(QuxNum == BiddingDownOppList.size()){ //全部为取消.状态为 取消 tempTender.OpportunityStatus__c = '取消'; } //XLIU-CG98L5【委托】【评估】新需求-招标项目/询价对应流标、废标改善 fy end else if(tempTender.OpportunityNum__c > 0){ //如果询价数量大于0的话就是 跟进中 tempTender.OpportunityStatus__c = '跟进中'; }else{ //其他都是 '' tempTender.OpportunityStatus__c = ''; } // //2022-6-29 yjk 中标确认赋值 start if(bidNum > 0 && loseNum == 0){ tempTender.ConfirmationofAward__c = 'OLY中标'; }else if(loseNum > 0 && bidNum == 0){ tempTender.ConfirmationofAward__c = '竞争对手中标'; }else if(bidNum > 0 && loseNum > 0){ tempTender.ConfirmationofAward__c = '部分OLY中标'; }else{ //DB202304056706 you 20230406 清空 tempTender.ConfirmationofAward__c = ''; } //2022-6-29 yjk 中标确认赋值 end // //定义Map存放当前招投标项目的五个医院 Map fiveHospitalMap = new Map(); // 招标-询价关联修改 这里是不是可以直接从当前招标里初始化?询价上不再关联单一的招标项目了 20210818 start // fiveHospitalMap.put('Hospital__c',BiddingDownOppList.get(0).Bidding_Project_Name_Bid__r.Hospital__c); // fiveHospitalMap.put('Hospital1__c',BiddingDownOppList.get(0).Bidding_Project_Name_Bid__r.Hospital1__c); // fiveHospitalMap.put('Hospital2__c',BiddingDownOppList.get(0).Bidding_Project_Name_Bid__r.Hospital2__c); // fiveHospitalMap.put('Hospital3__c',BiddingDownOppList.get(0).Bidding_Project_Name_Bid__r.Hospital3__c); // fiveHospitalMap.put('Hospital4__c',BiddingDownOppList.get(0).Bidding_Project_Name_Bid__r.Hospital4__c); fiveHospitalMap.put('Hospital__c', tempTender.Hospital__c); fiveHospitalMap.put('Hospital1__c', tempTender.Hospital1__c); fiveHospitalMap.put('Hospital2__c', tempTender.Hospital2__c); fiveHospitalMap.put('Hospital3__c', tempTender.Hospital3__c); fiveHospitalMap.put('Hospital4__c', tempTender.Hospital4__c); // 招标-询价关联修改 20210818 end //如果招投标项目的 是否相关 字段不为否 , 并且 相关医院 相关战略科室 相关普通科室 为空时,则更新 为询价的 医院 战略科室 客户名 // 招标-询价关联修改 同上修改 从当前招标的数据里获得判断条件 20210818 start // if(!'否'.equals(BiddingDownOppList.get(0).Bidding_Project_Name_Bid__r.IsRelateProject__c)){ if(!'否'.equals(tempTender.IsRelateProject__c)){ // 招标-询价关联修改 20210818 end //一.关联医院 //遍历招投标项目下所有询价的医院,给招投标项目的5个医院赋值 ---start //遍历招投标项目下所有询价的医院 if(OppHospitalList.size()>0){ for(Integer i = 0; i // //2021-08-09 mzy 关联询价成功后,不需要设置是否应标 为 是 //如果 是否应标 字段已经选择否,就不应该更新应标及相关的相关信息 //if(!'否'.equals(BiddingDownOppList.get(0).Bidding_Project_Name_Bid__r.IsBid__c) // &&!'是'.equals(BiddingDownOppList.get(0).Bidding_Project_Name_Bid__r.IsBid__c)){ // tempTender.IsBid__c = '是'; //} //2021-08-09 mzy 关联询价成功后,不需要设置是否应标 为 是 // }else { //清空 tempTender.OpportunityStatus__c = ''; //DB202304056706 you 20230406 清空 tempTender.ConfirmationofAward__c = ''; } updateTenderList.add(tempTender); } return updateTenderList; } //查询招标项目下的所有询价 //param : 需要查询的招标项目Id //return Map<招投标项目Id,List<询价>> public static Map> findTenderRelativeOpp(Set BiddingProjectID){ //定义Map封装数据 Map> BiddingProjectOppMap = new Map>(); //查询招标项目下的所有询价 // 招标-询价关联修改 多对多关系对应 从关联表中获取询价 20210818 start List links = [SELECT Id, Tender_information__c, Opportunity__c FROM Tender_Opportunity_Link__c WHERE Tender_information__c in :BiddingProjectID]; List oppIds = new List(); for (Tender_Opportunity_Link__c link : links) { // 多对多关系 需要去重 if (oppIds.contains(link.Opportunity__c)) { continue; } oppIds.add(link.Opportunity__c); } List allRelativeOppList = [SELECT Id ,AccountId,Hospital__c,Department_Class__c,SAP_Send_OK__c,CreatedDate, Whether_Bidding__c, Old_BiddingProject_Bid__c, OwnerId, StageName__c, Bidding_Project_Name_Bid__c, ConfirmationofAward__c //20221010 lt SWAG-CHL5XA【FY23询价改善】-统计主机台数 start ,OlyNumberHosts__c, RivalHostsNumber__c, InquireNumberHosts__c //20221010 lt SWAG-CHL5XA【FY23询价改善】-统计主机台数 end FROM Opportunity WHERE Id in :oppIds ORDER By createdDate ASC]; // List allRelativeOppList = [SELECT Id ,AccountId,Hospital__c,Department_Class__c,SAP_Send_OK__c,CreatedDate, Whether_Bidding__c, // Old_BiddingProject_Bid__c,Bidding_Project_Name_Bid__c ,StageName__c ,Bidding_Project_Name_Bid__r.Hospital__c,Bidding_Project_Name_Bid__r.Hospital1__c, // Bidding_Project_Name_Bid__r.Hospital2__c,Bidding_Project_Name_Bid__r.Hospital3__c,Bidding_Project_Name_Bid__r.Hospital4__c, // Bidding_Project_Name_Bid__r.OwnerId,OwnerId, // Bidding_Project_Name_Bid__r.IsRelateProject__c ,Bidding_Project_Name_Bid__r.IsBid__c ,Bidding_Project_Name_Bid__r.department__c, // Bidding_Project_Name_Bid__r.subDepartment1__c,Bidding_Project_Name_Bid__r.subDepartment2__c,Bidding_Project_Name_Bid__r.subDepartment3__c, // Bidding_Project_Name_Bid__r.subDepartment4__c FROM Opportunity WHERE Bidding_Project_Name_Bid__c in :BiddingProjectID ORDER By createdDate ASC]; //遍历询价集合 //2.按创建时间排序(正序),创建map for(Opportunity tempOp :allRelativeOppList){ // 循环link,找到询价对应的招标 for (Tender_Opportunity_Link__c link : links) { if (link.Opportunity__c == tempOp.Id) { String fifteenTenderId = String.valueOf(link.Tender_information__c).subString(0,15); //Map里面没有保存当前询价的招标项目下的询价 if(!BiddingProjectOppMap.containsKey(fifteenTenderId)){ //第一次存放 List tempOppList = new List(); tempOppList.add(tempOp); BiddingProjectOppMap.put(fifteenTenderId,tempOppList); }else { //以后存放 List tempOppListE = BiddingProjectOppMap.get(fifteenTenderId); tempOppListE.add(tempOp); BiddingProjectOppMap.put(fifteenTenderId,tempOppListE); } } } //判断当前询价是否有招标项目 // if(tempOp.Bidding_Project_Name_Bid__c!=null){ // String fifteenTenderId = String.valueOf(tempOp.Bidding_Project_Name_Bid__c).subString(0,15); // //Map里面没有保存当前询价的招标项目下的询价 // if(!BiddingProjectOppMap.containsKey(fifteenTenderId)){ // //第一次存放 // List tempOppList = new List(); // tempOppList.add(tempOp); // BiddingProjectOppMap.put(fifteenTenderId,tempOppList); // }else { // //以后存放 // List tempOppListE =BiddingProjectOppMap.get(fifteenTenderId); // tempOppListE.add(tempOp); // BiddingProjectOppMap.put(fifteenTenderId,tempOppListE); // } // } } //完善Map : 询价为0的招投标项目应该也有一列 for(String TenderId : BiddingProjectID){ String fifteenTenderId = TenderId.subString(0,15); if(!BiddingProjectOppMap.containsKey(fifteenTenderId)){ List tempOppList = new List(); BiddingProjectOppMap.put(fifteenTenderId,tempOppList); } } return BiddingProjectOppMap; } // 发送提醒邮件 private void sendFieldEmail() { PretechBatchEmailUtil be = new PretechBatchEmailUtil(); String[] toList = new String[] {UserInfo.getUserEmail()}; String title = '招标项目询价状态和询价数量更新失败'; //String[] ccList = new String[] {'Xiaochen_You@olympus.com.cn'}; String[] ccList = new String[] {'miaoziyang@prec-tech.com'}; if (System.Test.isRunningTest()) { be.successMail('', 1); } if (emailMessages.size() > 0 && TenderfailedCount > 0) { be.failedMail(toList, ccList, title, this.emailMessages.get(0)+'\n', TendertotalCount, TendertotalCount - TenderfailedCount, TenderfailedCount,'',true); if(!Test.isRunningTest()){ be.send(); } } } public static void justForTest() { 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++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; i++; } }